From adb6710affb79d318df158d412168e3aeabd2f77 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Thu, 29 Jun 2023 10:03:17 -0400 Subject: [PATCH 001/825] Upgrade to Spring Cloud GCP 4.5.1 and 3.5.4 See gh-1235 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8b8f0ccf9c..1be210c532 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -116,11 +116,11 @@ initializr: - compatibilityRange: "[2.4.0-M1,2.6.0-M1)" version: 2.0.11 - compatibilityRange: "[2.6.0-M1,3.0.0-M1)" - version: 3.5.3 + version: 3.5.4 - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 4.3.1 + version: 4.5.1 - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 4.5.0 + version: 4.5.1 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 11ad677a562c7863c9a5a3b71d5920fed04e66d7 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 15:46:34 +0200 Subject: [PATCH 002/825] Polish "Upgrade to Spring Cloud GCP 4.5.1 and 3.5.4" See gh-1235 --- start-site/src/main/resources/application.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 1be210c532..84abf5bac4 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -117,9 +117,7 @@ initializr: version: 2.0.11 - compatibilityRange: "[2.6.0-M1,3.0.0-M1)" version: 3.5.4 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 4.5.1 - - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" + - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" version: 4.5.1 spring-cloud-services: groupId: io.pivotal.spring.cloud From 552b69453c6f98ea6dd9b31c1b5cdc884af1ca92 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 30 Jun 2023 12:37:14 +0200 Subject: [PATCH 003/825] Upgrade to Spring Cloud 2021.0.8 See gh-1236 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8b8f0ccf9c..63a358e51d 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -95,7 +95,7 @@ initializr: - compatibilityRange: "[2.4.0.RELEASE,2.6.0)" version: 2020.0.6 - compatibilityRange: "[2.6.0,3.0.0)" - version: 2021.0.7 + version: 2021.0.8 - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 2022.0.3 spring-cloud-azure: From 48ae7d8481cf11617ab009c085687ffb7caa6af0 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 4 Jul 2023 14:24:30 +0300 Subject: [PATCH 004/825] Upgrade to Vaadin 24.1.2, 24.0.9, 23.3.16, 14.10.3 See gh-1237 --- start-site/src/main/resources/application.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8b8f0ccf9c..0812e3096e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -161,15 +161,15 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[2.1.0.RELEASE,2.6.0-M1)" - version: 14.10.2 + version: 14.10.3 - compatibilityRange: "[2.6.0-M1,2.7.0-M1)" - version: 23.2.15 + version: 23.2.14 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.15 + version: 23.3.16 - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 24.0.8 + version: 24.0.9 - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 24.1.1 + version: 24.1.2 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From f00b957f4c09e3623e83cc8b9ee8be23385620bb Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 15:50:04 +0200 Subject: [PATCH 005/825] Polish "Upgrade to Vaadin 24.1.2, 24.0.9, 23.3.16, 14.10.3" See gh-1237 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0812e3096e..6622d787a7 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -163,7 +163,7 @@ initializr: - compatibilityRange: "[2.1.0.RELEASE,2.6.0-M1)" version: 14.10.3 - compatibilityRange: "[2.6.0-M1,2.7.0-M1)" - version: 23.2.14 + version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 23.3.16 - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" From fe2bdc065d8afc9e285f5a4f9a5e794d854edca5 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 5 Jul 2023 08:44:56 +0200 Subject: [PATCH 006/825] Upgrade to Camel 4.0.0-RC1 See gh-1239 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8b8f0ccf9c..69a222757a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -865,8 +865,8 @@ initializr: version: 3.17.0 - compatibilityRange: "[2.7.0.M1,3.0.0-M1)" version: 3.20.6 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 4.0.0-M3 + - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" + version: 4.0.0-RC1 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From 0a3a41da2b39336d6000fe647e1a5ca349f995d1 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 15:53:00 +0200 Subject: [PATCH 007/825] Polish "Upgrade to Camel 4.0.0-RC1" See gh-1239 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 69a222757a..29201942db 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -853,7 +853,7 @@ initializr: href: https://rsocket.io/ - name: Apache Camel id: camel - compatibilityRange: "[2.0.0.M1,3.1.0-M1)" + compatibilityRange: "[2.0.0.M1,3.2.0-M1)" mappings: - compatibilityRange: "[2.3.0.M1,2.4.0-M1)" version: 3.5.0 From 671a88a571b13494b6641e3369048d3e80aac719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Ko=CC=88ninger?= Date: Fri, 7 Jul 2023 13:18:09 +0200 Subject: [PATCH 008/825] Upgrade to Spring Boot Admin 3.1.1 See gh-1240 --- start-site/src/main/resources/application.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8b8f0ccf9c..7244280689 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -53,6 +53,8 @@ initializr: version: 2.7.4 - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" version: 3.0.4 + - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" + version: 3.1.1 hilla: groupId: dev.hilla artifactId: hilla-bom @@ -966,7 +968,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-client description: Required for your application to register with a Codecentric's Spring Boot Admin Server instance. - compatibilityRange: "[2.0.0.RELEASE,3.1.0-M1)" + compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -976,7 +978,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-server description: A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints. - compatibilityRange: "[2.0.0.RELEASE,3.1.0-M1)" + compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference From 2e65bcc7ab4d1e673bc3384385550f64a80a287a Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 15:55:42 +0200 Subject: [PATCH 009/825] Upgrade to Spring Cloud Azure 4.9.0 Closes gh-1232 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8d35a0e26f..efbd7de58b 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -106,7 +106,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[2.5.0.M1,3.0.0-M1)" - version: 4.8.0 + version: 4.9.0 - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" version: 5.2.0 spring-cloud-gcp: From 9c240eed2c7dec3f2647bd0f94750800efce1c30 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 15:56:28 +0200 Subject: [PATCH 010/825] Upgrade to Spring Cloud Azure 5.3.0 Closes gh-1234 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index efbd7de58b..4b5a4088c0 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -107,8 +107,8 @@ initializr: mappings: - compatibilityRange: "[2.5.0.M1,3.0.0-M1)" version: 4.9.0 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 5.2.0 + - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" + version: 5.3.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies @@ -1390,7 +1390,7 @@ initializr: href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - name: Microsoft Azure bom: spring-cloud-azure - compatibilityRange: "[2.5.0-M1,3.1.0-M1)" + compatibilityRange: "[2.5.0-M1,3.2.0-M1)" content: - name: Azure Support id: azure-support From 23da22283894085e17be96d31f67d504b8922ea9 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 16:06:38 +0200 Subject: [PATCH 011/825] Fix compatibility range with addition of Spring Boot 3.2.x --- start-site/src/main/resources/application.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4b5a4088c0..f732f6bb5f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1107,6 +1107,7 @@ initializr: - name: Contract Verifier bom: spring-cloud id: cloud-contract-verifier + compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" description: Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development. groupId: org.springframework.cloud artifactId: spring-cloud-starter-contract-verifier @@ -1117,6 +1118,7 @@ initializr: - name: Contract Stub Runner bom: spring-cloud id: cloud-contract-stub-runner + compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests. groupId: org.springframework.cloud artifactId: spring-cloud-starter-contract-stub-runner @@ -1147,6 +1149,7 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.mongodb.embedded - name: Spring Cloud bom: spring-cloud + compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" content: - name: Cloud Bootstrap id: cloud-starter @@ -1201,6 +1204,7 @@ initializr: description: Using Spring Cloud Open Service Broker - name: Spring Cloud Config bom: spring-cloud + compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" content: - name: Config Client id: cloud-config-client @@ -1251,6 +1255,7 @@ initializr: description: Spring Cloud Consul Quick Start - name: Spring Cloud Discovery bom: spring-cloud + compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" content: - name: Eureka Discovery Client id: cloud-eureka @@ -1301,6 +1306,7 @@ initializr: href: https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#spring-cloud-consul-discovery - name: Spring Cloud Routing bom: spring-cloud + compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" content: - name: Gateway id: cloud-gateway @@ -1337,6 +1343,7 @@ initializr: href: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer - name: Spring Cloud Circuit Breaker bom: spring-cloud + compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" content: - name: Resilience4J id: cloud-resilience4j @@ -1348,6 +1355,7 @@ initializr: href: https://docs.spring.io/spring-cloud-circuitbreaker/docs/current/reference/html/#configuring-resilience4j-circuit-breakers - name: Spring Cloud Messaging bom: spring-cloud + compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" content: - name: Cloud Bus id: cloud-bus From 17fb90ea4e0d4379047c4563356642eed335a580 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 7 Jul 2023 14:37:08 +0000 Subject: [PATCH 012/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index f1ac2195f0..e5e1359fca 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:ce492b31813613ea01a7ce32dfaa055eb3a6c4e102772c550a77d3ccd2125589 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0c7964b7f65a65f9dd90a4e67089f2ec7bde13ff3892e9c441dfe5e2c29f523a lifecycle: preStop: exec: From 8e626696842f3d0ee0c01f514ae9f151ec8a74b8 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 16:25:59 +0200 Subject: [PATCH 013/825] Upgrade to Frontend Maven Plugin 1.13.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fb305dcbf2..76839a265c 100644 --- a/pom.xml +++ b/pom.xml @@ -124,7 +124,7 @@ com.github.eirslett frontend-maven-plugin - 1.12.1 + 1.13.2 org.apache.maven.plugins From ca9b14d1a8f20bef52a6efd65ceea4f2bccf42b3 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 16:26:35 +0200 Subject: [PATCH 014/825] Upgrade to Maven Surefire Plugin 3.1.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 76839a265c..a8976e412d 100644 --- a/pom.xml +++ b/pom.xml @@ -134,7 +134,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0 + 3.1.2 From a32a71da4dd392ad839ba12ba5da99a7f8de8fb1 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 16:27:07 +0200 Subject: [PATCH 015/825] Upgrade to Maven Checkstyle Plugin 3.3.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a8976e412d..0f090b08f5 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 3.2.1 + 3.3.0 checkstyle-validation From 63527fc37d481906fb13973854ba15d60d8cf5f3 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 16:27:38 +0200 Subject: [PATCH 016/825] Upgrade to Flatten Maven Plugin 1.5.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0f090b08f5..4917c8d324 100644 --- a/pom.xml +++ b/pom.xml @@ -72,7 +72,7 @@ org.codehaus.mojo flatten-maven-plugin - 1.4.1 + 1.5.0 io.spring.javaformat From 92a37aa46cf9147d9c8e464bb70f40f8311f623f Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 16:29:45 +0200 Subject: [PATCH 017/825] Upgrade to Maven 3.9.3 --- .mvn/wrapper/maven-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index b27a13f1d9..462686e25d 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,2 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.2/apache-maven-3.9.2-bin.zip +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.3/apache-maven-3.9.3-bin.zip wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar From e4ee3b89a1f48f44dd35a9b047cc62973d88858a Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 7 Jul 2023 14:58:21 +0000 Subject: [PATCH 018/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index e5e1359fca..c571c097bc 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0c7964b7f65a65f9dd90a4e67089f2ec7bde13ff3892e9c441dfe5e2c29f523a + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9f20798070235e830cb5ce2082bbfff50e1eb374eb314f0f2947551281d2fa4b lifecycle: preStop: exec: From 186e07ddab4b5c1d535de31b409c48a2126c1498 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 17:28:34 +0200 Subject: [PATCH 019/825] Add workflow for building pull requests --- .github/workflows/build-pull-request.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/build-pull-request.yml diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml new file mode 100644 index 0000000000..44438d12bb --- /dev/null +++ b/.github/workflows/build-pull-request.yml @@ -0,0 +1,21 @@ +name: Build Pull Request +on: pull_request + +permissions: + contents: read + +jobs: + build: + name: Build pull request + runs-on: ubuntu-latest + if: ${{ github.repository == 'spring-io/start.spring.io' }} + steps: + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'liberica' + - name: Check out code + uses: actions/checkout@v3 + - name: Build + run: ./mvnw clean verify From c9576e2bddff1c8086bfd8b15dd0f2a48eaaed3e Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 7 Jul 2023 15:51:52 +0000 Subject: [PATCH 020/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index c571c097bc..8eaa6396d4 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9f20798070235e830cb5ce2082bbfff50e1eb374eb314f0f2947551281d2fa4b + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:db0d8141f3827729b25db96506b46c548b9143f5e1fa863a9db838a3e38399c5 lifecycle: preStop: exec: From a1d1a831672d22e39c869679c0aaf5b4607adcad Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 7 Jul 2023 19:16:17 +0200 Subject: [PATCH 021/825] Upgrade to Frontend Maven Plugin 1.13.4 Closes gh-1206 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4917c8d324..e6f5d5d935 100644 --- a/pom.xml +++ b/pom.xml @@ -124,7 +124,7 @@ com.github.eirslett frontend-maven-plugin - 1.13.2 + 1.13.4 org.apache.maven.plugins From 428bfdac6cedf129940cac28022ebc985b49a0a3 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 7 Jul 2023 17:32:42 +0000 Subject: [PATCH 022/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 8eaa6396d4..fd35048fb2 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:db0d8141f3827729b25db96506b46c548b9143f5e1fa863a9db838a3e38399c5 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2df573158eab7a7925b3d39a6aea61f6516c981dcc7ced6da69dd59b2159e72b lifecycle: preStop: exec: From d0331fc9496ff20905e1ace2b1cfd69d3c706548 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 7 Jul 2023 17:59:34 +0000 Subject: [PATCH 023/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index fd35048fb2..13e1505dde 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2df573158eab7a7925b3d39a6aea61f6516c981dcc7ced6da69dd59b2159e72b + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:e474454ffab355081ca5062f5a9859548f392cae4654c65051d74e2ac05b489e lifecycle: preStop: exec: From 5ec364e4fa65550e59c5bdb246b261db4964f28e Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Sat, 8 Jul 2023 09:08:23 +0200 Subject: [PATCH 024/825] Remove node-gyp from CI image See gh-1206 --- ci/images/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/images/setup.sh b/ci/images/setup.sh index 049db04665..e34d82f62f 100755 --- a/ci/images/setup.sh +++ b/ci/images/setup.sh @@ -7,7 +7,7 @@ set -ex export DEBIAN_FRONTEND=noninteractive apt-get update -apt-get install --no-install-recommends -y tzdata ca-certificates curl git node-gyp +apt-get install --no-install-recommends -y tzdata ca-certificates curl git ln -fs /usr/share/zoneinfo/UTC /etc/localtime dpkg-reconfigure --frontend noninteractive tzdata From c3042b1e1fbe13a59e73ef98df4c86492cd0111a Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Sat, 8 Jul 2023 07:19:50 +0000 Subject: [PATCH 025/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 13e1505dde..0731d04a60 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:e474454ffab355081ca5062f5a9859548f392cae4654c65051d74e2ac05b489e + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:926a89de61815e90d22994b2e431488f888dba66433be6c71e08ae36d15fc184 lifecycle: preStop: exec: From f39256667f40e59c6584809d58ab16a9e9810a0a Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Sat, 8 Jul 2023 12:06:27 +0200 Subject: [PATCH 026/825] Revert "Remove node-gyp from CI image" This reverts commit 5ec364e4fa65550e59c5bdb246b261db4964f28e. --- ci/images/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/images/setup.sh b/ci/images/setup.sh index e34d82f62f..049db04665 100755 --- a/ci/images/setup.sh +++ b/ci/images/setup.sh @@ -7,7 +7,7 @@ set -ex export DEBIAN_FRONTEND=noninteractive apt-get update -apt-get install --no-install-recommends -y tzdata ca-certificates curl git +apt-get install --no-install-recommends -y tzdata ca-certificates curl git node-gyp ln -fs /usr/share/zoneinfo/UTC /etc/localtime dpkg-reconfigure --frontend noninteractive tzdata From 24722680fdf67f724f40eec5d535971b9547f957 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Sat, 8 Jul 2023 10:25:32 +0000 Subject: [PATCH 027/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 0731d04a60..e395d96730 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:926a89de61815e90d22994b2e431488f888dba66433be6c71e08ae36d15fc184 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:fd6d00e44059f7060640a9c4a63fed9c58a2c934932c3b96cae0502ff208042f lifecycle: preStop: exec: From 8e540244931ac95cec3418b9ce3c433517814126 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Wed, 22 Mar 2023 16:45:51 +0100 Subject: [PATCH 028/825] Add support for Spring Modulith This commit adds support to add Spring Modulith to a project. We add the Event Publication Registry matching the (optionally) also selected persistence flavor (JPA, JDBC, MongoDB). Also, the observability support in case any of the supported observability backends is selected as dependency. See gh-1228 --- .../SpringModulithBuildCustomizer.java | 104 +++++++++++++++++ ...odulithProjectGenerationConfiguration.java | 39 +++++++ .../springmodulith/package-info.java | 20 ++++ .../main/resources/META-INF/spring.factories | 1 + start-site/src/main/resources/application.yml | 16 +++ .../SpringModulithBuildCustomizerTests.java | 109 ++++++++++++++++++ 6 files changed, 289 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/package-info.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java new file mode 100644 index 0000000000..3fe786493e --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java @@ -0,0 +1,104 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springmodulith; + +import java.util.Collection; +import java.util.List; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.Dependency.Builder; +import io.spring.initializr.generator.buildsystem.DependencyContainer; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * Registers Spring Modulith dependencies to the build file of the project to be created, + * in particular registering integration dependencies depending on others registered for + * inclusion as well (observability and persistence). + * + * @author Oliver Drotbohm + */ +class SpringModulithBuildCustomizer implements BuildCustomizer { + + static final String GROUP_ID = "org.springframework.experimental"; + static final String BOM_ARTIFACT_ID = "spring-modulith-bom"; + + static final Collection OBSERVABILITY_DEPENDENCIES = List.of("datadog", "graphite", "influx", "new-relic", + "prometheus", "wavefront", "zipkin"); + + private static final String ARTIFACT_PREFIX = "spring-modulith-"; + + private static final Builder ACTUATOR = Dependency.withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "actuator") + .scope(DependencyScope.RUNTIME); + + private static final Builder OBSERVABILITY = Dependency + .withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "observability") + .scope(DependencyScope.RUNTIME); + + private static final Builder STARTER_JDBC = Dependency.withCoordinates(GROUP_ID, + ARTIFACT_PREFIX + "starter-jdbc"); + + private static final Builder STARTER_JPA = Dependency.withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "starter-jpa"); + + private static final Builder STARTER_MONGODB = Dependency.withCoordinates(GROUP_ID, + ARTIFACT_PREFIX + "starter-mongodb"); + + private static final Builder TEST = Dependency.withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "starter-test") + .scope(DependencyScope.TEST_COMPILE); + + @Override + public void customize(Build build) { + DependencyContainer dependencies = build.dependencies(); + + // Actuator + + if (dependencies.has("actuator")) { + dependencies.add("modulith-actuator", ACTUATOR); + } + + // Observability + + if (OBSERVABILITY_DEPENDENCIES.stream().anyMatch(dependencies::has)) { + dependencies.add("modulith-observability", OBSERVABILITY); + } + + // Event publication registry support + + addEventPublicationRegistryBackend(build); + + dependencies.add("modulith-starter-test", TEST); + } + + private void addEventPublicationRegistryBackend(Build build) { + + DependencyContainer dependencies = build.dependencies(); + + if (dependencies.has("data-mongodb")) { + dependencies.add("modulith-starter-mongodb", STARTER_MONGODB); + } + + if (dependencies.has("data-jdbc")) { + dependencies.add("modulith-starter-jdbc", STARTER_JDBC); + } + + if (dependencies.has("data-jpa")) { + dependencies.add("modulith-starter-jpa", STARTER_JPA); + } + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithProjectGenerationConfiguration.java new file mode 100644 index 0000000000..b9c2eacff7 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithProjectGenerationConfiguration.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springmodulith; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; + +import org.springframework.context.annotation.Bean; + +/** + * Registers {@link SpringModulithBuildCustomizer} with the context to allow selecting + * Spring Modulith dependencies. + * + * @author Oliver Drotbohm + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("modulith") +class SpringModulithProjectGenerationConfiguration { + + @Bean + SpringModulithBuildCustomizer springModulithBuildCustomizer() { + return new SpringModulithBuildCustomizer(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/package-info.java new file mode 100644 index 0000000000..f8b2174973 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on Spring Modulith. + */ +package io.spring.start.site.extension.dependency.springmodulith; diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index cf085aea04..5b483db2a0 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -25,6 +25,7 @@ io.spring.start.site.extension.dependency.springboot.SpringBootProjectGeneration io.spring.start.site.extension.dependency.springcloud.SpringCloudProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springdata.SpringDataProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springintegration.SpringIntegrationProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springmodulith.SpringModulithProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springpulsar.SpringPulsarProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springrestdocs.SpringRestDocsProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.sqlserver.SqlServerProjectGenerationConfiguration,\ diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f732f6bb5f..963878e434 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -139,6 +139,13 @@ initializr: version: 3.5.0 - compatibilityRange: "[3.0.0,3.1.0-M1)" version: 4.0.0 + spring-modulith: + groupId: org.springframework.modulith + artifactId: spring-modulith-bom + mappings: + - compatibility-range: "[3.1.0,3.2.0-M1)" + version: 1.0.0-M1 + repositories: spring-milestones spring-shell: groupId: org.springframework.shell artifactId: spring-shell-dependencies @@ -252,6 +259,15 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#features.docker-compose + - name: Spring Modulith + id: modulith + group-id: org.springframework.modulith + artifact-id: spring-modulith-starter-core + description: Support for building modular monolithic applications. + bom: spring-modulith + links: + - rel: reference + href: https://docs.spring.io/spring-modulith/docs/current/reference/html/ - name: Web content: - name: Spring Web diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java new file mode 100644 index 0000000000..c919698a36 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java @@ -0,0 +1,109 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springmodulith; + +import java.util.Collection; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.initializr.metadata.support.MetadataBuildItemResolver; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringModulithBuildCustomizer}. + * + * @author Oliver Drotbohm + */ +class SpringModulithBuildCustomizerTests extends AbstractExtensionTests { + + private final SpringModulithBuildCustomizer customizer = new SpringModulithBuildCustomizer(); + + @Test + void registersCoreStarterByDefault() { + Build build = createBuild(); + this.customizer.customize(build); + + assertThat(build.dependencies().ids()).contains("modulith"); + } + + @Test + void registersTestStarterByDefault() { + Build build = createBuild(); + this.customizer.customize(build); + + assertThat(build.dependencies().ids()).contains("modulith-starter-test"); + } + + @Test + void registersActuatorStarterIfActuatorsIsPresent() { + Build build = createBuild(); + build.dependencies().add("actuator"); + + this.customizer.customize(build); + + assertThat(build.dependencies().ids()).contains("modulith-actuator"); + } + + @ParameterizedTest + @MethodSource("observabilityDependencies") + void registersObservabilityStarterIfObservabilityDependencyIsPresent(String dependency) { + Build build = createBuild(); + build.dependencies().add(dependency); + + this.customizer.customize(build); + + assertThat(build.dependencies().ids()).contains("modulith-observability"); + } + + @ParameterizedTest + @ValueSource(strings = { "jdbc", "jpa", "mongodb" }) + void presenceOfSpringDataModuleAddsModuleEventStarter(String store) { + Build build = createBuild(); + build.dependencies().add("data-" + store); + + this.customizer.customize(build); + + assertThat(build.dependencies().ids()).contains("modulith-starter-" + store); + assertThat(build.boms().has("spring-modulith")); + } + + private Build createBuild() { + InitializrMetadata metadata = getMetadata(); + + Build build = new MavenBuild(new MetadataBuildItemResolver(metadata, getDefaultPlatformVersion(metadata))); + build.dependencies().add("modulith"); + + return build; + } + + private static Version getDefaultPlatformVersion(InitializrMetadata metadata) { + return Version.parse(metadata.getBootVersions().getDefault().getId()); + } + + private static Collection observabilityDependencies() { + return SpringModulithBuildCustomizer.OBSERVABILITY_DEPENDENCIES; + } + +} From 75fc90e4c23dadd93726813311ed2de640aadb3e Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 10 Jul 2023 14:47:22 +0200 Subject: [PATCH 029/825] Polish "Add support for Spring Modulith" See gh-1228 --- .../SpringModulithBuildCustomizer.java | 60 +++++-------------- start-site/src/main/resources/application.yml | 6 +- .../SpringModulithBuildCustomizerTests.java | 47 ++++----------- 3 files changed, 32 insertions(+), 81 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java index 3fe786493e..38cde13677 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java @@ -32,73 +32,43 @@ * inclusion as well (observability and persistence). * * @author Oliver Drotbohm + * @author Stephane Nicoll */ class SpringModulithBuildCustomizer implements BuildCustomizer { - static final String GROUP_ID = "org.springframework.experimental"; - static final String BOM_ARTIFACT_ID = "spring-modulith-bom"; - - static final Collection OBSERVABILITY_DEPENDENCIES = List.of("datadog", "graphite", "influx", "new-relic", - "prometheus", "wavefront", "zipkin"); - - private static final String ARTIFACT_PREFIX = "spring-modulith-"; - - private static final Builder ACTUATOR = Dependency.withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "actuator") - .scope(DependencyScope.RUNTIME); - - private static final Builder OBSERVABILITY = Dependency - .withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "observability") - .scope(DependencyScope.RUNTIME); - - private static final Builder STARTER_JDBC = Dependency.withCoordinates(GROUP_ID, - ARTIFACT_PREFIX + "starter-jdbc"); - - private static final Builder STARTER_JPA = Dependency.withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "starter-jpa"); - - private static final Builder STARTER_MONGODB = Dependency.withCoordinates(GROUP_ID, - ARTIFACT_PREFIX + "starter-mongodb"); - - private static final Builder TEST = Dependency.withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "starter-test") - .scope(DependencyScope.TEST_COMPILE); + private static final Collection OBSERVABILITY_DEPENDENCIES = List.of("actuator", "datadog", "graphite", + "influx", "new-relic", "prometheus", "wavefront", "zipkin"); @Override public void customize(Build build) { DependencyContainer dependencies = build.dependencies(); - - // Actuator - if (dependencies.has("actuator")) { - dependencies.add("modulith-actuator", ACTUATOR); + dependencies.add("modulith-actuator", modulithDependency("actuator").scope(DependencyScope.RUNTIME)); } - - // Observability - if (OBSERVABILITY_DEPENDENCIES.stream().anyMatch(dependencies::has)) { - dependencies.add("modulith-observability", OBSERVABILITY); + dependencies.add("modulith-observability", + modulithDependency("observability").scope(DependencyScope.RUNTIME)); } - - // Event publication registry support - addEventPublicationRegistryBackend(build); - - dependencies.add("modulith-starter-test", TEST); + dependencies.add("modulith-starter-test", + modulithDependency("starter-test").scope(DependencyScope.TEST_COMPILE)); } private void addEventPublicationRegistryBackend(Build build) { - DependencyContainer dependencies = build.dependencies(); - if (dependencies.has("data-mongodb")) { - dependencies.add("modulith-starter-mongodb", STARTER_MONGODB); + dependencies.add("modulith-starter-mongodb", modulithDependency("starter-mongodb")); } - if (dependencies.has("data-jdbc")) { - dependencies.add("modulith-starter-jdbc", STARTER_JDBC); + dependencies.add("modulith-starter-jdbc", modulithDependency("starter-jdbc")); } - if (dependencies.has("data-jpa")) { - dependencies.add("modulith-starter-jpa", STARTER_JPA); + dependencies.add("modulith-starter-jpa", modulithDependency("starter-jpa")); } } + private Builder modulithDependency(String name) { + return Dependency.withCoordinates("org.springframework.modulith", "spring-modulith-" + name); + } + } diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 963878e434..086d12719f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -261,13 +261,17 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#features.docker-compose - name: Spring Modulith id: modulith + bom: spring-modulith + compatibility-range: "[3.1.0,3.2.0-M1)" group-id: org.springframework.modulith artifact-id: spring-modulith-starter-core description: Support for building modular monolithic applications. - bom: spring-modulith links: - rel: reference href: https://docs.spring.io/spring-modulith/docs/current/reference/html/ + mappings: + - compatibilityRange: "[3.1.0,3.2.0-M1)" + starter: false - name: Web content: - name: Spring Web diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java index c919698a36..e1ea2dd8d0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java @@ -16,7 +16,7 @@ package io.spring.start.site.extension.dependency.springmodulith; -import java.util.Collection; +import java.util.Arrays; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; @@ -26,7 +26,6 @@ import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThat; @@ -41,69 +40,47 @@ class SpringModulithBuildCustomizerTests extends AbstractExtensionTests { private final SpringModulithBuildCustomizer customizer = new SpringModulithBuildCustomizer(); @Test - void registersCoreStarterByDefault() { - Build build = createBuild(); + void registersTestStarterWhenModulithIsSelected() { + Build build = createBuild("modulith"); this.customizer.customize(build); - - assertThat(build.dependencies().ids()).contains("modulith"); - } - - @Test - void registersTestStarterByDefault() { - Build build = createBuild(); - this.customizer.customize(build); - assertThat(build.dependencies().ids()).contains("modulith-starter-test"); } @Test void registersActuatorStarterIfActuatorsIsPresent() { - Build build = createBuild(); - build.dependencies().add("actuator"); - + Build build = createBuild("modulith", "actuator"); this.customizer.customize(build); - assertThat(build.dependencies().ids()).contains("modulith-actuator"); } @ParameterizedTest - @MethodSource("observabilityDependencies") + @ValueSource( + strings = { "actuator", "datadog", "graphite", "influx", "new-relic", "prometheus", "wavefront", "zipkin" }) void registersObservabilityStarterIfObservabilityDependencyIsPresent(String dependency) { - Build build = createBuild(); + Build build = createBuild("modulith"); build.dependencies().add(dependency); - this.customizer.customize(build); - assertThat(build.dependencies().ids()).contains("modulith-observability"); } @ParameterizedTest @ValueSource(strings = { "jdbc", "jpa", "mongodb" }) void presenceOfSpringDataModuleAddsModuleEventStarter(String store) { - Build build = createBuild(); + Build build = createBuild("modulith"); build.dependencies().add("data-" + store); - this.customizer.customize(build); - assertThat(build.dependencies().ids()).contains("modulith-starter-" + store); - assertThat(build.boms().has("spring-modulith")); } - private Build createBuild() { + private Build createBuild(String... dependencies) { InitializrMetadata metadata = getMetadata(); - - Build build = new MavenBuild(new MetadataBuildItemResolver(metadata, getDefaultPlatformVersion(metadata))); - build.dependencies().add("modulith"); - + MavenBuild build = new MavenBuild(new MetadataBuildItemResolver(metadata, getDefaultPlatformVersion(metadata))); + Arrays.stream(dependencies).forEach(build.dependencies()::add); return build; } - private static Version getDefaultPlatformVersion(InitializrMetadata metadata) { + private Version getDefaultPlatformVersion(InitializrMetadata metadata) { return Version.parse(metadata.getBootVersions().getDefault().getId()); } - private static Collection observabilityDependencies() { - return SpringModulithBuildCustomizer.OBSERVABILITY_DEPENDENCIES; - } - } From 3f66ac7e6b51aa3cd24f5dbbd7972d34f3934f21 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 10 Jul 2023 14:10:22 +0000 Subject: [PATCH 030/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index e395d96730..f2353a8c3a 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:fd6d00e44059f7060640a9c4a63fed9c58a2c934932c3b96cae0502ff208042f + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:610ad27fe55cccea04ba67b9488e499175ea486cc70064de7aa8c3ad571a59c9 lifecycle: preStop: exec: From 9b6fceb7b3bfbf28996ea27d9276c917bd43b396 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 10 Jul 2023 15:56:54 +0200 Subject: [PATCH 031/825] Raise minimum version to Spring Boot 2.6 This commit upgrades the service to reject requests to generate a project with a version inferior to 2.6.0. As a result, any specific customizations for those now unsupported versions have been removed. This includes the swap between V1 and V2 version format as we no longer need to accept the former. See gh-1241 --- ...tionProcessorExclusionBuildCustomizer.java | 12 +-- .../MavenProjectGenerationConfiguration.java | 8 +- ...vaVersionProjectDescriptionCustomizer.java | 87 ++----------------- start-site/src/main/resources/application.yml | 4 +- ...uildSystemHelpDocumentCustomizerTests.java | 12 +-- ...rocessorExclusionBuildCustomizerTests.java | 17 ---- ...uildSystemHelpDocumentCustomizerTests.java | 12 +-- .../KotlinCoroutinesCustomizerTests.java | 6 +- .../kotlin/ReactorKotlinExtensionTests.java | 5 +- .../okta/OktaHelpDocumentCustomizerTests.java | 4 +- .../ReactorTestBuildCustomizerTests.java | 2 - ...otProjectGenerationConfigurationTests.java | 2 - ...oudCircuitBreakerBuildCustomizerTests.java | 2 - ...loudContractMavenBuildCustomizerTests.java | 2 +- ...udFunctionHelpDocumentCustomizerTests.java | 4 +- ...inProjectGenerationConfigurationTests.java | 2 +- ...JvmVersionHelpDocumentCustomizerTests.java | 6 +- ...sionProjectDescriptionCustomizerTests.java | 45 +++------- 18 files changed, 48 insertions(+), 184 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizer.java index 912549ddad..71e024ef0b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizer.java @@ -21,9 +21,6 @@ import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; @@ -35,18 +32,13 @@ */ class AnnotationProcessorExclusionBuildCustomizer implements BuildCustomizer { - private static final VersionRange SPRING_BOOT_2_4_0_M3_0R_LATER = VersionParser.DEFAULT.parseRange("2.4.0-M3"); - private static final List KNOWN_ANNOTATION_PROCESSORS = Collections .singletonList("configuration-processor"); private final InitializrMetadata metadata; - private final boolean hasSmartExclude; - - AnnotationProcessorExclusionBuildCustomizer(InitializrMetadata metadata, Version platformVersion) { + AnnotationProcessorExclusionBuildCustomizer(InitializrMetadata metadata) { this.metadata = metadata; - this.hasSmartExclude = SPRING_BOOT_2_4_0_M3_0R_LATER.match(platformVersion); } @Override @@ -57,7 +49,7 @@ public void customize(MavenBuild build) { List dependencies = build.dependencies() .ids() .filter(this::isAnnotationProcessor) - .filter((id) -> !this.hasSmartExclude || !KNOWN_ANNOTATION_PROCESSORS.contains(id)) + .filter((id) -> !KNOWN_ANNOTATION_PROCESSORS.contains(id)) .map((id) -> build.dependencies().get(id)) .toList(); if (!dependencies.isEmpty()) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java index 2393bf794f..aa2ad70e2e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,9 +39,9 @@ MavenBuildSystemHelpDocumentCustomizer mavenBuildSystemHelpDocumentCustomizer(Pr } @Bean - AnnotationProcessorExclusionBuildCustomizer annotationProcessorExclusionBuildCustomizer(InitializrMetadata metadata, - ProjectDescription description) { - return new AnnotationProcessorExclusionBuildCustomizer(metadata, description.getPlatformVersion()); + AnnotationProcessorExclusionBuildCustomizer annotationProcessorExclusionBuildCustomizer( + InitializrMetadata metadata) { + return new AnnotationProcessorExclusionBuildCustomizer(metadata); } } diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index c229d9e48b..fa6b73245f 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,9 +19,7 @@ import java.util.Arrays; import java.util.List; -import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; import io.spring.initializr.generator.language.Language; -import io.spring.initializr.generator.language.groovy.GroovyLanguage; import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; @@ -40,26 +38,12 @@ public class JavaVersionProjectDescriptionCustomizer implements ProjectDescripti private static final List UNSUPPORTED_VERSIONS = Arrays.asList("1.6", "1.7"); - private static final VersionRange SPRING_BOOT_2_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("2.3.0.RELEASE"); - - private static final VersionRange SPRING_BOOT_2_4_4_OR_LATER = VersionParser.DEFAULT.parseRange("2.4.4"); - - private static final VersionRange SPRING_BOOT_2_5_0_OR_LATER = VersionParser.DEFAULT.parseRange("2.5.0-RC1"); - - private static final VersionRange SPRING_BOOT_2_5_5_OR_LATER = VersionParser.DEFAULT.parseRange("2.5.5"); - - private static final VersionRange SPRING_BOOT_2_5_11_OR_LATER = VersionParser.DEFAULT.parseRange("2.5.11"); - - private static final VersionRange SPRING_BOOT_2_6_0_OR_LATER = VersionParser.DEFAULT.parseRange("2.6.0"); - private static final VersionRange SPRING_BOOT_2_6_12_OR_LATER = VersionParser.DEFAULT.parseRange("2.6.12"); private static final VersionRange SPRING_BOOT_2_7_10_OR_LATER = VersionParser.DEFAULT.parseRange("2.7.10"); private static final VersionRange SPRING_BOOT_3_0_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0-M1"); - private static final VersionRange GRADLE_6 = VersionParser.DEFAULT.parseRange("2.2.2.RELEASE"); - @Override public void customize(MutableProjectDescription description) { String javaVersion = description.getLanguage().jvmVersion(); @@ -77,62 +61,10 @@ public void customize(MutableProjectDescription description) { updateTo(description, "17"); return; } - - // 13 support only as of Gradle 6 - if (javaGeneration == 13 && description.getBuildSystem() instanceof GradleBuildSystem - && !GRADLE_6.match(platformVersion)) { - updateTo(description, "11"); - } - // 15 support only as of 2.2.11 - if (javaGeneration == 15 && !SPRING_BOOT_2_3_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - if (javaGeneration == 16) { - // Full Support as of Spring Boot 2.5 only. - // 16 support as of Kotlin 1.5 - if (description.getLanguage() instanceof KotlinLanguage - && !SPRING_BOOT_2_5_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - // 16 support as of Gradle 7 - if (description.getBuildSystem() instanceof GradleBuildSystem - && !SPRING_BOOT_2_5_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - // Groovy 3 only available as of 2.5 - if (description.getLanguage() instanceof GroovyLanguage - && !SPRING_BOOT_2_5_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - // 16 support only as of 2.4.4 - if (!SPRING_BOOT_2_4_4_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - } - if (javaGeneration == 17) { - // Java 17 support as of Spring Boot 2.5.5 - if (!SPRING_BOOT_2_5_5_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - // Kotlin 1.6 only - if (description.getLanguage() instanceof KotlinLanguage - && !SPRING_BOOT_2_6_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - } if (javaGeneration == 18) { - // Java 18 support as of Spring Boot 2.5.11 - if (!SPRING_BOOT_2_5_11_OR_LATER.match(platformVersion)) { - updateTo(description, "17"); - } // Kotlin support to be determined if (description.getLanguage() instanceof KotlinLanguage) { - if (!SPRING_BOOT_2_6_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - else { - updateTo(description, "17"); - } + updateTo(description, "17"); } } if (javaGeneration == 19) { @@ -142,12 +74,7 @@ public void customize(MutableProjectDescription description) { } // Kotlin support to be determined if (description.getLanguage() instanceof KotlinLanguage) { - if (!SPRING_BOOT_2_6_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - else { - updateTo(description, "17"); - } + updateTo(description, "17"); } } if (javaGeneration == 20) { @@ -157,12 +84,8 @@ public void customize(MutableProjectDescription description) { } // Kotlin support to be determined if (description.getLanguage() instanceof KotlinLanguage) { - if (!SPRING_BOOT_2_6_0_OR_LATER.match(platformVersion)) { - updateTo(description, "11"); - } - else { - updateTo(description, "17"); - } + updateTo(description, "17"); + } } } diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 086d12719f..9c87dcf7b6 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -199,9 +199,7 @@ initializr: - compatibilityRange: "[1.5.0.RELEASE,2.0.0.M1)" version: 1.2.51 platform: - compatibility-range: "2.3.0.RELEASE" - v1-format-compatibility-range: "[2.0.0.RELEASE,2.4.0-M1)" - v2-format-compatibility-range: "2.4.0-M1" + compatibility-range: "2.6.0" repositories: spring-releases: name: Spring Releases diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java index 5354983d48..c1cf2954c7 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,19 +33,19 @@ class GradleBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTest @Test void linksAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", "2.5.0").contains( + assertHelpDocument("gradle-build", "3.0.0").contains( "* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.5.0/gradle-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.5.0/gradle-plugin/reference/html/#build-image)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.0.0/gradle-plugin/reference/html/)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.0.0/gradle-plugin/reference/html/#build-image)"); } @Test void linksNotAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", "2.5.0").doesNotContain( + assertHelpDocument("maven-build", "3.0.0").doesNotContain( "* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.5.0/gradle-plugin/reference/html/)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.0.0/gradle-plugin/reference/html/)"); } private ListAssert assertHelpDocument(String type, String version) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizerTests.java index dde690a7c3..dfbbe5484c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/AnnotationProcessorExclusionBuildCustomizerTests.java @@ -29,25 +29,9 @@ */ class AnnotationProcessorExclusionBuildCustomizerTests extends AbstractExtensionTests { - @Test - void annotationProcessorsAreExcludedWithoutMetadata() { - ProjectRequest request = createProjectRequest("lombok", "configuration-processor"); - request.setBootVersion("2.3.0.RELEASE"); - assertThat(mavenPom(request)).lines() - .containsSequence(" ", " ", - " org.projectlombok", - " lombok", " ", - " ", - " org.springframework.boot", - " spring-boot-configuration-processor", - " ", " "); - - } - @Test void annotationProcessorsAreExcludedOnlyIfTheyAreNotHandledWithMetadata() { ProjectRequest request = createProjectRequest("lombok", "configuration-processor"); - request.setBootVersion("2.4.0"); assertThat(mavenPom(request)).lines() .containsSequence(" ", " ", " org.projectlombok", @@ -59,7 +43,6 @@ void annotationProcessorsAreExcludedOnlyIfTheyAreNotHandledWithMetadata() { @Test void nonAnnotationProcessorsAreIgnored() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("2.4.0"); assertThat(mavenPom(request)).lines() .doesNotContainSequence(" ", " org.springframework.boot", diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java index 9d3f69865f..b9a806d793 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,17 +33,17 @@ class MavenBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests @Test void linksAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", "2.5.0").contains( + assertHelpDocument("maven-build", "3.0.0").contains( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.5.0/maven-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.5.0/maven-plugin/reference/html/#build-image)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.0.0/maven-plugin/reference/html/)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.0.0/maven-plugin/reference/html/#build-image)"); } @Test void linksNotAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", "2.5.0").doesNotContain( + assertHelpDocument("gradle-build", "3.0.0").doesNotContain( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.5.0/maven-plugin/)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.0.0/maven-plugin/)"); } private ListAssert assertHelpDocument(String type, String version) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java index b4c91c3a30..d4ec79a43a 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java @@ -33,19 +33,18 @@ class KotlinCoroutinesCustomizerTests extends AbstractExtensionTests { @Test void kotlinCoroutinesIsAdded() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("2.5.0"); + request.setBootVersion("2.7.0"); request.setLanguage("kotlin"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("org.jetbrains.kotlinx", "kotlinx-coroutines-reactor"); assertThat(project).textFile("HELP.md") .contains( - "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring/docs/5.3.7/spring-framework-reference/languages.html#coroutines)"); + "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring/docs/5.3.20/spring-framework-reference/languages.html#coroutines)"); } @Test void kotlinCoroutinesIsNotAddedWithNonKotlinApp() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("2.5.0"); request.setLanguage("java"); assertThat(mavenPom(request)).doesNotHaveDependency("org.jetbrains.kotlinx", "kotlinx-coroutines-reactor"); } @@ -53,7 +52,6 @@ void kotlinCoroutinesIsNotAddedWithNonKotlinApp() { @Test void kotlinCoroutinesIsNotAddedWithoutReactiveFacet() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("2.5.0"); request.setLanguage("kotlin"); assertThat(mavenPom(request)).doesNotHaveDependency("org.jetbrains.kotlinx", "kotlinx-coroutines-reactor"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionTests.java index 568e32e3b1..7d0fefc372 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,7 +33,6 @@ class ReactorKotlinExtensionTests extends AbstractExtensionTests { @Test void reactorKotlinExtensionsIsAdded() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("2.5.0"); request.setLanguage("kotlin"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("io.projectreactor.kotlin", "reactor-kotlin-extensions"); @@ -42,7 +41,6 @@ void reactorKotlinExtensionsIsAdded() { @Test void reactorKotlinExtensionsIsNotAddedWithNonKotlinApp() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("2.5.0"); request.setLanguage("java"); assertThat(mavenPom(request)).doesNotHaveDependency("io.projectreactor.kotlin", "reactor-kotlin-extensions"); } @@ -50,7 +48,6 @@ void reactorKotlinExtensionsIsNotAddedWithNonKotlinApp() { @Test void reactorKotlinExtensionsIsNotAddedWithoutReactiveFacet() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("2.5.0"); request.setLanguage("kotlin"); assertThat(mavenPom(request)).doesNotHaveDependency("io.projectreactor.kotlin", "reactor-kotlin-extensions"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java index eebfd4ad05..49ca7678fb 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,7 +41,7 @@ void oktaSectionWithoutOktaDependencyIsMissing() { private TextAssert assertHelpDocument(String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion("2.4.6"); + request.setBootVersion("3.0.0"); ProjectStructure project = generateProject(request); return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizerTests.java index a6669223bb..45ee61b1eb 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizerTests.java @@ -33,7 +33,6 @@ class ReactorTestBuildCustomizerTests extends AbstractExtensionTests { @Test void reactorTestIsAdded() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("2.5.0"); Dependency reactorTest = Dependency.withId("reactor-test", "io.projectreactor", "reactor-test"); reactorTest.setScope(Dependency.SCOPE_TEST); assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("webflux")) @@ -45,7 +44,6 @@ void reactorTestIsAdded() { @Test void reactorTestIsNotAddedWithoutReactiveFacet() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("2.5.0"); assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("web")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependenciesSize(2); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java index 4af4241450..8692d29f51 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java @@ -33,7 +33,6 @@ class SpringBootProjectGenerationConfigurationTests extends AbstractExtensionTes @Test void gradleWithDevtoolsConfigureBuild() { ProjectRequest request = createProjectRequest("devtools"); - request.setBootVersion("2.4.8"); assertThat(gradleBuild(request)).lines() .doesNotContain("configurations {") .contains("\tdevelopmentOnly 'org.springframework.boot:spring-boot-devtools'"); @@ -42,7 +41,6 @@ void gradleWithDevtoolsConfigureBuild() { @Test void gradleWithoutDevtoolsDoesNotCreateDevelopmentOnlyConfiguration() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("2.4.8"); assertThat(gradleBuild(request)).doesNotContain("developmentOnly"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java index 2c7a164ca4..0aeb6e74fe 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java @@ -36,7 +36,6 @@ class SpringCloudCircuitBreakerBuildCustomizerTests extends AbstractExtensionTes @Test void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() { ProjectRequest request = createProjectRequest("webflux", "cloud-resilience4j"); - request.setBootVersion("2.5.0"); assertThat(mavenPom(request)).hasDependency(getDependency("webflux")) .hasDependency(REACTIVE_CLOUD_CIRCUIT_BREAKER) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-resilience4j") @@ -47,7 +46,6 @@ void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() @Test void doesNotReplaceCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetNotPresent() { ProjectRequest request = createProjectRequest("cloud-resilience4j"); - request.setBootVersion("2.5.0"); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-resilience4j")) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-reactor-resilience4j") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java index 89565790a2..f49f9c9915 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java @@ -50,7 +50,7 @@ void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { @Test void springCloudContractVerifierPluginForSpringBootWithJUnit5ByDefault() { ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - projectRequest.setBootVersion("2.4.0"); + projectRequest.setBootVersion("2.7.0"); assertThat(mavenPom(projectRequest)) .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") .hasText("/project/build/plugins/plugin[1]/configuration/testFramework", "JUNIT5"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java index 092423dee8..56f24e45b3 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,7 +36,6 @@ class SpringCloudFunctionHelpDocumentCustomizerTests extends AbstractExtensionTe @Test void functionBuildSetupInfoSectionAddedForMaven() { ProjectRequest request = createProjectRequest(); - request.setBootVersion("2.5.0"); request.setType("maven-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); @@ -45,7 +44,6 @@ void functionBuildSetupInfoSectionAddedForMaven() { @Test void functionBuildSetupInfoSectionAddedForGradle() { ProjectRequest request = createProjectRequest(); - request.setBootVersion("2.5.0"); request.setType("gradle-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java index 0f590a2f6b..d144179595 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java @@ -111,7 +111,7 @@ void gitIgnoreWithoutVaadinDoesNotIgnoreNodeModules() { @Override protected ProjectRequest createProjectRequest(String... dependencies) { ProjectRequest request = super.createProjectRequest(dependencies); - request.setBootVersion("2.4.6"); + request.setBootVersion("2.7.13"); return request; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java index 20a3635850..575e67b346 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java @@ -31,14 +31,14 @@ class InvalidJvmVersionHelpDocumentCustomizerTests extends AbstractExtensionTest @Test void warningAddedWithUnsupportedCombination() { - assertHelpDocument("2.4.0", "16").lines() + assertHelpDocument("3.0.0", "11").lines() .containsSubsequence("# Read Me First", - "* The JVM level was changed from '16' to '11', review the [JDK Version Range](https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range) on the wiki for more details."); + "* The JVM level was changed from '11' to '17', review the [JDK Version Range](https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range) on the wiki for more details."); } @Test void warningNotAddedWithCompatibleVersion() { - assertHelpDocument("2.4.8", "11").doesNotContain("# Read Me First"); + assertHelpDocument("3.0.0", "17").doesNotContain("# Read Me First"); } private TextAssert assertHelpDocument(String platformVersion, String jvmVersion) { diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index 16fb1062a8..97756196bf 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,36 +34,26 @@ */ class JavaVersionProjectDescriptionCustomizerTests extends AbstractExtensionTests { - @Test - void java8IsMandatoryMaven() { - assertThat(mavenPom(javaProject("1.7", "2.3.0.RELEASE"))).hasProperty("java.version", "1.8"); - } - - @Test - void java8IsMandatoryGradle() { - assertThat(gradleBuild(javaProject("1.7", "2.3.0.RELEASE"))).hasSourceCompatibility("1.8"); - } - @Test void javaUnknownVersionIsLeftAsIs() { - assertThat(mavenPom(javaProject("9999999", "2.3.0.RELEASE"))).hasProperty("java.version", "9999999"); + assertThat(mavenPom(javaProject("9999999", "2.7.13"))).hasProperty("java.version", "9999999"); } @Test void javaInvalidVersionIsLeftAsIs() { - assertThat(mavenPom(javaProject("${another.version}", "2.3.0.RELEASE"))).hasProperty("java.version", + assertThat(mavenPom(javaProject("${another.version}", "2.7.13"))).hasProperty("java.version", "${another.version}"); } @Test void java8IsNotCompatibleWithSpringBoot3() { - ProjectRequest request = javaProject("1.8", "3.0.0-M1"); + ProjectRequest request = javaProject("1.8", "3.0.0"); assertThat(mavenPom(request)).hasProperty("java.version", "17"); } @Test void java11IsNotCompatibleWithSpringBoot3() { - ProjectRequest request = javaProject("11", "3.0.0-M1"); + ProjectRequest request = javaProject("11", "3.0.0"); assertThat(mavenPom(request)).hasProperty("java.version", "17"); } @@ -92,37 +82,29 @@ static Stream supportedGradleGroovyParameters() { } private static Stream supportedJavaParameters() { - return Stream.of(java("9", "2.3.0.RELEASE"), java("10", "2.3.0.RELEASE"), java("11", "2.3.0.RELEASE"), - java("12", "2.3.0.RELEASE"), java("13", "2.3.0.RELEASE"), java("14", "2.3.0.RELEASE"), - java("15", "2.3.4.RELEASE"), java("16", "2.5.0-RC1"), java("17", "2.5.5"), java("18", "2.5.11"), - java("19", "2.6.12"), java("20", "2.7.10")); + return Stream.of(java("19", "2.6.12"), java("20", "2.7.10")); } private static Stream supportedKotlinParameters() { - return Stream.of(kotlin("9", "2.3.0.RELEASE"), kotlin("10", "2.3.0.RELEASE"), kotlin("11", "2.3.0.RELEASE"), - kotlin("12", "2.3.0.RELEASE"), kotlin("13", "2.3.0.RELEASE"), kotlin("14", "2.3.0.RELEASE"), - kotlin("15", "2.3.4.RELEASE"), kotlin("16", "2.5.0-RC1"), kotlin("17", "2.6.0")); + return Stream.of(kotlin("17", "2.6.0")); } private static Stream supportedGroovyParameters() { - return Stream.of(groovy("9", "2.3.0.RELEASE"), groovy("10", "2.3.0.RELEASE"), groovy("11", "2.3.0.RELEASE"), - groovy("12", "2.3.0.RELEASE"), groovy("13", "2.3.0.RELEASE"), groovy("14", "2.3.0.RELEASE"), - groovy("15", "2.3.4.RELEASE"), groovy("16", "2.5.0-RC1"), groovy("17", "2.5.5"), groovy("18", "2.5.11"), - groovy("19", "2.6.12"), groovy("20", "2.7.10")); + return Stream.of(groovy("19", "2.6.12"), groovy("20", "2.7.10")); } @ParameterizedTest(name = "{0} - Java {1} - Spring Boot {2}") @MethodSource("unsupportedMavenParameters") void mavenBuildWithUnsupportedOptionsDowngradesToLts(String language, String javaVersion, String springBootVersion) { - assertThat(mavenPom(project(language, javaVersion, springBootVersion))).hasProperty("java.version", "11"); + assertThat(mavenPom(project(language, javaVersion, springBootVersion))).hasProperty("java.version", "17"); } @ParameterizedTest(name = "{0} - Java {1} - Spring Boot {2}") @MethodSource("unsupportedGradleGroovyParameters") void gradleGroovyBuildWithUnsupportedOptionsDowngradesToLts(String language, String javaVersion, String springBootVersion) { - assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasSourceCompatibility("11"); + assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasSourceCompatibility("17"); } static Stream unsupportedMavenParameters() { @@ -135,16 +117,15 @@ static Stream unsupportedGradleGroovyParameters() { } private static Stream unsupportedJavaParameters() { - return Stream.of(java("16", "2.4.3"), java("17", "2.5.4")); + return Stream.of(java("19", "2.6.11")); } private static Stream unsupportedKotlinParameters() { - return Stream.of(kotlin("16", "2.4.3"), kotlin("17", "2.5.5"), kotlin("18", "2.5.11"), kotlin("19", "2.5.11"), - kotlin("20", "2.5.11")); + return Stream.of(kotlin("18", "2.6.12"), kotlin("19", "2.6.12"), kotlin("20", "2.6.12")); } private static Stream unsupportedGroovyParameters() { - return Stream.of(groovy("16", "2.4.3"), groovy("17", "2.5.4")); + return Stream.of(groovy("19", "2.6.11")); } private static Arguments java(String javaVersion, String springBootVersion) { From eb8c74e092d4fb8dc0f11372e51f71cae4911aba Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 10 Jul 2023 15:56:54 +0200 Subject: [PATCH 032/825] Simplify version ranges This commit updates the metadata to remove mappings for versions prior to Spring Boot 2.6.0. See gh-1241 --- start-site/src/main/resources/application.yml | 142 ++++++------------ 1 file changed, 42 insertions(+), 100 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9c87dcf7b6..68b8f0e7ab 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -43,13 +43,9 @@ initializr: artifactId: spring-boot-admin-dependencies versionProperty: spring-boot-admin.version mappings: - - compatibilityRange: "[2.3.0.M1,2.5.0-M1)" - version: 2.4.3 - - compatibilityRange: "[2.5.0.M1,2.6.0-M1)" - version: 2.5.6 - - compatibilityRange: "[2.6.0.M1,2.7.0-M1)" + - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 2.6.8 - - compatibilityRange: "[2.7.0.M1,3.0.0-M1)" + - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 2.7.4 - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" version: 3.0.4 @@ -67,9 +63,7 @@ initializr: artifactId: solace-spring-boot-bom versionProperty: solace-spring-boot.version mappings: - - compatibilityRange: "[2.3.0.M1,2.6.0-M1)" - version: 1.1.0 - - compatibilityRange: "[2.6.0.M1,3.0.0-M1)" + - compatibilityRange: "[2.6.0,3.0.0-M1)" version: 1.2.2 - compatibilityRange: "3.0.0-M1" version: 2.0.0 @@ -78,11 +72,7 @@ initializr: artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "[2.3.0.M1,2.4.0-M1)" - version: 1.1.1 - - compatibilityRange: "[2.4.0.M1,2.6.0-M1)" - version: 2.1.0 - - compatibilityRange: "[2.6.0.M1,3.0.0-M1)" + - compatibilityRange: "[2.6.0,3.0.0-M1)" version: 2.3.2 - compatibilityRange: "3.0.0-M1" version: 3.0.0 @@ -92,10 +82,6 @@ initializr: versionProperty: spring-cloud.version order: 50 mappings: - - compatibilityRange: "[2.2.0.RELEASE,2.4.0.RELEASE)" - version: Hoxton.SR12 - - compatibilityRange: "[2.4.0.RELEASE,2.6.0)" - version: 2020.0.6 - compatibilityRange: "[2.6.0,3.0.0)" version: 2021.0.8 - compatibilityRange: "[3.0.0,3.2.0-M1)" @@ -105,7 +91,7 @@ initializr: artifactId: spring-cloud-azure-dependencies versionProperty: spring-cloud-azure.version mappings: - - compatibilityRange: "[2.5.0.M1,3.0.0-M1)" + - compatibilityRange: "[2.6.0,3.0.0-M1)" version: 4.9.0 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" version: 5.3.0 @@ -115,9 +101,7 @@ initializr: versionProperty: spring-cloud-gcp.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[2.4.0-M1,2.6.0-M1)" - version: 2.0.11 - - compatibilityRange: "[2.6.0-M1,3.0.0-M1)" + - compatibilityRange: "[2.6.0,3.0.0-M1)" version: 3.5.4 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" version: 4.5.1 @@ -127,13 +111,7 @@ initializr: versionProperty: spring-cloud-services.version additionalBoms: [spring-cloud] mappings: - - compatibilityRange: "[2.3.0.RELEASE,2.4.0-M1)" - version: 2.3.0.RELEASE - - compatibilityRange: "[2.4.0-M1,2.5.0-M1)" - version: 2.4.1 - - compatibilityRange: "[2.5.0-M1,2.6.0-M1)" - version: 3.3.0 - - compatibilityRange: "[2.6.0-M1,2.7.0-M1)" + - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 3.4.0 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 3.5.0 @@ -167,9 +145,7 @@ initializr: artifactId: vaadin-bom versionProperty: vaadin.version mappings: - - compatibilityRange: "[2.1.0.RELEASE,2.6.0-M1)" - version: 14.10.3 - - compatibilityRange: "[2.6.0-M1,2.7.0-M1)" + - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 23.3.16 @@ -182,11 +158,7 @@ initializr: artifactId: wavefront-spring-boot-bom versionProperty: wavefront.version mappings: - - compatibilityRange: "[2.1.0.RELEASE,2.4.0-M1)" - version: 2.0.2 - - compatibilityRange: "[2.4.0-M1,2.5.0-M1)" - version: 2.1.1 - - compatibilityRange: "[2.5.0-M1,2.7.0-M1)" + - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 2.2.2 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 2.3.4 @@ -194,10 +166,6 @@ initializr: version: 3.0.1 gradle: dependency-management-plugin-version: 1.0.14.RELEASE - kotlin: - mappings: - - compatibilityRange: "[1.5.0.RELEASE,2.0.0.M1)" - version: 1.2.51 platform: compatibility-range: "2.6.0" repositories: @@ -304,7 +272,7 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.reactive - name: Spring for GraphQL id: graphql - compatibilityRange: "2.7.0.M1" + compatibilityRange: "2.7.0-M1" description: Build GraphQL applications with Spring for GraphQL and GraphQL Java. facets: - json @@ -382,7 +350,7 @@ initializr: artifactId: vaadin-spring-boot-starter description: A web framework that allows you to write UI in pure Java without getting bogged down in JS, HTML, and CSS. bom: vaadin - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" links: - rel: guide href: https://spring.io/guides/gs/crud-with-vaadin/ @@ -468,7 +436,6 @@ initializr: - name: OAuth2 Resource Server id: oauth2-resource-server description: Spring Boot integration for Spring Security's OAuth2 resource server features. - compatibilityRange: "2.1.0.M2" links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.security.oauth2.server @@ -480,18 +447,12 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.ldap - name: Okta id: okta - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" description: Okta specific configuration for Spring Security/Spring Boot OAuth2 features. Enable your Spring Boot application to work with Okta via OAuth 2.0/OIDC. groupId: com.okta.spring artifactId: okta-spring-boot-starter mappings: - - compatibilityRange: "[2.2.0.RELEASE,2.4.0-M1)" - version: 1.4.0 - - compatibilityRange: "[2.4.0-M1,2.4.1)" - version: 1.5.1 - - compatibilityRange: "[2.4.1,2.5.0-M1)" - version: 2.0.1 - - compatibilityRange: "[2.5.0-M1,3.0.0-M1)" + - compatibilityRange: "[2.6.0,3.0.0-M1)" version: 2.1.6 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" version: 3.0.4 @@ -560,7 +521,7 @@ initializr: description: R2DBC Homepage - name: MyBatis Framework id: mybatis - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" description: Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. links: - rel: guide @@ -571,9 +532,7 @@ initializr: groupId: org.mybatis.spring.boot artifactId: mybatis-spring-boot-starter mappings: - - compatibilityRange: "[2.1.0.RELEASE,2.5.0-M1)" - version: 2.1.4 - - compatibilityRange: "[2.5.0-M1,2.7.0-M1)" + - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 2.2.2 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 2.3.1 @@ -605,7 +564,6 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.sql.jooq - name: IBM DB2 Driver id: db2 - compatibilityRange: "2.2.0.M6" description: A JDBC driver that provides access to IBM DB2. groupId: com.ibm.db2 artifactId: jcc @@ -863,7 +821,6 @@ initializr: - name: RSocket id: rsocket description: RSocket.io applications with Spring Messaging and Netty. - compatibilityRange: "2.2.0.M2" facets: - reactive links: @@ -871,15 +828,9 @@ initializr: href: https://rsocket.io/ - name: Apache Camel id: camel - compatibilityRange: "[2.0.0.M1,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" mappings: - - compatibilityRange: "[2.3.0.M1,2.4.0-M1)" - version: 3.5.0 - - compatibilityRange: "[2.4.0.M1,2.5.0-M1)" - version: 3.10.0 - - compatibilityRange: "[2.5.0.M1,2.6.0-M1)" - version: 3.13.0 - - compatibilityRange: "[2.6.0.M1,2.7.0-M1)" + - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 3.17.0 - compatibilityRange: "[2.7.0.M1,3.0.0-M1)" version: 3.20.6 @@ -895,7 +846,7 @@ initializr: - name: Solace PubSub+ bom: solace-spring-boot id: solace - compatibilityRange: "[2.2.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" description: Connect to a Solace PubSub+ Advanced Event Broker to publish, subscribe, request/reply and store/replay messages groupId: com.solace.spring.boot artifactId: solace-spring-boot-starter @@ -950,10 +901,10 @@ initializr: id: picocli groupId: info.picocli artifactId: picocli-spring-boot-starter - compatibilityRange: "[2.5.0.RELEASE,3.1.0-M1)" + compatibilityRange: "[2.6.0,3.1.0-M1)" description: Build command line applications with picocli. mappings: - - compatibilityRange: "[2.5.0.RELEASE,3.1.0-M1)" + - compatibilityRange: "[2.6.0,3.1.0-M1)" version: 4.7.0 links: - rel: reference @@ -984,7 +935,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-client description: Required for your application to register with a Codecentric's Spring Boot Admin Server instance. - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -994,7 +945,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-server description: A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints. - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -1068,7 +1019,7 @@ initializr: artifactId: micrometer-tracing-bridge-brave starter: false mappings: - - compatibility-range: "[2.3.0.M1,3.0.0-M1)" + - compatibility-range: "[2.6.0,3.0.0-M1)" groupId: org.springframework.cloud artifactId: spring-cloud-starter-sleuth bom: spring-cloud @@ -1081,7 +1032,7 @@ initializr: scope: runtime starter: false mappings: - - compatibility-range: "[2.3.0.M1,3.1.0-M1)" + - compatibility-range: "[2.6.0,3.1.0-M1)" groupId: com.wavefront artifactId: wavefront-spring-boot-starter bom: wavefront @@ -1093,7 +1044,7 @@ initializr: artifactId: zipkin-reporter-brave starter: false mappings: - - compatibilityRange: "[2.0.0.RELEASE,3.0.0-M1)" + - compatibilityRange: "[2.6.0,3.0.0-M1)" groupId: org.springframework.cloud artifactId: spring-cloud-sleuth-zipkin bom: spring-cloud @@ -1117,7 +1068,7 @@ initializr: scope: test starter: false mappings: - - compatibility-range: "[2.3.0.M1,3.1.0-M2)" + - compatibility-range: "[2.6.0,3.1.0-M2)" bom: testcontainers links: - rel: reference @@ -1125,7 +1076,7 @@ initializr: - name: Contract Verifier bom: spring-cloud id: cloud-contract-verifier - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" description: Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development. groupId: org.springframework.cloud artifactId: spring-cloud-starter-contract-verifier @@ -1136,7 +1087,7 @@ initializr: - name: Contract Stub Runner bom: spring-cloud id: cloud-contract-stub-runner - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests. groupId: org.springframework.cloud artifactId: spring-cloud-starter-contract-stub-runner @@ -1156,7 +1107,7 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.ldap.embedded - name: Embedded MongoDB Database id: flapdoodle-mongo - compatibilityRange: "[2.0.0.RELEASE,3.0.0-M1)" + compatibilityRange: "[2.6.0,3.0.0-M1)" description: Provides a platform neutral way for running MongoDB in unit tests. groupId: de.flapdoodle.embed artifactId: de.flapdoodle.embed.mongo @@ -1167,7 +1118,7 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.mongodb.embedded - name: Spring Cloud bom: spring-cloud - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Cloud Bootstrap id: cloud-starter @@ -1201,18 +1152,12 @@ initializr: content: - name: Open Service Broker id: open-service-broker - compatibilityRange: "[2.0.0.RELEASE,2.7.0-M1)" + compatibilityRange: "[2.6.0,2.7.0-M1)" description: Framework for building Spring Boot apps that implement the Open Service Broker API, which can deliver services to applications running within cloud native platforms such as Cloud Foundry, Kubernetes and OpenShift. groupId: org.springframework.cloud artifactId: spring-cloud-starter-open-service-broker mappings: - - compatibilityRange: "[2.3.0.M1,2.4.0-M1)" - version: 3.2.0 - - compatibilityRange: "[2.4.0-M1,2.5.0-M1)" - version: 3.3.1 - - compatibilityRange: "[2.5.0-M1,2.6.0-M1)" - version: 3.4.1 - - compatibilityRange: "[2.6.0-M1,2.7.0-M1)" + - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 3.5.0 links: - rel: reference @@ -1222,7 +1167,7 @@ initializr: description: Using Spring Cloud Open Service Broker - name: Spring Cloud Config bom: spring-cloud - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Config Client id: cloud-config-client @@ -1273,7 +1218,7 @@ initializr: description: Spring Cloud Consul Quick Start - name: Spring Cloud Discovery bom: spring-cloud - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Eureka Discovery Client id: cloud-eureka @@ -1307,7 +1252,7 @@ initializr: href: https://docs.spring.io/spring-cloud-zookeeper/docs/current/reference/html/#spring-cloud-zookeeper-discovery - name: Cloud Foundry Discovery id: cloud-cloudfoundry-discovery - compatibilityRange: "[2.3.0.M1,3.0.0-M1)" + compatibilityRange: "[2.6.0,3.0.0-M1)" description: Service discovery with Cloud Foundry. groupId: org.springframework.cloud artifactId: spring-cloud-cloudfoundry-discovery @@ -1324,7 +1269,7 @@ initializr: href: https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#spring-cloud-consul-discovery - name: Spring Cloud Routing bom: spring-cloud - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Gateway id: cloud-gateway @@ -1361,7 +1306,7 @@ initializr: href: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer - name: Spring Cloud Circuit Breaker bom: spring-cloud - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Resilience4J id: cloud-resilience4j @@ -1373,7 +1318,7 @@ initializr: href: https://docs.spring.io/spring-cloud-circuitbreaker/docs/current/reference/html/#configuring-resilience4j-circuit-breakers - name: Spring Cloud Messaging bom: spring-cloud - compatibilityRange: "[2.0.0.RELEASE,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Cloud Bus id: cloud-bus @@ -1393,7 +1338,7 @@ initializr: href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-introducing - name: VMware Tanzu Application Service bom: spring-cloud-services - compatibilityRange: "[2.0.0.RELEASE,3.0.0-M1)" + compatibilityRange: "[2.6.0,3.0.0-M1)" content: - name: Config Client (TAS) id: scs-config-client @@ -1403,9 +1348,6 @@ initializr: links: - rel: reference href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - mappings: - - compatibilityRange: "[2.0.0.RELEASE,2.4.0-M1)" - starter: false - name: Service Registry (TAS) id: scs-service-registry description: Eureka service discovery client on VMware Tanzu Application Service. @@ -1416,7 +1358,7 @@ initializr: href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - name: Microsoft Azure bom: spring-cloud-azure - compatibilityRange: "[2.5.0-M1,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Azure Support id: azure-support @@ -1449,7 +1391,7 @@ initializr: description: Azure Active Directory Sample - name: Azure Cosmos DB id: azure-cosmos-db - compatibilityRange: "[2.5.0-M1,3.0.0-M1)" + compatibilityRange: "[2.6.0,3.0.0-M1)" groupId: com.azure.spring artifactId: spring-cloud-azure-starter-data-cosmos description: Fully managed NoSQL database service for modern app development, including Spring Data support. @@ -1495,7 +1437,7 @@ initializr: description: Azure Storage Sample - name: Google Cloud Platform bom: spring-cloud-gcp - compatibilityRange: "[2.4.0-M1,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: GCP Support id: cloud-gcp From 07d9ac316d4ff9e816c976dfe7fd1c4f9b742f58 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 10 Jul 2023 16:30:26 +0200 Subject: [PATCH 033/825] Polish --- start-site/src/main/resources/application.yml | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 68b8f0e7ab..235c7ab715 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -109,7 +109,7 @@ initializr: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies versionProperty: spring-cloud-services.version - additionalBoms: [spring-cloud] + additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 3.4.0 @@ -327,13 +327,13 @@ initializr: id: web-services description: Facilitates contract-first SOAP development. Allows for the creation of flexible web services using one of the many ways to manipulate XML payloads. aliases: - - ws + - ws links: - - rel: guide - href: https://spring.io/guides/gs/producing-web-service/ - description: Producing a SOAP web service - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.webservices + - rel: guide + href: https://spring.io/guides/gs/producing-web-service/ + description: Producing a SOAP web service + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.webservices - name: Jersey id: jersey description: Framework for developing RESTful Web Services in Java that provides support for JAX-RS APIs. @@ -1542,16 +1542,16 @@ initializr: id: groovy default: false bootVersions: - - name : 3.0.3 (SNAPSHOT) + - name: 3.0.3 (SNAPSHOT) id: 3.0.3-SNAPSHOT default: false - - name : 3.0.2 + - name: 3.0.2 id: 3.0.2 default: true - - name : 2.7.9 (SNAPSHOT) + - name: 2.7.9 (SNAPSHOT) id: 2.7.9-SNAPSHOT default: false - - name : 2.7.8 + - name: 2.7.8 id: 2.7.8 default: false From d8fcd9032ad291459d2981f7072964ccde3e54be Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 10 Jul 2023 16:33:54 +0200 Subject: [PATCH 034/825] Remove outdated repository entries --- start-site/src/main/resources/application.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 235c7ab715..f499a0de10 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -168,15 +168,6 @@ initializr: dependency-management-plugin-version: 1.0.14.RELEASE platform: compatibility-range: "2.6.0" - repositories: - spring-releases: - name: Spring Releases - url: https://repo.spring.io/release - sonatype-snapshots: - name: Sonatype Snapshots - url: https://oss.sonatype.org/content/repositories/snapshots/ - releasesEnabled: false - snapshotsEnabled: true dependencies: - name: Developer Tools content: From ded3a0a4b0a83280118660e6379084f50d6cb6d6 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 10 Jul 2023 15:06:41 +0000 Subject: [PATCH 035/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index f2353a8c3a..73e9ac9ff7 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:610ad27fe55cccea04ba67b9488e499175ea486cc70064de7aa8c3ad571a59c9 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9ce5eaf7d93a4797a9fb56ccbf3d563bdc1c4f1098a86b4d5917f3fe9dcba841 lifecycle: preStop: exec: From a5a09865e4519627f639dfc513be52338b2926d1 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Tue, 11 Jul 2023 14:36:15 +0200 Subject: [PATCH 036/825] Remove unused dependency Remove Fibers dep. See #1206 --- start-client/package.json | 1 - start-client/yarn.lock | 2141 ++++++++++++++++++------------------- 2 files changed, 1020 insertions(+), 1122 deletions(-) diff --git a/start-client/package.json b/start-client/package.json index 699a3009c7..61f0529c97 100644 --- a/start-client/package.json +++ b/start-client/package.json @@ -56,7 +56,6 @@ "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "^7.23.2", "eslint-plugin-react-hooks": "^4.6.0", - "fibers": "^5.0.0", "file-loader": "^6.2.0", "html-webpack-plugin": "^5.3.1", "import-sort-cli": "^6.0.0", diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 8480c0ed74..f3af9fd5b8 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -20,9 +25,9 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.21.5.tgz#a685a5b50b785f2edfbf6e042c1265c653547d9d" - integrity sha512-TOKytQ9uQW9c4np8F+P7ZfPINy5Kv+pizDIUwSVH8X5zHgYHV4AA8HE5LA450xXeu4jEfmUckTYvv1I4S26M/g== + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.22.6.tgz#63f5be2a0abd587ccfbdc93424fa85f43142cc53" + integrity sha512-Be3/RfEDmkMRGT1+ru5nTkfcvWz5jDOYg1V9rXqTz2u9Qt96O1ryboGvxVBp7wOnYWDB8DNHIWb6DThrpudfOw== dependencies: "@jridgewell/trace-mapping" "^0.3.17" commander "^4.0.1" @@ -35,285 +40,284 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" - integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== +"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" + integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" - integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785" + integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.0" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helpers" "^7.22.0" - "@babel/parser" "^7.22.0" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" - semver "^6.3.0" "@babel/eslint-parser@^7.18.2": - version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz#59fb6fc4f3b017ab86987c076226ceef7b2b2ef2" - integrity sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ== + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.7.tgz#d2807fbd1fa4376162716da63dfd3c69a2249fed" + integrity sha512-LH6HJqjOyu/Qtp7LuSycZXK/CYXQ4ohdkliEaL1QTdtOXVdOVpTBKVxAo/+eeyt+x/2SRzB+zUPduVl+xiEvdg== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + "@nicolo-ribaudo/semver-v6" "^6.3.3" eslint-visitor-keys "^2.1.0" - semver "^6.3.0" -"@babel/generator@^7.22.0", "@babel/generator@^7.22.3", "@babel/generator@^7.7.2": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" - integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== +"@babel/generator@^7.22.7", "@babel/generator@^7.7.2": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5" + integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== dependencies: - "@babel/types" "^7.22.3" + "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz#c9b83d1ba74e163e023f008a3d3204588a7ceb60" - integrity sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== dependencies: - "@babel/types" "^7.22.3" + "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" - integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== +"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" + integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== dependencies: - "@babel/compat-data" "^7.22.0" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" + "@babel/compat-data" "^7.22.6" + "@babel/helper-validator-option" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + browserslist "^4.21.9" lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b" - integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.22.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - semver "^6.3.0" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70" - integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz#58564873c889a6fea05a538e23f9f6d201f10950" + integrity sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz#87afd63012688ad792de430ceb3b6dc28e4e7a40" + integrity sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" regexpu-core "^5.3.1" - semver "^6.3.0" -"@babel/helper-define-polyfill-provider@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" - integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== +"@babel/helper-define-polyfill-provider@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz#af1429c4a83ac316a6a8c2cc8ff45cb5d2998d3a" + integrity sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A== dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" - integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f" - integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== - dependencies: - "@babel/types" "^7.22.3" - -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" - integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-simple-access" "^7.21.5" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" - integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95" - integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - -"@babel/helper-simple-access@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" - integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== - dependencies: - "@babel/types" "^7.21.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" - integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-wrap-function@^7.18.6", "@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" - integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== - dependencies: - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.3" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz#14a38141a7bf2165ad38da61d61cf27b43015da2" + integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-replace-supers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc" + integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz#44d205af19ed8d872b4eefb0d2fa65f45eb34f06" + integrity sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4", "@babel/parser@^7.7.0": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" - integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7", "@babel/parser@^7.7.0": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659" - integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-transform-optional-chaining" "^7.22.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" "@babel/plugin-proposal-class-properties@^7.13.0": version "7.18.6" @@ -324,31 +328,31 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.13.15": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.3.tgz#3502c0f8cfe0cdb79b62102c9c9b111309d942b7" - integrity sha512-XjTKH3sHr6pPqG+hR1NCdVupwiosfdKM2oSMyKQVQ5Bym9l/p7BuLAqT5U32zZzRCfPq/TPRPzMiiTE9bOXU4w== + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz#9b5b73c2e404f0869ef8a8a53765f8203c5467a7" + integrity sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-replace-supers" "^7.22.1" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/plugin-syntax-decorators" "^7.22.3" + "@babel/helper-create-class-features-plugin" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/plugin-syntax-decorators" "^7.22.5" "@babel/plugin-proposal-do-expressions@^7.12.13": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.18.6.tgz#b1a05a2876df2ca38556115a7ecde3b4c45463a9" - integrity sha512-ddToGCONJhCuL+l4FhtGnKl5ZYCj9fDVFiqiCdQDpeIbVn/NvMeSib+7T1/rk08jRafae4qNiP8OnJyuqlsuYA== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.22.5.tgz#7a48d7b33d19ab3e676c67659f55319f655a3f55" + integrity sha512-Qh6Sbkt6xCRbHykDc709db/EQB4RJlmaW3ENuvzzi7G6GKeDNQHx81P0OdI9oEXhhHEJvLRzIr08m8HNCJWS8g== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-do-expressions" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-do-expressions" "^7.22.5" "@babel/plugin-proposal-export-default-from@^7.12.13": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz#091f4794dbce4027c03cf4ebc64d3fb96b75c206" - integrity sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.5.tgz#825924eda1fad382c3de4db6fe1711b6fa03362f" + integrity sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-default-from" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-default-from" "^7.22.5" "@babel/plugin-proposal-export-namespace-from@^7.12.13": version "7.18.9" @@ -359,21 +363,21 @@ "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-function-bind@^7.12.13": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.18.9.tgz#635d6592c24500c6f7ac64cae10383ade68a8a8a" - integrity sha512-9RfxqKkRBCCT0xoBl9AqieCMscJmSAL9HYixGMWH549jUpT9csWWK/HEYZEx9t9iW/PRSXgX95x9bDlgtAJGFA== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.22.5.tgz#4d3bcee613b123b20bf3106b2a3ad047afe26a1a" + integrity sha512-ckAugfDtdcrXKP49z7K7JI7QkA8SRidmsKxLizH8mg0UWOvcmvEd9/VDLzFcWlZqchvLDPUYpwuXNGAYjsscrw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-function-bind" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-function-bind" "^7.22.5" "@babel/plugin-proposal-function-sent@^7.12.13": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.18.6.tgz#60854442f9024869e731116b4f7f98ee8cb072de" - integrity sha512-UdaOKPOLPt0O+Xu26tnw6oAZMLXhk+yMrXOzn6kAzTHBnWHJsoN1hlrgxFAQ+FRLS0ql1oYIQ2phvoFzmN3GMw== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.22.5.tgz#51a9354c83a629becd50f00b4eb0f1c686c8b4b6" + integrity sha512-YFEE5KDhaNCCD0I1j9vqPp5bpPuoDAPD+4Adk0QXdrL9TbmZluCuznuYvmlYqr14zfXCBGAZivfiLb6WI4GhSw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-wrap-function" "^7.18.6" - "@babel/plugin-syntax-function-sent" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.5" + "@babel/plugin-syntax-function-sent" "^7.22.5" "@babel/plugin-proposal-json-strings@^7.13.8": version "7.18.6" @@ -417,12 +421,12 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-pipeline-operator@^7.12.13": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.18.9.tgz#66a60666efd9c29c7ec4d3e2ccb38f9d97994237" - integrity sha512-Pc33e6m8f4MJhRXVCUwiKZNtEm+W2CUPHIL0lyJNtkp+w6d75CLw3gsBKQ81VAMUgT9jVPIEU8gwJ5nJgmJ1Ag== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.22.5.tgz#b8de7272264bec2c8cf9b22e7889bb33af54c4a4" + integrity sha512-nSgHJB3uP+DORxBVhQgjub0qtU/LGj/mBDz2kQEGy1EUDy3f92VWDeB3J3/41ZjVLWmkNWOd6yjdNb4a5wDfZQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-pipeline-operator" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-pipeline-operator" "^7.22.5" "@babel/plugin-proposal-private-methods@^7.13.0": version "7.18.6" @@ -432,23 +436,18 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-proposal-throw-expressions@^7.12.13": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.18.6.tgz#f05eb10f417d34857e4ebf3a2a152e77bd59ff9f" - integrity sha512-WHOrJyhGoGrdtW480L79cF7Iq/gZDZ/z6OqK7mVyFR5I37dTpog/wNgb6hmaM3HYZtULEJl++7VaMWkNZsOcHg== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.22.5.tgz#2c0613f208214051bed7bff6302216aa9697e1c0" + integrity sha512-34kY5YjNKDhjXbj2oNDkxl0xNl2+yQTEsWu8Ia6kCTb6wz76bBCd4DzmeZokfr6g68yneu3eg8qAyYgKbyesFg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-throw-expressions" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-throw-expressions" "^7.22.5" "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" @@ -486,19 +485,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.3.tgz#760f2d812d56c1d05970d01cdcd3c05e3d87d6ca" - integrity sha512-R16Zuge73+8/nLcDjkIpyhi5wIbN7i7fiuLJR8yQX7vPAa/ltUKtd3iLbb4AgP5nrLi91HnNUNosELIGUGH1bg== +"@babel/plugin-syntax-decorators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz#329fe2907c73de184033775637dbbc507f09116a" + integrity sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-do-expressions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.18.6.tgz#8581baedc0f128cdf0292e3003a7f44e47b87368" - integrity sha512-kTogvOsjBTVOSZtkkziiXB5hwGXqwhq2gBXDaiWVruRLDT7C2GqfbsMnicHJ7ePq2GE8UJeWS34YbNP6yDhwUA== +"@babel/plugin-syntax-do-expressions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.22.5.tgz#49e3af8e2d1254a47d545d4b52d2ef0dc5bcbd51" + integrity sha512-60pOTgQGY00/Kiozrtu286Aqg50IxDy/jIHhlMzXjYTs1Q8lbeOgqC9NLidtqfBNwdX6bZCT6FJ2i5xzt+JKzw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -507,12 +506,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz#8df076711a4818c4ce4f23e61d622b0ba2ff84bc" - integrity sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew== +"@babel/plugin-syntax-export-default-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz#ac3a24b362a04415a017ab96b9b4483d0e2a6e44" + integrity sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -521,33 +520,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-function-bind@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.18.6.tgz#3214e8bfc71ec1de636ddbc01838c2829e560b19" - integrity sha512-wZN0Aq/AScknI9mKGcR3TpHdASMufFGaeJgc1rhPmLtZ/PniwjePSh8cfh8tXMB3U4kh/3cRKrLjDtedejg8jQ== +"@babel/plugin-syntax-function-bind@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.22.5.tgz#4a01aa675dac0431b47eb440900ed0d4efd54d50" + integrity sha512-Sjy7XIhHF9L++0Mk/3Y4H4439cjI//wc/jE8Ly3+qGPkTUYYEhe4rzMv/JnyZpekfOBL22X6DAq42I7GM/3KzA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-function-sent@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.18.6.tgz#ce2e8e9979f8a26246bba81534e605c6d1369e5e" - integrity sha512-f3OJHIlFIkg+cP1Hfo2SInLhsg0pz2Ikmgo7jMdIIKC+3jVXQlHB0bgSapOWxeWI0SU28qIWmfn5ZKu1yPJHkg== +"@babel/plugin-syntax-function-sent@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.22.5.tgz#9bb1d4d8e835c30e0eb1c45bd3883658ccc0ff94" + integrity sha512-tKOWGUAVv+JGJ1tcOIFdCqxUX97lgAUnmLpWt/9JtEkgk9WQ5OolN+y9rWj6mtLM+d0kAzTGLu/kRQqr5/PEsA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-attributes@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz#d7168f22b9b49a6cc1792cec78e06a18ad2e7b4b" - integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -563,12 +562,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -612,12 +611,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-pipeline-operator@^7.18.6": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.21.4.tgz#d468ec120d3503c447383bd065f6864bd439d86b" - integrity sha512-F8QyQgVj3lNxFUokPRLpdzJul0iQUYpnZZhlPEIY5Hr3hg1xU/Juz4m88NiX6dG8Zdex+q9yXUMHWnwDif6yaw== +"@babel/plugin-syntax-pipeline-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.22.5.tgz#181fd9276aa72e75a408e07b929b457b732c16db" + integrity sha512-7yuGXd+h8gpR14FnPDTTCd5TfC/1B9njNZJT29GJ7UFF/WVbzkZy7728DynrENqgImqj5xyPTQAo8si9n3QVJQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" @@ -626,12 +625,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-throw-expressions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.18.6.tgz#50889d493f7ef9631d79bae6b30f58fa8c06449f" - integrity sha512-rp1CqEZXGv1z1YZ3qYffBH3rhnOxrTwQG8fh2yqulTurwv9zu3Gthfd+niZBLSOi1rY6146TgF+JmVeDXaX4TQ== +"@babel/plugin-syntax-throw-expressions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.22.5.tgz#9ab803c17e25bbfedf8375acbbb0aa9f51c55496" + integrity sha512-oCyfA7rDVcQIydA7ZOmnHCQTzz5JvG9arY++Z+ASL/q5q+mJLblaRNHoK6ggV54X2c14wCK/lQi7z1DujmEmZA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" @@ -641,11 +640,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" - integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -655,458 +654,458 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" - integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz#3ed99924c354fb9e80dabb2cc8d002c702e94527" - integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== +"@babel/plugin-transform-async-generator-functions@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz#053e76c0a903b72b573cb1ab7d6882174d460a1b" + integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== +"@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-properties@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz#3407145e513830df77f0cef828b8b231c166fe4c" - integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-static-block@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz#e352cf33567385c731a8f21192efeba760358773" - integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" - integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== +"@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dynamic-import@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz#6c56afaf896a07026330cf39714532abed8d9ed1" - integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-export-namespace-from@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz#9b8700aa495007d3bebac8358d1c562434b680b9" - integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" - integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== +"@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-json-strings@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz#a181b8679cf7c93e9d0e3baa5b1776d65be601a9" - integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-logical-assignment-operators@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz#9e021455810f33b0baccb82fb759b194f5dc36f0" - integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" - integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== dependencies: - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-simple-access" "^7.21.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e" - integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4" - integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2" - integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz#8c519f8bf5af94a9ca6f65cf422a9d3396e542b9" - integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz#02493070ca6685884b0eee705363ee4da2132ab0" - integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz#da6fba693effb8c203d8c3bdf7bf4e2567e802e9" - integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.3" + "@babel/plugin-transform-parameters" "^7.22.5" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" -"@babel/plugin-transform-optional-catch-binding@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz#e971a083fc7d209d9cd18253853af1db6d8dc42f" - integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290" - integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== +"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz#4bacfe37001fe1901117672875e931d439811564" + integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d" - integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== +"@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-methods@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz#adac38020bab5047482d3297107c1f58e9c574f6" - integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-property-in-object@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz#031621b02c7b7d95389de1a3dba2fe9e8c548e56" - integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== +"@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.18.6", "@babel/plugin-transform-react-jsx@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz#5a1f380df3703ba92eb1a930a539c6d88836f690" - integrity sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ== +"@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/types" "^7.22.3" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.5" -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" - integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" regenerator-transform "^0.15.1" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.18.5": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz#f8353f313f18c3ce1315688631ec48657b97af42" - integrity sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA== - dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - semver "^6.3.0" + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.7.tgz#eb9094b5fb756cc2d98d398b2c88aeefa9205de9" + integrity sha512-o02xM7iY7mSPI+TvaYDH0aYl+lg3+KT7qrD705JlsB/GrZSNaYO/4i+aDFKPiJ7ubq3hgv8NNLCdyB5MFxT8mg== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" - integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-property-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz#597b6a614dc93eaae605ee293e674d79d32eb380" - integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-sets-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz#7c14ee33fa69782b0101d0f7143d3fc73ce00700" - integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.4.tgz#c86a82630f0e8c61d9bb9327b7b896732028cbed" - integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== - dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.7.tgz#a1ef34b64a80653c22ce4d9c25603cfa76fc168a" + integrity sha512-1whfDtW+CzhETuzYXfcgZAh8/GFMeEbz0V5dVgya8YeJyCU6Y/P2Gnx4Qb3MylK68Zu9UiwUvbPMPTpFAOJ+sQ== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-import-attributes" "^7.22.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1118,61 +1117,61 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.21.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.3" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-class-properties" "^7.22.3" - "@babel/plugin-transform-class-static-block" "^7.22.3" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.21.5" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-dynamic-import" "^7.22.1" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-export-namespace-from" "^7.22.3" - "@babel/plugin-transform-for-of" "^7.21.5" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-json-strings" "^7.22.3" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-modules-systemjs" "^7.22.3" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" - "@babel/plugin-transform-new-target" "^7.22.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" - "@babel/plugin-transform-numeric-separator" "^7.22.3" - "@babel/plugin-transform-object-rest-spread" "^7.22.3" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-optional-catch-binding" "^7.22.3" - "@babel/plugin-transform-optional-chaining" "^7.22.3" - "@babel/plugin-transform-parameters" "^7.22.3" - "@babel/plugin-transform-private-methods" "^7.22.3" - "@babel/plugin-transform-private-property-in-object" "^7.22.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.21.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.21.5" - "@babel/plugin-transform-unicode-property-regex" "^7.22.3" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.22.4" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - core-js-compat "^3.30.2" - semver "^6.3.0" + "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + core-js-compat "^3.31.0" "@babel/preset-modules@^0.1.5": version "0.1.5" @@ -1186,16 +1185,16 @@ esutils "^2.0.2" "@babel/preset-react@^7.13.13": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.3.tgz#2ec7f91d0c924fa2ea0c7cfbbf690bc62b79cd84" - integrity sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.5.tgz#c4d6058fbf80bccad02dd8c313a9aaa67e3c3dd6" + integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.22.3" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" "@babel/regjsgen@^0.8.0": version "0.8.0" @@ -1203,44 +1202,44 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" - integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9", "@babel/template@^7.3.3": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" - integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/parser" "^7.21.9" - "@babel/types" "^7.21.5" - -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.20.5", "@babel/traverse@^7.22.1", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" - integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.3" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.22.4" - "@babel/types" "^7.22.4" +"@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" - integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1265,14 +1264,14 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== -"@eslint/eslintrc@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" - integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== +"@eslint/eslintrc@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d" + integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.2" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -1280,20 +1279,20 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.41.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3" - integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== +"@eslint/js@8.44.0": + version "8.44.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" + integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1850,10 +1849,10 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/source-map@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" @@ -1901,6 +1900,11 @@ dependencies: eslint-scope "5.1.1" +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2051,9 +2055,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.0.tgz#4709d34d3eba3e1dad1950d40e80c6b5e0b81fc9" - integrity sha512-TBOjqAGf0hmaqRwpii5LLkJLg7c6OMm4nHLmpsUxwk9bBHtoTC6dAHdVWdGv4TBxj2CZOZY8Xfq8WmfoVi7n4Q== + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== dependencies: "@babel/types" "^7.20.7" @@ -2103,9 +2107,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.40.0.tgz#ae73dc9ec5237f2794c4f79efd6a4c73b13daf23" - integrity sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g== + version "8.44.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.0.tgz#55818eabb376e2272f77fbf5c96c43137c3c1e53" + integrity sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2167,6 +2171,11 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + "@types/http-proxy@^1.17.8": version "1.17.11" resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" @@ -2236,9 +2245,9 @@ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node@*": - version "20.2.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" - integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== + version "20.4.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d" + integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== "@types/node@16.9.1": version "16.9.1" @@ -2303,10 +2312,11 @@ "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" - integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== dependencies: + "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" @@ -2327,15 +2337,20 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== -"@types/unist@*", "@types/unist@^2.0.0": +"@types/unist@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.0.tgz#988ae8af1e5239e89f9fbb1ade4c935f4eeedf9a" + integrity sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w== + +"@types/unist@^2.0.0": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== -"@types/ws@^8.5.1": - version "8.5.4" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" - integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== +"@types/ws@^8.5.5": + version "8.5.5" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" + integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== dependencies: "@types/node" "*" @@ -2358,26 +2373,26 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/scope-manager@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz#ff4ad4fec6433647b817c4a7d4b4165d18ea2fa8" - integrity sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/visitor-keys" "5.59.8" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/types@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.8.tgz#212e54414733618f5d0fd50b2da2717f630aebf8" - integrity sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz#801a7b1766481629481b3b0878148bd7a1f345d7" - integrity sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/visitor-keys" "5.59.8" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2385,25 +2400,25 @@ tsutils "^3.21.0" "@typescript-eslint/utils@^5.10.0": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.8.tgz#34d129f35a2134c67fdaf024941e8f96050dca2b" - integrity sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.8" - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz#aa6a7ef862add919401470c09e1609392ef3cc40" - integrity sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": @@ -2587,10 +2602,10 @@ acorn@^6.0.7: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^8.0.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -2758,11 +2773,11 @@ argparse@^2.0.1: integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== aria-query@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: - deep-equal "^2.0.5" + dequal "^2.0.3" arr-diff@^4.0.0: version "4.0.0" @@ -2797,7 +2812,7 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.5, array-includes@^3.1.6: +array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== @@ -2939,11 +2954,11 @@ axe-core@^4.6.2: integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== axobject-query@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== dependencies: - deep-equal "^2.0.5" + dequal "^2.0.3" babel-eslint@^10.0.3: version "10.1.0" @@ -3001,29 +3016,29 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" - integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz#9f9a0e1cd9d645cc246a5e094db5c3aa913ccd2b" + integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.4.0" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.1" + "@nicolo-ribaudo/semver-v6" "^6.3.3" -babel-plugin-polyfill-corejs3@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" - integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz#d406c5738d298cd9c66f64a94cf8d5904ce4cc5e" + integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" - core-js-compat "^3.30.1" + "@babel/helper-define-polyfill-provider" "^0.4.1" + core-js-compat "^3.31.0" -babel-plugin-polyfill-regenerator@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" - integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz#ace7a5eced6dff7d5060c335c52064778216afd3" + integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" + "@babel/helper-define-polyfill-provider" "^0.4.1" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -3182,13 +3197,13 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: - version "4.21.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" - integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== +browserslist@^4.14.5, browserslist@^4.21.9: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: - caniuse-lite "^1.0.30001489" - electron-to-chromium "^1.4.411" + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" node-releases "^2.0.12" update-browserslist-db "^1.0.11" @@ -3335,10 +3350,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001489: - version "1.0.30001492" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz#4a06861788a52b4c81fd3344573b68cc87fe062b" - integrity sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw== +caniuse-lite@^1.0.30001503: + version "1.0.30001515" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" + integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== caseless@~0.12.0: version "0.12.0" @@ -3413,9 +3428,9 @@ ci-info@^3.2.0: integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== class-utils@^0.3.5: version "0.3.6" @@ -3494,9 +3509,9 @@ code-point-at@^1.0.0: integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== collection-visit@^1.0.0: version "1.0.0" @@ -3678,12 +3693,12 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.30.1, core-js-compat@^3.30.2: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" - integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== +core-js-compat@^3.31.0: + version "3.31.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.1.tgz#5084ad1a46858df50ff89ace152441a63ba7aae0" + integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== dependencies: - browserslist "^4.21.5" + browserslist "^4.21.9" core-util-is@1.0.2: version "1.0.2" @@ -3706,11 +3721,11 @@ cosmiconfig@^5.0.5: parse-json "^4.0.0" cross-fetch@^3.0.4: - version "3.1.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" - integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== dependencies: - node-fetch "^2.6.11" + node-fetch "^2.6.12" cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" @@ -3845,30 +3860,6 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-equal@^2.0.5: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" - integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.0" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3941,7 +3932,7 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -dequal@^2.0.0: +dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== @@ -3951,11 +3942,6 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== - detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -4109,10 +4095,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.411: - version "1.4.416" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.416.tgz#7291f704168d3842ae4da3ae9fdc7bfbeb97d116" - integrity sha512-AUYh0XDTb2vrj0rj82jb3P9hHSyzQNdTPYWZIhPdCOui7/vpme7+HTE07BE5jwuqg/34TZ8ktlRz6GImJ4IXjA== +electron-to-chromium@^1.4.431: + version "1.4.455" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.455.tgz#81fe4353ac970eb971c07088c8da8b7f6280ddc9" + integrity sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA== emittery@^0.10.2: version "0.10.2" @@ -4158,10 +4144,10 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.14.1: - version "5.14.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" - integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4177,9 +4163,9 @@ env-paths@^2.2.0: integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + version "7.10.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" + integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== err-code@^2.0.2: version "2.0.3" @@ -4233,25 +4219,10 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: unbox-primitive "^1.0.2" which-typed-array "^1.1.9" -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" + integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== es-set-tostringtag@^2.0.1: version "2.0.1" @@ -4515,15 +4486,15 @@ eslint@^5.0.0: text-table "^0.2.0" eslint@^8.17.0: - version "8.41.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c" - integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== + version "8.44.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500" + integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.41.0" - "@humanwhocodes/config-array" "^0.11.8" + "@eslint/eslintrc" "^2.1.0" + "@eslint/js" "8.44.0" + "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" @@ -4534,7 +4505,7 @@ eslint@^8.17.0: escape-string-regexp "^4.0.0" eslint-scope "^7.2.0" eslint-visitor-keys "^3.4.1" - espree "^9.5.2" + espree "^9.6.0" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -4554,7 +4525,7 @@ eslint@^8.17.0: lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" + optionator "^0.9.3" strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" @@ -4568,12 +4539,12 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== +espree@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.0.tgz#80869754b1c6560f32e3b6929194a3fe07c5b82f" + integrity sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" @@ -4805,10 +4776,10 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -4852,13 +4823,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fibers@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/fibers/-/fibers-5.0.3.tgz#2fd03acb255db66fe693d15beafbf5ae92193fd7" - integrity sha512-/qYTSoZydQkM21qZpGLDLuCq8c+B8KhuCQ1kLPvnRNhxhVbvrpmH9l2+Lblf5neDuEsY4bfT7LeO553TXQDvJw== - dependencies: - detect-libc "^1.0.3" - figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -5088,7 +5052,7 @@ fs-minipass@^2.0.0: dependencies: minipass "^3.0.0" -fs-monkey@^1.0.3: +fs-monkey@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== @@ -5345,13 +5309,13 @@ globby@^11.1.0: slash "^3.0.0" globby@^13.1.1: - version "13.1.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" - integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== dependencies: dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" + fast-glob "^3.3.0" + ignore "^5.2.4" merge2 "^1.4.1" slash "^4.0.0" @@ -5545,9 +5509,9 @@ hpack.js@^2.1.6: wbuf "^1.1.0" html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== html-escaper@^2.0.0: version "2.0.2" @@ -5568,9 +5532,9 @@ html-minifier-terser@^6.0.2: terser "^5.10.0" html-webpack-plugin@^5.3.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz#826838e31b427f5f7f30971f8d8fa2422dfa6763" - integrity sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA== + version "5.5.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" + integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -5721,7 +5685,7 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.2.0: +ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -5896,7 +5860,7 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: +internal-slot@^1.0.3, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== @@ -5944,14 +5908,6 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -6038,7 +5994,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1, is-date-object@^1.0.5: +is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -6136,11 +6092,6 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== - is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -6215,11 +6166,6 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== - is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -6267,11 +6213,6 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== - is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -6279,14 +6220,6 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -6304,11 +6237,6 @@ isarray@1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -6939,12 +6867,14 @@ jsprim@^1.2.2: verror "1.10.0" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + version "3.3.4" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz#b896535fed5b867650acce5a9bd4135ffc7b3bf9" + integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" jszip@^3.6.0: version "3.10.1" @@ -6990,11 +6920,6 @@ kleur@^4.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -klona@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - language-subtag-registry@~0.3.2: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" @@ -7306,11 +7231,11 @@ mem@^4.0.0: p-is-promise "^2.0.0" memfs@^3.4.3: - version "3.5.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.1.tgz#f0cd1e2bfaef58f6fe09bfb9c2288f07fea099ec" - integrity sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA== + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: - fs-monkey "^1.0.3" + fs-monkey "^1.0.4" meow@^9.0.0: version "9.0.0" @@ -7827,10 +7752,10 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@^2.6.11: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== +node-fetch@^2.6.12: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== dependencies: whatwg-url "^5.0.0" @@ -7861,9 +7786,9 @@ node-int64@^0.4.0: integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== node-sass@^7.0.1: version "7.0.3" @@ -7988,14 +7913,6 @@ object-inspect@^1.12.3, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -8008,7 +7925,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.2, object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -8129,17 +8046,17 @@ optionator@^0.8.2: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" os-locale@^3.0.0: version "3.1.0" @@ -8405,9 +8322,9 @@ pify@^4.0.1: integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pixelmatch@^4.0.2: version "4.0.2" @@ -8475,9 +8392,9 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.4.21: - version "8.4.24" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" - integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== + version "8.4.25" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.25.tgz#4a133f5e379eda7f61e906c3b1aaa9b81292726f" + integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -8903,7 +8820,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: +regexp.prototype.flags@^1.4.3: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== @@ -9204,17 +9121,16 @@ sass-graph@^4.0.1: yargs "^17.2.1" sass-loader@^13.0.0: - version "13.3.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.1.tgz#32ee5791434b9b4dbd1adcce76fcb4cea49cc12c" - integrity sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg== + version "13.3.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.2.tgz#460022de27aec772480f03de17f5ba88fa7e18c6" + integrity sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg== dependencies: - klona "^2.0.6" neo-async "^2.6.2" sass@^1.52.3: - version "1.62.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.62.1.tgz#caa8d6bf098935bc92fc73fa169fb3790cacd029" - integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== + version "1.63.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.6.tgz#481610e612902e0c31c46b46cf2dad66943283ea" + integrity sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9241,19 +9157,19 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" - integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" schema-utils@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.1.tgz#eb2d042df8b01f4b5c276a2dfd41ba0faab72e8d" - integrity sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" @@ -9281,19 +9197,19 @@ selfsigned@^2.1.1: node-forge "^1" "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.0.0, semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -9726,13 +9642,6 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -10031,12 +9940,12 @@ terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: - version "5.17.6" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.6.tgz#d810e75e1bb3350c799cd90ebefe19c9412c12de" - integrity sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ== + version "5.19.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.0.tgz#7b3137b01226bdd179978207b9c8148754a6da9c" + integrity sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -10204,9 +10113,9 @@ tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.5.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" - integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== tsutils@^3.21.0: version "3.21.0" @@ -10597,9 +10506,9 @@ webidl-conversions@^4.0.2: integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webpack-bundle-analyzer@^4.4.1: - version "4.8.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz#951b8aaf491f665d2ae325d8b84da229157b1d04" - integrity sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg== + version "4.9.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz#fc093c4ab174fd3dcbd1c30b763f56d10141209d" + integrity sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw== dependencies: "@discoveryjs/json-ext" "0.5.7" acorn "^8.0.4" @@ -10651,9 +10560,9 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.9.2: - version "4.15.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz#87ba9006eca53c551607ea0d663f4ae88be7af21" - integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ== + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -10661,7 +10570,7 @@ webpack-dev-server@^4.9.2: "@types/serve-index" "^1.9.1" "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" + "@types/ws" "^8.5.5" ansi-html-community "^0.0.8" bonjour-service "^1.0.11" chokidar "^3.5.3" @@ -10717,9 +10626,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.85.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.85.0.tgz#c14a6a3a91f84d67c450225661fda8da36bc7f49" - integrity sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg== + version "5.88.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.1.tgz#21eba01e81bd5edff1968aea726e2fbfd557d3f8" + integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -10730,7 +10639,7 @@ webpack@^5.73.0: acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.14.1" + enhanced-resolve "^5.15.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -10740,7 +10649,7 @@ webpack@^5.73.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.2" + schema-utils "^3.2.0" tapable "^2.1.1" terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" @@ -10788,25 +10697,15 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" - which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + version "1.1.10" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" + integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" @@ -10841,7 +10740,7 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -word-wrap@^1.2.3, word-wrap@~1.2.3: +word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== From 0ef65d74cc2eb4ad5640880fbf477da591747ce4 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 11 Jul 2023 12:46:33 +0000 Subject: [PATCH 037/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 73e9ac9ff7..b7edd72487 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9ce5eaf7d93a4797a9fb56ccbf3d563bdc1c4f1098a86b4d5917f3fe9dcba841 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:edbca5643efb6e8e4ea5d55995d786fbeeb7c568dcab82e4efa0e58c7409edc1 lifecycle: preStop: exec: From 378c8f791b1427af1f163acf14cafbe103f77930 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 11 Jul 2023 15:38:50 +0200 Subject: [PATCH 038/825] Adapt to API change in Initializr --- .../spring/start/site/StartApplication.java | 10 +-- .../GradleProjectGenerationConfiguration.java | 4 +- ...ndencyManagementPluginVersionResolver.java | 12 +-- .../kotlin/KotlinCoroutinesCustomizer.java | 8 +- .../KotlinProjectGenerationConfiguration.java | 7 +- ...agedDependenciesKotlinVersionResolver.java | 12 +-- ...GraalVmProjectGenerationConfiguration.java | 10 +-- ...ngCloudProjectGenerationConfiguration.java | 7 +- .../SpringCloudProjectVersionResolver.java | 14 ++-- ...leDependencyManagementVersionResolver.java | 45 ---------- .../CacheableMavenVersionResolver.java | 61 ++++++++++++++ ...yManagementPluginVersionResolverTests.java | 12 ++- ...ependenciesKotlinVersionResolverTests.java | 6 +- ...pringCloudProjectVersionResolverTests.java | 10 ++- .../CacheableMavenVersionResolverTests.java | 82 +++++++++++++++++++ 15 files changed, 198 insertions(+), 102 deletions(-) delete mode 100644 start-site/src/main/java/io/spring/start/site/support/CacheableDependencyManagementVersionResolver.java create mode 100644 start-site/src/main/java/io/spring/start/site/support/CacheableMavenVersionResolver.java create mode 100644 start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java diff --git a/start-site/src/main/java/io/spring/start/site/StartApplication.java b/start-site/src/main/java/io/spring/start/site/StartApplication.java index d851f51eb8..04380a3719 100644 --- a/start-site/src/main/java/io/spring/start/site/StartApplication.java +++ b/start-site/src/main/java/io/spring/start/site/StartApplication.java @@ -20,10 +20,10 @@ import java.nio.file.Files; import com.fasterxml.jackson.databind.ObjectMapper; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import io.spring.start.site.container.SimpleDockerServiceResolver; import io.spring.start.site.project.ProjectDescriptionCustomizerConfiguration; -import io.spring.start.site.support.CacheableDependencyManagementVersionResolver; +import io.spring.start.site.support.CacheableMavenVersionResolver; import io.spring.start.site.support.StartInitializrMetadataUpdateStrategy; import io.spring.start.site.web.HomeController; @@ -64,9 +64,9 @@ public StartInitializrMetadataUpdateStrategy initializrMetadataUpdateStrategy( } @Bean - public DependencyManagementVersionResolver dependencyManagementVersionResolver() throws IOException { - return new CacheableDependencyManagementVersionResolver(DependencyManagementVersionResolver - .withCacheLocation(Files.createTempDirectory("version-resolver-cache-"))); + public CacheableMavenVersionResolver mavenVersionResolver() throws IOException { + return new CacheableMavenVersionResolver( + MavenVersionResolver.withCacheLocation(Files.createTempDirectory("version-resolver-cache-"))); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleProjectGenerationConfiguration.java index 55567b2495..631bc0a608 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleProjectGenerationConfiguration.java @@ -23,7 +23,7 @@ import io.spring.initializr.generator.spring.build.gradle.DependencyManagementPluginVersionResolver; import io.spring.initializr.generator.spring.build.gradle.InitializrDependencyManagementPluginVersionResolver; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.springframework.context.annotation.Bean; @@ -44,7 +44,7 @@ GradleBuildSystemHelpDocumentCustomizer gradleBuildSystemHelpDocumentCustomizer( @Bean DependencyManagementPluginVersionResolver dependencyManagementPluginVersionResolver( - DependencyManagementVersionResolver versionResolver, InitializrMetadata metadata) { + MavenVersionResolver versionResolver, InitializrMetadata metadata) { return new ManagedDependenciesDependencyManagementPluginVersionResolver(versionResolver, (description) -> new InitializrDependencyManagementPluginVersionResolver(metadata) .resolveDependencyManagementPluginVersion(description)); diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolver.java index 1d5236289c..81d1e9a82d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolver.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolver.java @@ -20,7 +20,7 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.gradle.DependencyManagementPluginVersionResolver; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; /** * {@link DependencyManagementPluginVersionResolver} that determines the dependency @@ -32,20 +32,20 @@ public class ManagedDependenciesDependencyManagementPluginVersionResolver implements DependencyManagementPluginVersionResolver { - private final DependencyManagementVersionResolver resolver; + private final MavenVersionResolver versionResolver; private final Function fallback; - public ManagedDependenciesDependencyManagementPluginVersionResolver(DependencyManagementVersionResolver resolver, + public ManagedDependenciesDependencyManagementPluginVersionResolver(MavenVersionResolver versionResolver, Function fallback) { - this.resolver = resolver; + this.versionResolver = versionResolver; this.fallback = fallback; } @Override public String resolveDependencyManagementPluginVersion(ProjectDescription description) { - String pluginVersion = this.resolver - .resolve("org.springframework.boot", "spring-boot-dependencies", + String pluginVersion = this.versionResolver + .resolveDependencies("org.springframework.boot", "spring-boot-dependencies", description.getPlatformVersion().toString()) .get("io.spring.gradle:dependency-management-plugin"); return (pluginVersion != null) ? pluginVersion : this.fallback.apply(description); diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java index 22c1c2229e..88fcf4bb19 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java @@ -24,7 +24,7 @@ import io.spring.initializr.generator.spring.build.BuildMetadataResolver; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; /** * A project customizer for Kotlin Coroutines. @@ -37,10 +37,10 @@ public class KotlinCoroutinesCustomizer { private final ProjectDescription description; - private final DependencyManagementVersionResolver versionResolver; + private final MavenVersionResolver versionResolver; public KotlinCoroutinesCustomizer(InitializrMetadata metadata, ProjectDescription description, - DependencyManagementVersionResolver versionResolver) { + MavenVersionResolver versionResolver) { this.buildResolver = new BuildMetadataResolver(metadata); this.description = description; this.versionResolver = versionResolver; @@ -56,7 +56,7 @@ public void customize(Build build) { public void customize(HelpDocument document, Build build) { if (hasReactiveFacet(build)) { - Map resolve = this.versionResolver.resolve("org.springframework.boot", + Map resolve = this.versionResolver.resolveDependencies("org.springframework.boot", "spring-boot-dependencies", this.description.getPlatformVersion().toString()); String frameworkVersion = resolve.get("org.springframework:spring-core"); String versionToUse = (frameworkVersion != null) ? frameworkVersion : "current"; diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java index dfd1eec674..67a42b9024 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java @@ -26,7 +26,7 @@ import io.spring.initializr.generator.spring.code.kotlin.KotlinVersionResolver; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -43,8 +43,7 @@ class KotlinProjectGenerationConfiguration { @Bean - KotlinVersionResolver kotlinVersionResolver(DependencyManagementVersionResolver versionResolver, - InitializrMetadata metadata) { + KotlinVersionResolver kotlinVersionResolver(MavenVersionResolver versionResolver, InitializrMetadata metadata) { return new ManagedDependenciesKotlinVersionResolver(versionResolver, (description) -> new InitializrMetadataKotlinVersionResolver(metadata) .resolveKotlinVersion(description)); @@ -61,7 +60,7 @@ static class KotlinCoroutinesCustomizerConfiguration { private final KotlinCoroutinesCustomizer customizer; KotlinCoroutinesCustomizerConfiguration(InitializrMetadata metadata, ProjectDescription description, - DependencyManagementVersionResolver versionResolver) { + MavenVersionResolver versionResolver) { this.customizer = new KotlinCoroutinesCustomizer(metadata, description, versionResolver); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolver.java index 7357a7d8a5..61574a1ac6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolver.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolver.java @@ -20,7 +20,7 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.code.kotlin.KotlinVersionResolver; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; /** * {@link KotlinVersionResolver} that determines the Kotlin version using the dependency @@ -31,20 +31,20 @@ */ public class ManagedDependenciesKotlinVersionResolver implements KotlinVersionResolver { - private final DependencyManagementVersionResolver resolver; + private final MavenVersionResolver versionResolver; private final Function fallback; - public ManagedDependenciesKotlinVersionResolver(DependencyManagementVersionResolver resolver, + public ManagedDependenciesKotlinVersionResolver(MavenVersionResolver versionResolver, Function fallback) { - this.resolver = resolver; + this.versionResolver = versionResolver; this.fallback = fallback; } @Override public String resolveKotlinVersion(ProjectDescription description) { - String kotlinVersion = this.resolver - .resolve("org.springframework.boot", "spring-boot-dependencies", + String kotlinVersion = this.versionResolver + .resolveDependencies("org.springframework.boot", "spring-boot-dependencies", description.getPlatformVersion().toString()) .get("org.jetbrains.kotlin:kotlin-reflect"); return (kotlinVersion != null) ? kotlinVersion : this.fallback.apply(description); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java index 80419d3993..cca9f85a9a 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,7 @@ import io.spring.initializr.generator.version.Version; import io.spring.initializr.generator.version.VersionReference; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -98,12 +98,12 @@ HibernatePluginMavenBuildCustomizer hibernatePluginMavenBuildCustomizer() { @Bean @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) HibernatePluginGroovyDslGradleBuildCustomizer hibernatePluginGroovyDslGradleBuildCustomizer( - DependencyManagementVersionResolver versionResolver) { + MavenVersionResolver versionResolver) { return new HibernatePluginGroovyDslGradleBuildCustomizer(determineHibernateVersion(versionResolver)); } - private VersionReference determineHibernateVersion(DependencyManagementVersionResolver versionResolver) { - Map resolve = versionResolver.resolve("org.springframework.boot", + private VersionReference determineHibernateVersion(MavenVersionResolver versionResolver) { + Map resolve = versionResolver.resolveDependencies("org.springframework.boot", "spring-boot-dependencies", this.platformVersion.toString()); String hibernateVersion = resolve.get("org.hibernate.orm" + ":hibernate-core"); if (hibernateVersion == null) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java index 5161e6dd30..cc4afd36eb 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,7 @@ import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.project.contributor.ProjectContributor; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -65,8 +65,7 @@ public SpringCloudStreamBuildCustomizer springCloudStreamBuildCustomizer() { } @Bean - SpringCloudProjectVersionResolver springCloudProjectVersionResolver( - DependencyManagementVersionResolver versionResolver) { + SpringCloudProjectVersionResolver springCloudProjectVersionResolver(MavenVersionResolver versionResolver) { return new SpringCloudProjectVersionResolver(this.metadata, versionResolver); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolver.java index b0e49ac9c7..a94fcaa2df 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolver.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolver.java @@ -19,13 +19,12 @@ import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.BillOfMaterials; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** - * Resolve Spring Cloud artifact versions using a - * {@link DependencyManagementVersionResolver}. + * Resolve Spring Cloud artifact versions using a {@link MavenVersionResolver}. * * @author Olga Maciaszek-Sharma * @author Stephane Nicoll @@ -36,11 +35,11 @@ class SpringCloudProjectVersionResolver { private final InitializrMetadata metadata; - private final DependencyManagementVersionResolver resolver; + private final MavenVersionResolver versionResolver; - SpringCloudProjectVersionResolver(InitializrMetadata metadata, DependencyManagementVersionResolver resolver) { + SpringCloudProjectVersionResolver(InitializrMetadata metadata, MavenVersionResolver versionResolver) { this.metadata = metadata; - this.resolver = resolver; + this.versionResolver = versionResolver; } /** @@ -60,7 +59,8 @@ String resolveVersion(Version platformVersion, String dependencyId) { String releaseTrainVersion = bom.resolve(platformVersion).getVersion(); logger.info("Retrieving version for artifact: " + dependencyId + " and release train version: " + releaseTrainVersion); - return this.resolver.resolve("org.springframework.cloud", "spring-cloud-dependencies", releaseTrainVersion) + return this.versionResolver + .resolveDependencies("org.springframework.cloud", "spring-cloud-dependencies", releaseTrainVersion) .get(dependencyId); } diff --git a/start-site/src/main/java/io/spring/start/site/support/CacheableDependencyManagementVersionResolver.java b/start-site/src/main/java/io/spring/start/site/support/CacheableDependencyManagementVersionResolver.java deleted file mode 100644 index 8bee84d71d..0000000000 --- a/start-site/src/main/java/io/spring/start/site/support/CacheableDependencyManagementVersionResolver.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2012-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.support; - -import java.util.Map; - -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; - -import org.springframework.cache.annotation.Cacheable; - -/** - * A {@link DependencyManagementVersionResolver} that uses the metadata cache to store - * dependency management resolution. - * - * @author Stephane Nicoll - */ -public class CacheableDependencyManagementVersionResolver implements DependencyManagementVersionResolver { - - private final DependencyManagementVersionResolver delegate; - - public CacheableDependencyManagementVersionResolver(DependencyManagementVersionResolver delegate) { - this.delegate = delegate; - } - - @Override - @Cacheable("initializr.metadata") - public Map resolve(String groupId, String artifactId, String version) { - return this.delegate.resolve(groupId, artifactId, version); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/support/CacheableMavenVersionResolver.java b/start-site/src/main/java/io/spring/start/site/support/CacheableMavenVersionResolver.java new file mode 100644 index 0000000000..844e9026ec --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/support/CacheableMavenVersionResolver.java @@ -0,0 +1,61 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.support; + +import java.lang.reflect.Method; +import java.util.Map; + +import io.spring.initializr.versionresolver.MavenVersionResolver; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.interceptor.KeyGenerator; + +/** + * A {@link MavenVersionResolver} that uses the metadata cache to store dependency and + * plugin management resolution. + * + * @author Stephane Nicoll + */ +@CacheConfig(cacheNames = "initializr.metadata", keyGenerator = "mavenVersionResolver") +public class CacheableMavenVersionResolver implements MavenVersionResolver, KeyGenerator { + + private final MavenVersionResolver delegate; + + public CacheableMavenVersionResolver(MavenVersionResolver delegate) { + this.delegate = delegate; + } + + @Override + @Cacheable + public Map resolveDependencies(String groupId, String artifactId, String version) { + return this.delegate.resolveDependencies(groupId, artifactId, version); + } + + @Override + @Cacheable + public Map resolvePlugins(String groupId, String artifactId, String version) { + return this.delegate.resolvePlugins(groupId, artifactId, version); + } + + @Override + public Object generate(Object target, Method method, Object... params) { + String prefix = (method.getName().equals("resolveDependencies")) ? "dependencies" : "plugins"; + return "%s-%s:%s:%s".formatted(prefix, params[0], params[1], params[2]); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java index 36c5a0578c..dcec7bb8cb 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java @@ -22,7 +22,7 @@ import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -40,11 +40,11 @@ */ class ManagedDependenciesDependencyManagementPluginVersionResolverTests { - private static DependencyManagementVersionResolver dependencyManagementVersionResolver; + private static MavenVersionResolver versionResolver; @BeforeAll static void setup(@TempDir Path cacheLocation) { - dependencyManagementVersionResolver = DependencyManagementVersionResolver.withCacheLocation(cacheLocation); + versionResolver = MavenVersionResolver.withCacheLocation(cacheLocation); } @Test @@ -53,8 +53,7 @@ void dependencyManagementPluginVersionCanBeResolved() { MutableProjectDescription description = new MutableProjectDescription(); description.setPlatformVersion(Version.parse("2.1.8.RELEASE")); Function fallback = mock(Function.class); - String version = new ManagedDependenciesDependencyManagementPluginVersionResolver( - dependencyManagementVersionResolver, fallback) + String version = new ManagedDependenciesDependencyManagementPluginVersionResolver(versionResolver, fallback) .resolveDependencyManagementPluginVersion(description); assertThat(version).isEqualTo("1.0.8.RELEASE"); verifyNoInteractions(fallback); @@ -67,8 +66,7 @@ void dependencyManagementPluginVersionUsesFallbackIfNecessary() { description.setPlatformVersion(Version.parse("2.1.7.RELEASE")); Function fallback = mock(Function.class); given(fallback.apply(description)).willReturn("1.0.0.RELEASE"); - String version = new ManagedDependenciesDependencyManagementPluginVersionResolver( - dependencyManagementVersionResolver, fallback) + String version = new ManagedDependenciesDependencyManagementPluginVersionResolver(versionResolver, fallback) .resolveDependencyManagementPluginVersion(description); assertThat(version).isEqualTo("1.0.0.RELEASE"); verify(fallback).apply(description); diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java index ab9bb964b2..18851312ad 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java @@ -22,7 +22,7 @@ import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -43,8 +43,8 @@ void kotlinVersionCanBeResolved(@TempDir Path temp) { MutableProjectDescription description = new MutableProjectDescription(); description.setPlatformVersion(Version.parse("2.5.0")); Function fallback = mock(Function.class); - String version = new ManagedDependenciesKotlinVersionResolver( - DependencyManagementVersionResolver.withCacheLocation(temp), fallback) + String version = new ManagedDependenciesKotlinVersionResolver(MavenVersionResolver.withCacheLocation(temp), + fallback) .resolveKotlinVersion(description); assertThat(version).isEqualTo("1.5.0"); verifyNoInteractions(fallback); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolverTests.java index 012d0df61f..59ae742e97 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectVersionResolverTests.java @@ -22,7 +22,7 @@ import io.spring.initializr.generator.version.VersionParser; import io.spring.initializr.metadata.BillOfMaterials; import io.spring.initializr.metadata.InitializrMetadata; -import io.spring.initializr.versionresolver.DependencyManagementVersionResolver; +import io.spring.initializr.versionresolver.MavenVersionResolver; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -36,7 +36,7 @@ */ class SpringCloudProjectVersionResolverTests { - private final DependencyManagementVersionResolver versionResolver = mock(DependencyManagementVersionResolver.class); + private final MavenVersionResolver versionResolver = mock(MavenVersionResolver.class); @Test void resolveWithNoSpringCloudBom() { @@ -51,7 +51,8 @@ void resolveWithNoSpringCloudBom() { void resolveWithUnknownArtifactId() { BillOfMaterials bom = BillOfMaterials.create("org.springframework.cloud", "spring-cloud-dependencies", "1.0.0"); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults().addBom("spring-cloud", bom).build(); - given(this.versionResolver.resolve("org.springframework.cloud", "spring-cloud-dependencies", "1.0.0")) + given(this.versionResolver.resolveDependencies("org.springframework.cloud", "spring-cloud-dependencies", + "1.0.0")) .willReturn(Collections.singletonMap("org.springframework.cloud:spring-cloud", "1.1.0")); String version = new SpringCloudProjectVersionResolver(metadata, this.versionResolver) .resolveVersion(VersionParser.DEFAULT.parse("2.1.0.RELEASE"), "org.springframework.cloud:test"); @@ -62,7 +63,8 @@ void resolveWithUnknownArtifactId() { void resolveManagedArtifact() { BillOfMaterials bom = BillOfMaterials.create("org.springframework.cloud", "spring-cloud-dependencies", "1.0.0"); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults().addBom("spring-cloud", bom).build(); - given(this.versionResolver.resolve("org.springframework.cloud", "spring-cloud-dependencies", "1.0.0")) + given(this.versionResolver.resolveDependencies("org.springframework.cloud", "spring-cloud-dependencies", + "1.0.0")) .willReturn(Collections.singletonMap("org.springframework.cloud:spring-cloud", "1.1.0")); String version = new SpringCloudProjectVersionResolver(metadata, this.versionResolver) .resolveVersion(VersionParser.DEFAULT.parse("2.1.0.RELEASE"), "org.springframework.cloud:spring-cloud"); diff --git a/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java new file mode 100644 index 0000000000..a1a4b7f01d --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java @@ -0,0 +1,82 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.support; + +import java.util.Map; + +import io.spring.initializr.versionresolver.MavenVersionResolver; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.cache.CacheType; +import org.springframework.boot.test.autoconfigure.core.AutoConfigureCache; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.Cache; +import org.springframework.cache.Cache.ValueWrapper; +import org.springframework.cache.CacheManager; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link CacheableMavenVersionResolver}. + * + * @author Stephane Nicoll + */ +@SpringBootTest +@AutoConfigureCache(cacheProvider = CacheType.SIMPLE) +class CacheableMavenVersionResolverTests { + + private final MavenVersionResolver versionResolver; + + private final Cache cache; + + CacheableMavenVersionResolverTests(@Autowired MavenVersionResolver versionResolver, + @Autowired CacheManager cacheManager) { + this.versionResolver = versionResolver; + this.cache = cacheManager.getCache("initializr.metadata"); + } + + @BeforeEach + @AfterEach + void clearCache() { + this.cache.clear(); + } + + @Test + void managedDependenciesAreCached() { + Map dependencies = this.versionResolver.resolveDependencies("org.springframework.boot", + "spring-boot-dependencies", "3.1.0"); + assertThat(dependencies).isNotNull(); + ValueWrapper valueWrapper = this.cache + .get("dependencies-org.springframework.boot:spring-boot-dependencies:3.1.0"); + assertThat(valueWrapper).isNotNull(); + assertThat(valueWrapper.get()).isInstanceOf(Map.class); + } + + @Test + void managedPluginsAreCached() { + Map plugins = this.versionResolver.resolvePlugins("org.springframework.boot", + "spring-boot-dependencies", "3.1.0"); + assertThat(plugins).isNotNull(); + ValueWrapper valueWrapper = this.cache.get("plugins-org.springframework.boot:spring-boot-dependencies:3.1.0"); + assertThat(valueWrapper).isNotNull(); + assertThat(valueWrapper.get()).isInstanceOf(Map.class); + } + +} From 48ff1e68c33d0773aef97d75a880ecfef4577e70 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 11 Jul 2023 14:00:49 +0000 Subject: [PATCH 039/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index b7edd72487..91b18679e7 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:edbca5643efb6e8e4ea5d55995d786fbeeb7c568dcab82e4efa0e58c7409edc1 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:90430b34ecf4b80c5aadc8b4921863aaad22e49071d3d45552d1664a2f9bb18d lifecycle: preStop: exec: From 1bd608783835d5d89272a9d15d27d732d42af8ad Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 11 Jul 2023 16:13:12 +0200 Subject: [PATCH 040/825] Resolve NativeBuildTools version against plugin management This commit resolves the NBT version to use against the Spring Boot dependencies BOM that declares an entry for the NBT plugin. Closes gh-1227 --- .../graalvm/GraalVmGradleBuildCustomizer.java | 7 ++- ...GraalVmGroovyDslGradleBuildCustomizer.java | 7 ++- ...GraalVmKotlinDslGradleBuildCustomizer.java | 8 ++-- ...GraalVmProjectGenerationConfiguration.java | 10 ++-- .../NativeBuildtoolsVersionResolver.java | 48 +++---------------- .../GraalVmGradleBuildCustomizerTests.java | 6 +-- ...VmGroovyDslGradleBuildCustomizerTests.java | 6 +-- ...VmKotlinDslGradleBuildCustomizerTests.java | 6 +-- ...VmProjectGenerationConfigurationTests.java | 9 +++- .../NativeBuildtoolsVersionResolverTests.java | 24 ++++++---- 10 files changed, 50 insertions(+), 81 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java index 73c1309529..377a1d7272 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; /** * {@link BuildCustomizer} abstraction for Gradle projects using GraalVM. @@ -29,8 +28,8 @@ class GraalVmGradleBuildCustomizer implements BuildCustomizer { private final String nbtVersion; - protected GraalVmGradleBuildCustomizer(Version platformVersion) { - this.nbtVersion = NativeBuildtoolsVersionResolver.resolve(platformVersion); + protected GraalVmGradleBuildCustomizer(String nbtVersion) { + this.nbtVersion = nbtVersion; } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizer.java index 28e3329aad..a5b4a7379c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package io.spring.start.site.extension.dependency.graalvm; import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; -import io.spring.initializr.generator.version.Version; /** * {@link GraalVmGradleBuildCustomizer} implementations for projects using the Groovy DSL. @@ -26,8 +25,8 @@ */ class GraalVmGroovyDslGradleBuildCustomizer extends GraalVmGradleBuildCustomizer { - GraalVmGroovyDslGradleBuildCustomizer(Version platformVersion) { - super(platformVersion); + GraalVmGroovyDslGradleBuildCustomizer(String nbtVersion) { + super(nbtVersion); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizer.java index acaa875898..c5d4e48eb6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,6 @@ package io.spring.start.site.extension.dependency.graalvm; -import io.spring.initializr.generator.version.Version; - /** * {@link GraalVmGradleBuildCustomizer} implementations for projects using the Kotlin DSL. * @@ -25,8 +23,8 @@ */ class GraalVmKotlinDslGradleBuildCustomizer extends GraalVmGradleBuildCustomizer { - GraalVmKotlinDslGradleBuildCustomizer(Version platformVersion) { - super(platformVersion); + GraalVmKotlinDslGradleBuildCustomizer(String nbtVersion) { + super(nbtVersion); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java index cca9f85a9a..d2bb01aec7 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java @@ -44,10 +44,10 @@ @ConditionalOnPlatformVersion("3.0.0-M1") class GraalVmProjectGenerationConfiguration { - private final Version platformVersion; + private final String nbtVersion; - GraalVmProjectGenerationConfiguration(ProjectDescription description) { - this.platformVersion = description.getPlatformVersion(); + GraalVmProjectGenerationConfiguration(ProjectDescription description, MavenVersionResolver versionResolver) { + this.nbtVersion = NativeBuildtoolsVersionResolver.resolve(versionResolver, description.getPlatformVersion()); } @Bean @@ -64,13 +64,13 @@ GraalVmMavenBuildCustomizer graalVmMavenBuildCustomizer() { @Bean @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) GraalVmGroovyDslGradleBuildCustomizer graalVmGroovyDslGradleBuildCustomizer() { - return new GraalVmGroovyDslGradleBuildCustomizer(this.platformVersion); + return new GraalVmGroovyDslGradleBuildCustomizer(this.nbtVersion); } @Bean @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) GraalVmKotlinDslGradleBuildCustomizer graalVmKotlinDslGradleBuildCustomizer() { - return new GraalVmKotlinDslGradleBuildCustomizer(this.platformVersion); + return new GraalVmKotlinDslGradleBuildCustomizer(this.nbtVersion); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolver.java index aa5df78c2b..bdca1f594e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolver.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolver.java @@ -16,11 +16,10 @@ package io.spring.start.site.extension.dependency.graalvm; -import java.util.List; +import java.util.Map; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; +import io.spring.initializr.versionresolver.MavenVersionResolver; /** * Resolve the Native Build Tools version to use based on the platform version. @@ -29,45 +28,10 @@ */ abstract class NativeBuildtoolsVersionResolver { - private static final List ranges = List.of( - new NativeBuildtoolsRange("[3.0.0-M1,3.0.0-RC1)", "0.9.14"), - new NativeBuildtoolsRange("[3.0.0-RC1,3.0.0-RC2)", "0.9.16"), - new NativeBuildtoolsRange("[3.0.0-RC2,3.0.0)", "0.9.17"), - new NativeBuildtoolsRange("[3.0.0,3.0.1)", "0.9.18"), new NativeBuildtoolsRange("[3.0.1,3.0.3)", "0.9.19"), - new NativeBuildtoolsRange("[3.0.3,3.0.6)", "0.9.20"), new NativeBuildtoolsRange("[3.0.6,3.0.7)", "0.9.21"), - new NativeBuildtoolsRange("[3.0.7,3.1.1)", "0.9.22"), new NativeBuildtoolsRange("3.1.1", "0.9.23")); - - static String resolve(Version platformVersion) { - return ranges.stream() - .filter((range) -> range.match(platformVersion)) - .findFirst() - .map(NativeBuildtoolsRange::getVersion) - .orElse(null); - } - - private static class NativeBuildtoolsRange { - - private final VersionRange range; - - private final String version; - - NativeBuildtoolsRange(String range, String version) { - this.range = parseRange(range); - this.version = version; - } - - String getVersion() { - return this.version; - } - - private static VersionRange parseRange(String s) { - return VersionParser.DEFAULT.parseRange(s); - } - - boolean match(Version version) { - return this.range.match(version); - } - + static String resolve(MavenVersionResolver versionResolver, Version platformVersion) { + Map resolve = versionResolver.resolvePlugins("org.springframework.boot", + "spring-boot-dependencies", platformVersion.toString()); + return resolve.get("org.graalvm.buildtools:native-maven-plugin"); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java index 6794227c5a..ad1180bece 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java @@ -32,11 +32,11 @@ */ abstract class GraalVmGradleBuildCustomizerTests { - protected abstract GraalVmGradleBuildCustomizer createCustomizer(String platformVersion); + protected abstract GraalVmGradleBuildCustomizer createCustomizer(String nbtVersion); @Test void gradleBuildConfigureNativeBuildToolsPlugin() { - GraalVmGradleBuildCustomizer customizer = createCustomizer("3.0.0-RC1"); + GraalVmGradleBuildCustomizer customizer = createCustomizer("1.0.0"); GradleBuild build = createBuild(); customizer.customize(build); GradlePlugin nbtPlugin = build.plugins() @@ -46,7 +46,7 @@ void gradleBuildConfigureNativeBuildToolsPlugin() { .orElse(null); assertThat(nbtPlugin).isNotNull(); assertThat(nbtPlugin).isInstanceOf(StandardGradlePlugin.class) - .satisfies((plugin) -> assertThat(((StandardGradlePlugin) plugin).getVersion()).isEqualTo("0.9.16")); + .satisfies((plugin) -> assertThat(((StandardGradlePlugin) plugin).getVersion()).isEqualTo("1.0.0")); } protected GradleBuild createBuild() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizerTests.java index a6ffcfb8d1..4cea3d6694 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizerTests.java @@ -16,8 +16,6 @@ package io.spring.start.site.extension.dependency.graalvm; -import io.spring.initializr.generator.version.Version; - /** * Tests for {@link GraalVmGroovyDslGradleBuildCustomizer}. * @@ -26,8 +24,8 @@ class GraalVmGroovyDslGradleBuildCustomizerTests extends GraalVmGradleBuildCustomizerTests { @Override - protected GraalVmGroovyDslGradleBuildCustomizer createCustomizer(String platformVersion) { - return new GraalVmGroovyDslGradleBuildCustomizer(Version.parse(platformVersion)); + protected GraalVmGroovyDslGradleBuildCustomizer createCustomizer(String nbtVersion) { + return new GraalVmGroovyDslGradleBuildCustomizer(nbtVersion); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizerTests.java index 435ae840b6..523d37c730 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizerTests.java @@ -16,8 +16,6 @@ package io.spring.start.site.extension.dependency.graalvm; -import io.spring.initializr.generator.version.Version; - /** * Tests for {@link GraalVmKotlinDslGradleBuildCustomizer}. * @@ -26,8 +24,8 @@ class GraalVmKotlinDslGradleBuildCustomizerTests extends GraalVmGradleBuildCustomizerTests { @Override - protected GraalVmKotlinDslGradleBuildCustomizer createCustomizer(String platformVersion) { - return new GraalVmKotlinDslGradleBuildCustomizer(Version.parse(platformVersion)); + protected GraalVmKotlinDslGradleBuildCustomizer createCustomizer(String nbtVersion) { + return new GraalVmKotlinDslGradleBuildCustomizer(nbtVersion); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index 399129b4b6..e280370b76 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -16,10 +16,14 @@ package io.spring.start.site.extension.dependency.graalvm; +import java.nio.file.Path; + import io.spring.initializr.generator.version.Version; +import io.spring.initializr.versionresolver.MavenVersionResolver; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; @@ -58,8 +62,9 @@ void mavenBuildConfigureNativeBuildtoolsPlugint() { } @Test - void gradleBuildConfigureNativeBuildToolsPlugin() { - String nbtVersion = NativeBuildtoolsVersionResolver.resolve(Version.parse("3.0.0")); + void gradleBuildConfigureNativeBuildToolsPlugin(@TempDir Path temp) { + String nbtVersion = NativeBuildtoolsVersionResolver.resolve(MavenVersionResolver.withCacheLocation(temp), + Version.parse("3.0.0")); ProjectRequest request = createNativeProjectRequest(); request.setBootVersion("3.0.0"); assertThat(gradleBuild(request)).hasPlugin("org.graalvm.buildtools.native", nbtVersion); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java index df6872f4d6..8bd3da548a 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java @@ -16,10 +16,14 @@ package io.spring.start.site.extension.dependency.graalvm; +import java.nio.file.Path; import java.util.stream.Stream; import io.spring.initializr.generator.version.Version; import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.versionresolver.MavenVersionResolver; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -33,21 +37,25 @@ */ class NativeBuildtoolsVersionResolverTests { + private MavenVersionResolver versionResolver; + + @BeforeEach + void createVersionResolver(@TempDir Path temp) { + this.versionResolver = MavenVersionResolver.withCacheLocation(temp); + } + @ParameterizedTest @MethodSource("platformVersions") - void resolveNativeBuildToolsVersion(Version platformVersion, String expectedBuildToolsVersion) { - assertThat(NativeBuildtoolsVersionResolver.resolve(platformVersion)).isEqualTo(expectedBuildToolsVersion); + void resolveNativeBuildToolsVersion(Version platformVersion) { + assertThat(NativeBuildtoolsVersionResolver.resolve(this.versionResolver, platformVersion)).isNotNull(); } private static Stream platformVersions() { - return Stream.of(versions("2.7.0", null), versions("3.0.0-M1", "0.9.14"), versions("3.0.0-RC1", "0.9.16"), - versions("3.0.0-RC2", "0.9.17"), versions("3.0.0", "0.9.18"), versions("3.0.1", "0.9.19"), - versions("3.0.3", "0.9.20"), versions("3.0.6", "0.9.21"), versions("3.0.7", "0.9.22"), - versions("3.1.0", "0.9.22"), versions("3.1.1", "0.9.23")); + return Stream.of(version("3.0.0"), version("3.1.0")); } - private static Arguments versions(String platformVersion, String nativeBuildToolsVersion) { - return Arguments.of(VersionParser.DEFAULT.parse(platformVersion), nativeBuildToolsVersion); + private static Arguments version(String platformVersion) { + return Arguments.of(VersionParser.DEFAULT.parse(platformVersion)); } } From 3b4b2429180e110e76f08c1cdeb5fd3186f30f75 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 11 Jul 2023 17:03:29 +0200 Subject: [PATCH 041/825] Resolve NativeBuildTools version lazily This commit polishes the resolution of the NBT plugin so that it only happens if it is required. The commit also makes sure that the version can be resolved for the current Spring Boot versions. See gh-1227 --- .../GraalVmProjectGenerationConfiguration.java | 11 +++++++---- .../NativeBuildtoolsVersionResolverTests.java | 18 ++++++++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java index d2bb01aec7..0d8ebac0e7 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java @@ -17,6 +17,7 @@ package io.spring.start.site.extension.dependency.graalvm; import java.util.Map; +import java.util.function.Supplier; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; @@ -33,6 +34,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.util.function.SingletonSupplier; /** * {@link ProjectGenerationConfiguration} for generation of projects that use GraalVM. @@ -44,10 +46,11 @@ @ConditionalOnPlatformVersion("3.0.0-M1") class GraalVmProjectGenerationConfiguration { - private final String nbtVersion; + private final Supplier nbtVersion; GraalVmProjectGenerationConfiguration(ProjectDescription description, MavenVersionResolver versionResolver) { - this.nbtVersion = NativeBuildtoolsVersionResolver.resolve(versionResolver, description.getPlatformVersion()); + this.nbtVersion = SingletonSupplier + .of(() -> NativeBuildtoolsVersionResolver.resolve(versionResolver, description.getPlatformVersion())); } @Bean @@ -64,13 +67,13 @@ GraalVmMavenBuildCustomizer graalVmMavenBuildCustomizer() { @Bean @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) GraalVmGroovyDslGradleBuildCustomizer graalVmGroovyDslGradleBuildCustomizer() { - return new GraalVmGroovyDslGradleBuildCustomizer(this.nbtVersion); + return new GraalVmGroovyDslGradleBuildCustomizer(this.nbtVersion.get()); } @Bean @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) GraalVmKotlinDslGradleBuildCustomizer graalVmKotlinDslGradleBuildCustomizer() { - return new GraalVmKotlinDslGradleBuildCustomizer(this.nbtVersion); + return new GraalVmKotlinDslGradleBuildCustomizer(this.nbtVersion.get()); } @Bean diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java index 8bd3da548a..2aa3486b43 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java @@ -21,8 +21,12 @@ import io.spring.initializr.generator.version.Version; import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.metadata.MetadataElement; import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -35,7 +39,8 @@ * * @author Stephane Nicoll */ -class NativeBuildtoolsVersionResolverTests { +@TestInstance(Lifecycle.PER_CLASS) +class NativeBuildtoolsVersionResolverTests extends AbstractExtensionTests { private MavenVersionResolver versionResolver; @@ -50,11 +55,16 @@ void resolveNativeBuildToolsVersion(Version platformVersion) { assertThat(NativeBuildtoolsVersionResolver.resolve(this.versionResolver, platformVersion)).isNotNull(); } - private static Stream platformVersions() { - return Stream.of(version("3.0.0"), version("3.1.0")); + private Stream platformVersions() { + return getMetadata().getBootVersions() + .getContent() + .stream() + .map(MetadataElement::getId) + .filter((candidate) -> !candidate.startsWith("2.7")) + .map(this::version); } - private static Arguments version(String platformVersion) { + private Arguments version(String platformVersion) { return Arguments.of(VersionParser.DEFAULT.parse(platformVersion)); } From 674076621ed69174da7f68f4700ae93f87fd0efa Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 11 Jul 2023 15:21:09 +0000 Subject: [PATCH 042/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 91b18679e7..20d4b54aa4 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:90430b34ecf4b80c5aadc8b4921863aaad22e49071d3d45552d1664a2f9bb18d + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4edb5e741a80f0974cb9b92cbd28ed8de70e32944f7d22247039bb655f431b35 lifecycle: preStop: exec: From d8243d7830f56a5323cce3e7c05ccbb91b5eb951 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 11 Jul 2023 20:09:26 +0200 Subject: [PATCH 043/825] Remove node-gyp from CI image See gh-1206 --- ci/images/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/images/setup.sh b/ci/images/setup.sh index 049db04665..e34d82f62f 100755 --- a/ci/images/setup.sh +++ b/ci/images/setup.sh @@ -7,7 +7,7 @@ set -ex export DEBIAN_FRONTEND=noninteractive apt-get update -apt-get install --no-install-recommends -y tzdata ca-certificates curl git node-gyp +apt-get install --no-install-recommends -y tzdata ca-certificates curl git ln -fs /usr/share/zoneinfo/UTC /etc/localtime dpkg-reconfigure --frontend noninteractive tzdata From 13f00be197cbfc2766381c8411301930b6ab5c73 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 11 Jul 2023 18:24:07 +0000 Subject: [PATCH 044/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 20d4b54aa4..5c926c65b0 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4edb5e741a80f0974cb9b92cbd28ed8de70e32944f7d22247039bb655f431b35 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:1391287570f0305a1895ef9406a145ce1f3154d4452e74b152e6e5f748f99426 lifecycle: preStop: exec: From e592f816b591f46afa3bad03723eb6377e154a14 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 12 Jul 2023 11:24:23 +0200 Subject: [PATCH 045/825] Start building against Initializr 0.20.1 snapshots --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e6f5d5d935..bdfb3124b5 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 0.0.1-SNAPSHOT false - 0.20.0-SNAPSHOT + 0.20.1-SNAPSHOT 0.0.39 From 8188faf2e0ab2910dc491c361ea9bf4a7bfd042b Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 12 Jul 2023 09:37:55 +0000 Subject: [PATCH 046/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 5c926c65b0..4939ddd677 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:1391287570f0305a1895ef9406a145ce1f3154d4452e74b152e6e5f748f99426 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:a20d66bbee3237e18ea9aa7c1d96108385fc8cd752769dd18439b8fec00ab8b7 lifecycle: preStop: exec: From 986e72b4a38a4dd320be9bf55b47e54f7ccc0095 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 12 Jul 2023 20:05:40 +0200 Subject: [PATCH 047/825] Allow Spring Pulsar to be selected with Spring Boot 3.1.x Closes gh-1244 --- start-site/src/main/resources/application.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f499a0de10..c6796b6bdd 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -776,9 +776,9 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.jms.artemis - name: Spring for Apache Pulsar id: pulsar - compatibilityRange: "[3.0.0,3.1.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" mappings: - - compatibilityRange: "[3.0.0,3.1.0-M1)" + - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 0.2.0 description: Build messaging applications with Apache Pulsar groupId: org.springframework.pulsar @@ -788,9 +788,9 @@ initializr: href: https://docs.spring.io/spring-pulsar/docs/0.2.x/reference/html/ - name: Spring for Apache Pulsar (Reactive) id: pulsar-reactive - compatibilityRange: "[3.0.0,3.1.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" mappings: - - compatibilityRange: "[3.0.0,3.1.0-M1)" + - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 0.2.0 description: Build reactive messaging applications with Apache Pulsar facets: From fe713f2d9030791ec487dbb5e2ec5772046398a5 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 12 Jul 2023 18:21:21 +0000 Subject: [PATCH 048/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 4939ddd677..e8ebdfbb00 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:a20d66bbee3237e18ea9aa7c1d96108385fc8cd752769dd18439b8fec00ab8b7 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:97924c64d5177aedf10e5578fea753b7e6834a7343d98d9cf2ed3622836ad0c7 lifecycle: preStop: exec: From 199f5c60aadefe591f98107e7a4933ae612c9d3c Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Mon, 17 Jul 2023 14:32:51 +0100 Subject: [PATCH 049/825] Fix typo in GraphQL package name See gh-1248 --- .../graphql/SpringGraphQlProjectContributorTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectContributorTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectContributorTests.java index 631c9935ca..da85c4658d 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectContributorTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectContributorTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.graphl; +package io.spring.start.site.extension.dependency.graphql; import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; From e8eda7a397a0b177d34e64eaf152c08e5d748d02 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 17 Jul 2023 14:24:03 +0000 Subject: [PATCH 050/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index e8ebdfbb00..179751524f 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:97924c64d5177aedf10e5578fea753b7e6834a7343d98d9cf2ed3622836ad0c7 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:17ddada88a13fb1b13646ee91d20d72b8baf0452598387ebe15c1a24f957d0e5 lifecycle: preStop: exec: From 1f73c95d9294ce8b16a526882be182b378329ba8 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 18 Jul 2023 06:32:35 +0200 Subject: [PATCH 051/825] Harmonize description of Mustache Closes gh-1246 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c6796b6bdd..23eeed501a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -382,7 +382,7 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.spring-mvc.template-engines - name: Mustache id: mustache - description: Logic-less Templates. There are no if statements, else clauses, or for loops. Instead there are only tags. + description: Logic-less templates for both web and standalone environments. There are no if statements, else clauses, or for loops. Instead there are only tags. links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.spring-mvc.template-engines From eec0464b5e4d9632a375df376f4b0fca4e709705 Mon Sep 17 00:00:00 2001 From: CodeWithSouma Date: Mon, 17 Jul 2023 22:26:50 +0530 Subject: [PATCH 052/825] Refresh start.spring.io screenshot See gh-1249 --- using-web-ui.png | Bin 810556 -> 87032 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/using-web-ui.png b/using-web-ui.png index 97878c3e7b16e2c07fb244af79bc09a49ca5ae79..1a80c9cb439385b6d0af38262d57024f68ce2501 100644 GIT binary patch literal 87032 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ÃodV%u$jA!)Ln0780A0;OS=d+V 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 X>tDIUVfx`PC{0{MS~%mjw&#BUz}w3% literal 810556 zcmeFYcUTkO);0`+qCZ5e6cK_IkS3^f2#SJ=h>8kGiGm176CxclC@M;|fS{BJ2#6qv z^cs;W9qBdn&;tocNSk>lmUGVYKHs0;cU|8fheeXfls$Xx*?X;f-D~Cf*8bza|b*3?wD z_t7&atKI%6xsTEd6Gv69jeZEqVK&j)XswAz`%CRDm1wSxg|X&4^p84R8-JemJ$*;o z$?~Q~*xKev8LwEx^Tp2t4v{}3Ejl=rm#9CNw%_5-g%Z3Nc~ z$ABs=KCY1)jrM!Cc)S-MG1y*i_++OHm!JN2zAd!@`)ki{7nGHb%l?ku@AZhJ{LK4w zOBzKfVtK$vlgipQOaj!R@^yK483yrz*W3O+w<@>Sk4DKVf%cn7BCu(Q58=NEC+7_^~ zozL?M+LTyyIKDb<{pyBy^0^&J9}7#Zb=3E}a@jYR?)&U2j>@5Cy>h!ga~NGfb$fQU zf}5EeR(C#gy9xKVk7r*+n?3W~uX1(ju)fosWAQdhs$RPKITtV2x$!Ak9E#Z5)8C-{ zb$Z8^o4)1`Z6s0I*W||Q?z!6~tI1q2K{&?-E=#Hq+B z#OTIjy#Z?1oS-RpNh$s2E8F_*<^;~|ta*OBR@#QQQ&hDkc!f)AlaAil%C~_Mylw$% zYD?6XrN?}avmS5z-g^GkPP%GdIJbBQ=CR6TcJA?d@%Khwsb}T@oxn`tBoU2Fm zEcu;Z-8DdV`^b#0p9si6+<)A_nh;K!^jKGr_~+Z4{D!oOb2T;B z1vdnU%~tQS`$z7f{QXCwzFdgyT&H!_L;8Ok@etq30~hWbQAWrZ+>l&&A%9MQw98|&dSt?>!I$xkfgkwk{PZ9j zX@Qfckx6>FDdMx}0%4xGZS}R; zN~+-z?s;l*;?4C_{m$82v%Y=G)5zWecE#px%NFyG+U35f?fb}>MCA9^?%X;Xu@Q>( zedC&|eieIg;rIssm3Cf@>V&ZiD^e?)CpW7<&U}3J^v2to`YngsBo&UhN-iH(*){ZB@OkB-oj;gM^+sYxG3ldFDqcII`ic8O*k?0lPLl9_KzC};~zq@B=v#~)$X{9eY< z&_UCowIII0^nu36Ly6PI8NxqfJDg^vW@)p;2cl&)p1x(LN7T!%mr=@MAE0KhtSwU1 z{B}`7DM#0~&02LV^k&Rz&Y~%FMm{BLO>hp?M?85;B>cp)oWC@Wg;$&Cy-E(g zU6R~!|Ka$Jnq5x?MMY}fRNHM9A&U-)NQoxupE+o7FzHIpmC{a$RFzZ-TRmIF$=#EV z_1EhS!ZqVWx*qOgo;dgxs1Z@?G@6-meblMqU`|jlSD@a*NWAx6yAGPnO;z zRY%+Hb$w@FHe67>mLuvqW24gR{AoZx|MlGwy@;oqw(i*~FIEQ3%A>o7>$Iu^p3-lS z$upHgZ-ib7DTfsbNy(MTzkRd+P3fB~xu~07=1SR*vJc(J%8oSGwiV4+%MQ44I4h>d z*2Pua?sLJY&B)ym`$>n_&L%ebeKR@oJ#Sp%UCNt^>WUiLnq0$2E|%Xcx1jF!FRJXv zM6hL;#oHpcWp2Z3o>0^BJmEg2E~MG3G3uV8xlz-|{gYSO#Ki}9H3{l&_p4?fmHCuE zv-)JIP?D0Ple4o=AZMv&a}De1`H<^^<;(i$$&x*#J!K<^wtW)EEAIHztOy@m)c+7= zrZds~tbKWOnZ7(U>=t!mpSs_jAC2iR0pAjz&03$da(sSjAJiiFsQ6W_c~Exxx~!Fr zx2{M`vMasAXi^9iqSQFiI5s!YEuH9xUvNI?rRA^0EI?E%cDqI5Z{uj74)_FQvZ1Z_ z`5XEB_pCgKo|NwV=#nb2X^@x1Q_SndoA*dLScT7%*Mg56oE40C-2Zg5UQvkFxEk6+ zy?2ehanMKKMACL9275^P7JJfd+?$CZY`ttaJ_|(l; zI9Xp?QE~Fr8OKKZ!-_^gj)sHe)pShGBn0=yX|F+uI zi5vAJ5#Hh0olvvcME`o;bz6i~_{F%l_m94OsV3uYIuZY&<3rl{;@633cL{&Bx`oiM`7!ZoSk0JH=LC{WBipT z-}DZ$bxVu++pfdggiN26AGZ9V@uPY80g}!wTq_m?n+%bz^hwGy@5Fe2(t!UArTm=&z74)^i_Nmwa*3A3uJY9qEqFS02GG`omFce65*uK5R;jN=KdbEX^ua;lbqJP)E)%C5drhRonTj@)*cUx*( zb3D!Bx&M#QSAAp?f~x!%vt!=XHN*qBEcqV!m{@B_XN+mYzxw3W6PGY8;m=lUr5DY- ziiRsIQdpBV)f4&1a8@!Y1Ux)oIQWJkH&PN_am#Y0dZyJ|aG;55ow@4;mCADt8CWtxtbx##xVBse7NK-eVR{IjQE@TM|q5SFEnx z1zTf_LtQB&N&X@CGZu5ekx>5`+9$vp40H=IZg|POO>0M<3%Jir9vdecgc=|;g|*U= zIX*U&4>Oq!T{Tuatc0-~(n#y?UGbZZ`cTQx*aVuRfw-Gau9bj+c^Y}OPja}K>m&}469vz4n7a;yHi zb^raq02ix}hs$p-S9sV8c+9$soVlfQE%P2PxT|;V$vqPH`)!v#Eoc;r1_j<%d;HO2 z=lilxQct+LyU_O?&c9rmOU^qREG{^11wgX=T<46q0$$N*G?!T-#Or@;@d#I|$%)GJ z&}Uy%`?Kdgt6O8-l~)8D86CMEEU!(UHdlNrCgZr&?mrv3WOCjE4mv{Z%+B96GU7T4 zZ*S(}<=)G+5#Hj4Upm}k|Jv5)mgeI5wSNN_SBN7Q@1Jun!JnMJ7x0U7&F@d1S5LY4 z;BPzOm(TkRf6xAh^q%MM_GS_I7}qHiz4PbcPZL`YJ3CjjgWH3p4bubgjxG1knWMS5 zgbs6F+~=C}0fz?TTeQ?`H-W7fDcO!q> zIb(;m^>DoZz|qZBlGE;O8#m7f+6NABZuGCe-~F`nas2n4T+x5jf)!Nc98pwKIHvfo zw&6>)ID0iNJNno;o1JlVfyWHKhmNw^F=ee^7yPe7|Gwq#ORuBtJoMaL;42^K{Cm{@ zT>PI0|L+Tb-P8O(?s-i0f86sw4*j`QOOd1de~iWNf&R4@9%-F_v=smK)O7wq%}eya z4|1R58RKj4Cp^tKf4p1aH|gJ>@b;#NMODPNVJ6eJ@JBYsfh0lgw=H1~&=aGE>{+#d8 zvw6GEeNfwT&Sr~*?hk&Y`ud#jIlDzBJ*?VKPR82;P6a2a2@79oWlQU zJ`~Yw;S|_{=~dSZJ1xok-~a!Pz<)>J|34$JEcj3=>{DNC*v^!IrOV}J#V)At#IyK{ zq|j2yu2mBhqXrnPDcG@)als{OXOgcSAiKe)CQWHy88+77Y}i}gB&J{1n}eIEYrZ9N=+8ZyKQGP;r>u#*+%{yHzEfj0^h9o zbgJY|Q*|4rIyPOo3k={3LL4o6jbp;e?~0^wDl?VS|Jlqv|LBz#{-NN-)SQGr-MlE4 zhxv3TL0F6YeN>V`o6M+MRAk0e-+$hhFUFJ`UrlkbZeDsA`6F2%rR8@&i+-tl(#06# z(&FFzpUrerrN`e27x4`kSgHT%W}J!*``QmRMOdrKQ)|Qq$1QBtbYxEhBwQVKPB;`djhIGFV`qk1Ty_K% zB`a}@yAT?7PGJ-73LbB-y)+0ELC(+sh-N&YVwaFZ@Yh4Ji!`hYQC?!oXbGo#JB^AO zvQB09-P^T9l&+VcdBRk)?z$8-fOSmDx7`O6u8P^)vyY)Sw2OIV=y=Or`hQ;8p zLyyojd#TJc@+msF~G}Q1zXn z)EDmA7w&$3ltr8|y>TWC*_B>^xZt91@zqG|D-fBt9JeTVMn$g9)x`?hm^Dz9j?sN`Y9DqY2!n4iszS+c2}|GD|jhty-L8RavU2%{R99U$msg zJ)cf8z3Av2?%B|plNaIK{2#w`TvTZl~%H%{ID_ zaQ(;<+#ivl=|sP=C$sTOOr@ql^3m5`4QAfqOQcKME2r05scaFuCEu9y<+jrs`sV)Dc0ZRz79#VkMl<=WpK(SzHCsDZ z`M=%#?`ZzNI5%GlCrNW~n*=X+;*PfG(4)6-c)cvu?%^-#Tlx~8w=$%UTzcUlZJ$`R z7J^erTe@|yz)`lyR*`hII8kMOWvJ*{K2q20+&&rmM4gqLCV9b9EYLUevmNxiz-uO6lNz8NI#p2TdLQ?KfWOV)| zgwONL{_0(z*o}z|);4EHsEfIj5cw~z1zQ$*%7bR!#d|Ww`qK9eF`A)Uy9PtO9#%TY zcDrOmXt0Xpdlm(^3+*&$GS3jKsJ*s0wgnQ9b>~*hOL6t5_AzRN%v1+?sSmAm(XFi- zfh$fXkuI=>{j$a7Z233qf<5y^UHamfp*Q!ae4F{7ADqta;b3G1dKyy_6l->+ zSexm@zRjO4=CXnLP2qj%%-uwt^+K73B9Mgae_WJebxU#ZAI~Aj)NMEy!;?&&$4_cs zdi2imC@SsI^!X0dT(JCRnEi1miCqYO+1MMQ@-Xn0aEB!t)|oXJZEFG05zes5Qure5 z@}z93;7SO-DD54a`}^sMbLtCg4`bs(#kGo`BmGif7qh)YX@lB<%^4r^-_bNq3`)`; z+|6J5wz7t3XdP2xdIrs*uI%X3mY9(CB0a%9b5G*s+mx9LyBfdy5e3ja zs0Ykq_hE2_I5#M*!O{>NLCO^nRvNfjuz9l%w>!PN0VQB1RUdnRewRT@oJTRabo-N#We!;Dd&*BH< zY!=ionlS^YUJONAEY>$HyQHmKux`Hgu8*_7P2mwg|~{d zY>CFz{5!KqQ6xcUn44?72v;`UX;UwzB_`x^RYYAErwq%4k z$})D+@8YwCfl%aNXd3kz{M0U@PF1d(z#H4Ihv91Z6(;M}_SElme;1f<4RfX(GBP!MK+n*F|hWW)>x^q1b@5|MKy`uB3g@P4pQaGmFK6{agY?<^6Ro@aLb=-h`RRK_)m&w)^N3NoFqvpb)Sc-@tmJB%~<=_4jg4bjtkI zUt9972G)5xUs5Vd54%N((^*(h4HHk)g)k{BG&yE$zY60gJf~r4HQq;-n#TG>l8gh7 zm_-9`eu+ew@Qm5|bNI07qmcet!)7E_5vtAMtWSf-L1G)BVnsF8dCRpcKksU$-Lb+f zi`r@ibXSH5zSEjRDeVyZva@}q9X17hFDN}W3OTaOnZZZxdEMg=kHCwx?u_$IjzxGV z3qRJnZEMNBrcp1UjlzwT@9c2-wddlV>+gSqX?4DhD+={C$&=l}TF%oiYL#cHMw(5yaUg|c)311RY_J|FS^~77~ z2Xu=+Xa7Q0-4yU`qeta^WFUW_je)q118EAlaj|w&MeT8j?6Hoe2vCWJ&x0;4rUk5< zt|$Atfw6nPe*=<(x`wd@v{5Csep(XgrwSCdohWd%X$^-l>u-lXxiL&Ds(E+Hu3B3Z z({_NeLa;wlgz{Z@NjSeI&zcX2#JrE|`7R}ODX@8<@SKLHbu1>Ig$|SIu1#f?v&1YM zpiVHAZNQA8M>IcEqV3CfZ49l#lmg2&##AX~vhJe3j4z_zsGzD~8 zDIvj=mat;(21D$8c7|*Q+n(7@#jf+vhH|zN-O8Z)B+hKHI1_Z%q2umB=fqc413>mR z#N=Y?<7mAR6<_B`Oi>z8BhNA&ile$`b6f`r8IQ1w(52(|@PT_?S3+Z$qCJ30IcM@y z7i@F(EY#sA++a&|Fq{A5dilgRoJ~smmk8#-4c5qFI;`nPZdBhSWBUliU? z5JP#O(C0ceD$Dj3tKRwXoXc@KGdJ_BS@Q4#Dpvbm78Ht;-NuqV!q_@gf_16Gx4MSH zm$MmhPIZ2(#hg|rHZN>A3g)P-#FX2x)>?=ULpgVpb@>c!E z=kaQx;c)j<+f^H-vtlw z`W4tcTnEj;C7s}p>g=>7I0yx9@h{;N>WzEDN>wOS#QQI|uY!S{*f)T+C2|`3TV~$Y zMv~ewK!3vz7#zUYa2AQL5|HFCKfi=LmCVk-9~uNuEmAb!vz*28J7TqDAIi&T)0*?3 zdbhKJ;ap*d{mghDm}xx`tEIhR1gMfaj1hN`{68XIZ<(lCo2oL4UfTol1Ku&0Xw-T=86T|vi74*_Q=FGU%hV=kO!&N+1J z;EZUFtl`l3FH8i3CsxoMxoYHY!1UVPmPF6IcXsd^35yW1w=#WGR1-Wh1(0$54?ieY z>yU7=N4p4ZWoE6)95b)KmjA1rYF84Dj#||H8G8#6RR=Kw`j-P4$lguS;2yqJsroa5 zkAv#hb>~s$g=4O_?DpSZwXb&H`G%@!B)s7mJMwMV=C^Be4%6s|GTyh<)%H)zHe(E# z;~@rDb0)|18mt!jZsew7?I+uRnvk4FjinY@349*ak?t!4xNGeM18uhH5Y{IIfFW}; zG%HBLoq5p(_uqsi52JyjkR0R+<;@t?8q#9Bhk!!Jqy3WaA~TqN#Euz7MGWdO1+^TQ zQ6_j4=iqPD_X`Ft;Tpw~saU7B%|aZCAzz_l5O4#lkMl08$}qtW8sAbfQSi)*D&!jb z_7Fqe&`V=uy`K3GnRWP!u8m}15}Q+~@4a&Yov`+K zvOm%6!p!4~7xK(Lg=ieM6$cXO89@HoRUss?dQZZ8c-Fv12Me!(jP>#v)7rC>wj3`( zH=z@Hm{A-zK>NO|YKa^*h6aCoioa9b0Xh|Vj2uiwE#X=aoRJtL?*9_O@dv(z2x11{ z_}8`k`vUiV429YEj~*dPXkQB!RmT>-d;c}PCQ6W7mUbi(Sp*%M`6l?oP_wqurLP*R zRGf+M?bMbWGpypfo?Gyba05oEti#O5a+F8Nb7(1bgt3?r>3nI;#2)$Y|ScuUmaKP6^Z z_GcUnFH|A_*DOLbLIxbO3qu~Sa*!Rf38Zq?$uEFwA0f5`<$|Ec(a30EyInK#E++YN zP#9$Z1zU~3a!QUffy(A-I1^u9Do-oxwDsWUcFg=Ah#aga&50?H7F!Ri>{V57-{6aj zN*&hAxB7Dy$FI?*Lvh(dY>gR-cS}hTzqG`3QGg3=R`UdUs;2I@STDYmU8R!8Rz1hL zwk}x~h{k1#t<0q+J{BQd)I1{=s4y6)sVv!0Ej#iC^T6Zf$7DWIsX`Y~Yn)J8GG>oy zOpdg)>ukfCWBqCmu!Y@sL&)e7tB0&0;sbU@0~bcpsI(|BkL|`?9zJOD*pp9#@!19XkC@*x!QmDu4eM z)IN0bx5LzEbf@#q-gh2T-uo~5%BkJarD{gLs`?>_C0&{;MyZd=0!`(amEyLsq5{j*zY$c~XF2p47f;8r+UHI44zVtP-po$xi_*z(=)wnFVQI^SkXcs|_m=%$ zv%2!manM~DY~}!TM^JB2;BWzL`(c|)rSsj@HpGn^_W8c$<~%HF5rA4J5VAHDWmZ$dWzOX#UFFG^KB zC!e_-Z`*6(`VKG>Z#;WMc}35EZ~+&=^3F|V3ZK!P^f{#@0KjoZ`{y5f!*~;{9z@HD zT-dCmAbhYQGN!$*9Ff|h{xt7}a!wXj_du>~24>Jl|CvUG0tOrG&yci}Hj!wen|j5> zfGd4B3KAFH$YQsCGHUXtfVH=Dy!@NJQQtQG44E|vMLGq@{BjD~Vle7&Mn>$ZhkYE$ zn7j!N9hom~7DA|7$M6X{DMUmd(|JvM*B)?k;3V0MiYRsmqe?BQ z;PcGdOPeh^^r^NEAyoEp@Sf?4l8)ag-eWFmW`bx`_`&R76kmxYXE3s!~46FO3WPb6!9z|%MqDolYnxaUM=ej-c8L4#| zl!7ea04t~T6use{Q!6Wzl?AKe&*qZc<}~wVux=P$20p#8Zy(f=m^1xt`V0L!|5`Um zl_JPb1>m@Y=D-lxQ|#ehaexZhU>`^}{{@bv7B<|2Mu<2zI6{O1fd!@o9^V_+Pb;p% zRnF2>X=zPL?GvL_fnZ&gKnmV{$}v1~GE=t3!%<^94Gm=^sAD4Y#N$n&qnUu)V=i6& z_NbtB$8UR&?9BAflRS1$KnOg)S1auV{bh~FprvKxL+B_wauQc|ySm~Trh&Y#X<)$s z;erNN@EMpdm~(7FZD@@K=0iQ3R3)hwi;IhuVK$xzMeh+u(m^tBYbYy?74rnNi0IzeW0P z^^uI)d0IllIU}M>*fu8>Q8lZ+edVlHLx-u~v#>jR6Fv>%w6Kd;H8rGX18(l3xyJ6ewD)}5xXK>0L zsgcZXqUJ>ae!}s{vRn$DVWHFxtHKnj0M25Arb`}H3!)D7V*e>AuLV5o-_Sir**9?HT@x z|ND>E>jOEfSAX8cPAXYO40_+j`bp2dZl|WrSqcWOyvGKAi!R!4%%;9guuenh+{wiI z-#LKN?oMuAYp)9F5Oft(ht^YC+*9`V>hL=#R0qXTJ?pAgz zGjXUN+Wjj^`X3KDAC3&;@t0T;>2P3}OT}hCTB2PgO;hn%*fsxJG7B7}g>Wzo3}ym> zS*9Lr;$d(T!lZ*^H~q8e!lhH0Y^f!!VtO$xdVAm^iafg5;BWr#2k#$ zkT%zfe&I1=cE=-XE9K@Twp>#tO6~=FJA<(ACvI>D(WWZDJOCQU1yx?A;u)Oh9L|Jo z8YBY_TY=Z%K<_Wc{XKhg^4@b4jXQ@Kh7EUvRUnM|I0W7wD97=7oW&ew)&U2$oS+uZ z(Y85{Xe_bjNjz8a?MCDNQpsjfLn?vjy1?Y|ZT4I{F6^^E$!$KvNOb1Zs3xE9TEy@{ z`&@i!7a~ztcg6TYUxnm*?$8*0C+3M0;oT+#5_gJc#G52YJkyjL!x?k4#Bt70m^G-uBsP>mJ$NPT z1ZvgTUmDCi5DF|oMa0}`2_dn?y5YUvReZM_YFd{oD8+uqE%MZcj+H5r_2L5+ z1qp#@OvGyq_N#hhN36c)^Z+tK46`hg{G%O>O2g(!)L++WuUCVLZN1e2iW-VQ)RI%I z0erg&Ns!Adu!Gfw8ypC$fMB?e?Sl$o%wAi{YJca9G-h!u7a4aaS+yMp8!!$P%dywC z5W9}38pUQB(ouiJjgDlBPR6YAmw!WcsM_vZS^@^40@!(XfrJ#d?x>sARM>%YCX4F8 z8G7HE@H8q*`<5^V1j1QZ#KO%LmS|iwfJy>vk1OhdXC-`0pmvdoTJjWrCh<*JoY;c> z*7aqIKavnENJugMnd^@#mE@A{bmu*x;&)PcVbsK9DMCPJ@Px)4Bb)FkpV!B>zI8Xj z)whbQS7t1)2PUpIR`1{M|H{@uPpHBKxnzP=z7KAj< z?KN}=_Ex!+K8F8C)^X@Hj9NK%eW6MM*qnEye?iZ?6l(u9GITu5`p24GW~o0Oo*-_} zqc_~+pGJApm?m`l{~??uf{^Th7YIsq0GLo6BeaMgrlJSv;_N_UB|^U2GVhe^loQWk}|mR^Tw*zUKxjJtrWux@&P25&X%{V>I3-?9l*i)0U# z6U2ubn1WF2GF*LNjOPTaQ$X?XbPg#Be##9cPMLzPFkKd2L&ug6K-2InU|2Q7sbp_5 zazRHDj}!8*|}8wSrWCyQNC(@a4paupec z-b}eUdKb(@q(4?5BT4(Zj1jie$&Zb{T1hZnVu>+wQkQcNaoPUdyE!gF*=OkFf#v-I z=t>JHag%;vQ$}QdS|aWNbJ?TxRFx6C3YCOzGDR*GCnJ34Z+_x?N5(m^O~DdItvoIKFzW;6aEvn9cX8G4}$Wf*e0Z)`m*T4$;pG?2+=lc?6`98 z@tc(;r5=&Fn(a{$1}c3gX5p$2e|BR~?5jg@O7pb0Z_?3&3$fVM$nxiy2bSsBs`JI4 zp-=QIJZSM4Ies{mhGh}o(Y^>JNx=@TVjmr~idz@l z@Z0odDM~}KzvLiM9+HRLp#1va_yE|!^?^jYb+&EmI%nlO!C!OPh|L9%3p4~4vtj5% zg#sa;lQ>}A;5dTGqzz*a`(K(brm(Bk&iTgUku8P7d3=LJTpW)}^m1xx#&W(IA#LuP z!5oX=gF~5rr(O6dv1Yo3SHQN-oad|CUI7<{0|K4?>m`v9ulshUzV22fItGVarAP0T zP5ZiN+9tz(EhzEBoh)I!ZF5({bVcq@#oWmN{U$;uZmTAuVV&9At`)HS3(o}d-ghb2 zu_PBS0nvDd6Fl#40;2Im>pCa#Y5Jrf^H8>w;QD1lSZLPMM)f?a;*2!tY53$g$*I1kh*ytvPiRjI- zq}|>D3VPd=18y{DEk?PotjnPj+HK=$B<08=(@3tV>xT);&Dc%Zw{KN+oY=h1AtfPd;}4N@?AeZo!)K7B+$@B3jtK*A$>=un?P2-O#LpAVjpuN4EUW=! zM>d8=a2&^A0ToX|WI#3Qx3*FcT8!?^VKutgob((AC+r5^2%h49$m1TJMN|v~N*7@J zz~LM?{I=DG<3T?Q8U*$IB8XR=Ttq=({4B}cTxdGJsjZYLb z0iPHQYs7^CEDjSU2D*vpt{Je4{8Y75P_Y0D4Kn^=Yo5Y9Ne}c{-5XBsZFKJY=8zGw zQ?F0W1@&$lJ32D2O--0j>~Q_%!E}YeN@tTde$t|Z1789iHBbTh*wuOO)V8=xY~FB< zAy!$``vR0n&oVUd5NC&%^0Qke^XBYx{8^|pIynhu7b$&Az_S=eXX%!LwK!v}MVHz30Br*Z`hh4A?WW5mcm=ktDx9f@p z)>k5oJO+6m(~$>z6?_^E;`J|WrMFlWl);$SWGa)FFmnn)ygaDWq zl3acnvXzj_ssz1-l7@ap>CEk?AlF!3&=;yOIF5yU)u6wNMlc5W6A~DMgxgf;mw!}+ zy+tdeQ%fVjp5^acfk^S`w*N1UMjohh7@37lI&*;E^m1Z^9P+HvDz`&vdS@ zR6evl_xt0ML5^BvJEt{~NBXrQIlk?2>X(wz=wn*aj`1GOw!_`ItDV3FC_31ZVxb)A z)%axWc&WoIdeMk-{E~Xpt_LW2O4wV` z1RdMtv3Pv}NAY&AoCXvolw1@c+>Ag@-q17LXIvPymr?%AV1a0}&6-sn042MnbfcW~ z`Uao^*w9Slr}69DfzLoa;I!s7Fn>bwMvmCcx*T?&5DdED6uiQ>R2F1YVF#xtEcNJE z7l9bqfx@{rxi?Qjk+Pc@0!m7#PGC1sRLEI|zXK8L7S(2?;>7L60y${d#(_@Q&z6G% z-UY`3u1+*1DX8c&PaT+xukij1T=53Cb|)TeAFEJ^N487h z$t{RP8(nrf*_ablXJPNL$4|M=0ORdYw#c&)qX`a+%9%+Me4$96jtN0^mM0B4#tFW3 zh#&_y{FN-$Yv)hDh@x_K!#qFhjs5wYTE;iipPPP%T~1c~Y|tkkj~xPvVZSv3mb1M% zwR;xZIKMLa9vCuhI}EIRC{BcwjT?O}ti8dh! zy7@C?B(7P$hg@Y#A>jpNm70GcR~Wj%dCKMM&B!KX5{=0$NHtf4i3VjNJYoJV38klh z!B|2aS#0WJ_KxN%AjiGSlGLw?pEKd)qB?HKp?cVSP8G=|FhRCmyfs=WROiFtk zp%p2bB`@CPD-NMAA}4*))fLy%Ayd2&MfUY7;^;fwfR9It;|6#Uf>cgxUaM&! zeROBAIEVg`@Em1HF$?L4IcL)P~4I;FDwt;D7T8Cxg#XlUH2z|k5Lurlb&_LAQ~ z*hS^N;%ygBkeI)(Q7{2bm3|fIkTAb>D=7c<${U9<~;L5T*6EX3wD4>fS<=+_J zf`aDEnigj5hr?>|nYI|ntX6`hez-kl+j^k>yy|mEYat|*Yq91W+PcE|++^HSU9nA) zzEQVZG_>H1N6zX%j=Q)B7CeX}^*{L1FXQ6hG&m{LB^6N_U0#SF^Vk4fzhyt7I>AXLBo*iqOAnj=^_hBCJg77giVE|nBD!PEA) z6p3Wvx((oHq(A715^q8ivPjK>Tn6`MrFb3x&$9rC-Kq5D5k+UIDs8`TkC5&rhfL;#UfFDrAr3i(AEaHuOdin`>F|!B%a^b zzHY)uJl=k1WOZ0Cnu_Q$hA^O<-w({-KE*dH7wO$@dPuW#b4WH=EzMG8w*4AI`8P}K zV9>uF!CoNOVk=pHV(+flMYbMj-+CR+@@^Y!z(CwOuU0c*+E5XGwf6{_9n2P_(SCEN zocAo$FwZFWT2y3F7C^%sX<}o;dnqr?|(H9h=4qF9`$#RSV zoI!!i;5cqNsb{_PX2Uzv7$Ap_yA|dg2WZC5+Of8WQ>`HY+5k8z#JPXHa>WDraSi%#c6m&gBpifztoCX zU$tz~9lg$==L)BToRa>vg9~Mh9w*pG__KAGVe^1SgdqW%`M&mo;S0^-8~_>}tU z7KPwlRx_0SlB_e~_Q!S30H)Yx>r5E0b3dFQQX@7(-v-CZmT4hRD7sN}rXJn+kF?KZ zH3K)~LZLbUussShSF*oCy)HPWBhK@MN8B;Y;h!h7f&-(cOzJy*!Ia-2ZuSdL@j~ck zo&)3wF%@3`i&XnXpU(9fOE(5PRta9Ww|qy4c+w~@@Fgfo3RI4yhe^>IuOJU&-g=%Z z@5`ju@G0GGQae$#2pyvf9u)Nn^sTyME$L|(@hx^iJ8qFamMoxm`{h+EYj4NT0L)5{ zO2enVR~Sa*T(MDNlUh1LVylEi<5l(=I++${IW!Y+1lN9kNQrGozQS&bXT)U5JwT-c zBy(ZFT`LXhXStc+$cE4=4FN8c)y$-iI2Pw*5elJ2x4J@@{V8{4#V>rJ6xWZ!beNbC z;Ma1=q2_K2@(4_UPbc>8y2erj^Y2!)_{+iJ94g=}3~qys<5mmS%L6lh8vkX4iy<>~ zlc*vm;PJpa!apn+@^20J#O@0X^S#btg*Zvj)&LuZA^Qxc-g61}n;kwY7q<%kD4`h# zJ;0Sz4Du5^U1dQh#rAyY`>5+H;C&5U?MCGrv~>YJz>qS<$|J`!aFrF6U^5jJPARoS zuUKR}9(y?q4SC%IshZ1a@*Bs~62Eov(drx}nXiP?^Y+EdvR-VO*kEQ+oVRA%*wL-N za7%;I<-Lo&LWEtk4kbTM@_|)45b2o|@^BI{^b&2wHj(nA?2{$hz*Fy{{e%v7@(ApC z#bL)X(U*@~!3Q*k4%Pt##vj|5RB~Z$dfjpo1$v+5!z<-&&obvkzWvYK?-nL3q5i)q z_<$?BV&>5HR@ryo!sgZHAj7;bCT(fumMSOU_L7`4{1U|?hBmF0<}2LDZ-KE;-VS#5 zLeoz#pD({kcr{_L66W~{h_boqjXmz?GyS*LF zJdml05P0D~!2!g)d&^luM5Q&^s!pZX+4a>q|rZ4KHBsBkC=>rK~6g zTEW!Ea=wzHDBjz9w>j~qY~!$ob1-Mvgrh1Iz(C1q#`1S_QaK{1CU`eTR(RGQmp36} zKI8KOB%m6R&7yq~08EACwuc0;rTj7kr@^Cal3ccM{ZTBY4@(*^gx~_7Rd~|SSz4MJ zlG7$_UcO7nG?Xa(AaK!BwWy{Ll*FL$sUQ3!*o(#ZSfe?^^be>cU)%|-n8H%mxzEIg zOzh6dnFpm>4Qu4=1f5v>T%f2cWb14+=7IG|z~{xr>SlJgUZC}gM*jUtShF|AbI>0STj01dPamKE_Kd*acGt-cHaTK&8G1;t*kP@grU^*ZQaY3mfJ> zQ$^)W+rM6`O$)c450^&a!xmE5_#PZ?c#0PCHy29E4RcS2Lq8s|pu5&L;UPbT+33jM zrSmZs_^iIiY`bX=8vMA9?raYd7e3=VLN;Ex3q&=5KEgB?sGmz+d)lZEp|f;^fbXbI z3%rWF3mB3ghUl=5*hzK-?v`sfW?aHAW?-B_ z(!O}8c8IQMV|~dcMe*QmY5z%5ni7IZUmnhA_*3bME)_XX`WX6c4hMA~ETe9isPqrl^ zsujpZZFT#EwfB&t*phLPpzXRW^DDg>Eeg)zlGqP#6QLAT$vrk)bO5pN^Qvb2bjW@Z zfc=u5<;gb*P0*jx8x$J#sa^7^E|V?g!m$MF0w3W?*GxQ&0XP+E98rmNfZSP3|9`ur zo3yu!QsJU-(P1jv8;|J469;V1|K&V;I%pYHND6yyf}UH2(`K?Gv}|Su+WkR(XScmT zXE_q`x`_K)Xs|%4spcW4LhG(p-Tp^TG@)+!PP6rEH5<1>f*uaMnNnZu6M2H9)N#TSR?~9-L1AVMNaMu z3z%vZ2gLgzvxw z4II)J3(PwGs-SgSjkVOnUIrhUTDm+cyaIZX*~O)@Y8(s@4LBoQtae3T{>6lHssL}Y zZ_^1+_29_*S6T=JpW1gI->J?Y97a>vz)*Rx>EB9DDiiW^FoLUnL=6UkY#$Mny_P&^ z4Y5pMdmQ2vvd43XE==7xSG=qN9rpGar3h|=rzrXnoGDow0PcZWidt*1)m@ugm@|!Z znZH~QC(l{031;H-l~%pxqARBx*196C8JFh%4`=Tl&-CB^fp?Nhp(7QRq;kl@2MJrH zQiM=Z$tr0H$=R^2^C~i@EMZGRB62>2DVbB5^BiJMGo~4vnVo-c-S_8nfA7cd`~Cgy z`}43r95%dP@7L?Pp3mp?ysm|$m^(qoQWY``Y9})G?Bf_%RDo~RC{K)7XpUQepP^v; zHNjDv9$+KuPnmi&Vb&uO8EFt$joiiU?Dw0K*liP9f&7>gyAi5l2vAR_Ss19_uod?p zJz4b8al)Bea5LvjBP2ROM9+>}b~y6IYv|PT6N^ua;_0 zy~ltB&LOwiUsVEh=lp`Ny$(PEdu_7RVG{bC4fb9RyKkXvQpy+~nTlb4u8YqWW!7W%bmcD^F#6j|k2pKTN*|f=!)Kdg@h; zCDtKWhg?dHIKP$2`=wvq6Vcb?CU%lGv8Eo*s|&U;-;2iP=%6aYq0UGFy0v3)T%1nk z0JV3ky%Y~BHKk4q@DCN!kdnFpS0kxs3xqr*N!?rpiTAq6fa^hWyy%AoJog0w6Ij(8 z6zLaNM;32ouht(iuW(o`295_mR?=*5wP9z>8Vu9lw$get!iJ(Zy1Od6tJ38{%qx}i z*K>7kW&5WIqQ-F)P%`(Kd|)?~<=b3jw^n^xoy%FzplB^dwZ;pbII?JfZoou981x2m zbLzA+#vCXlJ@Cdz5ko|>pJJ(KOqAcjGR#6>@dB!4C6Wu^ub0a2hyW+J-!8xdd{$KP zN}38V25Pt460Le_^bc;9W3LN{ExJ-S;tN-IeHZrSxz>6Fl(iWUIuY$=x(kiOMOx#D~l8qDKCi8e!Ao-7;A+Z2kO zMoHPZ)F8HR=y(96)gC$dq>8ump=kbE=g$GFWHS1q2q^R!N{a!nqb#(TK=l8H4KH{| z4W3|`rGX$Gdfg57XU08t!ybTZ={%YK)|B_**J`VjValTL*X~ovqIv!UvEM@!4ajR& zX726e`sL0I;O>>#l#XDo;mj*kf0Dv{l^|9wZTc08zyqjX2$1&5Cq&tG(5VCzmEr~z zoLg<@S#xyLJ0C#EDe92>V*d0Fv--sH+VNLFxK19_RaAY?4f!d>|I>Q`=V$t;>4hZ8*7WO!M*n*HE z;br}9V_9lt0TjUND{J1c2uSH3aGSh9TtbBjC3inlK`yYiE8|qotTuIhuYw}=N+(B@ zBpCS|Ers>UkE_+qq0nzSA>&N$W?1wT+#H!TN*=KHNKGkUrnskwkKw{W0a?va$6dRRUQi;w8FlD=tK$$k*w@W5s#__5rmre{?#pS^#i zggmFB!p(U87|FJ;dxs6TCV6ggf)m#lSaTqn$(w*>u$ zSu0?B8xk>H`PH*O74(0b|IinHHwXUQQaQcsXx@!K!)7GCkL z6T|0t!3)HHaFU$-r4$KZ=AIQL07h0o`~Jf=KO|btUlAGub?`s>Q@9i4le;rOPLz$r zj_~r?(xnd%2fgtfC3Y7jMf}gB=s7~@O^Ay~N8+wPgJQwbv0a5Mnnx=X5iI_}`37>Y zq!ow;I3W{bkUB`mwNhOfl`>H;A7S(Yr^Zd0iC?VH>tR_?H7-})K&5$s~;$q1m}1E!=E=YQUeWDd$RAYEl_(QC@aM3 z*lzzxcrK;1=bssO$x3mzPerGT6Ho#>K8U28|4NR>xparj?ZoD`OekR4(e=<9EtYGW z$l@+rRe#Am%owQjj)c#;ZD%if|4f%fA-cWRlGFF7Ef&PT5#-*p9$Z*!06x7k9?QST z%i#MTh&`bSAz2RPP#iA;WG3Jg5Ol};8eH%m40<1SiVDRDeCTR#Z^XW}yeNd1vi1sI zUdu)StBB6VPxJZ~+yT$JGEh|LuCoZVhB8~x(W&k+wjcxEq8X5Qa|OJBf ziQ{4~JpstT13)Xw4+B6}^ORe1JeJnVI1B}gx_flHA2L1AeW2hkGQgyb0kyH-*A(>isRVjSQ+x0fg+<#WhXXRWKJphRA9%Z`C@R!c- z8ik%j68eh=ro?2RN&#fP^dUzC{$e5!gp%AY7jXba znDTA1SL7LRhp|$jQP^bp*&nGlqi#+21!;~e2WfG7MXBV3wCMBw8Y0Rw$X6>f^q$&n zq06{3ax+y~@^c0^Q;k`)kmY?1)v{MTAI3cNdrt^QEC_IU0jkY!e@Ihb2#gfD0rmv< zgccXZ7nvV)n1J0EnBP4oK)?^JJ5R?(1=99BYS>AIC7ppK<5SqX5 zm5Vl=CG&=@`pq7>0-)rOZ(SoQU4(dr>1-m375EPgAg@@Bt>iMrq#kW1|(@6no2WK8MPllK;!(N|fe>ZxpBT zx7o$@j#TUSxEw<-NzuV+Km`P_1c3oRJ`vO+c}PEa(}FC)ls6tirW7V-!bd?qxISp% zo-rn1`}-0~=nN0FpMqB*y8s5LaGXFk_h4~BV~CAnNQ;}av!QZUym=5pjyTB$+U*}u z4!Z-J*z+^;r%t5tsidf*6X}|2v-+FK`(`0oJjiFTvj#_|oz;?NM|AH4B)2$!U8B_v zx|Z_e7MhP###1|3Cu2}+_$vNED*lsB`QqaCEWi*w;wFvy3} zm3V;&G@Vk30?B8Aog~QO?6FQ*vD9U5nbPc1djMX4+vnQ7ztO2yr}2Dx;u1vtrZ~oQ zw20v)v=!qwVp&Ew57-1IR&rJj(PW9U44majBJSpIl6V^65eh0fJnAc-Q#M z7+Fg^n}a?4&B9+REqiIn*i3FGkwP}~m}`a)CaF7#yEOY_jD%GL z_JUwLtLQBHk8ckl7dCn0?PETM+cz1(jLl=f_m#%v%mQ_#2TvBlG=|ki-5^oR#vb0{ zc!cLm__~wh9Y;niPC5|_N0K=hfE;Y6SB->xIopAX%1bAhR`CNrk@rJdlkQ9>T!+wE zhHYS5aaYAIl1&znp#g!nVP3~K5jVv%^}S5=M??c1EMY`RCUA`AxL8%&WCFM47gRW4 zegrT-He3RLeZegfOniLF=c6nA2D$k?i91Su9Z(cJdm!G`x%i*1^(Apo7BD<}y+~L* zK6c|D1>;IRm(7c7MrDHXoTvm(FaSk?zBk=RM@d^>|LK1I(+&+CK<7ULpll8F)jl53 z1Ox_m@|1XiWnyt1>p&y1m8WDrb)E{FBzjBlw>nK@>2J_dF}#&Zd}_bbUl+%?mRt3` z0VT+kT9FEPNGnLqqn0!I^cm#l zYx2Iu6~E+$`9?Pw^PEwictW__iVU2={w%-7>6Xit3M5&=>f<{j6g81Cf^M5^H|rT7 zxwPP`T4Lk`)dYd3<$@J1@&vEPAL(5Isc|(gA~Tgk)d|Q}LNF`a(wsm(1uDi}8;Bgm zssw6L!?{A;)_T+0hF5^|MoGQm%}d<0#AgbPe|Zjb^!sY^{#qidZFCbl=c zP@Ugl`JTE*qV;geWZ7Q&DgC!7)?)1fH10E{->wreE3!w)Tpj`FMh?;X4V+w%x~L@$ zF-H{n@>85C2J*G{G~mAb;ky)vuJCvY6h)6E##*zLuq2l`NWNIR08RZYXzx8pNAI(s zrT+Zu3TJK^7)+(*C;h9Os4Il3S7kCleHV zk6te)5F@CULx^Z1~C z;=KB0wdQOpJkW%wv zeFga$Ne`62PdaWd8n>5>6X(XDlFiZ%IE0e~j$p?VnMJ-;a})a#fkyj7;ZiY=j5kLh zEAT1R!kN!-;76p6%zXavuM!GA1v&dg79%I&qEw5bk?eD;Z!1MV4$0sal%ts?TUT4_ zk(%Nq|FidTX?Vr&*595yfc*kp4@@G3wQkArFDLoLvX3yF67CFc<5@B9`F=p6nZhD! zPg9yuGQ?64OFDpY7mrZr>3@35QD~OvzUg&3_%OPiAK3~El#JG)C8Mb!Ly{honz>}y zl}V6DM3(-PiaVj=PALUfGoOJj|Mmb~>Po#C`N@@~OOd#abOg?e)R`QSI6L+)K1p9q(IDfPxwp7eNL3Z2yP=b(bbR(O$ z9u^>1w`9YHs!^d+$&XNaf;Rgpi>hM3{4>@;dfl8#W`MaE``}fr`#bkH?U`wdyQ^ef z^TdZHRn?Tsic6vJEiY=D&a7HZ7N|;8+bsjQ#py zLNynfp@nd1KTH&fo+I+vIHD+^L&)@Ocg`lbO@g|WQ-Pi4c-yj#w{ zUXIy&wPsKMzS-7#oZM`e4~B3Uw~y?}kx_41Sq!8qID=ksi*CwvhVm8wxuu|)%zOlQ2fRh1 zC7U2ORL#)O?6|t!9Luj=KGbO*DjzM4YJ5cp6L=ymf3<{^-iMHHXXW4Th+M{rDt1`$ z$H^mu3mIXPS%K?=VCyu&DUtdK3$|CB_A;B_s=i&S3ewv0=iWc`XJ9B0288TJ97`Z` z+9pI5=zt2;aK5Blx?nFJ0Aib@(-#$AqWm|n{>YjLmyMx5rso%XF8ij6$!IZJAP40- z0Zl6xC-`11+*W@-wb+1Xc(m&WrB>KiL$Y=UOSyGln4~=*67T*9V+`a&3?0-iV|tU3 z^`n3zO0SAC%LF9>_aFGr1)Aep0r`Y*!Ga)`yZ9RF6bpn@RiHsZh6 z7!yhsLDCROH&m)55fOyrzEV{pUCi6K{qHZttBs4p4;5NbVL$5EseB`3$gl z&?Apn;F@xO+&hg9GDYu4*tPrPBj>C3!grfKo#dY+p9_=3aj+bbW?=%xjv?e=@f8W! zO%{}PazJf9icaISXSw$8!jt*ER-c2Kvq3|$n)gH7FrgoQ;^dAzXyo|)2tP6&H$H+_ z8WF2lfp}4tSc73JP@uI`f>3Eurl|w94Jtg2uqlpENjBm-5IAQQ#`M2aB{(S?#y6Bs z5V;MKBKbMJTgTNESNxsF?7CgE<4y5J`|RD!gfIySCY3`A?4{Yn!ZUn=o)Y|k#Vba| z2{P=#I=DjhAz~x&xu(B86_w(XfDd>Sf|j(0b8SuKg#7JxTpa}nBMLKdh!F$S7u@&s zZ-dy|B56FfD;5+nZwF$sKj7PuwfwCr_b)NG?*f1g zC!o662@O3*g=LDmX@VYq#LbOc-dp0~@5cKH=mbohev12}1S6Y%3+XALM5Iwj z=UXB6Z?~el5zX->DF!~5pQMsyO{3<#Gmx#!1c?@IF2-kiaHVMaq4_f5_!`@Qm0tEEHXR6zkq{1bHLrYN$7%cPA0 z?;w(8NlE*p-CigB)x$PDzccA6?1gh-hv@UHRVD zHx6Ml!t5FoBGf$kO}L==k;QN=ff;qw_#NuTk@+9|ud>*Hd)QKYT?!V- zb*_=1Ys3o!aNWkgkBPdE4!@wlpu(SUC|4G@U0O#Q1+&9uV&gbZ@gDCWS!MEjVf`rBR? zE^v7KgtF*zIvQCUej)s9L(5U=s#+mXv%S0h)|F+R$z!Vs!KYA&A=mzc#%@o2Y`8~$ z>QEqDr(??Nf)*qAHrzK>YBQSioq6UP{1{mZaqxv~8@2Ivz$GI13P#hMr9I)S&cB=P zkF2S(UQ;Cz#21m#3!UhzNgS{)#RTVtHyRhEVcc;H#9%;Nu>&tfBS^2Q?it=^T%i8)ajRqXHZ^t`ByFgN&mWSl^Yl^QyW*>iMs zd+4^>v@LD?h|;+g!<)-9!gdL@Dk4U@)U9b|Y8O}7LxW(SFi2b`2YzhtliE-{JYmyo zcDC6N?qfv5d#`Bcnz43G)1gxA0ae%{EniO-K@C_}c;U(4fH=Qj64ARcbnJymD} z8r{VrAE5B?t(3Y_J2d|E`1iMT9Sh?LdTsjH;H3(zI|wyA;J^m?H)B|(PAphrka^Hg*#X6KUbCkP7HTb9-s0= z>__?~?05kFUXZXXPh}=nfxo-wGt)Fd7JTwdHfr3m*jCJVLxmsN7crk5FYL=(-(T^j z8a19qm07M(#rBKg?W+;!z@*8ns+Bf>|FCPT|ITe7{?8FGTQX|E0{GBCOZ`PlGAQh1 zY=_~CgcQH|+I(|PiUv{~@f^t=f#~s-Lj;m-=c+GCn)~mr-I2lUkx2<=C@wopK<;ER z-aue_%ok*UM`WSr*!FhmGn$|sCTV6X zA*fke>;4YHUm^veFBL=C{a$b=n-7v$wxmeE`1{3#s9m6aA2Dwzhel4Co=}(%yXm(* zSlMbVHsU9lgDVa38-TLE3DldkN@OQ8_#8Wno{=)U zwfYNR8Zn_yWnWbyuEi|lkM{IzI48hXtMseGLX6PofYAAG!TSP`q zI02`78hS}jp3Qc?YY{M+bi$?;bgYP4^n!i%*igU`2ekn$&BgNJqcf5t8a~aA(5e__ z(Vb+PoAlc7qAX;M1tTk=3u{OCfg-iS9TMGH8S~d>PW0J5LqAS@7T~9FD)FAi{zRKj zK8#$l0b=iHn5bk6LYE}QMM{8xQuC-ff^@x>?Uyf4dx&E;PYj_LlW%}Z(~Y}K7(|pc zuR#ux0nGzJtpFxy&KG^;QF;0bO!4Lw*cJE7Ad-S2`zr2SkqH&xXHC=gt!^;MBcWFd zTD;x0*gbVSS>f`$uIL&!B^CMyLgG@~NBuimQp&*4zWz1q%)Rp=WV z#XMZ3;nS3~@i&RGascxAa)4~xL9aMYhIY{THssSC4fPfE2#F)V`PwgYX`{s$;4q_3 z6Cx(h5$RxiKqvFdg&$&CWgR*j;>M{!LOg0i^2b{$oHHT~U~e;q=TvHxg%Ko+PsJ;D zxoa)orgmz0q+kQSdOfR~e2CTuOqY3SX2Vzg{3(^AUN;BHaUV&?hQDy#&bb)7{9;}R z9PWGICFqJgTLMxY-x}A9IXT?q@4^Fw9ARq>tE{R!Z4iUnKBe&cw1jr8i6J66$<)I_ zI(6|!k$;7i_(NFve@c~sm(MnAMN{bLMFl+tKBt9SO&dL^OW$CMnFO=|Z9Q8|a0?%>bt&a1!C3HE#&Px7Y#s zdP2|7N{(~Y`!6Sa$Elw(U&%#~Ip2eYx3Z#B`s`DU-L?fq*|;YVa2DLUmgW8K{)rQE z%pL2Q%?^p=%%eF}xPw%8B#odSZu--5_DIygG`#{^;0hJIM2kv@{F%>BpC22(wsG+z zmG`Vp-A$fz@~^!>u^blDz+8y{D*aJJb(QD->qmb*=l}fVuG1=DBl=Deq`$JH!v-@- zxM{PNdW0qUgd^{JI((zWaJ_|672fmRI|2vSrE1oa!54`%xLTO-rv;1vU1kxa!8R2y zJ+~Se#X&U}__Wqlva8`KT=Aj6&)+ZYIvZgozDgkGxe3-MC$*-@=syOEo@Z{XONXD zjz2Bp)l1=^fHnIU2p=7Fb8cNqR zy*IhNAtMYDZG1|N)^-xabc&{frU-P9Y8GmSdQorQl3}H$#GL&A)GY})?+C%%I=Xo# z>V~$Jm@zU0zxY9EK7e&7s4Y0_55NHW9KVimBs^H@f4FOww9_{Q$&e*VqYVB^KcV`ohLF6$qI{&7(%Q^)Ti@_%%Tvr7ujZQ1)-_ZIS(9qzz9=Z{+sJdLr4t~e{oxE=-^&Uh=;Xlg zKyt@UVW<^p;SBiqhQw((nD}Krnx7hSC`IjYt$24Wx@oSCAV_UdAM#w_3D|CKT3OrXFPXlw})c&huWx7JNkwpF|i$J4BM6CevYUf}Q@X&eP-R3DCc61RL$)7+5Me{ zX+JyVe@IGb@>1IJnaGJ7%hwm$TE4M8IJwz{zshRaf$g$>7IuB}jHM|8j4(L+plf8ij#+m+y+vUg_*9Wy;E!Xm>+$H29*8<>l zUSj0R$0?@swFiP)_52ZP9hDdbi=9(RC#(T)BA;(X>eSPZHjJJuw5y=l?=;w+zuuY) z?&fd^__}k@LgnArCvwdY0OQ8NtDx?xtN>eafF4A_;Ffc%WA)|H<*fKsv1{!&y)pG; zusJDFX&dhCjcH-><+j`%D5qavPf2dc(AVvj`=g;>pX+2r9LqLSAXsgOnDG|UsFvTN z(_#L(K8^QaNZ^&G<}E-*B?@S~p>zPg2`z_zXQ}dk3AUe)4pXFj6F_juN5Kos7p_#M_TlC7T@X$+R%-$6#4RFDOv zR9n<^;8}W#hNy8)ls*<~N_N-{_~5=nLMzPe*HZV84)p{t0;rzbsh96RnJkDs3Q`h< z*g+aobuMi=c=5~fa`(;iC*)R;H9iFRt{Os19~R|Hnx!EN5@F`oko0}o|7Ujke`#M}lNG)-d{Q4A zy@-)C8brb_<@uVYz5sG~-5Ni#LR*T(qjFx%NBaJeRQOhlKso3*|FpGUgM*bC9ZYr8 z17=4Bs5Z=pOXB9D=BhNS8u0>E7QlPDeN6#kw6ZUT7a(E4&6yBPRkVjFb<;Xl&#*>2PKVT0ZuFA@jWQ4tU z(!MNiU4F%h2)yxIsJc+4rQ8&)FI?=9Jcdaa6x2kuJo~}rK>IbKXqI%mk0;*N8f*2} zDug_%^_5JNwW635^qAiHJ!b!Lkz`oY>R&p570y%i)qjqNqIqk;18gYz3 zYsyj$`O{u42>gQ{@X$)k?m)xG>!?W&)LjlP8)#}jIY__C-h60A{ivU=sHUqg-<-B< zK)+_0{8u}1^GSK;yapy%xL^H7UnUBnm4)KA>NnE!XFgEjZy#l%X1Z-u*?qD6*d zNpnVL61!Ia(T?0z3mXx~l92+)xeSdzb2?%b1WZMBChbl{!?`J+UUw-xA@Bgklj|T%_0ot0`{^B@Be`>MIbtmD zetE2t$~B9lS3AEXyAV-97O~p?|GGB2tNiC-m&Ny`rlUIe|*uVe!scdT9U}+ z2}c6~V`6O0#usk`BPTZ-C2s4;>S=SbmhS(dIsHR&kgVa8emyPVMs$gJsY1M`Je1kQ zCG^`Q^GdM0y1t^iGgB5D*`jZ;v4&7I-V${f*VEeqp`}xqq_oO`LyCyzFH^&pI$dUG z;kIw8lA}x`JoQBzhZ(fBD$~zT!1y$llU8ZZANdxGISb|>$%mK9{aK>iYZV~B1VYf- zC;Yf!tMxRGR0JuPMu+ESg=(-Oc_qcOS2oD47_`4SKAYB)qof4G$ozG?Esnk^$Zncw zz1+4rd$-m9wHf}$Qv7S1RLQSBcm8}|Z+jhdIK!R?e+<2~KEwGPcCSO_NmioZHLfOh z+u++MNPzO(EL>ik-t!cDFIKgFz&@HvfFj{DE$ZygiGgNbhkTc`}~WFP$(?o zfA8bCHV%BGZe%}}xqtlX{QGMcn9@-Nxxdas*pp?_kfB^t@WPqG#!dfzJpR`e`PWX% zH(PN+odt1Ql#}cle+hATeezM>q{4R2u0siujXt}>PF&)5S`(k<3x*EVpCur3Ic?4= zBm`s%M03K!YCb#`&vPyzU!4gu*rkU0=H$)F3>$ASpF2ovnsz5f#K)r#HpH_$Uijg5 zKC5gAJS2Z+Zbv+}hID(m`k}>xi3HO3DVf`;B@rN`n_75*IgxSI4nb>peZ9z@+lI?$ zd!-^QK3MTRY57$Z*z3*qHQz|eMNgV=5F-P?TD8sa=8w<$B`?SBn0pZ{>RuBfzF&fc zwqBx>ix!@E^vrZSFHHNsOx{q&I8au?Pz^3^ZXYwYj%Dg(UYvf=kc(_8>M6aQ2V1DF zI&1ZULJ2QFFW*0;jrrxhRZQ|t5Zt8L7fE$d-!pZ?Np6=+$&Aa1dr{)B4aI55Cj;BW zWkn_%!jfMwKKn6R(iXS=y5R7I0@nR2K25G&;Uhtx`|)Z@%Cm9#ueR%|`|@jm{VI4- zr2!eXF%)IG=H9jy)Z>Qy~uyl9XScctm{do@-Q+>zSIUTrqrME(3id z7h}rp({Yz?;TUF#7Oj=6VF=Ic$bA&F!37j6v9-+sRsR(mMAIVY@0go*Ousi%XkIFR zyroLMMLAT(^`49D?vD{A_8gi!UyvBrgn1^?jJ4t?Sxu#)pFPc}Mz{(V=|Q8I0#cPO z_Dc$Tm_Uc8&>KvsIpx6VUgUD&qBBbDQtv(Lz5^-SdqR18yd?B=<8t3r?vxXJYd0$8 z!)>LvrI$}!PA)0?W1#uvhSFOns=I&9%jXQT6mwKep9nq=_D{oIT8h{9l-5q~JnI=G z7K9?tUvRiM0`6@u-NwlAy;XR^Ci&y-&X9}TMaz$GS-p4iU#tpXWDQgY?CpiZ!oG!V znDHoS&Hs?uudO5AH$sgoow(o?gv!}*;bKeN$pODcGao`brtfJbK09Ay%~(V9uUm&F z{&h_5>^bN|O1TrImiF-f%sKyh_Fvg(n0w|8$q1fqB|k7gKG;WiDS3nW)&{!XVfq$& z!|tPK_L>_iYVOOcbZo1WaMmM#VxweYx<3+zw-<7HuEdStlCK}Mf?~0&o%rprID+Zz z9~>=WYerQC!S{4{GsjC|dVVXE0RL!{YmUIJI%i(ew~yPb zUl_B>L5P}wxg#Ipt@scHG|k`sGN+C=@L>RbCz(6rW3+O$%jZb z$YH0)E6d-PA^Hr${b<(H$i{uSlyKf;PuyktPp^;h=sR^!iZ9zrA$rjt&y0>HBviWI zN?~li0x~)9u?!KZlY6s8sK{NN=j%&m&D*Ou6)ElY73tVPMp+UPy|kH=)niq#(!zukYJWKvP{YsSmht)H{)legRt{P|R;I^)u_ zThGWU5*hWMjGvJ6ulErnGKgKTkn{TWyYRQK<})$~UV3xtP+b4Cs0x-F9F97*(V zZ&3D%PCYDoqo#L?FMx`oPaJatGK#t;{l{yPjSZuUANmW!cmQ3%#csP z!JY$$kq@}YDT?vcyU?Qk9Xa#kT158`?`L-_hm+n}WLo-24&J%k=WT=2EqkJlx!k>2 zS6QqlBNXQj{KD67&ZQ3D@5u@IxDQ37(>^qxJUM{%tj9J~3 zhB9M~tm|`UlD4pcw@R`jl<8a#JdE&O|Ih5zc6x>SICD>V@3#LUZ-uT@eE;D?pgL>K zVB_bn*eKE_2X$;tt7GKE*<;Q>JXQO4AS1eP_Ctjv<#h5x+5yvd#B-4Po4VqC0k7fc zAs}e|pd?VQSR=aOAO%zQt6y+CuA&Bv0!bwlL^NN9F~V9Dy1UzhX3b@hYWHs8>sCIm zliP)i(kE4(iBZn6Utho3dxCAg*kZ4JccSrVgxcC$&sx&;y`GcJ{SHn{>EyMZJj126 zyuuW)z0RDu-o0oEYTrxysBvJPE}Kj7ftD<{G~sHmqdA_{{(e5I zxIR{?`8kNPPbY47N#QW1!@Fgh-lt4UsAu(%7-bxoRMJ{O7PMA;SuL+R%$+I;UECAA zaP0XWxst8Eih6bdmcGem=gL`ed>bFydw228A&bgf;}v3Vy^vYTH*t}sJ8e5Irz2Ho5<$YDNPTQ{lu1KDQVz_nyG_s{ZF!-|Ej2H>XolMp(Y15x$lcf509 zNzZ<^Y`k}OH{9K%ujdI5M111z=}XeJ1-f2|Lp=DNWT?v*Ej7&BjKyw=KBj9VQWLT z7d>f>P1HY0u&Q{Km4CQ8dGz2-wN%ZIXOL6iqz2p}^X4q`D1DkU%x|_X0SlqGxkS8b z=*2Zy$6uLCdr-Oi0%E;<-O>B%XUE;`yjF}jO~qUy^E{&yUBXPGJQlsMN3=2QqE@`< zaRH&A)(d;RAXAj9MHC^mw@Z|#5vU&p_=c|v?s!Zn;>^T36Ars+jK}5A0nkK<^wQD# zOzod&Eqr1_yrUtzft`G(Lh+SGMPt{_JCU~M4Hh7lUc8Qt*%$a@;ysQh4n8{)bUyuu zTUD+k5={z!_^}$5X(S%YF}`{3BX!HK-R^ARi`uEM%Szu$m3+r+`EpwY`%3tr zM};wVvU7g!@jp_!Z&e4IlC>F?nKcy~44I$pBkCEX`LavIrryplq@Jps>b}IowK`po z0!=HzPw7yPaAV~{;2L?fA5{ozNq(1$ik;$V#UYyy(0P!;c#g~@4fz`r_ZL2CN@0v z`*Q=lIJ4_f)lR<5alv0H^M7M=|DIWEy%P|mAM%xiY0?@h^ISVZOba}hWhUAY8M)XHmNek#$X@+6JMp##+sU(Tko z(>-3uy5}loSUk6HIZSD|9_XBU_K6fR-TP zr$E%`JR1Xgv^bdpc`16@NhTb~B)MpW$E_r=;=rfW+zH#PJ1*Di2Td%{6&CLHz4yK(m!p)d zC0l2qpF9JeRFMJ$^m8Nb$tRUOe;aD@IL#ZpseSJG2^*h*1(N}Xfk0d2w0|Rh8~bZU zhl22173Npo6!a5Gu+7U}>J;mifOB0WZSC*gcW)=FxNUR-DV6D2$SFXcRCV{=S%R^E zu&@jH^}POY6Y*0YqriqZDPw>8pNwU;f0yF1Aqpw{srJ9$@BeSWm49MI{Z0gr+wV4u z*@FX*VLS3@Wlg!*}8v0KlA+h1y8W>Rl_Q$8a{-1UhTLgkA`G2DarJUwUqEwz1pf@ zZ46sHr6ciR_51sVdpAEUr6hu2s)gp~qW%PJ-Zxg{E2*;{DnM?PiAEETPd~+~Ui-`h zhMDbEn)>re{|S_nidTKe5uY4#sN-?s?H1rKp___#r+ih;!G8L%f8J(y?z>lYO&h8; z_rhMt70Eo_DtUf1<-sAZlJZ1-;g*LN_*3+XXO`yt+b{I7qo>xN1PDV-Gi&eEL7i}aI!dAJx;(<9>?u*Pj} zrL{!SCVbVIxmzy@M*NAlmk4^a20|4(-7Tv6SF9HHdPlPoNbv2eOFVH@ds|8N1t#TU zm-g!L+0(~{l8Wf!yo|?=pDC|r@K=%2MYEip23@{b8s3RKwN)eWK=8V^eSgpmPrsjz zv+1ADn#469fA<{Q*DNEKi{c?aQY4r=ZOboZ4&Gj=WM3?)TfIYR)jnEY+4%jiO$y=3 z%?E0p?1|Cz`fwt;e(kqrNtPrdqx43b`UQ)bgWC@K@V-}e&%pdJ8&nSO>88x={(0;q z{3un<)cxxY3y~*5c?Smj7v9AV@e=*o$SE6n36>c3Hv0vO53@DktHF5_|XDUe-^H{GX1#_+zy+ZEGVaQm#qLS9);Ue#@ljgiHF zLX`g`?wH8mXE1InvE>IE?9G2HF}gSLGjSI_{4vq4cYQwgZT5-yQ?Q!TnG^2Yy(++d z&t5h(J~l<5uD5_G-Ue9+Pwkgfoa2EVIwq3E-SQW7dk#j>@&)H)rx&M0&9;$Kq7N@k z>(lc^^Phj7>Kfd8usI{~VY|{Y##LRH72i@Ox<^|eB!iFbAIPsG*oif6XH6H`qUO2? zx10%1`G;MQsL?j>;WAtmGUP^IQ;?YGmLl*kJ|y4S8dM$cf_uHrguU%iA-;)taZRKXR$G*I$k)lUxZZNOt`O?O&GELY zo4CN~$qy_oE@lbsQ@y|osqQ7n>2*OduLC7tlys0=@)Z`QzP*_0;vLg=;T*0wpIG@m z|7$%dhq2Q;RD8;81YPqyyzH|5S_Hp!7CzE!x-hn{wP>pj?$TwO-L&_vDbrF&Jto9; zO6AsOdwO9dEnL=2n#cc)aklJSx3juwTkyCYyf3ETVJcNR!%y}R+J=<)JuGGTqkQ!C z;0@t<)dvxUwyB4I2)NT;1Kvd?J{9%bhUoi#7A>%(q6P@MBm080Gn^73UAGf@$CbS8 zQ*_@18QsL#$=I;5H`DS-?pPi!MA)70TcVR!*-whv?gN#y2a%+6g?S4!sTdkQIRYK{ zBCC1}jz=*n?@YI`WGQa&&3o+%#S4QCc4oA9arVv=`(<9(0kBAVew7>e*id>jl8jJzd1sA!j4H8(yJs z$@1N_`zK3)v9={1W(?#q%V}JKN^` z-W^4)Dhk3^IE67bp!YUov4ZE>N;)vnRvct6EFx4nAT?7CL6^uETn)J_rr4E@lo(xT zk1WPxKWwxQ8*@Cp`Z3CJzHt2O>6=%MUsRmgYqhsyZ3pCAwXLl&g-`>N=9vW!y;d`= zKk3_ZW2=#5U8BPd$EsQ*nasWC2PV25VcL7QUi$UCm^%7e<#n88H~OkyF+H zt(4MTa&msLq^D0to)>PYChMZVCF;7}VC^VFv!^~_r#j)i!27mYZ(;{;;S>=}TOo6E zSbq4sS$x4xU%@l+bTTh#suw>xnvXPi0WZdG~Z?5p{W!(i~?n#8#U*eTHs^ zyK<+@zN&6v5bi5%Hic&?UP(lBy{eyB#`Q1h3w-CDpQVVEgTY zeSfK%|Nq-_mbB|E6K%$O)m~Q-8}b3Vp)Y&mWp%ydTb=a`j>l+@Y(lMZZ#Qnnnp%8s zv07)gU|^+^1ndn24GeQaMa*4`lEgu33Z+KlFITQJzN4az`LP26aPa`sT`)W0eBmk+^!?nmpN0$U{ifnEq6gYU zc39Jk_R(}@1gfXWc}!t$%T8E5=T3i4D7&d){#m3Jp~rJ;WR1UHDt+-{zyx*h*Y(z! zQV+PASGw`eiI?Xt%9sos-gqb8mgdhM-Kn$YK=$hGdo^JD^ZdqqJi_Ppo`0rv`LfS~ z4acW8gHn{;*|RvTZyfBMTHy>Q-P?3mk)Z+Oj|k6RLD$TprX85GT`)3a+s z>>OXtOmJkt?O%Nn(0-*2lE8St5=#fHV=3C^d|-b)5WHGi7}N z6TS5~*V{%$MyF35zSSmJ+fzyWdhAKwHnxNtYsHj>R<#C)b|&{!p6BhR`%!#RUa}E) z(PqL(cwW#q!XP`cSTcu2c0mGbWhs|nglEx@s(!JWRi>Tn7gyik_38CJ6ak|W5tHiI zua%?ZmPSdk$XA@%iUZ_^=b_j2|C^2aWG_%R-0hvjAV1%|ewCy7(+`UE*E%lk?mw`O z7I)9N(kAfvrB1c$ZE)~Og6WHm5dE9rib;1FedlYsehKVOZ76a<`$kQb`2nkVf#EmNEZ*vj@Jy;x(!jDmocBgj?8{1yt`?SWXqTAb99GS;wPOnl#AW5P*@3TudeMt*TevII{9E7x}1mbgk3B za*WtwVWhkhJor>&ZHlni7PdqB+O+Y~JJVeQyCIkJVPj(>U_MZxDrBV=)MfjO5x6L) zv20-lPp~vU3;{>a7aoLwU00aJx7QJ4t+n-vKR`eb70Y}>)kKPN5+D5X=c6rb78&t- zvy%O1!$kRR*d->Y{DU~--Pit`eH}|D899*sx0Belu5$R=gJLPc1jB1wP$_=A@KJy1>S{!uUZ@0$Y zQ?U)~s0n%2d*;JNW&Y3%gRn^%vo8g5V{4nr6PI#RqM6KEv8<*^!I`*?iMNjs<|zy3 z9;RM!%2-%aj((iKCsFYLm6YJzx#EObVcX@oJ5E-^GaoNWT`0;$DD6u@AokUfrQ5t7 zs-*`p`%Px<)X@-8gDx&J5Au=5JZlh4_F}9Ft;py*Ph+3eWCSND!<>E}u zslGmMxr;EU{sO*FLM`)xPmp=r+ZE|cC>?s`$L($6{LzXWL&WflNYSiMq2qCc#SeQy z6=sbyDT1t3{e+Sx!<0dwGW<%EE1eek>Yr{M%Gz8(Hg--^&{ynAo_^ezA0;vAODqE~ zv0^!Jy(ZK-WPlj(mE3d2`Q$HuGse$@S6z8_<26rOFVG4YX!Ss6>0aA;~ zS9oqG=-${kh``H&XfbUW4s&PUf}txZZqD$9oGzNu6WdvH?*1Q|)$b5kVPAEen{I{d zM$N>p4)J&X)?H~zJE~Fa8q&$)uiql%U~Lx`m^D$oh8u^zMk5MjFW9&YE%R&Z33cdS zZ|#uzWQn|ShLS>mx*;dd6>6JtHSFg-iZ4~o6g@*1isqWoK#tH$AH76$BQs6)GAj#_+V~k_SEV+T!WOiJcOp;Y z8si_!pEDZCknpg`&A8dacvhvT-Bu8~=v$aFKw3?fT6(>tT2z1Ir}@sJm!!fN!nEsX zKv%Xisca^kNbEfFwB(TW(8HCgMK33b!G-L~jW<;mD{i>(YN=P~9RiV@wvWIS%%`tDV#_XcPaFJ#CQe%>_(MOmM;ppwB z9jC@Z2uBA<{-B!g;v5>-W4L0zEpV!pk3R31pyCtw*d+H3W{kY85wbcS>Dir8-R3l# z8CVABg)Iuv-X*?xjj`r9F-LPd&S*jgvVG%;6JoshUR$e_ox$|@P zi{HmjV9}D6TyHP9LFQxx)v!Q7A|b! zDW8pD#RHp7q~?d4Rrn}qJ2ZmZKiJN$W`XD%+!X#PR;>Ne(9XEv$dx;e zJLirh>C_&6@Zurv(TjeZw|C*_PRSH$2%h3vHT>;tmG#cYa1j|&Ml>aM^wx6!XR9xL zsB<5TRLjcj=4r=TPs;}s{?fDCDG%j5u&!^DG*gB(EYvy^Q2{$K8XmuXN*=V;*kFLd zAJqMEcUU-ZrR-tazCoWS#W1uGc$Iw~$vi+(m_lGr$2;#=_C0Das= zd%t-QL)5{Jyws;_Je&(lT6sSFz5Wq>)-rJT!@_vw_Nr}fkdF2YcIy*#JxaS-CzRBq{aMVTC1rV8uwm^@MiOCFYlW?Zt zHj|==*6i4%CSgw%ccveOl|w_h^$i{^sKde{lsVgmDgm+Ivyk`X-{uG!pX2imk9Fb; zlMc<#nu;hlzMn4fGDY1aP9>egzEKEm(KYJ{wDF-Vwv0ra2xtT0%Z#c{j^F6LfICYJ zugkhyMSTfRe|28+VCe3g%j|0z=cAEBlRq3evWGHeL8>kFUkSP}k+rYgDV27t8tYcp zgNBQ><7?h$dWylhlpCXhpu*Uobjp%vHoXMC6l67?V*C21JUQI-*s`E;;--BED4D}E zW6LJh@x_0?PC)!%a(5cL~z7n=Mtd#XO%?@F5eo^Mr30AK6Wb z=SMWn;<8k-`VWFxRyN7L8E zQFpu++iVEx(K**+W^3Y@&V9mxa(c>XB~b$OgFY4p7O5P1LSHP$4>5#nGrWd%uLQGD zxC$~hWb%oud2t0E#`)aah5e2Ags|jmw*u>ah=(jn1oWImNQ1O%9<&yI7`e<&sKSi~ zZ_a!2FqRs|YJPpHSWl>0aTu%Lx>0@B-lzHvBE8ev%IfVmgh)uW=T;}-aFxL3LVrhr zjb?)XnKIO7dL!uB)ctuCaN~F9u(iXL(<#}Y}8WVbsi-yk7@7iB?VEOpSo6mv2 zy(tX9j&?%g!kkgANqKil@yLf?HsT0(F*@AZB~x$0!g!U!sI71k(b{u5WJX;%CGQ!1ywmt-`&wISy25+cL`5GonwSlo2~Mc-?enmnvpH*vD!CV^yI@>Fh$@q z$>@HT;L&Fa*)JalZiM>eItaZL(6q6dpKNZ5^;{DqSs{&aY*b1NR^GG21VPI6gj+9t z;2fXj(XDw+sQo<4pLll9@R>MMO4B`!#zbgthwW%c|Aav02M3u#2;sczW(17ARo$^T z)GmYCIW;>wKWw!v#ka<;(@`kuYHAL*I{cY8_klZeRb^u|`v=aoLrAXFlSKB=_x2r* zNU7{*)mpcPkO<~OVS?Hoa-6a7tML!b-L1=yE|kBAF53!OjHT_qz0bA{FaLtNIj?XL zDkPR*rQ##&d)A#jxl+}&^J4k4b1|k0KHQ^|V zJ2rQ|4nfv3TmC9^r{A{T8c}6nirekT8&Owk=rL_i`^a} z*)(=z8!fxA5w7M?ssKl0sV3TiveS8Jc7fsSH>C1G=rp2S5}-xfY6($jQPEqgt>-^f zh+0KH1lJGaEtRxb33SfvWe%*WCK}wdm=7BkN%xp3(xYrt(%35G9#?z>tkYVpqn?FUupXV`m=S7I zP9I{#7Ja>*I@OwaSP#WzTFv-+FYH(@(~nS~XRYjBomn{vQK|E~(}QEBFAGxbwpu3H z^wDWfeT?&FdZb92*)fa{O64t~h=u@#!gI?uVnd?hTf+w5&7B=*B0)M-a% zu&@$5AW4n>h)PIR3qAg-)PeBH|4bhBmo@Kmlot&PfzdC3w5@1ffT>$SvY-hTau+x{ zLe*b6xGQ)sD zd#CSTZ3uA0`1*QIT)J8a*;Y>O^}-2vCT*`-2n%1d^F|VOp^@SxFK-z6Nqwd8me{FL zABw)qY=Jeh$i=I4`mm7I;LvZH18!=PbgO2wxn}GU)0@HYIClj_dy1(8#m?!UHe1is$YpIGkNBA zC1vc(%dLu4Wu40O_2zIMbn=f8C1qH-hkKzM)b*oS{ZQVLZMwfF6df?=1%ymnc%6~_ zl#z2}?ARyDSUMg@xgkRIwi#EktJl}<*k5-iIW~xN?~+L+Au}_St2Rsj9>a?f43S%1nFJvgVqp& zvCS!Vwn$NNaW~9wl*eN#if=xY5m^sH*!g_KLJ_vqoH+o8E6Lh-rXF7<=CgVo<_;Mc z=|i?aF)%I&IR0MIKZ5DL?kgy`;JG-*#|6n_O@;{t_lkT{(V={aRNSN7yj~jGnQ;Zd zRWavy`{W#o-s4b|9oa~|8vgzUcc^7j@mowC{v?myUE&uVfXk38O&t&qZBvlwZxQa8 z#ULOX81jACM9hB5RKGT(a3klassMI8(M%%4LiFZ6f%G5AaI;faPjMJ8EFD2FO|ehA zcIzq_D7+MonH}vtTH9$~v8OF{n`$mjNs1?zU4T$@ z-;y;3h`+8vZKQ#3iD@(3{J5DGr{qVyJf{w5{^_i<{6#C$dr^X=XEC3LZQMre=BIm^ z6^K`7QKb!qfDWdaX==8@rl0VOTGC>!zSQA?1ysG+tjt4~?OX&9Fp-QGI7DuWo=9(? zlE#J>!rDj|wXBMj5dPif1;5s;ZgUpiHdNmqEFz#g} z#Ns`T} zNA^(eT*D0{sCXPvTxk}h{vNvw=uq&Qr&>d*<2V1U2ea1y;wb-**cRf8UFrqT9Q8zh z6$6mh{gKn7XFVUZLShB^Oi#jRu<0|d_lMU$7(cdc7Cqhc>5~zm%^b37Z|k5pFHiHI z&dZ{*7tj9DToZZ%fRisXWO*Q#=9!(@lOFU)+M~|#hU}U;>-HQrF#NpM!xPcNZ*@ROI!LYuPX@OVzBgmyKKsh!DQ?{!h6 z7yjWe%UQR~Hnnpb5V}U0YMIgjE4!kpB?yYA8g8cVLV{J`?PvGqJ?B-aRVCw z;5nFk#+I)Lu@-L1vr5wNFZZ+`8h^Uux!a`nu$-*T6sgQ3zsuXBV)#`;N!sS}{q@DH zT>ow?@iJppCG=@}|B=OXFaM1~NM`ZC)F;b0<^zQ;j3uErIKB2KxRHpgDBueTFt%^{ z5(Zndt92aiGE@89yzmFT%3ue5`hl(8o5uY8=IEZLTmg9-+j_t1p-*NSPuYo;lqVtn z?ob7xy4vtM1?A2%5%Hafv3Bbf+&Lk6RdmJ2ZN2I@o0khc(A4v|kBH5g6~I!b&TOVS z9FZPeXwz6*kn?>xlo=cnG;ABtDGx5KiW}^*B3W-AXv9aae2IN2o3@mOLpmPtra?rM zAH{0gRMBw|G9v&$kn%)%Mpzm+<aRZkeWrB9jvQ}HPvwFG3)cXR)mb8A?PZclr9t)AK8~U;I^@SP;$k}#o;tpk<#vMGtBr;9d3giekiN) zc3N4MAkE7|(tG|Fx>s#sE}OXeb-qOvrI>L2PyO_to$-Gy{Qb0Eq%F9KXt@nu7iU0# zwpqy1=K2})pHiQUFGexUD4OpJ*YzjNnioGdO&NFCEazdj$`h9Ff3jRDwvWla-85j= z%$4_fw3CvHKH1*_W?<8)L|b2#wwB(N6{~joi{1D>)EZs zryt(yaMI)qMZM@-ufx{byI6Z)kXXeBKiMs%JfT~KilyxUOiT$spHiELof@#4c?T|i z-?90t!vegA8hBhsQ9x!)$5uFmkJ^qt>BMDMpXdp~Taz;06SqhQ ziEMO>$I~%&3L&q`^dal$S9t?n+1RZLY)+e5v5jjiMWkp3wNjD>> z)hKu&QpI`RPh-IoT$ZU3x^Ar!kcjHbmT1{w3d@eZ$r#2#j* z8_#Jn!C33;QJnA4riWuR1o)k*$2|X0B){YT5+J#f`tnU+3|ewZH!$kkKKnwyH=R8# zbM8eV?q~aS^IEh0XQG=LL{apq`d)n|)hZ;JN8*m-!pCMCliPQIYr#zzL)q-De6#5m zxLT$)E7gP(3h&O-sz_~aH`eSwV@4&2H)mds8M)WtIJf%p#tUG$70)x<(5tz}H2>pJ zAymD@hwCQye(?L5WQj0lJ3iH>LYTAI5@{n0jnnFM1^LG0LES7HKzL&t@tLU>3&z^) zcRyHjJKAEJW!Zuw{#IzDsg`0)b6A~vB}7X?(MDSf%Ae{>tbCM(L0Q-f6i)$HLVojT zeFAG(3NXVqSfhN_x8m<*;$907Y&%(j?qFsd1{K_c=C@0E-JFd5!@_CwY58uFRe!E` zc??V>uikQlu$bQjADVJ9CjCgJc|d4Xzh_TvO~XhPOhICh!B3 zjtl9PQzuv*>$Qt(Lp;OZv|lZ@W_Fi(s%&6A<;-j?GreeX>?_*@@2&0WB*YNR8afQ< zc{9Gw&Mw^v`?18oREq#7R&ur?C?2%6$$>+JnI>dt`#gOLx8u1IJgc!daTu?_xE0mb zcys{lZtYd7>l&Znm6H?pZwN;>Fq;dq!$8X{z9V$sV(@4UHhJX)8>e?JQb`+gBa)8NcjIW!1>>#?&F7umgbPy)w z-?7a5PhrCb9d;$>4=@yKy4K(`km;-;Mze5jX5nl1+K(y@&Z;(a2>e{@{ar#$;vcj^klS{S2 zJIQbFd>XZB1wffItm3iG=**39B@Z-~USS9D7r&dtI-0_rs@XDn?#>XoxW3@j!jp@M zziP;>A*@D?UU7QBnT03yBkMqA;H~yv_`nNu=?`Ohb=34A<-7pLC?IjlGJiuO|A6yV zdr?qeAfgf6cwHORkNhL-&F$NHQJ2iEbZ0(CcKW|5Qfgjp)3vg46d(Q6_iJNf3RRB>h9x7nW zf)+e3as|8kK-JF--!oYgHHajLI!=FZIwBgAixi zqgrz{2sX`FYjPPXR5(ZAD;QLDTLZ_B|O=^$?_XDHB{@!4>bnq~v%61ms*; zvp*;9y_!2YQ%;1TXNQ(rJbL2;P-i{@-YStOSj&h$>|wTDPMkns(Qc@!%{Ufd%-AJk zGgv#~Ef4E?q5%D#Tk8@?FKes(0GO+|*}3{-nZsu3^+RMO&NY&Kxh=uk)ythO5x4W0 zZCpF{x&u|mR!7>fWkURhq4YK}e5qYOhO>84hNv8XUs*AF*{wPJ^P^6ZaMgEjkK`rX zSbadmn1i)-$9~fOBwqfH%OK9$*W3Y@=#6X%J4Zk&aj^@uu}+{@%^UNcbiMipmju@UxfmC?HhF+ju?JbzYWd5ganRXdzi6&xsXddkz)wN#5v zR^TDoOO$T?mH?yXS^PK1$KKBEdtrXI#HGhUV`}wB*z*@OAiD_^*>q~GRf2~;Tz^$D zG7ad0YDHc5{W+%lcOsBI!22aXzp_UvQZnHEG`?){k&AE-sQt6%HxOs{Lo| zV^9cnTl?a)&_#!Lvv~K;&Dj0V6d64WnvD+@H9;KVwV<__LTF?6BwwU5`%?Ux33f|X zqCT~GowZdy9cM|Cu8epiByO*D?L*${x+u52i%fVd1n1Oc#QuDUhz{W28LuKuL?DWK z!fV%A^plUI{)nscj9h+9Its0g7yD|&RMkr#t1-+g`w^zi^k;RJHHXt9^Q%aXwB=Ic z<);ar*m-M{jN;?e2TN1uO%^{H%43|fASvS~BX~EHkXIez(}Skp999H}KC9net&u=U z3PV})-sL8D)q9%bMGEEe&*Il)GE$kFBT&RfcjI@T3>9dNn15%fYf#HlRm$sclrr-h zWLiDLp9HPiyztm9-PVuUXJR}w#^Iz&#)(}HD#3Pzx3X4n$WiE~RzO?Mn5BZ`iW-))_B z7EDg)EJ=tY?@g+{B9RH?N4xjWUsqF3Pndr0UhE-nc!9}<2MF5G-}w?m@H_Z?rG##uHXw0Y8WZ5!K#WurPwJBHcE<@&%biZAe+ostj%4 z<;F^tO29j2S>`AI4ZFK9t_j&Mz0Rxm-mzo9fj(tFlkXcHf-$$6=s$kQpu(1}kt)32 zc`B`=D*NALdORJyM6vB}DY)QXguxDZljYdbR>Rgs`A*3wxBM!G?2}>IVU80XyZ#kb zWar?0f(>J>a_7DC@fXtaD$3M`Ms%fVks^+qa7eFBtq9xUD5T%LacA^PyWEe%g7Otk z9VtUk zMqu$XCHXxw{-c`Xv|-JH4i>sUsmV99k5lZQFaJOrO)KWM;$E zgj}57oPThH*{%>T9TJtz?tMBD>l$BAoh;1gECh?kDyFpD>x#K9W;Jla2N^22pVE1t zt)_RM)s2Tuv%A(!E12qMQ1o5=1Pf0{QD_`Ujkm1~9O9x#oO6%Ire#Y5XYU)e*w8-a zL)W{U&bIZl_D4+$>+8>TCh4nv(FY$2z0ys)-12JNdKUi`m>)E9bF~K?XXapgw9ZdW zBj^vdFS42lW0jME)!*D?7ueFH;Gs<8QI~YOh?jr=w(S+m_pfU_=VzxtaWQU%0gB#E zPC2m<62Z!ZbisOP0T+);)wIz5NGChU}Mcl%h%`9KYExYV19F`Q2g2fagH- zTAI3l8gzWo_W>0jwj4zAh4U2M=bD(@30%)3#Q$iK2rPmEiUD+~_^bcfkQS=1u@o~ zziC|`3Ylm>N;S8I^iv|99Y6U`UK94%uil2=Ane=*em##Y;d(UZ{*(*gLYAu_F@OAh z(i?*`LuA>Lu%8O;a6xeBl@@i!ii9Hj#ym83ifB>oYUykTNO&E3%wg=+`*$bWEC@rZ ziF}B(!EAQiS|V7VVVYN)-2F--m%Y_`TxW8_>)^0J^Y~R4&gm%B-h;1w?q5CSGA-lc z7TuB-iUrKcmYhy+>QA)`^Ji!tpcVQ0q8+9f7$nd|!BQ7KHbrIox`XNql9Z?K8N%X( zHTynat!PL4BMq8iGcLds6T5RrflQtV!-N3a>frBf)ekYl6jjLX1V_l(sI?RfyV<68 z42*^C6Nm~tj0)9oJG-h|Vr^+_pT17+(`L~R7X@NugTb$UznGUR;cZDv?qgR6o^)sQ zOLo=NsI%xzLWA7i!6uOu#S{Ot%;>wnHcn6dzDH~+1w8VW+pn=Dp=30GwA9ZdB>rC^ zzus{VKi*w`EZ-ibX-wa>RF}|7pMNthf&XB%;!^SU(niTP1Z3-^^K$|QV z{W!WooEY7reFQ9ihv6!qFqUWK3t~1lx%8M{z!3-a?WXgb;`20dbmoJ3_OQNa9MmCO z)b%^)3qrWU%5lV1>Xy0iv-ZRG3Hp(3w5fV^UfwkUF0mBhm&QlfkaedI$XRow|B~rg z9eeCWNkLUs1lH5UD(BxwqPKN!hW~5j2QK|VqE=GW1>S?g8l_xM=ej8b-p9dD8R#* z$Am*vPjEDa7hy)!OH=7SRbYqM=u=(+yaNxl4 z7rfN^Ts!^afPU=18$kT8zz;Iw0~~WCyo_ib;;pbqS=o`eD|_o>fyA^(n!#_^PuJgZ8!2Tnz9O*_9~G%!gSvA zID~`_C#eH_SiH#G)NJ_6ZtI~aPC9y?H~Y_07rhraTcKigpU?f1iMWzPuD-s9q`AZf zV4|!5RLD-`Ma1x$e*`zS?=S6?`uE{%W}w9dr>j3z?%$F|OpACisBB7nbfLGYU)@CkzkAfb-(_ z)cl}2v^y@mnQHq!8~N*zdIqx;A#79hbtZl+-Qzf>&m~i}NlZiuzvE^N^~? zkRyyYs_;Ce_~yLOykW~ZK6%gO*@i2*U7KY*a%bhz^p?!;Sot_KPJX8f55u|N zZuj0TGgj{kMH15|EY9brL14jEbr9=uE@Tr@c{0Z2JB4eRUQ`6!`l zETj&sMW5Y`4kQSRZ=X|+hY1`JP4@%^>$ z{!8Ti$Lq+#2ynU58gzcbApGKC-nsqvBAC)ep&R%A_re*$KBM9P>%C|VQ)lXXm|A-lRXfQyc4p1 zIvI)3@e=RX7hQ77Dy4=5#@7f$3WBivnydMYs~^fz+M8;+UrIEK@@O|Y+BRpnJxTDV z&xb;>pn&Eg2)~u}`$K?ptKo-FpMEsQpXkBfJ{|nmzA6#iy(1!Agw5PZQv8oY=AV)F z=id6y3jMDq-_n3lvjRX_JwDQ^F)H!8ZjQU>w1Gvduuf7GmznhTX^Li1Hooz*|IMmf zqD>zZ07dw?Y*^FdA}!|5su_%UscTXnTy2quuk%SXSF{B5SE&OHn!dw$O<%wgsEg$X z5Vj7vqU~r+V22FhzUwK9xE(KO;5Xj&@X~>As|{COV7J7gurJ>nHUo435TtP0rq@d} zdn?f#qbMy+3FVtt%JW~zRi2)GV$+|mJpI5BCjQ<|TX9}iMvg}@83|}TRZo;wpb?vG zXePD10RASBHm@|pu915!mT#`wp9g+1F2^B`1cNC2^CyCRK zLM;G2XGJINQAOw4qeb&0OZQ<`Y&HJo>d!sz>K}xd7E*onrX9Sq!0LCpWFx4Pu{?mo zR+0{_9gcRGtR+kHQm~4oYe$;y_oNYo182^eH7Vsa5S+6VBm3+HB1@TMqi23W^wI++ z+RaITu0KmCdxadRLb4 zS8<7f4kN9H-S<*ni$D<<~p2$i5d(dnD&O%qL96zK%%D1y?UNz)2pZqWhrOQw|+bd8Iy60QnNU zW_onWDboxr$WCq052;IMb|&f6ck&wpVFhXGx3n-pQO#jZ5ATjHl3F(7G69{S=QACV zTMaeo-=1@zo~s{TjAlwt{6{h7v`K*Gw#e1)S5k z7iV!iHhFXZZTE_;GV@4>1n6`Ai(Ti%QQu18iaaT-cbmzeO+2kUflq0ttQD+W(1bXN z=}yIH-pxw#XH4jWXZt$()cx1?H(bdZbbG%-!Eeng&5jHcb1OU!0;x*p(cn)>VxF<* z=05nBzY_Pij$7=4?rc=8*P3ktEyYz;hUjT zEopJuv>091&X5LA5H^nm4@<`u-Q+zJbzdyzoUX$PD(XzdJLW)MFUTPJ~P=@rw$M4u<@)w8bfWf4clhhhBen78=#EPw8kLavzuoi)EeZhW{hJq z`s6~B)jkJ@cgViC)&>{%%74E343cSs04qTjbTTzlpx@gXBc?)b4pg@~%3a4(rWg?L z^e=rptI!PVEPx7hNcpBWcupt1eIz_atY@Z2_fh|gQptjBtZP@?L*j$5U4jiYTz5cU zu4mn&$WZF-&zqsKRr$3i zet#7AobS?K&;QF0*9xzFuq9RYg!Ct$qShxjS3uGu5MOrBAAT$8{#s2&?2}Gh`0Tk) zg$`@q&2L711STA|qV%ajiJc{i?~*7}GtU;_wwSk8>%2&lDci+@+nS$5pU}-nX%;uP zY3l1ekeCk;kRNRNkr~ehev*PZ92G2Mc4qG5+^N3)ncc53Dn%B%bM_uwWS2BvdU#mk zvE{c1;wpC6I{WTv!(J4ry)T$9m5vneyY@3$|0iF6JIfunsJqW@=~XDZAe&QWq7S8V zVhBSIEF=Mou3&$|;1$J{x}D9Ta%Xd0MjoHVO|FamDEIZb`p(k@%VmEqSKPNByuzUI zSE-jxcgCzNDz^W6@OKuip>N2x5!&|6LC{|F-^Pj2!0@cK}L7Z5G?^D4Itkiid^Z-)>V zrtr`WW4E42i$yN&`S6dDpmV(zJrP40+=zibX^j2u?->$rL{a$-_l%w_nW`)tGjTP} zeee)&xe+8u@e1Pz#($-qm=o%}!H5mgAe><4|wR|6L z?y@sSnuaW;AIa`bRmXq#Ml{tPpBE6R35uFfefySV$)Dch$iH%olim7w{S<(1FPkVZ zl7WTuNzSW}8L0pAO8)d^E$Z-;Yv!iD5ch4lujzwP=Ar>hk!nIq@Zq^tHH`U&l-;wr z4Z%aoW)F4J9g6$r6G?*=+&Qm0c&^TgR=yREJ$m|L^&a{B@P{+87h}cpLr+b`o{`0g z`;kF-Jj;Ejv+;|zlFoL|no^Wg{7oKA{)UN!l@RX-Y%VMpr=H-`jHk4zf@|K9_-F+jTo9 z-KaY6&x*1~uSS;>o<~M?KlkOzye4p}~Vu?}*qOUh0K}*Po zZ+D0Kih}J%w5bF=59-ciRR}8GdVN^!7$bGwm|MMcYL0HVbVB4uXM7#BrH;lqTJF3z zv5D)7)*dnS3b>uDyu?Vm`+pKun$Qd5UjI7BF)@j9HW>|(cwH;<53-dN?;g+Lis=5} z&0!f&*E=T(gy)^H-;`eOoP&Mh`qDX}){eXr{>}F0J8MiqfmDK2^;~t7#BBwx_|87w zounX-snd-OvByFDBCw5?$YRa;!P0z?8W)UNnk)T)f9K)$`+glryHg5Wy(n3~D7d5L zA}AOe{ztrkO2m{%enn5D$`vw07P8!#!q?sw+Xa6ZbTZKz>N973GcFP@ zCbm5s6fh2Rh|-&sc))^anL}UPDX0g=l?wTcjo^unf*DRMK7OAlDw-8 z3g5n$pW8ckccPH^>C+DOcZt)8uBZGbm`zG+$*-+Fs4|!+bFC-r&OSc$eaxD@dEMgR zVC>f0b{Xw4sSPS;Dqmbl`*lrY0d8Sjr-G+xdYcy9=mwv<$J4`!HXRE!15LDfm)xs3 ze^X@OyR5Uyog)Fa$<_f5C5OLirlhjJE!>XtYnm#5F7-zUS#`ivU+ZC#aMRkJ-ottd z($nYle6x(f6Bq@bhX_m7=?G1&M@?S@VfK3y12H|`xRA*VwfNwppDzna-4ok=t4_A~ zr_^ws`+(eEIs012jYsqhwKXz}|HsO1YohO(*MD7=|8p#Mz1U@gCKnb}crR$F$DeS$ z)~@^O>}B3($HqZ1=++EhjUK+~^X3`4Y^rIqy%7GssA1EOR}UqYj*8rf^KxymA52MN+OfHB9Z)41-&klq_`@td3wn=?Y(B~`l(szC7vDBA3aO^p+5rm6N zU8FHG>UGRrFeBRjoY2gvYwgIsGHrF(^f}}0wfS%&%uZB$!ombWj$>c{?9>B~?30YI z1C>t6!lAdRoIVr4nMfzfo~N&0J3o2gb_eyObJH};?H*Dy_)?%jHomoIh3&a)Ga@MU z^9q;W|3lha2SgcfYojWN7_`zMEg&EwT}q0?h;$1m$WW3J1Bk>7IU>?A(p|#Pp)hpE z(2_$9ATab$-|N2j?0xQc&$-|B+`osI`OW)V>v^8_thKNcta@vcGBqy0{uRqB)d^Q} zoZfgk&7cw_wC7;MkB`<({|Y+%$WVIC9R1;PbQ$?%9@G*TWcA>8mS@Z&t7SY~{ERqA z$R#we`S~4LYiD*PJr2>*Op~@QL`ye*Z6ZJYq6jJHwkx+@Dt@-;Z)r6EOl|y`)W{b_ zyGh(=z>eZk@xqP7&_ACww_C`%@JeONPnWB#4OxldembZNx>6Pw*?No6k^+Kqc}JSK zaZUcDTUYaz;L^d%u4j1)CbFX}a`F*i+@hBMzO$QV!)t}n zCb7)gc!+wbT|Nbhf3xAh<|O}fn1i@d1NG}|ys2aywq32~Kb;j3Ar~l-K1Mcyk=*BB zPu{IN$)wiCsQT%NsdcLVFQAHWjj2pT5DRDbX_Xmrx4#fC1X;{^jPYA|<=Zqd_ zFlI+|0k3RzbRjgrY!V^4p9^1HYZK{-^@XL&`5lx>Gk9$2p63<1ejd0_R*#*hA;p%; zN)ia6Dyo~ow|pt9?&BhLCEjYs0nLsV+=!{)sIrA%r;^ z2nxXX1P7+X-L2lo6PWW~CVD~t8TkIsk6%Fh{VO!~$k|4s9Qw?Wgd`$H#a#hbR9GR5 zgh{~C5t<46%zeRDPHB(&9DjR8WwQWo?u;!>!>Dp=N_s5k$uX*)VWFlCnr@qS4rsPt ziCTkODljR>6bBZ~qw%Sd7|i*-?HHz@o#ghibt-Ue0>L$zi!PVNn;M*ub+ZX~&jQc^b5#d)RfFpG`_Ij{VfJt-Cn zzrg5VvBBo&F-H4uly#tVTE1wjzLU4(>ZQ_L<1vMs>B6t=%HFw>2s{$hf}&T1Rv9|r zaD`jy6o#R#q@Q~WI6oEQz7%pauSi%b7ZS;ax+Ky~#h8hsEUaJ=eCnfe{?FH@5H9=j z){!h-c5A%_twl6Zi?D!BHNb<5*_}Yc8AC!FZW4z771;a-P5kG11#r>@cqz_SQxcJT zEpWF81##bGiAH)x?2r$YFN{PYjh3_{Tw?Nz6ik1ugr|Cjct%fja%-M;TInz_93WND zua$Ka>@0`e1@IJ^-aB$=vgAWeX|D-h*Ge0-b+KPTdRmy4sdbRJa%PZ*s2+}fDvK0F zv@2X`!StY-YJlL`AjO%t^EdX7@=f48GT9&ziQfI5CA7JOmp?Pxd3oqyGJUsAAR^e^KQCo z%Wu7xeIy}~=u9!|%X_{IKFD)t;l#FL6e*lCip`@9z)1PMtZ8Pbk#Na1Y$>E|xk2@$ zER^9U=+$|7q4}$DTKh#^ONG%G>GfVoc42~K91_uO6nn0#a#FO%I2o+(BBuUe)F7QG znX1g5`ezAi8PZ~LZ&tF*8aH$g^iWb%h7k<>IwFyF`3p4CfT((wS8f~8tHkJ4n~KNe z`@af@OeXFzV?m6vV_1*_e)W_~{~Q+6$u%q}i)F=FZ6~zT10q0I*%RY`e$Rgat^fHu z0i5IkVGLdiw2$YRX zx#&z84i^y?DWeGN3}Kng!tGK(^Fr`Faoh3UsQglEOC-xdOGrt&jF#X4J862!;VW9~ zX`piCJ#g7g($y+slcqWwh%*02)G06utNW})l}u_$`rbZNkK&vOxs1rFo< z?AZvJ7TH*LZWDghBUNxf*S~FufR$S7VMRYk{ViOYrBRK(kc(}b#J1}H`N;q6QK;R& z77CDjrqit_vfWW+b6SL^z3+tX31ZB4P!uQI5a|JzFRZxF#Y0$IaDDJ%A&>J zMv-}evKX)${=WIF=n$5ggaZDJ5LShMi=x@hdYLjX>T|BlhZo*+ikL=b=)W@a{|0~m zBQE~)`~R;F$^b{6@PU21(+!tz3(&1V;`moH3Z4<4?c2idLZcG{SP%l1Z6WV+(jf0S zC>CSQX@|)mi|Pe(wWtLvxo$1lT`&L5A_~i{aj%`wkA>oGp97-?Rn9xxIwZGM?|2-% za+pLqtu&;0|5(-mp`YjAZGA&6Wx>?+>Y8 z=}-0X#VaIq7>Ql`w?6rQb6Roagp|tu5@XAq(=kXwk35sGQ*$QOtI~AYQxh_q;OO~Bew=NlOhyu4KQcf(o z-V5;0B|rnZ^>>u=e>)Gg2Y+q}2h(}+6RuoVO%8~XCv;KKGCploemseeG}E#Et%hS7 zJIi7BR2XLnqj*$7pHW6#(caXA(y%W7@&iQL;>&_4>jQQoi(+YOFx#+UOmfE{;+(Jg zu}b6D!n7h??)(E9kplmfT)L?z49`?1-j`U77$uLTV+fx95)UU~4WUs|zz8#RqaJq`6mb{?l2GM8Qj)_{ z^H!^ zWi4F#c|mW13UgqfF#8F;sTXjqaay;Tn(b#&_~s`GWXDk89D&^_yI0{NqKY1ilVTzX zhE%OD`7QIgSxM6okT6}D#oc^3_`CA$df~>E1Z-Nj|J=v^q=0&ind>nVm)lAKBUF{#rzWqd0 z&6WLgS}3eRd&F#>W<}As2DU><2djxFYSX@Jp-0Glk{3K5PcqBywfJOFn+dldUO*~z zJSqi9tBZLmBxue!X|#L?{AIYfB`Ul3vM^?a5g87sWHJ6b$b?cJFsAJ*jM5AhXj%rxBlMDc_ZQ#?yvfta1Jn zp}L?g6`LRMC`7vdvsggTN;M*`U@mg$(vLLZj-myZ-+)YzyV<9(m=5#vaN%x|3@CpK zX8plm4@t5g+m!Iro@z;pthV|mk@&ar;5SazD?Hy7*!HSGVred?wsv(o_tyI6K!x3S$xyLz_2P=zq>P{$ z;V>ef;8lm%$j44T(v0KJY+YdpViqbtHb0^-8>n?Mo?3i351f-Iow|JSMcC+zs716~ zVz=xuk_8v4YwmV75nJfjr85?rcBBtNbHinpAs|aPzk@gZJ}q@rVtDdKJ4ZazP{rsgwYFh3!Czpr=H+%dg6;+euQ^Q>ifFOb_bnQ4 zUQ;0`{n$P+SwxZ|C~yxyk(6YBg;u|;QmU0;AH;hu(uPH+?Xm5$V&QOc>l0j3>_vme zi~O;0zF?uwx^8iYS>S~u?wwH--OB6vG7Ro18(zk zrNzFD%)+=$44dhQfylX)c#**g6hP{IQ9m~KyD}4nZLU}E8vUE0^gsRBAUR=8ag{b( zYZa(^zv@i@>SO`RLX@RRxF}Hl-G!j^ZP&Ap4BoYobe4kGynGVh#_@E{sFB|4^B>+n zYM-wRkG9>pf2@#5m4K=*!nfjigsL8EO7vnLsX?1zBmpDDt1%)F<^7q`nl}QLhB28J z*q9CqJ}vVxFMl^|9`(tYQdea7rh@MiD(C}{M=_EGtz$2%M&lo2;AX)s@W7db+M)92 z^%c&QKizwDjFWj68ELZU>A5yKs?I2D zPw7%=enxEPW{u}V&~=?gBTA9}_{`OFSDD&wniMy*mRT-lEg9A@PVtBTe)FP8kY)FE zc*=(RpPb=c;`hQ%xlv3>89FiJ2~TWasi$_gA+*Rp)CQvoXStxYy7z(xd$xLep9A#? ztJ>u_J6)T1eaRY%v#hq4PB}vCBsCF>ypM%lE;#CHzOXGk<^#?U=J^%#AdUGwJ(7#a zwA_ot&9ciPPfq#;xFBkARIK)vmWIncIO*ya5kK_n{=HCzH#U)JtA(Uqqus$sd(49n zL-(CknUU{)8AJy?1^?F;j{&}2aIg2xT2)n zI^)%Y-$f#>KGU!B&X;p#F0Jb_Iea=Uk%(pirke||u>z~s{Rx|~Bl_-xthf?MfazI4 zZgl{{-qXGNpD*sTN4VYIPVqtr*rl1)6#gxd+%Z)AIISVY{n#m4G=oiKn`bpkt)ELX zh4#Xy@$GbM|8Vnrje8N$5sOiWan9VHtD+c`tM)$D)k4=ji?ui#}}|CAEwI|>B5a_&AiN($=S91$7%)qQ*FY;g3Bb(!wUwPJ(?_S z%YwxASK2ynRx&>He^1WXBOVOi)1fb^W&j_B=E*KL7;`gQP#&-V=gr5D`ML-Tw0+xs3k- zs02zzCb;oz?T(M5(<#@yKC}egylS4|TgRU;t;Y&Big?O-twFB_>2S}lHwo(4z`HNgD&dEBO$0Sh4|yTtRZd+FKEsr z@Lc||RQ@QIJwh2Oc1~x~oBFH&pNi_gkmY|0hyU+7zris1JIBX@sNUVBjvI3(Gx^%N z9}~LL09Y$ZI6wOIEKSHt**S9`*CXik*va9wNPx__7h_6ygu0bCJzLUa_V+Xt;;_%J zImr>I;=9cheq1dq@9p2;%g;3GU3|7UE}0*kmxB`ud##j)UG>l18UN#Nu`4I4~KqVhE!qHTTJ5zBk?y|`hv;mw~ug-qeOqOjG+ZDJ; zHf{6d?w8?MM=y@pIow^1!n%reyLW3GSY5Oa@SH(6<5>JIg&hR?wvwhvwccm3E=U zmeP0W{8k_|-O@OKWs?evF0c4gmESl)mP(T~x}>TrHTK*7PL-{FPeAlXi3}$LYICl` zkq!TYoBvRgaH`6|__G&{&A`!|fAjr07b?N(f-&9un^BB1T(k5dT*^6GH0xu|omMIU{vT&f-h=2AZ|s>RreN8YIk zUlgP4p_ji~p-9LxdAHQ$Bow;ZnUv`Fo{Q5f#YLob`s)MDTBD^7W&g#!bF19AO|Q!a z(mKn~@%v`Zqe^#;C(V7o_RMf(kUUWmBK<1&0E~UQcCvCcQX#B?_lnEQ9X?Hu#m;m` zGeQ1B8R9V*Ztxzwq^^!m|08c2ehSf_mFDFSX2ong9JSVvKG4xVFQ-y4#j|@g;BXfx zKpGmo8~x$k@Shm^kc$x5dP!F?!rk}RR0ycKkP=E(I*IhKZgMxj~{ek`3g!@zbQOlR?rD_lD6ovLnRRQk?3$~SB zF5|-6;JcQ#h@0|Zo>|xk^Syy0zoagO{rm2EZIxdw*2)E!hcw%xU;1eEu~;}zJPj-*U=C+B8*2n zN8n*)|Aikz5zYCSd1?PHseK~xdj;V)W?4YU7y>q4#MKVz)fED1Kcz}mGP27Sc7w-^ zBllB0@IYP_r1+U5E*`sfj7ugBRk;fl`1Gi}pjaBe>RzsGEWEp@&4t`ly^~Q>fX?;X zB9S`JPp`1lPQzO%lx_4*+0Dwq^G6L=eSu)e?5}>q!6zFHA5gj29sGCEWHT_6`?WodC1lcZ^+J(kSA8vP*;s6*Tgr!YVf?{t03AIa&M`JZUdgDJ#6 zXs~11uBlF)#oJ~Jstu>V>vwlMSUSG<2r&Grb6%bQ6m0CNBE2{BDUg26)TX!z7%}AM z&PF9x7Cb^ta1GdP5K1O{d>;rR41C3v!)!k10wI}|HPq|dgpL@dSfYpC$HAXd=J~=l zQ7Id2eO#^-xeOj}^`%8n(RaP5S!8yWcWn(Pc34q72tzihjRw+`7i|=QWz^$8&+n5hBO+L68gMY?cm0w*(qK;pHbBD+{YmPQfS zkXe58s%>holIg*HSsE8|@a_<`_3w!7)Qcg;BnWQ`-(qw$}KIj$I*d7ExS#CQnnSLG4Jas9b z)|^i4t$*;$><+Rcl7U9pravM(&WJb8&^obg(7EefG_2u9R!r0j0=81m$oG6hZE9~w zXei_#iq^m-0%&I0gkUbPX9;v+S`K61xsko&%$O0Q^VnP&o+yzrE0F>@pe$s@P(rp8lSCNpUu?vFAtm=PV^cs z+LMQJj|z5A+{Z3@6(0GW1$p8VZLClu1E@;3n612_%y8kO^hH9zs? zXE+&ZSR1hD_8yeUd*_-JH8RH7Ggm#eDsQ@`>2JBlYeH=B(`o>CXfO;#U}KH!9#!u| zF-cYJC@co|*59Y|y9{*a+V$9&62Uu^nHA02paBp5P0!8x?T$UcCPu3{AOB|#w^-iH zmTs5#$S*Mtx=?&X-A<%gM;GclOF5}cZdKZjEXGa$esHY0Y5QX(`5vS??tAm~Ep`g8 z8{Be){ICYf=vRppo-m0}eTX6?jFXF{n={U&CVVD@c$^|&AkWiMhkHCUI!{glb$<<2 zrmXTre~jw#>pwD_k??9Am`Xur_ep3pIeWc*?*xVABo#yx{Sy9$_bA-VsY~qDHpc5_ zLAr*JJ~qhZ`Bk=g2_3(eZuXdP`{Ysi&Kp;l3FV7E_V`$8%a*Uf@O)6nS+7@<%UX6L z2eMb+zyB$};>mXlo6FB0%i88Z4HM@aS_<1W@le+X!4SYx%ICg1{PGlcl^Q_R-%aA*UYWlkgYu+fF(h+ndc-!l3# z+t{|_E2mueo7tobAwIGO^0ysKRpG3GL~&XtcDc2o4KX7Q4WC)~mA@g`uUz%mnP=T? z-*7^4CEHWRpYIMocfuH<%P)?aFWY|J@a4k}?#*9J zb@f;GbdE-{f!A`ZaW88W{pW<`mbE1CziOt;_{F>15uVsv1MTsOFl<7ZvQ5?h8 z7P;j=4wI{Bne<_J38k+2Qy`vePYji}2J0}PspTHm-sZ2 z;ZqJ}$@66pIDN$2XS4`E6=(^NYGj$Mf9&q4mcN_h^0N8->^j+kyRBpN7b>C2*OzYS zV+$zr4BJs%jp#v3xL}*qI+uEvO>l1y61QsZ*#)WI!S&WUSA+19guiN}!24^ov9q0# zK>Ym^g0CwH9ZkOvJU(Q-(S}rTdM8vZK9DBN4S;Av2Sm8*F5a%R4fsCpm1ff!+7%-$ zfu%=bB7cfG2TJopZc=y(6-L9HU&qx9mRrbif$`#J5|?B&sO5NbGkc^R9zM$smz|-n z+LEFFud1T|4I`(fyOt{D9&xz!?Y@ZF{73Z^@$&mKC1owQZa);?cdABx<P5a|B|1KZMG+it$}>rE0V ztT{-WMi_q@Rm5x!W%{J}jM4F1_#l5@UG$x?gw;BuZ4lMM8@PNjybc~PTubwD)_j4REBXd^rZZ2&gq>|Zdv%F(z zXItl2OZ|wZRQu#=$}exx?bN?|7Oq~~nnFejq)LjYF5jf$x-0fYpnmiFpHhjDU6kia zE$!~6D-zGgbc1BFv_ES)U5x9~dwkqjuxj(ccsRf!s>{l_b`@qCk7iF7@f*;#aKT2# z?IvUQ=((I^KmIZEOFr8o7OAZog6a%W)n?B0PT=WU1lGjE`ctIE~31H_{v4@G6}r(n*#kXzl+{Hnj$m$B&O+ct-PT zu5vKTNvx%W*SgX-QYHJnQ#&}#f|NU&admD(l)yCCBMyn zq^9%3>1YA!2(w0S=T@7@)p=@kx_>>gMg!UYkv;;-)cZEwJx1zx19yAV(S>}Vl-nA4 z_>$f%ur;Ke6?$RbaI%toduGIA+JT{2;%L*rI`J(v?Kpi3AW&PF_#TL~=^f4blbrRhpLm^zPzT*^6N_Xgz&p+IK5y6*S@3+FWCkK2Wh01Ug(%fP zcUUQQ$;*47rjm?G$B3en+aD86tUbezfyx^T6JoIzt?#_}ikGYQ)=z=b;m)uBF$;jf zt7!e1jQ95sXKP`tWGvbEw2eAeK1**YvQ=v2o)HQJS&eX}!0vj|Jo`tIw? zvhs|;mnsL9LSwZW$=q?Yklqv4Y`!?Up*pbcfwtfk@FSR(23uu&4m8R%!{8}R=kURg zQG~kykf~%36gmcsP9$?7y|{cLq5bjNy9)dVDmFW%+XVnt^i^ZSC83hjUN9|JJYDgX z_|@X0R~M;2Oio$q!sm1ln_6271LUsU{2Yx{1>SITfrj}{om?C06 z9w%_#>l5oRvMZ)jVbON4cR+rmZg>=3eO->xsqe42n-TvtQ^^lu9!PSh4evalc-CIy zycFi-Vd~s=&rZYV04cWk6UtJEHjl}aRh&(BJhf3z5YNwfyf<03*=$=>p*MH3sqxnH zWLe*`IUvvy+raRt-eZeC@WvL4@9AMAK;7Hb08U-M&1{C(H?qyH!58pZ0Urlk!2d*z zNt{n=v&MBOdC$JQ?W59nIPi1`S`VZ#$@m;b031Z%3$vR15Q;U(bHKs-kAqHG6LbBV zXXty<1nKd=P z5din(USM8=&UFJl+cK{&WI^Y8{TE_ZXF106L?%^sS{2c z)Tj*=Z{t9gRkS0f*V8Z7Fzy#S`}RTu7( z&^bMs^}jsdzge{3&hMMy6xn2l0_6JUAFi4RS(z0-X)#H+&6j7ZpI+MwHtbmL*p`&~ zxo0j?k1uL?;2927TYcRt5;z_3+YX@sW2!FUwxR&~UQtSEbP(3Mmu>;*J zI5%TH%~Fk7#Ay35e)#1s)-!KC+jHq@n_fM}5+2@p+ha$prp+@yI}Tj@9trd1j=HS~ zEXH}-`7s&xNO)ePMK#FhflPjzQTZ|J54QI-tOV@GhJ0`lcbG#m5t}i(pc^E!Nnb?a z{BUSb`rwDAX>{~@woz{p#X&sCIcz8*Rkn!2&0BXRU(N%sZ7y{DHTNR+{0%7mfX1QZ zA`xNzE@pJtS{%ll!nR8hP7ZVd!a4>X4wfkx#LDF_E8KnAOI%yf5s})^fcU861i|Ek zUWI$2*<`mtY2Z9rzaU05J88Wo8ZP2h6pEf5@R{wbh`_=zm7`BE#|b9Hio+ zExCbJfvBUuev^_W#otf*1moZR`Sf>l^)Vh^Ts2cyiOxD(E*(b!a8N&{P;VMW!M?az z(XWcA@yR#3gPC$--tQBC5Sj8$Z4j<`thHcV2OHyp zC1-p0f;Hq^HlxIGF!8NQbJP-C#>~&Ffb~qmG-Q-^;Y068jz&1J`_8dx&SBME zuo*iAG2~{V6nrxq+?5HEz9-nQ-`&#k!XHY?wD^tnGMlZrk;B#HSlh8;sXGdSh!vGUmURgkWX2Dj7*b> zhcnA~k9tRsFS6m}7vF+RhnG!uo;@T{xNl0-%?Va`bqF}%dJC^nP^Yn0)I^e}ql~`_ zkiK=fm!jg#>N@<@a{f_<+Tfn#@q!dvFLoeh{59E>xuc2=Imi^tIx%kuE;g){WD$0T zdB%@+ol><9HpLi?FiCeyj!v-m6^+Oo6K(k z`Wb}3Y^&Yx=6b3V*u>UP-L>a8cza0p?m+K10eMsK(pB!L zSxs|wG;!@S=WXqF*Te*)e1=20V-Y%hfxKV)M5mwl?Iq7Cjyob|pQ^z+^T>5s$Mjy9 zhBl0!En|2K7@jx&NyXKn6weZK#~Q^}bn)#qbz=E=aep`!;*ON|>P{wPVi zQd8r17XH6$SHl<}hKz?>3QNGCSb-(D?8?M(huj67u~Q>3d#G(WTShQMrosJU6qkq9&EcoNFZD%OXq?a2f>_!^kY~VxnTm6bx`>TKsf+064cl?G zBkPc9ZVDCM%M_`2pG{+TpwgjCS{v4?>A!5rtx~JX?`HY6wYkCWiCA>?7ue)W zdF~q~!`aAauL0@R>fLU>Qfm0tG?bAMpdfmsDh4N0hA&-QDZBt+L+v`ktw$Z-a4}`) zyyZULhPsJ%vNScg{4G=0aaAD%l>|sYWrJM1Ebo5=?6&L)-bIp1V2poilmjHqt>Jhv zT^e;W zZAlJ46dK%5<~Vzf^EMZd^*R7VCvLXQ;6GyH-HRBIEDup`@&{LnXnj$~*T0-Qn5=#Q zLAvSCGTEU@z!BrSo?TGdB!0SCq1J*$j{D*#VItaQz#MVi`u7VPN<{l}8F$Vm2mI-i zotnI!zPQ--zf5+7Hr6zx9)8sZg+2>B6tq&p@RO+0)m;8qn``#RqYPI)AO3>*>}iON zd)Ak@xUiMl`~0p|v7c~iU8Hh5q>R_&4w&?e-l zSAUZ2CNKm|XM@~dD8uPf`$cOwykeRi@ZID%uf7?taZ}E*Zrc}Zf}V&3Gby&mu06YH zpvY)yFXa~o{f>d_MW)k+gZ2sk3(krMygXTMNA*+#V|T!hT5`iOejS+ z@f!uf4ZH2h>qm3ug8nS#eTmc%shzn?(T8J(HmTqez*5t}3T37q7+CVsaqTzWtQ?7Q zUbyc6Anl~DdM2rf|M)nm<<>N?c$roz_c-T^#Cr1gpLf_KOY2vt9i^I*xD5PszqcTH6gXjs35$f{~Jrjo^Jb^ zdRR0fX>BUzFkKug^5Wf~L6_aTB}SM=#j~?83ff*`4@=k$ld)?Aretc)*W?ebllm#z zo#aPG259W()@_?3 zhB7;pnsG!p9!KDgslxo;pofniTqfNSSB{CU)Sc?W$*YP-@k zy0y6Y4`M>&azO}YC}d;Mb3HpgOf2-$Z|x`8>9@Jx$ue!F|GnKRE=qy6{7cl>w5S0&AU2Ebb=m<~UI_nu$Ym7cw^V7B@77vjQT68UqECWC@#pdApHc}q#d zqi6Uw7Tmni=lt#=Ft*Fv&Ag;0_#WkUP-x5>$H5t=^Mi~zq79J;)m2$ORPgz-OR0wU zEUvvn&Szxc=Ip8}`r1Yz#aTe>M9H3#Mrf_O@M9`R{HV`ImMx|Cpv->aeuot!w@zR1 z72mC%IXiNza2T-cgR2RiTcvo7O}61r0XE!p(npYKTESm zS{}>jGE#26g>F?x5)k=&TO@Dt+pa8DD26b9J$%9&nP~eXMp5xgFtoGtW*O>-R?s#K z4%mR(UfaNyVCHt#HxH|92g4;%g;nC|`#-s)gn+4fJ>4scs`Yx_Hna%y_D0MrcsJzAjw zuXP*IKP0qH?p5f2#zsdI&*(Bi5uUB<`m4RJtd*qs=ps1yNvJ<`tIGC^q=qSn{{{a6 zoycKtcyg!D%n{sfG|vCS>^6O@dHfsVy1*MGJo2@ZhYfQG{rJkqT-;e>${7AYnr{HG zX}$IMfnu);bFsH}{!U8gZPf~(MCpPS7rP#PRO)|jm*T63-fEST+zk@n`9WZ}sT(82 zjdP*ehWkUn8WzzpIv~k)6s^lswCjCw;DwRhn{txr?ew%8FED_l?PGb8)-#}Q1K`c2 zahtQcGKBvHi)Bx7)kCWwnS?pN4u|WB^=|#zf2>UPTXjAsJU??daPn*{LY9g{>w^A` zTw}(iE0=l834g%lUUVDZ(I)b5%6206%iKJA925?vtku!Mjt~Vq2izJJsO|Rp;Y=Kd zIlg7pszO5)Jk0N`I;zU8e}0iR4F>psyfWJ9PV`ZHvo!mKTU)HsWwVK^E#;Ek-vNOhoRxkWh0iTILS zfbC4dEo8IzI6*0h69m8}t2Qf+D9<1hpfA(5uPE&p=*yf;3~kNz%_kBiflMrzX7CB- z2frlfvTHbbET=$J`HlyK=VA4MiS4lt~Pe`Mx4>rb`+9;X(Tf`CMoHo4HOqHm8xxd^-|g z*p4jzK^1M;TQASqJW_gT@julKq#u3h9nBZozepBRL;`Uq2 zM&M^FvpH-y9Gc@?vf zfT}QR;%L@M>v-SDIe5Zhbt~BoL}Ln3O>yma3QM|tPGji1aC@U)|MF~4@J^F%4VNJx zv@IrB$#Ra0h5#R;0VH>>zFF3K=scNCGd?PCIN=Jc0y?3w%vJ1c#4O(KNig;Jl{pXI z@!9v6^Sp%2fsKju9&q9OZas(Z^G~j(=^peoBaDpG;$RIBr9&xO$k#1WS@x6{s{Pd{ zB7F*0(vpmtnC}#DQxlbCs?ujgXFJR`+0UW?4@7GT5dTdO%h8@<*N`q`{?R%lz zjQVjd7BR{eB_gkZqp(kjPlOz1%+8v~U9ej;g z_OR1P=8MrvG)M;W*?sRql0j%VF;rg;0vlTcrdqN z>c#PPeC{gq!8GP!AKIIYxr%1&vX6&pnqQU}C*ej${OB@O;5=3CQv;fjvW-5~mHeXK zaxuA@d`*uthJvvM-$cm0B)Z?mn^Du4d1@iGcSD?jDT3u)<4t-Hw7f(0{1~+J^mqy0 zK?Rqi17uoA!_md*?$0bT%RfRA{(D|zXFXcaxQ(U%@*J`o8c0x}Tnyzd zh+WkVOLk~7eAfTVGMpcf!UeQT1tg-6(tMyQ0|57LQ)2EKSKXh3Javw7m=if|*AP2z zbX!%NwJWU`ZQ9Qkj04ts2`J9;SI@BZgT&Bd90SsO_Kc91=(#;P0M#sRoI)CjPmcmG zH7{@Gv!R#)F>Uc%AXx!VW0|RUSGMzzlI~^gJ6^W!W9KC+U{RPL*6Di}*KWr?k_Fin zF4#n?K(zO)687Sin}bBvUp?=V*CIJ_e=1nlL6)()die*BOLJZ+2JrNA!N4wn?_)}OBRgR=LU8)*4u!^kNo~>6iR|st|@u)hK z)ICcF{-zkP0tFb9Ut;pvlaUPQ_u5|@V!znKSY>bYR`f^x0U5Qj;^zYXxlA7(2-t57 zXRFzk>QK`}(+Cij)+@@Bn0@Hu7csT31>kwdtZk)RBGC1mS2^&1cRia6tulj2{G)+F z(;e~8MXW7hQmQ1D6mAgIOQ?vX7lwV!OWJu<9`-Z-=&s7ElOi+=gAAr{#@OW^q_06v zbkUs}uchr?*>44VdmjZJnCN6zvFSTP^rC^j@k8%FP0!x61)TE+6%toV>Au@B2bP#D zUT2h4aQ|X-49kss8Y@?t-c*n)i2-;t$OXu)r#*J6pcTsFZi9oERD=G2RBzl!p#nWt za5JGxSK2NVFI-5C%&$;pgPZo4zv<)Q+7o3yA5&gjM*T;nJ-k(6HUxEU7{def@rpHC z7?=zj!5Zd&M&`tG$!~W?v)cvPbbkKnym=HA*)8Vl&WiH`hU~XR)`MhE5cGEX^v2hs z<7N6%B!o+zo4<9|@D`SH=iLr1xcz2zo8_pH7Fc$UyxhSk&f28;)+LpC2g3qRw^&M> zj1E=>};+f_#1*jQIv+UA%+xL86Kw9I0 z-e#<<1?;`rqw4G9TuU9?!`oHUG`}6HCMEk%&%KbrQ~$mw1em4o5m&07r8}D1aa)fq zlUsE}ku;GY0iron#lN3*@)jjL&<3+XB+r#!Q9D|Wi$srzO&uE920zg&5^(_>8$yS_ zjuz45vw1Y-)pPg_rDl?`LZqVt<0T*fEv;Ea@xKDe9ALyZr=k7&D-pu|5g$gX$5&kD ze2-{S0{+nL-%T5c?80=#*?4n5PLD~XAIC5SNJeY6;kN$*Fy4u>ddAzhmWIb<0@#PD zGIree^G~5cE79q}%0c@^31=r#0on$0BY6Dy+vQ5}C!h_83i|$e((DT>J$mxA`3H}) zgj>~uK7>9sc*`#*>UP#keBu=)o?P(kjwGS-GUb2~Fu&w?V6(wp1eJB@y_=MBNFDZp zpEsbdR$tu_mY6t*r?DeqV?uaqg*UPt10J5;bUQsV^z#xIIL^ZEbDme=7rW<_@9bse z7$rrS(wbtSC^&gwUI;Lo5XnmhHziY*C{UGI%iggQRS(Bks3qD~WsZ4}SCO%`)z($}^}tyx#lIxhIN6!& z#XMhZua-(MS7Pr7m#VOI5qI=XWvvoY%KE^1YB6#gJ?77<_vs?W_ztbLqJcKffmSOR zPDB4x$}e|jA6%8sf%lUlFB5c3?+}ZDSY=UWaWLl6%6uU%tjVih{Zj>|5Z6vj{Gjp>nZajRkNwizgHR!P@&Rj&Bz9ehvpVPg_eK#C)*sl zpDW+WOnl^S&H0hOBa_!#HN&=n6VFt>h3CFuf7ga$?OfM|g1GQ&s4nxJpScIW1=8JJ z(nP?~hg4;%$l_F*b~?BD$GnP;46#LOc>lt6)X^=rPWv1i(ZVa@Kny)>J3xfyUMV~P zB&?Ii&WRUJX|(LHkT(k5^V@XHM4YNG&yIUwq2$xo-|%;|0^irKeNBGJ&Uvc4)ssu^ zm|Ct&phj2?eOI#>*YF#^ixIwvjg9rdnQv1yER3xI?ZUy5566e-zloJkpP+5I+~0Qi z?Q30ym(`D+hobkM|6q0_A@i5}U^jX&pZnKX**8J$S?8~&ovN`#07d8FE)(eSu_EkiFXubs>23LfkMaZR3hMuR_ z3}m5pY`Z6A5@5Z+sS<9NN20gRLxcF*KMOQ{KA7}5q5AiHxA8O0r3GCv`tV@~-Tj=O zl4_~%pEY-E`_E1qaxj!4x?)I*#)gb3z4^#^mg)KRk?HviGhaqYmO1J(TqdW)^+4Zn zBHzBCKUpe6*H|H9GwOPH+j!dFZ`=%&XihePyanecw!oR-S z2|&e)!+K@hA|%tsck0VQspfzuCdPZRiw!UcPRn;r(2~DuOi9GTOrl!>1z_SYWgTcQ zG`iQ;k+XRIh~yfc^u3W_T=R(wB>}}_Ql>{#apK(rdSKj7OH~u6PM((=SA?=Jysy%r zhjhGO?Zt^cC5kB%^rTl<$e-QfrhmdtTvNV9FLe)F?!#Xk!2$CY=W>p`ukLzAuj}7C z`WywQ=1SVH4A;IH)v6pb{Z3VUGXK4RzD3clwm~C`L?j!Z|9X(FZ_yI?VZwR)SASes z&dN$1%dqV&^4uEH1@6A*hlTy+-o~b#gqVV*`6gKI3|K zj3|1+b8^$ahHZRMc9K61ib}kZtauT#x<83*VElTrD7n=7OE0nbY)bzbBcGeF_mWA! zOIr$zkFdW%vF)he0D)Zq5gxDr*8GIoV4GJ)eHY~p9+th?A77M8+5Fm|V$(&hHiJhx zq$jVUrj_-*(y#S>fki)bb{9<-L#^$UCg)>|puvB>QqK{nB;PtOU$axN6PF&n`fj&1 zI!Taj0K$KP?bilvDX0>dRTXI+ANghm>brp*!QQa-)RCc>y`OQMvs-EZuUdt{*P;4&kme^D%zkr zCFe-cmz6^&PO3Ho{okMRKmh1XTw}1?9$I7p!wNxBy~r?S=#92<%lYZ_FK)knAF2(g znCZWE>hew`2qo&78?6a-ttAp$Pce(dP>NHk?E=5Dsz#XC?;?oR~96S@UEMF zlI&X^_OALL2JN{%ynWa$YG#s!+xH0#5Ss5Dw%Bi!;f@%(wtYwaYDU%*xh(TD2?|S7 zizw#si|dj8e<`=p@kH2EW5xXJH*5YQRO;gWfH_!u~EMT7zYRBbUO77qUY1!1485nuSD2 zm$m|(U}a~c@sZn{sPG;nZB$1-8v(R4QZbULN>d{Pwq%~&;RCe0evLU_e01^+v}!ZQ zs4F90|B>;QU5_)NxhvasYkvbQ-|2?Vq^W6g;b~j9mRwj8_L>};y_!t_1#~2yJ#q3+ zs7c>N*6XXi2RSZhKUwsDGE=R7+S`9myW+K)I(5RcGqCTHF!#;bMS0VJi;||H2lbK;>e`B3E{ilE*S7PLK zBs*e4aiaX_L$dset+VBAeE<92K#riYLhxga!n1!R;=y{ zQd%nG`j1Z6uiW20^|3?Z;uSIsc1*74;y%J-GS2P8of*1HW|WhuW8r0Th@|VtKgrgk}YdpaLwNdx8Js%x1j$VBP=ag+GVzN4p6w1MsjL~ z@4RbyUp00~5UK}m1r<6~?-<2+%{w6XD~~Ed=ElDsIUK`Y-tJixwFQfR1K=hAuzW{I zmzn8KFprS=memwWD@NUn)dhe9f0QrHPaJo$l|%x4vr_ze|8?hN z44}dG$;^u|3iwa;!W(JjNZ{ErEbeE20X@3oJSS$o6`;A*Nzk%|@Rq`jWo@)`12Hb467aK)~%B5#e^2=-KK>Opiu?c~FQ{lFd|gZzi89#L;jN#APl zlEIkZu{|-VCTW`H`{U`-@#uZTwKyu-FX#6d)M7N{)Sgpmnm|vtJjQjVq#Ug!R2(gH zoBi@ZBQQn9$+qUOm^Y;SEwR|yJv>|_`qaB!dbf&}i_Vn1G2Ok7=e!e%k#IbluQ+>N zZuShD*uZxf+cuXILM8*7lSZdnRACP{#*aZ zTSCwLlS)Z&*Efu@cw-3bNXn5;D5`edj0VJp9-WS=OY6)bGiwCXg z?+@#+8!dijDM9pJUz6NFN|psQm8bgU%EKm=?mRk3(dT|CxYi78>{xej#sE7#x(I~= z({$PnWj0sUi`|YKceLOsFkouj} zW)%Op=?{aPOF0%hL z(cw-TR?&`yO|7_ddw-hS2{XtYKn|6jGvL%=8h=pV*$H4VOeznXWLI$w*si*(3lIK7 z%9r!kH*rTY7HfZbw%3DQ+`IDzyYKer9r?-j*MNn=VNsk);WFxJ(9zeUej|4u zI!y+T7*@5?BH-T^?^$GIO6S?8yW=dxIRT=Iuaz8%4VjxH8mo(7P4>E5B1Xb_Y{s=V zg3WTZeM#RtXTnCSM$%qXC}Bmk{U+o$z{N5>LT!Wi+Un!$x{G@#LA>XVAN*~YdFZS8K`Qv%-rj*#cmIuvuhKiMbxN&dO=Rac8&rGVV z{IRX_YV6F(k2j0I_4hyLL}Q=>g=N=1)(R{8p5#|8h-U3rQN&qV#?03dI!RkyLChfW zyY!{ync^ww-ul@wmaB*O`GDa7X;$z}I!j!o8kI$Tllm=uv};R_g`wwXF%o`e-eDmSFICYURe>_EYV>U(>zB(s(Cf~ayBv9EY`JZv zERrthuQJ9gQ_)k5RrI6*#s?|k;Hs>E<85HEw3W`MbZHc9Kr=+3EV^U_BMc!suv{cl z*D=8x^Ek=;`SK#(vJ5ntnu+vVIDP?;)(|H*ByG*c@4Za=@A=9O@#K;;zSJuy= zYn3Ztrq7bXL~kdzX8_`oaDv-XMMn;8jq$C@?sez(4i8Z_>F&CF)cl(cPa#ygz<*y& z@<-D6td+Vw)iXxTqrUPljB)H=aUZ!+1k7j*Z>$3=;geix5;`64G4p21LWG`iX0ApP zSllFmVj5V(gr&8(j8985rv{md9;CJqUJ5P@Se--!G@F#2Hokus;!lnrcW7&Z-3{P6 zR6%V_@{42Bsz|7Y>YeXFbD_9M-U z>Efl;t29p#eD(?iCVz;HpuwQROXm$np=$*r{Z%UhD0-_qdgEqC1X@^?dq}c+h-N2g znU)AQ^rILvNr&3D$AS3w28_xy79T&Tq7Vh8<=(?^qeN_wNYj&%c^9CF<&(HiS zh1n5jjNq=4MvIv8(gddbJv0M`X85_Rg~=jktF}_RBtsg~dFxFNmn_gz78%eD1BfJJ z6fSrRB}I=(1>reCk{`KX=^N6=Lk|R}*(W{MP?;=I4!y=!Jnuw*&=pG{xMzHxOi*Ey zc;D!C#0f;2)pZ$UjY`un;K>7EmL(Tl!LjR+b`FTM<5*iJ3xW{_lSFAC4ILQpJ)tD(;9=b^DM`_HtPR=)uM9^~Oa0 zWWxK6%hHM2%$z_Z%U&d_py?uMQNg6Uzk*}U1b|)={X5vKc80n*99zW35 zOFcb_HwbD=kEgLI^r#LUFv;9`qZlWcpSj{GC82C5Bq$6^)mX~ok^F`vgm!&Q#`o7} zjNvCsy92Cmic9O3uX&aLLh#TPH$M(de8j5yjcgR(Zr>?M;oRi=5e1D22`qlOdc0|M%ttE5`B@!#FKnkS?9p{HizIlC|Wh z&~eRvZ2H~x%stb2(Eh?SlGW;|A1GIcv>7okMX^igRz&O4RgI3WUQ$CeJF;mS7Q;xU zo_I$l?8j)#2t9?hQ}M`}ty}7G92*STIv3RvId!0MW!Y$|>%BaSxDF-Wt=NdwrIEN8 z(VMR87b>9nLLhFCG}U91uyLYw5_dpV=D5?zd~;fq;4Yo}zVJ!ZZ&rkTT%iXirsI1Q z17%V*?rx|O;35v)QX-=YR=^Z#5*Jtas=Xi&nuviRB00;pZD)az+6~GKiZ~0mn_j8| zV>UWkNnXS|8--KOj-qizNqPmpX$RYMP4JwB>e|CeLKCL6NS`!oxx?$8iK%(ANPNs< zWG@pd9>jv>caoOFp&tUIdz2;nM@VX<1F=;*IS2RqAy<<<38Ee-*CDe^vQTzSx_^k7 zBa4&@ZD>RhA1hs)F)u@Rg#i2@)w=^H>Giacx#3yi7IvR>asw=BQ3PW+Hd4kODFY*U z+clDkJs89s*T6chwN6t}?JQUNbKz+w5JJ&6YZ%Ww%dh(WvT=~aKB)aQUb=<7owTxj zQ6mVta*qd|O_8PttzU7*N-wV_WU3NZ;yOrz#~5=7Vj`jhITBkNF&a!}ua^npX9mzq z1G|@37X}CdOFz+F0$5^?g4@&3b$HbY>F>me9nfkwVXMCdd~-iJ6f-suGsb?hTE%$s ze`L+SyxB?S2U)Ns#){?En&jx2wRwW%Z1zYv3S1ZR-cGZUj7W1Zd{Z#_V)GECe3K#L1{^SmFgk9y%hb;tix8qk(BXIxJbp%Dr&Q9Qqn+B973@Ud@CGXQh+YZ4mkcRdq={ zNjz3QU(!d`VVO_)3}9PcsF*$J1m?}!C?Y*h62E&W`%IWzh8C&(F+;KUKyJHknr)a* zSK)r^x*AUDm@Pu``KBFWGU;+9b(9*(o<%)^-JSgTjt-ZnKGYRqkO3Rs%{q}5VY)k~ zqKc!vJ|u&+p4fViBWtnfL2;*xUL1ek!S;$i%6~9p9PNMG;OZg!vAIEpgwHI?(^@^3 zCha&fFxxblLe=!am+Q~T!Gw{{F-(R^^77<4<1LMCZa5;hPzICAV4E0*Yn7=&b8e!t zc(T$SeNsCo0G-iWGvXxfqy~P)owFz8B<%T;B)R&9iPEZ&ol{R>-D}X!rV}9s^_bfb{pZkJn)MGEl6~v7`k@^)0?6hE$Wyu z5X>5fNA`l*_f-jARxDd7p7=aXXrjorekz|c(%LN)2FB38FpyLfEvj&8C$1r3fXHQm zrQ_>TubBIwjmMZ81qV1(p=4v^VWB=Dk7o}Obn`W$BT`rc#Bjdgwi9Z2{;8qG{{|iZ z6I(X8p8P|K7Jo`c*lcZw|8`S*+=_~%=u095Rir8Bj4J8ZGFw9|b%RN-jHa;ocNG_< z!0VI@mx0#?(JEjhZhg|p(}P_H<*7UytdaKfNSK<9w>he6OCuxXSQI1$ti=|p3n$7SO>){Ag6=}V5 zotB&GZQ&_A^j>UvaL(|Ksb_KEdBlPxDG5{Bk*$WvFpQ5H%~p%EyxCu2w~*&or(_H> z0y+LMJmem&8?A#F$7hA@+*;SY^6Ow%OB&@PHDJn^tGTeBQXCMlrjt+`eNQQ@S(3lx zeV%1X_g*dwBm|r3M_ov$u$ym*X={O{7L@XUjcA!z?=lN-%aNAN)H2aS@O8@qad6FR*_P~CUB3?r3ofQNw-}#M)sR!LM6LAqmFyF8pv#>aXW$z zfu|;C;IQOFoV8cJUF;Lt5gM@sum(@kgz7)2ZbCEoZFj_S?D%ZThwBNb zg3G>@$X4if6GP6*5M40ncr5_^HR?Xx#QwbsCWYgh<^lE zfQh(dvgex`A9=R+9@NfzsOI8aulMZ#0fC zpCy<5Fuu-#)vZ`OT;7Ax_%*2^TW96Qo@sFpNQ_@ygb?qxgbm%yG@|pwWv)`j1Th9B zO>ZB0CS9g)pgO4HQR;gW4BJVPG;^J_be+1j|IVrZwV?b@p!=IrbtEA*f}V!Sv4DHc zbiHpgh&l*{cZdg|tGyjdAW54(+wTSMM_-TW4Jv9mq`f@9!uD?NGaHsQVbmP$zj)q) z6j8IvxSmnhx-l_5xtilHtiFxWL5xdc$S@&}94i9B}9!}uUyxKgB z7VvFkm=;3#O20KqcES4fSwp)I7iGtub1kS6J}k#-@KFr}&sP>1q9$JLKf*E@_zD|S zMnoNN>fL2bjUyDP;z0McG`Gqg$4NU{Epx%%y#+Oh zvkVB8T4AFfL^cbrtJ)l)EYBG(zR+K@wCtamN+rNsAANt~84djMO5(FjyQBu=ZP5b} zF+8>zRBYCPoXx8e32}mU_YAb#otU*(Aa^1UYn=6%oEW%Vc_MaP2`Cy zn>#P8aJn0{7XGxc^tWU7@4b3~i>M-NE?zK#OjU2W4+w1=uw535mmH4qTp5x+b~Yn& z@zVCs4q_{sgxS~Zq-oV`)rPt?cV?^Jikeb2izv+0pMr1Qr<~Yeus=w=Zecj!Db1gW z*9deA6m}>8mK`593l;qONQ4|R&5?cDln^o3Za)?5&OBKeZfpZA1k?fjq*1#m z?p{~aa%+g6uHaKPRJg88buV6$eW7S`RujB^ua!o`Hk2ogoU|iiu`+H&L`%@oR-gc;= zLx<(73j#)jGn*0=%SbmfylD<*h0P5N8_fDZCIA!b9Q|MLzH|UUrqHB8_$e72WvE@D z4STc+9_g3JBbtPU_MB8TqDJ+XQ@pAQ{pMF;oLy7xaP>tBJ_~$9p~sb6P#T)O%uhU) zXp)wF>PL5*)kIjBY*-cQF*)~@RkL3H`?K2qrDx=4Yu;K54S{P^^_}IU@OEGCs@)K_ zUr)l_eyi)(K{gTl0++Gkrw@)79&~$ZvLe;WPiMQtWLtP zql;pAsyBJo3s_ZsT=PW>_QK^=B8~jnLnJ7f8MEY6x-Gb#1&Qm;D!Ny7TYb%_SsUj{ zkkcNAcE=JDw7aB7pX36OqE0u6-$w5D)WYZ7x$?KD+`kMNo7PYxZ_fbux*=?>iIoLSM4Q>)Z^VlE9jS`dr5-G+4%qml>QV0&b*3pF`_r(B&Yb;} z#Ri(`3%X8U=sX(v5%q&_{38oC&9;BS_gnVa8&_(vc;xMKt$Hvtj6hnAb$J5KOq}sa+Lt7n0hFtROhePn` z`e@PJIQvkqC;)IWwyjh>SgsYeHRk`li2N@YOTOPg45hdxMDmtKw2iFG$AEQ0l9^bL zXk75Md^?yBR5ShLtYh&6PqIidzH;L41yjg!cdDxkv{?Eqa-ZPu~1y0M3ifrE3uAg*YXahX_=(i zW}5Idcel1?pY)7i9T_N}l|!|OimCTlPvi6o4|3vS#%tc{!~`AXPf!(4r3*YyOxnQ7g+cv*N-APASyF7Cta1Am?%vy2)QVPo zv~51FYLR{Q+v-TufCa|`py$t$PKs9fd-E;rkjJ#`352A~iBK9N+Drbf0W7|O&*4A3 zxRHTZo4%s?+f9co``m=cJcnkOp$W${(sbD&)4S%QNDLLqkV+ilny(^^VT*L;Kc>VAPDG$B zkF=qheu<{Kbn06NBvX#(wgUmv`**|xwJ^pmWlqnkw*fB32E#Q=PkO|PW>nHWI?r4> zd$CFt9mZMDaf-RyH!k7wT=56_+3kCAw*HFY9JfK2=C7WgkIY{16-rw3*Bn>f6Ek_6 z2RAo1>E!;%NGP{X+vr}M((hN)yfyd3XA8_P&FQnUejtRbZ$ho0X8U&#-oM)rhB7_8 zsQNH6ba4KxqA;Dz4#0U254P*e;&%r>G#BmU%Qq`wad|B|tSj}8BQBiQTd~|Z4u7sy zGfP|dyaXcq_gViP?&4prZJ>KEl*jTkwv;vqPW6^gtS*0dZ9v-Osn&NQf1?v-tm+xP zIuul~9F(C{y;xe8fd#c^hq15mj%Z4@6>C8O@aU@}#e{%|t4lU95HQ}_` z?hQ>4dEcZx;t;YfHnSRxA(L5oCjeTUoTfw#*lWe?-?MOl0=pFZJaHZW>$Dy>;;KrH zc&L5d7&sALJuo^l%+D)(4Mh+mN2s$L%UP@0$4x_$x#mzVjSG5vWkpxOb2QlK)icOO zxLK;&Gm-;F=BBp15C$FZF3gK+oiJ0-u>PYb&Z@6##Rw6Sl1FV0ev1v?Xy|!dlYe9q zuTmI@S(G1$0{ads;}Wj*hvNLbIVFLbb-+6CGt%VN+5nNR?cslUbMCh20C^70MzZ_j z&i|{a_+O9;acrDmB5KQtq@J3%`z}Edfzr9k5xvAwxk~#wXk91mm--$S_)7WQ}Xf79k() z)+ok!{6&FJuu5AEr1=_o8`mJmB&m&nH`aFK!_n zCxSAh+mm+arq%LiVJCRY&6fsHJN+>}1e`djoP-YPMjB6#yJTW-3l>{Jjo-Sl0EApM zXix&f8TGRsQj6JD(q)Uk3G{(KO*%F%+A?b-OR<3?Uv_RWG5CDlri=MA)vec6c_Q5Q(?Qb0E zsW~6UP{J>2ESw@clyZ`p(;u_0=gPiRyOz87s3Y^9i2fY9od^8XvSYw1VsRccM(x~{Jx|Lh)GHB&Y$v2`8s|0 zeAOx25rQqgdE6HVx-{m3Xy(vvvkW$g8;a~x%$JrN4J+zLE?7h~rGY@}o6>fe(A_8x zSAhfGooMP{VxE86l>Hs*ddhk>!>mU1EUu$fhm|9c1zA3k%XQzHrX3Sh!;%PFFR;Y* z1w5wUR_*z}p(pqkt}oGRU{ddKDDD)EEd)X;FX*X{rSrAfb3wxGU2Jh|Dg=i&8?jW}M2#ghRkU6nsSVw+ z#AjkXC(vB8-Jn&V$(UPPk$5cSWEC;=B`sO=1gU0_AyoH0A7wqA%zAw@Fzjpltkj}-ir84XuZiK<^q2)7_lfLc{i8nIw4*(olqPC5aNo^_X4O<*E z7VJ>aw}HF=W>k$lw=Ea7ESVvg41S3+-3GsH7c$+(#$#hjtdb0RWo_)XH_fWL1$}P3 zo(U#A;$7U2wYayM4TO;n7l+mm#$)x98KHTD-x6wDyI^4t)K3>yw8QcrYvGS@9s{cc z*Hk*xdmPF{(@M@vfn`o%?loF z_Hsy6K2S4U;o3W37^)aRdlpHQ8!k41j&SSS*Eg7V%kJ91fQxG+O@d0rJjSc!UF%_S z1(50=0jYkgZjh9(aZ6;R79WL8BUP-8cW>BJ>0ZD6U4*F|$yOdWsw2iBq>`9-=w&qd zS$;It2C58)fA6yoSX8r5InzcvMo)z9G<#F-3^Pt;8N-KX?tUS-ZZzE6vUoj%O1lnS z4{XI1u3FXm*lwW6wTo(-Wr8O%5z ziheM~dDv6Kq_0Zq25^6H#{ONt(F%8T2J_}$L(#1H(KkG^47J?|M01@=>>v&@Jh;?R z3a?`YmcDvO%;$w-4CGj$-Z)f*1d6_0uZcc!n&Vn^}w}lIH?r7NtpLQJkH7? zK6F=1sFqO07ZW<9%#@4B@oj5ixECcyLIpzkcTZ>VFQoI=eNJckR$oFAVa7@Hgc)zqN*;Q|d%0E_YBI=Ft%dkZvzsCFf?fDI zbZ;zjiW!&p-0(rv+HtjveUxiV!{%WwuasZ(W^A(uGZYg39uCl-k)lL#F`#I{1H2S) z9nJDP-uv5W^uHc~+C5<2(^$x3VTK}^IpkWHAwx6UJZyhx(YsXjGqbz3LiWi7U+vX( zrL;~}X_qGtTIo}MH+_`crT$y=$VPs4!U>?+>qc3tiZ^NcB$z*$LM4|E_Ev4qNv1}J zg>+WMb0@B~2wh?$eO%U7(*~87ntKA|gQW;d+xB#gH<3uWEUi?jr6VfE)+#n%#R}3}UkV4W#aVDb6+nF8=0N5`$N^ zw_|MrFHSln9*cOyQ)>PH_9(RPt)8Merxg-!m(-DcTDz^z$cAU1xv~4PSuJ{2Mg4)f zj7IJ8lHfW1oJm=*o9`fAg_`?HoQI!I3B>qVp}_1HXirp{D#&^U**g~Fx|AzdvfRDF?T{*1Kq{LC1*>Hu$7}3H6u8i zolxE((5XT2p2f?p8ptvYpxN|qfB!FR|9=GAhRcr{)TU!LBAN6(i)jEC7Y6A$Htapz zd3n-4EA=qNEcBsV`6Gpao%ZJ`oku41Gqv#A5ZU|AWWG0so!8PwR>u?3ET_`Y^uf8= zY!?obDtaSMa!9;vfV0sXWX!%Y#`9M%hEiJmAP`(kQ6bo4CF}t5_MH_aHxCz&d@UU4 zwW6FQ=%LzFLT$fJni}(dfr9mRtz!<%vazU9n9Pz^aVmfFD{947C*#Q&CL98b3eNYf zPN=BYFey(R=Bh6YI_D2l69RwD-Q`xQq{EXu(o%P>EHRMq$WN*F|WX<3c4CD|B+ePw#cQZ zH#(;{5Q9rlX?E6}XPx$@<#Uu#UBrU|7e9@4<%BHq1-)9U+;;DHWuYb(YlgU^7wR5% zqb{TTS-)QEaO=+4RPDZOR!Nsc;4l~kTKrhvxiA0u+R+tndx8ZdECS^c>k`mB*M#`Z zhjaNi$gwBg)gn>Q++cJh$P0Zs?15VIo@Ls%Ya@!-JaE!Vk#|}xBy@IoG;dF{POh?l zBs5@d*y^DC{1Z5^rNO`f7xVs%(Q+V$!r0T4mKTTa0g4ZcznZWA=!5@@X8g+^>iulF z=Y7YlfGm+%{%DzEu#DtQ<__F|#Xt6T_xrgj^utCatspSozr6{j022h|vnH}@=h~t{ zOrWp+)orpf8&#lENEL9a;t>lvv>i4zT<=0sc&e{64pl%ECt2N8Zu?bLEeUc+^_TSL1TYyL$!?ZHvw<@f1$~76QoDV^J8m`(7~|RpU|-0mhP7=;1y{Vi^|5N76~ZgJY=|`^e4{ta6)RXf z=7$R(ovl+jcrZkXI=5D3yun`^*#bQxQka_LEZe(>i$V^m;>?pA`T<%zXbPn`7D2-7 z=W2>m{<%|}7;kqP9}VS!ok`;%vPjk*r_NE`E!97jCwK1qs6_dxDWP-kPL|=TV2az$ z#T0{@W-G;FMQ9AZoElrnEiV%oiV?CUOzzV|;{@vQpn`^gf22zs~q+G8y4sW%ccb{U;yW{oyZ#a~kw5<&{)h9sQ>_IWIn4w zOWFUrqK37VZ8Bn!S{KZ{;lMx(O3GF77AwiDMto_&BWJ^j(TqMYi30dmvsWQz%k3Vp4K zLebOCUdqK^9-xij`5$!W6gK%zxh`S6=GJDl8PzKOI}pr}+FNs(fTD1*HUETHA@GsL zex*D-`EU66Hv+2HzHS}3=L552UO*!?qz~W$0FIUarKF&-1UTWl%9MXq{%8bp=R=!s zV9&j4liA3=G)lDo`pS^3)=(wNf;rc!{0{3r2Fag4>BP>1h7-R^n8qA}ENm*i_TM7o z8Wlv1{CZzp2lF_iBVgcX85WR>a8{ z$7t@4OC0|usq)u@f;a+yg)KilqIJ)t4b@eIXmSB*Bm*Tq=OMEb?Bjb%IWI4}McC@2 z{dmk0F>t|Ra>baFHeGJheD-`eO0k!r-8@W>7Npx_5J2dBwq&-^YU4j|7rkGoc@W=! zg6w2>N6nsIqkxVcIc_`|>e^wQ&wJ@OQMkiVH$1)ZX5=Q&@v)8?4GZWm_>smY_T~wD z*^IjGk~d@d{fvOlQB0P_i;8mn{Ps6c(}B;YFbMytSu|6w_PAYUFh4PSiH0m~|KpI4 zwoS}U`_x!pcLdN%{?6qU>{lMtx+jB-Abg+y;)*(6TwS^_XETNC~|gkzqAh@@5AV$&tNT8qU0Fh(PrWJRelzd?;_TXV~85 zw@=w;`L3#9EuY#9ltWDhhm!0&%PZ?wvJ(`&af_aZDVf+~G4=wwvOm&pyJ4x14P;n7nuCD zDc{nI8lfqMGAct!ynU}bJ*^iLL7)ve^X{a5j?xRxc&G{YIIPD(BiNABQ=GKo2DG6R zISIAHmQxXur)J@)mkTTJW3~B=e276Xm{itCU*&g z5p$Vt>_K;K)pC%LEO`=8XE7d~@XGvd`1`u<{If)Y1q>@jg|hXpAc~p-m{A`|&qixO zsr`GVTzO(Ck{De1{@#>q(}%?1zMGP-E|j0jQz`Dx$)kH4UGv-)YHU=jMiOsk!vG2) z^-X*@KGe^GYE4TwtKoc<9xB^ljv$BILM45B_>R}36MKyh|J12dy?1g;0V)_IV<}$| zBBNt!|CyDL2GBX5T^GHp_M?vtjf`oBme^PDQ%06&>{e7}bHa;Xy#N#`&fV{A$SP-z za6gX0A_k~|T6b0|J?>clrHVrQ_B~!qmbm;QbGZ7$4mS6srOH--^Y3sNyWZ;aDAUTG zp1647;1QT^Pxjfq*5&BeHb+__**)38uZ=@f`|$l22CSRss-O^nKbUenA10vI+i8#; zJr}IYi?J?KOD&FfarZQv&1^bgCK+mXe&voc-P`eL!G)iwsgA`BrzbDTRa6^(d>=Yw zm8Q0NSp`&;P)NpOMLsH_jW(n=mOBn@zB+OM%a*nV8OH0)Iyx_ z>Qo~7JgvQ1VngH#I}K@vZ+a&5*~x zHABD<-<8BGDfl#TmoLc+fWwOBZ3ip4?!YIBaNhe){7(G zMC)==I!!-PXM^3A6e@Q%P3|CeTKNq45zAAFGpcn!*~8F`&Q%sJ(#x0Ebrk>=5aNBI z77h?JK~NV!cu-w?Fzw^$Jtns!2GA0=bK+v||!=O5XsS|8tm@^P*@5Q(WE4~TPpC%cnyEfT&$%1K398)^eM+7x+<353Z1-#%gfYPk#8F+KLi(?*VKCzyBC-7Q|B05~;+13ej z7Y^7oG7Ibp6!Sf?V@QWdH^!yjg6s57n{zn;+*V$&h871Z3P;Gb5; zaZ&}331Xbbghv5ak=Lzo`Gm)+HC`n$Navr$gXZ7i<@rxh{|H{XWXK?eyK}ewK$bzm z)hbw4SEV$(P5E5PYqRW5T~plu!`^#FHJ!HY-j1T6bWn;k0To9OL`ErrM4ITJ6j1?b z0!l`DO$bRq1SvxkQF@4AK}MvCNN=Gin4lnp5;_D)=$#PQR~+ZQ=iYlidyn%xYrW5Y z*ZpxmxYp$2f1TG^j`Md+rpx?DxM4nFZ-Z%5en6_m!5Aq$dMyUcrPEZ`?Xv9hs<%?* z>l+`ktKVeiot~a8b}&!>DwG*rEhAeF@JgLxyn}nylx?eJq?%xaN5-)`5O?NIa=?}7 ze-g^14`1_@6scq1LE|^hkV-~;mCCHw+n2&L9Ng->-^hi$4a|&C4aZe46~Ismq!rQU zF*r?cJ{SIMiw31&(pfGrgtG)+#Ah)S`@Ne~)|09JY2RPc@&D1b0gp`eE{NPoCypdw zcU0xNAM8=YMmM&}F5YjGIMv=-DNRKwKZzI&w!sjTA(1CvMu4X+qvyOg8MGF!&O!Rl zUm|Rf4|wx4ATJ|7Y|+O8gfRr!ewP_Hw@sq?Cn?Bc(*LYHaWXN|nBDSTIHE+0J5 z(kE=+4aVhK<@CXt?MF{$Vp#g#Xz8dj-Oyl*3Bh=jrx1*DaC46xaf}r5nw(6zDaT#| zhl^{C>h@DJCW+<&Fb8U|6h?4uqP64Rv*BpN^A~_Q-={ z8T=j!^KvKl58m_lQhHnEV=pPmh}2_5?)bnrIU4S0Je6a{jvd(j3)g%EDG!em5i;qC zQ8vdH76)}1OieU25V4yJUI^~xw~Wj9-Aahjc7ErzVLQzw`GaG-4U1erRxp$L%kuxF zv;VJ6u7ag=1J!Ks&{}nB`r?A=8ptWZ&p)CPm6z#0!6Ta7NOYAM$vx~7N#^$@P(;G7 zzN)B#%$^TwOr@`Vi6i4B+YGLA;tSUzinkG5g%Jq2B2JmIIP3!r9Kp)JOoe3mXk$1$;+I37&T`#V^C3Zmvhfx)UOyE+!&uZt zjy5m769{p8Doi>U+hetqQG6;4Ek{{Io_Z{Aj#jry7d(|TW~V5p6th)QTHAf%yWXF)?;r3-8^LnZ`L?0wI950t2=e2IR(Wq zRR!TBM*U$3bszb*%iq}wnU@LDjd^*Z?G)UAyxfD=^mE}45s7lgQuT7~#e5ZX(DUOc zsY|{sN#q3J7Jos`cyH&h^jog-la((_`VCqp>Z1AC;Chg9zRnyNI#d`?~*kImgye2(P5fA=X;RPc0ROsh@xS*Q@b=o|V-~g5zTx1+UBKt;bvo z1E;#;3zJoEDnDuQ&J#=nsEFkC=-89HzVspgB+yvVkxNv`!j%(m|3(V*wg5wc2OAux z>Bii%!8`IvSBfTdz;SCl$E{sx)-3MqnL&#lJ-P>?6K(SDbKZy4YNr(Rjm12|qJFzk z%zDq8*-LpOxCh#;Pkr>sQRes%?!~3;U5+-VpMS}pj;RdMD>7rnk^S(-?~5Y>pl(;H z&)XZF6s*WtnMOChU<8l0?&TCP_Xy}S^R}Q zvMFATDnFecBQn(&l;;*S^P&H#Lo`X7o2^0xx70kVg{xQ!Y!YawC&v0Cfl#``K&%4W zv+TAik(VIMiN{RLi&|UnuuTuwgLh}=Vc&MK3#86b(WdCI$L`!KporyPtZWv~HWClq z(0DC>6S)}y(SW+NRjfM64S*1<`%Cv%F?s@~Ht z2Q?iF(Ak-JWiu1r&?EEqMn9r{&WaUY*4Fg7unAS*9SsKpP{|yA>m|;3*AJuvaR79 z&#JDX2<ML?d38en{~@yYyD0~V8Zz|MS}==E zVlq~1Tsx~!KoRFajJMQ&N@F96BkamOmCl$US%i@5&N>5L*D;so=e!lC+s4~Q+9dpG zdCZv49@uHwrMHYv9U3cexeV*6V)@C9caG~_cGHAjVIYE9}b`-DuMVSIa zR_J)(RPueHgVhqN-V485>n}SiZ$L?FDn~0gap4ktO_EadocPtB(2&r0Z41YOOnJh= z@Yp!X#e-lNA_19iQ|}!VH6%{1$R!r9${4fMl8r>oXX}JxQ;V@iL9;a6w4oOMBSQpS zBj&)nfHf!Sfq`PCDeX)^=UzFEr3LF)PR0&vSBAa%;>iv22ROX_ky7aCu=1SXL5y#r zNscZL9IAkc2po+phLxjc7TKpIa_dsIy0VYL>0O`mKa>-kWu@xi85PVj*?G`Tvkzrv z6+&-S#;=wa%JGwbWZjluiygk}wpf7Is84wKBA*D@c$V@Da><1>IaIf=gWc2c+bYJ9 zy!K~4sgc@#lxfq^ur}m6t*+7+5oe7c1gwd3*h-9sGv6VF%%tFijg2Z;8S#?C6Fl7E zLosYIX+=&_+6af4iMWx5k1HpPG#h+S7fxGW!>nXxRQuO;mh0m1)O0TlM23U5`{GgnipR5HS+115%y?kw}56@#A;#9dis|}RP3;1 z*NQu#?Tm9D{Dn)9bBbXlGt%*XQXt62oIwG@S}gg`+!|IT2O0&7FR;JsFboaq9fM=ha&OLj$FQVLG*)SCc$1jGrr{44$Fl9(fV#I#9xK-++Mgo2d&+_KgppSak{_iWyu>U zNr;`muxW$1A9jLRQU*C4p{*v{H5W*3FY&o1^6ALn^{!guSSaIq!u5X2R{96l?d1el zMN!IQOpCRl@SprFzHVKug87knl)4_l@;s6%xLS$!BDxf*G_({bs{GogPR3Zxny5CE zj18-Vt6-nmlS+WSUJ=+f~jtW7a^cOCQ!RcDfae29B&@2x?tNa zhBB9AlBHQ621oJb@A@#*SmUSaeHBMf+U_Z*_m$4xdNSh?>*uckmyr1R*^zR%ld$E! z`Hl7zl&@3#u+4<1I%KiMh)YMaTAf`iN)5xY!CFb3Ru{slQBUOnu2`NG-(ic$7&@oDkT*kG+JTTM@nnv&Q?A>*ETp zfU--@%zJ}sR$W!Srbbtwnc|@>^x{|s2I+81pJzlAx7Bq-3Ll6bY7QH;x5f-$U%ZU9 z;{n!0N9WIbj8R70Nh)W-Z&KM&^5A<;!Wac!BItO{PB>ewzvzpQN@UC)(CN7I@?=Ge zwG8KQ?n%DZi!$@XQwOPSM+%Al4-C^6?{Ca?2tyc}zqr6?<#7cc`g2wv^VC;9J+1Bn z$5Z8F8fK~{Nj)is8$E(zjt{n+)7{LZFAL z>B>j7{S8R{>GuLPP5`QAIYsPDf+G5^xpnI;;N{a2|j6V*HOvVl8P z+NS{*Q&>`c31^@3gn|i5035v!?{L^%l){>bT>j#TQLj*s5TAdWcA`SK(%?7(vRv1O76z2 zOl!K0sRuc8W3o>`3Acq0?snp{7MKriuX@Y7OFZnl`Yyhd%%N3Xu*OXt%3Ut760CVl zpLUN^@5;Q6X>wa#kX(yg{7~L$+Kv_4ke}?rjYd98B;B1UuAsq7c~1LVDV>%8b<5J< zuUq6k9hz0eG^i>74@nwh?C4Ir?Pa@~${D}>GzECL2B0uO-Mv|Z+f(pKF)s<{#tDVP zK=0H`#>M$IKNm5EYN*6^-pY&D02}Dn!$p`Y&F~;!pZ=UkqwTU%_$XMrxA}&fA?Hl1 z+z;_*;bxiybpN2u{2vK3@3adnN!T}zx=V${ZFuHJ1U0X7WmkJR5PHM_PQ)9~lRVRT zRdr9r@;mKlzwTL+S=ZH89YustNzbFGaPRSNYX&7H1~=qbgO|Nczkc7~MQx|?L+t^o zCRM#P9J-V_Ix}D&S6hr{(!UZrEblq8)E?H8iC^nI-HDSpKk=ym1RN2csVk(RqfoBy zQw`ST)E>LUsK;$}NlYEjc;ynb$RQK9Xl;fAf6|U-+X+*tG{5N(3h)(6(U*E-Np*F@ z(u?X@wXqMn}8(FyIm z3J9ESV1ErApFQ7^m2K*9X;~Y^XTR6@Bt4=KTEIIt_ZzR_X1cB-v|52a@!^d2g7qXA zWJKCfdI^~jdKA=WSaUGOo~7{jk#m`R5{L9%wIvksZDg4VYs&=+F-9RLg|tAwZ=4sp zHkA3FXqKft)0aqMRFWVw9Rb6fc5kg&9PkQ&N*<4e%%~ApZ^8helVkxMRe?H| zO~2_&MAk4U%~~@`TO&$}N~m{+vBg@p;Vez=BzDmPDN(WOUz8(UADn&e2&YwNx^Irj zb~(I>*HCc2-Yoh~U9yH5UjD^654GfXhrG3xYrst?Uu(|^7HN(ZG012Y!K~E(iQQtw z;HOn#cre)t`_*kyl<2!ir>hEhc{pH8>p#3x4zt1EuatjWVA}mQGw%=>;qCgM=1nIV zMX&0vUes)roN0KyUR&VB%kV#XPV6+@Lu(HLwTHDqvAKe$xx-#!d1BXuqqPTIRzERB zgDEUQ5mMph{=X(D+J>P$b~(CS&0xYLkLO2__3k|#e=PpwtW3q@lDea}tNPN@OZvIw*U3NiUc2{nQhQ7{HOt}C^Xn&)$;TqQQZI*)6C08)Jx;x% zZ8uF@-|n7GS?tS2kyVOU21w#7ZPv&lCkk!Lw!0Yq{!8`7PaJH)hxpj;-r-Py#3R?v z*q#Ri8=s4-kMc2%^7Ixa@SqM{#m!>i2U3tJ1MjUOD&a}&J|32QsB!6^0VQTg^5>C9 z-M?@l)?*1}ZO@)R1*#USi-I~Q<~jVvjeqNF*jkAN_Q131gavGcF~$75O|t_8jD zP7aA2KvBm`afsgA6yObgMt%0?t%$}8a=1<`lV)eP?>rAbYW8@;=1}`tm_kLmzWM|2 zQ^V5r#t*a4?^7l}N(EXcN!fLJ!)7lpTu@p{Vz8amv*l;(hgSYW{F1c-#4k35^4_Q3 z$&q^3s)Qk}>vPg2c#P2EXJ)GxG;>X4WX|@E#M!r8^*zB@wW`tkyb>^|19s@X)yJ}v zcX@Z@8fc=RC#UHGj!_!xwZBVWg2!ErBi;r+{Vcrq8 z;z-%vawrgSOwA}{$u);Zkd46g`a~KfG zNV>ByFvp#h*2d55`*pcc9#CMCe%Huoa6(7;;eLuPqe*rbg6MNf;j1df8E~8d51jEt zkknH)ZFjM1NOvhe-D&f7ylBU@dnzKAc~8Cm*v$DDt*-q~1k8>noKB{4V^;Jr5i5M; z=tU{o0zkl&{{sQD-yD{tOpjR2OkD1#T_S?W#dv`vO;ggwt z;rZO+J3g_0p57$C#fs`eqH4v&g%5Xj9PVwt&LgQwmhd9*=ga$uALEo!(k&d4kl}N{ z7M%71dKo(=OE1%{ciq)fwdY;ktYs_sl{4pM$38FTdca0vjs!ZfzOEr2wSLj$R!98N-s~T)gq)RoBzcnhaO zd?7zaJknLqOzCf2y+a(nhTG=`_)u`hL&aV3Ns+BSXt$mjd2kHkhH6oHSw{Zhd`^W8 zm-NPdt~VsaK9-$nI)4rDhm!s*oSBn-b&q6$A@l@^=qhB{5TA*69GLx?o1tb!F$;W- zrQr@vIN*=E^kg?0mF#W00)G;3$RPs$hkqsBS>qd!p@ls4;AZohfNq(j2Rgj6>)b1y zD89I479vT`X^15i7n^jf|Jut)iQ|12f9orsg*Qr#O-x7JZ@wF;heSB!(9#LLcoAwb z%xk6Fm`7t(C-yikwElUGbdV-mbHP!Mb=&yc9`5^Fw=JBnMGRHiZD1c6QAyo@bGu4G zEy7z3#GOkIOCx!B`75fkjC?U;?^(*3-5#a_?xu46=K*2G3LE((tkQsiKFX7ZB7fvp zOIWJq-4=kfZqe6T3MJt}e(y?Zu)p5EEM+rrRK4?PEG}Rz`Co)HLIV2~kK2Z7borbl zmV6kFJhDd$jlJ+yHzS|@2)|?UpSl^un=B)z-}x%yVh+`1=>R>bACbe%DCD>5R%kZ( zoJSL-;igo|j1^pv!1(niJ=>v(=tx%B&PuudS0nX5uMvpuH+Bc}fpd|w7mcXAr~CB^ zfob7PQJ~4SOJln|{Ubd^#?NOsWclo^qj8LdFA3B+hc`oQj+|5YPy4 zg(!;f96vU5Bimh-ED0MRpt1WZpgGy(`Fu~s*?>HFkz3K{?$#!AgtkDArsf=AyZb#a*tc`J z#s_X98Y_?(+`^ePe(NzGYW4(;ajQ=CW}WHHcQnFt+fL|n=o4AbLs*95`kZJFze_{h zVV*)^jY5EQ>3o!(W6OAF-y;=xc$wdsj6X<}hIIrIzw}T<|0C9kYO%>pQ?K*vS(3u@ zm%HF54*U)=a%iN}@rv!)c=bmxoN zGwEs8vp`70J)J&pny@u8bg}dKcKogBA6++StoKUq<`vcrIzZgd`L}M6)=udK_k7;^ zQ+%it`|dm&xbV$cd0M6}hc4kByhYKRpD3#d1U3G@D)>h!j=0F2Ksbcmy`*!ZT-;z} z>>Hyb$fj?rjoah0auY!D)+uHuY^~wU2A(a78gg+$AR~0bp_S~oGYCczO>E^vUQc6v zF+7iW!}AAEPsK=Lp0N$uYgt&}r@DM<7J~b3`Drq3t5dJdCsxA z-QP;PEO^6KHV!H5iWk;vZ9Pl+u`lT1vKCQ)$hH1zsK>D&utJMaixjZw;b%@1Hh4T- zjlkct5exK>y$_%ze*c7)6n_RB1|Oj*8KObZY&(R9d8pYE=xQKhWhLEA^KgMmNOb6TN3qx zHh%293sg1MTKUNOqfUg&4O;|@4nT-LS~d`zu8}AbQQ0Kqcb7#hv4@WBy*0fzzO-2e zcJ3TFmG~bnmHn+#G5P)ea3w~!pdUYGFpGwyW#$eKpQ<;1n8p##Z!<8;8^vQ_Y6QUW zZ6}^*l%D6>)E_Kz5m)bgd{jOCgP+_r_x}lCqQQ=UKduQxjO5&wJmbLU6Q;a2FHPS_ zY0&5;^N+NB;a=Q)T$gpZ+w;7({n^bXj&J;uc8)zz7Qe(5yYcyu=Nop!XiTv%!nufV z>LX{cf?;|I*)pPJdNvpEOKf&3t!UuOyGny_2AY9{tttX6e{R6#zam)y0p$&E zy$XK4ZN_+O3_yej8C8R{tx?#PVuo=VsV23p2CGb=fH6;R*!!)6?e z2lu!tLKi>2Qyx6n8}(9{TDWJPP%t?f{S|fM;-1-_rNgZ>bfZ%bsjQZC=jm}ZeHhwJsnqVwzmW%T|e&{;m-3}p#) z=ESF!njff?Gb6|8)?>Hjr*2-O&;9s8?wn~p(su)ruhN$kFz^u-EiIfD2rrVXz8+DE zbo1zP>r6j+q2)9yeO6#PfDqbQ>UW&tIzu)CuHS3cK+Ru2@(@_>{e9R_6 z(ED2Kr?F3Sbq!q%qM0SAAZSzFPBsoD@o_^cB+6FXc?_iibFx0r*RnYY#-{r4za$iS zFxZFnl>$sx?O`Y{ff!k5H>$3^r zwJdguraqhE)3NIgFW!l|%R;?-_-VrleEpF30F|jE{JVAshqp%kfllGw{?82d|RjZgSQ zmcqRFP+yQ&EYa_!?$X}>7gP`&@ukcV&kv`&eW`#N`CBN9!bxF4*x#>MNG3+KFv{;X zXx-Afk|=&YvfwP+YP*WKfqK*=0llK1o6f(JgFxH~^ygX4^k`pe>m;KSxKvS%1( zeS!2fi_YgT2%Mn)!m(PV?$u#pa@LB*nUTmRiJF&5E53nflqv(w&H}9D1Hj5ihRrVp zFZ@Ma)DOddsGHb*xad<7Fn178@&xqw{UxiGh9=A1r*m~(xsM|lf_Bs_!MMTe;I5u= zSvQG(rg(-HPY})ViAabr%*B#jFl{F$t|~9-&TZ!xt%z&-&y_D+cXf?Fbn+m0zGL^? z+PC{_YvX(0y1n3E8$Gr#N6q-)`Hh~`6=SWv08hAZS&}8G%oeLjj)7h*8{8DCmeF!6qL!6 z+PDBGx0PZAz?tc>gxG5H{TfZ}Vz!o!1Yt3|AT(EsyeON<> z%YhpSFX@_FAg|x&kUZUH+6{NNN$bhc=BgJh3|q9O!mL&gE z_A^;zbS#J?PYHdPBl=emb)M9xIQ*?#`Z4G)3!;o+%q92L844ue6{#l2SoP;Y3A4!RMchm^V}|BlwcK^uQP@v`KYlgc zJE@{|=N12m2^eRbs&2%K0sMG4#%~&Apr%r=WnA`)gmA|o*U8S; zLa0;S%l5i-QqKnA5K-TF27p~|+K;^`%CH6M23@eyG8!)>%c}PyZaly8x9WYh&|0IT z3$~thyD7ljQF&bfv(bT{aeq4;HZ%1yKZ9&yr19nH49#wP<9Oek=O0a|J^!AptvfLx1q(bj4;dEML-qNy8v^KbqV=YEe>DN!xsf7Bf z#d!-!&(_1o6sYkykx+k(AI}*fuQk4{0DFGk?$)w=p~lFB=+ zItQ-Ju1#$acjlfgq)TVPLwjk*=_4WEd#l0AjL_T(Nohd?=)K=;&^9AGa1V6-oiSn-JBzNc zaxZ%Ze5k=Dj>>7H(UNZ4z8XK|>_8O-c#0*?9LV>-mv@x`JTITm?2=lmJ>Hibe(TVJ zH-6!iNn|DOBiTw_j<@^z_5C9iLW_5r3K_}FdyB>-_*}>pH};N9_{N(`rk}0>+!>;N5Yb!l3*6Xsa%Lc#s5CP$EAbC?Q%$my@UPL*w!g8k zGa)(X&$={rJ$gF7l3~V>qg>c6%`*Oag)l0>PDv^X4lBY6QQ_+ zM5E}JFA@O#_%a?!{6?K=e(0yOuIq{Ik=4HOpRJZy$J(ac>qjZm2MP#R&x6AX-si%TT5PHIx-E|cFDN?LEY26d$c$sj zpK3{Z&7>ljM&ZPPlDOjR;(rxBwKV(gAvSdt|CSI3rQ2O(a?v@Ke@}~Rvvgtt_!MjB zdf8ei{>+&>BMrx=*luh_@IKz-YZ0ZkdDnmk>++2~6V*%g&x7AMN9gTp2s7eAespIB zs1h^i=PAZ`ziTqrIBM21EV@*5#ttOX9a;A|`IqOQTK*f=q=hysQfd#G;Ww_Zt|q+z zBMt?Qnn;${plV4scucUevkl|*z@3~_ucZgCyM40`plOu4`H4sF##ldHxeYg;lkLn` zPwOBO55;`~gGfN8Sul>2u7)N#N;SCWF^BB3irY>&E2S59E6Zm*3Rt^eE_DX(sJe$z zTv0ueYIE#Vn3{#nOGyBxiC8YWvr9RV-7dkR(5i#I*%EDP{=>~&#L9Jg+=s1Bhxw!Z zsq>d$bh^Swd@oTH;y0}o-5AcTowOr5rlNPdC94Ck-sUCOb&yVO{4$v}s~E)Le(b;E zIms484bFwB`T`8%;9SQX3(LyL4%*0`k+)m_x#qn8z+y&sJ{7jTPI+m^oZ@x?63hIG zjj5Na(N>3VfKFGw{Oa3^+}Whv^9S-WcbfCp#rh{U9254Qe6lA>(?3eUIWm0lg@i=l z?^qkrUK}^1+>0>fXkHoz5BQjXSS!cR4O}-dI1L5{^#InyNK4*9r zUNL+4F)PpW0Gj+rY}u;@Bk?nE`KhO0p*C_4m)jP?hpxx;gw$HF8aYA_as>ZIan8pk zseJ>SpSFY60VPpjW_~nAy_X&0dEKmKba1d%dBm%#BAV>f zaCtnB`tWhZ`;D4gtbULAO?EC<&;1{Jh84DqE$8@qVjPhN{A3;=hanG0ijhgFQ!9$k z---W|gCks$G@ODN9lx#-jw~W&3Sck!ZgxHiQ(k&S8){bF@6A7Z>jcf;HZpZIn|tCs z?&(P`;W>dR9;&-F*3==q{ub)&TKf;JHh)lXE>dce<<7dm4Kx!BgP!Jv#B9;Knn;*` zP;hdliPqhrhoX}KI-xML$@JDV)PHV>JA9Pa=*xi~ZE%1UA(Du^gMZ@$J;|VwFQvIx zuTQXoedCjp+jKaruWIR;5{?`P+gh9HAq66k?|;l*dIKD~pD>zKt3OhLwwVdZB+P^g z#So|}-dT==H0UO>Nfhqi{~8NENqCasfK8X~tvaPpTFc#+Ej%!Of!u!mw-E|#fmzBW zHZ@S>h~*ksDkM*ONH83qz3IWWa^7O32GS?E)eRCj%qBbG3C;suv0Wn?{ROhvZvBC-kv=d4UxN<1$%7MN45#VJ|(7qCOwr z>K?RN!i|5EmG@hm1Z;$BDH{rPc7V&}@2Pr8QOP zQL({ehbb((S3mqlXZFToQuWfancYhMb%fH4g>j{zGBi*)ki#oC$CYNcW@fkC1-5{T zTLGF18SJ6>khBE*oQ@gljbUxd25oN5pR-+yhbeHnXKm`Q{muyr>3+d2Da+{~1DUT5 z-M{tB+F*07#o$G-k%HGoRBsg60~FSXg7!u@roD)sFW|5Voz?I^P!L8}R8IV4!zS=m384<)!+AjZQzWkRuGX!_erhrA;_G<1Z9pCp5>hJk%)I<~&s}MLrO=rn+dZC#0C?!^(>=Ru zcqJe@>4e|GL%~I*6rld$e&Gj(io;NI50azC2CL(aHOdsPJ(kkU*- zN|!I2$;>Y6$FT*QvJUl%8dVX|9Yh(BSnHam*zj)A`cI#Mc##T8U#!yCI?XDyj3IuR zh<@b9gPh#=$G*R@=z3}=B&G#Dm6N^VF^C1;$fpkUAggFLlp{&jpIEWOr$#HObaMcN z3d*e{o35&9H;=SlYSk>(quDCJqlUSXvxSObea&uV4OJk0zsHip9Vu~0;Ed!^G8L=X zJdbn*rU*|O0OhFi+?2)37g!00r9LS<^Wz6E;8Dz^4P?YPW-IxPyH3e=`J)TX`XFD` za42EN$jn3sULx`5Sik5rmwd4gS05i%-mh~aOg~Jcq05WFaX+a(O!3axA#yI&wy#in zgKRm`9f&2U$d_PuY!o=^zUDX3B6c-Sxav>)ITl#q#R(Qj=7Rv23aM|5Bh8#+BsGv7 z_{E{qPx#*A-5JGt$Q;&AJm5}QPK3DA_f|%AqH?`gGZs?aXWzj;^lv5R2fY>x;nMUO zJ^cM2`_M_50<(xpmYG`lAQQHoT`^S8*{#3Yrb41aR|@0&YSyA^$XHOy+o~c?P+M(R zie`WSVz$D(X5%yEk}Bo(H4BfLggSQSwdEt8C7i7D4Na2r4zMO>TZgjceP=p8Sp8m(^9ACCGB|V%Bi>w za;}RMy{q2f;)#ud&l+$Snxk-3Ic%jYG%V`Zq!sU-w%tdi}E3X6pd$XQ>fBOtpP?K<|9dV9Ie@iAGKKvOUoFr;yKVmv+9_ zur+CqW%rgouI(l_cFF4;k}8vUuU!~d&Y>}1LY5kgzx6Rhbs@uKi_h9_HA}d0%RxTUJJuKXxW^?5)ZqrsRb^`1r;$! z+nc1ByPS%XdB;3jaR!PC9?U9Wnp%Nhi^NY>uYd4xw;18HThm!BhB1o8no8Kd_V`Y* z&e``DcmMP`F3UNgVM&LOsL4Lx!V5!<&+}g-h%fNF)VV$7iNd(F#^;XC_tk)&#aODj z;Qy8k1u9r;*L2GzKjfS83@twawJf`@im_hN-V#=53_j9_G63W_f{XSs%(gT z@vA8$jMFNkW}87-r{Zg7WH%q#tv`w_UCjvG_(C~R+F#^OzfJ@h9ins~z-6^&dv$we zYrRX;4|VE=8-K~|{WT|lG{pvM@jH78p=Im_w&TP%tQsU6 ze=1|&Xaj;NpM^{|7q$Hi6S*sZJ#{iEbpr}UMcQE zWq*LIL*A;~Ol_(A;K@L@!=rn@yCkVykY$BwXryq}q&@}MW_9AwGi9mQrdcx9a@fWb z*i|4RUrs_vU5)H<@t76+!0GVf$op}z9+LoZRSpnW z$-EQ{bHdEd%9N1`%q7SN)KkV1;BK1(QMhr;+WlT*Xw>@D*0>tp1jFU!uT;x($a>E( zy%w52;MEcitcePto-MB?tyzGpF4+uC7T_wfP#=dGD(I7vD11{309Sg}FcU&rgOObT z8CW&I8T&g3Mw03gB@t%1!{N0MK3&Z~gpl3KQeQ(Q(MB6CU%p>k3VOBbKPM@)6poKWnT~lev029~JXFaGTr=?ZTlZ zQmU$fY1s_7hkwKI?Q`KT^Q+52NoXg9=(wcnmmj$N()?M!|7Z+FYI|M^3Hm?g<~_|C zK#Y(iikR-*txnx4s5bH1HY)PuhyZ52E+>5?qkbRUHr|5!QKT=su z2ji>btiQrOYHA}!Y&!Laz82+}bQ<%>M&RUP(vrtGPN*X0am&^3mT*W!*BTvJ*l00k zjSn6eDt;lVQ^hZ7@eAuHdUx9({p2$I9r8VvM!(gN8z(tx`GOz0$$T)2s|uO^i_X2EGP5-mH;ukdy)HfM^#^Iz=)agbRft^ z(yV_LP}(!l6xF|MSBhk8&jUN|KFFf%_g6oCJA!dWW6S(qY-EohMjwUM{k5U|qn;eo zytKZMRMTHIcTXw(ZT0di4?obNGdoIc*5a9>Oc-M0KFq#BgnJKm3(aC#xwqq9_{XcA zduRFT6%ao>kl(As54jurR!r9Nb9sYJwJh_1OVMaH%poYCHtw|$)N!64zHQH9f~hBY zUo@|jKTRKX^)p^iS$TzYPL9H+=H9{!K|UW9F~h~2QN;wxm&Lb{6=vJOh;a* z&GSzap%2oItU8mv`~74Kp1uQ`05-_p+u43!H2_*fR>?^*wA=U;Ila)TG&``-Rcb^m zS(riAR8*{uM9Dq>XVXq}oTVc`_PLe5DspT3Dw%x9V4^KO`Nlo#bwksRc?e2K${?`% zxXHDaM>Q=*ikv{B(w}AYHoi+bsdPiYfEyLJvU*Yc%who$${qa@EVXq6k;v?sk9X7} zDoj0a2?9a)DYU%ulJ|>C;*jMzWe9YmxI?fm+bDNA(*DHZ{nl41Is9^|H_~0w8U%sg z$jZipsiq>?409uS*bnXO=Oi3*Z+jpea;9BDA{YkL-BUmO2{mTMLXEx2vy6@V%?6;x zARzz5TXfBU?D&_6%36L=L2%s7dW#=RoMmWFs`|P|(hx^zGg{-PDFX?l>wd$$*sTYw zCpBn)9rCIP&-drz zQ#Yb=gck~>CxL%te^crXYe7`h%ed?}ezb!i0hg+gS-lK{)aQ}5#&WEpL`qBQS;G^{Nsn^-u&u*kb;FI*N@&nS?b{V><&Y*h#Lo{_8$vPX5QN@2*+^abJtGAGfAfnR&$aE0 z#EU0_0sLht>E^9YPaY6me2hpl#Q%_@mI89~Uv)M3mfuDs6+uG;qWD}iy$GXlVH0{o z>8Qh#u(Q8I)beN#M-Q_gYL6ehv`IUS{cy_XhR?N;^+Ug8pTm|8_m2g@(0wkyP^05g zmxS5jS!bAW3NFU>9d<~yt)Yju@e-jR9;B@nAWub_U+I?p^7Gh{6&xJX|B$ZzSPnJl z-5f*7aKv{!QO2bC9J(IJwlYJ3NGo-9RF6u`k}u!v3Rto9ZAt6*O9k!c6M{O_pSDkt z-)wBQ-jN=&3FLkL&S+gL8L>+KYk!gsKJpj60TrU!69z#JS~%<|Hv#-{XF+c(-?x;4 zu#yU5#VrzgV6oiHSgQm*E^k+6&+WjPL~xG^?X~zex~I{-;~4J)Cfl)xM(R~=CcWgK z@=MAX!Zh`TD)oiuPsa;Ely&QlW(wKF%6fr8)>ouk4M4h0gsJ9;i~=nGjiinXL7T)M zXFsh+9|^mMlkfuOFnw>#9-lD-1ns@`sJ?oA!)_A#y4qfI$T z_X~2CnNT;7_zHCUx%a>yK)22cpJKsTBQ8z>MMyn{1HzP^SQtJTj=Pn<{95WNMlKO7 zLi|a_ly`guGyqDbDm!>+@&1h?y7-!>K`yh^_=?=V#n)!1;e&M?Ybh_JEoiTRz;kI_ z`-YalF|&nhms@iCuAV7}t=fhK^}o8eeGMP<3hj1t^;H?Ias3=+*Y?%(6B>k?;)E#O4m-eH1I@tl4;3qoHPo+xUY8pxZ>xY+bPNScfj8 zpJD>-Yn5*4o#MUb{MDJ8EXTg#!$14pGFVD$=BY6qkOeS*x3yt)9pcrc&wg~{Xy%7o z1_iQh*P4N8o8^lrH7RD5?yTBUh&a6NDRIVitk=8-)pP^-JZpu;l*=%zY_ooMRlrZY zGs@rT{HASU>)ITcSo6!iE6E$ztp{Ec$H;2k$|ZQUU`M#RAoEMM30Q!r@LH}M*qfHj zZ^#Wi0x!+7h;jk!-cuG1hZYW6b?&vDu$K*Azc2T&L{4u&GHO#ql+`ZSvt&|++d4BK zB%ow+q1QELFg^RxZ>@K018P*I7ZqF0t_Q^m2^>4{MkUfqcBkB`oztnsYj`OPH9nE# zPD}H(a#kKK+LR5FtbFhnN0;qkEP;z8cIhKUmv_CMe5O(;Cg4*-MyJ;1Ttif%rAm-x z^(aJdOv_{sGthF5kKg}+r|7W!`%9q>5sI_(;riiEj%5qtl_!MENLGjUZ2hYxpuDOe zWve=+TcwOc8K@uf{BXM}RNC#pwsPlBykg1`>J1{BYkUZ1o4te^ox^KlDGU|Ze#11! zMeXV1lZOHw*+L}hjJW0le_`8&=WSN|0XPCW^Qrais+e!;;e?#FyQrE0x^(XS-Lf5wXzc50@SXHrwBF%f$4(Ev9b{ z>Nve^aqp`ilAgo}e zm_64A<|=S|r)g&;%>UB2j@bWI{ZhAE*w@_JtFe=cW$6Kdn1#K(&%NSR#nf*v%T=rA zW6VZ>3Y-g(qJMolUUwML6w4>GW`MhIM~U-4L`9F>+8Tf=mG|2w68sUGV%Ej`{w|fH z+r-Gp6fGux0TuPYI#PSg`RCt3dUZAgqG-I?UTI;mK-ZT4Rmofa-%81Aol`PkrQbaJ z#`*viiwURXqJ*Qx35Q3G6H9c+({iqTK!L+4RUe377(%88?W-(_Sg1nG71gE z4c2wc20&9s?%NEPY%sJ;*@}@tO$D|5AXVcJZ zP%aR@Q80W<-A5ElpD5P#9p7ailV#*Qq$-6w@}g5ZT!oiYDr?YxgdXRffo49&{YRFH zqLKONWZrY+I7QkT&`N|Ad7yg0XnChHAc(*f{&+T7-~Y{S2Fx9--;aL{kcC@INkj6XCBSUa=?1+mOUXT5s0Dj(gE zHt^GDFvj}5HLdwMd>$-i&+M(5MD}|bG_Pi)9cf*Vuv_0+D;bX+RG`(g-nBahGnH{u zzO?pmjqh!I6Dlk_qW0dyuf)LyH-dp8#6b%qa2IW`4h$d19i~R3E$nI*6XZPv#F(0b zE*Z>WyI#D1sG8qG3V+?T!EeAp4Hj^)5^X9h%x?Ykfv#DI;mOJy>Y5O!)Kg(LH6{J% zdHrb@J_9a9@Sp4++st-NM|YmX)K2=H2$mD}l4PWjQf$*{A`=B~iuuj@Ubx}2R+u@r z6z5mucx05AvBzDEfvU`=r?gTW{5-1+0!{Z$8v~fI`1e0RgIO)~4Q}nsfFM4=xjD_B ziZ%O20SQT23F7BP$)d4lc(2)y*f*HGc9ty#dR1P#WSXEb+6M*;gf{*x*{zmBHaNimgaW zIBP&&wyk^XUGPH=P6bb1tp=}$#Suo8a67_#(Ym-=`%Qbxxq~?&H&l{}H6Y^Wy~m-T zfmAZx92=+awo&YJE*|b~UD!CLxP!kT*&tE0|MTUB_m6 z?(G4?m%>C{Zy`Qc+p{wA*vLA#;{48VVv&(48ehV8HOQtxgV6PuWi;vc)oAi+XCyG1 zLRW)ZFi2dq5Y)w!MAag;W>9p6`MZ6T8r=&^OF;y1I3N zy*%T#kQVE=Uxy*&9{4x=N9E}a@SX17#!R#2fXbv>9k+_ zow0$UgrcB=AWa;lsEqUkrK$+1j7Ud_8U;cNJrG7w1JVQ)q$H>)h!9!`0YVW%6-Y!N z^w4`C)P&Ca3(h=c@Aui8wa!{+o%1Kao!@W|0#e*_G>$NmIuULJBj zq4*QDnekb0^zS&wHbR5D04L7T2m8TTEOI0Fy=jZ(aJ_Xq`cSSGY)UX#RTx}Uj-tGL z7M=3V-yf*H4#`VLLZG2RoQtRzAe@7F8E!4b23Mc`_esKTfkPryfP^1O5ErfgS7XFiwa4&7OboEcWgZr zMWANN8!tq7Y9#rXNh+>r>?cdus&PHu(RAF?hU5Au&x_B^_slM`(a{#A%TY||(!F3){JrsRn&O$4_>rV88ff@jT!Phy*a zvz?!tAabFcmt}?q5iGy~f^z?f`78jy8GxR%&n955+6vpq6Uyey<5+;)YyNe?I2D*o z`MH(d^iFbYxN{%RT|x(3zR^EdXm2CGLN5)e1KxoGx#kEcG|zutLF;#Q1)=4N)Xs`9F| ztwM^sheGI^p{ok+^Abw~X^P&ggzaR?xSajWR<+N;{~wcX+lW%8SCwt+NXW=QV!L%`vxP?o;4aVv)773rR;SLBGf zpD-Th0ei*AucJ<171B^vjc^lEOCcNH%U;Nl82%P2Eu5RRvTV`%-2ejcMEn1dV)>%0 zwzI|J-$|mwQ1#s~=#)iUy@5DOF%`AX`>FqSM|R`x&G-6XZsEJW@Lj_$B`BXubM{BP zcAZ02aoyOho~b8_s*pmLT{Itk2mn>P^rjJ-?MmmQ9N<&-IaVCwb zewP32Q@a2Yxv66k^9KxB+lr?1zY|45@65ZDYfZOSe~p*W(4`;ydhH=l>uCsZrqk?P zbRDT^In{qh)t@(KVdIi5Tdu1MP)66>E+0in3|kbU$K_NbKL!JwnAAM;Rf%V!g+FBFv0t};_D1qb`T6`zgo6#y7Gnv^NAl5O^P@>Da~th9*w!(ZU8&Q z7`)ZG^31;GrT<%dql&v++(N?kDp7c4@5`qrb@LNzDLS*(yLDm^Ij_QQ5K*5OWyQXtuOD`p;sdLK-~1l{H7>4(arrJs;ervb zzb`dM8}0$uLSP=bU6FIS(o@FI6Fvm|-FXn1V+vMX$I`+}Jx|eHN;0Xw6JISWAN!)N zVNc9e(S7t8OeF9>C2*w%q=S+Q9Yp^U7zK!@qbl(hsKSC zP`>ERD+CzKcgoDgq`6QX5*B4?o1-nsqN{j7kx_b(IxM2t{zI+gRUq%1w>=feo8+Ub zG_P^A>*--hdV?ixu0-Hst%*ouwE9*1qYC{pttTkGg{vQ`c%L=Q|2g}9cP#0hg&_%y zYwCPk9CY5~PZ|K1I2E^f#fD2{qZ1dAyaEV6pZO~c%>wNOrYLLw<)i1LFl7!p5h>rg z0%!XxL@cj}$|wu$N#Im7$G#ZsUESAdpr+jU%lUTVxQpzEzB~ax2{Sq{=G`!T_E6I( zKuj~y54->4EJ*n*kn0>Cs!gBO;GQZcdbHT8h!A8)Y?=dP#Z!M)Q4YR51PHoM`TJ@D(&(|!K1c_#w8uYnH`*;J4ieyni4+6L8gx9fy~z8g3(^Xi?W&gb#AnIkECV-o)mDh`uATCd_S4vArbd(z;t&1^God;PKg_s z3RR2F)V4r|g4)c0oB3 zzJM!Y6yn^q!6|kcM!oN=)k(waaRU)0F~{4b?qqR2I_np6oQ^biEj_+KA=)!~ zHy7e?773akPt7<4TbJ3=E%#b&Mnzg~xwqV!inVf?xQd~)XxIJjT}TwTi1u6Z<5L`MoPoVQ{asKlK|}lr%j}wM+baG6o)mgAQwsoyvnTL#zIx~u^N2a^s0 zbD~{RhhmyMhHl+cUrf<2eLmdgclEOu6@{%K<|n8$B#Bg8B90e%miA>lnrlsvN%K;M ziOxXRjTO{`l@9GM-P{}(pCK=IQLhK+SHx&YqP!*W*-I-pr&fQS-0UTB6?uZ=EoYwn z1guxWOrmWkFz-G#8IJ~AUU^4Oq9J(vJeybA6FxmFEHZNmD}Cl!Y>N@z*O9QOlqTb?+Gh!4l4678*Ys7h-VkF;QO`wsvp411 zmg>k{o!AxW<_uE1n#hFwa5pWeC%-l3aJK-dnL+3)CgAk!UUPSA?}EoeEw68%VcHTr zT}|HA%<62jw`DJIgi}P$5#pY(fO`$(%k>3cNFWI`~dc=e{Ub1tO;e9 z{x}5^!Kgnu+tGRwMDo9hbmv_YL`U?RQ@gH6+vbYHu9gqS)XwCUdxd3ad;ze>NGbGR zD{hz$LMpGvxy{T#CpGwO`#h_wExrNyB&l;%-y}52iJw?0+7W?CeK0T^YMoI$M+WV$#Qi1$o}#IfRqIRS zeUg-w0HAQ(F}CPh(o7cD7NIYK*XA445K)M35EXZem~|%6M5^b#xCLJ+Y2I2R^sNUOV9PfQxw(> zp=xK{L`G~9xLp4V&>hjGDLYtmuL5P+tj8F7|~#cc;Hm`bF~M>E*z2APq*EVhJ#V=6GJ0_DPcOf zeW7urf|v5>xA`y4e2z!6-2`u0?I$kboh0H5Xz=v5`A+qo!ZzP`#2(^^&ui-17=&F^ zM$f7BALHDpZ6Q00jf=Vne1Z^~$=#k!V7hL$f}J6ZJYdJ}jTXkfcddHU`oc&-TD?RU z&X||#&Hb(BRTOV+bTKg6h2lQ2yh55?g92CvDz%t|@x^Q;QaKV+*81ijux92Z-obdx zhz+nuw|oIs)i|q0JMWTJ>hk-Y$1znmxCuvvj!ho4s^youWP3oQ_?MXAyLc=TUi*9; z3X8W}TjHl?wz7U5Cr2J?))!q;wGvLmA0f0yRJa6s@IiZ*3@35ZDD%2%$_HiA{KpTP zL;V%O?Sudems_lp-#Jk+@~3fC`Fw}EGr$59A{WJToyBpd_7wD7s~rEm(%x{hhc#Alw#g;F((^t7$0jf+1ZMUm&h zN@!j$iqr!aM5PhRH$n);Hl~=;?PTFriRXaZAe<+Qa{{F^=ysDspq$MU*;v;HwQ#7 z_O-I-V?`Y$^4`x$wf>RR?kCL}Y=_Ci{*f*0^T6>vrw`)GI0`+nmRP&_6qttCmLGg7 z#6>LwbE>ipHJ5$yxzD&eAOjwH+IMvyNc{R@?)S=p2fe&M2K8M_o_*(@drgd`Ne=K^ zHHbVyv%5m-tk?;uO6?q3O0HB4is?UVC%c+o@~A)}w;*z^sI@?E@lmNIcQ&~%E;cD* z^mS(O&7R-2ipq+-6N0cSpZ7xu%hpy9s2BZ)IBIjzWX)y?4{l&)FIjF{ecJx+7#cki z*CgX?{U4Pt=-=3LVN~vic46iefzPa6D!$<5r70ACT;9jRbCWP?!JN*6oMj1@FINZd zhYvR`Ff3;*sa;RjjHTwY*lI^ev3)nO)%w!5$;9&P*7gV4j2*Nim-sqfa16RflDoQ; zh^Y2b?`Q6sBS`gaM&Vg*WimjbWJ!fER>~Vb$~>c7MO=3v0!$hV z)P})oj{?TM>X5!1C-C$#!)~l2c$M3oTLV(PZM|^dST7)rW8r|B{sO2^+oAc{i`Vy_ z&r3d$@!ds^JUaEP^yTnvMZ*9L5T6VI;*;By9}nBc*rnT>FeYiIcmZdHe+18%zj9qM zOL6kvDNcN{QnAKAq1o90G&@o*ObiGP|mI~L>1DVSp*q61YCstEq&R7kN7E7vdd6mr!NKG^zU1ezdcOg4& z!85E?_vcjfFIHC)y_$ryQ|1!&p290W9JvF-6u8pX7r!_y1ejlRM|5fGbjwj)V#jE= zfP2}mXia}lhXiB_Qv`J?rI88(6xtKh2~_`!gFDLA`+9*>)n3rTbizc2G&(y;5cQM* z6CdMTx+zTuT{5dWa4fH1z7kxuPq>*l;qdBfn33I0Sv4T%x$Cy)WKJDX*_+~30s~}9 z_{9I<0+F>iCIS-*?8V@+U{nDbTZ;BSyFez%AG6$tck#lieW#P^bG1my9^b*H==&hH zLxScx=SF>ii)6DM@yt!?so2z;-dnygRXonh-Y___779$ryaHK5TkbvXwQxUy?5JNZ zFn5DA``ry^fC>g&V8QJte;A+G{3=tBWe_PUvKyIo+lOu;{p?oU z7&xM&_$Kp_QjVy64N7Xky_bIComBOLRhJvDvyD!ZKxVn3*+B4c?czGO;)G@P!F|-Kj^2 zwgRCa@^g4iVr&BLV@s?hzR|2N(6;pcDJLTR)p9KLlh;&WteBVW&g?;^0T4vcfdd*q&$L}cJzs>5Uo3tDYr zkIp&D7|{@h#!2W7^Y(Z>;+Umc;#E}7XSQ3apZnaQda{2DrNzHdXBZwx&Qw}1n$v`f zQ)n?zjD=Pdj?i8VJNtmFq2}5EnHqyBX*DdB$ZsLamV&$sTJzYNRhL3O@!e60vA7cV z*QeROG()mj$Zki7*)=2q$0zi`X$qG4i6)0{3O2#Ctg6YTEk)8?SFDduK|s;HJv+RG z9XYpf8@6M0A#x7GSUu5I0^GtOB|dMKf_0Al|2Cu=2ug#`>C^qnW)<0XmKL#E-xqcP z!_(C|Ld*&+dp^WR{zsn_zm;9^S5+oh<`gAS3*;}tuOKX8>GFFNyZ1Ej)(1p>j9=PP zCwI!gIzHw>z3YmN2yl8j(|)58*&{30*D_sL){Uw8jSm^#r{*cwAcqB6LfWU@al_vBOln)9tHNa77NIzT$Y)K<5?P~0i{|P;>dc#@aoX93)JiK$qlRVL`amn?9NsT z1s6E0g^@J&cqj0=v6^qg@aM=`HYCa!3w9jG|EyVw1{PTFh07$y{3~u&DcTE*ySvHq z7rx*$2m|^tWEY^GePZV#b&-DxdZ$j0p?F6y5y&F(5&|Idjknna%BYn$i?zI49==*k zDJq^Kg~o3*hmJ9NfPIYZtigJ%&DX z;?L&2_|Jm#^4=cdIBJ!9YLu5>|M(Rf6Op-&P*Y;L*NcqghNIq9Yd0GFXT0Q{v277h zqL%u_i6Bo4QiI~a(*3@958yiW+7|Paa|x@mI-n#jG2gp}eKNZAC2_m660RF(qI}W1 zRR)^fI)d5fLtdeIG9p4=wuB@=!MF(jZkVlRlaK3!%5)iL<&J5iM&gaT(aE8)qLYn= zci}QxpebVGMMYyBYfG5*9<)6b=nensA04nX|CR@?GU^2ad@5nw-A}3|RYRH{G`Vh^ zXP<|`CHh?SBwcy*HDCE%DH$dND1_=*&RK<0s5=@1IDVCc*@wFgv*qxg|`emSy zZ>|VB@&*~b_3?vN>AFM*;1mP6xjw>n0dujk3)+LF>+=nyz%|xfNkJxXt!$g>bOzx=!g&Adnk;&1r!vH9krd4*m*$Uu=2(soLwy2VugRtaiCA}fxom2dFBMu>QXx8&TMWIw=#@qlVpnu2%z`W zHx=GLTl9v`=g*nE00#N>pws5o&)FC=cYe*ZHm3Ba&+(+NUd<`V2-S5L=t1Yub2 zf*{yx_KQ}Ud~#au)k%49ks(-itSKgT%k0rct&t(lZ-282C@0o+dx+1$H=IT6nDWVngI2j2P6nVI z3A?>7-Obs@{_WQ15_6Seon;6O8$kAldTD>B7&x{FCO?3e|RHv~29r0LGF` zTf}_>&FmyI)UJ1+aCIQ0m_Ac=tGn}sdi)^`R6y%)H|LO*Q4h0lSz(D(7P3a)*#<8v zew&m9%k=p|9fss)_5zmd<^gdoU|ycX4ZIIo5w<*6-KH6BSiSnE85#2J>8JP={HYT5 zo>zK$G7~|7C~_dHPVysNC}zClXe-qThvZF$o`r<*=~Y0#?UQwaHTYQ-)@SR*w`Ejm5s#3kF5GPog%12Ot1L7q1(CmJ5FnB zFS>v~*3uzpy{FR^AB68POP#ecSJFzQ8Ba=Af3H#ccqgnirS856tcepGYXSRQ%msBBGbNhfN5JT zA!?iqX%g`h|FYzZi>+(8-!D^X|5~bZrfcB(x8_#6)SGp2QlWHgE*b8;|Eqj7(HaV* z$9L0yrpJ%slXI6t+F?P1tvJ1d4syjyBcbZTY9S~@E@9yq)X4wZd^IsQKSJ5qMc^}8 z=IB0~bE1FT=sA1O{XDc#6GaK}_Pl%}4K-yz)FOR7N{&Cyc)}>c)TcG&v%RPpL%w^+ch^p@jSx|7nWBVdgw?ZcmqcMBp6 zc{%QXN)p)HZQ0{-tw%F6k-3`bS2hGJG*AQjQZCm7dOt6}=!b`-wv6RvE@maqVPWSs zG@W1Joms)oU~m^T&}4m4jBAOxWD`#P@uf4hyiP7`YGWid%}lYvyHm8wKP0L&kQaDs zgY^`%=*Ui#`9e3(4+Y&MSGc;y;(aCvKIt@w~)~wu4y3ewm zJlc*0mI7_?;#zO?VqNXQk4kUP6N$I}A{%8%ZsAl9HQ# zND42^a|+1s@?H~x+IbK1FN9ofk938;uge;I$*T)i82pq;eODz}b=*XBZn<;s;kCu- z!j8`pHyEww(Z`dz)xE6$L)864rZVPd)V6 zx+aq)D_M7&!!p>m1>&@I1fOqQ6Ny4Id^^2za8ckE(s7AGm_gyh!~Ia;AILZ_fD-)YkcuB@O*d7EWj7GSO8NHk3u7fn)_ST@ zvwRk-1HS>2gyIm_(EN_j_yfxO3F983p|9*71;MLs^lif7Yf365SF4XQFCW@NN-|y@ z@-g;{qrl|O%P|-sc){R~WJp)XbVHVF7tuN~?3oI+C%K}3SAV~?0LCV{nB@_{iQ;z! zqWF0@QT*LMqxhBoYZU*({~?OMJTHKXbFCyf0gez0j#}no68LFJTc?R{>c=`+O<60a z&|pN*oP(gB-|=aTcc41>Dcx&h^s84Vn8uGt3v91$f!>LENM(1w{-ygB;xK{$j&w-9 zPhE6avQchW6pp`tzO=k&v2{|WLm^Se3N)8Tq}ub_BXh>9+mMRgAn2x8KwQ%WG%oI3 zw-QuQV*9&Fy!(CO*n4_XDbk;XVmf=YSMA%0cCr8C_BZ8st6}V~Z%TogA5R!9F1oN; zL?bHPtL%K5!QFRblap`iCLmLsC$-uHMfaU%@@w&sl-FlPCC1LIcB!*uYc@yoq&oN? zI6>+Wx6Plx8nhwn(6(tb`6!Et`Ui~{1;8v}s zgLF{=A>hh#y1}8nB4f&_OM;;t^((QvBG68V1)hlb} zC1Vl8gSxg*L!18lV#*$GL4J-nCBS%ZKHSi_{Xu=dU-hG{IRgxSN@?q?ZBdeWSD;%1 zm$lW`O-h+bU64zJwj8g~2^m>QE?Rw-z?wD{Wvfk{lW8^H=*Fr{lOpRhYLmc)$$KQ3 z>dt--&~rsI70h$13Tp?AgQ6{jTGkqjOmJ#fo`9*7f`*a1f|~ z1qm;W%kNSeb3ZlD(o~tl3?UqFSn7QyJMtoaN5yRaEp0#n@@nJvv>;I8f-9VK(iG8a zy#k{7X9{WR?!ii1>o33X5F9x7p#iz>J>hnE#B)%orsqOLiJn8h;%cnTP~H1|7wZR{ zvovx&l$xiRiGJW$VSG?|%CKd-T8_r<4WNB6FNgVnrkBYV3da) zqdbSa-xNI8IdEY2po;#v4t_=z9}}&AZg#~jT=4ExOZMK!cyNx0Yf@>B>8ocqqHMYE zSqx@YQ?xVTL9l8A`Dp>)T;fVAp=_gDb8t?Im6p2ERJ$)aPGuhT5s12Z%Za+VLp~SdcdFr*|HsVfubrv7YKGSxrg^l1x{kfH80UKE+2jkn69zRQ)_3B({n}(U@}_QM>f`) zvPgV>{{HceMah~qcVXnJ@?FFnkQ*1dLi=u;bu+2A=O3 zKZ9=y_Ez^>?~3`-|GJnjpsL`B(WTku-6AVpxf5iULkKmzs?u)PUP5{9DlWTJo4q3j z0=D|-{#^)8N^Zr&EGbK|q|z}=3<&8F32nUKuyE$dr1FAEXb6Hve;|f9{mzmiZ#( z_YJ)V7Pd@96)<7+P1ahtM>Qi{`6i^Pf7tH*TjM&7+PlE~!luCk{BkukHa-uGAiSsSj!h$-=^V)=FDi6wmKylcD;E^Emy$ zc5M1_J}uxt*EF1cz7)B9X+%2)X8ezIhUqUuN6C>GU*AZUmRCj1vEI!p4{wF}{5QpK zk7xv3TL`_`+I<4ENttS7eZu;9iUIdxYF~UNI{V1rbZ-~QOTx4NcsBG9y)^{E$H$pD1H@>Aq{i$$@@Dx7ZnKq$#p}}Fhp18<$H3xmLvm0hC=^SPQ z5-Ke$@Jd^?USQw7<{DA}RPx=0CNQ<}gYm*1io>nJ!?%E|(BU9(Sq^@3p^oLTk!b(u z9eskJh+ z_HdX~D&b}~uBF6oVt8F)`0HZB zzDH5NMSI3|q2Dw#CdT-uB|pPbX}`nT*RJQqc?3WTZJOvKd#|jGCS7T@R=Hh@b^==(@_y7cx2ym!9<04d zkyM|<2J)YU?a|tWp6e#`U%bUt@jwCQ<*oX1_*-DrgCNK5s1xF0U5l`>a8)j^MxRrK zZ>o-&PJZ5YVx8wXkDZ=aXU)5?*t`rHlxWx8cYK6y{V*rvKOiYytFLCtd|vH7PLn9u zdxW$R>WXL%t#!rS5`NNT2{{Z+4{P$5cGvF`9h4pva1v(;i6a_H6rZEGH6Ex{WZ6V<* z+3%8Q#0a|5)S?n8Qd(VRQ>@Jz?9;h~FE)zu@-@=p>h5nFU2MFvo@Jg72K_*8+I(Wi zC1NcRFZUp?M3)ARN>&=5pW$4IkEU6gwd-KtA9&#w?=rJ;>(CM~TPTezJ@+GJ3{f3UV_Li5o4>%@faDT7GtB_UwQTFd#$wgq(PMn1^^% z+&#q4?Raz3z;#|xeFj_;Lg`2k%?E5kkK~Kq&?IZRY6OBK#9AN0Xh2N;5oHS0#yhsC z%Jh{OH^eyvF{I-|L|+W4)(?j`TZJ|eui3^(KRnoH%X=a*j=gJIrkUS?!&gOD0m zOF`?-ezuP+h9J7T8jTM*@KHi8CV@nXy(tHzZRTV47+sBSaEMHt253n3J!vu!%H;#4M}5VfT4}nOWk}4&XvmJr)26L)bV^8|4MmiiIfit8p<_Z>RG0=M7vcVkn(Y%d{tqmU;Ad9e z63+_JEQltY!msb2gEltuoIF5c0*A`mj4) z@$AMQYo&Ojt>GQn?fMHjdsp`$Z7!{=BTYR!T22B;EEDrQg2I7myuV{e0*T_-7$EhN^Y{#o6@MRmg_ZamMyuEBYgt17> za%W7!6&DM%&Rd23>1^|EN0be(3ehw!$eL+`Qdxob31RovT9d%B-@NAB7*U5X2{cKQ z(PH3Nu%Tv^e6*@)ynbT|u*Zd4TTG#+B1+iTgH*%mf~=7&(#&x>tAKbYN^`z$e`3H^ zArLOzGz&NkVTB{HRxAzU4#0A~$wf1aO*Bh-m7{_SJUSK}5{7niM{u#JUBL`jGrfMEMH%&9Pv2)+LHI+yhR=;-b)1G2jVVK-A z-@tJs1w~5ZJonskm#DMc;H<ZK~phNCgtE+C|U8Ca56ql zee!SkN6|-m-C8CLJXQ6|mo3(C?$Rg_09QUarweS|Sy}~R9`rm%)A@nCw?lV>pZfO+ z&zulj?;4AZM3}Q5x`WSr82G_Mxo2(Q4`+554&TqWsn3(AaM^fSBzyT-#v*P+-7mwg zq$XEjlZ2S}1KT?bCYp7|Q<+(XORTv_l7l_QYmM^|&i&hIx9H?EaBU9loKF|tn+~a6 zN3_1B5EwlRJ^p>yx=l0U0(v-uM;0CI711}U^kC)`k~%j3`9bHsnH_f7pE*PNi$6G- zR%j5A$w0Q-9I@l&BvYGlDPvPMyIX#iGX+Hynq!kpG`soCE+*futX)3*wvs#pnU_MI zy}D9jtv@tuEpWE>mG$7T&Lr8yj=_*`rlDwF**Sav)yyXU-#H{ritKTAB~cq_{jsQsqtl}U$)oDKb8*IzAYpOs zvdZf*uDP9dYFkQkO=JrkYB#rDiW^JtZsMDR-NpLBUr)kYbJ#kGc4>)gH`3GDaWO zzfMG93ox#Nl`xHDA9J5H_*fnU39@H>1mI~VOnk2p$q4(~!pR2gG!{nB25%)XH()TJ z14rGQlDNWRsmTdAaVk);#j3Hls~AkR(6G_nHr`NL+?+ce_X%=Aaj%%mD7 zu&@uNGch)!S6p@^){o?r)CxftIM^99zz={f1MNwk=H1XGfIZVUJE~Id7YZK$tLrSVfFVV=IB47ix`Q){*8VM*FWajmf9t97;15Bt`y zd#=j?WMe1WbZ8P7b40_z$h*q2D#faHwd#frBvr{xxd3w;6R`Mb>q3N5j#R4>?04sd zXS;x&u8b5tHyQx`q**ahF6DJvqTyuV1s z)%IYx8UG(dnL7n+3zl4}FDnMzZJ9_Za7o2>Ww>4NX^C%iVq?`z1fqRjB_Bx~Y!AL2 zhFiTE7-bX`of|}AZ{qPkoA#J{K+`VZ1T^h<@|SMbrQ{S75H?Z3A`QV>Jefu`F)6iu z;%tJW7ZvK5fCpdFkFh`aZ2AAumqId0IIyFBuTYgU4-#japypqZU4hh9-sI&fS(XN` zY9N!1V$O0XC1ef(V)qB$+KU@Vb7o&L2$mrGg=SqA%}%`k%#PbnXhuSv$5@I-EJYnv z6zQhG?>sDtGtnSD5r2xmDN6!2=S+3GeS64jWp2#b{&tAZ-R9pW7Qgn( zV+3?nWG=XLy4YEQj(M~cl~Bv{o9r!J6R9yHsf2tI8v+~Zyu%MxDZOKbzr*wsYhk8f zlWzMYAhK?Ql>^JrbJx3(Sqb=vc%9@;Nqpvm?aseIqS_cXDRGU(iVx=2z(gTTdX4Jd zH~25IEYN$)1C*HRow1%>3nh%+u&X9bbU&nHlUkh5G={pY#!6Wg!$4`RI}3-Z=Fp~O zZ!lLhx&)h%T@7}d^8<>TgNmu6QW_>(Vzf2l3|TB^v^d>g^N*=qOFp}S<7eEC@H0YS zYT+IdX%NSpx?tkz_p!dJQC-agDz`w%f#0LkdpmPdL<}+^-d=0Islwp;xS%uTKQox3?rL0{3}CIgcTa2>P#`4{ICt4 zNu#YYf#a1rZZeMovOf=T(r=A5V$U63YY9D_NLyJ`Yn6EW+i)0p>#J0< zIGGlmAJ>*Zq16B__$=N=?`7{OY;WPhb$$qfq}h^tW#N8Xl2M)9BEgvdXN zGq+l43p~K0L97z)iu0ymi>plPlU_P9%eOWkW6GvJrkPOJ!Bm&d60WA&6TW7Q(hIWo z-Y=%V9P@{mfD!IgG3~`KYTg8PW5+@g5~4_=B&_dfRv>zZBicY-;6$*awSYw6uJQA8 zr|7N$Ln0z0jVCmJe&1tQsAV=#P&7`V7ZT^>+vVh~IJoC4gQkYPE zN5nb0_{u-Ml&lX`#{b<*Sr8O2{112z?!Uov9!*nvX#a%gydh+PgErT}E#kZ!%P)pg zYG^D=zh^zrX+#d4bzvS#mgkj}__46hcJM8bffv8u;z(c8k3k>4$DR~yi{{Al zn(jBXkP<{=@ys#chCC4+2Sc2Pz%n3$E!4g*g*MaRt*jsaYGSktSdVu%dFC?pU|Zl$PudT>u}hmcB;{Ca8!)kxThk$k;r{QY z$o&7SDRSwjDH6yDR??0v?Z$7UU9A7MBb`3r&gVA+3ZrGm$ue~zS{E~9~(Cm zo`vZh+5KC~@_*&?be9wUE1zfjC!c5fzwmh=#}xxA4Cs04CTG_;cXQ9P4(H2vmA4f} z-@Jxv9*v~#GVMbt zN+r+&X>q-9OK5K=wd%5a3-diT$)-L7u{fUY{=Kw)h8SG^G4NVl7Fm9-YP{r%juX+Q!fu&^r@FN??D;Zoq=E@@O&O z6mg?OtH?@jN6)RQAGh_4E*%IQMieg5tW;2L96}$OSTZ6nGS-AS_irCyne&z<(9`sv z`!@6x8A72{qCfvv*Q1r~|Ll4!`*+tP4uAs1ArCv4kJ{&#FXh7Jl>1b3ufBV(qk7oI zlkuknU)6`TKWFhd_{NF{^6=$)C-K)swA{Gdj%htRCkLHIGDQ;fXd!<8iv z`gJ!AuXVnoGgPM$Ur;(5j|SPhPTAcao0{aRu;6$eWr5<*C2CYz_xo@B?rSq9_gq$K zy|NeB`6>Q9*@0HKhO(p$om@!4Cx&au(%&w0pZVYf0u~`^#J6x{`+dKR(S#bYy};;g z?a}H+OK?M0a&D3TVr%>$9l<)5h13Uzx#16h^NI^s73TNutO6qx8l2!$Gv~+F5slpx zNSnk&med*$g`$Vs>Iv>$3@S7?3+#otSQtC+=)4O5;44fDEnx#B5x0${StFHKFs-#t zGRHqK@a^nMREM2){3e)jbQ`olCY0U&-|#~#uRkd)zwBtLo$1`1m!6oCtl3-+ZF>NC z7elElp?b4KBEK4gy*{0PfH zg$pM>8q}w8l|Dms1^LJBQ6-4eie!|;yqLi=trV{tJ<4UlGet8CEhyVj?A*JeRJOIs z*eOCP0nFy}OZ(UZ_h7V>sGURSk_Xf!nWEIs!g$W8eEy&FSGO+CsGM8XW$eXO(^n)Z;*v*R>-Roz6G zv-L~+?txNG)N~aAbl;y<$&kC`y4Hr|C=1z1UDS zT$PE_^p4xWS!F%mLjDRQ569^MbM#PPj!t^tsWYGG-SPZ}fjBn_q&dIho=odm>;a0| zre0;#HHV~_3q+g-jP6-u<7CozQUgbfJV|1x;TqyuZ?Wn1u-V2o#iU|0Z2Q24cD&}e zOGcS1uVhZvHw(Y!Ba!e?%bSkBXOkD+SqHShI!s*^D^OCl8PH^orHp)B& zVuSaA;%6S%M&4hT-`C|e+;-m&H+^z_dz0V2LYok91eW^}DL=Ad`fFK<*=c4}YcSQJ zSB|v&^Q>)VqI-5!@mOEqqi{!(36R&+dVnMftIJ!&pfw^nYNI0x{ze0c{b1U2ZQ#6S z=v-|XMJ@_k!3434ZOdc2RQj6}kHf|tS0ZrmgPDpi?fHj3^KAVvryS_f_lp~?NYqu$ zcx4FoQH#b!n8*6DV6t>`M{{8fnD;{FP*PGoJZ_^wa};m#H+ab#052ilpZUJ4;$?`i zwvU_QZq=8TYP(PVc=DtV9eF~+crbG*$4apLQfGIs7(DZ%Wk8J)QjH5W7=TysI_$~R z4%*vW4A;zUomUvA_u6QYygpZS`=|dF&32ynYq2%MJ9b&R{B~O$|L@%$MWLitY|K^{ z3XL-feQt2|OwXuGW7sln$jI@}1x{gGGPyFfwZJz8(a3S#2Lhn!wTu3&p4PkQNq!J&OSyVKAComLGisYuXc zuLSZjhfz4OS9zvky@S_jQ!M;W)5k#dAQ12HpKSGsctxP=Nbv<)RFfIeodpmY@7omz zM1*z|=UAJ8%+J_O;LJ*crXY+J&Z4U}4p2e-ulT0cT;B7m(^1sT@zFw4LChxHm0FYA z5?Ab@yu|NRQreL|eWLENCLUiBmRohhFqaDklc`m&ffI-k1!rztJ^1WKn0<6QB?m5g ze%J7)ocBB@)wq?XiiqCMArSA_6`Y;;T;nyk_@59)2OqrZW)$8lSIsIt#pR&))T`j5 zQ(1PmT%FitZ3S;3Lg$;bxcMYtLEZ=67`S_hbuveu^F)UA2>NAQL7C`g(oSC1zNIT2 zF+bW{^t9{cwc5a7l^jZ2vbt&BWKtDXZOr<1*w~cPKtx>#%rm)9S=A)>z3tgn6j0c@ z8kzi%d0OD=|{+a;> zMj)!d8azmPVx{*Z8#(6Y68&XouW2E-b)+sG6tqkxbCAxsKV_Nhpe;7>8#w$UXP^s2 zFx3<@;~X~(kHx!>!b@B6v5-{_CBpY<&INy_ z#=LfOG*^oN2*>e2t07b`wx@uzaDhj6C$}4>b|-uJ%3cX7-BU+Sa5z%2@{!*Uhy|Ub zTpk8DuG~WU?6H*erCKGZOmwUvWcv__@BA-7C2A%4tStD>@v}I9xUhwXny2jEE^Mwb z#nUbubakpNuh36YffI*yRkzk# zI};fgqBFbl+-B-gEi4FD0|QM;v7p2(@A-(9c5MB?K@(GCdP@GrTs)wmVM+QdJ2s!V z7M^bVI*dEEfB!)ZhfHCX_V9(MIGM7h^r7+pz=(2n2lg}^M${*T2YJsStEwp^1b>6} zc$l%x9?Y^CBZ~RLaU{R7)`z(7KKVOo4f{qU9bPZ;Q!SUm>%|TWGH728LCw; z$fL<=e+jD=26jA2t413is#5i?Qk}Q1=?~7ns-R4fTP@bGvZ7*-6x1OUn2%kZ05#?h zUdFTT1YSnpywMO(x^C3{*9NFrToTrz@VY4sag#f)62Gnrd^&Mfi zZnsi<$=9JP-Zr8Ie@HWJuMcLWi0k%WJoQvNx}!UeAKcB2Ws2CjBb{ELwE4^p@|VUc zQe7veS0GLj31O-|wD6rJv;FKqrqZBhHS z4hgkk8xsCUAk=jpZTUHFuMv|k9FtzO=~aLTr6yHny8Hbp^?+-zHnY_89G71HUoJgw zEbVWX-nZXZJBTsfFL4L{h`A{GBJhi;)iw{x^51z-(-`dd4tP*ByHUL$FaOSD^CjhE zEKpYh(mWuk{Pg^N7tX&J$XKXqynV0u_8gaymuNkyk;FJuG7UDf|6XJ5vRXVQF3GIl z&~;vY?h;x`f2-7I3Y2huMo#6mLXRT^<^y)?xBmTK+rf?em0!xOh~KYolSKppIg+)s z(?JZVxCm-~-mQ>|to(a60kcQz zVacOJlxiaP%J_0Bio$Y5e(4Td`QFs-3Rxn&QK#jX`&4Ju)k`O9It{UH8UKg7_YP}1 z+uDW|QBgXKfYL$584*O376>9jtY8@xq)AXS5~UMb0Fe@y01+D^1VmI|1R+L1I!I^( zCL$O@3sq_$bV5SHx5GH+%sJ0<&NI$=uIqc>_b>U!>*BZBd#!t|b+7x@9I3&)4VkrV zZePqBL>-wiB=wiCgWUGm9zoo|@vyAlsB9F1Cb6qji=KHq3o5U(!THakuXJ|os(Vzz zs&WR~Rq$J3Uv64QzYBR9t&hQ1%;%d1Xi^rxZ+-vYc|Yj_@27N$Bt=llj70i$*ae8I z=olh6P#oaSiGV!`UF=Q;UkemjYF^~$tnj54T`Hr(oCMw$iUGWdb zPTgAn!q{ni59^EGIcWkE6=_f6c^v{0czAn6HO%bFd8kz6#adU(|D+YJ(R7|~1Vj~2SSF4K%($=ADu`nY~t z{pE5yRlmQZQ{C*!MgHa8Mkdf6RQX9HBt~3tpL$T%W%X_lP!y00#}i&yd{Dl43+{gKKrHRkf%2&OgDy7$MT5dQ4RAWG98BNSo7 ziaB;NrIzx(y`nl%cX?lejC}WLl-G37qruVb$^-Ppqlr#qfJqo(SA3uJN!)X{&%`I3 z4JSx;rH%+mEHSp8-1a8gtjIJZqO34=VG>qGAh~OPmu9Zey*?AN!8?G_bd+=8_GJl> z;s_cGZQ0@UDS@9vW}^MtDZo$S=Gt>FHIAtjL^*O*x{KIzI{HIWZ zqmEZ%n&UwA=B;id(ptoLt=_gzefCIS_d{dI>W9Kt@1}TN7s?L;U%B#wse`}R*=rtf zr;|#@V@Tf;Xbmn4YU!&nDLe*6jBip~v?)oS9RkeYXhxw^q`_lDU*Zq7ixvbI^N;V5 zhm6AuEq{!}bwbVQqeCa&pCrXURiCOmcClc}Cy{w9wDt*uHHM?5DNU>AMpA6hq>j)X z=9F`D3soq{ge#MXvgf+EkdWi1eg(L(MC z3ud2+Hr_GtuADfM5(3Y48owiPGCqKvZ6?lWbFLrhu+17nzlaYR9yIr|*yq}JsbR@k z5_82oIzx-M7(Yt3()7jOx8Z=Kx2Qqpu^Y`s92-D?c&{Fp-yY7;ce+z0#-D&~@ZbEr zP_V++{epw#kjc~e81Kj*-?0+_1u#mmd`Id1fquk#ez-81PiW`n7|yT%r1A|wK|*km zukQvmpej|21XUndo$VER#$Uewv`Bra;9B+I)g|o#TO>cSJ# z%R9QILJ~Knc(_DoZ8ohM>q^dSsdoRlq0wY6C!lH3St3w%de+v^dqLP*>u{3sHyp9Y z7Bzk@bAQ(#)!$uQF6(%UV_>?{FD}lv6(}4d4)eioSc9Fy`~LZ{Rv>Yaei_$(C-&zC zWJID6=4|}cQY1$Ad)WEVBumxG+|T^wrss%PO-Y(_4fyAUzKumuDD+}|rVZ>*m@&zp z?D}bNX!jq@n2yNE>RPH8sCTw(G{duVm3w#$0T&U3YrgRF5!CL9A88esBVxtTMue>; zCRv-eKNf$7s|2+RpY>@h#da_bk0DY6*+^l8@ubh=>#=Ec-23NH&9ej+O}s3gGDli2+& zP}gI04TR~JkDac;fXs&X2wr&QWU|tjw$f;IX!ry){;1>BMQ^hq?z!B0*J}N%)oZIq zFTv_j>wjH60v zIepVep_QVn4owm+_|Sf`GiMC>C}~47QHrwJ405Qm^z_K?c1}l^<9P@I-S)iFz(BfS zEYu=bxAtXa5W6NFI2GnggR*=|u(xyQ!p;u`F^Pu{M`v-xCC?Q-x7zY#-&kqoIW=oF z0jZ#_j%8z&yT03?^2g|9d)59N;}8^Q{M=P9AJ!Dtzybd3!S4p+A*hf&e9Mwe$Es!R zUfP!rPFp%&H}D;Ai;Mh_2r7v6>e26}MLNFx@ID{{)9^{$I$@)Giv{}R^IEIsAM=lA zStJe~OIbO=L8?cw7u}IvX~q4gf2i{pcU7T%@%f}&>HTY|50DIZc1FNb@N!_4x24X_ z2^HL00cP!*WdXxHkxjDeHjmsJWw6@{5|L$hpKb|($QIa1wB=UQ7c+OmQ@!7Mj+6Q` z^PW4Hq3Ut(G6sp3r4W6{%oHhKrT>k3GbX=P8Lp))24=iG#bG>Ir*1ZxA|)3HgaN2kNkX z;1ug<%}TFTfT?LG<`%oXo=igqW4*VeoPPK7wCERiFDh9~mt1@&aZK^>dS9Fxi?4n*c8fR4c6$U&cycfy+xJ{okF<_HGGd1 zZ@j}+1#dNGxUc^0C`@$K{fH*e>vmI9u=EMQ^=c``KTEMf*FCm-nNW00WW}QQ4N}3d z?dfjAln=fd7u|N3aD#R85MGk-oZ2M&38T#@#M8ervB9>>g_53ke-ZGzmv%MEZp3T=Wa$9oFg3}zRococ3%4aN~=QLb+! z##@BLG*6}!&}^d%CYd>`tQQUf+KYN=CDfwOWbph+ytcQM%QV1lwWQ_^CS-=HU(wmdrY*j;q;%Z}QB95Z7b zO}2qL>L_GpzVq^)x3A9B2ph;9YH<)D?^4O$YLzWq4ZFFQCMc+ElAn;Lm<(l5_b2LN zb#H36*rd*`fx{xetk?X(n@M(E%6c1?5F_@8`LJc3Kv`m5> z))6&pyKJm2p(gWSnw&*>PsC*J69;grb+hTt3hTi35;vbhx-kymNa_brO%7 zxf{Wte$M+)LUL7Cu12Jma+4BRg_z|l5!_!cQ(o)OI(GX-wo4?OeV4R(SKjU z*k~NfZA`>wgEgvPF4_8Z+3}n6bEk3w7BQhWLI)%V+8Pm-f_6cs<5E~<0y3-fYQ;uZgDFMkvodQ4l$!|`Xi!IO&r)nTVq;H$&Vtv@>Kbp7VA)7l9f zcEG5z?LeYGM|yKYV#p<`(fOnFzweP=G!WNZtXk!Dd$g~vzTV(sRif)YXfkHKf9_9h z3H}kHd#idBO9e22*H=H)&K)mYM zbti)Ise`hg`Y*l5Ts`dPkD*B(BY4O!1W3;H9ekEtlcZn}OY8DSrx4Cd-~jbLENrQ@+MiWHo zH1>RZKup{qkf@umR0Eu4r=#@C`ade`x{n6~`)~+)6^ult7xF@b32r50FZ;nNKxg)< z&hA;dy=+hxHMH#xCb}WgCo%2aNDuaYUZWUB@{N{4?F})#UaH;r9s83?P;Y})j5h>> z7=NZdX-u0GH~nNk(0n5(T{@G(UIc~AxC%K6Z_mkZ?JcPzyecaH*u^8=+$ZqHH|)fp zF|KLb=$)d(Vp#8^usS=zdjDBv(*=BHTWt-&RL{rtGS)b0f}O7l7E*%Y5+lzvmf9&D ztFNjazF74rPgqL*<6^%w+D^mihpY6FkY3@<$I1evnN;P-oquYG|HrqTxQBn3i7;S= zT;a>g?Pcd;XMLQ2N3VG3^ybj~^UUurF%8OqpSl&^sJ3g7_kyaAWe$8+uHtKZc86UB~8_t}oKPmheYIf)C4>q(0b;~P&1TYz& zH|d_!mru-r1+!IhDMnM14ARfr48cT?ZI_5fvnRtq8@BNsE2X^cY`wPF@Bk5LMA92d zG3FIY0-!Ka63CK&VB8o%FN^dG-;DqG?O4#f&r4%=w#sSlNxO(LhgKgy-$5}OxYh^y zJmvcnkJ4ciBL8>t?P>Ffzv&QMG$_*Alr9_4mp}m?O?#v$_H%c_il&D}%V1%sz(2Kb z^v8Rq!8a9MN~Px((T%!+7#D1I&xqR00S0)SJjxDc^<{~GFNc4HJ=lp=luxlVz^1hH z?|M@dK$GzLa`Yb7rX9Va={l;;XSPr4w#*P2IIEn17xA8pJ{K9$hdLyYk~lZT32AfD z<;Ucz4jSsB?`%sZx9K1mEGbY@TJk^0Ze{$?_S5Em0g=4Zx4YxonPPjOIp<{84Z_gt z_C0OAOzM|4_8RTFb1fd_2hVXBe>_->58Ez@v=f&%GVHb}UFhmD2zsM_%QTqUfu*Uh z3Y-3HBnDbuB)qam<+WTn@5OwcgGZLf}lK0 zewjyNfo0zBTf^k7h@bzID$5^l%vu#8$-gzB5`bLKyYA2F>V={Qq|<0j+RXgQh-oM* zu9p?p9|t(N@eda>mBGaD^r11p+=vmQNt*CookUesq7w9)DHztLdIGIq3lR*Tu?N3uy&? zd)^G~eN*E^+60rtE0PCRvo|Uy^cbKnWeX>i3HK(TQOC>Lek}4!lJS;6hR%&yi*Y;n zBm7p~<+`QG-KOGy#qk;s_*4ihO9pZjGQ?zS(07;=%xrHKbfEI%H;1Zcprz5KqE$Fb&;@>X}oqhB< z;BrS^uCm~W7U{aM0FmEXzj@~6nLo9z^v~o88@}9&z|R{VZdOKn?40NI^m2Qqr)$Ku zsg=M}O|;!HXwsv{w|(DY8mBl--f`yVOA0pbS|cFjJ39HTv|sMc*@!u-q|t5egOY(B z#Vb0hLj;P>z20f`3~Xz=Gj9dNErv@U7ePEiu+`bkzB0>?Ngwa)>X6}~H-XX>d{Vsk zlM=)0;EY{(k5O}^Tje>~cg}up3?aQqMl?6K645jLs+K>yvl7L4>=F1#*bsGC0z0+g zJ>@<5z~EFytYjsRP4ho`&drX(BV9pg zi0J@plJ^KDXheB#=mmVz|>g}Yp zomAvVH*HR^od?^NZG);R^GjjU2yI_@egP_&9utsN6aTa|EhxRKce#1O`Gu zZ%nuFNgLj(oGbicLFj{CoAG0=*I<2WC6_~7kn$TQgs<9=494GA9(+U;C^}1j5iq@5 zk~}_ij^bc-6{-H{S}JH{=|9>*ttBV*7*7~zAiTP+tscNFGg^&r4K%^X4B(IBp`?PN<-31nX-vDXCppvxDETW2F@_Vyo(mY!o$zf>* zy*VcpH};f%bTTV)leg9^C=)L61LImZMc3&JOZ7t=%mvrRexf54D^yMf+~B5r!E&=HMUKM!1;mq6nYw zQcmNxeDKWNZN%-Or^dNtYWse(}}Q&rKBxsxJB7+Z)z?wlp~467rrzK+B=_#E6*|)Ss>WTCZkY660JW&Z|0Ia zI@z>rbNe+$U^-v~>gJfAM#3`_Rr>WQn z;=-i?xu;c%6NiAmn zXydOm1LEk!)XiHaK^JK>oXyCr601<=XT}ecRgUj+$Eq9^RM4Z78yj_^9MV(__a1i6 zc6y?~7zt{512m5e+MWJ?n zftNV;wlkD{YRsOXvE?0t!+ayV<@{4G{?heO0bu!OQe!s`bS&$R%>Tc^fRk@&`%?xC ze?-7*$+iXnxklc1{1MiM$f-eD2_9Qv|2TpMc$YB5IQUskqi?)YEaR%Do$TGl zcE3wP{Rio{?_FiWQWDtxnFe*Y%gkHejPk0dKUfbgGH@bqwOMJvtuzP-wCpwPfc z^9xWrsu^p|bpM4XPW=aI^BZf@=ACQO=DYq$+Pv$lwE3fdEp2{8MrU-f9(T8$3Z!SE z^&hd~A_u&q!y$b>h$~vS;H00NHk}a`2u2$$K2J6B{n+KOE>2ZxW{TYrUz!zFdN~qzPn);3l;}rqf6aj72;73VU)^wU9TO89MteH^E7v*$2dj8MZOa1eO z6RGFLm6>u|O-;J}dV{erUy8|+NV^lI$x(fTjF)!y?kk#dB{{7dLY@~) zZ^z;cIMy!F7H^x1AGnl^^t^IbMj(TJrMz`7JzrzbXuA3^*p_iF`HH45YDaOzZL@<5 z&qhU}#ryZYfgWQQ9+p5%`8hR6i|8V$o6F<8bB;Y0Ymwidpy`0FeS z(Uq;sP|X2}n?jy#wY_x7o{pFouf3&^q3{$?Ds?!S8jf}g7r&wU0zwFaT{6{@tZjB> zGauTlFMIyY{pqy>-6o{4q(58nWuN_kN-EE`h3= zSj3isi3Z>nmrg0@&E;pPd+Z(yQ|9eLJ>quEB)FK6HOKD(ob=$vS!D3?c?~L?l#i0yI`xBNgb~$yKRNe9f6T5;%0WTLeO)>vDM6X#dFw_uWQgfd z-xfg#ZK%R?vP9>494>HOyr@pEJ^AOEAvMz55DG2&7Lq!1yr3(vE--WP)KsghgB_r8 ztIi6*u72e&{pBJ;!B35uY04ezzos43QBl7!X=zPt^~s2uJ+L=D1vN2Z^@qUUthQMQeYZ$IDHnhXdUZZ>%CG zgZ2#F#b!yrdfF8pcsFc$e`j7#lQG#XG#HTdA%upv8iqjPYl=^9B})PMwKZ+Zl%HN+ z{7dZ*nt9(l>42o!9%jhW^lQKJy*S1?LAOfo;@V(zy(Dbnm&C9mf0fmBk1h0n2&)U? zKD2MA+E-G@OPjxRR&tUCTaG$z3jTm})I|fLeA9WmJL_mGAa~42QEGKQHyy?RDXJcu zo=W?P7UA=UNs)*KtxJ+*b>pLtLi~T$^v7xq*s1M9!C&4vePmyW0&HODQm2!=P8&dm zUA$&d_j5XRL1#8pYh~W&vGC{VFXpzN6cL6%1{frj#Y~(Yit}b7d2wI+FuebR?h<1E zyLAQziANFb!2H~PFjDaJbXRd!&z+}kqKk#5ha~4xGUCo_h?xfOn%w#Z5<*f`Ogq%s zQ``~brxCSrOQNDPGy>0)@Lu+KTthxU4(!a+?Dd{Vo}T&xoBO-J2E^0_G$I?C@&k04 z_f6kknT_`=8*Gfn-po!6quZ;mc;~u1$ZaI=wzptK&FUK>5t#dXS{^F4xGO>9EGyOo^M^e49Aoq*;dutQdJv5*?nVV)1 z=7KPk=8k2a5mwVK^_(oDZ%KYEc~TU(lAdN(bvzjg-0an916P^dVK*+IJ(r(QgKjvF z#Do1flA6NYD#1tP|%GJ zeW7DJSQ2onmq_-)DsZ%_8s(udEt10v#FbUmPf zKUvgQmOttUw9XR#S1wpwLvlT8MbZH1e0Z?u$0m@Uz><}taH_h!xna_acs+xAvogDi zrNSFNKiJvS;lDx+FOA0Qs%1(Y(b6+~zRQjYAf^Apx_&{7ppyVL;9o8gR zKEIgN4AZDbBY)Cv-$Qm09f)ymsozde?~KW8ryfZM3)+rV)mbr9a1X8Z$1ixCa1esR z?W%XHutvk;(37-z=c1_M6x)=fu%fBXUK=j8-7%dr{36qr0gk)44RPt?!u|T$+{(_F z0&P8b)`&>oHHQ@;ol(G!g2xJm8S;^u)xq<7|5AO-0IhI$=oU=aVK8Zb`3vVvuKVXZ zE_1P@SIxOEX$~1MnRcZFBKt7m;GxJmmhubit9ba=V}+w~VQXU14Gr4-v*jxtoEu zWP3~H(q)E(!}4L9j5YwWhBJtQ4~>RAhMoJ(=jE+aK=aDmUHPr9O}H*M*ZMS>mix*n z**E61CG-x(*pH*DK66Wau3Ct5p&-=(Y^`VhopqsG`_GMgp+D1+t%?Rk)Ut}gCIO3~ z^7L^YGB-4DW96BUXGc2^>|;G(NxVy_3y8{$u8MqMe^TU-Va+WPObY@xK}+3%!GZ~< z%U(JQo|ZXzphx^rKPE0DHRce7H?2KsZG0rfXt_E13X%zPfX@tOTu;V+K%;>yN>A;2 zzwDupZGBQA+BRa8c*^FnjqAxLC0)?j;4Vd1Ywd3{L!_&ZMso}7Z~>Q};uAWf#pTL# zcTEqekzGRP3|q0@@-+%nlpg%De8J@Taa!8tVJY{}0hQTL%wI1fer^cz``;N!&Y2mA z2x?3zGaF+Yr3|k;dKWT+H`u8`YuW#PGx7r$N3Lr?ZUMYP4K;r^bb6GSWh5h5y`R3 z=uQTj>D#nj_F;xJRcK|mk6vU;g;VSYHj3e|;m^U+3Is2N+SM453ZKG@OlNLs83A$d z3*$%fZJRJ~O<#g7ZYTLzvU$o;d-!AxeZa*nX{q+3c=c*e0XfAqlsCoRO_Bke&wri- ztu~Q6_Ss%m+*~*&ru(+4-CIXxi|ICj71Xl?F&}UwJ%2nbj?{~4>*BTYrktr zc~_P0C0Y0lixJdCY7cZ};S5N|QBrHNvAVG|zu#nI86~3)zWWe=AUYA5e4>*E;~mbo z!**E8`gEWQD_@l^uUt}Ul4GW+2cLHix=ULzYji&@wIi_?XI?)%7+e*y)98o@T-1;0 znmbYNGICPQ*!6M7Yf866a_RYSxd>gjC=(;<06|2m{)298&m^V89)tkm$KJGsmK8PT ztB(6ZDJPzq(a(Ec)cg~l{`a%l9JVQdqh`D@Z2J%wJszSvp-p^jel#W0#}7I~4U!)z z+YQl;6`44Y;g1jh;54DQaNu{Y(p<$FSBV3qO;XU$i%ChuKXR4mqLAW6=gdmqIG0Pk z2j4ex9 zm{_);YjZ5<;jmDvogY=0G5hy!`*&C1@8|IKxcI(& zE!oKE!HJVTlxD3r-wiCJ>&}fftJRb?>w2Mv6Yz2o{%FW%d8`3ih&@%kJ$*6WLW5j< zYP>VF%{;m#zM41O2OI70-hIeq&@Z8M!O)TYipYr%c47!Yd%fkRIGAS$A>6i9*=Kr2 zi9aeY_`j{1-x8C4!P!|ICs!RGNL!3|U(&y5z|fpHn+9!Iw5<>B#oO2>g!@~9^KGop z>{VhB`u*f&)BKbdKF%~%+oP#FmBwTP+zscKwg??;;0T`CyZsxEVOrc8T%}M}Ue*0| zkCiw0-d*C{sOnbT@NO#++q~3?D4s2D8cZNE&Fna~ z?ZNN0yff+HMnZG$FG+-S0Bs@&M*POkC~fFp%b_< z-jM`d5^VA^%_d}jX?w-n5Eb}HEX!s#0*9A-G((F9@^ZWhV3NV0HqO-4V(#X7Xkh-R zXXDUY9Y<&`oTpn9ElkGLk;71$UU6A!eoH_>7_b zX)*C>*Ft^ZALJLJiJ5-2@t|cwkeL~!5}-P59!jkc4?R>bUjTE0=VCOqMi#1>zH9oO zf6f^fr-;oS0k;Ia^c^c9XIAnp%h%Q6SnF>-Z7+zf(FSCpQs>_UFmZuH{&c^-_~?RM zj3{1#{;Y=`#23J9n98IW6-gFtsAPp4n$Q=W{rLs=6u8-`$BCE!=eYQXLwL9Aql$ZP zM5ao9NWu~(n}SxYAvP;LBR;-yRi{2HzSkCZeN8yBD--WfjXM)cxmhvEP)x~qtA}Em z?eiJ2j!_Ls8}TRQCnHUVwOee5;{$~d49GCm+fH2h4aa%TjZybB2-U9tnj>sMme4Ll zPGZxAZ`&vfD{OLE?pu=Bi$b!iJ*m)f`P;Fd$rZIc8elNWR7R9)RE%NpcnjkwL5Ag~Y>aLL=L_SwpcVKUX12jznQwRt5@F$o!^?st zQ}0xX%!cUsRwgYBYHo5$I`re?3rF+SQ}NC|GP9j9QJH||eMVI*I z^>!39O0mZPzCd`@Rj*q;?mQs2$)tV9E!S_KsKHI9tWZ@Sio5l%ET zU%d7jxiwr-LR0Czn-by{bpZGv_^}pQqv#V_i??Y`O+ihp9{S8 zaQ*+FthiJt2Jxhob!8>;#@jA@>`h+K2HzhPHz{d=1)qXQ$g%n#65}5(0Qk{S8l=fX z*tc^+%__{1^OLV^R}Hb-EgsGN%xKnzyI4x%@kzC-Pil?TNG2OJ33o{vFpQ@N4Uk()Sy_!}k1v~At(v}gWGvDJoJy+#Vx)rh89x#iQZ~x(j=a8aa`CMm!UeUevbhWUf7a}+EBjDhC zI^!okJ+pM8xm3qY?uZ+7B&mpv{-Ru0YRYN|vco&Yace-5H0`b}wCFp? zj|ow4j(l58_&aQB;50tq%;hLw*Qps*&>&()8Jg&5BZzk#Bf6$yoWZ6gA%@z6mh3aQ zk7IU5={D(dC4+|pWk+;kJPRMlF@Iyzcui8ufZ!dzh2$=Zn()x}alM(0V46&sM>{8B zT6olYlsjR$T>6s0p|Xg?_i^!xa(7f@dc=iHg&|D}H>sbZ(#p7INl3+@?bsg2`GVbg zBx8o=>|K1OsA&LN2qI%T6K!5xn#zr-CR-`MQwt^|DaL3a&g)fPis=(G`XvK!8IFU? zpnK!u-fy}LMIfb2CQpASI0b@ZS2nlZw)upb*t5Xvn-Wy*BbP1E4AKE&1A6y+O^_v6 zv8{DvuT-zLCgYu`IYLljrT4vgUrCqH6_P8_6vd38aHO$)y?h}#R4{x-o&KAUTo3~Y z$!%YlIZ{)b zGd{y7(QMElJC2jCbfJPPVmN0oie{On%p*mWOBxg&lRie1;5p{#q4r+6oOsfH|N)`dsb z;kLQjV474rja>%A>`_ki`oVUqZr+*K6zF68#`&IJdV4?}4e?1!SRe}EeCOHr&JydM>MY-x>rB-rqZ{5f$>EX{9Stuc1jxD=f}-YITybvZn|wb z*wCfl|NU=ab7{iXlnm#!EZ3dIrC&rv*dA?9b?+`z_u%ap!OFoLhPC6qg(6;}kkp>QI##_jaVoi|0LCa4_q0#pBfhDe0Bb z6KD47AyiwEPPWxep`SzaYW-(hl02Vlc>}r(H4FBSbQ!;|f?wpn(Pi}4=rYSPU+FUR zhYAyNOHYIK1J8sVA2=se@J`b!*SkXz7JD20ou1G7d*N4zshmO=^LYZXxi=)3p;bUC2Tdaq%*ox22!} z*7qGhRNf(|eN(9P=VJ%=zEKaUuq4$LpA*6Q{PIfos#vRSJ^v{QFE`e$rX{jc|u}9Tm5wh&Xpn=D7)qY*~dTBsA`p(5rx~5a5A-zzVnxUk_U@64z!d#AS{m7DZ z{ej-jF`!|c(hADt5#TQ!Nc{v0WuDsS!@&g#5q{R85-I~2%n$IpOBce+;7HT|5I1yl z)tE)+XE3(SvIi&)n(7=VWhNg&J0XH~n!ZMsEY+LC-8Wze`o^TdZH2(hQu&mML>*o3!(;TdR5e0IFr{T3f=u=_>pqc;c5E3j92Q z1$pB7-KDu~&SVagIj&pZn4*d;wzw`%(7}%8jlsQd%O+Qx)ixYbr@{*pj5KF+Cu4`= z>)lt+YI7S8xr#zbNU=wg*hIFS?SEp_keagR5jqz8UZFl2~c6`HheJf0^QBnCG(|I#!X67 zE+yzIw0D?bW9f{z9g9Uu8%oQnc^OJ~dU>T&3wD!pUIU?!@G__FmrMErBa#3T8b7-5 z^Z(Rh`Qu^S2FLL5C?|=346WHqJ(`;W@a8^y9x6I7epGcF*%4PgRi^H#<()nDF}JcA z^0MhLU-}83_G1x-J2`l2R{-g!kyr_9(TFFb&F2Fz-EuL4n-E_)wZ9cFh&h{8&LmEb zlJ1#@B55wCFgUK+8|~Sr0{5?qYS)J3p0`tB2{vcYH$9QNG6;jw)>p05RD0LeI*~fB zLq(G{`-#F26;&zh;VvvOB-F57dt&24qyrXl>Uw`@O-IFMw1720CBCey@l zc0f1l+@plxE4j@#)rK+#OBcNhSEsVww5Kp`6(MukdAHg!UUGx?qH2>)%{CJCLV9b- zvmvazlNxEYT-2%|^wge^DE|QEDlrMAaF50JAqJR1G6raY5JLJyik{6~0Xj{5%1a2) zX;O?;T$qil0s26s&O1P-X_F`Sh@`t1BzVj@bk-(yQuiemZ|o(3l+3iL(GGK0iSl1z zfIpw&6??x^a z>V=E|rVD<#X<}(vX~fu1$uI>FQH&AHTdO*XKv*d>sAR+m+pRkp=b;tFz}k0>4sQ4u zoFXxQBQw>L6ri zLC#18(s?e&O`(+Al6`!22@!0t8u6dR3AP2jLI@%KuDCd0aiA7Uc{$ZilpDHMcel1% z_5ESZxtInezU)y^C|~v{=&p=BF_|&cx5S9eK%k>JQ!!KM7fb3W@opo?aZRoSGs4Y* zEr|^6z0>QDV!oJ4$z0r0OnTa-Y`#8fpSHK!F>i@- z{EK>8mrrq~_^L&r$t%{2MYR>5cgGePty-z$B;>+hLchZc516yI*_s|>yGf9eIM#li z?3e;xR$`cqS97biXyBDhF$k1Gk9ynjS@+5yYex6n{AlxhRnl46)e!X(V1ijf zUlT6kGQiwq;eI%|^ll;%`s4;%dn9do|Gb6(f*(3H?|qK>me5&+6aXm{DRW~)5>%d) z%+5**d{fJIt6_`v}ctc6-Akpnm89^F( zg5%RdTH#tE+CO}^w58a%S9Wk(G^-T_tiXdSNrM-@ygwNtItUVLn zXW^3YIE{Fa4FqaKxD$K_@ja;V$L6BsQnG?JU&kln#B0OA66@n${d31cV0$u^pM zX@!1q1%|$Wx<dUxs7SmbP|f)ptD|%Z@|uHL{y^Ut@JBc5eHf)v-8LzQ*dPmC%B`=Sra1x{sR@Yk&`#C$*L5 zg|5VhzSsWGA?I-YVbipdRh@}EzlEfZs}~aj%t!e24aDvivrDL>0OmLA8!bhrMLNib z3@dCWUznf#y9xGGA>RbsAq(qo%H~AXcrIZSn0JojdrE)jZ$RP#hk%~Wve|%((u1;l zS%VhA(Fm=W-uhWN)0MM0W4MA>Pr=IF>GQZ9TlL70>zo*A1xOR5B`suY0my6mZoTdL z&iA(y+VV|xsPm#JxyN6-t03y7YE<$F8IJx*m^g(gOqu?~;HCg^8LnXxsHQYF#k82!e?SjvyrLq!;Pi`AI( zKK2pbApMW0dzb;8oN&czE0LLy8xdg?@p^;xc4;B<0*Ih1`gDUJ=gi&0>A*Zb>TgVp z^1V>k8-BNCIpoaO3zL<9U}A)qfl(h5@t@Tp;C&<~CnK~S%UD;(Lm(5Gw#|kIkfW!D zvoLYnkB`VG0;gxsi><1*KNI2KRG1imL1CBdZ|y4P%c(R3w-VIrMrorelaICL z0O{hodfZ%dirRb4=QV3q#KbsO!!=kAh7#6SqZ7)ot{^@JYDd&|Cb!YoO-i0?ER9U% zCRM&Qoe}aJAM%C?c7-VW#?<0)Pav|%%Pce}3n#11dVIq1$qwT?O~Or0#KF1n`LNq_ zXGwCV<7dMS;Q7K)Mx&ZOf{KJn)P!f6XeZ>H{LBW+-U313MI6jd6%QdsOCg$AS-9rkKEEI-{_t*gswCeeoa^=E>IE(%b4ptDxu}T zq!3p}Bt}%U2#e0W=w`(^dA_jBYM!lfZ+ACZXElO$PbkF_d{*n3i+jEanahG3<#^_K z$}s@9Oz~b$6!zF_&AEr5SR;;-yH!yU={DEp7bG!{>(8i_7^XBjM@e$x>+82e4kb9q zDi*)~a`Qz&G@+0{x{|TkcM)IE;j|i|xJ1x`fInCEadAOqJrcl6e|Ojwmr6F>v%K&4 zk-=Gx=O_(bCQieF)iJZ2{warCU#>p`eLMmt>fN@GREqTWbCn49u*~V_=BFb^a`rzz zSy7M^mZlKASg^a`T`AWv87Trm$*?&9hdT`g9}1ERI}cj3K|hdxw)itNk>7h5eJWrU z>I7z?`@_r9tb5$AbFayGM@JLyPLVa}f$oDT?N<>|3C<4JzsvK^Uq+T^I7T5GYY<`x zwg-J_`jmsu)!xlOduq+N7NzYoFmKz-qkgnfB$fWbxVBW5J!Rb-ZlNNswLb>>82eP+ z@f^OV`p0UaZOQ>Diq~tS&TLNpXkb^5@wO~7B~W)P95A#JM=xeRLZC|*6#&==#Fa5iU9I@lx?IySY;$rKS4nUF{fF{y0eT&n~IXrq)E{%lOeJ+#JUUVa^|`Kux4r707+^^z8^4hbm%zD? z{HD>;Yhs|@MkkDt3=@w#@EeahojSB$g%u%_l&=~sMbP?_p}weI0u!rPJrX2V6TEt6 zUZkJ!e(p${<;XpNZ*ek@p{hD>f6%-+B&kk2E8az)ndH@N#o(`*jJIy?fKI$)mP+s4 z>m@-MoiEZ_X3ckPFx6WT8yuLM%1|;2F?@`rJRzxr+G-z$2VD;kc-lJGUF!dqHT3&+ z`0eWO`oUG=h_7z*ms&UH@>Fa##8mV#HJU= zil0!7?lCe9dB>8N-8MBey$|r)i)0Y4s*JYjDbhR3@_CrXBli4^+oA?AM3A1NtW~L( zh#Hax4*_Dz9LTZxCYU7#BE+JF|5gDoYtB0lrX3=)MjOVApP9d*5p-G`nt@g5@c+l% zd51N9wf|p>1uDo;%a9QP6|KlHvLO*rP!UjR6;xJGqD&D8Gel*}h)4w^OT+=niV-7( zp%Rv05RDKB1O;Rz5CIcL2>wpc&c}ZH__TlhdU0L-%U<@w=X1_|?)!aSuhm__0#ztd zwRv}u7c5dn_d_Z+clWBHU$H9r%KqFBB{XR-ptx66?ltOAk6lM`4-=s@OpxxTVIzAn z`x}*L(qp&)IpwLiZ@|chmH2*{W~t52i3Vn{$VEs;fh=%^!q2VxPzhY2F;)_2eT{$z zq&4p22eFE6Jc%A@{6kJzURvF;2gfk%hORWFF8&9{VZDCT8`-{65B_a4XZ(ZQe>M&5 z(3)D*=HRqWgrs*_1j;~@HHPF~PZ~3uS~p%uK7NAtfUtE|dW?;GPRy>33J^FpO$%Zs z7Pjb++0%+xIaI)SZ7gw-zY4HzT=MF0gH4z99&c*CgLxk19s% z1TL3ix}UFe)qpH0BY^7xZb0d_LJM8OcXttK5Rmw*@6R|hL)Pb)5eV^C53`}Dv2LD` z3`B25?{Zh~s@IF`6kE)MTZ%Eh!?jWK&WzQ^Gs2;@S^vh&XQ`Zu%&LF0l@Pm9)Z+4t(=vtz*!wv z0ut}toc4+}sEVZdGjF#en`&BvY~0F(F4SAlo(~iyJBj8y?;?e=B1CiaF%O+nQ){|e$!d!)a<$4-mRN&5TJxv7s6Gm6Z$E=x?{T)87CP4 zbP^X*Sm?{vahfpuRmJ$RAntf>vp&Pon*BDD6>y}#0K|#HsM@hLB#Fp~PIJwEQqf7J zHsV3aS+6LOo6d(GiA%nh9&@JjKH?uhl*TkpEq`kvl1_S2bgMU~W5~O80zM>m3eYK# zXGgItBicxtug^jcR>|y0!SHqohz@-sJJ?1zT6&r`x>dmwBaD9s?TRw z35pEWn?KgL2>x!SWj?hPvqh(q<|s$bS~lTlVDyibo923Q!9|OYoN(6pwyOuR0;^#s zzq~Je=HQHN)xI}pJEr`z+RF)~g`Ew75!#WP#mlA)GG4sjIvagn2|WWw>)|2;S%>ozdh;e3)U(qM;=Jo43t{XWuLlrlD*22@=xz9o zw&U!6lTA95^wk4SKttc2Vq3z;5g&+5<&yRM$Pb0!N2Nb(&x#Q`HH67&G zt8v-8mG3Wk0wvuVfhW*^b8zRMJ%N3kzT9amu*R=Mu09VHlu?_Wdw$i6@g`kxAYUUm zkZVmv8kc`GN_5;yHv6%yb^Z3}d)l?}*lY(68C=`0t0%#Zk?Y@0bEMdVZe|?W7lvx% z2HRe)(L}JYxeh+u#tGBOPz*wPf$rhr-Be!8XEGo50A_(A`0(i1|sK&Vpn^OPQzy7MZ7Zv(?3j84rQXiR!*c*k}v>!n9nu z@I1muezHOO+z547h^*0MPu;>nNd@ErCHL&@68|yk;rH!AeG{X`2?4(Lnq>AOHKgpt zEZ%$-^NgWDU1xHsWuk=_0+=Io$TLot2!U{}hDYZa0p`g5?ss*TcT*sPi=yN3;n zpZOzm1T~Uze2V78B~Cobsm`hg8=ykmKR%Ox3M88{LB|Ge)MqfJLw%N_ojB4xolHlq zpg>{;YPXh!TllQ+JruG@JFpddqX|Y8)PUekXX)`LaYziRKlxT{5I(>|zs-n|2CWG1 z!n9h!ctJUOQ&|Goh*cssBrtDFnc11WWRbjZe~6G`EO5I?bsc!m6Tn6S&UA#)iW6J} zu#v`;paK9J>8!2-ZnuS#PGg%#z*v4|Wl*rd?Y3>C=Cj+alym46$Q0%O8)X!!kS7?D z;-DX7{gpiHhcq@A1tfISvax}Ux8>|$M$i=M$&yqfa0V!_NQ&eQ5a5-D6VzRIK2D5x z8KCA5b>eK$LJ#XF4ARpr2*v!Y)i=>wD%qdl#z_xB|(~` zfq3al*r&0YpC}`JpFL^xQf$b?J|Flp^lxO5Y2SS1N*!9UodlwY6d4yr?9~#hpgB@K zj=<#J>4Sep|GIT>bDMfz7(`^rEEYV_3VzdVN9RY_*@ZE_9}h~Z9M)+t;_74h)u8gN z@w{}zd;EVL_54ypkibj>^~0ie;+*-AJnrO)zF|XUl!(CbC05gFi0JgFAtWz8(?WTz z#b&cr+S|Onzvs9Ikcl38`d;|ZHw@{ z7OXHAUn_&&m7w-IZc57SJ3DPwJRU|9F{~PMPv|oo>>p@(>dSce-R0msHENkUD#&Y1 z+(eny{Ls_TzGOGSk*y+4_d|Q5ab>s`!ci36UYK}&O>O<+EF*ijB#2JsyF|{td;PEE zZec;S*&MzTddL6=J)uKvVyWnPNb_}_yd~ZvUg?i*jEf*2ZPhyzx4Wi1JGEzWb{r0( z;1xsT%bmezp{y&#?6?>w92)~UXMy>hcRRo9m)B+zkPm$wq|xF;h&>A2AQGbF_oX3DTg z#Djx%iyiK+8TvF3`+rZzbXG^+Lp$3p_#rRNB+@@DTD~z6^yM1w@B6C0+$FGGUOoj+ z6U2{=I5nB|>q`UTC2j$5zp@dTc|2c-mL0r-a#B-Qsgjcs+88Kbuu(a$WIAn(TULwC zD%^mT8wXZ~!t)2#WQXo!-}TvVRfI%wnAf;@dO9o1XV4FovK`Kj_^k?08hww4@8RxN z{?YYv(c4?J(jZT<6}jg^sq~#|guE99oiMsqC~8rr63wd%*8E%LOOxns!sq4 z;eWPUC5Hj#ykC8ZLE2teXh#E^L~~?-EINOX@ThMB-Wc~?eVddPTZp#&sk;=#nI<`W zrf2TO!sw%Ww#t1~7#$2fC9-S< zLr;M$J#EXv9l^+NC^dA?kc9lmNyepV=hn^r!LG6p|5jVo)+Ig&Qtz@N$}2fcG!m&$ znBV{*nQJ02$WJ;d_62N6boe*}Jcx*md^{8r%7^t0WDQf);t2fqgke_oIQ+H+0EGD2 z%`AAOhTpE1rqo|Tr+O)%BbHTS*Ia;&Q=t;M{0v{Dy;G+uO=AH98*&TSnbVolf7DXp-17+9L=876B3{)0u;n#!P2t0F#HEOMZ$I-@cm zr(1n+b(Ak=K{S-~*&fw*Opvwl*9xf)a8t(eeQxl5&grd~pM6V93mc=F^^ukcAmd8} zkSo1%0UUV}|5z@yB`z+TH~VgYwT_d_JCytFX9CDujP`t~!r-^oXZ1iws?YX;8G{(m zyzak$Pf7%Jxy>NAXFZ!GG@+3<=uI=s)UEvY?e!7s$CR{ZOj7>A#<*_E4 zz6&WKO#)dwBiPw&mlNt4U|MYPDBsybt=K}dcFbB)H|sZjlbgq7Ji+~rGHfCRyU6;m>wV!GFEqjdyLu(;aD-@3(Qv(iUuK4S zx?BW{mpayPUoFSaj)+-4B4Vk8C_3#Ij3^xMwXE)0WgHnn6*ABxM+AV_URt6QLEvv9 zc~K^7Uo(Ke$%eOoqSOOz5LJaabxBsS87JuGrg@ZqT{qWS(9Qi0baUmO3TA_Ez{~^3 zc~xZEWNkdO8s`>hd6wOc!v$K}f4nN8(kH+71G<6YJ)pdd5mhx{)L-b+>tq2cj)5b9 zechH)#w5T)$2wGnb!2+yDG7(f6b$1d1Mpog5R&fb=p`-uOnUDKqj~FjBQW{7E>@Sg zvL0=&DG9Zd%90)*F+Xr;kqd4$JAEQ-tT$yFJ0hPlW)C!}$R1QbY(^B}$O#X%oT{zH z&Vl|u2kg5OWYtd7=1@$BRqeu5%hqqeoa3K0@xa_1oIiX!u!O7nCj>2=k~Nw01y-%F ze6`k{^Gwnpw5=({A#-j|zZAIj*dpI<>omOMH8EE)9d!6_0;4$3zAoGVXpz{XUA@L< zEaUSfkbzA1d^n1y;O>Izm!6I{>r7!Y%u^dLW_&OQq)XVd`Qtx3L^}*5s42rqJMk_b zjRan#i`hm)2co7+ppDkzsA##o%lDizb@{lH6X&0kR=3FlFA|qt!nP@46NuF%<5`mj z(-zOZx24|xNFu;;K;80#D}KdX@f~X7Uw~& zVxJ$_V-o-QEm;sPX}dFlX`N>}p*{3)Kb>H_n6sgDcj5L1zW9X0m`^OY+m zhR#M_n!PHrv2?>&$U#Uy&bogFZ_*%%p@Q3>amRzV!8Zu*OkGHxPU(v5U(raJvi)!; z*L<6BXjd|QhGRoJVW|P|ElIj)A*9!3rb1H}o~+&E#VU|p@)Pk?*w5!5nK7bvV{A8p z3Z!}GR@wi4X8~)9ieL&Bb!Yt<{U#oVy66vPV4?w+Teoj79r0F$CXG-`7fp@JB z1S{#**=AalpRA-p$r9X)1cOo5I_E>1k4x3+JpDwra9QW}W*U$!9(Ua7i+$XsOiR`W z1zTaWd4ZKyw3}mpQ9Z@H$Opr|h&|e^^rpUMy3h;FW1I9(g01Z~|9NA>dM(i2z z;&+7xuCk9Ze_AFWrFETAn&Ft6yXDJ@-Eqeg%(7kw?nx(r%khmYRTL#2dPRH?5fHn& zFQ^7Nq|)A-urULW72H~{O2Dh*C(%{)Ig9Il16n{jRTz!y$ZP6uV1vmir_^(tC1qBc z9xiw*R3(rJ9nZ4TzWGDeL9Gi|+BVt>a5aY3)R|%fL3v$m!PVo8-`^u~^$*u_%I!uJ zX8ugHID#o(B6eo3;Pgi*Oo6`OXs;!D(eW;UIMe zOeomQ>~U+;z7ceiifm>i`-Ex4v3TOl!;ig{$%_-w#1&zonvF5&WwNA54W#mt8c5h_ z&fLMBYP|%rh+a|y{SIc)2YC=&CJY!Nx!1D5m4aG5=IVRN5i4>-C%D5YWVZ59ohXk- zSZo7nn~Z;DAO<=)!;T;QWTs;%>PCA&wB2MQEV^sYfC=A}^PagJtqF4-3>OEkvKG@hmy%_BF z<&4|H*fr>0o53+vJA-$bm{X~2e2*Qdy_F62oViGlDetF$+)2N}gpp;|7SYY*P` zBrP!n!pm&KIcEin&y+n3R`Z|(%MZ9lMqRS}G_Kd;gR(0G42Q1%z-klxML-uYe}O+Yq3!C8`%-c#i-T+FL@v(pYvrJp6z=2nvE( zC)-SEx_S-a3RxaHmglaPW8i6MHP)5G=yR@lzF4z_ub}gbbtZUXtCY9G8jd<&ChRPm zTPET-YAp^6NRU-DYB9=JhIxJW)5j7wC4~NuEUtRw@QpRtzN7ihD>BO$4kX>u)MKWS z<+}{YhVj-#XqrAGpmD)coG-QT(W|5JQ-@3CA;^{p^1M5K{{HLIt1;kEFS~Y&`lpMe zJ)MNe%B?LC8>cU|YE(jl+*al^dxT8BxCkP@3`A41YSB{k{(4KlH3<* zefhhk>G2pkRD&ty7caP^9+{Teq((+NZd-C$U^ z3+HyiAw#~Nsp!3UlwFYV_UP1mTpbRUHDhXGFRRow^TZc3r1pFxC978~+W_4`tkr#B zFEZ&%Yc7{G<`;V@lIAC3YItj=U8S3%#P;8i98w*L&-f7;to@U=dA*e~GR_gNLVdDn z2c={3t-wlFRBl>g>)ooSWO=yCRo1FwN-Fno>5I4^RciHoIuY!mo?+f)|Nc`m}2WC_O(N?hAR~ zaNl~iqdo7(qc_4mP^q`1N+q*#AbTXwIGK}5fMQwX_2dD%Aas?zveMuLO_pfu@3WX&I*9wD2S@+ zvl9ZHjmJM-bvmJ$8gu5bTs(;8g&^gV1BNa;AWfP#QbPBjXGasW(URTWZIu&iP&i|b zGS%#A#)D1BaaMTEO9K`oaWN~q;%2TXK99u9$%aqVu@%P8E9Jp-X>){u$YeSt>Bk z&ZiAiQC-#CTO1*2V!O&Hi{APUZ9C=~72ke?QSU$UA7dJa@l}aaW&sk~aH9?XBJve|o7&W&)a6tpmUA-6uR#~RiTT$d|toZVH zD`E;KAuo3NDiBxVc_m|m`7Se%SN|51+@>a*mcsY$7iTV)o!OisbC{3GCQ<%VA!ur1Q1;af)e?eHu! zhSom}?0&j9xKvI-kUF!^it?Tosa{Z;WQpe!E_K2@%bMJM+s_~E$AwZ;C=s9hG8GTQ z^;shg()X}Vy|A3o-F8#i@SvKPi!9CQDiP#>Wi>f(>rfd1g$|sEcGAp;9e>m+e_t!W z$zG0i&UI1>HErPKF8j1V7C={wAs2>M#cp6fvDGy1<>$T3jaXpBWE-%HOR@=};(gt@ zN>7k}W8FY)-~Z^7U*o7eM@}Fkr4^tTM_8>Ii=7%n(p|~!!5|447mN$uklU-`?0J_S zzCR=UH*pMnOr;Y!l^ophGJJLuujh(^=Z%3o%DPE;?2;%*U-_lPSxqm;#%Uj_&|>$S z<%Jn*HS2^TqAN23^nKw!)4bl|BX-WdIR8#_hu3N1opM730uMX)%~3#k#2uekBT4AZ z6OJjsXWXq`d_Pu^RA<%tFnri4ZMhrS1U3IGcAXXy9TE^Q{cd4R%C%kpa178YB^U$X zIDCyEF-8FY=cFNpJdR`OEZ`Ea|hX z>Naj|$zIsZurl>AhOZp{2I@go>wxM!3&M=gFwoTMHKnT`WtB%LA_K=+n(#|HN{}ST zN}(bX%ElcFD`9S~R(*UT0EIm}&N^oKY3_ z-+6?u&EP+=V$jDHJXsJ57!AMGe7Nl&mrZ62yW2e=qpY1MZ#is$Gu?$mzO|rs;k-^* zDRO^8b~aK>)M^=|;dSGU`#0!hIp&OFN1&Y~1MJ=;!Yy)$EYIEIL4KMSW@y{^lZm8F zkzQrT;==Rn-RUObY=4Nkc#BCAmk4_pp7@-d{b+T;+l^IgeFIsKrB>iaB6kAXrQ?t* zAzg1_a9r})aVD+BfyKR1s*6_{azm!Zu}pksn+Ggt_}K(2#b>=7mYp~X)h{(&FB3IuLQ9i{yVC0^kWc zI~U#vsOJB8PNv7Hxdu`Q+aYt)8la==a>Dswwo-0nM60f+drE4(tE%zjqUe_C42n^I zqZMe@1tJn&ffWK+ot;NC=1-}moP-(aN;6_?O=h$))Vc=w+UYx4gpqJ2nSL2~duZwjVdi|Xgbokeq>ur#i-7r8YQXag(_ zHCNVNsCL}VKFWjzqO1L2NTjHTayRu-OAV=y%u<@)m|=p-0Jr~3kXp#e#Hx=CD*yN# zE?73f^aI?ioyJo1Q^Lf{!Q4=_k{dDbQ0e@1oSVScvK@0;0~yn0Ijs5I-FNldB3n&P zPj*6&9>Q^`D>pmDz0l2xmDTl}kTNs4f5MpynN9__lJ6v&4BHi-XSesODLb87=`D49 z^`zN|b5G;4xI7?i*`>F3A#wybqZPBtl~G>(vOib%j^o{x?$#rFg0$E`*n)A)Fj`sZ zmsfkiw^s=WTO!0N{XPp@ysD{zmu6m%{0qRQMc=VV{X{e8A#wih<8epvhGGen<3Q9h ztk#R)(vXIwB&h}Ayl$qHTbhnZ<@YUu8-czl#=7mJwc+7Y-Cc7Y zRK3P6L^*5m^0nb-xFv%QjgLgeN$pW9_pi<{FQ`A6>XqFx0Zc7}`DJ-xmlRiIa(akL z3OBIXCl|R)wH(qRy5vp>2vz9y7c_QN3J6VczTzlmT9h2Kq%V)*Gt*+OiIOSrx*};g z2hw-XWvA^5icP<{BS=H6P5S=pZj35`4HqqB6_+O3D*pD4{TNAbyvkAuxJoff3Crrm zIh`1}6q6#A=u4ppWGo_q#rWwFKM;wU^mgK9T1n|-1=|F1w|xLQmezcj9ju9E zEV+MHH+;IgaS`5%sJRqs=^@`W6Pgm&`{XdfVc~*SKnkrK$M(*zol5KlDR5&E2$H-w z?^jGj$6LIg6C-uJN@-hU$mg0CU}@Oi%I;=;+df!Y9nR2ZJYV@fZvdKmZK&50)?d0C za&PQJuklJmZ?z`4Rw@L69PhGbM;+x;4XN%J6tJdOBKsY=XCSZM3Dq^2vIcN+K7f|ak)yp^ z#f5OB7Px&urG1{c8EZb$!7!#@uew&+01HaOVSLe{uL`FF6lCd!?zRnrn;W*(0u~KZ z@rFeqOOy~NF=^C!N*pz;ln{Wkwu$rQpJeDb341136)+cWR+_T>Ajlt@)hvyX(IKAe zsk@LlFG-#XucVncCw}E^bb(Eh`8Yb)2W06L0g_nR-6(=3c^RE5^8M8fULjk!UfJE> zJW+R5=IFg3FH?XUJ(XA{>?-}FH^+JACKf*w;PG9qQvpjfv_rqoIg7((9)6YPGPs+O`FcJ3{0%r#fMoN&@%rm7G!c*>qQ4D9^n(G% z!)82pV(g;{37SaRW0cmcs5+fM*>c%j9CcEX*$+0!2rhGB9OY zR1Ag%F3iSrgpiNE&lXXeUFK@q-#jh!iZbEKD#*}MMDg;~I%G7E;oIYxvKK=FXrtDW zJV0Fb29s3QU}}^@qCx$-$nPSAbjSlpq)rphzqZME?d4a3LATM%m6l&~k4G@*6uPrC z=oDNMKC$xSX~CE;6mVa`P&^E$KUgITy*R5xtG7}lq=^zP3idHv@`kwHqXHaC*RPJ1 zK1UmGE>gXd^hQnjtuu*OK56W-7sG0GajtEfF&M6xZhGsD3G6ov_v2wlr6S@N>90&b z9v#d%?H3)ObHZh?+Y$mfH!%=>-OiYkREJd53tW~j7C>!zzYTRZsrQp)CF0FUQ^~KA zl>wuPlj6qx;RPp6XF$UBSIJ5(oLM)g9`R4s2`zAY17J_VwnLEBa*hC?!<_o{TF_XH zAqi<=1kP?3_l-uRObuVGCabwG>H+O)?+JC0S|n1@bikq~*e-B*Yc&KP{-&dAFJd$< zL_LuC66?U@$t*Mw!nJ~iP0H<>HVXGH&Pq?AOqq0Shj)8FoOw5_p z0Mcpi>pr@EaM5oPOCS8-s4U>p26tn~>Td+9dG_u1;Go^qlC%+;2pT&9apJ8Aq@J|@ z;mZ}fK>6D5n^bqVqneQ&e6to|gIf4t#j=weQY(&WbBG{!eKd-7*hPY7P_BYIVP3RG z(s&L9*&WQLYRmHIgP8lZ+qlJgZdI@6g4cycKbG6U$s0K?1$kQ9G;j7YIBGqm2UD3S zFripgi<2+A=R|tG5Hb#;O@?wcsUITql_Mt_GX{GdsgFx9vEz0tURb4)QaL-L&|VFk z9-JI7zAEV>);QurI5yWX+2z!jNkHN_k_IeR51C6Jg z*&f&AeIp=qq*VpcsXw;6(W+!Rku`Y#>ajr4U}}r^&7h`tN6-oRu>rsNOj`H96oOA@ z&>XqQMynK#0inRUgb&a%*66@tz2-bUe-=1P^iH?5QPZ}>u=B03| zDfMn2Fj-PZ}Tx4_2xhg6qOd zrN!=@|2W3KAh#K`X$AD2=~xYqwT_e^ggt~4--Qf}mfwRxXG9FicS(CeA$t`OT7d{d zweCV@*6n$2THSs4bSl-VzzyRWA_>w&!=|RBa1jb{`@Bu^MSFi}^u@TdT5L@a$~q(6 zlfB0_PdQ9pc8(7-AzL}-CazAD@-p!UyMgS;ML$?`D&Z>2c8{Rar#{Brk$yK z9d@rEfAj4XdEAM1y^~VAiZ6b%eG#`UP4vb&@$H(Y?0246yF&W(_a`h5nBAt7x2nE4 zFLQ0N5821diWnXQ*{Oh;)6fM*c})a+CZ#WuvQ2-3AGaPhhdS;}m0D{Y)S4$e{Log( z>UWR}-IgAq%;1eVS^#o!D%WRE`mz{}d^6(m<5_#T?B zuh`yXyqU6A?7Wod*Zt(|6b_w^(cW=BO#T$nx3@C??u27G#j&Jqy=Fixi}J(v=_W;0 zYk0s#jUgE)G7&7-3AnZ164V>U1ADTjuW&mp#W~}B9S`9%9=VRj7_|BFAn1E zYh()YjQ{cwf92KLPPvubvm8l~%plI(K#2)R7d{wI)uB+Vo^7_l!iS(!N17&PrGo<_ zI!*<%pWA{axkl`nF6oK5vRAoJj@KBpx*_F}rsKRTegS-|kcjbADY>7)|CUHS4xu9T z&DZ_BSktuLuSQD7?7FjXSm0~ZTOFY-|0V9CJP2eZ_|H#Tm8tao#P#z|h8NfIQo5Us2u zQStCM-i6P8rn>DJmIiwlW_}A5aVews5w`}mMi2K{Sdx35pxexmZ#oU4Fqb-Mhpehv z>ntT^EJ_@_tc63vW#&%0ej`7qBzNjr%udnhultb}JP>giGuO~dGY{^fBexAnNe^uR zA#&&Tu3a8-?b+c~Wq}@Rvq#Cuq>7Vc!!ikOk?q9)NNLpII-wP!IvxG{OMK?n+g@$Bx4@D>*cGzUDf(U1Ry4`!TB3}$wg!f%Y_9AsWN`U!pEQCR)A z=!>*JqAyO4@d5f`c)*c0NZ;^GOJBGKxT~<)EzY)Xs1y+*>(qzsqYBOZl-oUtDb_J%ZzlmDiw4Qz4z+Pj8`TDQ>2?O8TbJ?e= zqSW>5)SqTpN8tta5qZ-I5--zF@32ddbkloj(AK&|wbk5cNjw6j$77G9$YHaJq7zD- zM1FIyj6G-~%+FWDD=0RI{9GjBIRVr>Ty?cER+2%}@wwg-1A}|0Q`7m( zwkuUTbVEcnwKTMVdPMT2$cik<-AR+TxVrIb!X(#%D2ln&3u&GgQF-RHS-6#_TIAyq zpWlZz=yDToK5WbVUI2ozZ=ClV1cP4Mkq!ngHQYU-;``P|RYmph$A9f+BQ^5fiA(w} zqKWIv7AzUiyIjNa|4eSE9;S#!M$0#ddFlM>9l@R7(Aj0>&As!GPn*OS*kC~PY36#$ z93!D?Uw_h;@=m<8onm>G8pqp??WdLdd=Vx@;?TxBxkSr~BU(Eg?#*gdqSgM@gb`V&yPlKZa5^H$=TDN z^x&81#xdAXdZ=LZw%b?bDP+VczjG z4RI5`l3r4Y$#Q7g(CW;#D<&KFo;qHGHVE{FRY|^p{iY6Sj%%dICcH0jOR0nf(Er;2 z2l!-cIF<~baw~J!1A>iaE%M^mZ!~t`tpZuA73aZgRw-CQtjd4!hxj*>*8b)XF#xwt ziJWw!btM}ma}Bdb>nf_3{2}A$GJ5XZo`3}Co$(mkEEtpCx30S|Dny?(*d3R>*rA)^ zR6QQU;HrE0N;ma<`$N0P|B>Q&vSdT@x?*%q@s0=#dTSy=jooxWOK7~K_*n3+*Zkb0!ySJc z=>WUFZ~U z4NW=%X6NTHuC-RlJjCH`sETKPz+TQFUfdtp7>B}-kp{eY3R?kTj8k9-xyf;CtOlpX z`>G<7Nwyf~WvpGT>3jD&wzejW?d(}PkP!uLVDB}#tUsmc-&88L9z2Y1ciJ?6?dpLR z)T%RcTIXYy0hppuQ@E|J>%^ty$78y753P0-MaGJZY-qQTu{qikB+nyphqczq zn@1Epl+jCv?5E$W{_GMd8~hFes?Y(Di0U<2NULC+ryW*rl$3>-*F4QutO2+`J}7jy zMQ5)A4e=v|`HLguL%A>@L>i>^MIcHJdD+{%^1Ju1Z7>#hCr$$jT9EL|&|PsS@b2!n zQ*pZ~BS5f145dk(%}&@Li!Yg*b)>$q60kC^w(V+cyAS*(Lsz;RyIzqHRz=Mz4v8Uw zOov=KPXp|zl7Rx9ArOi*FP;`(q#f$!I53J>OIrh@NXd`PH{w$l zH}WnC&MzCDQ&)c7;RU=w8wLC95wOn!k*6tf4C>PKUIW+zG(6Thw(8s+2<}M5S+7v2 z*u#89DS2a6&`0sMH4YaU-dvpA8-75ncg`LW@7ET@a;H5nhfHUTXarb~$3VGy9?gUw zB_S`lbwjvKPfwoQsNIJ1>Ph${xFEr%To-{Q}FdRuU3~I}Wq3&ljnP z$xS_|{>(^Pmm^uNcnOvfzWo-x1t8}2?-d*!cf-Sqr@j81@JRb| z!UOl<|4ex7Q>qsvJQ%JOF2Aq<2;K7|J>QXz@5^?1)GGDT+2j6gZQAlD{brx(8MjhC z(=(1~ZwQq{os}MY2>F5E+{kvKB}_BMx(zcM-xu?{q$9YuOZZ*Q8&krM#bq0KGm5DP zF+pQLj2tNn;)6}V)}1RQcM*K_ajH0@uijb9qQIXFE{oSwT-s3XW*=oXmR~)1!mzZ7 zvY@Kxv9`Sn=eV$U+o#CK6{FR^k9?5!=l?G9;o_;4_DkerKi5&Sy>nM1FiFZ;^gRR! zjWmGJ2ykpM%E`DfH2YdO;AV;dq4CC|Alxu`pj%`k>QIOS49MdjpOw8<{(%0fJ1hA# zFC%otFPRS?CGQVNq8{kSrCi@i4Umt+UhSC3re6~mRU5*;I-*CVm3ElXiGJ|BMKulG z)!)>CTAO`F!+y)xRivPT1>2DG-V>0^JD*D_|HQE^4YJ+#<>bfha%ShSt%(@ixL;m@ zU+j+Y{xGaeJNgHbMsWDUk0)%VD&RBMg%_KL@ggwyedF$?Yx4JVJ8Q;zK9=rIhUaj#3ijyX~)e8dcTA?62i%bPRQcXOLtO4nuAaYB~7gquw=RJdFVg~+K{scwe_vYN!ZhyM`(q0jR= zL+w{h`PRvQcU}cl*TH+P6@LGfJrAjGtif~4EREhRm#*asXy=?f8Apb~+Xq`l**hi##k?7EVlKBYja(0?RpFj|?9eG99xfB-#zsqU#S z#>?GatDJ48;Q~k+n8NBmk~E5)a@)x0g1VIJuX2Y!3rG~wgS_L>FUp-NK169%j@%gN zD6Uib?)+O(@L&wm3)g=2g8}Ei(hc_|_g)tcB_6J}_nNc>5)!SVzmkw-T-uHqEmDh& z7*wO~R8KeH-{K-L2v!W`23D`%VJP2z&D)A42}wpb{ZA5-?i`r9KgH)+%q)=i4#})5 z{i(oBNi*)$bW*a&;QjG;XaP>c3;uI6L9&(dO&Gn8kp?UzcV1fl&O%a6b^c2WNz3c; zBZ2`{zulR4n#yMFq*j(Q5N*Mu2jM;UzBvUqZ0x=Z~R6-lvUM7*x- z-EX#uY9`F?1c8vaRYQV(!-v=@uPLdC` zAkAjFdO3t+aqFseA~ty$M4O)fMq?VSCU^?@0o4&8c4uP z=v>5SCAgJ;@{-)*{vTcvMu)Yj*Jyri@NJn&J}B@U>gAZUJ`?WN4#cJ4W5S{J>FCXZ zW9!8eV_(@E6^(u@0sds~6V>iBE7JR#!YzL?A%e>}tx$jkX5=twbS3YNvGocOxBzm= z^9ZB@x@C#7@xXA_K#kj3d%|hVLh(YI{ue15<2Xf1>uFD|@{EUY*mU7(#-YJ=k>w-n z_I)UXZI)Ekc>7(fl1_&R_q?Jr#|^YDn(7;6#YmyWHkV9fjm%etBaRUD{6{2sH;Bg# zh)WrfTPa`2h!7E&2nEmfDE%ql%Gv%z;%nva&YKCgk^@;=WWIXEGzA;$keHkF3eQV3 zBX`3siv!Y`e^ivv1M!BB6Kz}y^A)G0y>#e%lw{^QP?qwT9H;?ZUZr&u9jO5#~g1cNn**tOkN-vB}d80b?84iN=%}_tMP3upI({P=9$a?Au<3|2DLxuxLCLv2wskqlRtcQ zPvaceSGOjxELInoG4k&+aDqdc1h|BOite(A3(5A{Aq=bo8^b(~aj=H*I~+zgeR#sk>^2&f^AbN}15P}H9d$37%W`~*l>Ncj zJcsj~D2wFR08z=xv(gJx1kxXa81J2LF&Qhh)#9zW#~6B*raz^6r09wnLwR?k{53&2 zzUf-nm&@@oxo_@7PG>stRnWw_$3n8N*8gPj7mZWlje<4D|2A#=`F8;9!wh+HfAnd0 zwqu~>OWb~7Bd`m!OTTV#=uaV%2a!{bJ*DF=jdRic7V#M~%K?a^ZhcmD8N`;I@^iPXwRMnVVbWzWmvUshk-j*1Z0hFq)n$KjpkA9&9T{yVPM zw{*T1cN0wI)K=Diq=K#X_fiu&VDm?cpeCgoSsOr%-v|{Q;-S{;Mm$_t{U-Qf>a}*-h`uuwA6FkhW#mo=fB}OTy8r9JV%D@y@l7R z_x3A@4I}o1r|uQtIRYWJqVo^z+YBNa+$==2E48haR`ns&8)@8MttO|Lr`42={l~aO z+lu*c`MQ)@6YBk(@MFKrmatuz*XOZkj{W_Bu1xzI&^dE%ru#H2gvvG;#C-WJa@`~N zFfV&}nz{10;H~8_iRocS!Tn{N&Iz61cx|bc2-TMolz!w}uf8`exCPXoJSXAwHNA8D z*jC=gefLaV^KL}WSL0uz~ejS##-T*`qu$&b%&xoAaIxh9C) zfc~e&8k_1b_r)B<&)?FYa_;fzdgQOO>X7bV9R7aoziwMIi_4wEsac!e0};qp2Y^@p zA!tW%(_;;k#~NwmMw~S{<+|ELgF%sJZ*y;`)%@0u6ODEl^5O?q*vq4{N%dA)e0BHu z-4BcdMw3P_2N%YotB%nH?vsbcx~=sv8`Q~M8DpS6DWu3Jn=Iu|%-So~!=j0T{0Z?} zv#g2?mlQ$%1iUN%nLoM31?OGa=Gdcu%%9MayJjZHhdRSodtne&x%>n|ZRFV(p_(UZ zk7jyaTa2E^mgx^>{9RX|%mKVU8E{BX7HB!j1m2DN;>7duPQmF>s_AEWwF4N-kU)9c zl6vtQ(5zOK?U^Gzn~VbDX`CxYFDFx(3#!HyVE(Q2bX(94h0{uBL+|}pDwJnC?*63; zrFie=M~5fP3fxV#8Y;>|LlFs28X2&gm3UVC@U2%bOP75R%9qgTct8Yc9Ih|ew_}yy zu(9Qe3W%DDtnUYaKj5^0-9hgt8n7*=hc(RaAIJ4ULo&gGsJBO32?sQgOKWyA&y*2I*NXNi(vytF&M+YnOj?Zxb@&E;jO zQ6u`YnS2iZSXz$6+-j2NX@z2=ioMq*B%hpo5%YF;Ouw^AzQ}Jlk4UB!5l(VVdb@uW z$}G$m=uuWG@cxMNNNkTBcOF{&Rgbcty8-#}Xr^Y(Y`@QnUFN?o8eiVcANPyCw`7EE z^do{L-AQrqM~N>l(aQx(^v{ToAN>s!>nTtg~Ro#@m zp)A>N@rT&TW^OZa0FfViomS{Bp=&@48Z)@~Bt=T?$Ft>LgxjT#L&~(Ot&|KCqNDjogc;;FqS(NzvN&yK_cs2hgt4c|AX|>I-d}#fq96Y<4Y>SxYCZdO5Uln;!642Kzk)%wb3TDVj-is(;?_|& z#1Sec$VQn7zL>sNChmB&oR|Nm&Ps+53A7X=QT>IdmGux(0h`?4gL_q+07>R4z~_YC z(Qlm=Th;M{&nm4gYc=Eh3^PE@I~irez9#pn$Ybi#dRG7OlHac1+BU zaiA|UzK4`QFn*j^{aheg=^K*9Lhx{1Agk6B4h>af`~Ur5^zqZ*FFSw#=6rkp*Zc_; z>gjZ@P=*joIg#E?znU88+pcm1A%)acy8O=DB$BB^iqD4j@82j?LCeY`>*LtC&^>{{ zh~{_uFWZCYk`V-s$lM!L{V2xdAMU1)E z_nx!MoRhANXlha{1f&o!CdbkamwmSaVp^73s+0+1b!cZm6QRLxia(P=j*QUIqo?FU;{L%r_acV8}( zM9)7FH2buF-a?fs0Bcn7z-T$;UVTztz-5WC?P-7%jSS>d)VGUziR%T%I1Id)Y|nQR z%zyq<#d5`{@)s40AMn73yRf}o#^#b3jR3tfI%C^W*ST_%>pKo*>RmH*+jl)<`0R0- z$QwkOWDAf@H~PYiqe>#o9P+6Lzl;v?gP&r%uA+P(!gLMYi6xOf9UBiT%!$ILd&b+8 z68x4_EWFN2U%?o;TTMlKGdNgFT!hwtIf>%xwjxB$PjK$~ij_yr8cynv^we<~iMSE< z;N-gJ_Wc%DlXp;{0T)FHmn1q@Ti8%q_4?H^l<>+hkqhBgd<14HyPn!8kFSYj+m!^Q z(ME=G4%4i*gB(5SjwV-eL}C;q|EsObSX84nbtdV4mVJx-9uc?i zPHruVsH>^&fpL-rN~^T5+Rq?ZaB#XVqbOPmb2d;nOn) zHKe>@=c0-}Y!uF|Ad5+4pUgfKo?9M$x3(AnMvfKG#_b|9mxL`~X7zhv%gyI16tm-q z@jAwo4zbl;AZ&5T>qrOd1f)$tUsXkWgWwI?3oZYPH^^V`2321s(glNhiL*caMb#|m zX&A3>{dt|VAh9xb=4i24dUETL?UK!{H;e<~XwtC=oDbDX5ut36Ffw#zQ=Ggd%f|#p zp%o@P2x?DlK1w-!G*Qk=!CG7|?7*FB0IA4(s3;U7+g|CvFnBkm{4Nz^WH); z@u%|m*qORmaI5_3CC#~x`@)fDKXi3oqxJ(Rk9Ua+Jr~Z?N}p_=Xk#a=l|L zNPM*i8C7>+J$2&Z4a7z#BKj`}Z=rTauUpkxL)=AqR{Tl!x>NW$o1)#G-pJ*t-~#D2UX*}D6Mv{oUw`Eu7a`XbhZB0)e{ z6hzsa$|@d+`XqG$N4{UBE5Why$b{OKFzaGzxdcvvS(U75 zXe2*NUdEDpFQ^)yLXlluo^re8a`X0kue{oj- zrHQsp8l*Q+%#LE?8@3;kZh!mxZ zG$~O55$U}JBE1Pn@4Z7HKp+7^lJms6_Ph5U?{~)c>x}bbt+9qf!}893Uu9nNn)BwW z`1vHs1(6I}vNnueS>_la!4Lc)&^e)ZD`Y~+K6Aja7my`cc>2TU1-li{N4nX?{xa}f zGQ&r4>DUKC#Xe7cm(HA4%&e_dW)*%RP+VFpQ(f{`mqZWYIy&;-d|uLUe|%nmq<%VZ zzv2LZKNue9eS7LZ_XtPnbUisCIsh}l;b7l=k^k1RKc%1;@18E-cu&el0Xu2Ek-+wl z!#PWacy)93#B;#Tj4IdoW96B|a;|UQXVks-JR}HFW%iJ0;~-vAl_|Zu z7)5OBodEP*lBKGiBpYAKd-OpWM$h_BU6Y5))D&Hl_eZ542TShPat2ll{PKy>CNOud zvXpU}+O0fMn`t!8Z&u`fC_x&#B{nHw6D>bQ{c>x1~HD zyb_9JVi@3x{`-x~l`hyxShh}~~iYeY~*Bkwmh%*BH| z-dB9*Ly-%Q4q*LHbpl(P9j2cm8<+E)aEoEAZJwG%9=-9B{YQy)V*Rwz;nU9(6 zPL8lYLica^&16;e3SV!uv4S*^02wZU^N?CQ-s+{mq$DNT?qMmj^qeYQvyCT;-&qbc zHWm*1C@ulCgZZ*Ewlr>Nr(x8VA23t+zp8}>tB#uox#LM*PL)4nnRod00I1NeXeS$n zTU4!n`FJma-ab34$2Q40xJJj4=A7j@dcf(#>Ozu#;?_MsC04)?xA%1Cw-h&*d8UlO zPWi>=)UnDZDiUG3-solA#vLKgH<l1XRz60MAkH4Sq9AUIT}tLlOZXpjNNxq;LvV!Z1F)f6q~X zvYf+LAc_hKWmIx;vpnyk9SptYHZur-oAp5KW@)i<4~l)aj1%lxWUU9N_j^%_K5m5A z;kMa$ubHIcEmrv`?-=zhv91lk(6jM-X*M98k_t$t81xr}Eu?*xf*02?XQWW1Q+DWn zSkd5ayh=LD8UvyROXrRHTMDe=io~tVhDjEzzWp6x9z3z6+xk>Y#G&j^1RabDUsa~-3q@8^dkao`9n8Nu2Rz0DT@>T1xLGi{7<{)k5k?FTRRMnQQxT!m4J{& z#^gVY^8UDhCdQm!74n{Z)@i|8s-lrr5$;wz`B_On$T<)H-;;B0`ZNq_n<9gW`Rv18 zEyW7h7@Uc_@)?xaV0K;A_l&M#K%2!0|3{nUVQ{-n(jeE}I(3iBql<&S?9`@R#OLdU zd4=CeZ__;wkak$XH<^MF9`zqaOOlDNYC1HTO_PgP{X1p7sA2j(WNFBk z8{>A8K=<~4Pl2dA8O*=uM|t|EXY5t!Y{}Eq&W=+0_P`yDBaj3 zN)?C#HT~K*u9)I8KdC!Q|No-y1anamW6pRpY?5On)$K2$gmyc!({v}h_hiJd+18)C zryl=x7O?fk5}|v6!1!^=z|@e*caONy|HZ*Z04QR;X8ntIGzzi7`vH&tr_4+B%eTAg zRxBGcSc#ec50iWN!wvu#oX)13KClbba6|Jijxt7xi0*CS+`sQx)A3mX_L=bk#@VFM z`yU^vyeAQ4Dnv9hU4b1ia1w;S7;Iyq5~t)+j1A4s24xvv2v7=15yZweIz5WBb6M+_ zo#&zNSf17H9E)%6SLSb%1z;cuzgSjql4vEgel^<(~SOBs^$-JJuf=?6YMde(9CqiF2s(6Qay?$2It%%+IW+%}xQm|>Q!O^~i% zELD&vq$JE}YPjr`R>?6nX&Ns}7iNU(&a5_Q+97@_#8?T(T(G%}n?xJ7F{(*zC64vf&4GVhb|9;RblzxwtUgM9x}2|=cwp;EQvjeq6LTqzLcTUH8=8uCdr%l{Y7U^JvIcX9WVheC(~!-$k1%{gjHPsCzNt;a_a5 z`uFY$%%6&{bLr3TC80ae9}6QFsq+`-i*_3;&&)g*bmhS=hG(Cn@Pvp##hUu}ld8_` z^)wmvvIhW0Ji!_=m2yGWfQZbag=co&=w9}m)o^dY58nY0Wxl}3rhvx{kdZ+_;nxR) z@@cIabUW(v^yp^qjvQanCR}jyqHTPmC{Sz zkhyKS z8NVu|3Oik~m?zlt{QD*#^*C0&Kq%JNLm(i(3LHpqVjtU90FwV=Q$ zhVhH(3dE(gOk?75>y5VY(Cyf#5|u;k(l|M#aeOu275JyBDF+~EkERjU0~KT~+t`0a zG934zo@(;Mym;vnt<-FU_i@GKKV%CN39he9&|UR{b^rjf-&vYf`*Xg*0J;8yQn$wH zuP-Am{Cc%QXQO~0vd~ejcbS?Ww3)2;n1SEQNcZ2Ba?)7(8=9CochOP1*}vR|q5!uc z2<*#9FyTW&?u6H}Enji2wGZN4<@6n%-Py-XsLqCtP54ekzm|M3p_sTLiMZ=Uy|F2O zK<2u~PpO zxn8gSa{qepS1Yyvk9{=YA6GgXid143kpybaoRBTN4;f#nQ@t6@N2TGB3*XLk4`gxE z#qTdDpup%P2h5|USk(U9SPGc9m@i{U-W$MZ%J0qs{-B_qb5X5wKT#3j z>jSR!NP5zZ@gYfW8@EGZii6qurE5X0I|#~%{vQTM&XsZZ>M>sh<)`D4ZpA&k1=JUv z&$y(}{a1<^_B+J2&*aOy`5V-eI&1(BcA4_=qu>o{ybVmB35AW`YUm8t?u{@gxfM>V5j7>#RJL= zmKiBi`smpUBguapj_l;@>dkmH0SC#;IzB>XgY<|%y?$qi?GtR4J#!_oD?^n`v}Jif zrnmpII@T(gPP3Vnm|q7gZ!^r{BoCT}ujY96Wv)4(m4_+EzjnT~ObH)_*pVwzsFy@?8L3nAnjsOn-WjOaE+% z{Uu%hz))`Y4>6t{)=-Eu;QQIlA$TG%orT`}KdU24-aMeduqW+{VNQP|RE&8BN~ zfS>j5tyGr8hR)i7>Y7;5-BmULaZ8DzmKw|uqe|xv9lqq3fs)(*6a(Vl3AMr-Eq6d| zawG1YsvvG~&K7THK@_G#x#4{`H`wcgVKpsDC$Z~;>926s&-MO_0gbO6x)$J3Z#B@V zdFte6bYom*=V1TDa%PFUlnWr8D9HID1-ZEJqDL7igelGrQj~B#$8b`)OQTCm<%2r;@$A(luTSpJD4tB- z@6fIC0&ZV4F5FKNy$GfD6@I$x_tE)=7d0eu+b1rJi-L7;$EQPHe$}H4$1Oa2 zjzLMYTBKATXS)RGls|)8da|bto`grCU`;aPT^gi=-2pUA6{4N8g_ZrqIenj$j5#Sm zpWdYV=cE60Iu1uv@I&6e*YJny>TvnYZ)9;@do9uJPikZb&Ngmern?0dSpEzWyY@TC zKz^LKJpN||Qg{ZKCsKk0G7`U~$Ixp-1-)GVQw6D{(#?`5sjC+ts5ZMRpRSTKvnt7F zIbcr(ZR=~gKT=^wvkJ&<8UyOE3Np1hout_eeZYWO*JVY9S54sAEZZJ1iT3eE_ot>S zR@dj~4J&7A+MoVhr}$e2NvCV5U_`|1t30N-8HBIC-~a?~Hks3^IXAyogTJ%!W}>Y$$lmP(O!=rQOxan0Qw z?@tSnOz~}~{Wi`XPS%Yel0B#5+h32c?8qUk7a8^P4JW=yfwVz_4Gf@2+a!Yc zL}jj9ai%M!D62>q-}*FG2PUl>fw`}>f_!%B)-trbZOoP`Yz<~Ejuj?vXRWf{=u~gQ5(nzS_1Lr1hlH z`U`t9aTj%CW-|)0p9;gkCPtC~R98*`F67ex*vfVEAY2wJ+{E1D%-ER--y3X_@AqNd zXMH&_upXXEsT|jQL0%^K?}73~C@hM!f^vhvMn)P>jLr$V4=sV+iVsfg^_TAXjLu=A zt8vA-+xt7jc$CUaN93=g(-ojh$#Q2`OMtQ~Qz>@mPh68r1WI|_I_T;E=m*9>$oB({ z0NWmeTFt!u+(-YJObW{i5v5Eqpo-`H)c6;q^D|V0uSMHN`lg}{{t!USn37BEEJEP7&}%G`ob~qtMJu-RyTFyi(0n18 zjUZ_Kd)uZ`n-9%;4eFlk%NuO+Z@0@Y7s7yZM?Tyk!2mjydb6hoxLVQw!hZ z)~OV?-Fx@jb?k+kO;M*f6yoG94;!)V?qCFqEeTO!ZrSZYJ_EdtxiG{&k1jA#%z6cY zQ#y?j7&ed}663WX)ASms@3k-&9^4q;j45?dVQs<$ z+wJUoyn!#Cxe&V3C{f)7YPy<*d^3uH<5!G;O4eNmwb!R}Vx@YoFBj)di1pcxJvRfN zk$|VQ1uz||)V$(3qV~`8S!hWFxU$c(P6G^Ddy$QlNeh)L}g&&i8F)l)hOu+dIwG2VxW(svp+#E^30yY{bStY=9_i;$^J2L}m%sk=Da_>j1l4*w{*#sotEjM8&)>V2&HLv_ zlOU2w7PrEODJ3D#uDJHPgo*w6O{p1{<*Sr zgEPnPkbL$HiR4{5(hcl^-${Uq{zn_1^*aen;%h0~fG;8)U*?S0goD}=*=4Xn-?;w@ zk?jjkkKE8h*WWoIPG!@Trt46Tp4A{d#Y)234Yi@hrjv((MO0CCc*)Xxy zTWM>bQ^J-#Y%y6*J5zz~O)T!Cnuo7tGR|5!#Q4UM2`F+xh5%%J2Fkb=&m#oi0D41< zW7d}R0X`nbk}Zaxf6uW2(z}ki>94SG&KHUzW4^FLT8PocyU~W_>BE$#;|@gHz@}sO zfYyP8?j$`UgRDG6SJi64pBzE(Ltj(ZL2x6&@POvK^yJ+pv7Ye&)Zz^zQe@BUNKm>_ zp0GUDU#|PoZ!LiM&e0{jSy`t7c|Z9u1drk>2Ljx{*mjQl>NuH%5BJw(nw{f4u^t}C zW7c$u*&00&rScV#Q=DQ`Q4|v#HYWJ z4A@m)FQ4Sqx;8e)v~cMqVYrKk0POp3ldVcRtrL@agWWFBU!p2 ztTKO%^e&!SxUx4a4al>T<_kCn>DT%jBLHypF2e?VRg@nZ1Lp>O^zQxBM=uRW@zG0G z_lhfjlkmewuU<5^9#gk@6~2>(gVsyV4)<>=)&g<>mj)$Eg|iWoHTi|eGsLCzyMS7_ z+srUw@6KN%y<;8yTmx2Y>7m>KH;l~GSvEvKOj4tua?@-9#@W@!v$4JuX0XM3EbXT3 zP7P>$N#&}-++{7sDr@&)HX#Mty*6W#lMZBpweo>XGizo*B!573*i(#l}LX))~ z?eM`m*8Z_s9*HG;pagMKAY&CKDt++oKBa^N)NX=!(E#JKss%aB5Q|eY`xt-`__$&` z05f(U(t^+U<*?ErVdTeeBF$}lyFRM}aJzI*Sx$wLy?F@~lq~)}*K3Y%jB+{L!TXa` z0uz{A0Dq8P%f5Qnt4)8rfKUU1zt5Q16&_rl*YHKA#g-o1G^>UlUZ>QRYgHI;h(i6H z^$9X@!W{{XNTz&R)3U<=3`mijBUNjzx$yTM=0U&HOYC)%WDGg>ZULd5SH6qIZSV>4 zJ3l#Y&QhZCF&P-Z_5#(lGf{tew|cZSI>#k#O@CtVk^3B6YWG#h_oquj^~L5 zd>*|StAQVZ7?}w68FZdunkbW5eD5a>htyzT$)v4x_a7-X2ROa)e3_-xC}nXt!X;CG z>uRi>v1t4_Vy&b(2<%isw6lmSAR+XB3ez;;mc0r05 zAxLIBKEChbODUblfLEYcSK$YeFPi~d+YNq2;X{7c6|FzWzlil8u(`-*k3Yx^PMU(u ztjKrE-u*F!_-b^WZ31CMpab9sru19wn$H=Iped$3Ql6iW`C$Ms50UG7t2ZH|3)M)exLVWWDF~Hn_&6>3z58sJfGNnoBA6N z3Xpt$3F6JzqI9|Jnb68?1CJ^HG3)fCe&EhwR)CH}V)a_R{={_xdmN=@@*Y<6L!NS9 zPkGNWoZnd_F>g3^LT7P&e_jHw&^RQCr=(}1NwyUZh`^h~gq;hx8T*W255{ko1O7k{iU8UVyw$##~1jK$E!z-*^z0A2*m`x)fr;wa!bZpz{> z7z44jNc=xmmE8AFB*sV8H!_Zq>YZ>#^-uX+U3Adj?!VIt`8d9|xP`ACAFA%fGFF8P z&zkmNlClDG&rPq64O{iwU30E|dtIn=t}GAqwSfm5BMSO$1NtIQIV0ubPP>ZL@o4E; zhxxkNz(t8CN8*8Qlm--@LjSx*3*w2=e3`5~zRn?h56*zSg;+pi<8Z`k7u1Kq0c-L`(;#or^yJ>p3AGsJWsw6|_^HfKGyg>qa6OJI12d=Z)d7{b~pbTWmr?Iabfv|`^b7V(OM1kfd!l41tsZo8&1o1o~5a8+lA61l*(T;8c zaAt9e%c{uE7s->aKvT~Wt>(|tTe7p{a0k3gjJK;-5tK2N^ZMpB+vvMa0 zQ7fZd;(Jh@ep!O3kF^ixdZP3$V6fUR4|WBlaKhi&35sJkcF}1$hR8|1D^P2jbvgqh zU87_c1UMB$EeU>oVMcw`mQLlATg_dnB!6H<7dK!px7PFGm&59a-V0ua4SAddLbM7f zH%IG+$3x@#mF);`hwaaC6WK>M{^wZcKsl1_8(Q#l*JJYJs{xky~mVhObCdexjWh29u zeL<%c%c}d1nQDEy9o$Pi?}1?7T!4ZfB@o_oq!l8K4@)a=Prsk>vm`w$^W#C9xuW zU|3Ct4nW>xeRTc2-+iw;_=xxek1DNNwIgl-J=5?Km`)BTLD!NuLaZ)S_jD*+nFccy zJ6Y3iZdM_DOzKSpAo~mH9P6;8gwa_ZqP{(pZ!Obk`wPyKsPM9aOvFr#?5G}`0DAq# zecmJ&ZSt9;jUny6os$+qu*YVMU?9+2npFo-V4eI#+*jvyOC$e@g^l^i-xOto(|@Yc z^*1+XfCg-^iF$u4U14?SvL1OIMExNI+tIAhjobt{2h$@4F4G(OnZ1#Kff+IMm(8uU zbC5G#tS%w%48+H|?b>-og(Kv1Hg*|PWfX?VX}aUS#Xm6ptsj_veqEbSE(qGJxaZ3f z;G!2V-VDPgOd!Eob~C*wd=6*F6?j_CF2cPnMquo6dZI}2V9}0S1ir()+Sz^j6>r$wCJ$Lfelyan z1h?Lz1uv)^TeTl}SD|hefuD`iTEjGaU$ya{aF+wxwzVN+pm-Qu5;bAlIVMq7BiOcC zGEPBO%t*LUB#?>Guj@L^Uhy&SAlITJseRjGevGF92><7Jy4S}?Wesz*{OoH?pSI470^{*9Uhw=vl?S-5ap7*H5Ut?|0#)s3{F5 zkj7BP%AehEGuwh@e|E7jS1hApY_)U909e~A{Ep8p{uj3*@W-4mEp zWu=~G_%TrWIY8}{X>P-R=M0xEfUW3HRJ`L0F=dcyR$rx{hbcyv!U1@CPhv5gF#!k( zK%Yw=?s3a(>AZY%TS71+>pV>zHpmY-yBRRuB8`D|!YT-(3-Xox#JoVcEO4#;;bFiN z_g8`Tv0pBhlppS$RY_chDCpR~`86tJp)A~1l>uBD#|h}-!DN?V4Cc|5HYPHqy>p|G zOV->`gzU2yCoJwv0)8bcxCw-U`~>^HpC|lvUo}q;$#*Cl;=K}f1At&DS(S!Ts7ZLe zh6YexlWzQ10FvKBT-opg@4uJX`mR`M7A9pGtI!^!2FyV5gjm%L_bDo7hwDvkd^@Tx zQ4^w%)-Gc7sP7aQtr*nktrf^DSVp+JlU#74m3_bs99Y%LZ3y==r=@p1-#xZl&yCSe z#J)p+yDE~^7BX#4D?ZV$zx=c;M%HWI;S*>9$C{iG99Hz#yt#xy+Ho%n;$!TJ>9$?M;5mYbD_3H3X83#y92fka(?}bjK|H9TJ_m*-vRF0*+@(tRE~(!{ z1<cC|3T8w_-q zq;JjK=bZvE-NN2%+UwI~DY#njI<4h=Bz|Nm)?|FyhuN2w&Vd7ByZ*&~i>@m)K`LWi z8XYfcb<9YI>TyZ*1A6GhMwt7{`&x3v1tU>f@{Es+pmQc*$hlqQ66GUmi~j zsyM@|d5X?2GBOA`_zbzx=sWO0-9zJA*ZwfQ{c{$V?>C@D()L&CoobKszNB;#`Cr_I zULlJ=I4P=prFS^O>?=<9d5;7Zh{OZr8ygRN<%HqIq(Ji^BCM9qPPj4Yuz1Kdr^ix1XdKmStpU-WngVuN1fwFOt@) zb*@7o=rz;H`jb^%&rjx3kfNFS{e!%$Hl9EY!@}yl)y1snu-^`WpIHO0^BcQ6vt!=) zF(!^TK=jN#v5*Y2&j`P=GyJTu{gC;zt|^BQLoEAly@(HKza(Yl=FU6~jbPYw&Pi&? zLt)qXjs!KgZPy$OZyq`EDWK#Fw(?jC&k0s}dD6~I-DtUUf^L~7KfMD7MsyL23$ZI5 zE7`hEqE}(2m)~vCk~f>>{&60S!iSdRx;K>1PLnz;VhtY+`xf`>@u6}bXp3hUcrK-B z=-nJN@uR7ooHWsWa@1aQAl7K-nb_WRLvS$Reg+HvYngI=ae-TEbZ6wggI2iQbv7EO z&aCLGDr@nMcDd2L8+}=1%CO2ys4sbqzP@pbooDFEf;1BZ{^riRYZ)$vIp-{iC7@A= z#suvr*M{9_9V12{0p;Ip5G(nzlHgzCFjY-hJ4puEJPc)SP%_{s3R%2x;R3Y`2I=f* zC$bu~hPjfN^@d71!f;s7J4tqoTn1Y4%TkLtgo~3XcN%+BUp28Ih_v>zod>!LAvN_W z@`#qtUeD=95tE7I-yH@F-BqI(D$xb%Y#xUpRx1)y$poOv>~YfTgyRaGt9^6AORuf@ zHExiI$Raiu4ovq=&t1kq=O;4wk)B8U4C>)}FRZ9PP_w3Kp17Q;IU@Qpg&kJh#n6!= z864q0C90hsz7sjfHrR6>eAr`&jcDO0V)2dC9<>KnwuGZy&IcYQRQj5E)QW%1Otqq|>xJMvLl z3fN*xtyh(ghPRauw9>pg&waz?VaE)_ifs2V#oK(**e2 z88xx|6K(P@1;efn(Cd12Rx!4uT|5YD)gm_skKPvQYqWbB8lt^Z*y(O0&H+&e;bxE@ z!imozLsnC@{xsecMB|)y$a?qp>g|4ghSjtD+72y^@N4GEbb>>@*@?iQh}$@8jKj|y zXv|Q{6_-5nS;#6Ck#Q|>(F>K6rHmq3w2v-J0J3W6Pm`gDv9rMQFNJ}j7n zbq68+vkfDjJq0r}^AGpjjINRkxgR&wo^s45qH}Q5ky_qP??4c#- zIRkO#rc8Br{rhi=P90a0a34lfEnUu$o5I8P-|^Mnh0LDK;|CHrRbW^JfJ=V@70$*5jc2VMl^ zxMrG@N9?pgZ5>xlA6HHLgBMMz(1+>{5-qBWQ(j+a8QvZVKP$I?&++EvIx+5aL)X@6 zM7QQmh6M-1uFHXKYPH9bS|9NrVX@m(EEh_(;m|vBrq?u1@>Ru~bJ&6dQS!%585gx3 z13wo?YTddgHO^(nlc3(MoOvoT_OSoq7k<8}ekz`{SGj5P;+orhKi3~rn>Lxd&a-em z+0^=L_oTx+oAPcKJ}moGUH*oHe2-JNWz5r&+U}SbOVEPmEKmZ3&$tC>&e~PEK9ulm zeBDe~((S%=wH6^#hPb-&>nXno(3|3H!qC6s*Ep-!C`@)j$<7^Mov^?O$DwnM@OD_?)lAhmBYidvcr-xFg=WsvU? z?)GFkWQ}BPek&Vidhh;y9i=KmL_YZfqANnEob`c{2ur9?J74vD@3ZhPjr<4lZ%PCq z-+^{@F^9RfZF9KObh@V zi{klKBs+Xl!5==O;le@$=q&cat}oQDqb=+d$h(~<<&G{dS~qEK0tm6t0Dh&;dzB9A z%75A;1%ZEneUMYNjtqHz2HNJ~ku5_#xL|Lr&aqi5%5`IwJ7|$7W|F;DB^4RT?RYNz zF(Zis+2}jPRXuYylP~VF!R@0G{>YOmr?rJ{+?&$WW{6~fa~r5TQCF=Cw=^`o%)Ok$ z!>qaNAbq@7?FB(K=?GNEv-pD_ui9y=xAI@=gw74T#aYpe-20^ATK45_w7zg|R7&0X z56rxKm%22e-?)vaEi{ax%nk-Q4VeXMN{Jsjk>vFuiWL^=-gWQTzK7W$zss`_@yG)4 z$V3`TtQ586?FaLdcVD+4nQuu)oQ>4^=16;!_V#J2l(+>t4_7*^A`z<6k62n==)1Ix zn4PdOu9sC1Ilj_bLKEkdO3Hy;<}5;EhdYsg_N8LIwELkJgzsfg_!h(e_|1r* zUeTpaV))O34Y+Z%haOIl4fy?f^&~cuf>IeGcavWW@!J?hNCSv@thiV1_B)^>%dR42 zKN;O36hD;X-gI)5DJ~tbom-%m22COT7q4dKRM_|lcq`3v7pN|u+;of{v^^+lxE@NV zzh$)du!@nrB=>$8LnJP$u#T@)7}8LhfeMT z_4Si9Lf77rLd{pm9k!2r_(fCISIOBpUc2C2DX|gGpllR?cg?V?&)J`WiZ$hrQsv~! z17nIb*T(3ri_ae3GJ0{W3SeP>-ej&@emgI4w+bvkH+&`ak_974?X8Ui&M z4`?BdX6gAw7v3^!ULMsh`!uW8JC&;46jPyXkZ#DV zGxzCAq-$EZ^D|`u$>o4a-tC6ipqC=S+yk?Sg3X>7-5nHvSJ?M3Bl&~s#8iogeo2iw zVWB`%md=9M;mCIk>6Fd8pCGPEGOdcAgI^Qc4Y8X$so%PzvR+5S`K5LRXu3b5H=_CaUi4(We`(TxX>wT6N%;+EX zg7};UH@wPxvNDby9epLuE%#R?DS0TH(h5Q>jQcEKzSt*p34S|Tx&BCGsuD|?_xc%1 z(z=g2s+28$41N)*et6<>#)ZgINrrO58n7t#@KXFKTH0frGchh-9t@$jvmrF+qp$No z?Lk9FD!+o`ocSI@s!-KDhrotSMGN7eA5j~c8!fivAEHCu7?r5+RQ(R$Hwcwye zYEk*;5v6{U)CFWmxo@OPu=oiWrpi4}N9h=6T|j1TwRF>ZQIFVks(bLybINlCRX|d;}PbB(0?hW}0 zJ!N~f;BIxN^3#r0pzf_S>Eb+8R`%yOTf*gXrLc1& zj|o>Z?$LXdZtskynkFK*oh9%c;^q=FURkOWL;4=os-rx8RY*Oj+Xh+5snQE&WSzm8<|;EcD5zTPj2uWX-0v>i2}@-xd#GFfpQPq@~FF|LJGCN zo$F)hL@p_<5|}vbAPf8eteA7yGl*aFfE~n(x^lHdKSL|?#J~_`u6dodgE?^je4LcC zWp$GQWJb?~KO4tc65N)=n!Zz@BS{tfEY?_Swt@?#SO#x0PzB((mD>3PXK+`;57?oD zZj$*@OeDOgsl?1sezTdgj)J&;>X{tZ$RtM_sN{YAoJPXF zS|`S<^%2vJcJ4H3tf(+M-qOu8x$$9sludqMa(`-XCAV`R(nw;OkPN$!QqrLdW>%ot*e$OKEK9Q#TkQ9x7mq(AF1 zw6l&@hTp-k{LB;#;jIAs+cb_08NqeUEyZXH^{}v83Le3;gKya8Z)-8; zaC$%Ok$fBZ035FL*lqAjsDVXjinN(94_r#Pf2YXS%ZYotN7htEln;GLy*DtiK5khh zUg{o$;3H<(6Oq#bMp99qSiWB3Z0!rL7;foGUmA*}u^2{}y%Kq5Tb#oAfiv6mRi+zP zj%k;2Sh7sY+m5{Ri{@wGW3%K;G+?0%&5 zj4=}^Uwby1z=$CR5o6loGg_9LS0W!Q-hk(eFB<_OOH z`wgmd@((8a1}^4aDFr_i*&d}_c}kz~+5dVU-lxy~4j)To4PE7hSh)qMPU~I6zE-VV z&dn2aoH4WXrU~u-i}}jZ9cW9nIz6C?-?>%`@iP>iNEAx7b1XVytr1&@jTI;z z74cE`o!5@Ws*OeVTOSDy!LIcxKx&@yjOms}nq6$4M0mcUgsQp8fu4 z0IVA<=hEvW^)T}BDtmaVJOw_qykUF=l{rmYwa!S$y^`MLyjqiZrEq`L&(`!-Whj2^ zMak?0(J{Su0Zv$DkQfjQKWp(YEXY3V_WO;|kj2YUvNs{4mLQIEcB^N<;4a~8L0S(h zY$Z4#3K&JCQ7i7M{@gp2*Uhlqxmc?uvD+Q#{MWCiDZrlc&3MJwe#DQt8@E`dnsM8K zS4qw}47mu2grURt)5ddBX*M9YNtq0~g z8hrOuv}B~w<$;<$TZx74iu}(Xu7MEBS*wE<%#pD$s_d7SdSB1mgH9ERu=I%Mz3Pe6 z{1i@w4?=n)rDi;Aa6^90gwyKI0_`P71|oQ^r&wzhxdNlg^3xb&>L0(X3(`zfp1XfX zLQ2(vW9m+A9nNvBiS5mK)(=OlO(<;7ZCyB6^dIdUs%c#}M`m@e zZFQq{V6!^dUd=%?wWBN|27UZCO#V zJnm3O6Aus8b;%Eq(z|u7BDS96x;f?TGCecPVv};1K`kfp@N7;GawHaS`5RYbdvwA+ zK$K@2Fu-u?4XPr<`Mf<`*X8a0!%#X|E~Jr6vcz1c*Sx5W;9O#C$X3KXbTIZ>@MnX~ zsdGO;exNZqcc^sSRp;1mC;$LC7#lc}9=;J3c=Nc9OOmSSvlGn%?FQaQZ@$JlxTJqF z^L4XrSMNn?feeMd8EkX!Zn)3>ObP4tf9xuj>?p9}X~8 zx+aQDyfx{2mb1v-sr$CswA$!LtbA{Hq?;_fiUae(SVvVCI>bVBo9g%sQl9cWeA!`n z%gF1xcyV)4n(z+1nur?-X7`*bbQn*KfI}oWBfh};+?f_M^Hb$v8nbb z*YNn|0Cjq#SE~cZ)61$iG^Uhl{Zloi<~3h`J^4h(S9?nT|KaQ{fU4fwe{ll^L`mu1 zba$uHq9EN3(jC%>G@DK(m6YyAQd$}$q`Mp3^j+I?Jny;l{_cP7{m(G7bqgab)>_Z= zeCn$h6eNQxg{4dF?!;z`mBH+Mq!Q>@n;y3q8jAR$nBAQUmdQ4uyvhskHl6CR4x?9n zb}GZs=&Kv?W5v}oc8s^IY&hc2m2(SwULc|e<4}AWLMHPSBmPvTknu!F#stG#qo>n6gy zG~E@d=hqPedy@w`9pSbfU+v@)Rt4Bj39(rB*q7v{g?V{D$Tfdao5Fffh_(1enjbM^ zUlkcQ0**47o@ur!k`8F?#C!4iCU`ponr*7!W5woZZlWh!BA{pZe)`;Ab9ks|dhf*! zlmJAfxyb*R$%9L;{R6I!lR|;b$FHFRB4`FSo1VPQWonlu;!%WyxD#6U7Q+9A#D&E4 zX(9VMLdVU8{Kfpu1+ps-uspmh+TZeHG%C7*c78&?tL~1!62v`w!qzFRrTtZ2rPxMX zI_E9GF_Y^1L*h2iKVE#UnUGd1_C02WJnB?*_L6PdTG^4MKO;P&cBy+`Z?Kk`l#wU8|NHg$6nmB@X<(zco!CFWGUp#F>fXai|4*9kwuqL9YIMy znq`!isiDAdJFM7mx=c7&)?N*vNuv#v_F`s&*j})n1As{VJKgO3FeYEY8Lg070i@a` zxmzINvgIfBh-2t0?x`$aSQ@4?Uv8YX=V3>-QShKv0guray$ZqEd0h;*x?kYvEr%0` zr|YN&IDXHJ6z2a46r)GmEu%TF7)V4{!fD3hPaZy+$iJxBqk|3m6shi z2eG-MEV`@2N~-DV*Mxzt87Yl9z)0_xmn}yHz(>lRFphz4imb6~-?s4km$!;90QRM0 z{n}OY6pjsLZXQ}l+3-6-pg2suAuKbl@5qjUwXte7;wH*4xU}5$aH;yDzU&XSR?3OK z&_;?I=@!mZVkV2+ENg_ii5Dqy<9Y^M!jzYQ-!P)fryIFNsvU>?DlWQb@w?xOhus$ zN+HzqS=^P`7?T@#waVhPDcf<5wvHa<6kLz{^YFFP4)j4aJd zpPWmz&gY?wJ&fz=T8c)*ce|?6P zqpz#Gy66mK#M!p9wD=x>&D{h@S+{R3obVm7f?YSyeKRhOU%zh5sdHTCPPN7UTmkSz zz8CWZC!uPM&tGLi5J&6c2ix3YpTDRt5?lGYmSp*Y*B5_cj51GNy22JbJ4otfqceFz zboa+Hriou8h?=#<)G}Vrs*5;iig7y?tM*1 zd{CCtb-@NKnO|=yA^T>(()pfWMc&GP`F4 z_p?u8fZpZ`=7W4#bgyx8OTR@O| zyJB!wHvtKiK7w3O>|Sup0wjhOnl6oMYF|$UgWhjHf7&NAhTZsdkAhP70ly0Ky^`9v zM^TTuFz>P4RhB__?Pz`JmQq)qtwRi=)~^prZcripZ;p?zjh3-n2dUm&*wDg>1pmDvH66%#QXZ*_$zF0`}Y zz6v5M;^DjOXR;ePsEN5+P0>_G_+XM1<{Vo_Ll@T_*;z!0ew&`JRv6yje2>&w<2hh? z`bKPiXrb`DaV7q)qNWos6+g=VKtUl|9_j4yO+pzq&Z@!ee?`bM0_|B|FVgWAiJTJIds>&Cf z?qnF{qRM4)W4`me_4923D1@C}*V}q}=b^g66oNb0gO2S_coxn+Qwg%oA&!$(L-3Wv`8jp101)UBBGLv z^4#?!j`#amngzN0`UH`rjkS>K@|1U_Uaai?uz&QCUk7)BsK6g_-!*FBucIS}A$_~= zv}J34BC=E34vOEou2#9Rj4G@4f;b#x-n+Owz#to6}0&+Vcb<|>0<@J5{J z1KjC=d$Urbf@+?6`{0^!^Xk&A*ocpZ<|u;dqHk{!P{%(jw`@o~LxkH%O#)VW%hnMY7%RtbZbiM8 z$^VxM1I&Xhic;^AF=DA-(GT2Ta(o}%D<0z)#Wv@URHqU>EUC$|TVXoL9Ie**bK0xv z@5XPL^e*J+`I@sinlCsNDI6-PBEhvt(bPhTuE6^@?+{}yJ_Qhza$`MkVFEX=0#%3_ zaou_PfDu40Ee6Q?zU`v>xJ@>E6eSAYrNc^9SCk-1<#)Ciagc!#FYoD+7HGj-D>-dB^$o8|` zFEz)wXVWBubt-(bx0CZg?4h73#v!8JFxGx=OJwdiTV_S*_&bN?BGEFb6n}}Ia|1Ys z_rhehojcX1x!FkKbn<~341j#ayN~Z)e&01R7m$r|UBtJ+$o{CRiYaejzq!C1W6P;c zQt3(d;($bEN%Z+lHmV3_S{CGxo|YcNO=2TJi>`@E`}>FQC?Z&M)Zes!<0S2yl)1!m zv@?Uexx~aXuU)h3BxRN&W1t@N!gS7?-HWMh8WP`BBqAdyQ?XHiDYKb%Ba3W374}+> z`nHnFq3Jt1Q<%fmgD%6ga)hXj&7dJQ#|&bD^GZYA95n8uptN$Uo;*vdRRW6Y4&3L- zJ0I@9k8tVtb8)g_Ho20fwPXro`OMf{CRBaI(yZCwP!-#UCd_+hv;8h#k8qQz<{n_M zuzxdHmw>^#HPT5yMEId;S)`8}OrK~W!tFQf|LDxg)TDud_^+Y>z(f71=Pi&=0lPKx z!k|5)ux7FX(!*9}t3WtQZ+*IrxU3|{M}>F(o*~rwm8qQ_>lMhsc;s^YrO4Z6=Z_Qt z@MaRfW{lM6D_CoVC;D}^Ao|fU?=gg5tevU8*GHI-Db`p8ng-Of`t86s9{m=q@8wt_ z((P^-Mh>ajAFuXrZ)|x1;R9U*5+@-+z<^44Eqx1V4NjCuZ3E@O@2g=|7L>sU)QIEr zZ~V}FLPmDGVs?lfoM;MtLoxf1q8I11QlB#V;4_*REnY~L*#(H=Cfs@Bu3IBr*9u9& zwtjjBNaA-*FF;6Ei9bAzAUg++%G@nPr{Gy%*D7lTD?rkc@ll;}sT9yf@k!y`ge}iU zcAYC8{=kGveCZ!#GfM5%k25qxOALTZIX#NrmIm#aB&~zbwyxbN?|V_tAD@5C3bExq z9aB2qn-!FU3p%dUm+|s2DW(xT9@v#`xGlz)c$$<>^s0TV8~DwYRHIAZCRScHG!?bh z>sz6zb9&ky&)R0SwOwAFA46|PX~QQ8;R4Eone{dgSIM2$NPPvKbOrU0V+3e|-bgk! z6p0A7mw<=Qs;)fMIE|7{kgMVS4MWQR0SeC3e#w<5XJ_v+bX69TuwB2+^MU*ikiO8{ zuavGLobTkx0#8j~P8tA?@zUb~0o>F22NY3j^Xn;nGLqYU!6}Pi&Ek`XEFxjd+#_!m zv}M{3jTBPb;r*f;cK9er_)=4w~hMIrn2ifaE7LoHvhb?eus5U zTkEptJSuwHk@RW`Tuk>pI5lN{@uX1*kDk>pXI+y1TE0yc+Q4oC9L$q zf#Ftt<+v?pwoSt{b^O31;8v*3qiS3g<k9DWUqF)jXa1bCh1JVtIKc}L^fhDP`BIvG`c65-ei_jxi^Qraq7<^(_4~3YQXVWD-WO`M_$(mwob?zj) z!og^5Y(BckIeMg#pxxSloeq^Vck(!`sCNvMBE z%C4EEb$$KMRls{sN3w+(W-2M!9hRcy7J;5F02h}`Jwqgp!#B_Ft5C1s<6S3zgj!M= zHle0M?T%W~Kp7M9k4}U22NHVpTLmamzL8L~H*xc5aHF{Bi$N^cj*8-moRT6r>+K)Q z8?`DJZoA}#802$6u=~PM$FZO5SXf^8+_>E`Z+n2Ddbv@7T@gWjims%b2U3z$@y3zm zG5w=Pa!4BKDlf#A<%bTax`gvE$&Q^sWtFo=kW>fE(L=1aa2d52@y{!*09&Hynx9>C zB^YvLCHaJ{)EqJP$p!X~zo8NW&@FaxYMvwps?Byek`NJn4@*%^qAanGw5BEGD>4?# z)-e9@uwC2$p(4h|1D0L75%7D`A`q$p8fp~g+E0}aSrwnE2FiF%-{<@&M8suicwJUW zC@~&9jvuWPQke2$tB>RbfxYl|zOQGTBP3Jpn)t`Tk>nn)X@8ogd%fVNI7-O*VEAM3 zQlD~aWF~w=Ta(ao9)ML9su*q}#~%mdF3=a_9KQ{}sBhjR8a*4{^QkyLBwWcaDDH(P z@0f`D6}dYit(z|^;4o>%;kP!CYr1)c)zD+DrXYQ`~fNwo?A(;Au+#?~V7;UV&YrX!7X38B1;>#VGd#WbfA>l1@CR=eTrj9aJNxl4Jlb)D} zL74skY3f15_R3Sm18a&f&a*FBZ2%@x^d>p9^Q2Z zH)_Yug4-6FT;r0;&En{%o-y$?-@1~|_^}LjbRywTiXQ4@E5)Sk3cxF;T(#GwNm$TT zg}+HVEHILSMC3RYl}Cm&Zf(@?g!gS=@-hwb2j9&^G*?f3i#E$*J#spzGl@KhEMgf zwwiAa;iyPrp83b!#iSt2U8eH7h(Stcs;wQN-Hp_Ur6}(p`7D<#D#~(M8<}^^b_bX6G?S57cr2a$Jz994n*qiAq(Ud+ zb9@2hQ&$_S{LU`P<-VY4JS9iv2)*zip|;w%L+I;HVVrPzLPQE9yCJ!9AG-hQLrrxO zco23VqV3xs5_leae*Lpu|8{r${nFz4tR>@cdi=X-Km3b#&DfwsQZ>t{s4NDq~>-C4`nmudO$(!U( z!9YRvzGFmyS_eTLhbs0ey$6tgoguQlS1R2w3=k?YTdgW@q^|!6=NcE`?&!R!;KuU; z*X*6MdM0{%Sg%?WU`_?-T?&oOfG^d4vaU(bQY2is-ZoaW=&Iox2@V(IlWp5Al$ zdZWX>mxynUvE1&aejUUaB(}~W{czgC)$_EU1iW=}wTIttRI>6l~vN{nneZM2$7|1roJWie=fvZ%<}`-Eo(9mw{B^bsmE?17JI z5e`QjYQn&wdT6Q03+#7o?;oIqszMP6;cXz!X>H3@SS5}yAV#{jK-nIOx>&jVu)pfE z3Ls%LxCdo8{5T69^(FB&_4yWP4_iqhY`Y|Ev`iymM2#SN;0c_TSGomWgT*vM?zuBx z$MC5N(;$Jp+RRPRPisxfLyrh}6B8zXa<#1{>ZM&qGxzV3H?+8A3(=}sy!gckIp_B!_EhNNWuh3)gvEh zb?07#`pv3-vS@cQEQRQSl%d`WcWfTO1=+VEzCwl=Hpl$yDGht|mU|@|ti5f(i-Ze% z;;+6CbmcQZtFt=GDkpL>xW+ht|1+2rQ+O3o=yX!o*$O>ezSujg4`wksvw}t%d^HlueippbjWIPWFT-7F z&ge8IQ>az9hI2Xk;f<=D0vAh>Uo{&xb)ifwM;WiVL-}1K{|+TpABXWCzU`KWOZi(H zr4&+9$&mdFrH@3NT*!nD>QgJ|`ti{I@Cf#3*B%2e=mS)S6m~{?Op~&%bC)#{`VjV) zj+o6+(pZ_EH$(9L<3i2wx#~*(;gV;JFLP{Yd4#@XTL$ra_bu&qqfiR+Ep~G)j_Kw_&9zCvc*xs>tb^Lk-LX&Do88t6} zyfZ6zz_6|D9+^AKWi*(!x;&T(9^PUVau|++r z``I@lC|kkQ%0e0BfwUj>rI8XAyhLYXYyu0l!=ppfd_O8JtZyDl#T&^2{3hffEwZS3 zirO-+v6K>P0Y=EpF$lk6E{+*n8z_SckmZ&5JYS9ExAQwt@un~NhoXeaX)A0l1ZPm- zPAHqKZpheaEoQfgQK^NVR?=y(;Z9@hV4O;oR5u!M`tZA;zq+Sa8pBmq`+ep^t&?Zj z>o*E3!55jCS1hvhT5J=oE)QS&d&AuGDEf|P|`74dRNh6J1n_kvLyZk+>VYfEKAiS*A?7GH=uYJ zRUekcqFcwx9?gS^sU~t1ZvDj5s0rTr;zrvHZu%pnQAy?)`kmV42wz&~zt7M^-$Ts9 zNNMQRZTKp7iL1ouzUK~n!tj~TLmPe`!rgnTkwwqG4Hrz8it*;wZssJnfo}Q3#HfhM z{I9PEA0v`~j7pahT9rN{b7=b3ov;W_7P6;l_H%KAru(Cg1@!4Dq+=KvmQBFmIPhwe zHs3sMod3o+_F~C1k~Y)%8%f(E5T)JVFq$u9ffF(nTy(DW$Q8?!oq~E6K7LS^OI{X0d;b*umLdNGIg)Lzr~UqbofL z%EqxhS0uKoI=K~K_|CN$U1K{c%}0-rD#eX%0OU?yA!u48={eX(lVbOrcO^Wy0(1;NR$j_~*7C8<gq`D>8a{Pn8C=PZ(xZ7p>^`%B~=-T!RazS z7dDc28*7nq55$B8pgLsHxDu0}21&yvO63xQBV0`A8wEd+=ISJg=l_A+0?amI~Ish)Hroub^sR>*#eRJ&?US$yA z6UP0y5c{_<^M82J7e@$$9L))3q!Pwqd7t_(=~F=XBk?762k|#NO%)){S!qjASP@||rc5P&XF0f0Hi0oO z?48xO)EyA7+pW&<+?c81qaOYtb{J5J{#D${Nj$9IR!>_LaP6dHRI*24BM+bLRJG!J zaI>;T>3Hl`S@a%*o-()*&v~176~?;cT0OwOZ49z2wcq&fk7$3v%PS=3*C#M2{~XKk z`|>jLy>q*~Jl5v)G8yI_xehk!cZ_w%>(hzEi=p(}^O*eZ!b80NUZBc%Coxd+UTVY@ zHo8?=<#e~HaLc`LJ6mBT=iR5d)ZK8Eps=#42Q0SP3cwa6{*kre;(lyjwdBaO`=W?a+CO~T?{>6OLRg%M?N$zbr9a+}^Nau1 zDm&mSXu|tMQw}tNEhA2{gjz`k=9!BrXno%oIW2i{qu-(w3|3Ws&Hj3^KJPnd{D*wL z(EP7L_&a?7a0?oe3qKn6ddZIKD}zL_qbG`MaClyCCou7AZsxcOqDbdN5i088yrPF& zCMy77ZQLmA4xANJp$x_9lN!oJ-y!Fn#YYY=YF}L+@4*Wdov(5vNw~|(GW0p3ml+|DXAc1+i5WS(fnU(i)D>tvYIcZQ}7VC6vi`v zk}&$b;wmwXu%^|b9p2F2yRK3$Gi| zaG0tVpK<+|3G41FGggq}kdCI4Q*nlRCeH$aX|@6mRs zdh5g6*G6nSCkyY0&vp{+_;xEtji=SzUapL5OZD<~iZ|^QbUc=)PW2HPC?j24`KuSS zM7?UN8JwR>&^0uV0Lm$ZCjpMq(_=BPU_0zZniv2)_}B1uU;^hQts0q{UYec{d4LMpI|uf`j&so{hHRVu*-*d)a<0-d%|-7Fn$Kz)DGI#VOVAjoQPSE{ zc7~6tF^$lSl0P@5^Jd|P?b2+ffpMIl8H5}L4u=Q@)ZdLw64&mD-Wg$L&7wfGs(Lo9 zGSX?L^u=;HuA;|&Lsos0d)99OgvUHui&*ym z=T4C7o*0JPzJ>X6csP>NiWM@YQAL&Zu}l; zR<*l_g7G8R6FN2=W>g0L7JYY2fn&T^0$O76oU#;+HAnQT=qN`% z21$JeX*K+rxl3zdw?d7FzAhw~g11-4KP_1B->Q@I7j-vit`7+8Yo8}z1upHP_pKQRd-skH~FPG)IC%016*-@2BuAg2f#MECQ zF0Km;IC#8Bgee_I$-LC58dxALhxs;IJEik3Lu_!jtRkzDJq4(!=&p;eL*-?3JY^kV z36!-TRt`92?7#<4&v3{n@?b3cjC?N}Dd$>f8!lBV1$J|sOKt90yqS~~b1}VhEfCQc zq^(Vom8;zHl9q2Qunh2HQ^P8$m^SpIMiQhXp1AzFj3?y&DwSJ1P4B=X~50-^u9 z#6Rg_r~@sK@3!Cl?Za}`#CoJjOLM>3t71#t$tg>db^so|m*9GGrup;ve7=5(04ms8 z`tauoX@11Eh6lU*VW_~fR6b|2+An>3SE6nMTxR;lV|Hg#rd?ZsfegrPzTH*5%Zyf&e-g8<^d2P(d+#WAAXbJpkD2C2rQ@Yti@UTxr3Z}&Aux`Q|pgIJ8MJJTfW@Ig!9xn;p-(-+vkf?j)m>F88;!Y=1kF(Tr<+F44Qi{6o{$c;tvP-BZau)L9NJq?2}O)f1#9CehJxRD-JEglG9@gKg|;K3MPr%3qL56O zEk3IyV?%+aE&ElY^hL}!+e$;`C>$e^6R$Q*7ucuNL(ZnH$&U-AQBm(w{rNEZ)aTniv^X0GkOx zTtej<4iXbpWDyUd(T)J-@T4z~ zz*8_-LFOyl-L_1LmrQ)`@cN#ZBQ=)*6#|3pOEmz}&uV^~w;NNC0;y(;D6P67T1S@A zR_!;J`=pGaI_mZkI)=<2)WC;Vu7;lo6#t%K9ap z+WiwbX>Q_=YYh}GT5szdkOCQMEUaJap|Tc z^QSj-su2ovHaS>DJH5QHt8$IGCKJNCk1O>l8P3fmo7J=YKCSTc%^=^C7dln`jZVN5`UUe@hK<$-Qj@WWw9c(1S9C0y=3bjEN~U?TUxC=R zzL2!2D7}*mTouVd3ogl-hjcJFi~vSDWDvz;GijC?e)RNbmYPlQOk3SS6m>(T!FV4oV0V80xN1XH`U&}eEb(C%JdJzM!YJ7SdZ&CNek z8nXoJYcG(SFY%iopi&N7V_dYGQcA55dQ-X}@mGNe{AiNqCG&iun$e)F!$qkj($=8P zuAoi~5v67Gw0wpMqAwJai$VM*=Tcp;4X!3DPG-Kd;0psW4fpA3oD?Veq%3NG5u6N( z9uce#oL1GdNdtL-x;ql-l3fx(Xm=$dNKac4PbVW)PzXTnuOJapZ?b92|=>A!3C9>JNSK4zfr;LL z6w7?rDE1LQh6NpTIXD#-PoT$dbx?9>G*6K3)}9>KExFx-_+B?ft}|EX`02jlaV!%z z<;hC$TEvr#LwqTIhj7{AYA0<=3%!-v>$Fvpm)dvCmKbB$>!y_x=8}#cAanYX4x-Gn zA<_3Cx(NykWBfMQ#+PNL+DlAhclVl0#VO^y5?<0irtZ?^&7QFWJV0S zh>A6)@fj&Gw7!2vu5DHar5I9yFP{qU?8m><^8Y&t_t)Qq#NGur&QKB_1UCw`*Xj`o zMAzuKw5>1x#a<7w!1vw1-dI2q^aBeg;wMoM16J`X`i0@rVBJ|=ao*tLy-r%BPSo4Z6U^!I?!QsdsP@uUo%g_wo zdKu%wl+a;zT=d~ryCmhrWFmKn%hjUT`v`X{tQsSlg>IQ7tYwZg1U+=O9uwR_HOuET z-%C5dK9>}(dbo8YqgUiBT*kzW?q*`yagXIxOp0_ZsL;xMD5Q}O=O(ugewFmSs~7ll z;{G0V|MlYT56>BCcwKwrE=15edxipf&fUb+1Gm3zg(u*Rr(6GegZJJb*~0wbp#E?^ z7_L+|Tz{Hj;87pVy}2f>KtRLrr9n=_Xv(Msw=f;_7tB9?kv4QxCfRCiLYdDNgAfJ{ zEoTt8Sh$}KCjF+~GHjmM@=i5l-EmMgDfGrR8Jd$2-TQq(D;OapJdQ@p9ek0+T{#*U zRgmh|9qF`! zp*Hta$8a+}VS%rW>nY7>XdP-qmMaueXXqDPKo`U4JT=PfV~0DeB=s%NKME>G^kRDC zCcix>tB^?RLebRoJSsfz$fdJQa@&ZBKxz2hcp~>{?n~0sM6}H!I^2FK;nJ?aZ@ftq z?&9t{_?BbuGvywT0ughdeD8~wDH5WJ*u1KY{@hkZ&uB!=j2=6kB$A{~5A_9IDAFjH zqKeOs!^%|}u4HXw_VK3w; zEd;JYqlT{`b<$qn|9K7P$XTC8^Hc;kZvV1D|22b))VO29@;gq$oEaV$(C!H0VPXat z{?l%x zYhzVycch1T1uj^QZ8UFfe-&Ml9x8B7yw_w5yiq)zLf;ZdcByTm{ zyD_hxA7V*lajCTCWqpv4*^6W%zAVe)^PT3QrsFrB zj3+rnmzW195}c&rB{yUEPA<$0-Jn^SllQ`|ZMB%~S60E!Zaj zZ$bBwfMQ!HWhP$;PFX~rsvB-%$S#S7B0)K7gYw($pPELqpXD>4GdTOZAfPT|B`k0) zAwJ7(8dISTx-X+=PdaSw>1iqGFf9#xkX%xhAD6KN_ zA*s1@WSX<-hbXhp3IPj=o^WBEm%%$Z31~FStC;#b&vG9CXGZPhP)^e%3U4pvd70rH zwcb6I-7>WER_=$`U^#^MWbr+wSNlQ(KE<+Fhguy%5QPlh1 zNAq_vUO-|Tgg1R(XW#y7^=eLQ`$t5AJlab9(RxD49bAJpFr>@u2*-15_ z-azk9=I-s~3iQ;6q7qhpCX6>bP;f5Zpd9+(*~r_wQR&J=rb}spKqxL8XIXp{&rBkO z7}C-nbn&H-`!w8(H3pImh(@k!WN^oMPRG{nPHv|Nq)-C8z3En+CE6=ot3o@z8YMF@9s3CTcz+$?kf)r=!9f zPm3l(AJipySLUHPcYY=r6mz~(lw3OhGyyxH7{?Vj4e81VOPyZP1KOw)*fUO^laq1Y zl`xj(atbv*5~zcqFn1=-U3Lq^9||aMAaNM46ipm3lpchMW`}!^NxYE=T0l${&14qQ z}EVb-d`(=%}>qDW(L_vbF6QLDT}%$-HYVL0F< z_f&cl16Y2&$~#KQqVFr|ONWNh2=7{UXydL|b}aX)E=0wypxuV~eX~Bw6igGSZVMF- z-ipK5^WKzCp5}VEyJ3clpUB-m8|wDaW${x}We?3+u+$21TkGxF9pGp`yQBPe^Z&SL zqG;%Nq1}XxkbQTdgFWW|cqv*iHuMluXvdm8mO1{u8`Zrr4))jGJ@&=t+j-E7xn8}2W+gP&R8%!B%<7*h-S~W->u=t7q%e^SQld5^vb;Q zE{a?|xu)_C3b70!RwTB(=I*=TH2#c^5&4D8u0To;r%CA&@5)>+E<~$kcCX61O7fFL zR+?yAaFJH^;W~SgufT?8$`r~C*@R834hMOYk~?!FJJo!wsMV8wjHlzqq&Ulc|CmK`Dr&jbU_mvLjez zRLp(M5-qqFg!;LJH~K_kMeW+0W>L)gBsbL`4fZk4oCc`wC-c*>9RN2EOVu_+z zcIf&duZ;ZA4%xU6x5~rU^VzTIa+j0o)9>@W7dh?0&OGu&i&%!fL(_{V`+*%wW z!O%4!0LHn0rhPide&!D>Z}Jt5+MqZYI|7*lJe3?BZ7JSFB>oGCee%f)<}}7tS4w|= z{TdlbwrA#q;DLn3m6BCyu`(&1h5&@9 zCx8qV9e9ALPQYmD-#g>)8|dFJLmco}@K@#VSn&V%eFbkZtTx$X(e)MyUM$cMtbs#c2BdQksxJ2C9kY#b|L|lu@o*0i%%fsh?-TVGqVMC$~43FrQbM(cF<( z1TlYqe`p7cep&6gn~AJac(+GjT$;eWS-1yy_W8*5znA9s<^IoTKcod$J3NGTH|W|T zI_&?u2Atr-PhiE9!_9xbJn;9ndi<|#wQDJaqv1Y-NhA>i3tc(D9d1>~dWmX!C?k7- z(PJW2Y~1l&d@f*L+Q%W<^)RozlUs!i&5En(f2S@CsJ?c_*>07Gbn!UftpqU2)`^KH<(Xf^Vb5x^%bHZg>x2b)8J9`}tZlCK zNg4zL@#}7UwaEn|Y+0;y?~6^_T)p=>pois$uNrZyn$yjC^9_bg<0W{=fX`Rvnd_m9 zgO3FvQm)BQu>IAZ}Rih*!JES&g)Kh_Bei~6Pdjpz~f?~q($t)F$AAqHZb`s==|5J?XL*N|4Ju>Ifub2PPpZO}lk%LoF$N#PM1G^eS_5fv( zKW2eGrd{42fng7fYnW|4l~#sdr^j=MJTQ0pG1Q2Om-`|+0hIUszRpZBD1o_FW9i&G zUnt^aFvq!soqLaD2ChCL3Y*DKWU`sXhGRqRhm9ycGl%qzj1N?OnI=xcW9K^`S^A=s zkftp|XqbPGR@ASh_kA1!fi>ndLg2fIu1IGBJ;$h2^(olcGr#!{EwUim9qk0X_nCP< zti)}!m@Bp~!p*=h_)~#HG0}|};dTC1p~XeWncs;(dvzM$JsmOdTS|TAHaL$P)MqP1 zqg}P4M&7sNqt|~eysg3DU#H~q=%<{Qwfft(m9@aRe}dC_?|Fs1^SS-CS`EueBD34A znh3;_7i3ET3hY)ARBJ;O)soV-M~iTSJ1=-8!2HUy#$_SM8$J1&CT{>1JUyo7Xy6%An>}g944OQMkjaIGCoF-$ zPn+n~^s1k>_Xk`P&u{$WT(*`24+vu}K97M(x7d1k!TN0&|AJWTP?lLv7zrx^LUml# zv&z_^*fGRZPZ=qJ>!ol-z4Kx9a*2{MJT>8A@~xmWaS_Tr8sgm(BP>I$=`tzt-tcR4 zPphF=qo6P8o|cT$W0Bncf@jT1<23luzg`mP5c%4G+A}wtc@Eu{M{906r^$S)FI4k$ zBivx(M69LxHj(6qu;Mxrk^9DH@UWqX?QRU=-;Y`U&!;+}0eiGV ztW^uekqesgua*BaTg&(E(mV=>S|7>$4M#AV{_Y8${HrIB5}%_=aMj_}mJt_M9$zGT z-WK1YmlaN=#S1;)z^Dyd(jK7}*zA^BQqnA25X(^WImx&5Jfy@|LnaKD7pNXF_dH3W zu}%`HM%pctTh0(Oyqz40Fhd1h_A)4mhI$)gU7@Kc_g&~;rpcIRB)K*sb)vh)hv%T3 zZ9$9PeST@Ii{VoAp(eU7f_-@?$X|E4kB2|L=tE>A6C%V>p#l4t{bmxu|FCLt(ws5A z>>2L%cn%jE=~Wa(9Dcg9!Vg%I$TjE9i*^&I;LgvCvs6* zQMPUO@GTZfgOoG~sFa9=q)LfMDI`MVE+lj7m3%bV@hUJ-{$DILy#6!+hs> zKlk(A?{9tYKQ48-mU><1b)3hs_dfRazZcqaxKz-@@Y`=E{y<7^Z*s?bq$OpgUZ}9D z<8zp<-v8W+4}cJR9uGE5WP@voDFY8#P+rQ_m>#}O4{PhHF?`rDzW z781LjF!E>_^kZKZoKUs6$bs5WMGvN`3OVmvB!z&u1E(yKujG(Z$*( z>~siNEv$+49R6s(tYM`QxLYhGDt$akV>Z!$Kv5u_V!9}}&Azi>aTrMAcw*8kICxwY z*E(IGLAv=gks)NfemD##|JU(ZTxTE?>I7;AvzMjLE^bilb@$5n^K^T!5-lB{HvMKb zsyTwTZc|`y)xVtHY^kN;nb=D~s}MCz=u`YZ*_v;o1{Quk9 zfzxuwfpAQ!r*6Y?|Cu8Qtk=Yh-M@~>>|V_rwStLPP*@0`HlL(3$E{Y?&rwF$$IELs zzURojl88E5wj>Qe_J-B4*^L&Xtw)YNk15}my(JPLUAgg{%gP8FR-Pwj_o}3<3tc4o z>$29LC1*M&Kb3oz-23BXF~4`B5cxZG5${{iKMVpY8e4AXXMm7LTJ0!KSr);sDi~`jP-W0kWE6j~E||26DQS zZ@h~sMnr}VJtG=&4R>(VpWm)VHNPf!LHHxp8`pk0t-h}sMcuio8j^zYo?2BJDtAwS z%wuAA!Z+0^22IfS7tc$W{wdmbC;Tg0vE>DT1b5;4m$ zE4#k}4o5;;Ki1(&jqoWV!F9fD2h{JGv?C~r4C=dAyt5&2CSxaZl>D3G*VoQXR6Rd- zB_0-J9~n|P6(qF&E5-9qyo4$7TQn92@uYxyjjgt#9Gh-#Rc&{+?76Rw{y9g@Bp|H9 zX*o_W-twT>vw<(wZCJ%DkQM<;n0iJXPMlq9#@)^Ym>3y!z{!ycST z{);`B@tJi10Nd<^cfpLX8#>Bei-M0NIkc2YvkGOMp;LUFN*9ceLr#T3RTicnTh?1D z04c4S(f;{QSxJ^eqB^wYuoJfZ&H;UiK{(Aq z8N`l3m3=5XpiD*#^FC6cagd0~PgnF*eht-(!#YAGU(1U^VeH$AaCx)7tS3`(7Z{E}`HJ_MN z9eo{LiZwbUIG?66PgF6sgz@N*jmgU@x9t ze*Or$PvT%cI>5wCeQJL)#-p2;Cder?ZtsJlzwGF2v;C&MusZM%bE*;EEn*}4ZAt;& z{#PY&6<}?p^c=2A{o@7T$Z+cDVcwo=Eg~0sWdt5QL}L=Uh?1ql-f?LV6$@YTsJ&xQ zm{}DPme=o)Dq(L_zl&xnQ#stuctz4MC+0ijBkqMQl3FS@o9H-qWrk(^^ijhu^Xm%{ zZ>aRI5%r#&;=c_%cMy-MVvc#`+TULS*4y>{_s95FrvLoiulb2Y#W6~?z>d^HRbr5s;T)GK;oo$JsP_gDNYzqCccxBD z!x&m~hV}pawo)@O!&~n6%>=L0BjED=%x2*9E^077km^p1r`c0GYe}L|`L4+NjFH6T zOV~$85l)OryY2>b9#n>*W=`*g+9c(Fea=jr3Q2 z-xn5~sR(SVh$1th4{~3ea>l;}TzM_AB)TS7u2I+e*Lx;!U+%jJB^Z?l`uX8+LhHjj zW1~k|_cU>`2v79b2EB6!Yl3ps*mx1dN#>gir_jq^<%cKsg>Z)=pO@nwq%j@yh{gm* z{`QnE!*|~vh5^svI(ypA?VZ;4m4G|mZnI~5B^I-pF=eWpUMRy??+(qyOCv5OcGX45 z+;N;B=3ge}r$FKN11G^r=B(K3AY&5a7Xuxr0TYr3E{9#DsIZGP)-1qU!oilSu-J@U zc}ILmX+PoB%w_~x&p&pl} z%!Q{&W9fK2>i8kLFZYz5O}{;)Xkt!^dCl4ZQeEEsOOF2SixDu zl+Mz`VcK;O*|h6LdJgm>RvK48i+^$M(L*wBjP}CPI$Otc`2p2Id+pSURmX3(!6qbQ z6<;r%qw&T)A-sp=zu$6u>wn&I8n~F8!Jr*4Rz0M|)V{OWnxRN?Hc`G#~I$RoLfW)gTb(wRXnoiQ^Mi&nF)nKYvDrYDIxPbe;rh(~9; zq=e?WX8f;gH`_-NzU{x?cj-$?hPy8xqw#^>o^wR6hc%Q)5f0_`B;I4kgas38P^B@x^(FSCN%4vd`zhGS<$S$|JD9;M zx;9BXufnE0Td*v|ZC?|*Z`Kh+$>nSI7_y^vekgrW$EM`_BCoEk<@&Pdm@*p4*&=_M zS2q4TI{GaCD{EW)s#!smW^UfM>(kdM4a4f?$$DXtZGnFnyOeA?RJ&vMq|A>O%W^ zLU!J=GBq*u)@ebZ^%t+5Y1@PMUc@w%1XB+WM@fpU^p8}P)Gie)8(U}5p&QOSL_F7X zFpT>IC?SVd`K6?oLvHQ0&l2v3su{|i`*eo*#zpZCt`fX}7^=e7?~e7;dVKecJ6KC7 zXvF@8T3|nWnj=P?%QkM?htCB17BybiWuZr-9r!sN-FFs#I*)4kebe6mkW7eg%45H=7)rz2VN)P*Ht(2~sdzJ-3)6UZ zvRMXfo;ris0vHHJ0ZU-9AEJ;oy>f+yrwufWv;@(kFd>U{(qqOx+cWu;(p78~Bo zF-3agYhZp21H;K(f`24IMQslB+&}u z2RJk9f5(GHR49Ff;OAg&=?LHm*9Zn-&dC{I>_!D5W*nIVjux|+`TpF{E*Gj}#Bm>G zeNL6&F0bpw{`1M3UeNvPLXYE_;kl?SuIvA~>-BjkckJuk<#<5p>ga@baNL1)oqF`7 z-*0Luyw@uKA*Jg7cSVxJgu*eTNzsJ9MVL#6>XVy~^U%f;XQYOwN zo>QPmst_v-&S*TM#2)EyzHQxlxY|rC`tz>XFuxOuqZ>nic+W=BkH3IoBCa?e z<8rva{Y;hcMLl%xjcwAu5p&p20SWPiG;+XCkwxElKJ<^x6w&HfKIL~nw-cY+{Z%v= zrEWjLzu&N#Ws5+I<7s{EUEH=R7ZX$ufTJoSvEtE@p3B3VnEsk1M zrnt2wplidpZRi=MGQyj=U;jF3{B$30uvH4Dw^=UpLTp1jn@q44TTN3}LUZeUX3<+H z^YK*1vM0T|Lq2f_=ja}9KA&!<7sLBJd?H9nb~LQdDTK_LNpIxuakM$x9Z6{GMPbF& z=W%-LHO18LVbv0{$tNad8M=H`Q92$CnILwzwcBE;WY9$Gqs0}2`^yi0q)YC`Ca1<1 zS62E!DMUTx-O9;}$DCXq?3jn)?4PQ%S!LRDTFRF$*Rb1qZZIi3 z9BxZ?x3tL}O$!L`?MqRwCss|}Ouy{=;X}lpp>NI}sroIdCZUrFtx!_gjGgBvE^U>o z%1x|N&t0Z03GHWYNHYd=20=T~Mx2}l%tpyQ#mi3S>$ZLJgRc57z=TX_TRUX6Ph5+wYV&fcwO-vtxFSA0M{~ z@rE6;7pv!6E(Vw{awE9Nf8TgV#v=7dI+M&L@i|{!-~un~p_;;enTkya8_DA;gbhLu zYUxrz?>DOaLvLHP0=;CR2DLm&SYFj(J!O|2}d$bPiLfte`0e)L@N zdZI30Y9z<8Qjh)K(79jk5^vdITcbM6vh8N_mrdQ?CXG@b(@EVA>z`;V%Z}b4l92o~ z5gX~X)uy5c9aAYbhlH6axv|>hrLWY}i4|q>MZLfc<*DF3toNScsmRsK+limif?jDe zXg6y0a(j8k?-Hrpr26H|{_G#X4@jyQs%hkmUq^TEp`Eb$=jn-*QRimak)F> zYf$aH%#eCzNBrE;jEG*Qe`Saa4afCQuAO4Gnc_@v2ODI289r1>J5pnHAPNk)Oy`ID z8|U;kb!K1p*)A5Lg*qC9aJRAtl0Q3e!*55yfBTZmrSpB$xtLz7!I?SuPZ84dyZV}Z0iu={<}Ax?lXKUedVuuk_}8myBp zfn|bQMN9?!VO_nEO#};@dfas}(Hts(-hTSWEm_3&!h4D+;Qe#Q zzo(<#3m``b;B%>p1&MT#8h~~BFFB$M1H0fm3itR)Wd()ih5NX73wvBn2@b z3A~B@Vz~{-XPx;onuC^|_bPvlf0adNl;U6~t1rL0%>Jksh{ag~F2vf{ZAVf3@6`F} z*gxahgEvgxBY0v(FrIDdefXb-orufyF6t_F$KUPm3Zb7*c_*|gAet~fEFyDHxSDhB zRoYEq5Cd^BJeQls5fV0$6ho

HOJ9=A~?Ub7qTmEApjZ1s@WS1npL+aYc_HX)otVk}4ZN;wj-_Ix{ zAL;uTD-~?UcX%FoTRREr#l!JiB60Hn%iN+v>;9ef_*0(**~n_heR-d^+?IFSZv5~X z40(F*`~h8S&A|O7I-I8zf9SrHZ#;}YOz-|)AGZLw3c{U6il{gb#hNAvCOCg0M5X*I zE3!k-dEk7MA)KV$YZ2?qXz$5Wb%D`*M(XE|SRe4=En~$Sn9^x^Wvp6_*dOxStAqG8 zCbuXki49JZ(nDr$Z6Hd2sR=?DkB*pdl@mE`@-7D>JtPfzw`G`OEXR_HCcMY!U)OpC zknl3^uy5$0@z|C9_v{*~3^IDF${m-zf@-%bM*a>GzcXEkImK9D@TW*J3v1jxZ|sA> z`bDV1rNA0lf;A)c)6GCwC{<=cPI4w#;N?li4wrjX!@!g;*?cV(n0M-H89KW?yqTOB zonHCD_JXX+-r6&QT~uIu&=d=tmYaa5korpJ5KP0fXSJIykgnm>eq<%Fd^s`VdztOb zIcpjICAQ_r3NUVmtaSCTx|-OzVX%?pvAIVC$D-r3J(sGa%KBJc;|>~PKEP{U%7-B* zHR5b+uEEW~hdf)wih$#?0Xvcn*k-Hx>_6or6@p0zZm7e+ zzWs;%gsZ2R^A)5^iA^U*ndD|!6=B?@b7U)MS z55zT68e4MkUMR26)DJGG%wF@p=IdokA38H36>-OkYNdntRfAtk?o8crILI}Wz!z1f z#Lp;-!38+`{grH&6Z79>JIT%ahr>bQ6WC9->SPgcl^?md}XO6+@h;Zm6b&Ubg zdfNBZck`A*1=n&%Y^W2Le_@+s_68E3dgYX}s;95H%>Ch*2J~yt%GWY^;EtgIDofZ5UKMn3(+O>*4 zAg&8d0)*v#l|j1Gy)uFx*`3|U2;%IXT!LP&(%DKSK$0^LB6f}%N~$xo+j}5blBI#T zl%LuezQJA_L4yhWjR%eFgRaFgh7WN zJ$wL0zo#U|iXdbsN<*|EFQ#?z@yejRK#f{jJbdF9E`13!;g*Y1QOjKyKu(Zr)WWoE zaKu|zI5fK=bj(~uO zQl$hEGAam2m)=!uNE48nK%_{K5)tVnv_O;=NPr|HA>Sv?^{)55@7&*7zyBhz;>st_ zbIv~d>~ppgsY=ZwsCML@j-QT&mg{24D;}A?cRuP!W2?Le6!hB$H&sVcweEtiimHVE z%CTN&uG8|NoZG9(Z?s=w9;}je^O%?go=uhE!%VOf_?SMBDyK|VC-;LhZ=GhNQ>#Pc zc|(2&uww9gTp%{zqU_v6THMDk3e6r4tPz65p^{Q1X1@ccKhEfLL*R(}n_^E6&yY59 zG(!HE;Y|=_>vBRjeh^G(^t!?N3&6vOTSMJjgU9`HvoK&8X0&JsC45m+=p1vMR2OTaymWPT4r*9;u8h+v!8B zY+0a44P>rn%U(#V-QzBK!Wn@JJ0tb5dqUu`x1mYq^N^PN3Q7mJjBNKpu zcQ%}={~=toU%3Nhz4Je0VKRPQDum*YmP1w9z|r@LLk|@y&fO^Gju41EJ2Br?U`ytA zAJ~7!djeC?cwp{28Y`$V@mFWD%E#C!G)*0?y0PG6bNnUu~q4ZSCjjW8mriNb)}JsdQfD z7 z3&gz!;XD|zOpEa23Zde|7WD$)-bYy^wyEN^{qC=P5(}g)q|kjmn(W7cf!k^brzfzX zub52R?uYx1e+J9nv8iIENGH=P^Nw57UB|6N#2cHS#`YBfQLF^5H%D&$jo4a0JH%1Eq z8CJ6nWM+)pniqH7i$L3|JHtZ}G=d{C^BxX|b*bZoPGdYqV*3+Z5e^#ap92q4c7Mjy ze+g7WLsn!$o_| z@uKJ84>n+UK3n(kVWYPoz&3A5nzJ~*xro5g;K11`egv=V4;&KXV>Xv4o1UxTFywQt zRyc#ix*P*%O9xFn;EUr~U@mD*gDPsCSmuYRi@WB) z?MIQRp({F#fnS}_;=Y=cxrDs3@SgPAUob%H%3n=jU3ReT1`L&mPF|w0+qKuWp#1WfXBnah%Zt4+mgc z7Z(V0B$~{{4G+6{>uHNCnl5Yr0=d5P(NcdXI|;W-JpQ!{0FU*U*A1$pZIYC9e+-Ha z*Wh91-)bV`r{xycRf2KAJ?c9(`mfR1+E>GlyO@|6L+ z_%bY<>4d;M_3^dEhjOZG%%7fp1w_~sxrW~YmFxe3$ELKcd3eMc}%W%?|WTP z8RUBY_!6r`tc~32=2YMdykh+=_e*#ZUumbUYd)}GWv}2hreg}`quU4j$((86q&!WS zRwdPh>Y%C{BJWJgwXge71Az6bXBWl+*o@$ZXU|(h#a2Ezn8wRV(4E&efi>B!#)AWy zt`2MOZunQW)J4{y?!gBa$qkXo;6s`mQ{ChM4?<6A+5!SNInU28!}oc(ydqOI#e^$P zjIz$(k{*Oeu7(_WN~(#(a?;5Tq)s?G(_+VhkFZPIT3-sMPA)1wT6{D<}G+la>J}zsiv}?8}5x96VLLrh|V0WX;rH$Ki`yF z5kQ;mPFfU|a`0~a&CcPZP1Jt(4~5O+^6fki&CQHutGXWllD<3$J0tJ#q8puu@oJ2^ zId#&&o|+9}U!B811Ab@p7s3p;hr;fu34P{b+cM(W#WK?k>ZL@f)@ymzzf!GYV1FDOgjYPpOmvpo93Z*V@{IW8k`R|pyN!f2U8 zWM)^o6+n9=1|joZHqB8p4Tbultz*XjRx^i#`bWJ%W%KhOuHovX+5d(wg?0=GZF69r z;p&nlJ#HHge-1X>LcGAi$QTgwjlKRT^xo@b8SH%&uHM*a5|+=eE4(S^ToX+dS5Lu} z?GK$MR{Tz130BMfv*s!8`tK1Ua7E|+C5ocTvz4v~t{g^Qo}KWX+ShD28PK$boh$le zIQdr-I478ZUwuShzEi`u=V0y`mO+qz*xTQBn2nwBO7HJ>>E*aCK5(JuNLNF};RZ(x?BSL| z2bkKVx8M=Mg{zzS1xuseZcf9NalO;1c4VyMf+D8`JiKo#6xw1 zv9D3~gzKYglM*KL`cph4lDo=!#;0@Jw%Q>;Cmk5D(ON;Re8<$O$mXxMz8>Qxy{{q& z=-OLDf3j;SD6i7$T#&f4Jt;;IACWyupYTV>Q>qTtvhj_(ov?WxgL`~R!XvS!s5uK( z;4@F(MO@ktUkhDHm)SvZ3nSZBFVq!luJhnSjpugC+%n3dI*1--*WfqjI^siU80)5G zq|4Ok2IUH-frqM5rOH`G|iKlFlS+ zvO(UioSC(3AMc{&?A#ivbrFlR3{h!Cn>d|Aw<19OJtc9*!=tdyqTdt6w!uht_IvE5kPe6J<=QdW`)}2$Rblq_ z=KE)Xkp&C}3vfOPTbs4Qm|EQ*9~OrS!G$bW6TUvW1j$*Gpl!wU77<_Ejl|B=F@7c# zZ3ChjC#Z@!n`%sQnHK7s!xUQZmldCFcyNE3-Jz7HUE+{Ne0|@bUSCl2CEh(MPbk1n zz}?-vN1N8AqR@1aisxbCxGu7_QN`MPGixRxb#AafFk}?KJo4Dk@Y8GcsALtS(#{<$VCG3!mJ;abBgg0fN`JOXi^21qOjMLLwZGqc z{;`$-LiokWuo_;u;Ws<7^_Hm-a~1J5Dfioz6Q9%CF$JFfug4W!?+L@vtHbXd^$o{7 z$O>>@}ctf_-oGnclQTsd%eJR*`M@I4dsXrtyseU5+ zTSJYqi}K>TG%F{zook=`jx2ZSOf7-x?mvlO`CxXQs>zFYuf|f9^>)ni?Ko6dJ$~$7 z&Zmups>ZE4uRVi##m;b2u9%I!94uriLkBpWX9OO_AILt`lNP=_Di?kTRL zMNw#f$idtu2ds>i`gS~2;mFQWo3|F9O>ou0KjVbF?QSGXCCqZpJ$1+5@$Dw1Z${UG z<5kYx+c@6GR&V}eGGf<|mbyqa+RJ2C&vjPwTr!#EZvHsQrmfn!#FBvuuje?ub8^j`+0s8b>v%)PKG!QyW*tuYD~{1%9c4wlR{Knba1P zC6Hx7&`1@3xaJ*`qZ;>{ltG@9Q{2`h7613zJD@xND%3uSlu2!X^oqm&f=G;u>5Yqp zr#%+?t+O+1%6Kg0d{1;FRgU_C>Ps!3Vog;IUiNy&Xfl&630~RT3aT0{6%gle@bP8&4LK^SEAMo$o8eM<(QrPk0%TB7$ zjQy8KX=fkXz{<_#UAm4;k*EsHfF>7uh2dh6syJw=XuDj@Nnw9kXiZGRi z-0?{kuNK=b@FQ8Wx$*fYzn%+OTdS*lmpUXLbKnFo97oyE(lZtIUC`u|ZDhNEmB?3x z9c$~SSD2?6plUCbPtZS{!+tIpiM{CydTmANEgtC5FMmNbo+)37=ec@g>Qe&)J>(M8 zDs5O}X7lG^!DfSe4?~WH1{6%kE&&do1vizaQgaqg)GcNX(09(KhCx;aai&a}@yxT9 zq7^eDh~Z;y8K$!3As%r2Eh?YOm^^2=^R*nC7PvG(0_NSpY4|{&WBLGdqFYB$t^eZ3 z4t?QOl?e#>|12YS{ClEhemjrwYxA=<#gN8p=f^+CotW{x8ilnzxSKB2BfA?aJf%F= z^61j!@u^OmFnlBcnfB9<&4Utbot{iJ$C8{Zjw3JbpHg-XO7T9fNImt~Ygfi#=byE= zuU$C|w>2@s9$}j}d231NkA*9J76%JjJl|gbs+=mGZILXc@w#OuYf3dR#cDoX+xO2_ zk~pkdQq@$d@kWeUNLF-&v%Kf!JQIN}Dv(P>*Jy{GPu$#cyr#7bE`_26X=tC7Ig%Rj zd3!7QIcwYU@(SV{(rnqx{ctJj^--rc$7HE`dc~BI zE3#!rg+^;6;x&z4+FTH4wXgos4Z^~F= z&(Di6ANXk+%4MAQS^-YSJrt;d9MskaNrC!u#~3drAe!_8r9q!+IN6n1 zccQS15Va4Q#ir7pgjbt@H6fTXhjrM?&8#70+|NXCYo&PC4&;U|XiR;#s7=fr8ffPz zPe_fmcV~iIV1=!=jqm~jVb6@hxLX&)c zRaln~@izSoD!q`{`R`-@pBJL&8jn{gG<8K$3OBnK!_1ZW!fo1Jo=2oKsfTqPdoHH@ zLh8ImG{d?kcKM)sYOo~bG1Uxq`jhWI*qD(QDZFdm<*oN|B}8fh!iS(_;mDBVm` zIP9KQrc(24Sx>@QqM7en)N^kmv!Hk0W>Jn3k`dFF_6T?#a3QLQ%3jF@_P4@=?slrG znApwx`|j>u*%FswsFQH0wxn{4n=<0<+UnM1ZJBK<(7&8zL?HWIdQ>2Z;*eavCCj`Z z){6=Kk?=304My18?^_Yf<+Ae6EA`=Gv$b#oP-EFIcUROEEVKf8rHz%M^LBs8%^!`g zB9cX#sf}koBtu4oUm2#!R5#$@<*Z8HFtf*6M^P-QIINxZ0D^ob-}Q}tgMO@8M_56@ z=}2{=r%4YW9pF%>15|)a>f+7#M85H)pPD-gI_ij#M)3Kx-%nT_n3~ZmACg3P`6gu@ z|MPX$qg6%wEOoEkB%HZiX?2S^S0D83vPb%MjwK^f3T* z=VI${K({$+(>~ahb91{oPM@@LiP!hwV$mE~{sF%%O)>|AV__P`{^9V04B%$U=4d27b^Jeo z=hyzdj|cTY3rB7BWXV~Z0yOZzZ- zTId(-Pmt^`))QL=0?oIF@0Gk^2P?ixr<~Z5mF-M}?2?%Ig!)zUt(Ac2q^% zoRM#hq)rqZbi1;7)TgGPOB0`tI8KY4msWMlr4?EEH61>nPMI7#sVOC+5|MuBsnQn4 z5$3GXfa20YYLu2?HsA9cWRUhvC+kRT!hJItEF32AIa+_usZ!Vh6^UuA_o)uWb-l3} zm*f_K2Vzi+&w%IenCJU3UOzS~QX#uOi+4tlKYrCW_BvU}I5i9UKViqd1YV3Qf6VLL z?$wD=t4T=#ltcf_8lm4k#Ac%4P3}lrjzbY@Y+7dU`D$O@=6#^c8AsfaHu6p&TkAoi z6^45~I#W*=U%)69Zt?^e59h@|ZxrzO^*5yt%N{*9;XIxoho&awt$JL)L|Qw1Y3|BY zzj}r@_S#d<*;YO4yK%aqlL92p+H4W-lrTaz%g>en&Xcfy4t*Sr1lIDQX1mK0&MbBp zJ>6P;frMgqIuMHq2PNogr3jO>K@mheXrL>%?yWEurt>K2z~0W589?uUe=%s(Iz4;u z{FHpy59Y0QKc+M-F&_ES%Pl4=S&S9KJh#=TL(Bo`bED110<>1L*8S6_{|@P$CZw^` z-Nk*;2ih~Sqd+Azl&vU)kiENEPGXI7L+J#bvL}%BoX+d^zo`dVBEq4_XfCwJFSif2 zQqeg!(84>{Y0%F@ncjXU7*#I`Zn~^tyBKJgRnanC)E^vbg8Q2s(a}3>pirXQ!92Hl z{ZU}{GR92Toiv^cIkz! zQ=Q>aq>;wcx7E}t?MpSOPZ5(gQ~Ap$6{${>KA#CK5%`O?aZ1j~Do-Fc_Cw>2{N9mP zvzxNt^C*pKl93euL@_kQoVqHZ8X?{$H#?P7Iuy;kr!2E$)bne%MBnZm&VrX@;7{<{ zhk}hx)NXs?kL|lFRfrFk5l6s}pLl5}^E(9UFyAT5%1V2C&0gUmRwz)BO4S3<{pp6& zl>Xd#*_92sX)k5MA0G6h(MvXU+#;R#3yrZd=J4H7X%LBE19wA`-RD?~8_y^?QZ6Yx z*-FY*d-BW;JyQ4=t8s@MIHM7=l*j-k9fj~Ew$mc%Ua42e=xA$oU4QYJhx51gwma|? zXRHSHyI{Xm{j=7)t^CUjh^d#qdEI}qy|=v{UGM2&eqE0=oRO5}C< z);BWn$k!B%INuBDkViq)mWk~wpbPOSGj4q=}Zj(>6C-L8CG|RRmF+6Hqo~GB~!o(1=7BaZ6*nQ)oa}Q0s~ARHWwen$8;$+9X*| z_d-$g6Y0mv6f>h<(AF-`aE{lhnr|CdeUcZ&Yi>Ulbzz>{u`c)kDzRZFy`ft5R$uYx z-<4%aGFV&%yG1nm@9}oyEQq&jE7=31%Jbv(aj{RjA)_?TVsk$`=8O$d$uSAP6xiSW<*F3Cez_ zZK{#Ge6I2Y^v~QQq9sSP&5E+k+q_L@@|sN5BE)U4QO#yoqvTtJihZcdy&bi?i}yMv z@k`#%-&o9!=zS`GTjr_eG^1y_dSW`ii}n8f5y-Wf2LLIE+(a-KmiB@Y#JH%7v*9&` zdf(T=Jx;XPS&^Rx$x>cmhlXNbWf`ldEU6Z-?|z zm&6*Tyz5a}w{RXid1XgezGaf6m2x7zOBJ6@oA0n`!iNA!NSu+yxW_b~_QY0aPchpf zo_>t-XZ9h(29hG|N9c(&>Q?5G1eY|s*1U~xZ|c-cgPQhjFq}Mfv+sV`Up@ya&Oq$6 zw9=@pC%YNC`F@F=vpB#yr3-|2N2+j2wlt?()*N7 zU8uk>^}QB`vO28X+Wk!Asc;~an_FMwrS_y^F`ZehzbKXU>mwe$9$5;J+O%o~&BCUUeWbO=sDzCs2BaGxEF~#lOT)THmHJ9?|7oNAo#W zUp|CaX7&-upn#|!4k)YE`HBCzg15Q$bZwgo(5?=S*3G*%W2n1fM&GUtfY<2{M>@Nk zk*3=8TKpm{0?DIC*0N&u{Y%kwbK8RqNd$Ujd+xrz|1X%V!h^}q5Yq1QoQ=TJea4gf z!75C*NSQN*d}-$=<(tg@oILv3am*5~ec|{R$V|Hn#Hh++ZR-y$l+U{CK|hVYDly$$ z7WTd{rCk8B4}Q4CE-3Q|oNcl{SIPOfGb87n?N$D|gg}XAiBD<9AZW6`UL+n>Nzp_y zUNdfF^q;beDO3B<(th3=7u((C*{rLx$L3?8Uok%W?3OKXIsUjD)ilHdQH|Ck&foaX z7NLx^uOPo!Wwr68FRO9GPu4`*IAQsp`X$u19D=DV@L=V!(x%$@iYfj~s9$kCj< zjuW&C8CjR;M+v2%Be~u6fH~#dD@*ug^&>iW2O?UcWvqg2JxTQskx3qK0fUCovDwooh?g$1(}wu9jd6f(oboE+8UP9e z6rIpEwo#LCHdUnbqTKgOQCRj9e-HgIVkYvtK6H*|Gc{=bzP4N#0lH(^ab0zUfYI2- z(i93fq|&*^I8w(`_tc2UmExY}2D+9}fzYBsYrNMGT0f*{muo--Waurk`I>9{9v&Lm ztp57P)by>!pEL&xXaZ`RCwPL1Tl0#spfNdK(o@~AR;*a;krZ)QLfL>cBO1_P!xLdt z*;szz@hBt3846Wi#&R&pSxj67a=jvNkq%2tV^rffi=YbKelCL@k7iG!Mx1mp$J5v0 zrOE9AjWQ24Siu0s5GfvTvK2n~dYbVjEV`X#%3U?J!?S>Xz^}?5^xgwjULg-J0eQH; zhqV*uZwRZ&*YgXUp5ouKp) z82{R7u`=oYxihRSN~F1IrlpA-Mmd^sgQ|=)O+nP;d+VD8<$GW0aOslT9g$MDW4y4d zwZkQD{3Lz+ZNw)$#(>#jvi-yLe^e_eYbsKn!enuGUmxqSM2I`z*X zZd*f3R9fG{9>cb@*g0YUU|2?C-@=kX-FD`Ht0qhl_V$*&y|u$lP{!S|_g@E91pfU3RQ;RJ_4-+Glw!b&B4Z8eUcp?#9h+UrvL!7ft1xh$8Dy0 znw4o@o=?+i6gHIVO?0nuDOdbvtL&5UfG6m;L#=ybMhPW_P4Gjx!un}?C-Xm=x4#38 zukv`Z4h2EW1qvYQYcpTyN~B>|huzUcx-=!oFutv_6t%blR3_b;YolA$Rfs&r5RDg^ z*ZYhcXFnT&B4(W3J-%=<1Ze)or~A(!MQaxOvhqi3KW#)SZZ834=9-+q*<=EOoYNLv zTc1&{KSi!b0Yq6blz$%qivAEF%)IOWv&t*ME1W|gT=6L%N+4%mAidfw!7QC2hEVF; z#^ma36Yq1sM8NOYDz@q;?GclsZqjtQe)P+NaK=RO=KF1Y+a&p4v2&Jz=qRX1B0_;` z@7tj`%~K2c&3WDP1`K8(`xuUTY&wrkQbOGUlLde~*y;SuFxBzH^US9&-5+bOFvC#BHu&*bbtgJ*7SVTax+@-8r-PxhV*8 zVmo=1n$6%*GfNWQ(Y`DzDJl;+oF;FP_(jOw=B-krOPVNn{&(zPeF0#HO7{H$3UO}y zivm@~epC3>^4@;^&k;#MUy7Qn{-hs;_DsDt*N7R4t@xcROq91Zs!2=;n7r7OaVw@N zC%L`wo@UzeNi!p?2x8Lh#j-{jxGSDcW>d@Oq?>;`k9IjN7?_OEc+T)PFYD53O+$ay zzEo7XY#rr3S^U{f5$v*qwWL=FZe}L9ORfmr{nE_8)43n9Rh78y!im}L=YlsS``ltf zSqaE=ZQE~r#gN1_v2d}6X&>OKM5oxr&HQ#AVTDL6!?sIaQcv~F1YO{M z6gbvR5zbtz5O1s11oK(XtHI4*o89j5T0tRx-9KAF+{mgQJH_-#;X*WCs}*S7lmZnp zHi&cWYGY^5Krf2v?QJ>YEBhO2B^t<^uJD_(&rpH=kh<-&Z0_iNeww4Do^hmD?)L--DT)A{@&!wL_q{3#1 zF0u=Q-R~ZSRc}~{Z5yl6%JVK%Y0+-*V%WQX3QUEbv^08rW)O5xP!7uv#qL{LoQ``V6dXiR!Q1?`p@ymYafo{-C)=E?ZHxadI)(Ix2J4CNMDXlAv~6ldFW^(U9tdGC*Z6L%H=|Dg4k zE5C&Ny}m8C8k z)!WAW?j@qEC}qq@vF5K|Rw?sUne_PFAJ*Ib*nD%c;hwjNu1WnEH^ zat3jA^mf*XM6sqtfDZ`sW`@#gM9>@zeB^{O^f!=P1cF%g*{Z?tFo!%(cr_A4DAR?| zYw8Al)!3O6&PMOPDe+N9Btd8|83W@!8~&h_#Elfob9tcG)0#8@A1q59UAIo$-6vm?@OGS!#f-)=qSwW9 zxUbdg3-AyAq)&Jj{)9|ClEjL@R{4=lY5RzZj)43quN?)4^wy|1I@Lx zhusG<+66k+L5GLT;BnC0+6hkG#6yAE2{p~-){ZPNN-)inLS|$ywF>do`lOP#Gpkd; zbyLhR2}v6X=Bdu>=yN=5BDvK5yiLmQvU(dvpu^Mr(4yWLNmannx1c)D+*FS8NM`k! zN_Ci?)Mjwvfx|PZdCab$aTI-VefwhdEzVII!PQ)_!+7(#S?(0Hxy&J9111RPST+S zrzQsryX9Hof=A*^SdGzMsCk=d3~{Z*uIIH$R%?Q)lFJb}7@i5_jE;f&r$XvxPIzhN zQV4%(ht3te39zK)(0O9do+XKB1+~-dnbkppc$y4;l&2P7$lMq$m#%PMQ(}&n*8*x|5C8J^xGBo3FJRp9wypnlwFGFt@^-O~ zAeHA)H`XW)ZD3j@#ets;Mopx69jL>1CQmFm><$!$D$DOK1@uj@JWSh2BVkz{aNWne z%Ig!wLKVj@8DWHiXY2qmpM4n+^A$$}_X(u!Q&eu-M|^Y39vSqUdVcaTP(NflO(r*; z2={n$O``dt%VlNfN@-PC+clf#%8$>-R0p`aN^*ZZ)=rN&9499uDqu-EBqb#qcgppO zgE!dgD|)Yup)H=wceln=i>qQ=rPq!HFyVy59Gwnhll z7G|vtV_BcatMB{$X#L7@<7{{3Z10?+J(%2nf2gP_0e9{w^p9i+!DpT$pulp-;*nUV z^E$1EuNjkyDbM5hD-vdAu{c7}OKe>x{%#GP1w)_kgpaB-VB>){_A zCMA8|`(RX2IqE5Nk0yE5pw+!H=G-ava!YBw8^`>;6$Kpe?u1h|V7kle%q&V+X#vc5 zR9|xC(+YEAeR~71l=s)a!_66I=BQ|#J4t?Q&L7brznY0n2`szy5frM!^WkFl8nZWs z{Vo`V@+x$#uR038M(-rmJr`z!ZXEXda*N{x`m^J@Laab=wNzem0Ob$Nk+O$FYbHVthNf2g}gQ%O0rOb2fmg(Hhar8u+^#)BK$0{tnv&TwbH9dbes_zfnKw|J3Im7uP3a)*L{ z9|F(s?BBoo`=yM{wp|G5X#6Y+RmL1|vrk_^;~AS0clP#5o)suH)=Bq9S2P|5@1 zAtp*2S9We(b@hMV@-2Q!|Hfx~yMhr5deC#j@XUf4~Qj;;kzx>@SQh%$pqVD5fl}vBGs$V5%!EOy`}q zTf$4=5cB0 zO|h`M^EyH=si!~j#<1u)+&Bs&Zc%p^1#La18ZUPpwOeY(@|5c<>~kINm6ovT>{wOZ`Y$ZGN(qE<_FHI&8dh7-Ylx${c4`Oy9in*nm z{kV|^r8nr-plMAyO5BIU74O|CXV&0Xesh*`szHgeE_%zU;nPqB|BX^-h&<_4iC4%> z-T}5>bHk=|#7z$2u9qyVp23Qv43Bd#=)iqnLX_ML=D6RXoP53~UYfYwh+*{1F^A!n zk54*_n+fPCrO+wq@L>qcElmcp0jHcGy~3+kP*@F=(M^d54361e+0wg2_u0Me{5=T! zO>KD0O6ok17Q`_M(QBo|8+rKc&zEtmK<<*`=P?H6Qj!igM(5ir<0n6F1Vr&cr#f{r z9x_uw|MDNV6F z`tA4&$Cfv*dzt&D_1iImeM+-tN!wK$Ju^jf}n^QT8ttNGr;b;fF$-&K44%H3Q` zUndPeSnpF)&Aj@@%iCuMC4@`i11(Z>SBEP$+fPk9Q?xrxMxVs_O9SIxzr%cf=vquG zUQ#SQ*S3}W;J%%OB(6dQru+Ov4|b$}c+2C8q6ZV~wZi(!)l!avNFMNl29|&Y z=g~2h{>#02R#2a%wwSVkx8#%Y;+loytRgjGMdw`S*QIygHm0rC3QJ>8ZHu&W6&{NJ z=z-(vRy#qtN{m-yEEFXxof!1 z!Dj3M@E5bq5cWri)P|qFz$QZY4RrS2o3UzY|1$3f`3!3DI5E*Ig~S zaZs2vsk_<64Vs|j316^h;lO2stHW2(@z+HvtMrpiBi8apZ7-0>&V-}4^I-WuLv`VV}ZRE%^Z)A{fgdlGVONeh6_+7{OIQNiL zBf$|{=^a0_-e!niDqDA3v~n8wqm4FqY}h%wj9ypGbvNnpLoYev`^aT{ZrvF(18q8* zBkpKUyf*75LV{0y47H3$Ma&F{t>K`Fi-<)pk zl9+oZ=p0)d;xSQ;3$&t~JwY)Ub8|f%A2RIlV5ugKV+l6?)1RF=(v>G!%q6?^$h|-I zAPkF{DzeBj*^9e~(_vSj*YSc}29!G;Xbcnm*Hir{u?u^K z`}K?C<}i|en)@5(_w|L(gn5<1g)cHK*h5r;*fA&)~goLj#c1dFYuliq?2ZWwRD=7=9|-Bzsp z>JNMs2Ti61ZdM7>olIi;$;1%TAXQ)S+-7(5{B+2z3Z^{NR`6=GanRAGqLuCXLZtHb z?Q%UI@ymPQ9zW!JYS$i7i~JW{ltV*$2QwKb@sn=ef;M>Y8%=naTABtk{l!>iE~ldr ze_3W$(_=I`ogC@d<$ zr)EyH;Mkowc8S+6MMk{SvnoRl?sc^&XOI>i+^0aXu{8Ew^!b&x!m@W2f04&aQ9YWY3sEqQ+?q!l*-z z0!o@Rl&4XXP~F2`uRaYQtQgx!>J&@Fi092zy_SJ) zyMWg9rY_86N+Ao!)A22+x6LtSuXXXCMmC9ge(PxJoxhDG*?|$dDqQ9ao=^u=Qy)Wj zh)|c>$}b5AiStn1V{=WY>o$s*ECt5~cx3q%;GdTP;RD_Lgky;DwZw5JpzKG@Fm@9R znXcOa`Bd@q`GWx*G-EiAGrS$W#GCqJFY`wHB5+J~?(Ad|;A|fZ0S$(ibm+8t=(IP5 zSPv$}Be=`UfCQ%5^h8WOT9W-&Y>7Y0OQ|v-sBzwiL;K?2dYu1{fb;YFVeu=F>LG?% zIs7pR^a_i)ehF-%7>YFL`po1{T%>)knySil%NMmd{kHbA>Ft*rV6x}Y1p|p1Dm~8M zZki|~THR_hI2~nT9y?L1iEYc;9(SCy#XP9B5oEVo=Fq+y=+C)zv$e0QF2u;R4CKO< z5Ob$z^fpKG4i26^IR5ReqqK6w55M?$K2rJo3@T`9qr*lwxvw75)wN|~WSsbh+*O8` z(h40aDv-Bzw0Pvlu*3VRQXJ9LWtFUXdnjMW;6j^yFU(D|ZQ(u6U+I3(ot<7J&fwj0 z{)LO+z~%l?c;JE874S;k?a$VTtdFeo?JW8xaa@c26~_6x(!8OCCR3!~TqYixyV!l( z@G$h-C%%jA^KPr-o1syIJ>c@W0^x zp=}h|t;BY%Qj*TtB6kT10ZtNz|MbWscu{B4Duubc<3c-Y>K59u)kgJ;?mMsSnZtKn zTEEDhxsIBi8x7`0=L^#GU6ED;7ci_MECA{0VLt5KtqS`E`$4L>qO zzZ>6XwJ?ODQ%3LpmE z?qpAFWrMXplp73{cP)91ZlE|@=An`J-r~ATzX~a#8l*hs6E=|^aQ0_V|36Qh$Omp_ z0|fq(K6${fot06$J`a%N3)R)wnkUvP1>v`1mCc|P8%A!(OlG!QY-?iO_k#t_#a5pF z?JAyVCy+=b-0qaW=8lZkBf3^!m1LSYlQO+vu6I~_vKz-#Rgt289nVu;A?w5x)d3ZX zHEra(^>4F6X-#iGxs>&(rPW}Ex$;p`>mDY9 zU4^~C1(PbZwgNVfGK$Z~WcSBR+6*of-;1#l^+2-+Pk~U3ybZlF;bG_dT~Wa)*M`|FeA1fc*-B_}pr<{(pj9 zXaD^yHDym8)FZaDMqhyJKv(3iQ;rM_To3YI*FxH$pyOIKaj`8hHc(K?{xHk9A@O}DdqV6#Qr)C6zm zN}PCe-s`H9*4!iNp(c^so9QZksGCrum3I*1&EUrsEsXM$A)afyo|2tn&6;x=b~ahs z15Z#^rM5$*f%-)rTq_yMt-WCLQd|!)+IHs!hk60VFr%ZR)BYFU z`iELa3q_><3{yo8Su3q65NV||`aA2+e~4gwk=r+-d;`>MIe<2jo1wbwp+pq&Qtce>g+6%{8UL)bBG6`j*zapqC@C10_h_gxR!+TgtqHzt-6z1B_-k3;0h*vXds1@W)4<>M z!{;*9JNGJtbR(Z-v`Mg3lcqVA7^OT%2-!zk_at%*ShjWa8t!G;KpK_tH@Q}x7sfU{ z2z_pqc#9;oTNoB*Cqr@Du`Unpjc)3-zst`5_|#+tZ{`JJG(w)T=vP$`@J|OS^5Yd= zp5IY^iY_cJOA(k3LhaPE_m6yHo}uy~;z>}yTIM5%dU=E(-rSdqJip75LE0)Q7CU6YH_anrnNns-uSGqJA~9#iP4=G z5!1PE8XBxT)fOogQ-j}b`R4i!9A5HMQN==4?#BA%HgX0wE9!I2kPsRbzD4zHka$eJ z*n0Euwi_w~Em4W{d~r1?YLFP=?ZD=eoDEG6bqz18&<>qk9?es8z1LV?t)yp*yGjaq zoYAoQUY9Jsw5VE=pXZm|Sad$ubuVrQe7h!TpPTC;QvIkTB0{f9i&wD77vKD+bD$x> z3oJdb-CnvOsT&7k|0xU$52c;eBcc%3@9jtt6N|8^_Cy6+A`!e~ul*vzATaWoSiLOE z|CyOW$;~uz#BC*&4^N6#oJskyq&*dtuC)?Am9gJiisBunkGrBPGZ_o`E-Q*&3^E2d zjTf8Pq7*qR`8aJ9JkKzP92}>*u!zq@t`kQ$r$=JMUD>|$NZk|E$hIY8veQs-q6HL% z+%f>q7K-`tCKu7t)!cUQV^O$fXFfyjxZ{goy8uLW-MZ}Pq_Q{h{>+b7&K^1_(zFu3 zl2feue9?aPq%$0NU6Qc_O=MyvqHEpF#AHKPXS$ZD&!Bc$?Fdi=ck4#>f#`pF7;f?) zCy`UI5f}jf@5UUH`o9J6*&XW&;2lge`yYO+51|X1YOl1oxiP~f_z}J0r@lx#@jLY@ zITd=RYCIa+*y*sI?GXNf@x}9$-{YDPwYa4y#~u&Ufw^P#(AvU@>x&AttIgPb9`j%0 zZCR}2E!}SG_9gv@xx8d&K@ZlxHjV0E3&{*mKcP6V}mg{ zloVW2&>Woe8`wyej`z&YklJ}QqkE-D#cz;Nmz&=Pf#}j#I@^dUovbBe)J|-Aw=)RY z5N?JQT3Z%oSzf;jT(7L#YyS{`BR?YeZ5tBlP9Q_GwD-O{_)kyc-zD?Vfd{-Ua$d$v z8aSQjougcPRXX#Rgc^^Beuzr9zIZ>1p)!zOq50%mambm%z?V2z6W6KLwgpqjYT|&L ztFj7p0iCI@{Mw=W)xo~b?=E{;LDiLSHZHSDRMoVjx#!leZ1T;(zbM7Laf`AP-BujI94*hm1VDF``r1mUDrQ7s+O+&Z8h}&vG?9l zO=f%Bu!;&QQbeT)greezQj91qi2{NQDk>_34$(x3^kxV}L@5$LWTb{fz!8y7q*tX& zNJJnMkxnQ9LJbhwduPt^jPo6y=bUG)=UeOh-gW*OhQuuHoxOkMx~|{8NIio+5sHmb z;CC0zhsr>QF(Oc$=EMOjVr0IjTue!Cl=&(UttSl$>tU{eD%58Xm7$dzt(9l|c+Ts= zWODxd1P&ysCMGv?0dO9AlI6A4S?mk}j#=V`J9Oxdd5urP^|O7b*B5V9hwus7Czo8M zjS0*iNf>dyiX%-3$Eh`4D167`8Lemk#$C1P4`0g?z131Ve&Xm1sqV{_uK}uTgEih& zu+R{0u@n5R3BLLbWnRzDXt#F>>>gG&iV*RX)Ad7o+18jx0llZl`7?Wg3P)hVgc_P_ z>85Dm3>*_FEM2bdU#kEA<8$Ocn+55OB zw|%M?B^RM)yZS^(D&uJlF+F+(`7N>_OTOztLH%bko()`jHmLbaJ#a6Sz@+ke#>JU^+-zKdSYYk zHLMGLT$E~MZeDgp>##qBbGD+8`CFc?6`mR0Ud%D(fP>>O1T=hd%PvfU^9h2;-@|v( z@4e;$TzzI~ybFQ6XP@)BCoY>)U7Fxa8Omp0RQSZqkBP=9qf;V|@{@$oE?o$ATKcut zMX^!d>Wwkkw1^wk8*MX^6X2;)$af7aH%kP#V}{zzULK3++n{&G#CellhjVC#laWAm zqoO$e>|K4p@^#v1^04hNpp;mtiQDyjb787z`JMC$3?8fU=A1q0K+H-4Nn1o@Cz_s)5Adul~E9QIv^S|auj?wA?WJc>plvK9^RW2KVz z_>~Li8}npkek^099;d4@bLqv$BUF73P3`T9Q>ByRV^wHfSa1~c3LlrC0=RBn3CWfv zk2DR4A_FnB*3Gt>X)@?j4Dx3Ha*LJuqabdo9P>*B=(;fHXIpg&RRm7yr%y8dqh(TM z^buy;#LB$=vkt7dB_PCPAjo!098mF-jLAoqrmSSr(Mt~1zFxC1H?(zIbpuQq4QxCE

|c#STqXLKtEe%+PRQnC+|t>_B+a=waVW(JHkksRK0f^2WC8J`diy!D{6MFj zj_-(Z98R=4*z3!>B60G_)`{xxcw_X=tfysGvFkvEBW*i&wB<~)@vVg5z{vcP`s`-0 zu;ln_w)96H<_Qjw;tQb__c}Bw*8}45HcU9mr5%}9Q0Yi_r^0dK=-kl^_i}Du<^{hY z@~}~>>vF?KP1ksByhz>&egm7e(8T(K%04~HSnaSS#UQvkSIR4{*@;n z78H)zQ2<@P!!tSM-{(C)`HUFPi}PCeB+&E{bsD)FX}^j!wr%^G{aAR@i%>!<-1G|f z9*kX21N_wi&Zy}K26o={u>Zd}NI%7xBSU+)j4?l=l++(coe)sajKeF=4cVK6zlgnW z#E;OmWz!sPM9QnhnqIw>H`y%b0QnHQ+=Z|^DL6c6q^&=>P=;N2k&)OqataG{1bAnA zXRpYi`Poyf1^X((F*=5ZpDj~aFuV_DBKFTU+I*?k7_482GR#IFdFEi(HnY7#xLQuYcA=^sv%ZWQC=5h(fjeEfdrQ!Mu3=_Yn{RqOt-OG}N*;EN zW|PIxLwLk8&1!wPTNtF)HqSScr{Iher|rd9)x}-1Hso{-Z{V3*?iwg(*ObSepX-HM zMQt5`c_wuMT+ZQy{09NxeZC$AKu!WcVcvHAlWmuxf)7VR&_feKf}i38BJy>!Fc~2& z2no`6m)O~;2ujO_-Kj280jzkkTzGV$dG3+%+So4;!*IG+BD}S4)eE(HlZsk^(wzki z0atkr;QQ~95gR99k+v!{T>Mh5?Hz~Mm z@&&7R&>PZIMd4n*+KO~vp6^L9s`;XIGV54S{AA0y14F04NQmv;CxumOKzGw_D~5=G z_Z2OTW|ZiAFSr_JjZQ{veBBsE3>VWiJ!@t%sd^SJAwns1ufxRAkd;YNSuy5g!mYWl zZT-?kWjSS6{`$H6;)}x46;io+~8eZ zhZs%T^VxI2jx!qtk235r1r8k)y^<7bVBt+062Lx$XcM%|U8btb=4L00m`zC_-8IGL zA}j#p$2=O+{YzcLFXO+_wR&;w7WVB=N31@qYHidU_)1@Xvc!rP|qoAKfog4Q8Bi!Re3C93)%BtXj>az37Gz!O@ za=Ae{kZFpXM@#rtNhdk4EDo3q%@6oIUX+F-hOKE%tSp+k&!aVO{ik~SsYU1LUHRuc z0e4CfELp6VAB0|?RM9EH7e=cDyVk`5_C=?s9sF1Xl^{`Az+x+yK-|1IG!jSRnfw)q z8(FII0MF#T4S2luZNBdyH~;Jmst|g>8>)Sd{s=+7MO^o`BtLk{QaRXg>M|^+S+5=_ zJbHxxfI)*}O)sMsLt4b`WhWWe__0B*fbg+iDng{rYwDw9 z3M;-TUei6UEr0XWd09Oe-zqjxRhQpAq0P;(=VO;UDFwx>VyZg)sl)xE!K5T0=S)Ic8-uUVe zN@*!$+|hy}1a{ybTn?76J4XMGD$WdP`betD(1+3hnWoypJTLI&6SmtO1ByNVgTPXN z-bIjtenQkAT>*BNPZ2+T4p0UFs33{o^L55gXYr>Wmwp4fw55Za+yyIRA_wOxl=(xZ z1-54edI(y`a3Qj#gD*v0t}xY|Z!>?HUKd3gP76A#i?3LYGfv7}&tPai(EFaY^qMcw z@@xF$A~>7<>--E>kxeq@m{blTrY7ezM&-(CeRQ$?_3sS#BM~%EN6L{)EG3X#=Cg(Ox_ls2rfDMxRCy#RFHC8(NrZgQ=);u3|GpNwg`JCFaZsK13-9%A9SsG6;&so4PQp_R?pjg@s#VjE zza+)FLk#g3_apFfl-Il2S7YGMcOk45Y3{5OO=ZqU7FZ42s8{qD<&5mTsyGZi8DMp ze8^z_M=QWtn@G;u45oI2e_k7hKh{RhQrm&$lqua4{#Vv z8-RG4#2mQ|*$U>-u@>e4>>o`cg?7je`#76tQ%)PGXt{spc9Doua$Ko7ATjNm;Y4yE|09G(X*Yv<>trKgRW(qtA60!?2(cE}1$p z6N(lo+81k@P_BmFbOv2ypz3;Dqc=KDxk2l3nOE_v%7_e=2{p2;E@fhgg1)-*Q|xH$ zxcm`2O_iZy?9z1krz7WoCh32Qr9Xb8=sgA?c6kiHCsvlZB4w<$)zVCIbb;YY^6p2K z#6Afl=W9hBfkHW$7U^H~Lexh_#w0)VzmZA#JBDGSV^x}G%h2PMU zWR!UR@57ITSBI(>Nc4>L7PIaEc-V1gw31m6Hur7age$XLu1r*ompTCWQqDs1y4E83 z6}aCG94k9$LtFNj=5c|qZWl!LqaN)h<}V12_OLHvXzHvp!j-p~cmurml^fHhfGa~k>Nx*AK7Z;G*|kQAp1;vb^793_yT53fwt{a!9GKWImvQai zLj1BgEU#*XI#=e=w*u`DF&&*EG4>@}@^CU-hZvG{@0P1RS<{EiyZ9SPb3%F+D_MzM zO^sBX-#f;vx zYzxiizsO&k?)?QX-A5YU8>r$)zn!Debh_@LB%19M=-;fe&^QZvF#Ut}^Mf~ou%Cv>iVv}!u0QS0JXqh={!?MX_0!+go=T6X3hwn1@ zOV%*X_l|)7{^J1syiiWpI2}2Jd;~*;pc3r1ge!O^IU=oVQu3}Ke?g!l7tf{ut?HO8 z&_UTJvo9??&x#8Xl?%+e0aDl9{YeKo=dujg&PSC6`Mp+A({XKUQZ}u8?o9{s4Dp?whK}PtOd13qrzW==Q=jpiV9km-|FsX zIH_GBV!bt`Vk{Jy)j}PHz3e3Xw2w7%_m_?h78HUC_n~*rRwJ)U4D3x1!&fuCq7yLu zt5HD_UFJ({)yow~80)#OT9XA^lrA^Vi>7MCzC8OE`nYm5u-#7ox3oJXmJ=We-A z&i#qpm_=+2Yw=8S8Z6&a=?nXTbhJ*Mv?Th!5Kc^TthwFx-0<{Kv|9)}wp~wssFggb zi9Q?NcB$jC1iINJT|3-)Rfq&bQ&o+kRMtCsr<)OP72Vq(iph3(W0j4*q5660gt!4x ztN~yCS!~Wy7Ctu|(-GgH%b~!F4(gs(2u;i?o{ZNEf9!q2J7ZUaC@*mlZw!NyMZneb z=pK=ko>$$z+v;Y3uobBXVbN+wzaxt?n?E}GP^{_dM~vG_+3R^uhhYKTZGRfMz(KvG&0ZvU|UJ2h}fzB8ma|G0g^xhKIlDPhGjupBDX&JV$kQ+1l zE`nOZ`sjGtb~ppc+gE~gv`3KhOjd^~qg!U)(zREec33f9YAZ?$&iBL{hPyYkknb7t zA$ENfwM)+-j6_#oxngq)_3l|(;PLPqM)MWDdNzvA2-=*(B*si}G2a<{nXIy~_mW#d4l+O1 zvSE*Zi@=<2ZwInWjmt;cOZNkg%={iYL z<*Who9%xRtjjgs@C6`C#EG$LnBCpOxpyX; zyhc9xmLIXTSf$QAl0%E6M0mQfEQil1vGd+4)Wxs0PZ~}(iY@^0?+?yN^WQ0I|G_!^ zD?Iq9l2)%UY8?<7WqFUOwuk~eN;0G-=x|Hn_@Gf$D7Euc1WGjmzRzCPT?AiPAl9ft zELukay&9aFxx*4TLXs*n zRU;V7{sTjjEN8=Ts9k5D7mo*K_bQ;f9AsHB2+(vNLj0NrP==1rJ%Y*pAd7y&U;b=v zROL7-2}>a9I1))$^S2^Z0Qr>+K>EwQcvT!x1?)hPdX75pz4oo&KI4)gw`$U}TEy2T zBpO{GMaMsP@BuT6!k?JVDNnp7y4mxue$%^pY_y?;Dk)181EB7d)P*c|UH(W3%EQOB z720-OFNNhrYzJCg%9lPdmPp58L`8I_aPb{~wY&QjYrRX}7F-D46C30uaNp(eRlG_a z@3x&evHc33ePj9{R|u6L?Tt)2gTRw2MyG0fiySG71|Q)#)%;k|9-=umd)65Ql=?C2 zjqc@yR5{1tTBy3LG&3+6gcSnn{qrpoTb6M10zcuul2y02)Q)IyJ^}pYvpt7V$)?b! zrv5E+FFX@rpqH@jQ&%Zos0 z>X9YQ#YG_QKJX(Rs(gDqY93EI=S&QZ8(0UrLi{}MbRmm4wTK(U#>OmdkKO*M+Iq4) z2Shns^gQ?YHJmxjsU|Z6V~rEpmZ1k7U8`CE%i|J9X7>g4ZDc5;_eGaO1P9sAWct8> zEHY>vmSG&KjO+rK%E^jQ-_DX*rt*P#566fa@hVMGsl%HDo( zLVi2~v_3LEzoI#z+2M+}arC1Nla_h`OaWP=G!#>+xAq`XPt(InUAUSSif4}vapkZE zo?2glEs|xCl2F<<0#lw;x^`=v8MqVt${ z_aLJ{p}3UQj3|Ji?Y?dT%yu)tQvR>X_73ly{$A?&XfQ+$s?nrKzR(a__riZ#KwBUb zDrokMR3lnLJHMPax_0tSZIDM)9JuCty0e=hud5|C?~c{@dV|HTLOZ#}-$C?5lfSw8 zp`;z4q$QV3iqYm9aaWUXMAf?De8S?CUPbXRERQ408nm2oqkq!W+~AJe;NEU3{iPn5 zCuwuNDnVnMy5QPS@9hEbc}kBzKMY5O#g*1|EQ&*XA1xP0SV39gaDaQ70Qc7dbumuN zcbQ6N5ADHxd^vR$C^dR@(uKFmG!*TA0Gbm9>2{t*0qYeD6iWow8vWNDxy2fDLo5!@)wC_r*Kt@;YN+%xIzQo_jLQD1L; z0)ToAijA)4G*r*n4Bv=ZX5%u-HHzC73B%n)aVE-dZqgAC&cG;4rioG`;x}HcXcwum z1^xd;(gq-2U)UoKxh?Frr405bT_Z;jtQx)v<=UStcFisLzEHb;o^DWZACQ&Mw)oqX z4P-c=0KHU1(zKJ!tcLe;Jm1;?&o>BWSu=>J5{P^$S<_-QhyqfI2r8qVaM6O&-3J{~ zr=c<(fbqQJ5piBMMHHxVRb3Q$1E^{OuGf26;?^hT=Z0Tu<1jv#JLqQ+ z(~6!kuj+u@%Q}Z^_3Ac7_4v-S_Kv#-3N* z=ivvK+?~Lj0f0)OGPEr7z8p)oxg}dnVYgg)-*Oh3)vTJW`*N|QKBB<+(6(%?-aYm! zZ3WY&+JHbK_rC8TNLIH9mHdEj5QpGSdFEdPX zWya;Py5`Opo723CCl8M5t3hMco>)hWqfYPaXtNs1n4+E%aqTn;fWMgT(14@9POn~9 zt%j3Tip9{_>-@?}R=TU1^F@WF-}*#UCYe_hJi4R6hSWzJgM)+j4*V~pFN$2iXayU9 z>0Y0|`})S+cZ?cNTT3ZHg(dkfOqJsGs0}#y5uc-&*m9GoCdpPq3-|b}4po#0OAn;) z15{?IflJqk4`9sk-Y$)t`i2xfER69n-J%XauEr3ic_8rQf>v=C|L1PmB3^Y zVI%dp2Wms0;_Sau1Y2%g+WfbX-CFo23zu!V^5tRjZ5_vVzES1Az!>jdi#X*W0z$X% z-E^cXS0!|COk8l(t`5MDv6--83jhyKOcZ8jMxY?+F^QS(`x>C(7zYGEAHJLsS>vB@G}d z=^4&*JL}0a*A`NVx~HF(k?EOBi*YlJICHyBqBxq(JDJ%CC;EfY3Tix<=EM=ee`Urw zaMcEs=zLz9S(gm@QL$}V^MM6981Gv042y&U=8Cu8F+bEIN1cuhuYa2Ci}&Xf)Rqg0 z7A#Nh22^?(?GRsk+Wmv=ZU?~iq@ixN(Baos3#Uuz&VgcW!@O9kdQ|$ksQh&wa5k1= zJ8TjPL1i)^Ggxl+5!7*FJfT{Tj~>@5K3JoK9O|i7XU8hfX_C~k<^y)0&(9BxIk;E& zs6)6?tn%9M3ucV2NX?oPStw_5yim*9k$;VzfKps*yKCK+A{=NEt%+6!E1|#jl^#fm z_T5#s+%eylU$NfdIxGZ;POq+FB|%!20K``OSF(1igY*-^+a+SGx)q-JV~}f?KL8s` z0M17thSa%yQOBWpf7d3`9rA#H!aif_@ep(3_5c-87UjVdM5cZbn z?Pc-pgqu-HAb)@DyT#i0HIDcn#BqaMXusiN6L_(;&0p;@dZ zpnKSCxy6drudV7VV9`l!D4NNUQSs`+jS0DqisgnRg6HEH_YlNz&YgzUGn7+1e&{^5 z+%@xm?3zEo-j(=UTf*Nu*5^53jy62$Srq^ZlSn{L%BEaEyt{TYNg-b6L+~X0h%qr( zfF|ypq2khvxQdfx#7;$5bTNR%N3%BcV;Dt2d>LXLC<~WGXGvMQ8fw*5 zZ>~d<5G1&fidxGDm{xf(O0e@4kZ~=X?`%1{iw^_t)=0Ga3YrFl!6fA@r>**h&c91% z4LG`BprG_bdf(g4)>;hN`=H*v&FDb&7v1<#$wZmJ!#ABztF_&YD2Nn6#VIocjReYe z(SeR8`*16uO<>oR!%*#42UCbx7YNF4A%-OflBKGQ7Rv@Y`amaM8sJ4#I!Mc!hGZ0R zq`7%t@0*t~Z+G*59C~toH`Q(tHTj8O?tu# zZ>w8-4A0KrNrjVFJNxD*$7_9?2PA1Mhv5vU-8U3~4clR&y#bW-MU1aubCCvs;{9tm zuL5dq%E&qD=`j2hrAoYFrOB@)N};^x7kQT$^5p+ zlET!b!Wb&jkLcg!MP`|;njt<#IGim?TT!CTy`0?jgvx!r;a4k{VBqmS<|0jiM<3~OIi40E~%5NyD;Cp=unV0&~@T!+}&5TWNf(ROgH3=~H z9u}$gJWX23=Y#dX_)@gScFLGtnSoZZUt}n|D4|uc#^^+-rfR=P$u)%Rr?}|)7WAA)=G#C>I z@#)N7axw(8L|&jZpx7IS19^vKdzGNf_|_-JP7A=CU&H6~gV!_Bk|ajHFat2??l|Xf zURou-;9tyxCL5F>@5G)INjfkjj;+mDR+{J+62mf<`zPVwi00_#xp(5J+{&v)O_1Dt z*24%)o7^=YCb(%R2;t|Qk@ny;CC&VNAU_F)WkdyF6usuw>bhhP*Ae1pXE}kUJkoQh zB|?IOOaNl=zm{-+OVhw*0)KW-kuJY)iC*|}fC*swJBFhs|J$gK$3OHj`gf-!r)0Ec z`$W)ZBkT?fGLunvv+0p>;y7hvcNPU3PIsqfv}LfJwT5T^5FNDpA3R zh3kd-SC?ue@D?2;2+Om1(lukLHbQV7bFMyRa8isia-VE0=@s zJbMP%EAV(kCpadCWUe1a%6R`jCl9Wdzx+v6^wW<&aIlNk8~6O4 zl{u0Rf0y22zJE%lL}z!MC4fX6kMz#R(bI~L8i&cD8jbiL;8cBP!P#17tMCrY*YFY} z=0yqK@;54743y>KEBe5az#D2f_1^JblQ zIL&JN6q`2iz0sLG*GW_TR+Udr|dLiR|9a@zoG1WS_V7E z-~cn}yKh30W#DVeU(P1O?^4AqWahp2Ky`4HNPKMu12f2LCo-hzyj$f9D(^TY2ZnZm zoNqc!CG;MG0fRnd(_vCU_+n#Hpw|^rnGWW}tKP)3^p zqCCpXDRyQhh29k-Ca|1nQFuaf4nRf-O- z;s|A?1M{@@`HzH^IfftcksgG92+9z>FD5!BVj*PA2&NyXu7^Ji8%NQC5p7l~3H;qy zZuj44bxg>+TGRDk)P}QHyByTWgnSU&fW}LuxPV#99r&h(dk|aT27RI@;#^QZ7KH%X zqm%|odM(YAQERgAu{r3lDi30%-&j!I7tQ{d+W~7@-4>Tl#Hg$e0s2spvOS)+y<7QV z-~jK3i==u(3oH@%LxOVeY{NyM@;9SMZ(&O_IB+q|x=t}Q6}1jP4OVe~QB7?bXaPcU z?d68kzdL5&>p=r#(KOzt+4uLWe0VP6OD-4F&3}=qY^S6e6QDEizMB?%Me?Z zO;{qk{D?1&9*M?v<@@xsh7$0`e(x*3Zjkw?7=9MLc`mlzbe4~dH{PXqo#d0AhcS$#zk$~@Nu2>9CCP5j*ItU$p0lG`~wYefzzEdx*7s^@XC z{F9V+OnLubkkVQ}7*Y_CchRy2lmOw3c2Pfd0OHjymjSacdEY+>2dBW-NTOqcae&g2 zJa_-OXN!gl0WPShV(|@YUXOi&_M^5E!3(GYKy|3`-L=;{Kf1RXl}EiDl6f3G*p?Eg zwqU^!kn^y^*Lo|U;q~kHXez$l{bG6%dPTha{n|w=7YaR-|JUiX*&Oc+H6~n5@cXo{ zj)rK`dDIkaTK4`rITlO#3NmB#r@%=0A+9haE?*ZCgsEwOulHgyLoSHSi-UdcX@{jE zH9Y~Tukrs=>ibV?Q}sU_VbaxJ{`3&Y$YG*m`&!h`2ne4^G1S?a?jd+uhD)1xpE7aY zfgI<(+ZjoQK-p&X8_Q!<$V{d)^#JLu8o}7AQE~`Z-ci18h;|{Yy7Jozz+(aikQf&gd9>CT_bG@AJQzt}9=z-EDpr@O#73I;FD|NcTBSx2UYdl*YwNT2U- zH~MHYEZPt+Qwn|)XWIIC$NJLn`7kd7tWtW*QHT9VhLa+#&BSNAeCg?V*`NV6JgX2| zp?59;HurI4n@ZW!7#Xq{Oljvu1vE@*kavxj+E0px4&u#VC#a_Nmh{0wVV}$p{&{iV z-J>~+c;J;GZ4=j!sEA)aTQIta;%nq#8v?1IJQx!$QddUv^I}mWUM$^v0{_Qc?0*qu zIk!D1dVC)bD;o_kAK7Z{a%2H^TjNtkTjbyL^7Y23*RN_0CYR_11oIecS6;@&nV$_E z11o>P*(rp?rAEXh5nQ76AV+N#fOvWHh^((yHIib`E;E_F2&m9f5+ArOeghzHSFwJS zuFb}D6(|{+u?PV(487L@@k>vp*;7Ch{&z*f!7XV5eGXpthk|$Xq0!V<3nbv5$ieIO z+`Ts~3y`za@S*<;FT&a4!T+ZkI}UF>4|GG#7dGEjI7cVEdnKwJI%cvMmhNbP2L;(+ITA!wfu$@Of8PpGAbnEMQ$(F6#$x#r&k-DgQC7T&!~4ok_Z-Wcko zfQf|GdbPz=nv@4(UfRL@{@x6!qN8-KT-G3z*GV8hk6WrhOL{se93*Qvkg+&p7FG0m za_V7(it&xp%JbK-82-WG6{N+){S2SOY;;CuDLu;IH1SzJb^0N`OTDe%zP#;L!|Ghd zUuFlkf}{QixNgNoARQ6ozW@LAGMOSE6aCX=GV{HB4L|Mz*rHtf&&4u78pQuxECXER z_hT`B5NW`)+kY;W`RA%%YR7*rmigyF$p2g{W4+}8`oHI5ng3iS^PkIP{&Shk|CcY5 znW5~g0IoP*nqf1tLA~Dd&7Rjz9{9O~@|5Nvc+~*2*yY)Ha?9pQW~K8edMCUis!76v0<3t$|BosD^y19?@S^UkX0>hr7A|At<#RuRAK-ggh? zt&7wt9?&}w^zN{FZiZl2qdej5!dI$f;6!!AQJ5BAyIc@O+V}0mINlUZ6E%^oi40OH znM0&NJ=%?N6K8}X?t_%a@`jF(UffMi)}FX9JS0={+nnolTS41HhT^l!al1~ike=ob zhXt;ahg&3Faunuk^1?rc3&>vYk}rMuIqh5%o-2X!tES?U$>9@Bn&x?|JFNXq=G#OS zsLM?&)v+tXZ#UwVcR#u6SE4bu`#|&^L8ZvT+p494+$YOeG* zQw84?rt+E;9(;FyPy;Ex8+G-ZzGsiK9`xXR0EpZXUHiAi_PSK1(`y;&g8$3HIq~p% z3}+_GGTR2U9-jYm<^Qt0j|F3Ocw!qgLL}=>y8L#3cl;eQ`}|_(#3P7P;5Uri?sy|$`Q_!%#MrmiLP>`$#PtSivTylx1xr^>#1!8qx>hIrc0zYa ziu;KL{@TP)hgxlE+sZ)$UM>xAGD#@l9n}3U;*JG!CEmSS#pA|cE>pZDAYk7%3A{lv zxJk}}8!eipSh;)yqqTgHR}Qm2Wr8E8>)SVk0Os- zf|YqM7m;~JwPVxxm1APGv9Y4hji6l}d-}-B0t87CurHqjn*`D|nL`t8a~M~W=;iVGF^feyF`^xGTOo|w zbqgIdUx-!A$QiHYB)U&c@USWUtM(^DsLSP?Tm{6hFy|fNaY^7CM6Uxb7l-fNF~?Yb z-;m9yo3w;*~C_A?&P^PF~zCsI!Q`Uh6DoGZ@6ch_eHl0Va#@a zFeu4AfO$1I8{y~8-dL(6(#)f>afcL-&t)y6`h|dakmDi?EW_vZHE%BaKx+&W;nnl)@1&}LhL30gtIDu41ml6SXLg~gYu46BDJmVTP z##LGC<_Kw*S&I4l8}jQp?=V?OGk#KKs*)pb>HPj#BA)lDcbk?}(}7fTGOteYZ7Wo* zo(A(qbD*Wm-I^8lP4H7Ns$O z8xVdW)M`z}0&v0`2h3*-y6p?Uf1NI65&#o}%CkP~1)B(t&D~qT$>U7<#O>@~jfRW| zUNX%3*mu}~*=QVK(pa(p_>)4L=UaY5_b|@MMbYqXFrpjj($q)yCsXk-MW`iE|jD+vSkuoK@WfY^5)AOwrlEA4-s9e+feNM5qo1pH))2UcW!J2e3#R|JJwR zQ5WJ09hTyNuUco#b zABnLd07hXkxN*Q{djXg5(uuN9p-5_d5(P8B6Xzko*L7{J5LLcNGwRF%uTo)~Yq;@j zz@K;_SWi<1wp6c4S6(40#g%;K$L`ViY5(WEl)j+Xd%rPZcMlMOurAQ7p90HI@0+>6 ziT~UaQOv&b70-coW2^Q4cTPSytZkL+Q}l^z$ah`4^=_73iZleM>!^ywikaL{Za4XFP%Gipmx@X z%E`{*>MZf@rudKX;4kjRi-!RB&L+tuZHmFwksCh9!7c+|$wI zso=*kbAx)p7lk7|p}N2s5dzN0Hysi->t(}g;Q2D?M8Hq-J6HAIv?U)V)=C|)rJsle z3`6Q40Kq$}L;hFgNY6{s%#x@*+k-zSdbNa}v3cd1nNKr~6TvVt3+V_gU+>M;KBDEy zXJfjR=QqvOeU>v%78bMpAQ!#vDjw~Ct&bb3JzQVxpblFLVwjbi8+eX2tML=_&vgNmMXT{nL`3r<$BA!Pq1OLqp&);!<*cfVc2x9oq@* zo$K?&P5hoT@6olHAQ-vk`sF&ncCR%r+pH%Qx|mkO|0}QDC;{u>)zxGfEhR4dA_!Q5 z-UZ;2ciC)dn|X6x8Jp261-~)uYAhmLzd!gPC-)V6b7<1BC&=sE3oeos#H_%~Kx_Tn zLKxK}JJRAbO)CKlZ~fFn4^vZAqI+KD8Um<08ku{Z&iJsp)vEU{A`T6B+$fDTK0 ztWFgg3R}3{@YO}(opohE#emB>D<`Pk8K@&}vnPxz<2?Y6$vmA*S8CKX^z!Te?B!l4F;_6Vl-(;iJ0!1}uXT)!V z2uIJ+#@-vALMMibbZKQ$pG!c0X9>whT2jW^Ixz0Y_G859ck?F#%R7fV;(p_|`lTk_ z;{g+HoJ2V9wx?}CO`MyyOVwmPFQXXeP41@hw!9M7Qq#(G?eFk)3%qcQA8Rt7Gb24G zPf%^w>wq?o1kgl(3s6~nMZ{<1%4e_T{i2wgmkaus>JxvP2tHs%`{Jwg>6*cZ=719} zy5z&MUrz2gK3A|8)o~XgJ$G{ZFjQSnM&S2wjp?F{`FhAwPZUL+k+Jim@TbF1H7+9n z-!$#xYf!*6JQJaJb8O9^P*>eZ>t#R=cU;)D=Wf*xf6WHcP3Q)@qmuG%{PPMB?J;o< zc)$k$BqX7hUBRC4=DzIr&A!m0g6pV$13IN~sd97OZQz+O-8A&@>CZbal-$<362SWi zFx@!b;L}i5bz$1F`?Q=6bmo@ajmsD}cK9r?k>jfpc_) z_6Bj>vyN|ED6h}yOfRZ;ir200O~CQai)&oq>Eh;d-`YmTy+2#36F2%c*R8sps`rDB z3rH9CdNI@;RG(eTFEe{_wit}9THttLzmfW#-*dWUQsB<`^`=$!bK^1@Pt#|3Hjo!o zTiOqQ9S71G?MhjX-{$%}HlH4k=F^woA#d?$oNxqoET*xDTiofw@yKY2D^|;&gx>%AVskzWvA7sm}|6{Q}CCr+TPE44D{fUuMNI5R(qZx<_cX?m4*PO z4pdc_ja~Z=-%UP)NsS>T;tuVfk7GkcQ__k3DysdIWp)*4rv%CSBbP zi3Aa^&IEkfcMiYDc9QA0xw=M}S^uoTEh=pFi#GxIOg}pF#kHAAUp zu^zTDyFw{5deN44m9KXnPqmwI!C%U@4*@`nx3ak({5`Tz;zHuzyOn=F(muLC{(^F? zZMzEc(|dH;e4VPiA<5;Nv>YPyH872CG^pLLd-59k(Q_X2%aQ01X*qOJ*m7qR?gR)b z_=F_8aovX%8u|+et+O)HvC<{qd-UAIgR2>=v<)#EBcDOR!8ar#Sf=yyYGjPb+HwPY zy7uk*vfI*ixuCI^c-@%co1JljZWpu;2JF9i(qk~k02P)cBBEGh+aWoa+Z2?jkRRXj z;Og$y$D)Js=b9OT8!sr2e>s-ecc{5D2l4F$Jxqh^$mD4nf9OZ14)WpGIGf}vA=|(4 z`k3mW2wiag8co^V^U=x$)8w4rMKa`a>bYV;P5iYp}ks`<#Iem7(=&#jAX{WLl#14;#@R%_Tsce!8L*M_ne0D zwm@HCvycQNUFtYrqu|jZb*Q=$-|U0g5kOK`2`wTkv7NJjyi28QjLjbA zUg{{4LKdqZKNzC1j@)Ab@>vXBr{RxOX^(U%k&YM!l?_6AyWW~13=I`Bs ztm_9X%j?fLUzBOC=pvzvFUDs-B9`h4oO3mI3(kC!(|7vlw? z@H}@Px2(RKUo(cdR5p5As1Dogy5IJJJ5W6<48;uKT`6f#YTn-?JmczJGbN-zxASHA2ZdVqq07VPY?pp^GinM#oWhAX!LGP>hktySsKd~ zygMFkOw(7x=FeX8i@av4R21oSR5YQs>dxGW+RVFwj(eytxAO~G9+!9@JK+4O z>uG5SA5o}Om5?EtAv)%CsbwJeO#idIx~%QYgATv=&R(4jiTI3Lzo;A>MG*tZ0L{IL z+u*VH&-|W+Dtt1RycraAmGs!U`BI2B>h%z}j>S!I?vCH!jC^$ugZD@}Ve# zK`FB*e>)VwFMtRV@oo?)t!vQf9jjWpuu7TriQxj0CJQt?D}dqn7vD|3<-HLk&?L2C zgSc?UXTpeR+MK9yUTBnP9ZpuSzXe^;@luCRQ{-rf8>;QV{cS1T<%Ji|tW7NvWl8WyU6CMMb=yHXdeiBvs48gqLN9l% zedRjqw%bI8^X-Rj^A@{z_a17%Js&9Mv{UV6nE5%MrllZMEy)~yv?P_T;dDMYGezHx z)XW5%SOLwU_NPnMVbht_2TW2l(6y_VAw2!S%j;RrAo)no4?O}}(n8wMFg}vI>Kl{Z zLj+g1(9Egwlb;6u4|CrY)?~MCtAK#gn}F0%MGy>;7BH01l%^n3gwR0*rG?(4NJ0le zI-;P0^s1B~y?2o+AT9J71VfYaWv#u|@4xo;Jp1BYoEtPTPcSpHjCYLjjtM|r4i5@G zD|E>$Er&NMI)tTvnJimw;7;?zq3EKF3A^(25FhmGk}++pFI_*GWJbv$oTBfvb*--8 z_TqEC{t3|Fcc4D&D}s-nI4OP}z{^ehtPgTE)5U+fohHg~0@Ovcssyyrtv7O^_0oVV=5N>iiPtUh8StI_qLZTYG3EZJ@hnw+)HtX3_Uv*09 z=gt(YwBDXk=eKELJR}IGOPHb>4O7(g_XBIy%7QZ}?h+SY|w2lk6gM_~^hYi%Za+~uwon;Msp)qRgF3JKL zZFUVlz?HiuT;c(nKKq1w;8|U{&nKID7)cNSIael|M$oK)xS%)ak`hcf+zFXDWtZhI zE<Xx^2&GDM;z= zy!Ay2@s!4V%{jigMe*^Ag*ZBkYQBB@*HeGPUjKNIBn9k8=@r%M%w~rqeT(Rp5pHJ~-zjKI>g>3tTy(2RFG(UK{6W)WWL5oXp4} zfAU3On=zdfhQz;LnJ)-Sds6rk4w1Bs*A;sbGQ)(=6>Xs#bg$O!5ad30j)RWexF^@} zgvhwD%(m2a<-EBt7d=g4P(9yH1ST?;tPeg$@rF4xH90Jm`Syl0LO>m}*4tAUgTX}I z=+h7v6BCm}SR*!4!M5(CM+#9B;ExeyHc?NY#JbxVEWLgy9uZ|$YN*zpaY%cU)|aou z3l1HhHV7kfz&4kEML3?B=au^V-H8$aLplBMQ-^}fQHoL{y4`MrE|=-;q=G1c@9&of z>zK3h3_$3Zt9OhNYMY)7j>w>=RkbZ+pAV{hg!!7wL$;V3@NJW0_oek%AJTh+k~S-c zwcVoyENXi90m`W&X8oXGqi6g*;>9BnkyLn5#PZ?VXRR+8ma1uLK1*0u+uoEiN^lwm zL$>DAEwggv2&lgNQ(w@!tnw68h#Ho@jtTl9B0KG|8aJuMov~HBUM!PjlH<;`nPjCh z&fVtLK&aMkC8IPiTF?`D0u%a+yRY;cHi>=2>6!rzb9t0$=ooM&1_Dd|ew>oo$vm^c z@pePtE6@t=Fr>BUCwd@c(O$>b7`DKlY{D~~Vmr4}V0QYr)t`*Z&$)OHAQgdYwF4B+ z^{z+@54jyTGk@kD&Vy_VW(6Tgdh>3pEh0j<&&{VR&k$2fbARg@_^N)mV%ztV%~SLO zk60FV$a?MThY{d^Eo*Gp9>kRrx6=SWoWgw%E<17h@(H--{4jvm->x9c?zh>^5;R2j zns=MXbCHANs@i{_*#DgJ<}ZMqZJW=VwqOv9|2c{Ov>alou=xC8wHu{0>RZP%&(3F^ z6!LTk9!Q1?RdwXNc(W5=B89X^vFw2C9WOEKW_p)3C0i@ZJcnQGpf{bmgU0M!ACY6? zc=g^Zbw`?YJY~*Ryk$9bTS&a5vu@{>#7+yxbGGhhQkRw!4M*`T&W1*jv&XMvG7bF- z)1eNbMo@=&)`$*)CKzar`w2O!PM&n{i?)($&U$nC-WS>q5iZ|dV$KR&dwF0IPI{U#tnMHl-fB%k6J4XAJyEdxD4v%{uF6wGt4>+y*R zETPOy54uh;I4;%KDkQ}X`yVr&9KHAZWPB8)5Qou?n|EDXX-?IK9WL5*liU_p5$yU= zGvF`kzp7z&N71VnJftY0GB(B7T4HlRX-7_PTni9TddN<#-SsKGxL`eGx)$5hY766X z>)SJzmB$z}nNS)-Bb*%a>!*rgT8cY&oa=DquwLuKoUjq3r64z-q$be-dup1INH{7PZ3W zgmH<8X_&aoSI=mT0sR`fJpD?>w;O^1*0LrSzzf&Dzf^90N&M+S{XtcUR&Ivtov~`> z&pXeBIx{Cc4<_t#xw&mKJ#XVl!H`W1V}HfG9IH!w#j$~mk%7!Ocm$9aIxl>CYi;}-HF((an_I! z>iIK@*4PQH%(URe^v$7>+GJO_WoXNz?MPUM;-VJ75gx~}V|mm&59=UkO!$BZJ@EB} zuKrk2lZRe7Uq#9FAeM_o-H&T;y5?Z=Brs?WI|!%g8-JPgd@g4pFr)qF4a42j7}2>s zUw~PUU6oDU2G3+gihVY;|00m?_`+?EL;QvEr#(jNQ{-}{XAEOf@JZHXF+>Lbvl{SC z%fAKW1j&8e=|h2~y64*|@t+@dd#(Qsk@51D&L%y?eV3-z#BO*09j*QCg$W!%7o!6%$!^M3LrbG$f z9Y@ET9`8u~T%&AFg8Ke&-UV$WI}5}+m3{bp(%qJ3LJpBZdRX36Dq7EB&fcH{gdU98|2x33q z;2nX$nxL*>ezC1ipBXePjM$A}*9FciHuz%|?i;~l>aJ5R9q$%mhpTL zGimVRkz)$TFuoAdUHbMYCmQEl3Q&BDc9Ty^9EXae=mscn?*X^SCOdrTr(Mh0bBXA$+F#B~ zZc+7IJuzCmMaK4)nMl~$UVWH$OhdUmom4Cqn`Gl%`2 zw!urr4n;550WHZ?2->+cAhhW7Ig%R!U$k*TBKxcZ)EoM?D-qOF6x55U}fK4(#8dzD#oA{;f;*w~J-rDPH4jdF)V zt`C=1sERF@Q&kv4hM_T|j#tL*mwU(aAcOX&y?2EljU!L4%UC^*>a%jZ9C9$UGHmHc zXXT@oMYjiBuw>O6QKlbtUDhf+g|$>U#oms}%>iYZw=YqIr8asF^*g?nKpv#>Y04NZ zath~0$NGi;l*3o8D=HLa3onYJE|uH-8d>7SMp9$ki@2XJu>*y(-D9?z4&D=}`^YIE z)0pl$OjQAu^sRS`a*9_9f7%DiBrga4+RHLqo(8Djb^olhlVyiv=R35F>v(S5sKroC z#m8iK-ys0DPeBJBbw8ZJCDry5iU_)vpVOY-p$`T$+1ihLC%&(<1~ZzDosD+CS=FlOj_-SWb2fk-xmBNK;V0r!*9 zW3SvMZgg2y(Fc-UsSZL>u4ORhj`S+}aY)JIG?wxn3^iH4GT^raDLCG$D_P|%rzY}@ zq2h6R@*SAS6`PX|B}GrH?)fwY`6*ToxB~_b^lA>TOH5=8#@*z^T=CsS4fXkc_1_I)(5Ed^i%y66`!FreLq%)F z4Kn-zV@_2OGe1;g*|%Zae|w#O3jDY2IR~h$`=kuUt|R2`Bu@YBpZ@kB;X=^*<-MOW zQaVWsc=iHvq9$4CtL+GIt5~R8wH2kUG}_Iw@%C3rCzo{=XXc?faq(G+{uRpV*d5L} z#pa+;u8UH-aLjG##Cg4lhZo0QnCVmgq|Y={p%P4BjafR%tg^+YQ;s^{0_yBzYeYd# zByV?GlQASiZ`AqDTvD@y&8Rt*;7f_JLWypP02dPpl+d>nx``g|!HVFsuR%z#=@nVx zA)D0mku0H+yyL8eySJIEdja0~>ez~pv>axsv4hxVr_>vi;ysID98cZPeze3tZ)3R= zY_IzLt(Dc1iinvm!UT=MU?@j@YRHtni?mI+kJ$EbVV+WWd%cHRH8#t+q%M!nv2yabL`Lq9>omZVYV9v&EvXs?P}Ny{D9+SS$vlN2k`x z$OWz|Qoy}HK4!>-Ld4OR>8HDTaCgnyi~josW~SeALN?G<&JlT? z-WojH6|eRSp*rFEVm`=Gj;dlJAO0cwfr|V7w;&q~-b)+X`;-hI93tQlyFcNMLM*Rv zcY_7%70j{Pn2`Ezf|P&}gr-nWe4z+pn%}OpAIAN10*YMtf#*YogUd_x^xiqLk7pP% z?dsmKTdu1vVj&uR1SJ%1>1+BUn7BqjY4NmO>T~=6{^O_mqA{yzAyFvP@<~bH>ALSE zGshD*zl2UUj?xO?GLWl-Mdl6Rn6FWyZHI-^0fTS9rIxCAu3~b{Lf7WjCZGPh4rU3` zXF9Kr8G7ldU;k>`=C9{}FP4E9Q3DFHL5&(zNR;smAurXwV7YMxZUP64WStmF>2S*G zh^QjV-k9@Q@u}w<;=#OOY01scL%;TzyzrURZcY!?xroxm+;I^F{Sa@f7oc55Up6;!uG_B-XNR zUq;aVSbqzjg>MynA1PXUb&Op1(WQCkORi>`q${p7O`CI%rusI zb=tz=+k%;i@EQlC5~s&Qx}!w=&qPo6UCP?!27|-;SE7l<-8#YlDc&~F`!KlI|4lI23}30SxiV} zZr;KQ>D=Ch6RiTalI|?`QGjFp+GmFrEfuP*h++8^WhciQxJ>d!X17MEn%L7DNcKw= z1rQ(rPfm2wXWkjGFZE}p_e(EC0l#P%u<^hggH|dtv#nfzA!d)y&(#Dyq%~p45}p~B z#1hD>?&V~X=w03+ ztX=fO!;Xv|9svK!^fnR zmDy$?M=147vseJsy;gxb>dohRoV1j78j%Y-Mp94Tc6SZNhp?l!RH)k?HP~A2N<6Pe zZ@n|=&e=Erdg&;kW##od(RACx>Ppg&OS4zxxGl#cwJF~k^*KBjRjopvtQf?Tr8a?w@Yu_W`+#M|N;z(a#@2L$B%V`hQ={cX!JF%3>W!|6D?;O$Uu{pGZJk468X zNJQd7;7$k^rHq-|y#UTtO_OedK`LY6*0#5fJwkOE)3=?0a7j^DLr~MpOUDnWckB%< z0xq=tr*)ejhnmCiT|J(Z_*lN(5HgvVaa%RS!3BHS>X&#o8z zBZWp4IHLvt%SU^Sa$hn~{Lx>wusJ1Xd0sa9FEi%OIhAKIn6Vn(ZQ>uR$CH19GXH+i z*o}TBiz|-Od4kK5`L%f%$AYX0wyV~#3-hgpQ&yu_zO_C}=)A)5Ia@k%=gQno@qv{n zdoW~H=_wsCg3m;KbcNrO9`>$wySd=4u$Z4l?d})!Y2z3WKZ z>MTH4Ya_NviZLbr^{7kYC8B>m=US44oW9owEmO%2wC%=~@tbI)x#p&7TH>KArerUv z%xO(k6)YGOh)@y=3^_qGvhZ5+IyvrJH#ze*DBddz-?6bQLSTS za;5-4Jl}U?JimVXb+RmPKv1+Yj{!!c*kAW4pjb^dba481PPzXAJb}6$Ny>;|4R-Em zRpyBZSq*OT3VCSMs7&JprJJ zG=AJ;EHRzF0NywFe!AsZKydKE`-y~-mzg*mgkdeye6UU+hk%abH zD@E$q-?Zev)B=D(EhWf6+ugev4?gO(Hw1ApT5SXJ>1(5_7&dzU0c|z+SzksmnC5it zSyO#a2jMw)*W3AQ`8XtBQ?{&lZV8Xz@iW^SMb5KU^O?6ALdT5`!JGCBfGfcc_0bj!^J|3lLOp_k@F`}u9WZm7~#Rl7uG#9E^D9HIQwKe^`9 z+tZn?66tDiU)|p7CE|AFB9mfb#ae3BZm;jH7Ugh^T=MF0u3e#lng9M;VMYJiCFboF zJNe@Y&CaJUXzQM)ShoYlup9#Z-@E1AL9qL3n*0K2!L-}iK2o4igliYSsm^!dpsK0f z<@wX?z(DswMKXPWUD4ZrD|qXJ&jQ_dwt*fX%l3U`)f2psJ-C~HW1Z9DGJ7a*sN6{oJ-@KJ^@ z80n--USD43cvh-GwhY*wHv!WXW|nBq-Q4`OFmMt!9QHZk_V_tZKz0NN+radIj69#Y zAMK;n@##dY%HliG?}r311{)ZC=wy1T7MB8I-7DS+P=YNtTyzT9ORsy8o^JPZ@}IpE z|5OrQdy;VPimnXPygdlGq;}GH%*44?lIvw2%lZ@_{(gY~XC5 zMD8-A&WSu_CH^(v+b_p!OX?sY_WW2~PY=4QG&>?fR8pPzIPOx1?zFdk_N5?ZPJsgf z9kShj1DUPi8K)av!H*9_ zT`iu1tfZ0zt~ElhuHzb^Jj|Bd5p?P%nvy5agl?2NIDH__=cKOS4CTBMu!{FCm3y=r z=hZgfP92oYLMlcDi}&_U^$Jh%ZeqdsStdgEbo1Ft5clgFF|80Q%GO57f*dE-y$9fw zPpiEvevb^3xwz4os7zU6p6xf&&{xq|;tfOIK`Nl0s(bULxQL2pTVl*auLz*|Q*Q#* zY${sylV+{Pmwg7^H0YMnTmCSRZr)RpLk-vx!Rb6gXvByxi>JOwk^TAr-itYybf~Hl zSS%~Ky~w`;cnpf%;8z{!gH)bb%QvK*60ibHcJcGs>G!ifKI>ZFe3%QM9J`}YjHrfh z+Agr|XE5pQnq>)0V*|uFXe^`5KNB{VNNgKgIvB$E<((4Vw^nicB19 z_||~_y3Ef_q|dvgS4M0Dm@$ZEVrLJ>$|GY~9h~M?Wj2FQro*nHvcBE@EtyxvgI`lA zahcnGxs!m|9);}2YRAbC>L}!cQaL zfkcV7Ruy+GyJrIS_ToF(*=f*XA=j5dqeCaAtbGbGOzAi96A012;SSLL!%Y;z;eEW9 zZX@7z)9E)f{}*uj$1$=(Xu&X5D6?-SZ*3UpkKP?;LC#J~v{Qp;*`9u9b*B5Y8C7Hz zmIYuVYThYTuV{b-jC#}l?k40p&BYJQ9L2zu*b=bkvR$+t^iSWR>w2#^-yC`Lk~O$w zbVsIbR~c1Uz$$tbN-Qb_!)N#IDDFaLlbcmk>;xWU=pEi%7;Zdx%`({%WuE-n!SrZo zLKc+j9Gs_3jWwE-iFP!$T56 z@h)0KXB~~RZs=vWh6;_@J@EI-2sb*eOuB9&^NRJ}EhIu@#3E}A(o>AF=;p)P?_Pu@ zJSX(FHST|!NgCGrp16HqL!OpA+mT>6cU|K?d`GCFO>AI$sRM7hwW#W()Dwj|D^~&E zgUcl%{TK?}M-gUB^42*z%x+4<6s z4rV8%iay3D=Fz?iZ?WUH_Fs5S>}EefvDMaFmkXD)2Xq?`zsb} zC>kOJs9OkIE^?2JPFN=}a_|o8WgUIR{A3;QQoV%3 z#>oL%mv6hpuaiUg#`I;yBP~T$&7ten>2(F0MNa+>|B&3oYS-TzVCI=j7jCGM^&p!r zFk1&6_5yZ4;9RN$Ak>e3&(DxCAUXchizlP$f$TtU+F@oRXQq-Kl9GcS2fUB4irv_W zT$uEgNbaL|E5FhZfch*YCp;#uo-9nfkdm|TO}BAIhnM$>EuUS$^7 zuH}R5X59_}zad}XLH6DjZPsN)aV^D3ouMk(3qdzk#=gHDD6;g)JTy7QB{yh(odmek zy{YvXEK`T)kWI2_QlkL*pb&W}Z_?HUI6s<;UfnOOi9y7Zz;;ZhV>yR=-J+k)3ZX|2 zQz?I*v?o^TG)YY(^?r%Qa7CyOf&5d?U_U+-4*zx(%$^TdKrTc##QWX7VyJj_ws8Jp zt=N-45l$DmOJ|oJ;4g!7Fxhr>#7x@d@L$?r~>iX;MD|XMb6+ymD1@GWV#rRXB;gJ2F$E;y@_2 zzbmaCd-wFl@@a3Me|eeCi5|95%3_FLAmb{1qJp!!GPBZHlRIl;P*>ZPbMf?yCq66V zbo0s?`ml}ea5IGuA8kjjT9Kt%hj=rM6~1$u6(rk`K;qN~-I>=k248-P68wmvsNE_y z3b4h3I?}+M7l}!DwpSc0$SYZb$_P->aPW$m<3nXceipzRrJ7UR(ISs7pcW;iL}kJLA9-rGu4OtmU%bfkR0#0bg+ISb0p3b_NP334YHhwH z7PP3gg|FJXC|+vaLM5e1@M=dCH>R@G0If*YW5DLQ$?-IXx|CJ;BleJG&(0b+&g9L_uQiDD{uzefm;gFHJM49UK-0u}a6Bs;Et4%fLa z&8Q?w9eLB8`e8dA?=z&3;|fvSEpkchu*qZ@2nU8#HvH&Ole6Rh#QDr`ybM%Mrv@AC z23ig&B-SIEicdBa84HX8;(avg5SI@u?c&mn$^))KvU|R*TJgUS3bNz9!44FQ)TrLY zD)>|#;3*g;_yh2t>aKZC`mMlMVe&AeYG;eu`3T`JK>vUMNy+Eh&zC!rOOj1JXT0sU ze$_l0%B}>Y!ngRBySEr@K;L3UuP4T&)4o`}5iuB@T#VuE0(6>8m+Jk|hi+=Op&8nj z?T=H%N_?k*j)Bw^EtGXFQhO;TyN4nHv2NlCbj$+Qsl!`guj>GnMXciG!1Yi+bqvt1 zVg?0{VBcTt*Ase4|C6G6aEWB4v*$ZaKT>Vx<-GS{+;1o4--Ny!@nhQx^0ep%-VESw zAhe4brB~R_jW%~mi4utxQ${Iz4$x&&-|o|hG0iCQ+C}@V9N0(Q$_I!MgIks_b9;p{ zYZ%w`)T%n+l!s+PVv-Z7`XMR0i!Be<3ST~i+2UvoMmu1lKx>ss@=_`EJ_N}2yU2Gk znM)QL&4RVKeow@~l7*jk1N4by^vx0r5M|k3jxr%Hyy-_7nn9mwuq?#th!aZgZ%=z# zzo;jAm{$TxpfKHs_bC-BgS&H%COa@5z^vQTT4Zv3^-T%Tsz1gdUtyo0n|Am#`M6+e z;wRAVhZna2DR6o(#;>024Gh2ns!j>*NiJtT$2OP7%}J7oiDWg0!oam`9MI)#mru)>2d!w(BdkcukoKQo>F!?mW|HzY~GSUrUlo~>34tf zvE6tIlx-YR$QfxOq9)K=-tB$xR@C_hS{Sd1>XIu*k0Z({+?4$e6yNODDw=)}`7KYh zVfXCWk|;Aot7^WLdz?Bh5t&}EBuL5seCwl0I>a0@COy@R_I zkK`%*CJC*eQlNWZF7k)>)m~+$GbD;_(M7S|D-32(3@>ph`~57R~)>QJb(KZ zGL$_(+_ct}0i}%~sc(Jm?k(9_3ow!X0@%1%C^W}5Gt!V$$rOp>S!qqqKEjViDN;dk z+L19)dsZJ=g8r-fJF{?rJOfw-_GhO*2lNS@$Wui~fCJM&4wz!RT(%lDC{2Ci_s7iS z3C*1~3r>=F8eq!-DJ*Zs0$0M+RDfHjfjY_QkaRd#XP|Y4&_R09weCOrErQ5Mfv)A~ zB#eC{hc_1s&D5uxzazoF=Jx|1V8BgRx#r$t6llGd+nS1F%ig*vcxCKRvhG}-B8nrJNoZekO+8BYYMKl&1;S*!o(YSfIAX&Dw zt+LC;@LfvSNOOCdqG=!WVXBSi#p~QBG4?hm76$bPLiluc zGo>vRYm;9AB#eEQ{{btwUz@j79CXftBN(de@!u@QG;)O2u4)BMlC^ zYGsoHgzte!|6IAwVU<~xVNXea4b-8!d{&Sd60*n8gV;=#*OW=x1C4)pca+axUUHz9 z5QFKQ1Zyt#-Nna#BxDynQOi=(3+963xbPe&)nz?t2d*Gmo_=jS(K=3-YpfJpsJ4xn=zkBuo=wJSQZ(OS)K zI~=Mq3)mEFaD20rkzZ10nT*cr3OEpw3Yd;eeX}l-Zxg4vvu z_LlW1w3IVuZ63a}U{yp$9nX|W!HYkqaEP|c;!N4-gl@(n_*$s& zxuEm~F7bc#Sk8s96+c@Owf~=n%lwcV=#!NCmF>Kih}9d^|I_AaP9hKryfs7cKzbc_ zqf;s3N!187^_UiTE8_ez9gGhHC$Hb3GD-$ymjF7CT{<#P`k(@I33F=wcz-C| zuE?z*Afj47dNgOT zEa!7*=nx8B#4Or9W3HGVq;p-FE8#jqGI$5IeUSuE*~jR-z5hh4|Kf&U%l|tj?GW6d2^;@uv~1 zBrLn@=T~pS|A7*j!yK#{6&Xh4HWL>%OQUJL!uA1gW|;M=Li z4msR$@$ma<_g)}a2U^yxLusX?)Epims>F#MZZb@kNcV8z>oM|>PMCkx&GlYngISHf-oy&^ z&5-_?29Hyn*hq&M-A~;B+fXCeh+P&E%R_okq!t$`ct_N6Lve8o;g~PR zRpF|u$7g2QA!73e>?A4~hthCnK?c1Exy0B2o3TO)-d^dJ>Y&o$Xzr>szIsO)vX4NeLB_h+E_MD)}if6s|6d&IT%73mc0^~d4B65Z5e^j8}9PRLS z#m2#bn0+^N)(0PG?r0j|5hQm3II-fB@w`~meWsk+-d5g8HOkrze7gu=YTim5l=iS1 zE&A?+J<%}Ku#G`YF2MGDMEwK@Gn)(vBgDHB#a`GWS5|0M%G*kQ|Danm-8H{Ye7W&` z1^qxIx2#Neoy0&NVp^w4zrfxuIyU1gGc}Z<=0k&RRFL^_)>aHADD<5^0Fa(AX$$_1 zl>7^dMk#!!1*(LHfROgVzhLfyDO%QMZ_!>foxrv4-Zx(%=eC%fBZWYDPVZuG% z46(j!K-bSJryO>&!w6tl3A9*v<#@RLB}ux+Lv1d6+9!8LlA~FGjF!}g`!Z6P+u@c- z8dvV|w$-<=fJ{A%My5_#>y1(fFH{zc1`0Px+Yy_j5+f-SD`tMq-qJx7bml{(8;7v3_UvTAuYFIo5D>H1dii8&eWPi^NV z7+Ri%_Cz_uLQ{`u-MnQgQK@gFu?hZ}JAF|!bF1KoQ3?eFN7=OuZQK6|2>`1o=rfQM zf(RH4d@qYTpt2H_{GV}sltMb;jReyA`AO!t$(Nr8m_`M9I66ztU2B$N3{0rn=yj%7 zLE5M;j=^m4(etlYv>QV<$zG2H3uq@W61KKZJu!3` zatlf!u-Xe{^VK&9*wmx+$Q1gDF{n5w=S*G^Uzjv;F&gHwDjvcy{>a#G4HmrRb=6YrSHBhEc2C%h2|V7@E0ZGs6SkVIHwD zaM=Kn$xO5u`${kfKNYB5D}a=YZm6K|iH>gQBQlBW`W5^SQ^N&w4=i{|hhEuI2KbRz zoMgbgt*uni!>=4!2Dlhg@)Bi`>OsxtcZF5WZ}5(XgAiiTjg7ge9O?6gCtrmX&5N## zGnGh>G;3>NiXQ%T;;5>%-AxEESI! z-~gfjD-dhd`j5vO+g~-}aab9{-V2XX<}kUDgx1dldX1M0x z5a>TRzd`wb)qs!BBBU$+H0z=i90-fbJJ%b5@J1RJ)Iqe zr@geM-k?O@uTZjpO*K36`?yk+1PuijPs4n;oq;H2TPz(% zFU)pK=Qo*av@gTEYeTh3#=EiJHZBLny`uZy&!>jBI)o4iCl=X1mdbxEI$A;q#7bby z?oXB-iZ&g_cu7r(EP5^?DP0%i7Cq%zr3e!ZN*SY;C#@X_Tjj%@aM}!xUDR5InTh71 zA#b->L;nC`SD@^kj)P^D&ifU#)K*12cy+ zPb%_}tMf%_u~MX$t)EX^EqCLpZtGRp*NhNp%Tfv!+-t}n9a4GU#sJo@M^prP!8Sy! zD&}_4>wpIuyXFAge+-1FNuylX9a|G6T?@4HYG5^$$zCIZ)I4JQqv2p$<(c8%*`D4% z0Ve-{0Hza_xvxV1%d@V5ZUwnm4-?U_L=y|~hy*#)RD~^E?dO5+8W+$BJCMi|p>}6j zcCK`Vm=7aHzogD7lp9Q`Ip*s;9kFWf;Fj7?HR6Smc~_d*1wXuAk{~SNYX{Qd4%1=n{w-0DWs8MxX?8J zZvMMiF}JHUW&C;L`dN5aG3YKHs346?g_1cVEW0AL4#!)s2>qlL%j@XkYU>RW51~Z*_i?kIS6+({NrVl!TGyP~d`c zXY%ECON%I9s4D*D4ror~ahNBXBZ!gW(>>Tc?Pf?Ky7*S%1Tl)vmo+w4!o!uv27!E= zsxfs3%cEMuq(Le9I4)PN0sxSKq1e5vVi34*xS*f}t=~9pCL33+?Z{nf%Q8A%u8%I^ z5wQ+#$y!9wEkGP$$NQdjA}s$9oh2=Hu(0Bq!5(hh`!)%uOr=__-{ixkrHw^yQj6%T zsD2ccsmCb2dhLdRD7JBc^YFfbOjp~4epc1NH6XBv*dGYm1lj;jQm(7M{(p~`8t4E> zk1@O+K_IcwKo3z`n-2RA>h|!GE=m+#xhQ+v5~t(ZDBEMLVjC{lrUh^rHddxmKn$w; zimVRE)%=Q>ugoocuASl6U2@b7lJ%y|q>}a3N2MNh7f9Q#+Fbup4g)V-J}JPEgqEBO0aCdLcGZXM+@ zyz&9Kb-6dAG-~^0ZxZxs#s!yZfw3R4D>`ZAhB8akG@KNID0qQFj+4WC0LT-KLY+OL zBd|my!yo>*eXIRN^~16^zW(Vzd_)7h(YKZ_sibs3{-}M`$OBpF2U2a-kg)0)o_F-< zVu>l0uu!kV!8y5z3LrQD#_Qn1nHsK$?l9PDYUifr3Py~YN5|DgsR(LgG;#R>c}D1X zj*vA6nt;$N^G{yrIhVy8jNc&WZIdGn`{>$kFltcPXkmMm>+nNJA`ClZ@+#BNqK#A80l6kDcD&nF zas^*D$IQx{)zA5ObeDo`vn@BHm3OOC79Dc7@sG5O^Y?TAKmtc8a1oF zoqTQUH=%!`uj4JDX4oe?BGVbtn0#M*v>cKQD4-T&HF*QZ85(OJ1SFAtwK_HOQxhe! z`J^79CyVAuI)^PcJwUhFvNc}Tl!AYlcN=5hV9At$I6KoMesL3_- z_m})m1`C`A>NxFSROuy7kQXJYt?F|7v(ADB6DF>Ed`5sh^k%b>bu_hDe9aV!%A!O% z9xyN%9PdIpL0p8N=j9nVQ6X;A`0eH9p_ z;=6c*iTNh0yJ|DC3omvkKm*OUlqJa!M2uph|aUgCx2uY#g(j9GiUjY^-H3cqS zeD1KJ^g>dZOxW!u8JziC>st9UVsH|f*$cxm;apC3hY2_bQJkfXov6w_Kzr7(Ae*nV ze*fCi-^8)ly$*ejn|A} zzhZU$}dJHfpHv>M+0jkeHjB zP&N-_8=Wv$1#)C4&G@Tz13q`&ARkr{cCgA`$i)1Z10_1dX{(ybl?kz67JUcW)8s_6~-ELGcgPacUei#Tifl@$Rpr4Qv zMh;wy4@c}&cRomZ>u06bx4JyVS_n|5_g{W&YDQ>Rap*{4I(xm##CnS@=pzuc`{_Dg zW(Q%62%)G3BZBL`e;*@(e~ghm5NxakXfJo1*x3Kn@dIe`N`&e7yt$$KG7V=7rg|!v z#k1pCPA9EdJnJtWN$H4{Ugyhz><;6pm`?#XOkn52$86YL4o}YbqA#ntFN4{Kgl#rEUHX(ZPm z!cqbK9Z|0}I&Ye(k(08j82 zjS_U5!1vbQ0y4ZY`pCu1$#0~89Hd6_!n?ryGkvpDQr;HQ;p}X(H9%0JQTODut5GYx zlzu>mmsfNzy7TjwRIF9lfcnpw7h`!o&OG53eS>L7XurvV3Uuu4sOopEDvs9<)jTD^$0sK*At!CsVMQgJ6Rx?|ITnDU&R#L8up0GgY-DgHOmn{(E-0|waXBT zPJFne=WkgGVL&~~axJ(F+iXGINIo2k+^+<-s6%N0SpKV?|G&a+F?mO6U~4)iD~J4% z7*HV)19Y0X`Twj|@Unb1WLB_Y&1y`h8xVp7 zzlKv>5WL3z3cmUp>g9d$F&fhyVoS3-sZsb$F&9!oUiZe93s6Kpv~ZFF3GYuGzrg$U z!vT-52o9Czj@zZBU0V-g$Tj{F-t=G+JDe#^TyqmcjsQV|xknBjNWeVsy60oS z3SRyU+I*6mt~Xj?N0@Y>T7<&SY1@lWeo;|b{eXd zU>4-!b1rWu%IffWv1WtB{wSRQznv>KAswC1QaUv;X>rXBjAL~2umj#j1;HfgLwH~I zQ7aI39|A3>>lh3`y7Ej>WP0_#IelZx=5R8fRW496|2E-aaO@R)cUrBW%lwl|%<}*t z$@1y0SGE#0cFq|MxF;8a*+0r*L}Sf7=DSf}OxBxwDHX)l3q0JiEbj|`9HC*$lp``Q zPYCfJ2Y{%`@?HP=Qn2s?hlz1@jPkx=1-aD$v>}wmIu?$uMHaZcb z;*3HF7@Cl%D5waisB}ir>`!;*|y*)ql#D5KemwcqQ4ltqU$&p459^NOunUHB>DA zz2?vh>I(zQ3lAPW&xO4Nr%J?}o14-L9KK-vD420I^9n}RmSKYP`9#drj&68v$j>dL zy|7DC{BIpu+5r`^hY;tWxr)jIv6?+Piq9RhX=YuCS}&yNmIowFo^)2f7jbtp{g8_3 zR1OjU^@ILx9kIt#XR?1MF~5iG4h4)C`5$c%LmJ1)i@z|cfS&}bvvY1*-`BKAF*Diq za0CTPFl}MKq*`<@=4OkX^6za9Thxil0j6rV59=I@K|#Ll5Jc@wiQ)gqPycKy>Asr* zlmZcz;MnnyGF)Bv)}Nlj-vnRemw-7b`ln8-P|CJfbaT9%)@3&tofdS9tC*aO@;6c2 zwu0o|tVb=?LGRL}M-UUoT~f>hN-a9#NziR8=Id6=9gC@n=G}Vu`;BRuoo{x6VIS)Q zGpJ_Ai+q~DCZrQ_mS?{J&9;oD?X${I78<^w?WCjId`L=at2-$t##$ zDhN@#E*-^l_Z?QZX&lkaYK7QB@hh+OQFaDJ)_`8ihf0rXc$NvE4Y`{M;=pihmYwyf z-_G@~9A)oNr8o&192OTe|A&pn-`fV52>DXLZv)pwlNX9!<^3!^f8LfakaA~y9y`2y z%M+aodi|4jy%L-8az47ngys>=w_S?1$6>oRP*eF6;R#$e$XsYrB=CoEpw&pY3~6Gr zdHK3OFx4J*JZoyoB-UpnT04F4UZbqz+gt>K1#sQFbq#+Q9f>>rqU?s)$e~U8Kemh8 zpUWx9Ry@r9q^R#h4lG}OWENSFmB0PM^s|sxI`ABQ6X&6C=Q-!0Znv%CcjsnK1e%jB zYA_N*T2stM554ufA{JM+O>^#J3ZepTcLj(y0v8hSzb7OAO91t+$n8CUh8*r9?Cpd5 zv+9EqYrdTREte??mj}-_pCnpz}EBE52*bnb}mk|R&>AG0o3O=B;G+WVgDfC zyH|wVWX^B(+@_uYd9ia${hdQlIlp~%_>Au6(SD76fsUG5aA%4jJAaZB_5tJsh2s*)($f0I;L!e z22JfOf@^0(g|{IWI9t2ygcD(M*qf&Z6Em?M-F|m6qCh9-JMDaR-L=3NI%B@GDyQT( zusEXiHki&BOAO#=1m249%=V3YsN1{d)Hmo^Krx5=I`3!8A}h3QblxF1iLyC$%5Tmd z+_J&v*6S^`E)1*dE{r&pM%7fAO>!a|eZKAW+lKYt6s5d(+jY4a>kc<8PK5nQ=lbi$ zp!eF>tJ5;uq*o_o8s^=g@cn&WDlQ(ow-hk!s5g+~y|SDlV)P|WXd(%&i-0RRD(e}I zn=RfjiI|LTTX8kuU5Swn?q*@lkr?+b9ba^3Vo8bk@auH#`qw+C2DI5Lger{V&Zm)& zv8fHG!#Cd_YKH0la`17@7PShlz7aQa5>M0mirV)Fq!uw*I$)h1?2XCvJ=XbBH2DAo zG%8Q;cPc9p;>Wc&tuZuRmfFLmusQI_y>c#rhitgOaBG)=bH>n(7UtjQP{JD)*eni~Djym9!Tg z&)?hKK@QKZsfO6^wL@ZTtK4WD7jMlXu~EBe{P1*gMTI8Iv3tO?CM&h!4w9E{(7R;I znDeR5R&B-0w$eFSO{o$!JSEV~PNhvxBfgk=-$KSJW~9s*pGAw5N1wrLf610z znVR3+PDxQJG!*jvG227Zuy^{BTPT0la{YAZjI1vAd)3<1u$vQULJ~lwvViIPJ=!eD zZ|1b{O0@)5gdH-X+kZ)pc1rNZ^`f6_ydjkKY#LT$(<+a}<_%t$NOsuv^z??G$}NW& ztO(Sn8)rrm&fl#iNI*ZGz?+aPCj6PA+J{SYwv>RhuL=zGq0k%;XHFm_Jv1a2dod_Upzg`b{2K zaNdU~a}iTOogD>STI~1mx(6Jy1Q_FtXOLXbc~VfpSF<6l>TW3?v%Jdv--mQc8|r0; zGCR~ujs|EHYDcAIE%-1BpI8)xGroi7FE?lCBi&gur6OviHjIYJXliBBF89bDl6q}L zVf-RXuY$~g7F{g^&Hs>feZ=@&rnS~^dHv2~^KA=rRXOsDvBrVeQ#-y%vta{$>JSaB z(|1qSmDe^q4YSIeWqckjYY=^xO?lMur}NiHLe>N(tS)6R5Lw!)_VSh3iJS_-ny9r= zf3hZRBI1>yo>$95JzE_lKR9l9$vpg4(C3F-E)_aUHVGZ1Jx+lYNPlIBqSC$-n>5M@P7|#@szUU>Q=lh&g zw??S$w9}?(QSWB)S;kiW+~y9a+`w)I>>5!VC9mtN>t$OV8;-`gKT5j0FE(@K5H%-W z$gYp8rA20l*xk4JP9_r~C+9krO@86}T@92*clU%^I(ips%EazQy4g}Ut0S8E(|0qX zDAt5n)oDpE*{P+Z%$QXePp&X7wV&x;?E0_+YeaY@CY^&2>?rvb>W&SL7_cI3qQH(S zqDo=aq^-iQ3vc|8$XGD2NagP@zpvTyDImK!Rs%=~qjc06oVgs-Y-~@P(x=e-dVGhY z9S)LNnXR2!x?$MTT4G_&{$GmD_DfE%Q=R$>1Ms#S`OMVvldVB8$vh-4*5ajfvn7*e zB7aH2XX*=~RE)$AhM9-Qzwl|Waz;xjEHUjjdpz1MTxBUPd;M4l{O+tRbK4Vm5{WDl zYg`$uQiM#r)qLAvx9*t|XUd(pXw^Z1VNqh0-Z^>)6^shggj4|!5RzL#mJ z3GmKE#c}VK02ei|hpW%NGZN(Ziz)>hBzPd}-+Hj6IJC&R!J^h3GBb8C*?r^Fws7I# z*?!sENz})u%XjUQn;BUoe?*M!#(q1-PMNG8Ei){Qeb^$cvw56VI;BUc4>FU&9mYnM zM}{{^wi{V_M7Q>+dq0{YBEq=h@F}C+l=p~se0+OBBI;IfsGbb1IfF=CTV}b0;3OLA zdi8`c{OY$o0REYOB^%^b76iSE6TYOVo4LXWHHy9ZZaL7Uu10V78Q8TtZR)K)T58i7 zVLUV`>W1||3<`C#>VRDH@# z(H4m2IoaW{eb{db+*boT?#+d(++W^DRW=#E5YN5Dn}h^%IWFiP5+*T*+B~P7;x}m0 ze$jU*-nj4Ms7i#i>?$D=B`=hR#4W(OBicG$2PDn$d9&=9*kZt(?X&-UShGa12Hi%d zZ|8P{WfnQ5@2soy?%F~m9JYiFQKe{LtH;wEOzK0bVS3E!^tO=rm{1=*_eUaw%C@l} zyAQ~(mTRuXfuVI;ljAmNwM^Q&sH{z$>9&PSz?-*rOETT~HzyE&QDd|H*Dx5!OucyW zPu6GQBJd@Mdr5EqEBcIz(MOpzh?6l6``e^G4cy5fi5euFHPLM@=83ndeeyos>Td&f zdk_+Yf!jIB@WSnUmy~UnVXZV~wipTZUXi&nHgoEMUyV)Yu$ij{YT^D=L6+N6l>dNA z$GswYTX}l&or>nys%kMQ!)I`!bm_2SXj9YjApKquQTlwQlLGSa5H&F%fanp^UfZx& z8bU-RAo(X9g{SUe8qUOTrVM?G;Jr&YG(Ou9;(QL;Mi{8KSWj?m4S-C%%H24-i)_N}33^pz6rFm+ujXvO z{v`J;_nl7lw~GmP&t;{kitdJBJcvad8j|PXan;RkE*>5w=iR?Sy_zzyQ}2I+cU5(l zhcG_1+;R4GVS2P!6Qt2O_E{d>bJ2wHAO(#@Ptv*-dtZ$OG7Ek!ot{B+I zJw%)gn>eta9Oj?eas6;px6cqwr!r%|o4OBOo5yFHlL^fL$zt%W(lGK|k?M>p!eAD4vt{0h=FU?QYr zBTj$#BUV#J9OiCOB`;#T@VO4pUnUF|1$djyXES&8mY{tx!4@{Y263*|Ugki0WaLF~ z36hxMso^=A4WH312G*d?@0!h3bR$SJcVI^c3C~WG1p6o4-ti~lplPoW+d zT+`Tih0eZH6U6uciojXU4G2 zzD80B4mJmxK{Y&&3E%_*Vl?KnGlrSdjkh;yd5Y8y!mD{4& ze`WzNinMz{kkv^lYS;@hv)uz&tp6aspDb4WHdlxXU!SY2rp68-xa|ns@J#--8T4IjODyz!$cjgI$3dd>>XY}v7+Iz`rg@EIPV z>LYXnK>@sUbLpux_jWZsh0+O_5D-UegMozh-?`}KPZC-PkkDwyu}!AVz*KX_&%mOr z0B}N@UrUOlNPaD!82ZjVVLElr=DF;imIO$N&Z>BVX?}2ReN}JZu~4$NX`aw-$eJoi z9KA}d?k;K088ml1o^d{;pyh}VSUaUX-V8v6^!#Zp+FgblbcOmsNOu>QNq!FV%nyXu z*XV`7e2kT2jPA`Jj(J);*b`wFLWx+~+8uExB-G!msx8kPy*x5EA9(H&)s={`n|4BD z9y-4ArxT$zQ@DdsvKn($~de|2v{7d@IfG{r%&tTEzq^GY_!h!`4xaywuLHkAvK zkV)+C2R0&kL^eSnN_faj0&o^%Ll-X$Zd_+<^IO{nEDX5mI(MhvAB?`_OeTFaK#2`t;K*k~h04@Pf#JaGYt;sH=e$)6`pbm7@n9w`TXY zb8HRcVUs-rlH62(tm^7i0SLm+K+7i17mCdnA~lRv{VtPF_l@nuh%h4qAGD?@-B3Dv zq!vMYVK#T0`bGXEjW$>FXLJ*66Zcrz>M0`ydUbcVhemxO!fnDkUQ@8v2fel_cOTnZ@MtF<8Ajg7Esl? z5Yjuel*9Z(jne!4iGfB8E-9dyT&4(Ji6Db?Y3^u7-J~^n6G{4Ex+si%vI1ikXya>ZDA<0Pef`qrv$|1}pzpX-*6pFMQ;or_?B4Nfi|yyDwwBR3Q5 z@qAk3*UW&2qE?4MwdOh^FOP=$6cCuHC@9L0{FE1 z?hg2tXyAhXC+CG{L8vxa<3^PSt3ac+2hS?l#li|FuzW zIc0EeHE%tg3Ee6EG{8Jc4{T0x3qPXKKhn>(C0il<^7H7S-Z>* zrBBbKL$3M<;sB#2j6k2T;IlP8X|C}YD2 z%9rjkO&JD^-dk1QPD8au%{F~BOm>z|0s%K@EsezqkADoF7w@Yx2PcY5Jh;W}tE&(E zQL?q_DCJANHKBwRc*&Qucj*Lyfps3`nw5g)GWZfOTTW6Yz})J~jur|-u*+H&K(pjj za%Qbh3s);;2bS0#1>3?s1fUU{!^ZMIi7onn#g_cwYuXz>boQN?AhtY#oevQ7DG(hV z7je!R0J|)^_<}GdHuwJOoz@`xIS%)o-kp=gwq!%0q(@@q5T3;Txohp@@-(!oFhH2% zxp{$W1Ws0aYXE&p%_igH=xp3nUhz4Ta1FPKt5wq6LXV)mQmP!=iim>rVJ|K84jU(> zXBqwq(g9+#M`FFz_2#?9j(B!HGD94+ZT1^Eb`m{alw4pI)6U77{?&m`h(vR~gVB>e z5|N1ofIYGiD_r!?zRr8iFS+JgMA7x_E<;1&2&?~a;PE`a$Ko;k>1MZ}a7jLvOIdnl@K z2o!*5i>0~rMnYD!swH6bgobyY{NxTi-=q88>hr)Ez3&*_}`+}O0TEx1_s zviNdT5#NHu*Y?ML%1s>yOHLGSvbJS)OD?l!%(_*+4Pf>z#YwabTQY9#co65=T4NKG ziM(wxx^$XC5RO7y%@PeUx{vvlS@IE}+7!f`_jTA(gK)X+u4_|p! z2K^L&d;(*P`=<11_?&lrY-pf3Ggj0J0!iwmYb3&S7YM!mJrk0wz@uT(G_A~Wq68)j zb(MHAr2Cq?)=U1}ZEjQ^eQivE^(93&ycjN?QALh4PFy5&df~ki8d}p;_k1UZEu8aK z++FUgUa8V~bnI*M+-4mShVs(pL#_U#I_>53k3@A|H>k0kmJ>lP6~6GYTD;+WUJzohPE!gq zEE3BV$5M>}ZW;7^fWK_jV-t56hpW#)y16fQfh$K3GglgFf{GBlp{i~!V^5vdX19qR z;O7oNd&MZuaKJ&`YIs(<(cf#9b7buOqc@;vZANK?gyXdb>KZowQ`@>H@n0$rW856)Q5pl&oHY#8ZIA01KKgc2So$UI3*_f^OGa02c=&-Vg8I_#u%^+M>Ye zl7IEPir?w|>}e~R2x_1dwoR}9COH53gjm~gP1IrgSn(2F+?Y64f4_P*{@HL-yRZvC(u660uFCWc{a1o9^H=W~u`uDynPv|tRKg2lCi z3bb)XY^qb^vsHlqOS*qDKJ#jornGSTs3aI#f4irO$F5!sr{j-Rp=}~Vg~ptGy+Jc7 zbqJ51A652-GJ`u}B&Vuo$_!7h4lVFiLZ|kF&DnKM_BmLM$1B zw%pBl?{wXB9PuDr96dVqF+MT6o~EZr;bT1DmJlagtfFlMiRooaP%ozMc8n>*;y2)j`J5)dFa6vs=^V{{?CK zc{#Z3D-Usl;xVT5~_p^$?%JHVJZ|pt7S*0=Pj6rX%$-)n8u5xv zt;pCj0l>L+IrJyFO5^W#R%o7~|He;^`3vyPmCM1mH!aR=Tl!SdG>Or{eUnJ2x;|-| z+}AD2I+UOTuqou`zV>Ogfl%qKB{YYnwt*6l?kMzR_WvfeNn{>HdobYObtg%Z!~)wVKH>OJhC9y+G!ON6Yf?jn&8ZP zV8`&ptEJjTlPE()?=hF%-q%gU>|(F@2P1y=B7LyVad2+)~fW0yme|MbK7n*bvp0F}TX;E)6zWdRK|@ z>LOW=vhZH+5Gc@=0f5>ShW>y6u*En`{DdfW_$N{Po9m~5jfvv_^maV99N3A4roPBeXUM0y z&!v}7r2}=h0gsot42MTep-2VKdDaB2c%ZN>LT~b>t=%0hi)>bz#_p@S zVB^(E!f9m!&G^koUZ=m=ORW~kHMv=tdO4Ch1a!6^!2cG%S9{3=Z+zy0vC_tMlI~eS zF~t>ohEbKi$ltg7XU*~mAO!Q-mka(#vCL0tj)V=Le^WCvfzii((@F?D=Na@)tXyuA zb0+bEc4d>^n!JPX0eE<|G3X5P*`6BAUm((rKF$f{%LNUy3~od0dsnE>3v z+}22*`&p$Vk{44{1q8&FI~diz7soT9VlJ`QRUT{^u5l6v%NrMg0S%;KAPV((4Yw1;7q+}rWb$sXf+nS7ks z5L3lVadbj!k^cIOFow6cu9Hs7tKiqGMXZjfzF4{~+q+qqC>AAI59njQda!6s1ql z;(5X{D<+0Vh=`vxwt1}~ zbU486WjgpU&O(Gi_FSyN);1L2)MzL`YQ$647+nME-jVaxo#u;O`Jcv(Qr00;(kpv5 z;RLWB8kV|uqqP#*lz8NGaM>#VM=wyBn}17{-T0}0)DHYpUvZy?6S(irT(5dAEb5d{ z0)$s0Yv;uyM9B$R)=adP&vX?IFr+BMEW-0sA5Des=}4clDn-NqEX;FYM?q-+QMdhMM``|DV4=f)Qih6b zDi^G@+Uwu*BLN8XHcABrz@Sy`i4>#bj3Ya(4oT|5!&oWcmJgB!!yO$Gyp9XXF7)L# z)xu3bZq{4qSRo2BdT8H_n%An~1rfCpFkL$iiiAOj`bRbOawpEEJ|k*Jx-AXmRl;=9 z-;G0|@>6cI|?S*b~e|ksFhP+DFhxPyKT2 z0-Y6=Zrpy<=h)P3C^ObFn5>-=C?1IHmdh zRfOLmMtK>ch$>VrC*Zz3;+A9S_afReqwE|Gmg6G$V-gZDbRzLEC{GOIZf3_#O*3rA zN})hRew*GkFd#8X9n_$rx+$2FhYP#XVeFKuX!7D*8@Q6+k^_aTMDpryXOcSI1^7qy z`{t`evAK`wlrs%A^>C6F`?<=Fee1KV;^h>%W4aT?fs*Mxnm{Y&3o#UOoijm48DyC; zrI)piudJT=W)#fn3jhWa4N&?ylAOGwx(3{)FDh4K*77D)ZgwoxjRH#4L$v=@V(?cm zG9&K$sql*^$YnW~Ke}yNRQ{%HS4$|Lm?&B#yTQbs7LVxTp3t%a^hi}AB0D1R0zS9Rvk6Rje0SkN*8>XVO9Qs zFWCHBUkG%fI1rGqEo!(-fyqe7AvsW)|&C9 zlaqXuiJ-JGHROrvxc#ghU7_mC`q)T#cN<0p@COwJ9kSFV%-<#~=tVYxg_o4rktl6G zx}&p~i~RckZU*Q6pr}O*tgh*egdtZGR@X}O8{ukJH=HvN_ggw>ic40gD&`sxAf&NjsV6|?izs0P?N@Jtg#}Q5$4V+pg)WO>>J9JRaI{m z0wcn6f$91Y!2I9x^wQ}PeQ4xArN5v5xCm&bSI(>pB-3wJSKY@ptnIvIf%GziC9S-8 zG|csU%A+F0=qO8qQfAk=w4nYg{G(`Qh{K-!CCaw7eRV+;pE&OHwR10D8tMRFZ@(Z5Owcn$l zDj!=~j!rzfVp9zdJUrdRR>m)Tbh99Op=gUH&~x?0l=p*neaw6}_LjQ(;ixeqWU%=* ztV9c%GI?q+Tmm2)kQ%fF8B>e!@`}yg-Inem>}a5|X+2$4C)*mBVMfZ?hCOv)<-3Z2 zEBh_l9SC$wrkhNxkd;2`L&l9pioAzr`9Z$T>mH@_a{JdTHDAZBxigd#Qt72#HUqB+ z-qL;;igr=iI)4UAT4l)V^I5x^7S@YT$URiM;FsE(Gm%sSWAe#1@-<&|F zzOS{*wL{(2P-5f!vg8WXp#4?rzYxY2#Q>h<=EyW${;-jn$~`oi$CyL2u0)H4R0eD91inf$1pff%e+o*1OgJiQBTMe!Q|I9hec z3iSaP;jXl_Yg9x&046yqO>3(Q3LTAag}s5EjLa;6Ykjz)e$Wl`^h?m7e4x+zw{8BB z;1KMlLImG@TRO`RFi@O&MvB%FUmSZT_x1?IoS+q105HJMuj*HBvR-B3C(H-dSP1rW zJ5F*EzmEu#gQ~G*|7YVZ{q>esRVDtG_UTbjsh#AF;b_rX1gMTG?jcq)VzSAh4 zhMrn@g^H-`;gXVWKw@UBw+L&^es-r`)iapHQOp1luPUd643XN?bi-g@Ov1yi4o8SVg8C=Oz-1CR3PUio(6lf`w$CE=u-#-S(B z^Up0ntV4KOWb~yi#~~sHYwcZr^$rb3#RM$K0CY=sy z+YII{4yyzVNKW5vsft!{oy_F7z@2e?xW`xQ_&ph(N*Kj@LdCH;IFDFo;ky`)w(((H zp{RUrDyfFKM;>Ry1*#nQOT4z#53s2&mUgQa)qe&U>Y!f()=Ihe%NJ>VSxWVbQ&ZVGo{2LM z*|{J@<44_p6vm&eE(pq+^8k^e;W_yGcg>B9pR>2j0AWXI`iHP0tt|jQ=S^Q-StOGY z4!b%o{y{w-9&{iSjv1cVEBZCspGelt#5O-~OT#7s z0zjc5;6e-D{p2XCK6WjhuF@0XRgpLf11?h$ypK+bqJw?Bi`MSO_c%nUT@D)?)Q}e9 zY*p`^ZOUcdCBRBZqVJFU9!$TQ>@Qi}M~T%-q230e5hrXT-R2wekeDTnLU2AR`!_V# zf)t%TXF)GUOopWq`Qor8jc$@k*Z{{BNtn$tCIzR7Pd?SGJ^Ri?KsCKksrkcC;1YVb zPR7&H{s20YY_IX-@#e-aLSRe4)uFtZryI8nTAu}tyf!u*?~Z-geQyNty5^=>gnU>7 z{B;{^rCco604uwPiX6>3io#*XK;`_JanlI+Izo);2hn+2q@DSx?ul zDLiPh!1+an;2=O7joXLG`oM>IJ>9{vP&0f zJ*B@wp#Cc0>|Z2j0!&$l{2w0xZX-TSJV5ok7JY0VEdSLDbi@0j==|X7&ZZzUV&sz_ zidQN-Nqk3GFrch)>7CCr={t)Q{YV&$&TJT zIH<9TMG{QK+{$IWQ~F@kgGb>`ikoZB}iuqo)SU;sFEE zw-BOMZgb=y(sBA)b=m`r^ANw<%w^iD`uM(TU=IHRr*z7`KX24G&l2CVGU8IW9GLs1 zBnF#KfE@j7P!{wc@O;^}M@}MeIubB^&o3;Jti- zjpi7}J%pjRcRaGF(qt4~nd>2~K7?Y}&n?mng#sw%_+!j#Vx&c2)E0W_RkBEgB~Pi) zr`Muyulrb_s7)fmPQaPROR3q){eAhz;aQo5Gx@H@bn)=?7G^X$^LH^DAGei8lZtD_ zayN(Rm4Jb%+1+6Ha-k=^yYFJXH$AM(`{8=MgwWgLndJ^2phaz77O(lF)#*@<>9slN zDg!ryiXdHGbE_+QE##8j7xsNa9@~|B}n5I+L{zTXRY^}at3_Y z4Hvo(FnCh}n|d0YwIVQznzmm=X$?z^Oxmn-l{&_3J0)1#{q2L4_`twR>SJh<1Vsq|ef;6Vht zEmd9|R|@5^TzoBnFq@|g_`D}JJuZNwLGEq-{_ntS zbEg%+fA3mhkK&>E%36)NzanZW_)l1Av`XokonCUsCjRv=|Kl&kQh=gh$$9yG=9aAM z&&qgIyXGv)?!_~KL8;FkTqmi^%21568iE2ua}*_O2DO*VGKvg^hRivl7!aD9?MxYr z29%ND&Y&pLi51X3^Z7mYeCo29d&{-oqXMs?r(~6_bX`w zhL<(NK;yAjZ-2V=^b!G={%c!>h{x>q-~x|kJ3)2^?hXnyx_OD@Aqy<`qS5q`gG6q1 z>I`-w-y&~dZ8>r{?*Q+5rc_m67pY*e;ft1-Hr97IU38}%5NGqe^18Q^LyLw(q5siK zbch0>78+C55-RXPVz_h1lT}!|{AL>DNtPA!aWfB!maQLl-5mj(EpK(%$2c|a1&o{7 zfQLAp`Y}Y{iKDSdHEt4EK~1YR7SOFr0sl4Pcsx)}Wu)f`BUR?aEN;p{ZF8Zxaee>b z-gt7uQNVEh^74MReEcI@d96}Ln0_NL+0#mP^@ot>Og3Po;)#mPz8zL`FFB6p22^X9 z#?_ViCS56~>+$T@$@`p>?}WUXwgdA_i!k@^r%wUs$^Q@F%cEl71CllYQOVl?U}Oq5-BafTnBu>*|6VhGUL?xI?s1Kt2tiV`wAv^`^+Mlg3H|N zvOa}EPM*VAI2GLJ0&131IjZZsc+Dt;v0~ZmS7)A}Tv7I%?rpe~kzbLPNwPsKAYDw~ zk9sc}_nQbn-SK?X)3W3HJT(COmnH~!rGC4?iuKp^hdd=m8B8;5?{J}9fGRpcii+pUC*(lb3mSmQZp7Q@ zf81l~b=nRH##7e^9MjiIublXrAQAZ#9el?6En{94=I^;hW|p09uTXyH8w=b$Hih6O|) zdfzu5be# zMX)x&e+c>7qE5rChv1NUr?-2T<8Nuda6 zi2+^}Uov91{U%BUj0Y*li+bJl#at>0!NG4RcuwA4@q)Qm6D6n)Q|M z@QgXY8uXaJSE_WKZ!rc~|J~EzblO=NdIRSTX(})!eIqDkMl1%*x$C+J{+|4>va!!^|5OC#y!J!pLi56qbMMVr}?p0li zZkRX-5XoMn12-y5LY6!Av?*UC?Xuuzlc@WPZ=fHlU;=b^odD4vHS zigj@lz#Ya4jVAcDjU}>Rk;lZ)|8F(2N0j!+$@57g>%*U)FJ&y^T?eGhNEVPbXOD{9K51L7znC3Re_|B;=E?@NWk zvDU_x{9aRUz^l*0dnI>$jTZq}(0FCrKY14=r2?&7W&8Qk(#`r5$YqlPw}?rG+-?#X`Z}#Wq~K3F|`1Av?hVM>9oqXy5;z#vgEx( z1r-{L$Uh+B70W{}OEs(G*A|i^Vq7Z7u>h8{n)q~-VKqA%(?SRd!hng8kTKjSe88Dv*{V}IajB%R*jw{HgJ!-Y0e^(LUC`NA@ zoW7A+JoI9kS06T^4VW%YRX{QR&;j0PYn(;l0G=nnme70pOXVRm20k;g6$aw(*>u3= znH}unlgO)RT)K=e_Maj7xby&Jp?pTu?xEHBr{K3gybr8j9t>C%ta#s2rV*YUJ_1~Y z?fl?9yzB2KW$6pSg~S<4!G%PtMbQr~|ELoG(dIoN1{8u3J59nOLQexd6)`$hf71Vz zr{ywROgrI_+3ISb!^vQW17<3tNTy05ZxysUbwq3)X{!=8i3fCJO0{@Qir?cvxSK3b zMV^lH=pN~6&l{>sZwNAb>BFSuAT+2~h~pBbF+K4e8oVgbQdZ{lE`s=CZ@Wek``M;; zxMRN1ATa9@@vBC(ORwlLys3xgFPEj~H#_(V(+?4gfl-eG2i|%woC>pJX|g!Q&XjkD zn!9OsAPi?#k()6P!t4qcMe`)`S|8OG|A-K8jQgLm>L;JCKP?0B!O-da!YbiYufglf zbuyQoJs1Z%=@p!Ukv0HtZ27#cqF9^rT_4I?6=eRI!$-B3fA}|@8dzyntN<9C2SpV2 z@d42a+ujB5vG;**1u?L%Ur;deKnc}vk1{^WSL({XKVEB)PmOF|1I%B`ExlOH{$_d3Bip;#PS&nCjTcJv`CtJ#4eb8`%l?HVwf+5Db;@*OEl!B;L>r5; zb3FkxvRdc6sweN0NAq1@^7R}-Zf)w7_5!So#iy&CgGNNgYoG7u#wqs#XRAgtW)bggZ@cDWqUqF`Bm(iuR+y%b$gI44_v0 zM0VX)E?T|T)Kjw}+p^^8?Bl{(q4?qlRo(C+PiNAALdu)`*8=y-LSiM56zQzsu7hG{m{GqCn>3EkT;La)W> zWYlJ4^+q-+MD*G=d719IuUItfuJ3}@-@|rqKYYmAIl5+T4!oY@Ghs}U-1fLfvPs#u z$)f*S{~D*rGgUxfo|02|DIn!fg{%EGpEfoQkCF=-p?Afc+AlYQo5qj~PxAqIuxzMM z9Oq8d=8UZdh4x52+5c6P!MwE9t?Imbk7DW6_vfpG49Bzm(75^c?C_NV_VV!uz4-a$ zHz*h0#C{s)-r4>E8_$a?%TX?hJuVgcUHH7@8-uK*ySn9Y@lqx;tueK7_4-Q3{sE}e z_4TxPcEuS&@!5U>>$Wn~HIubo8g=y{w$u7S0@T-rfuQi? zE=Ys%${m0sAR5jv1y?Pqx9gICV^aW#+NoRGecO?yj~(95l%rzZYCnwZQ>=VOk z{a4@zKY;m0;gtIB_e&YbaDZV0N zS#;}@_w3;Jm~wHC9#Ds7wf0U3Hol9Dr%mhlpnY`-;@+@{Zc=D@e2*r9F{c=xVF(N( zGB&Ym?Fa>ZI+QZ}zbG3(ME0p7BHQerPJN~Xb)ykg@~^L(cmb9U%Ae!d~$&UWLXcB7gBzrZ@Vzq ziI}F0&=)AruDcOmcNa%KQD+Jaup2!qc~(jK`G8S)TCD5WWs3J@0M8iIfO(yDZ%qOG zLZ5L~I_f7CAi8F|s_Er2Ir7`xEj9YN^Au#IYfnnyr|npzd#&Hd3pDi4&FoOF(70xV zU)nKAJ}CzcEar#wG)}0jtb91tlfcb7O+xatN5m?%^H%u~8*5p$!k&W{t>S;PlE)ze9z?7| z3OkxksB4PaSi*U5O91c^Pi;BeWc}yGlY(zY7Rdz&hkaP;apeS?>OkF44M=oN&!m5L zK%15>3AkeZ#EkRa^TG9V`Uaz%%*-zuz=*G;G)uv-kOMuIqdZtX! zqYd7oq<<`@1``50Lxp!ZRb>e59mT+Wg_0{d8@g_N2FvVB>%^QPde-=J@khEW-9K*{ z4%!z%vIiZH*>(5des;e2A4TCtw?wLfK5vL6XFl=7%sZ}Jxv_E*x_7+8Ujo znuM5Da@wPX&r=b`m@s~fT}ywd$#5c&=;qll_5P$00^fsaj`fx15>)zg!1Ioj_h}#)h+)$cW ziJH2b^7-=OaOvd}Luau++ft2u`_hmqGeG+iazdnEsdc)6Z%*Zt84}j`2?A`mq zzZ+)4`zM|!=3s+Hf`EpgR+pgV;CFIRlfzymxm3r6fec`zfX&4@{~^Y_z5Xz%Lh{bv zvjBkRGqE3>cU?VW$?lKYRU530Q>w~q z4EYvD0hFu(bE1{h?`MX?7oB*~^4#M^RiRscKUleFXcPNCw+ywEry?9$XqCO%ll{23 zH@9YQwrms))wd!p#e9_s%TGRe+Q+YcGO+hlFHn-y{<>nb35@*FK~76V!}x+IFz-b# zFc86a2f&3f53ppX7RHQl)BESEuzc^V%ec$75$F!W#Lw~7M*A>~r&uk3q4Qe=hQ~2~ z?=KV&hjIo|q#m_A-J1G+(htKOcfLqm3**g#DQrVP`wsm0TZU~-$itNJXp$+lm{m=)`8&{I zFASO~;J|Lx`EKv zT;UJ7x}V)R&wm-X{Lm+Se-pe2touJ`;!k7I>@Nd`X5KaVuOt6Z4ZBv-d&<-3gP7{B zHigZ{03y|AoCx$M{_FynI-7|KJ+1Ns`hgLCMP6^f&o5GEf-JOW*fxDldC`LBK%-S= zwoQ)7?|>}6Lc#z&Fa?LN%oOWhp!#bs4E~HNwLt7gT#!oP`j1gK+v(%p%@c~*`v=#g zRUV%X;~L_YgO-K!F?Kqy;l8*TkKQzT+i4@H?g7wZ|m%LD;l>U4rs4`k6}9UZeO^F)M(vb ze=66Z>h8haHGqL8M1$#x`Op|HUQ-u;W85Rdd7qJ?n)&R)q=a_eiz6dV?1k(r3gY4Q zCh3ZIbT32~M0I#%zB%XOo7=SfN6~TGIsYz&j5~3&b=9ml?`^3+)D@;b7csCJmzm1a zcmbQloAu=#a*f87h4*{yIah0hXZOzoVn9Sj)vr3@0W3h)(Z;<52Dha5l@$=A)ycu{ zugsTCcK7`ww=G1hlEWZ3ThtSKnYtx=+movYi_qbWQgcy z9>4|D(f(1GuC=Cxv!MG|5kT>ZsDFmqz5t8HiS+H!2zryoV4vD&xADejV`n`0ae<{@ zzKxk@fZMp&xDpth_CeZT)KYQwyQmunuE#AO-mj+Sw4bl0dm(VZG+E+CSM@I)BbI&U zs6_LQ?$$xe8Ec82xcVBr=_SVJt!-T{7r3&1s19Jr$|KHpyn9}xU{K@26<%IJiAQ3X z4$x|HIF>aJ3{#nG-fi(s8RKkKtP<;qru@Q0U(xMa+eZ0<@V>}a6&2pYN<+wE$k>)f z1~e|GGb~q%_%`;z00op|9$}&(2BR7+m<6aTpLXl}NQ%&{#V^9KeE6xn*>+mH6L>kJ zzvu+5?%L$L3soZ)qP|g99|`q~-{ihO*Mym=%x^U(T`h%n|a511Xae_U{o@tj#luqfp%Swok7 zNpsxwzlfb$47WB$BT>afQlYgpH|hBHVpgPj$9d+2HS3vOBeD; zLfYHX6RJSoeWh83tE5IO7rxR?6Wa@LL}g~{p&3s2VxVS1AXhr))5qB*-)NGD@~VB= z8P3qEw!=Cr7sy4W_&3OTIJiWOObK4hGI6i2WEMwcIQll`^TMaMg<|$TdxV_pLaW!M zp!;1Ky)=U%>d?M$7KYK-dx7dRz+U|b8v^LwTsIF|tvb=}#HcLvLr zgzhNcv^1orp4!f<)Qd`BuCC{4jSTZyV3I_=yb05dXbDEmt=C~q40Oo}ChVMcKA<+( z%ihEQ)5#Z1Ue#PkROuMYYt{(w)2&aXFkf~3lGFuITK2K+t{kV?*{@B!Bf?;Lb!f&I z$Rlh;LZ9(f(~2K`8nrO;%2yFN(pRYN2&O{X^>UgN$a+MbjEGX9`fex?j5))M`z19#$ z+9k*46(2v%Sm0VcqH{?AG0}_R4`ZGonyAk6FQTNLm#5HGk#x&CZkJJW1&%kb14cp@ zV%6)WbHL40u@*qcM(AAY<^uoH8!o)-(Tu}C!(3aw|6b(iOi~tct>1I@&fEVlm3bO) zF=fN=d;mrM<>>rAV+a^W@B;HA#r{?9>t`~S2}|#n6&+z2_V^<)oqYw`9Gf5qub&ki z^cz5vN4v&MA_^BTLMny`&j~0d{3ylA(_Rkh#dVAt2+{+1k`a7EBR_F91PfsnLaX;w z+*91otvs|lwgaiUpfZs$eN5*6i_Xqt?_yI~K<9!p8(?`x*5?e#A|KQbHMQjXUaX?` zO)@pW4|D#M-^qQxGFxg3w*Zae+Ua}sdxKs$o$m zdqBO*r$77HdVuV)b5%W(6}pS==Et95q@UiT4^uMAG#xe z;ynbA#F9q}RJLA={Ede?;>XyFSjt}7Eg78(5jFZ-5adU+p3t#*XrD47le<~TEpVxB zyMI4u)h5qBEDPX1#ZXWT^V<9bCC@>?oEF;WtxYXT@}6Ev=C8I+mNY$`>{e8z!{VA~ z9y*#LB3UfiQp)64Ze(O+0by@-it$X`S*!bCK%I>Wfyw&fCvQjXe+yU|ZfG|wyyPPjjftzZXene~tBYI!3};e(ufu?3P-H#(J{e*daS{ zen9KBgPF4n_z`YNvPq`)VEZ4@N0YVFWWWWSi`K~J?1h&=8*Q8XzuIUO|3e#X^tu0O zqb({b>WmwWs)u`|gsj<(8gB+CS-K9+l#i_CwAX~siFaqT5u6^-TGt#%6VbonF(RMCX6+RW?zH`1+6(^Ei&tqyVz0FIZg`#SJx{LP_;t!Xh>yv zlLIZxcOveev2kZ#fK=%O2(w~!=)&>}u=`?usUYR9X{&TV)AWA76Cy@=j{vAY0l;K? z`7tPhypcD&_cHq+wM11fqEpjlU~*^tiJM;0I3T-^JyP@o)}}T$ah8i3gLl`I7)vd> zM6CQ|Ydrl(8$A=R5o&ZTG+{x)tyaV)(S0SmEP&mz9Wh6?0R=&sb}o@u9&1r7drbZQ zti|vxuM!3c$mCJ_#TQj|#4Ll8mg)?AHOW8;Wwt&kN}17hA2Ja@MN`$V1&CbyQ9sfN zm@yYX8l~lI6*FAEx#v@jvT`(-gT<`+4*6KseJ5o3(QY2nZYaRr8@3z9T)V}=KLyO1 z-r!-N^uH-mS3yteM>!&JdwX*6(U>^3TBHYiU{OpUe{UDVEsD51;t;r5vB$Qq1h0tL`^No>V2-1 zcW8IS>yowx+eW1eZu@{82d6F@d>4@T{Q2UR`M!vF#j13;d%sW9U{$&nF0c~w^jvOw-czntoChD$CxU+l_xO_S@V?H&bzxzw5$E13(CJ}VsHmiv( zptNY@{zRn!$)gc=^6_gq;D!~mLq4WNOw8_6)AruzH_`!sIbyL&h{>~437rr((4WH011C2N%K~>&HKMNK^QFL z!%ve6F?bpvrcCx@Nyr8L-ojUTW6?JOmd6Lv{2On4n0Yec(0bVpP2%=ONVhK`!=WhP ztZ@-OUWBg84fH^BVZUjUR? zBWj~)xUbAt=>}OS-CxT00EC1Sy@9*RYYXv<7W9w45Fy}vaY{B_ejV7dL+r9K7%iyx ze|J{wulz3S)-K_D$6Av2E*A2J2e^7v9sv%EMFfS#hDRF}fF5Rj7A3#`{*ymi^W)y2 z;(rk6r~3S_59vTKJ(bkQRl6Fp8<_LyfZE>bS(1>^JCf)6snI+tbx*E38nt?JeCZT^ zyW|pNXjQfAa20+%fF1^BoOUCZds*;1X!NZ3QOnjCzI=&I9=BhAsI>(Nj5Hn7wR$ow-E1F#gMY6MLA;64x~7w)GL<&uG&IZQmdlW^?a5qdz+GuFl3HS%-6 zF{yyFWL}5=8-DYm&(O3(Ogov8UR&JmvU?T8aC3h^)e&^!w_ocx>DAfTxg?!e@k!0d z#B&kCRYnPgQ}UYX)gT!)2^8|wESUV6yO}F#k9L^ui4VW_Byy^EKjS&q9m;g?wG+(Q zmA3cbe(rgoCp^j4VL#Dv2;-*<-|#Xp?2NK$9E0kwvuDr9)PuFh$8_e^BwLy|AIe;| zFuWAuI!AB)eqEmqjPo0;K?*$EpaiD@)*Ws-csmkoPv1_!ZzuGAT!(4}Sr09u$cr+S z$W}RIE5lE?f_DyC-K+-=y-0ALJr5Jiu(bUeH-u=XGH#nbtOmDK)hy_+Q22vSA#-Yn z&(4+c%Ur6>`O9#pnuToiJXRaJl?{D^B%Z?D4PS=~t8Ltx6Q(D0C3!{ys?fcj^Q|Cn zV1B+|C=g2r3#$v{3Ki#?%nL@};;GxLl(yb_TwQ{h19^ zXsEZa?rmAjj9sx%$}Nt9v9tJLMf4xM1))|!yiiFw7?=e>DE9(gPN*KdV~+*E#fr>) z2tG?fNN-W!OA$PSv7b@#>WXuyqu-CJOGk>IKeAIMOigCW%0*B~$#R)Psqse|ymqVo z>q~KG{{Cp^wsSuN5|7yy<87|PAJrx?5Gf(_PQ$(cJ$Sd9Z`!D(cb}TxcSZd>T)a6k z4I58W>=T3o&rP*FZ;6>LnvnH%at( zS-Rca?)SI7M$z#t&t!j2WxdUMwjL`x;+dMEjSJ)s3pp^DnDxqA;q9I?V-&zkh(RT- zS4d{+U1YKZWQt?#Wd*?xBEMp>jt~u$EPQLp{m}HYE_*tfX}!(f(;g0wR6mGvy+nwN z%TDx)7pxIEUW*!MnBh0fijrV?%r~z}qDr>qwPvCE!k?pXjdRvl1+CC+F-^@0+|TS& z6vnB>Zh}`TVt7sFo91-|Qdn0Y1;sjb6NcL29MIFsyT~Ae$kj-a9S@X3eTJX5aj8Nw z_LEEkNMeM9HX+qf(8U-BH$<@ANxWa?Ye?Mj-YvU`g<~O@1tQoPJ(uB9YaW8@;y%{l z=gl{~LQNbKV76?^oYBmQ>~uS>JGPdG(BXkIUggXP2ifIoV>*^NKRyduXTDNs2V2D~ zSvGZZUCmQoH}O~eU}85Hzlw>#)49!lhRTk@UJP5OOvjD%^-@poV(d3A)BIL2ueG{U z1KFmbg&SGHgN5bIJdY^Kb`r(ja+|g6NZ}0i#%u@=t+ixo9vYN`%A!W{?|uyw)l75+&OL*R0U>! z7rt$WBkLcE!Vwire|ejHI(A9AEGVh#HiDdHoKZg*yfl;%9(&K|s*U+MXE&LUh!F~e z_~QYa#89I6`rw(@@kI0A5FZRLdlkb&xA@PQ`G>su#I^p}}rF`FI1G?q#64#a<6K zXaDtuCkD80xXr-$h$-3A;1H8{9bYLzP1~d%6kK{;VD9uI;+f*Y)CP&x)!#XazHm-;Se}+3Ij*iy({dH#`r-tj#$`;WQtkN1vaG!a2&8 zkcW16!QAZ0TcwB+ot~Hazi!l$&o)J|52_7i1wm^Ci*vBGhjLoOF1?gz#>J=K zaRE*s2(|yI+_xWlk5JvypxaTckC zHwb4|Kf-eyRJQq`Q;25z%?t#86%T`r@%>=i6df$Hm?Vs=1o2zxr^@&}H?`@FtjS*e zQhvvLm7ic{{%NVuy_XKR;!t1BtkX(SzJ65A^i&z5@d>%}{591oEbcul0gEych=|FyWSI5Z_}8n|o0j+)8|4Rz@JUK^=ul zV1B{Y{OYLSXH($>{{xoVq;BCxE)y)5X-gg#cBk;VkLh9=C$W{t&YQ?ij;RTT9fda^I6^-bXDZ6Z zqN}pD`CY2VaQV{Q%S;8TgM898wvMs zYu#1JioLU%8tJmI--MJP3;^SIHEzebhaPafA){<|&b%sZuH4bH^I53 zYc~^|T*r=0J4t5gRQeU9fFG<9_MXLtE-S>6jJ=n>x*)f3713Th(xV#+ktJk7hUUeR zll!*b$fV>Nhj1O?bwd#f?aA8~gOzz)Cy8u$$n3~UitQB+%xLJ!EV#|AEARa6>j3WX zeO%=xGxAGIHek)0CkaNOjYGKU7{#HR2)13%#>^aM8zgi^MP|smv|E+p1)QyCjxirp z?AW3o#{4S`=hblfrl1eFbkPxdj{sCu53pb1y^Lf8&K>bv8Go#dA2;2WyRr8rjunMC zRVFMH-gAAuCC%6@^0RjlL{pmoO0MVG)yIVdK6e#0%)qX4OXi;!mBI41603SY*iF-= zEDXb!rYVYSx&vgbg|20k9D!~NNip|kk9>QmQ=$sS>xALf0=KoWoI-2^FBiXoNO$y` z$0swE0s%Rwcvo@rpFUk0=ot-dNwWT$u;Tb%fE6a(g25nbk)Yx-I)f8_;8Q$-9NN34 zri0l_zpTSRYYD=*zklJ9K=$kfvY_s^CI1BGPxi)QxcIWi>|sQ5=Mf$K7_9{mkXyEi?jY`}CE6aafp(bXJ7%Ce z#wdQRe&&s=9}vXrT=CJ)7vo^)IkFRp!&E2R&y?ApXpRmG(5b@*xk6O9^XIwqU-e5b z&4LJdgV$e4ac~mvUFjp*4&Jw zl=EYtJZh{UXHR(R6Ync8&XP;wZ|LkCm)Y(ILVmQcgNNUi6S}!BF+j3=HkubBn&Is0 zm}NV@t7|rQ8!8P0Oz@|Gs)N#i<4*EC%B<5xj`&_9WV?|TkRpoGy?|X6y9!dA)(fch zTqu7mkRaqLXM;BMI=Fud8GhQe$hHk=1K6IGvM*9Zy7!9GL5lpsyq@HyfDIKc4!ct9 z0IL{G=>~rV==Yu%l_$fh&H_{gw8ci-5(nM11PX#_IkYO_=qG$~eroUcA{4WZT{T6` z%5F+Dg#Hb+|AsJsVe>#40H5}3ZJ=?@p*#;^MzRb2aKc%ayIKn02J8)9uYoP9I{VqQ;~@mAm?sNKIh~wIZ1=tG%E#1KAJ@xAx^w< zNqlctycOG^7cLCF(v&;e4QxP?vpxe*D3=|2)OKGrPmm z5avCNIV)CVjdyk>MHl`7qMu^=o#Uc#&3=Wc^8@Px1=O?;$P^; z#yL~2B1|EHxv)DL8J!a^E$b{N`!C#zb#mD{mVB6KF-Fl380l+IPCh+%4#ew&xxq)V z%3zbB*}j+B^~_q*>6PUIv)W5i)$#7HR3NL#DFWK&`L#k>FO-|T#({l#Kk}rP?MVp% zc|Ig5^N18rvqER2V1GI z*x74@dT(@!!p^0Hs~r%bxQv^4&IgS@t_A+{Ojb%Geu)_3K4}gN znL$XWp1=L+xZ_%$W_?w*A%N0(!@c-ME+IogZX3e^J8w&vVuO0I4iI5Iru1eQSb6xV z-oxQ=*v9kWVx47%P&Gm;aCxwB9_U(O|K&UbzDJ_m?NjaFA{+OW4uc^~F@B$bvwMNP zbu;O+Q~lS+sh-O~NY>b}6Z%sig2dFbQ*A>} z@yEHQ3s<8yoZw0b-4PkLN8gu*`V4Jmd8|hEHy$AQ?Oqwo#QO-za~u?~fvY)JA0pbo zMFuu-;qMn$xrfa%UFMXJKDh#<&&HF)$5z05wpZctxfw7Fous`;X7%>^p{6DnjjSdF zy9rw7cPwb-I)Db)n|3aFTYZb#aLD@mj76;ADF6=Y4LxPTe%vXtCIg=MX|M|!=)lpz zuSwv`bIcIF;X*D2zkm|87X&W!WzByL7?~JWuuZGp1eeX1^D&CPVS~@V{yUBU%#8WE zxKdNMnc&6RW|AGQ7cu*V%&)d~^r$G_ti__I>{L=BwPyofIa+5Uk^s^sRB{F&ZB~ob z^i%p&D>wCD0R+x~70>))LT)Cib>YmZ2L0p?6JU0bPX{nNC^T5lZ@>LkU#EX+X6M=r@~CMeBxI$% z8lC#?5tNcJroTJHtDM9yjL%%OSTGKmS$jX6@2uK5YdtZr?%+;tGBR6V?I@RT^RTW1 zx7lL$1hM;FrObMbsrTS*i+$U%Ys?A_00;v0Q}#@;{g+<5vHT9;CuhgdhDW5aZYOFg zeF99M?)917HKLAG(Z~p*i`Ob~q z#D{m?X4zUg2Tk_RBemAulb@L%yGBUhsOHrlMMKk5)?=ZA1}XBfPK&n$scY9$4(~H0 z2KCW2Z2f6k^z#_b$w9Z&jLAB7Gg{U#OU7nDSJwRsKC;T7XG^g=%RSyTb$BFyH7qMO zNoh6KNq=Z`Px#G4{7T)(J>f=sZqk=J45L9WKW{X&WYu9o*D;5DDR zcf)30)tbGH+95t&2vR&JTF&1cTD z-N3%Do@wt=vkKzfm*bR-aEqr2((b2-bGL>gZnLB|he@{P2L0_9B;AN;Ni_Za|SSXH}<(-Rq`qru4W?!_#jL`*ons}&N9Lp%_^cuTe*S2No6-6?#%A#D+4=7-- zKaIYc;v(K&+2N3o8*M)>ARh!*zcFh`KoMV+ZmmEUWm3QuP=ggeh~b{_@HEzbcRRK6 zlcIC!bg1~^xt!jK10GW<+5`x5V(w1UU;3uVq#@f;`yT@P5>T=WKkT1)!9 zecxfzrzV3Rx)Og4N|35Q5M^BSF;xpbyY84WYDLSDfq$#e-MJunteKA_^;y1bl(o@@ za~#_)w<}jjkqPpF6(3o)L+wTq>&(2B6o=XYciXzlFESPbokl=YZd`D07GTctg_uQ^ z@?y%nt|AQ9vQvl$z76S~?gL4HUsA$mXeqvVTwWAYYG~>*hI;*}ekgT$_^z{Cby~`l zK50@gk+xkQ%Rb$Pp0p>a=rEcCXqR>yinNd4jWrK_DUe8AcmSNuQ(W&T072wu_gVit z?vsu@B}yX4`aLh*mSi*sFVPjKyWDkQOURc|Z`$8vzv_rRt#~g7zVMCAT~+1MV=>Qj zvV1zMwawftkW#zLlGhXXJ%~fs!SD_arwLk5yy8}Xg}e1vK{qm(8Y-%`xyaSH+u8V( zhK?D6b-#&RHhY`L%+GVeO5rf)}|q31aKwHL-S%Ld1f zcL&D03@3+#N;1e0=Fy$m0JuV2&pDXz@7UnTPBHaQJVw;kYyU6Zueg>_5%y2^cm}yV zHIsltfO?zUO?G`eq7~Vva{q4EK$cbTj0IO(6TTbTCOK>At_v*m+MQjW^IMn8xu-aNJkTi+oemFtn4UkdTs`;*YA-L!*vwPGB*Z6cQ& z#v3}kY+LTo3w~TN*m>9DiLrW+RDjgX0WUB!E2X|2c}bEl&9hUa(ttYK4=j{+vr#Ko z5XBu!hx{)+8vm<6-08)F@;+LTqXJ9AzH~Svk3}ytt(bWEHcw%?WEQz-4{~{<59={M zs-Ljhr|f1e|JbAE8aN;>T=Lk5eR& z&1DnEXl0m3C9Dc{*kng@R z%YVRDACPgA_Nt4x>9v9}4@Ex}PdU8snyQZ|?Vl_>E7_({5yNVaDb1~FOVwr%RqjCt zZvM5)Yn8d^EqdY(OT$Sa8)0dz|5VGLy{p@1qC$gE`91jf z={@0oimw{GIPdKHRMm**8qBa^a~6+-T%P7CT!;zDx;8;-UGQqMoZLVBB$lK^+?+P2 zwCjfqq_H6*D%{8&m_)jbpvkpp;?t+uORU-7Vm_Zf=*$oOAeQ zZ;a?MNZ7QFM zIh1R>s8{GE%r8Bc7%Is$5`&%tEgBYnRKO=pIDiSxn2=Dsd$UgHZY-thaOtMpV_#Kd z@fuFLdZ7MS&eh?RLzxg&U0@`H_neISNPcNeIKhZzbiPZCwm8eb#fG5^&szi8@*aD2IltctxL=tBmZX(?E%{R{d7>s7QA+v0Fb=ULiE=L+?q zJJ!Wk<_#gmc9I4;giWcOq+I$Rwh#_l=z5FZl6;kv^T9s{cEbOM{4S&nat&V9q6_d?e*Q|ocTwvUINdLMyCDKf7s7A#wIB@&W$`BSY zOY2GQ<8L}Fo|yT0N{;fL(D2(?mx?!j|H7`CUp$ZGmVpFZFA#;g+6@XnBN0AJTP=4* zk5AGg`uI-Z)L8rVH=-p;dJ%C%x8Kt`l?qJJaOJG}^W|v?eUKH}KJ+8bM&H6bk=$zX zy_Y*nW$+wA@QeJ+;)V#~57m>I9J2*7- z(0aG`Vq$Islbq5SyZKZlzAudYb4MtDY5 zQ+LGau7k;+9mS`Qj-vE#^Zdh;7T~WOeMdh`jjWJIdJJ6!q=eSwu+W$Rhi(+uzXc6h>lwe%$(U7`YEw35N>b+muPebkVEMD|W-fJ#P^&Yih88XAVxL%+$B#|P7dC#Q-7dB*v+P0y z%0kQdNjXS5SQ-+1yI!LI*4WBDA7WP@KQ>(KmYLa1mJ>%kNZA|sM-0)cgya{RgFy!9hYKs2!iqREQ=jgwz|Jx@f@WHAbUKaG`| zS)}}>^D|Tj4)^W}&F^I7F&Dz9q7tA9z`5PU>Iu{5LKkEe9)^UbIh;S#hJ2}8<&1|Q zW*oLhWk@5UEnV&fP*#f}x4#p9#k~*F{6zm;a?@fJpXK$0#IF}KSfgW7EY=kC2Mvbw zb>E^fD>rf6Yd3T1GFs+~=LrE9hKZ{TF}=%FP#1XLu3}`4&ClBhk!>x>5Ej;l$&%_a zd3NOr=KWQK%2cNjwj^>=K=x?f#cwh~SFI#x9+YxCaoZ9QhW5?HkL~F9K$zg_ zbk$hh))!%on96gXbMk-da8oZt?4xs60?tU~ja}#8BJkf|{vXIvqY9jgp;A%c$wdIb{gr~zf>YTnU zZKC^uS?`m&RjHagcs%FydxyB(Pqr8jKK)H~GJwB&WgJ1%_0VNNwD z&yY8_Zkg%6E}LTfi`j4$RCi=F-mO{~s&H&nOuG)S@p^ zFoq%uCg!wewYvYh6}d5XT2PVs?7Y(Xtv*RL%es9V3ELy_9(U8&mmfJ?fNQTSyh_TQ zH=nv=HHedgX+}6y7^}F`zpV05-r2Vuj9-dwFa1jfQZQzU~S-t|9XwjIphK5`D zrTqALBQ?YTbnvHFD$w1J1cH|Msti-zk-Lo$d_4DRtn%4cP)f8fhHjU~FKd47Zb^$O zUE$9pK1u&RgPPX}w>cDMEGNL#G{PHe+t zetdorO5LPSkA+cWdp;|6;{6(cFpGcuG zj0h;;(?@Q8(cR;H5eQcMU2k|=i|QhuS%07|O6=qnY$RDa$KD#1xhvzmft>Yr+(pol zY**{Lmch1hH__}fG)3G~33@6H4+$(>T)jN!t)A|Y#~+P1Nmldj)C%A zll#(tWEey@=s%Z#U9muj7>{>-mCE0E^p46$o#KvNS`#>REm|jm0yvme@E)Q10lZ@j<_qQV0tHCz2jxJ z{-PoPw0AWOWo`hb_WaVB(FUeb$`LnXlEH^jcs>+G^HABUa2SS+ltiawI&8XThY*K` z2-*qtfJ=4ne!FkcZ@?OB_1e0d2M$0s7Q)<$Efd|e;BNN%;(@PM9&KG6mJdZrbv>~> z)p74ntPPA}8sWZT&#H#aW`~7DoGuDy?F-#1NXF3fI70w>!c*3g_lU z`4m}=E!iV&`OmpRjJlRiN>M#$s_?;0c-I( zWh7;?VXVi=s>>k2nzdxi<5E=3Jm)j{3{e`cep3TK@}PP835d@e#!lI%Ao$cZjK-6KYklBbip4 z2F~76Yi{q22A!qYan+eVze*(_z0A~22(tiuL-2bH{FdeXBmbTSpfXhrg;1~Us?df6 zdmibkQ141x)Z2q?e>-AawM1Q=T)59va`l3`HDypD=_7!I^%m(04J-W^&G$dEZHa}Z zD!Gqr?d@sYxlb`9NpX4KlPWj!cZuo*0j(np8cgb_`ebi)1(P~{1~y)l5L&b;w}FfE z5YTBR`F_=;YIQ-M{9F_NL=#N?6BY2qS9DP%2WSITvm$8p_pvVloFh9G0rvqyJ@r}r zBLMz4g~+ce0N#T|Y31)dtTQcw;2fJWYeCy}0%_im#8UtXTTEed9@DWvwiAJh8-hjksst0COwu zGh~AY7fm!QFR)qL<6k8%{J|vhjn*V zGn+Y6Ovwo1UpcG&5POTJwQ5(~1Q(vBbBf;g3OfEEu{Ygwf8Q%btBVIiYVS!!BAUq&YSBbV`P`BrP%3)(|~iO zxzjeeVk66#xLKhM^$)&N`YI`m)=@Z4F>S9V_sWNM(DT!`CKhjvm=`G$d@;eEe+nBa zd=Cqy$-4iU?rurI%~mJP1D-6E#DM58#p6#_mm~f_&-MHtMWy#guhNx7o*qeuK4mq@ z4n1sKUsTn$!}fw4(&Q-=^rxG9=+j&!US4j%W+Es68}ZT%_K_c#E9RShrc%tZ@|`u!^fliS-#5f6QVV(wx~F&+Ogt zT=g9RoNQ6}%2s(ZT<(Q#hdR0u9qML(#>1$~3DrduIDiWq!78Dvvwjd_X}(J!Y`JQx z(^mF^Yl4 z*q?9I&md;1gr|6p5E}a}a!GIKxa;jsw2Y_Ll`w5)rJ<|S5L-S8352xowk!wgk3b&X zyu&~HCt}apoO-(^`BzwbDk#KA+9o-iQ+O6c8+0Wsjy7I>&)pxg6$C{;b+R~Qu%*QZ3@Ep}J&}pkovUHCaN+1+Lf|rQG8fF=j3t_#^^}oCN=t zt=d1c4THq$-~Rh|h@Zc0DSDscRX>>RbdOo92?!(D_Z=~92kgQ?HQ@8||BZVH*tGTk zU-!_z9gg_Pu=mKzQ|L_j3kO&0r|!6tbp_J7b&zr5no!NqU5DAckFTf`MdJD zX*r0MzRRWsg_z76suYDwo9x8g(XQ~X!c^vzOAYeIhH|}r2B!S+9#>^>MrA@#Obxrq zTOCKbUOG}tu6equiw*c`8*-`cwZ|=#8ONB9J$!>Zd#>*c*%sH1(w5Zu_8XQ=CHJ)Z z?pB3?WbNG{%OrF#w@RW*o;Y}0?$<@O?T~_N2JdROs@ye=8)s|9w&eFL7!~jrP?^Jx z<1nxRjc%(|NqL$>?P_4RMN9nOTt1&=segS0jwLKD1HXj%T`v5;xHYpRafP`icrhU9 zlT$kr)q3k~y_YSW-52yt+a!N2qdy^;tDCv`EU3p@(xPp(;OEUka^L@m<SFT9@f9KL%6>#(3Qg40~* zU3h1k#2#nTuar{Yei19{`SVk`udfJ;2&QJgfAphUk4)(C# z%q9?#1wkp>4kOjmaAMlDlNH5@Am|vOIEC&uYnxmEMEh{LWi@h&0NuV^w=H2p{`#qD zBSL++nbWVorx9^@`8m~Bd(k}}98^4aGTzi>5VYQRY@J(yOoa0COT#;i=S+tgv5&C# z2d|a~d|TPoh0=JLSDN`*TVzl~T?Sm24!Va9vU% zgkE#+Ie#dC{fLI$jg?CoNg^3Y_ubnshT&Z@#sI(B2E>icNYft;zYwT_F#Nag?m(S! zcf_JG^z@;iIPst-eR_IjOWuH&aEWLE`7ZeGH~$xR?-|u}x^@rGs3R!SWE80p5U>&v z>5zyhh^W|xA{~^d^iBv#M3f>;Y=|@w6_6Sckd~+*MM5G1q4yGmKp=qt34#9|XLRPA z01;WZ&aEmK(Z9Yj@F@WkFr0HuR>Miem*qS=V%WLhD?D}8**H=Sp)O4omrS`h zE@^juw~Yuv^@D?Pk(gl>;o7ZGG9=EMXGrD3pE4cV7c@eF2iJ02;LKrLL` z%~~v2%6`%Js~yc3=AZAmrX3%&63NZEhGpVZ8=9i4JpZR=s(&tGzUhDIrVIvo8~wrl z>V6L0u7g4sn&iC4|mjBosPJyEfqfyOjL2A#%Nt=Jffn3*gZE* zMY+gs?Mt=v(QX}(tlQE$nI*1@febjA*{|0SPhXxGeGFLInvy$MCvRo-@e=~ug$Cle|vB;$k6_oigbY=Gd39mM!y!43-cx*F)td`A_;cErrP+)9?F zIboqB{FYRsSJR{*Spx z&@&AEsm5!y&GOWnpEbWK&nt48>gEb?GmvNrL+UP>wkt{i7bi`y zQ_U`mPF#=)>Z2zj(ouUBHpuRNeYR91u(lL z{KhnIsfSnO0tYj{M`v>kg%B9aB@u3&7y|3Z?4?591Qu-sBBk^vDL88jg2vR=+}Mx} z=}186$JLVci4mf#sk&emxF@myo4D#Ptmgd=i=R^Ze~ZqX?=HSD#F8x`JEE75QpIGR z%e?HIx(WBmKAwW;H%dG)wWThn*z+IOLS_;cW01)j6KZ^U;LP@r9kPRa~u6V zwn}mJ#9Y(3NrX4>IezcSQD5T?JuB!o#qDs|by9gJv7TBcyf8Zao7wqB(+gqogNzRh z25o7@fE{{+nHi~y$#xY4%cN9xOg=6CEb3Rg+MQpIcKO_&&>abPm@j`c*m%4up4&`4 z1ts}zSu83IRB$Oh*8?-OUA#ph34JVP|!iXfh~kdd0JJ=dgtp3ItGWifhabj>2`_&$s; z)^*F`Ljl1vdoeL3Rl5+O4$Sq^mtR0tmxzjXUK9JLw)ihtnP#)8k`%ds@H>60wdC@N z+L1EK*}$94msZclyin1YN~o1c@{RNrNwnk?kwb_wYJPzAB2edI(K1*FbIWCuE<%gIN z(fx3Ce{n23(vax9TeMG_G8rftx;BDiCLarGJ7{d1UheBYb4JifgcPY>1<~-EPT3aj*I4#QefEAP8Bck> zJ+KUp@C8?#bd=x$W+8y~DdxW??{CWAy0x!T!j#MpKWh|rg4q~=+UP#|gMAQiPN*KO zK6Oe2Psi!K{Y&3+tpfdA3iAn#c<@kOQ_L_%NW*?gX42#BBfXGuub0BqW!bcx=s4oy zdk^fmLbD<%rCeOco1N#0b-kJ;G~8Eo-xU(Tw(ighSSS}~_ohE~jy@7+>#&Rc-e!Z$ z+`UPf(96w6*-H&0w1fLJZs~O1s_W9hXd(PKVy^iaGfMSeLxG`p|oUNT-TznR@rbqvLk{- z%v6isLO(=q=t?pUa1t4wYu4_xtQ|7^OqER$y-vnW)M_W1*z$(Uo!&SX5ww>?gSE;` zPLr2xM@ek08Fp?lM}~>UDJ-p|wR^oFob?kJa=uNyogGV3Y>%kGym>djDJtU+M@NPD z9q)zwOPY1@1wn(tW;*H{r68D`EH+WN2f z928FnFfFK9A`J<$H$eBpcjMAe)h}MZ{H^>wvT*YMQ2zckS|to*LuY~ZSH^f;NaEce zk8LljB;58g-w_G2R1iWU)_44#B|@)Jk%T;fUiuoHik5v-lJ4JU-03mXhC0jVX!qqw zN=Y%9`LND$(QckfBPw!fQG$Ja^dx2kYJn5W0!ol{Ng6v3e#%1S_pYNW+2z|c9>E`% zcZ6Ky9;qcs%sDrT!2k?V=d55%kTCGGR;5w*< zZ4CPsjFlg;=jS|F%Jr+`V!k!sy6%6S9sF5S>A>rr)|@*2m!igmM>E;)V5b6Dern5e zW~5M~Q+?ej1-0lDK(1U)XBNqg>WG=BIN37iinBA~Lss@*KbRgBmwpB7=hQ4UDTy$n z-;n_WSxyIrTk@UJPT50xF9QeNXdxE;0F&;Dv-mwcl) zwu3J8JJ!;$@7KEcrS*?PXFBAC2(t|t^es)&(=)Y}sBG6b>atL;D6Vv&DC2%j+10Yu zDk+3nz~z}NvW~H+@p{5i8jNy4ka6b)`g`sAv#{}Jll>=~U10L?XVBG=4S#d|kHHL$ z=i?;k<)BAhhJM@CV)u{lXrI%aY9K1!jJ3JUx`wcrRcK2`Xg~v5LL{)0zjE>E_6lZJ ztq2@Y4zZ4!9T=khvtpvmWIQ@U z;D#l9yVjOEMp$};CC<7PB8`|ftln@J*WHD{!8JG+qCc9xW!7qPi;9aQja_sRw6>B( z%zl^~f5rNDolE8%dwoB)udr`#RLMr&0Bu{%dEVHPRQ*54OaHGU@_nu=Ots*r`ql5^ z=|>yDM>d6HI(SUv;J)JU&Bb^418R%GbkWfnPWF5G`10d?*P{^Q=X7~?PqTy0xE$tkV`-Cqh|091r*RU=Z>JB+DkI>!#RjR+)m9UX6? zb^N|jcc&$g&?8eyZ~~6mx-A~Ey6_ETwH^1W_;kzp{i%?>+{SvkZD$m-f3jOUxqddE z+a(&pdRYJ_d==wR))A>%ZvE~+TQ=GD$LB(csd7-O2uk)S6m8>)2j#6&e};Q|S^gbH z+%jMNG`8})9R+pn>4WB%<9UpM`(sk<0?Ju6v%$wMA$9q<8*%ruVzuHWjz!+l6hIoeYDCWOV?*3S+eRe z8FU*yI36u0K354Aij$4c)i1SgtUuBB!b<}7F8=JI&rDr2RcBY zt1aTM)zTY8@_-ys{p>I5)LIbUg)rwYtf(izWum?G*! z(@&o!*xwJCA?s&{V%Jc#Q1au90$f_uITpv2Fx(ekFv#!! zaP{mChp`cxqcw$tVjBbI%h%kB34sSmId0e4$zW~EFHroln;?y~sKS()pjXdvnrU_3 zP$v;Szjlj}kM^?(f#o`85LPk}y$oPgOAo9|=G7W%54PR;PkaiB*GNHwz zS#@qqT6F|!o0H|Z;~T;P&KB3Xaz`v{!}Xv|(A!cnx(7EH?5}|DT-i_C?^|SLDurQ; zLmreErgUPKLx9k~}aTc{8LO5BVS+ogP%1(OaIzje1WyBkhz{GJTt@7sAi6 zS*!5IBY`YFRPDcZjQ?Pn!fbvzQ&A+x(~jS=%8>!)#f*OaEsOCV^L7pIe1&ikk@)b( zWBc0rGyBz|i3oY(At2HuYq`_*Q};wvBuCVGzyipuz%%#oDo(WcbW3+u{fzz`66++o zQrwL1yjuJeH$_f=S!jvL{e51B)(Sb5` zigerB>jCbMZg6xgBb4w)`likH6GY3SS2GH97MA38&M)$vNvUp&dau#5uzb2VLI)uA z++`I%4hqYlVHb|eNI60L+yQ6sC<20663jX?bmnjP?PsUL>l-`y=djY{-OtT_f^ zP3#f#@vZAX{JK)(cn1U@vgnCj0~^DRcwO(A~QC(mHnUKtBgr*NJ#O zjp>|d6D=spF^~-a%A#R?nwhjlfU~}>Icu$MyN2abHiV2+$XSsZ2-&8*kA&-#4?PmfSt_s&yq!K`)ja${De3Sz1Sdek`bTr&d3Q0=8 zw01 z1Ft`8#m-E3X$7#)cO;!g*GhUq1FmxfM|Y-mSz)4awP#Indlm3u83K2uHzY6gB6Ky5L3Eo|x(efiW=^_ee_@W)+bRu zj`xLEOx8J+!L%cBGi;g3)ag|hIdR?SZrY~>!}2kJt(7tVKj4!n-ft0k!m%GyP^0CMOv;hsF-(o$G}6_JaBm|hJ!KbOhX3MKnTWhCC6P139vbCz-X-C0|#=83^w zLwDu8h>E(R5#NK4q_4}JF&r_@&Iz)ok2pXvXbQt41(}~1O!;DrrJp+B_pQ^~=A7q@ zWp)+9SLJ z++*nFv;-?7*0Nq)Zr^)zC(EkArWAz$_i^2xiG765d=tGx)WMOMPW!clg=}GOewck{ zNm@V%Ymu}>GeFm3Xq5IdcyIQ&ns!Q3Ya5Wpjjt{dvtA;N6O@{v zfN{2jcMAIiwZ|)BNOIy3f>md8vir@^%Flpv5v!~yi82iA6i1JLK;orpDp-)onKP8n z#t{0%Om*ZHx%uN+DmTxp0HJu`g5^9|Ka>o$dF%B*&IgEd$v|cI-*Gt}wj#v_!XZ>k zowTwqSRJxGNx!yk|FgocPQEw9lkpidJ`KisAKeuEEk~_;BpS7437~wNGAlqbe<|e7 zS;b36`p;!tSg#r&UR+I_MWx43$_u2x=4eaZ_0I?43tvZ72!q4ZtlAxZ(&Z5 zlF@(ce4D}Mq6=i^5TH7rHvY<$4E^5z{}ggE+zKdwKnaj=gBmp2{|}}y67w6xM-N>sMy4ZAa5k$F7s z4~Jb=HKsWFRNHob*ssiUiR({qDVobvp#9?T%XZP;majGXU!DKnES9#=Tqcg-;!~zP zH~WaLv^gQXu};(aoCqWk#oMuz&B3&+GL#|T5!1ete&?BeDQ`Iis z8U6!R*)sU*rvSotW+i`viV!1BDuNFxkGx7F?blKGdP)iGxKP%~Ilb$5+3OK+x1|aj&Hnl>xb{9(_>^vC z7!FKeh1UQfM{W1bF*mb~-dw@sRob-q7ZKb>XJjeZnn4>)2(ygV`Y5@oG%FP;CkxjF zu>}l8=?t?@c(L@$K`HcsVhc7{i%8-@po;v zRB-1MMw=J%JmJH!imP{SgXL)Ai#IvC;^QMY`!jFsg+6Zyg{^wgO!WOHpOPzoiItO` z>scrkt68_VQgwV%Er3O4pXlSx7WqQ3Oz!}}g?pUy>Ayh(MnJ4ysv%$|$k*ZRM^jN(~sdUntbS7BG+E0Eijh1wCNFXe?@pjvhHPv?YhNLk;V6jicZF# zMFX9s%}ZuhXQ~vq+gx9dWWk-V!3QDN4usSVE09(>seb~ukj?UhM&tmq9n7RSgQ6h8dyf!I+rlDBClHxvX;yTfOTtp(HUjDf_k@k&9tnhMb)^- z2Ke1dG6^0;tZvn9TBR*D;A9co{ToXN=5dF}c>eD%}j zI^yry>i<5`rm_`$KRi|zj1UCIE(}^ScS6q*6%W-+#Ee$CB3!;moaWZN*}P0T@r;b1 z5j9Bb-!XU6z4GVUN@r{gbzz(l3(((@yWyNQ^J8%N|mx z{`Ko!D9&QPZ|1%;XBFch*0+of-aZkjvlc0%THBExkq5WhWY)7&0!= zCF-gMF_CtH`Z;MUbmvT^ykygqBd!2?Bq#oC&1&1MELfsNMg<2f3IVBWc8x?IyK^GG zZ?F*T@G&*^i?NTpLogULtJV7bXTIn0BF^4&OoT%DM)9ws2vX#guDE~UQV;~5#> z?Dxn5wYW;K|3dYsqD7^KE1P&|@!hy>6jk$Pz;)t4Db~}63q$p|4v-`u>R+LJ^keR9 zdwoh5mdW=w?xzs%^{aelfiQIi!pP$*`W@B zFYm7|RcHAo_LD80EIYeI>1Vb$VcA!m%b=BbE*^lrPDA_1Rfof(1>Qw76DDZvwi4kE zw!u-c)ez`)vPfJ0d)Q)@l2h8^VM5$b0mdDmj?mxu=Dh5~cR^d`OGW2NxVTkgYUU47j#`DTT9i=5YXx?* zGXmdIZVd3O?pZZzgIB>b&jM$Ar)&ePZIAFmy5Gt!b19Rz1{1an7*p`$_KrzR;+ z`N~=Co@tBqGpXUhCRkt4yRAHSRx~qdn|p?dM5sg!#E&@xgAD&>g*v&8@<;GpylKUo zu}o<-PL!CmZj)|HI%abTkZx*v;0p(Copz}`U$YA0pXZ?4X&>%JpK(j49i!?2*}8V) zjtUVRxsDkBQiJ}7#|dt{6;iRG<|<$p^_Q(doSp$ZZ%w|H-5R?CIfvB-d+Z(^S;M^D|0w4BH!K~-n+g^OXl7P?g6+wlS8yXdW~@GW>3-$_(0l9Fcfbxl zS~EQSr{*WJx$A@F|(cO!IBhYK|yf6dmzMZ3j+**Nd3!RO|U=g!8_pk@@cFRKUH~VexWT0 zIMt({Nh+>Uj}M+EFbGhv(tM3^ERlVaS{<}}$BZ*6*1mf=)AT789^$v$q5r2)Y8Llx z84BbJlvn6EPaF4qKj8mt%x6`3Q|s|95SsB^agZgAr+;pI`=QTSUu(N>-2b0;=?Iw) zrlDr6@MG5aEA9-i1=e-B)RR+MqmjqX+&cKM8LSp8wBk7nbJu9qo8F}Tfh;2sj(y16 zX)f>Vrt0Tlt&(L}c>94ea zACGKbG(H|lbTD))TCaW;swSk-&Q%45%yTaf;e^z#l}gwyXnHY z5x%efa%OmUO5q?&-jkbEIqsp|T9C#G|A&YDKinHGne2?MaviHLt%FpoURg7ol1ps! zM#;?Y=vKa#siGe>FaH{m-?w^9(s99{{?dC3IHfbYC9YyREj3DU3dWoR{048bH1bbITv}oHi$Xauvw;dAA`> zHm%0n0s8KJIJ7CP>8i6vT9T0kUXFM!F-*EM7SSxS7a8eDj<_w@QUJ$L5bi0y90Sxw z-=Zx1a$}=xHL@gE4T_(PG%k{$x}iytSnHag9T@{}u~>vuDlBYUbE ztkXviFq!h6c$uG@0XyXHyld27GVFY5O2|qIDO?bN$Hfh_8DKNGQHSw+Sx21=JEy2= zu;aJvP9(d|$tk0PrEsE6F^`3l1>dJ;U~sTGN=KcnDj|SumWRGSkxiAgAIURYd$BNQ zJnMT}4{_{s$)W-j--$~ojy;ah)1ccWwu%dDrJj;~B5iZCMxd!i&6ycCfAa?O{L+Md zqOH)%tO0ZfqsXPm$Wnn~0frD-Z?a-WjaF`0m6dNW+dquV^VCCK$9bZ)BFgopVEJ*q zl$@plSb5AxV4m61U|KCW_1GS`AXEPBQGo-g@KHBswCat?{TVMYs9=>Rddj-#Js*>h zM7Q65;L^o7`05f$ef|rP1N?5QV;EQZ*@S(cBoHa*@SHySBMUs^;g!N_mSo_dqUobk zlkJEn#CRBc!du&=J3KLHZK20=vO3Bl?l2Qi+oYWLC=uydJ~GajhG1X174<8PUDK5v z7F9|SUt{o%y_OJuCpV?9 zG^YQKsguDh4SjQgGl5*2k^IZ_+4c8OoH#PELmWvhI7j{D`16OnbAyr+c*;@b$8`1A z?E}PIfy>bCJ!}C{DMzbT)I^%BF>1Tj2)#eTvP+>;GJgq%MWDFugjIQt-aH)-07ub)A(tg+%o8nf$NI`D1-~beYG^^={Rr zc_1KiYfcNsQ+-kz7^`BKb#~+h&L=tHn7xYkoR!&VDyJxB*L0#i{E2jic=3JrVu@YI{Dq6FXqj>%}NFt7Ew^^VKQkwR6)=O?J%mb7^H$=fv2gU1Qy=%uw<7yd|9vfQNWi zUp?!aM@|cbd(NsV$lI#I?^;$5&sdMZ?IAowGRK>r$7=)%hW_b_qkfaOsDTs41ZiG! z4mm3FbKg5J?1nE5DC{k#^v$7c)UB$zH*e#>wqhw)rx%cWX~z*y#3w3`UA^<7?3@&a zKfv#>;%kj?ebxDc&pf#}oUz%N=gm!$5~M4hFUn_C%kWE2GdCi;)pCpRtVv30eHC$w z^PIA>x`^9^2st*kq*$F83e^dDlaYMSGUViYu??GIYswOxV@XY@P}aRX(GU?|EtI*h zpuMdAz^)Gp5vm0x5JIbY1K#XtIUlb;tOzkW7Ux|I!vP=Jo8}0 z35h(-0_PsKPyaI==M-OpNk8O5y+&ND5oAiqnRpLIGg74Y0sFTXOLm}bZO70Iw{ZIW-)a}8nD>{ zwy(&Oi;VG2$|+uiE7w?@RyennvtVr@gP#w>=0ZC$0VOu{P4PNU^_;U3S$0z$WouO_ zoND0*u2|&pBsEl+4^@A$uYq&l-o}o^r3*i>_8?pvOg8F2PZ>`a4l$e?;Hss~#rTl* z7at@NR>sCUo#PMmxR=>3R)^0>4J;WAA=(4+%v1(2FRifgdjH#%;%1F0E=qNi;m*JO zV`q}zbw*b$c&?E982D7DO@AGTe>Y3Abmj-&OziS*N={gtQU7lXM@=V}Y-Q%<x|vVQVBCbdVZp;^;yhS#$__u0`Ah`et_bR4tcqMU6RjD$%)(A{I0cz6)vT!e;hpe z(MTF~d~G*+!OM8?%` zT%JVocb^cMD%OOOLbV_rftkhI-q^|7p7lqKn3>Lpy&QXWj4dx{Y ziAK3lV1+#fEZn_^#@Yondy9BZ+E;*~>^>-}tLf85DYt_&&jrL)_5*Jf|Ex^!`?y2P zAm-byE~l>{2ajfot3PO@XnMFmh7wj7ucrzs<8=2z=T@5tD@|H`7d1zR(~CXFK+}i; zg_LaTtCw%^z&EVv=5GQOMtXJ~A!Jm4tNKt&r|vlgdLn-Q1%rry6-x(nI*vI*IGqo! zlO8-xUkfnN9-G3JT`EM)U+BM38ZyhOZm+s)5mdNzwWF%C)f|0J8a2i)B(5-HunB?gtIO{+w-$zx^Vg0oHfs*_a!-v= zTaFzyr2D3GdKr+lIf!jB{aRM4MuN59kNBV<4{(zOlm0_+uzn%Z>&wr}xg!J+IC`Mu z%ek>J3%?e!p}#>cTFsid^_xdj$7#H{8C8M`7MIw(+HKj&yh@gDuAEnUT}DlifNa3J zxo^?gi0KrexC^rQ%dPDxOI?X3;Hq3vUdlFhL^~HLv=w>YPnp5#M!I+S>t@rRbfMl* zkHoZ#0-%Wr%tU^V*#=Ru=}UYMom>1ZfjRJu%VE#T{45>QwlgaYUErVfZs-sd zIiW!3f2wqaKPK`WSDgXeAL$2p7KIfX`#C!6pfA(B>m+z?eG+eH$(gN#(KI|~=38Fr zRJv5P#-&4fM#Q?U_tWN|`>ZZg1E+E*>DhHpUgHXuV?8NITH@2RI}5|Kn5g0ZJTp`_SkPU_YYeW?s~2aU zthDqc_6Ci_UYW`-QvrEqYV|_{diglyuYyDFGyF%z!AjSY_z{Wzt?~#~=B4EXB}c`x zko6@AiE+pES*fsKiXWYZ?p~Vg|A;gW0WKEGkYWwylv+;G zE_7t#b>9rMp9w1U?=^%tUU`U}cw4cNh-g7MyP;DW z1J8=_0lqk8@eikj$Z_$RDtrr8Bc_qauT>v!F?A-{x=cwC@3GpG9%g3L%egfX<<{p)?gvdYAk%fiSRRBTl=J`6ZOcPZO z0MkJCj)|z@XVEHqQ8VQTMDm0H^b3QrixFiO@~mpj&_35u?x-@{YLx+9 zdo7KgZ?O$q+POR0d&8rCGzwWSE}V;?3T?JO_V2BuGc!q2)k z41bKSOg95=-Cdt-oPStDPbBb46lg$mQ*@R7`O~ldJwyFz>bFA%MDn<}=~E;dZ2W9d z@Y+ZJ&ke4^&$*Erjn9mY%@nY2o6^+LQABrXom-taIRC1lXBINHp0qPUV;HB_V1QL} zrEQriuIqSPL0ifDYSp4Je%Xk48}7<{41xG`#($OQoa#wySD(v^n6mgIaHGqukUGCR zIU#cI{ccN78@&A`!a{i`f?J}y{-bcN3f~Q!0_K+kpNDLg9K~f-+uR)`GW#VUz8zP@ zNAUWFJ!enlEk`<@-V%7ub2WfMenLE9ZI+Cz)2oxj;94?pXi4P9d*x=l^5njY&+T_t zH-S?_2Yc6>7+(_cZ#Y?`^u;P_EJ~5}GTCEqgtX6zMc+&!eUcge5s+J~|70d{$xNh*W=bZCX*yM&(iUex4(5 z7&<*#Ca~ALH@6CrhIFwiaxh3&tgrz`;>Gw-1jG)Q`E@+xc~35OPo4bG*$8BeUW!z7NPnN$ng7ao9XwK0>9Wp1%R?` zX|PAh9KH)35qfda`$jiAFXAJ6qS-`nBXsEefRYm_JT1u)Z*Jc{0^|2B#kcL+=;*%w zpw7&7uD1VaG|4eW4L|N+1XWHm>UpWbNVBD$;GaJU+RWSMt=_<)?uT6%=%q8E1^MFp|@@xdWHzywSq2B=N&N0~H zzFcg&f$QDSjR?EEi@-JXtq*X%t(f*#TGR!_tN}?OPRr>X`YFv3_u9w~hJevE@pG|Z zN_5$i1-^So)$FAXeY+B z;E1-4F2O8acMfouS!{czgq((#5WcX9LL+*7DDI@sVErZ4@T8V;M03*TrWYz%D$*~7 zuL-NAT-ZUp;ov3eGSZpry#1)H(6MT7VhI0?^}!8DAr~i6Mk!?PLR9^X)#Ev4Z$W#p zX56^-l$t_k-f6ojHL++2RYO<}Gofc~D>PZDRQMq{Oh*=AA>{K(+8fyNAdlfsD4Frc zq`mW#LTbxFKQVlEF=9PKGWF)7%xIJl?TM#hpFpiS=YgHf$$FF-r*qxG`Mp3)d{C`I z1(KAaJqDb^_F11{2*+EPV{LHiUd7Zj)FV@s^2=VYdC`E^)l1PhHo)(~evcWJ-O9IT z5wrq6b05WpS?B}ilm^tNJz2lgfFnsyMR+w7GZ)<_QBcMB^xCcKb-|D)z$EsPgDJ%o z*zU4IwS0FZ%x_h7tj@Xsc_gm7-34nC*ByAcP%$eZ&6K&EqPh{RZp?(CF+ z?rUQ=)(h=e9MHsyj@r_LEf&QEgC4F_4sboX+=`o(`1bYxc)qRj0R01wMDq0BYhxx} zKY*rxeen*UhDQDEHOQBLi}pe3rAq@rlVXNw7ha`UgBo7Qf_bOa=vrl&o+aE}|DNyVlj{&A|$Tv^) zj_@WZp=#C@yhm&0>KqkY>%g;07|8=GFRKQBgHB*hcZM*VmHGDm<0vTc7}wRoDwEY0 zpRS3Yx%u;q&L6r*6ja#{iWDa>{A~jYde1BN=Y+xYUJ~xw8E{W*`AE69Ki=s{I z^`}ZP0JcDUCKtH*uumKImxhX4S8DPFPoW;MwzMtwc2=tuV^RblwHs|aQhh#(yVah4 zfXI9`@DksEB5fWxCHGm1cMif2MICh*-7r&_uvnbVbz9~T0Dd=J($P<~x=O32%3`kV z9a|4sI-<><$gE#3Ej(!#G<5s6xW&VI{Tc7yWRAAd`%(1#oMcWmTxCeIG*kxKvezp` zy=g7!X=!>=uW<0)wbtjW@pmrOlk?LzJ6nN3z;kmfmPXNVsUyy^%*QkS{lNFNn)ask z%-CA{_^*=HX22Ys!KGsfsOtM2cR>EHhsBqfj|NXsh4wckt_^XV{AHhPj4RV$YgO2j zWYpj2Xxo8-%?>Pt^2u6aRz@HL0voUiBVmvg2V{extPg;mf872|WghmQ17&zDO zEs_8D@t`{|qicNF_4vjSZt-x~D|VfZM{XFr=%whbjT?i7t<=<3YTP=AY|#66b*QVs z_|>>T-`~ShzZ9Q#g89rBPIk`9w^{Nji9=_X#PWYw-@@&xZ!Ah$j2=giz}F^own^>XLdc zwO{e_aO3w)#*S1Blxi?kKJ3^O3Iixpnc0)ZZR;`>i(VV`7h<_nW6;%M=%>CwrYT~N zF1^YZ$*Yut4kXm|uK`HmtK{o$@hi&LN4cH#FmpThm&5>V9@NMKdjnnVTzdUGY%A59 zQx3bAezD+cP@k0Abx1A@R)P-)A66VPp9wkOJ5JmK`pM2)r<)Fo15>0zm8{f&ON;V! zEbyXzxX@vbJkg6@V8CZ50USV26XP6xN0Ko;gSc05cMUI`@I&kp{^ zTA)}L(g%RyE zx(-Kz>h$Ai{PV@sc5pcgtkbDae3G{T?-2{KFJOL7%4zPS$Rzc5XInNxg^m=N}1Wc3Zam^co} z_)bysjnoz1@4Ia#Vse_k3jCI}Pdd#Ic~-dJ?xv(hA;Ul{jDTC(9Ig&!b{APErp8*q zDQ$A$q5bS}BWi_8C3}ex+hFwuKmtk-$hxCwxYtVFm?Xq6-!3_DSZ~zP$nruu3RjA! zDwEj0=6Nl06vupz`xX6ojiwa!SBY!8wVILH_y_=w1--x!`^reHrV5n7=Z>T;an!OxIP?%P~PRyYs|m z>T%xf7YDb$cmQ?ru*zU{RjGT$m3m#=pi_6$?E%Mzeoz z-=eOjG2J=gdeIo75QabQvVy+#VAT{QgL77pmE&^_nQOI6OtpkSTyZXEjb$)fMy&3O z4cX<*QKjoTu4Fj_xy=REXggWGe4AU_I|^k!ZK zj|N3t*B+h^-Au_v4LGQwKLNJy%U52j_mGU9@$CzK1_g-nQDl>K|Cc1C>!TlMff%Jc zC1^M*m7J56b_tk!nt5UvBdty<@*5v*+^(ZD+?f$4C6>`C&YU~N$=qGD17BrTP zHj_1(KFl~HG*vOnd~fgkt)=rN>j%Cd$l9V8+Q&AT1sz@7yaJSCf5^^78lMuftoi}; zygUVT!ONz}JhI_|gwnykg2TVzKjzB3AaJHzEz6v%|KYcV(&(wTnL=#Hv}ayZLC!;o z4Dps0mS$-M35Us$*xnLfHE%!JWS3EvpkM4ge_EbqD`pBqpyaJ(@LNXm$T0-`=s{>O zi=xR_Ouc;CO*hZJ-Bzy{SC<2Xju(6#l1tAPL9ZEjov0PSu?FqJO}`}7%HB93@LMHB zCwK$g>C)4Q<|x~vBDN~gV$(WiFJ-&dI5UWJJ&93yL=-VYoYivm4n5`u$5HU?0 zm*Xp3xYugbf81YYQ>Yy;-dm)YY+rXl>78rtVUI5xmT!tzIegHI$F7Vt@eq1az!wwc zht6@@FRelOp02_(CoEeXSmR(51FNTO#p*Ig(+$=D3f$U7&rL|Q*iLOuwwM8J!A$x^ zY~Pff#rFM{pFf^@K%ld2Gt_6B5{zZ7NLnK??;Cj?pFs`tNLTC4UV2cy?#8ZcG{_pf zzJLw#3GkdfdsQCWXli#Jl$$B|IFReL7r$KiwD>4w>{sn6S!S9Y3rov2KCc^Fb-$)U zWhEr&%l)*A_~mBLN4$!ZR=wE2C@|=`I_|ld5En9G2$5V-yw4H5WBC0h1H|=vBY#HM zV(Z@||GzT-F=;&ZjU1$8o*i4o*MS0N>akVx5^Q;oo-MA>T>Bk@e#YtGOoXF4STAV?we~Ian;#n z$3S<<5ZS76n(wKgzRocj%&4=conKnMN@WRbqS_I)JFHRK_Fy$+Z zrlw5Ug=~+tOb9m{;4wmd!5y}N2gGgt&Lycu5Cjg{eIxnB2}>W>kD=8W!(OxR`Gh48 zl>sQwr_aCRp;fWVL)U`xm#z$%T{+R`+B}(sd!~v>I=MXlAZ+B_3gCr@90sU2d%gZ3 z=`o20Y9$r0al9n*+9->86M0d3nIP+&Aw>YOm()tNW|{ zM>#(^_T!Czd2#S0ul-l-OG>U}iO8P!#G+*gxnVFv_Q9{(7dsV*^D1Bb8XRH=o4Oxs z*kKVNZlBeSrHs)`$`$3AW>@rx*M|sna;v)UzP7Bmk{AWJ4)YRUb$QWH>m9I5<4JXS ziE7ic{CLdCqwfK;%<@_1$s9I3Am^x7uuxyGx3ru6x;~=i=Fafm0LzXm)S8&)I!mX9 z+ns{3GICkNNd5TO>dum+reYk`tgI2C;@-AM9CdQ%R?s%sABQk42ee#PxjvFe@fQge zZb_UUz5l7ycXZ5RC8JguhO-Iix)QbvSX`><_I-I_+Qeh--kVlwRRMe9J-iluBmOX( z_l1Vlnfc7!oB^!??Hk4StxklmG2wi%s5+x_A(woJximO-P}^QvND_vAos zgXGge-)_))pX4qCc}Yrk32EP2L-(fd=YhV#6B%K*4xeqcDf{{|S;+5CbO7iR9{{}7 z<>5(hJJRXmw}pm<=LdBL{iuC`56ZCK23GhL;Q{g7kxMI{A4bxui-<^(H7~=pd!YPR zdiZe(|8Zv z>e&3HgF){TVaD^5F=b^f7MPY~G3@i$_jR&3JWF-jQf5WO4PWF6Tj zi;;6`c5wG;SqN+X+N;8*Gcky;<{;8#>C$UaCRq=kZ}i;_mES+)Z8>>RfgS7!z07=- z_>mARw_R#rKe4Vv$KX79+``9FtlHIgq`uq5o^n8(HQjZUQi8D+B3%}8Z<~uDr3u(? zJZejUd4H5#GtY~UrT(7tKDw%hVw7{-Kkn9%LSFvgN7^M2x<_oOi;OWB(wTV5Lxr4Q zXkUHFU8;xoSNHblVAePTQ0yud+h6^>bFycF$HmQz*+~}OeW=cG8gMPFt_WA5@HfBX z!9MjGhW5tiu-UbeIG$U*9SrC$g-IWp$^nOTW%1J75$)LDVmoxF-?Tp6lYG%w7I|5l zJKvg>uz)uNS!IzYMdHj@9iV-6KKGD!NMxlcZaSG6-fiYeIP-#n2z*B&GCf zTG-gVkM?%?9sSPzU}0{&j4kuBBvN_JyI>j);bonf;@o`0jyOy5wa;%mRB1XKQ`I6u65Tt(?UcF zu%*y4QMj^?2mXBm%7L>yuFqWGuctltDyIcGEk1(^ zEp{}Z#*+|_YJ}lcO~-2{LG9Jf4V`;C+WeBvK0T@Kf?OU;OtcN`^Y2AEpt`SR#kQXI zX99W4u-)m(wq8Ipy?o;H!h5m30ce#lWjyXkrRo!hCuQz)t&GRaXVM=|0fqA^?aA!S zPXMjI2wQG6dn8^xaeR@HwCT=22x<0{EPR<>Nb9tbxf-Y%j4MmmLcqsiTGXj_zRl`m zicqA9_VVa`<&cM*Tzl?yBq({UW_1C|QE6|gWVTQAM?$!u_yaL$|2^sl8T37h`~?|V z#`401q$Bz1c|hJ{b(YvVS4T_8pI=^dxdl6x95n6P##haaThfkE%sO3$CtCjz7Jg|( zlrbFrwlsVp-`PwNzm$!LA2buXm6G>0Yd&xC)hnhynHH>-<=+q+e{_bWm!GDN2ezit zlI+CR0#$N=BA_waNu-PUu=vV|< z1Xg@D38-^Dt4cau7sqS}dm@h)-H%RszdTnG;959ofbM8}4Z|1o1YKvyLth)n0J`Vw zsObPNKxnp%3WQ?#ZBWxC-_!`@;C@ybos>jc{DA>CJOG+`hz?M99@lEu{@HFtc7k1P z3?NzYtfQ16|_|-{kK2(Reh9>A4+Nl9MW1JNQ7jsxP7{ygwVl;z?(U|n7yICs@LV{x;E^+Y=-mI~ z?!BX$KHK^~v-{(2!``7osPkVAW=Fa`O=IeT2+z(L*yT z7paAwMb3-wb#*h_m~g9nsY$ejP3Nq(ZAA$stb02qns{w2?2LuV&%YD%dUt1N|I!vO zh>`xX`?+vVW#B{54Nhyo1j_vFyDx(%j+~DBsdvYi@NaW(PE?m_$XbnhqLSy#iVeC_ zF0%P&jEjw<__Z_ai3r!Z9b3tz+@b@6{T8)(GXv&HktIt5;WD)q6%2Rt zk;)7c#vADrH4pnW>sDS0@qpu8156ERQR|X*TzWxIt4i2rA5W|f4R3=;YA<}g8K6+MM;H{LaB zcFvs?HK5TrniW^?x_jYw$PO)D#p6LMsE2;^o6FO zhq2zq+N_@ZB23b#p9-KkjlDsLhAD{k%698KD?DV(WVV7h;25mnOe(;ThAwo1c1-_E zyHg9DZ#MyrP{1f1bQyPsVOG*tB7agHc5gdZP|I@g|JAyDVLG8w+xM{dF~tpU^oNbx zfIjtN@?7ytNL-PVy) zw=G^g=Cylw39+y>L7AR*i|r_m>(QY|Z9ia&cXeE-mE6R3WCjlfSvjwFYKC-x&_(+$ zqB^QUA@RAKW}SCyq#ZKT3$4WJWpUUk$fYRP1;m{ zlR*72J9i1SP@adpnrx$2965JZKrJOe#3#t3J2y8Qtg z>T6IjS~=-s$3(BK7iC3wZ@e;-Lc=lZnPf@{tL=*6P&w09zY0>`I`wu^cWSuAua$~2 zG@5m_B&)Cxum8i1^T$cU*7h_98W%6%eMR!#XONv>Twi+_gzH%=`_Oa45$bTh)AYM~J&O0%r2WFP z7PqNm2rlbZc9DMbD6#gum20fNb>SH{hg_`*IgaGH_v)hL$3~^t?N{Hd-I{#AbBei4 zY42uKf(R#;lNN~!CD;_a9J`-?evOl>RUh_p%LoCl9p&UEgJdimBkv@9hwg{DYQ{u< zpy6TihE?2%dD@F@J!m!doA~ssHVRRMT{kuGm;Wj}{IP}oVJ5%aB0uQXPXeD_q0hDM ze?2HzamrkBbq&U6(g5rp@O&o-IIt&Vz*HJo@v-?FsEqASoMxbk%5DPa{t(I{%$7V0a&TD2Uo*KiPTu@$FKsl|xyin)t?_MOJk zYfn;}ak|M0$4}*FL|@)@{Uh zD@_IhQ&~$1OiC$`)6|?APrPm}bHL&)O&d^4Bpd!~kt#S3-1I zE3l@p8GDM==UUU>14*hKIAyC)M3wUTbP4gcj<$sV5kp9Zb`n#vEAbpc`gH>Q40B-C zy|76?cRRGT0fdyr-G%9+OVW_Yzo+qXZPWVk9Jx zzJ-cqv7UMIurWVp)zu$<_p_O(BPUU@O|fr5iGdrX7bz~fu`7a4ao7|@nGHwRi?M6d zi)at(T(x`I29sqpmtwlJJ%GL?wV>`evDe`7XHo>Xk>7T6(#4iHGO1d5bf`zG;`_%j zMhVv<_7s@ysquVo&{Fnc>aC;r>?i!x=!C&tsOj#Fjm1~X#;i|)Ro}l&y;Y_8{AVBV z&kIbK=G5w9pmZ*u>;XMf2TDp?Xw`*TQ*(pC=9d2H3y+DN5^u2Aj46+`69%5=2#(D~ zT_2k7>>i}4>?#Yd>h0Nx8LUF{febCus%Y(3P1x()Hg-d~iZDF5Cb!Ks^~drKfqpx;9n?))W2U8}bzdx7P@OA(L(F&=9EIN$UCwgPxc^xM5#j@}VHsOr$hImyaG(??Fp-)TYb~_rnSe z7NsC~>LlouGO2y!iq>_hrqOzH?b7r6&p$mO(Zv-N8S3@ZipM2i0bdpw;?HQ^eHO8$ zA*bQab3b0I=|KP?G0TM;J}uyT@0VO3%p^1ZM*E$1(ilbcu8(^$P861Qy(W<94gcEm z(k*srYV61e!2-8(pl|T8b7^ONi2neugdF-`G%Cfv>z( z`zs}7AOAR}6#ly0Vl`P~)(@N({D{FaFU<$1HzL-g0As>ZeKgc3dq42}$K1=`zwPH|ea_4tJ*Mi0AJAwJ8JFh!a_M9(ew=Z0U5j``^*xCSFy``KBPwIz(1{E*d>SG zKpb0Ay7HaN-R5zf>R>!y$WV*B2x6;(F}7IrrljpX@m{j;#H9`}_+zf=ch}y*>-g*y zV@cugs#bQ%6w7G(dXT(&Ze*l-H5cCFAYDAzk+75=WinDBwy4A>u9yVr2Rp(+m~J|8 zfx=16U>%P?$5sE#M+F29;iGWggecs6@XyldFPFCdT^^2pbzgtD5#w*b!ReXjyIRiG zW>kkT6<(AsEVWlWHRwz+a%La0xN0?W6wZ`q|C#UC@E{&>is(|j z4tuoW>zjsByv}}V>~CpXJx-E^W&3=#StKDJcP0Mi%lp&Kgb*HzFn$k<5t5x$tdFQy zXW7z(axH66Z40dLmC0g-8yEnXbvfngKLECW9?DIE+ub196IzoGP zC&G(0U7W5;EMkZ-)VT`g&5_8tNfV?MIXO0AvIq{_X^2iWv&~CZ3j$3za$m*tqGT%S z_gHVB=UZ4Bg%kJ_Fn*lbMnc!c{C|Aq&&LHARxpx9M+_3%Qcm-3sE3`SK1iLBdc(0dR+-Waz+tfZ&Uvsu}#a2HO zL5QH1k)ySp=;JNJ9s*hUAlNu-jCiuN{$u`NyfRC>097itQI$E>Ni_8w(2m(CEV)}- zVzK>m!O7x3zY$dP@!})jsoupcS|f{>%M9=LayV?Y5d^fW0Z^lwqOA99LNZ7jDx`9z za%bHvwZyG`j(bj|wGR9aGBSAPWN&_Z)q0MUM4dwtiKQ;JgFY~Bd(RJe-h6O}{s}>T zK9s*d{Ob-GFF)Gwj>26Ji}_@;Kbxn2J$wo{WA}gnsSZQ17q86@*wNh-L_f~U(Lo$j zxi@@n`)zktaL0Z}kCX6;>&C89Dt7S#E4C!bm#`jrs?4zUMKnWT#c6G;VL&w`!e@R- zxt+~KnnV5fAo?0S^!Hc+zdjZ!E~-9g>e*z!GLKOwEdAd7W+MGf-7&SQLM<(r3gVnR zkD7d7OXbPF#M9LD{q!K;i z21%pcv(4z_3dU?qi|JNgBHRgltkfdlL1Ngcc=Mjn&;mqU~_#BXEnSvaw1vt z#o_Z}U&%Z^^JqJ#ZGgr{-_^D}42{cCN;ZNiQISRNOgT$kuUwP7w#tLOC()!yPb-Mh z;?c10uXK3I9c_w-cK+WO>wBetZFVf6&2(!oIl&f;?l?~#%vn_-dM~2WGs@sQXj!MN zB2W+DzT0l;_ai%6IC+D|F0xp0y+1g#025~cZ@R`(gU(9Q`U>oKUfgIAqJH4%Jgb|g z$|Q<3R&wTbfpX1x}V%GV;)fZ>XG=n+l);-^j{Ii_Ct&4lB(AK9~c;l3iz zz?7X|*pf45o=+F}wRNw^R)-HP>V;+g6jh?g2uUXj5a^NN+CJ__LAAH}wjBOMTVP~4 ztC3q=xw$*V48*V|W%F8-HyjRyBGj|**ys_xT%2>0^KAKiJ4Z7Q3_WZZyYgMik#jf2 zYO2MYJgtZK7sp-?e-{u}-%m<#T3?>tI4&Te9_E(UMpIEm$#BDY@C{-q5OF6KZ}WHQ)gK#JJtFL-kiBGp#G{E?5Gwo)=&A$F?oAhGSxYLD$m zO1-wXnbe$jhehhnIr}Bp)4ayR2=ruGje1WE_mcB;NC_W|)%F}pqL&KMOX2Vl|Rd7Q3fBCTRs5jQjaex}8)+bzAN<|8kn(Vf>1h+iGrJWC57}>`*s4;7pZ?#XF9-!8iNRB<;;u|vs;nj0`Xp9LCN zABUdCng_J2LwWc5qjP7xi&0UNR&0^}!IkDP$X!IK%06)}gfkDlbRYiS+dO%vEk=uU z0gL`Z(6=YEutt#vB>u|I8?DjA8%pUF;yt)FhW5ZphC!iss*z&9y!4#j%iKjR{&F*q za{x%OGPfDHccwe1utR_tX+wX}T>>jDt*Lo!>kt>Y)uUsc=$$l38b5Kuj(;sT+tqrk z$gyl6){};AYMkt+zp${64Je|uh9IJay~%15bRNzm;GRn{N}rlHf4e;3M(Lma+}M+9 zPI>r`bNgG?NC2%I*O4?}EI^s#)zxXM$MR8k3QcYXKamme$BVE?QwNcF zt&m2F-#IibJ2a&nU0jmlo&0<-ZK22G0e3pGD~ZtyE8G5qoxWz-gL0)DW95cKl#tdO z$Dfyz@CHt42F=EN4(Q2(oHzT=v-#zFCw0k-0gg^3L@M7ICPP5}LegUAczp*{96lRf z4=#zwBD$|(ebi1b*hDR+t!z5CV91j3CQu=!o-{uGtVM@FU5`%HNC63|>4=xFN}m1T zfMM;k_9*`8KRB1BG5-3Ozq5i8xHK)bG)|8zBFydJR}9W4E-3mmz+UQSecZ%PEe~)x zA~FnLOm}v6pQ9YbQ<=w<%G{>;?dC$Hg%k^xXd)9G`dZk1>eH0#;mNk(A9&a#HaS&U z`-D$JQfqMeA_^_BGOowBsi@6`Ck&D*j;FA0Z|BUmzY2Rmi8E6CLtZ*A|3RiUkMO(2 z**z1vwOCZzx^3_KT?*I+NZMYFr2PoSYpI}$ld|?bn&bBKAliOghI$tkT;4{EP*!|< zwt8dG4B@0Ch1Nz-imV)RT5l}9EIybOWg;8D`R}UFmkexJ1ZVv8NlkO*`|11A9$$Ws z?wxk!SYgpWrEl?^0>g~gdYQsqS{D{1o%U&m^Rf?F*_ZW2rCit}UUbgs3MJRZpm}7~ z*{FDpclC0DX!X<)VW&;wrMlXoKJ-+*b1rMT_IjH_shp;5WDQG%6!yOUyUn+WJczAPhlS~uH@svm0TEW4?9a)+svgEI7&+9)(5 zDl6r#IZvC>i3KVSeN;E&leZ4Ke#qYbgNni)no_6HO=7ta)ccC9VJZlx_IuWH7J%1? zV7r|fF;5k#b3iYfr^cIZsg-%hE$L15&$?e4QTG0UD%!Ku4F2(t{%n=(5a!eY&MJ9- z@kn%SivJzb4Cua*_*zJ_pYvDlDxMGG;Y=!D#h}G&3j!q025sMOWy)t{8bm3>v_o;d zI*6krzt)Hfv0yN6s(Fy&EGVyTWl@>4Z|YSayXi{mp;?$kt(>OFuwX%L^&`&g0P5_0 zIT85dH&A^ac<4$8cW;A^imShD%uio2z2`Y#-FBTf2#X)a#b|!{Q=jz? z^wM@DMkO(ok0UJTY5$MV^#Allf88US$DE6E60jyG4a{ZUe6ctTKFa0{o%pF8Z}Hj< z=1tRb%8McfXVZwCaHEgRd7)%}{EX9eedkq7TW)x~pT6}1dh>9efw454Au^vGc@st@ z(IP`4tDmfU3DGn4dPv8qY^H^IK)-|`W70+iGG%8NacyeY!^A^oT_H@*k+71PSZwOs zb;od*y4F47>(;~C3VZIzJ0XrRc$vKR9q|{$v10>}KTTImFCdxJjC}P@$)|ooGp+!HHwV?>U9k6lYA(V@gEzstC{dRKX<$PIQcvYx^zHZvzio*X0fd6HV zUrqn5cAgoK)cR%T)$wUUe&3#JKor^P>RW5>>geF`XY(^UkH0lZ_ZJX_)i7ndQbRgg zZvGv}Mo9aNcUG3w5Tbi9@9YVT^&Ar1hZ54ZG9GH&s{QR?jd`O&=Qt5!i}0rvJ2-c;&Z|z z_OMntjRyeC*#aQPpW|boE!V%&dA@w`b5ZBV7HQnqJe4u$uLw3j7BK)}v4r^#eN+Jb zFb#&yxT`}}<+}=|6GRfR&P?T;%*ZGm`=hWOxb80>o>WKBiUcAb1Sr?6I|3RBRG~^t zVb3!85J5}1U{FDxy6(X@4g$9#vdf2`@XNDP32(nsxn<+zHe@St!W%w!rLTlH zk(~39YJGf||5>fU%QP3EJ~vSJLJW+U##&uD0n-Hrdd}4ulWf1O3zN-&de7AM#8&IN zW)fnXI#ojoafY%RNpm62n02Kv5-7H?qwA}t`(dIe3Cf!k8rHNnr_yV3R1E`m`rhJm z?iP|)oI9hev;VH%QS0Cm?lq-X>Dhm1?}`%o4vX+)^7yH=CqSyzi}wFH&`!NcK<6|* z9l3pyaz`A2q#lcWJy3ZGX^S4FLXqx34QP1COq1l@T<26hQ5=Q4Z1s2HkS~Qc_g*!B z?EY~ESR-=vzZUQDe9jUO{2#&BAr=@}zL1(OKQ_>Fzuo#Ai1u>qOA%cn$r*^H+!;4% zc|!PvqKOsOd$H4n;0y$)!eHuVS8DU-tPu{g(S0d~==E9GlMe29ZV=G7@-Ae^!zX^t zts5pCw3pa^da5k&>BF>rZa?0$6cZA$_MlNA&~Lnd^32_Pj`wc6Z+o7EI9S+94P zgg_lDgZ{3aPGB3(qs0(&bg z9_1tKsByhefAI$TqG&-a46ZVrkQts?;|;Q;waJniH?`6FnzosQ@*ifekj}3@vbQwWS5f82`Ri%)dtQiBX@B3*h=JFe@Pr}(L@s_!H$k^m}&!_Dr z=%VB*9T2(8{UTLBQ(8OADfmTQO!;yt@6gH5iU`dIK0N)T1rSks>BU#xA|9qL_>0vx z7o#NsTLHA^3!aacYD~*NPK~nGpX5w44>w)&JyiAXLaLMxrfHC)Jr4kOL|2oIeWWRJ zGY*@}=f|Uhq$#KRI8)bJX}LOn4L+@tSBFnE&mrOLNmfb<~7SYxnY*q4mzm3L&&bzH4Gruhy>Xb+@E3>4P zp)$?-*cf%S81>@IWS9nC&R2v7V-_Q98}5ICN><6@y9Mk^X-lj;^0)u8c>G?TO#%3V zlzmdeSA5l{zMb?X|H#`qR!9?a-U&~pTNkQ1%{6LR&y#tSogk+H%Gi$2TXcArg3G7T z(vSczk3p$^wtX2uIA;Z&EC*jX5u7Kbxb3W+bKl&VCWlQMBN@NLsON4qmKc|j6D8j>(tPP)Swk51|7Pg4zf@8M<4I$imKDED)P2qroW#pXwQle9*UZzK>d1gJEP#^Fdh*fvq=p9>gebKTNr5brn-HA8!SjD&{L+y4*aJ zlGRIUiaj)&Sbz9xZ+~2t^qdaI+{D-GDMAX~oaA@jJ^8EPohEJ?%}lCwSK2o~gq}7J zQO?dRSYn90MhX24(@ok4FB8Jg0TFuDy+u4&cSV>QqK4`+cU2pRyO>kSeHc+=L+gpN zD$k_CtHkg7&Lnbr1;-P7zkD4O4*#uKb92|%Mva&k!5gK`WmplxX~#Ix9cI3h#!>rI z&f=x#-aLjx?VQ>C{@Xh4>Mj+!9q`@2%dAt4D93fRoSf^it5jE~ic+B|dvq0c{7pf= zTxAkX~aU@wWF-3kI{leY43AS=bx*&FdTds}eLw7A&{0 zs43zA5^+1h!py^VkLa#eBErqjW;Pxjme*3JD&|8c>9?LVU8O!2=yUyXE8O;}oN}(Q zSba4n2LKuohZ-!`f0|rOe5Ls=0D*Pb7hc8D?0dpLlgz0}7$n^L%GrPwIP%MK1@g=7 z;^%jyKgogprh%!ty`yRNv3-lv?i=Jn7&iVT3!`LCu7vaj}jt8!+O<`RuGRC-hBHZR5tz{}js2w|JK_xI8a zwKtgcPoWyrT@EK(L3wc`Lq>lD8wthF#>GOCl)EOc5D`9GmKGygy*29ncJs zXYo@S2C91M``E*KD|cE`T1p5hv(H;z5ldJ_QVk^=t*+WztVaJX-DP+~0RGizJeP+z zQ!s=bva5vu**MYOaJl?AgpL(TgRe^sTWP}JylF~w`&<=*1->#rJpcmHo?1$btj?4J z?W-+bFGV`}up|+>a~xA`b=bS^;Q#s60@sJ?U*RtkK6W1@X~qj9d_(C zB)>&;mP3nkGsL;s(j$v7Z1oR*153*OR(yx;LKKZO)t}u-(Q2i=#S6Ln)KoAS zNs+G6>X-*ymAX|>AwM3CJ&0vH*M;T*()a~yN=N}~X$egCQrH6_wr$l9Kzd$^?M`hA z6$RD5PaVtu`0juGr-H`ctkCoknXi<(nCCcF==H^%Z|)4}f$%s#J3!(LUTsG2v1(_H zA(bha(RVF2Kv~6Z4tf3fBb|{9!>I{5w4SuUbgqWhNOOaMC?Dh{y z0Ta*84RMj$0aXp=BN|tgn<)b|hIY;2P}oMH8`il8_4N4NHszX0GEwoQS@u%HsN1KzMoeVWn=H$<&UX%S}l+k3Usna#f~bQ0h&^P-a$H z5qg)4sQ2^i6`3;cL9y8)GiasV!V|2+J+nkshzDBEm!DvkI0C=yo-Vbo(?wQ;?qshb zql{i|#C3HEC3xNzJS`ztXKT8@KH$5?@(NzLr;$f!QnP0J>y$SvG@aylKvaC!V0 zZST2m&mnNJO+im)S!$vXuC7Jgj;F39%_oDpF?bOQQD{HU9s^eb0jvN<*onb&d+ig8 zA6%~(lho$lco`h4gy3!zt~2r9S|qp2USif4jAuv@)8gLP^QzOzyl1iR0wn4To;Bo{ zpo~(@CdH<;PVD$fJ(DrOmyLP|(zkQbdA8bk=ZVKPVp@Xb*@!IA>`e5t1-yXt(N88s z_RB@Bzq(eUfgWXIX5nAsQTV4LIgZRe{-XV!S^G2~>1jsn89IP@TXA=P_)9QEGWh%) zMT!v2JIDM9(0`uqIOds*GVSQU)G{Dpu*E1SuF>#qcHLGfW2vhWV(!C-1H^cI@EX~X zLmmUTnGI$m@lJ}!5@Y=cH7i2Hfv)5vnr{Ir%7Vslci%nS!oPD*Md!wslwU&{4h7yj zzO`yO;Uf7`h1?v-ZWPHPyqVlM5lHxo z!Bxsj%eNjB#zcyJr?Hx6>_j%c4dDDUgxQ}aGNNM5YFDdN>o6@C%RwPAx6cHdo4E3Ff=R`sK5bjm+&|>v-=@8^i$dO=7Cg$vvyo(_nU#s%vbtPZxem z@>I(hO3q=QoeLd*&3WQiS1x(BN=nsanV%>Tfo)(<6xS?G162I%Flkoo@6*X&JRK=1 zj=-bpObZ83RBHMfN$@G<-@m)%(a94e6b1fFuHd=-PdOUX%EdAyIZbix=+%=06Zau@ z1y2oMFj!<4xQ}or$$*jlSW-Ay`ynl8e5f1pWQ%pUOUXEKb59*SmHk~7UMK>RqoDo&J1iYxX()<;t(!T2xe1s_8Q9L~e;7d9fGC zS~nL4K;8=PqLMsz50nZz+qxou7wq`r5oP{O()_>iTZebEIlb#m^xX)uHZapXR8&~0j40RprlTs|F?JOFOksyruB)Q(0-ZknmewF=|JA} z&j>HRsyv<55Y!=>or-6FFW@7I&Tk|pF=o&W`m!)PxUrjLOH-rDWB*;f+y zFiryBLJzI-Ft{ca^3^8AUuA%9C{M0e)LKPOc?lo>2>MlOrMDG zn|Kk~Q?0CBTT+$Cs^%hX#O3u-RSlGlt$$RoT2h)^e!$p!w|zgY`4=nSLhvQunZjCu zc2b+AZtw7<0;J~TZ%it=HvC370t=LRPj|$(K+YnUGhk31MwH4vgs9t637G75a?a>pVNj_mk(7M|SnU z#}^1ZDQqy$=f$O!{{mY}h|flDzHRKnqQo%`K>Y%l2z+X;%{R zcmI{EE{Lzl)j4VCGbWVNF!uaAYw2@0PmRFEP@eEANC#XRwFlZDHotl+e~D;7frKnJ z+lHagO{L{C$ztnA-U@iopc?J7ZliAT=+_t%SWz_P$Q$u7g^L21EoxRqlCM1Ze8cQ)6L%?Kh%9y_K;S%K9TN5i>G*_OV$xi7fM3f?#JSwSKCb>-EXd_)O)6stZa`o=VQyQy~lL}~E zyPH={r-SPa3NZ}KTtr@8LBVaB*`yQ#^ML9gu~v%ny>XUzEE&*Q7qnF7sIMaUD(hd; z7}XKmB9&rcjSfazQNB^Qi2A!oplTqGi?wt=zs6aHz)_*8;OtAtY}|eq0Ga30W_D;( zf67YgLJwDY>*Q~5MC%N1Z_G{gf6?+i4dGljS5TDtsDdjS5*YVSff zcR}PGjpoYd-znmncjdok9Q6p1y;u4Av@9%SU9;s`DlB$gWBk0VU%TF|dLt_)V=gU^ z)k?Q^$t=IJc?9yh>alwHbCl~8Pz`oP_Ds#Ue#DAMm6YzL*z&T?FzV^Z2dQG90f5Z; zWB>W%lJMUW_lvg(cT;aAarq^L z>#-Lf5v1h55G1pY2$GO`9AzRb`39jKAV}n4O2X=W2}K!AJGm|OMDo`9gL?0a_;>lP zgU?Z8>XCi&S4X%sb>a3tjko+H>&yei&{A5v+MWwOsN5MCx--_2GtL7DB;k(T;*>xr zc2q!bNa&H`?9h@TPJHvw0vf^$jvMryRuilzJyZ3sq@xV6kMpwHv^*p{xN2#9IhdXu zjb{8ds}EP;)BC()QoZKWWm=Ccbc|eLe}(2(-|c~% zm;+rr;@hVv`MH@#K413`#fxHwYd~{z1DbidiUR9=dv&$2oGt+1%ZJrdWeX|HQ^=q1!_H&JnZJt086 zI!UE>V-ai}y}apnj59m7`OR>$CN96lBNan6+djPj6uv9vSV5Ph1FH1A_RmOu>GB-e z^XT}ikE0<&ir^%=3dg=O^T>4sys6(*-4k(6-{);yK(KAaP9xq_^gI(n{ZS@gQ4gB-*XEmth zpOY4>={3sDn?`?-YHB%(XV%-ZCO9CONv3XJhNw?G@QYjXrr@o~-qd3ORivGul`r=v zNV+!jp;cvI0gM05YZ5Pk z{USBqxN{1;v%V7@#0s*%b|EL;r$Qu>fo=%jEv2uZ-f(Gf*$6y1gpt*Uu-i`BJMHF`w-k}hxl*B{ zy4XoUk-Hddl-U`f*S;C>JnKpo+?E+<+2HguR|$G%CY+GwG}mMY%Yrv)BHxHhHVw=T zvB%Xzvi#XcxL22^iuS1xW@(!~WCM|c0>8#eNXgi%qFo8FSO__p2Y8f53Svscqnuk=qai9uC!yW~q(UHF*Pve;7Y*+EroYP=PK{hHhD zbe~5-(ucjGZlUkhpD~HxmW(JbXp#oyw_eM83IjP%n-tgjpaVl3X^{Cozq!7B-QABx z-yB(Z{Bhv`Qr$s>j8RaQl<^*m(wo50Tn+UqBQ)i+3-gi$~uYMK<@w5mjN`f`B_OJ zCGeF;R2!VWV5K^(O%Iv$rgOGx5EqZHBi<1Eg`Nl?U_8vnhG#dj zz2*o*mMQxQh7!J!>z(^V-pA>3U(z%`n8OX$8&Jd0LdK63*U**>#QsFDm_eaT#=0a& zdy^JcA5>Vjq1wA049r@D+qL&VREb^#lt}oNm)bSxx$|wVek(`t7EV__c(#=g?$^(6 za5)+NvHs=M;_o9U|G#JN-6PdAlRFPT*kk>qkDs^M0mBr(8Tq}6`{Rt*8CE;*QN5Sn zt%TBOOE(;%HZI;X(?`h_&16L+zt_4UZm{xTI^19ZY(_o*YhPd_t7!arJ9~OgFmd}I zkQ9vzyKDiiCKQ)^C{yiD!0bx^e)wpUbQ}@xGox6V57Ej!zPt zTM)I)HAw+0Q*K|w-A<0I04kHiZ-nhom)A{p^H~AWSh6Pw>)vz>TDtj*Ojs$t*z*Oh z>`OQA-yeGw4YG?$=?t~pyQkX*lC5n`ddEVmS`GYag}A)h<&_Gin3pK1=GG7J2RBi4B zi9iwsC?S&mrG!Yjz1lxiLP{ix`R2tY@h!U)tXzD$;z41 zyrmLQg*zit`oEuzI5?a92#bvQxYGxgQ?5z$QSBbYs_WGT(=VOSKuM~@VxL6}ZJfh- zg7J9|ho-2iR^@22C5Ex`E)#6q&874o!nwOY^|KhP^keiKD}W^qEcT9=GbUC=f_17$ zBwr!Il4Pvif%(;6!n~Oly~9H0SMPq8@zXuaQ=wt0jvqAx;oobt@0Q-DgMzPJi{$HU zYFDZ$ajH+XelxefBM7ime28T?Re2CL*!xqtt2aV)n3%r#ORmq?h=Ha|S$EP2?!M7y zLzOt!=O6fU64~3Fm|+bFsrvq$I&Qo(VO)^~^!~2&Z+dl$Oo+=wQ}S#c3wzhn&(YJv`HFqg(<>5Q_zR<| zZkvg({t`yD+B)=hfX2b7YJX0DXWmF$9o;iL*+?|keeGaLkBszQyv%$b0eQYxhqpYr zFyDTmKBBFTqo=3#QBTjVc6HoF9*drQp*jz4iSJ~WKA6-OM$!9 zo#8o>QuF4cvZ^PV^jy;Q!fC(NeiW{D4PV>GQA?fSXq90H%Ul=ofp*7PLSGJNx6X+6 z&Qjz;3Xo&*Od8o7Uc*wnnqcz^b5CNe2SCob!AE#n7pF7q=yhR6@yns?m%EezF}4}t z0V&eJFwK*x`QhxaQ_di8jmTy#DN-0?t~$SZxbB*-sc&7ZI!BWZSK3*ym7yxL16I+6 zYuXX!JO;`&)+K3Muk$y0>`67+_N09q0`#Ip6YV9oqtimeZIsa!f;irhZVyXIYHIV& zA2o@|mplud4Ol+%`e2F;O@KhKfd-qhmu#0@?PmuD*KO;_YVEUo&P%lOsON?ZlggLI zFY?{3j$>$ew(WU zC|!xIcicGeilXKh&9DqwCmIlacPL;@)y_O;3FTU6q@U*`K%F+^n_P;ji$0Uwz%iO2J2UAw2lB(Q-{vL&dbC+J-f1dg? zx*mQzu{(%x`}BI(Ah)zW6pPk>-v zuQ9xI*#O|Ok$0?8>Nv%hO4eZ2IOSF{SIdX#!xPCn*_}QQ-us3N|I%maVTfxGFu46z zZJl;O6cv|br_uEALML9J<}bZf8$Lz}q>C(s1v9#x|9A~aI3%vrM2yirW0 z5$^Xi=yYM{DM+(k2_%OPYGXeYR><}0+Y7#LvTaPV3YIuOlyJ_jH#hvo^BS!xk?kdY zO02udmJC@oIo5Q%BsOR531W|SNv`WjPqdcu#!-3qHFFrOxiYC>X?R>>ZJM)qa}`os zhU93hVk&V9^L#*;sk&S?rxr+*ZQdC+&>9m69k{yuhjq;^Ujz5$H!?V3r0oLp&I6Lnr&MU$L&dssX~M*W49{W_t}*Yg#5V|{ zTo`a+&6b@)$-HDQq3seDy+T8BL%Ly-unYV9dUW|Q#?PR=+$G+rN*NA6ht!dZssX^bD}e&jBi3jmV?>L09k$=6sN^F6NK91;gj)|Is*pp?NxaG)bP ze|RccouU$PXr4M1hQMu>`epmn1>H=o%v&^x$yIQ^qZuxVmKxWXUEh^NP?NlQ#TdR_ zI75tp{jR>B6p=Y+2{WhX0uT1cW?HObFnKF6t6tF@CSAZX)KazEO{jH2A zN4hQAPY(l1NtZ@0vcEEi@O7){z_FT>WvZ>i8>%$dw=b8Nv-6zNosxaC-8{eTkw+V6 z9*ZY6w!fzO)x~Nq%^f+Z;h@?dQa3*&Vz5BtUn@P1nmRED8Nt4z_Mi97Cej2^E5AaJ z^i5eB3sojhY4^^NkBx$$==KJ|PAl;vKI`<*5BCEnV)#YN>Xwp&yuFyAA?(JFszsNIuen)4Eo-tx)(GAz@rc*nCstdJ30N>@i!QHpf z>p%9zi_rCcXZn2IbpXbOOYomqy)(H;q74G$48& z@zuBS^K1Ff2hwR!Pa!P|5!ZNeTCgG%C*&PcQiJ(L`AEwuT-(3d8L$0#8v;Kg;Ft5aUu9vFQD-7mUQfuH>@G`4u=ES}u3zbj3AFN42 zywBnKZ^SNXUHB6$I9!+y5_K`{az$z=G`E~yaK8>V8xDa`vO=t{ZUY#w+Xd1GzFd9! zdSu?Z3pm~OR~N)+Qa!x3Wp3m8z|@k2KK!|feGuysf8lyir^p+u38nQhEMee6@BXFs zbM7t+)A49$?%xM>hLu=56DqEWdfF;Ge4 zEX^jM8IzBn>ea00n-1un;B(pCT(8%`i?XFXyY#l@2GfSkb5}DXg~YEFQ(FQ${FOG$ zQ6oOAj*lx|$+-Na*G~;#Nm7%^sPlnkMc!6OCTpO&hp_NbHLG$wGz_R_UCEPj0XwMX z)GlT+-j{JlB;Ea8`Vjj)a%8PL}p+<>(OSPV6v#iGAQP&Mx z+kB<{fE1 zIg>4c@x{?xiNX7U(oR1l7E3NK9f3dGaQq&*2f4je57qqtsC)0QCfDX&bg3w~M2dwX zga`d)ieW@@glD%?^hEVWmz3AT)6W@l9{c4Y*I&}`C$Y&5o>=~Ojc*vNje!8fzr z$BVKhCsk?bK-8%iOY9(57)Fmi2+~vP2C~$o^z}hXs$~uuMRBJ9_LL60>GE{e2T4;XGqt84kag zt4Q|kS%Ix*e$-Z!3kT_OC=BjSx8`{%PLiOE*EPw%_~y~Oq&&^`9BrGPvsmNHfrh6L z(d+3Nt+D#NB$P^*G)i2B)G3MBoL))iD1D?d%50Q?bkAG20$u*^6zn*&NM|F+c;;E^ z@6R&U-I}x+5;k1D?ohneZ7H2PF<=YC&+Gt!e&frmUuUjUgK6jjSA^m|C-0>z-_`$9 z=M#aZJt74a{c?&p#)W|K@rf*pm>EL&O_QVHl6I~kBxj7tA(-7Gl`mkvfQ`2eYSSKV zHbRqw`}LG{BdcgDTD@8rI=Rc1Da;w8lb!`W8@GGWqX*}USx{n$vYDM+87<8gQD6}x ziGWKcWprr@AnQLqk32rtmdHF1Ets*EE*l_LOu%s?nE*@;5Sx9e08@eOuPZK zcylbKpi7^8J#1rcP=0f;TYkMvzALyczq4mC)xka?y0W!;Mr*dc2)7199Q+mm<~K#J zzWh5~#{YWU{&TXNU4*LR#WbrI%xC4RUFSVI4jZ{^+4WW4n?Ghcse&WkW_h ze)NWr1TNsrJ^36T=6QeDN1F1+)e36Hxm**3w9N3Rl$kK6!foEGX~27h{MNZ=F)MQr ztSf!%cjpkFc8775rbZ(Hj1C51bOsp_h9}eSKe26lck3|=30e9;<=dcpvHXS7lHs~W z^^)NPg9C1)i{B>Fh*{r4LOfpt=`fUiUJ3V)_I%SxTk;Fk8;A8N_g03quD4hY&Q=k$ zh*2$)JTUhHZ18e4@Vh9x@7KCjkaNKTF7k^_8YIA^Yl14z7P!#2o~yL~IBxesaqF2Qm5gpHba4QOM&+62=8IVtDHT!tnO@|FEg7xn z_{X~V(8GtQ3c2E8)i61SjR~n*Z)WE?e)8S(FZ`JhG7n{YNUPmcffm<#H+dO4gj3!c zR@VRG#Gvl`ONAP4+zU#x zZ|qk@y8L3svciCCD{{G3BPU=@ zj|9OW$lE0gL99NWj2w+JN=6Y?~#jFOCrR?u`kUVpplHWOeLh!IzX$g>b)2e{(&@#~;NDYd+$-03bo37~ijP7QT1 zM3K2Gw%JJKOD8jFQChe6SY??HHu7nA0;nD0my%wUF(Hy6utn(Ph9rJo5~whC_v(MQ zl!I;S^u5wh)BZdZ>&?@#0cnx{&v3*7bfQAfkB^@wOmR7E^PXfOnX9@V8)X5#R{PbB z0`UZ&vpJ(yfL?2eYzFAH+5x?m?eSd6ZF(*38|GbrUMmN09381NA|kN4atw_d7E1|| ze@;XXjIk=TBH{M46@-Rkm7lqS8qjHj9Tj}0H4lFb_3?U~I&rL$K2q$C)U)~6S)8+1ya8jP`)hZvZ-iBSrft49Tzx&w4CIN!ev%B-5SYo)Y>V#vWSd1o z=ugQL37}sxX8tbhKlMIsUQjb@JB5@v6IOw?nTGz<$Dbt;?&%lmCSx5;xTCd)0*W2v z%WGj@31`bzHgrJ88UpY+P$n7a4^2$|0`N_?X#oHq!l4{ljVh2kr|U~Z+D}qOXRCtr z7M=$=n06FrVI?Nk7$=8OIR?7D+>Z?MZaqjDD0@>Un0J6Knz`?|us!vwiOA;j!TR&+ zFqgJXakjescKZ;8g(N3yTwTY77rLJ`LKJMEBek9q+=QD6=H? zm0QeTH+!GLGF_IZ&Ff%30#;XTfVOZv3A9zh%*L8D)TcxXW=jP&T7LB3v~<>3PDaa_ z*1UwYDuGHm&hlDutTd>bA6uT-_-8Kk?`!3MeWrdlR5zFEa`%WgG4dL|FUW66neRSl zSR;Ev+<&?r7N^4D_bB@|mn)FqykH~Yg*aD#HqLS*!&*gM?Oj71Cnx2n+55cNb2&vT zZ{znlb;LAl8@l8zZoCPL2Hr6AZr^hN{OWC!BI%ZKuf&z9aOL0gtnu|+ z`ABTSVD>q?i1r+EIZqvkH?*D^lf2*!oNp@d9q~VQJ_vQ8?dV_T;&p6DE@xn~;FC>l2$>vW&uBTFHe{&Wvl6Nv02f zUrB898D#QVa{C3wi-$Xq!9FK|Kiwo~?1@~g`3cjFB&G7p&!L2hH<~hv4_o5wq8h{f zrCie+O%=Vhh@@4j!lZwMY%yk<@c=)4i_B+`_E0*-)oUg6$aKfwaIW}xU!c+IC^Nho*#i^*lg?IuoGEN=Z)$-*2QX*Qxru-g}xMbg5VfB za(_>7xx-?;Y$Jyj2;ItNE~yg$Wr88bPqE8AZx|UnD!k$OE`){WzN3Va1^L2Q9$`cA zz>UZk96CqYWCmtg&0sG2B$VmIgfKTIbhTO?_AV>Ds&EQssLkr`IC29we<0)|( z+4Naa370e!zEYGPl@Wdz|8Tsxngkeir|0U#h%ONVt~ekQ-?Q;uY~%YOg9-FzFnl$5 z8pyZ~zudbG&Hw_jy5B7yGyQ*Wy8zxVdMAf_4)w6}&pw?cRqOE`=ubU+vhD`oCi(pM zNWDN2+3}D+asEX|x(2%(X%A=}G>fMpBnGO{@GjP2frc7=ITwUs65M$$4(WgvO+w$a zi|WS3NEFoiPZDSa1wz6}`#6-}wb|JZ^-rl3u!jOV2D_1S`Y*5Aqts3VB;LY8#UBazhRn33(R|4t^X=M53`ZAXR1}&w;{^ zsQ46i`^N$lysMx+zd8-I2tGUGCsFWD+^joXFLb5|lfUp?mE?_Fh^;$4pDDkV*$qun z9<4IfoB{|cXRa}U|NF61N9hdDA1;9Z=E(>5p%K*mo}u&@kiv-I?xydrV1PaztzvhT zO-{z-Sh)5OIXq8kNrDM>IaxfooNxFd55k|j!>5YOM?W7Pm64fD;WQisz!mKu29V0V z3Q)O6Z>!u(1wCQzS~PcAydgV6rM(|_0gPJc8);e%Vkfjdy@)sWpnvORzuTtOkc7B} z)wbu}RY_Rct@Cy;Z?;TS);O`V^!$}V1adeP1s^P&a^qpOjbw(QjUCw*hb-Hs+s*`CR>>@6yUB#J^8I$N2bXzkXwsSyAsge31> zz8)}07wP4de)PiOswIEnza9(!Prk4J8#+2_Be`2_FBlFLCdr_RUi535FiU5?dGhdF z)hH(^lTfe6H|nFT6X}fEi@3arF|o}c$w@(K@kkC6AUjUwF&DTWd-{W|?i_`d7L}kU1`3 zJeoJz1ST5R4q&t))`>q!0HIqOc@_T8mF(YL)&A?xGnJr@>4Jp!ya)htJKJYwww%f0 zz&>iZWpp2qjX64aHELH|b4hEJpUW8qqoI1)k0bTiZL%@(^Qk$K3sH+@np`CGgku8R zMPG-_rq$~cnWTVB=4o29^-z`eIj`vE;gK8aqd)IdH6LiWak;~!()Mq67>fvxN4M1U zc$?>~s^COPLUdSP;asR666va_K3VD z-5*_Di%%xPoauDr5ChR#tWNem68A|*UzJLY|mc;Av@uC~vEb+9c-n9Bx0 z;Aa6|VJ2~lrNvt2Cm>Lof)r;{6IbcwMisgb7_O8~gX&NJcGuJBwBk*gt0S1Qzphq< z)4om5Y);SIKXjg>7t}Aq_ud8nr}YabAE;kAox}Gyzlz}P(wUk}&iVxI9Q87vIYb|# zk-@xLX!daBhrIPd<3Gl;Ol_-(p3yKWfj|Sy%rfIY=<{1FL?mp-Q3dm_yI75ryL(dP zV?rEh3CutU9M5C=;70&?X+hJWu# zmW@(<+;-Hg^b#d6rFT5pl9?v``lcHGadlm~NGa!&nc+*8IF~0bZ;NoK0*hX}MnMH|WIz z%*0#Zx$s{j_rp{ zLGKPT%(?1piD-Q+XTnGAC(o(jlp-^h24n@1Sc{5x;>eBU#qgXj`$*yuZ4F;7 zcxVGR00mliQC-&oq{!eco!<4)`yypBcYWc7Uf}1;3y|QWed6*ZJj%#xf8;i(Bi5Z}v}z13AXs za4~Nl=f@EA6jQ}*dqbrQQnH?ILj^S#47mb{M7vf4m#N1%0DPE%q|dfzQ7(b>JSxr6pCXmu>Yr%Upjzn@z5q&#cA@mWsrShqWzeRFQ3BJ`>`dt}ax@FI(V7P9#l~R?*t1_t3b7CEtck zs&aac%tV}G$NGw~%H%G@YD!QK5>!F~NrN4p&rOd;B%I>PqAu|!_RpRc`%SVIwR&F6 z^-N#>lKmtn7y7<#Z`Y`7Yerg-n7q$I99Z-S#}?3e(25|%YtC)OYfAZius5v#1}?@w zb8(6&H32`1zv8Xsotf`Gfo(F+>0Tlq801 zNz?ht8%qo#6`egx*#xmAQ58r_$pTDS>a6v%Dcb1h=0YGjYmmM5ja$4L@kR2b>%Sc- z|943Mfrf`0X#1f1&oIq!K7FygFh2fK2MgeG)ibTe5{;|M!$;*ZQ9lTQc~|V~&wb{& z@vw>*HCb;cGvNb+Q5mGA2K|XkGE2|Jp8x+1bQtldHC4acx(e1h)s<%(RQ1@~=^XOs zDfO|HQMx&vSt}tBw<+D) z(XmCP?FA|FMMHDiQfrgb9qkQ@OhqlKYV=Mytxn@V9b88o@_`(bW#fp|o8{*RL`Q)b zuZq2;V;R>K!*P9)J|L2*Pi4n!k5j7vD8hK`ezFU=WEKpiQ~g3xZ6UB7r(^AZIt!d+ z2cb_gEEu-OSA(m0il2clsON_nH~3N&Q%0jahwAm>WH2NA-HoSchbiHlDs$&sukzS7 zXHeXOFcYXuBpTIKQxi@zH=m(pXoMAz&7PKN;!QI`I?>1XQOV>vZ7`A1^ShYaDSU3Y z(ej>)?&Ev=Py2jev1t@J@A{z~Vu4$|H7a%B1qWU9YL~8@j1m{3ZlxvlAl_LZN9+=p zvz?F3dUaKI!RTZPVM80fFf6pMu~na>SeViSXESchtZqo<*7J_X0Azp4redPS(`87q z#RUjLcR(rAaDg-1ytBo;J3p&41EsPIBu}$J&`;z;V;X&2u%p}7a6=?wpOYp(lzbf) zn>Et}?G);JH>Y|rK;v>?clQ^4kR8n}MK*v;-v5(gf9IJSdqCB%R;C+K#AE7ZWonQ6 z1A#O_=vBdt(3s#@MK&~@A-VDkl|~vIe3mNRAvGSELnw5VOj`^r+Yg^MSEEd(+#<@f zoF}Z0)|hD*KFg*(1wp{IviDnpM>g5qHk`G8ZI5rb5k&7;F~+4u8*L8>=j4lF z`ww(O`k%}TJYdk;{R2q&$r*=zYWw_1Ri3**Z>wS*68oOE2j~;y4@uua;D0pGjQDrN z2mh{*{^k%gi+IU?@sT-s`?y;Bpi|F&o>DEs?*gt!X%6W};cSMpkI1ZrGK10P3p*Ti zg9N}q7llcMIOvLhN%LA#esR!E{^p=Voa+h)9CTF%9kjLpz>Q!VW4hA(&h%=dH|?#g zPr8Q?2S&*d-bQcZ*zEmFnO9z95>n=!(~Dw-lzGuWnYZ1@kbH)H+T4Y-m2yJDyi?C~n)>_;RGQeIVPPC)9s<}Q07a-u_SQOO zYZ5cv)xOcky!pVPn%CQogqa!#cY9`NFs50mDJtel^(TcD3<(G`M+HeOd{ZQ;Wc-U!F_2VmGZC-`0EKl5CV5)o+9EmGLfFRKb5&bPbuG{B5jv)&raXpJp`+ZFBV z`DhpQ?U-ice%!CR4YAq10c>{uj<)e5Jv0{wo*y(|mOTY6RVGNAPAu`ezvrhwH9HS%s#QbOupCQh3k_@IJnmLZ1#N)^VI<4WQWJY zw4xhx<0>Lnxx%zhBWeMQ?ai!Z?Fc8W7AvvlQP0?TNn@6osOI1@+A!)t7&_e*=JM5I zLqZHak+ZZ%6>oQN&SD}SJrqX4Z_an4z^2qRBoMmb+cOuMV~37$8jj1(I!#&73_blc+2=fA>3aWqCJ|p&xuoyw2f-y+(tEe zkFuoM2GZU-^svf@WenMkwusG#KD}_uU;eTImX!jr-9;spv%?p=ezDz&&%avwn0gmn z4=|KL=@dl^>=B!sjW5nXU`7#Vs}+B@Fc5d|yTs>@bVnaDMH<89Lv)X~(bX%S*>~(W ztnt|{EhQ`4oUM(q;7FKK#^#7h}!wo6_ zz#1j1>)dhRsF`$~6T-h7jI*JQB{*R7mWM*rr>B9RiH&C-`y12>pOhl_K=lErxt zUi$uFnd&#-!ZnxmF6sA$>&=th#G>`NY5mR|2ja>~6)75EGN_h@KEG1tWHH^eb1Mm> z0>jxYrxR&O7OERWlOXwi4~5d|E!Ttp{HBdp&x-LYN#61WYo0X8<)6#UYh%opc@T7= z3ME@b95kY2DD|ZE&XDuX9VlabXP2DK9-((i`zT=a9MNZ+jf+#w2*r?(@#UCC!8z`TnL^pkH=TH@r%m8Oz0>*M2XBVURret=RT#BrcL zuzSQ9-42&{mvxvDSDfvtuPJnb=+RcdT*Ab{v#;NxtSGAItmR+;jH{@~%1c*zzJx*I zuQ$y20j$w@J1ih&aFm{@5U9}%vxzvEp7)txKC)Svt`T;uMTqdTTju?-F<<_D=h$8S zq}O?8IcLAZ5eR@wN103ka+Di|dRS^jH)Xw^;@Ca0>7ycR%-q?#-q1T4t4kQrra0eU z{vcWSL^|~VHU^|;OqyebFx%*d4Y2Y21n)j3|GT;O!N0^Z%Ee-tkW*-$AEB1>%h@Nc z_l0dPZ%w;yT};z%jZi&Wx8-_9`Q*~?H<@d@Uv`6&GHQ@l8{{zgi9EmNjZ>CzQhZ=e z=e05tm?d{RZf958OAT~z6!D5bS`8amwjm#PqVe&di}S__@D$`J?sE>89O@A@Ig)`$ z_dh6aBE)KPR61T|7A^6T1MoRyuuqczVeunFEPjZLrRN9n9z`7;!E3{8=Wm5S{sWO#)nE zkC-_7!F(~!nG?2WndtMe%Fw|gkM;3$}V!MZCZZMj2M^)EPm5~#ji(h zqRIkC1}uIb0Bj4-0J3+8&F1Qe1G}EpSHGCRuRYC7b0DpRckA}jT8=imG{y5Y<3O>i zeY^gG6u_n*>$&61_*=QG{kYXQWkYYdReWVFsofFb ziMC!K9JIDHwZRm9-<&n4x2W;%1EQ)iQjuZKpeuw1qN*gE6NapT%L~9t>B140^&%zX1^4CEdp%v`81i#NQ{B(^Wn^AgOEaIt12TsEpx{~4_>Xl1gaoock}wLTn` zHP+eDY3oTa;Blr=y@N=f2nT2a@&^niY1TkfwN5^ltU{hUF2=kLX+k4_CaSckY71D+ z@GoBR?7Oc2qxLA~a0d6Du5BLdQ~80*2A=y&nk#+7m7#hwxd zMqMDjT=;WWKCqv$zph|)qpZ~7r7i>G>k^jDf^&Bz#&)=bAAE)`$=WeB5-NS70K56b zK0g(J)$6s+XO4axd_4WaO?#nUkdJ)*e3%bUe?acUVERX=Du)qRQrepk7-EriLc@La zs;$uvb}rWz`0`iw+cWj=#Xs1#5C+|6L8g{(}3K zKX=>F0i5;eC@{t3SIb zO<}=0tG>h)-)T=VtP#`zcA)2}wsheCm0H$>-JlYk1f-_(x3_T7$ocTS9HO*YZ_=Q; zl#!c7p=g*PM%$ql#gqA#duwemj=eC^<;K{2vEhMlLx+BMHzux^^vZ*}M{Eqa)=m*k z#941dKHvcW-2-+L_BBL&tH0g2N6Fm&m0otmwfV|9;_;ZBbNmOCk^p0YcRRj;CFXWC zE`?3phirA;yV@+yHZm$)Q7J8j5HBua9Buee2p~xL@{W43b;_2{-7{RT?(d3UEFAPE z(}qvolNY~s5Zu-ydjBhcw0XoxC93m;*ZN9E2s2k9Djtcr$Z8fty(o`NzPNussMi^s z>cQ1XH@acapIKsQiC1o-j^IcnHEjHS$&kZo_FO_1z{%u*9&*#aupNS3kZra@munC|+C}DZj-utim7Y zQNly#wKNhacPxPK&rIoo3538mF`SBCdT>#(&Acl&SZr=O+1@k-z)*|c{GSLzofMnv zXf4WydLASYD0tn4;8u{Pwr@<|ypdlX_v~SkdJFH{Na>}e5ayFrf&DiQj{K4N>>~?V zm2S}tyIYHB&A0j2;U8mWJ%j?LrGMWjpV9R!7cJYXV+RfwVzww7)2;f*rPqbQ)^Ips zi@24!Mr$pS_;}eea}&P=lQU!b?e1rl=_>JCR>f<*#U!&y;jM{9snz)z=U}yH7A=?? zb*m^>e5)WMU+C)Honzy|A#iM5D9Y+z)`RbP^kTU~C#T7{=LIx5$Ww#1de^=g+lL9nfLl?vUXucw&C|_c5&JH>B(+sXd{p9xb(Zrx0 z8cizNFje6)8oO$7ek=AzDE>81UK{c`m=Yb{N%Jminda9UULku@ZbjOB zrC+4_PS>HN33@F}MfqPP4B&gF0CqM#>sUc*OX}(s&hkg(7v0**o6kd~l|nJYN3`qD z&A(^T&Mz{bxX_=23nqE?wR2AbF$liOc9n?{PWj0u z`^TEq(`~E{7@ojG1$a#J=?}gQ*2A3JP?)Vu1wDa;;*zlbr`!1Z!6uYwfD1W z70zG}?MESK5KLgEBGzVzRmi1`ZhHBZulJ}@^Y!AS9I#Fm--d227PSR@f8B~ab1#A| z@DQK}@ASio{HHjbXISr(o6dMEh0hK69XlmG3;|ojH^m!;GgA%r#Ie=hk6YBu}QOcqTnXQA(U8>ZRMV-wc*m~9>kbyD0il5kj@tUm#o=K*|(xNa%TFxSQbeZVa+ zo*v@#WC~3FYewdzFRe+V8WemaSMy@zVVUrLRVGjY zs1e;r(!PtFkld`%3(Z~`f+MFlfrF+vZ7}g>!|6p%!mZ-jFcVAsS|@2Dm6VFuTp2`o zfi4+DHIg6Xx)6^Wh1hJmKNTIyDZakXX}MLBIPz!zZ;}5+akZX&OVV};mU#)-Eh7d% zfL5;6ivPari9wCW;({?*G{X(A?P@Dr=vwISH^|`j1j4I5anktFJhFa#rnz|$To)9T z-h@014R%sS9}YJfn(P`}o~RFq6OV3NIG25Qql*t&FGhQaqkLNc`^4DD=?42DjAn-M6sMCW~jQOM<3g-IHN zJ4_*nd2{m{!=6a7KdhJ2JFJ&%5bGr)#CnNg1FV;w!V)$~4$s(eTv*Y@7zGlF0YtQ%$8+BZJz> zW4|ac(c2W5=NFCThfCmaHv36dxi}vD(-fVnUjU^6^8?h-&}5u7&vV{;{Y};<+Gfr7 zMqf(5y$41eZ+xO?$%M+w%>A*)usf@$sG}jRNRNF%_2xX-XT=-WP*Sa0)VS;Zk*t*~ zsVit>#Y!QnNw7yJ=mf8UIxPg~@$P(Df2c2Id^heFYf>AR8}E9BGw{A8Ox&N$+7CT4 z+jC9kZ#Uk<9Hm4_uX>@voyPc$7|<#gqFmrK?VA;KkS>&(Ot!Z@W5O66Vs|SnT*-tr z&$eY6%jXX0Fb9(X9VQykVQNAQNee6DBad-tkvy=fQq(o&FJ*7fz33O?bbXL|TQ&!Q z9`8(((+$HS<2OcuZuHdBL!?k?UP*}Q8e8Ug!gKK|Xkl0M`a^f%t1eoHZ zwagyU<5IP5-Hv3D*q7cM(*+`CK9~)VjM0N#o$Th!!+mPF`H&EV^ZZjyv;nr6HRypj zXhC!A+T;uE$hi61SNKE^zW_8MEkZ;Dt$2edEGm-OQ zEmiQZ6mjYTAjTvH6|5LnT_H=bMN`|bOERhYW>#my%_6vE=^75y4YvbgE8L}$)mtm0 zhE+&<*Oj;Ij80OSQh;c0;*%tNqW`sI#ih+GEF=6}ie^mc{%APs~X`vm7u z_r!$nAJVCPD&P@!7l9`y>Gs`(4g-!0Z~qy$p0$P!1F7#PM0PK(b^I_TeP~J5AzzYV z(EaFor4b=cAdA>k_LAVnKM4<1-WaXBo*6z?KsO;S6P^a;>&U%5nQ|3(beVvz;Eph9eTI3a!q$W%S$l4Yi!PWSa zv2@ld9USZ2k70B3jHT$7k|m)nb2Vb1iY`uW}k4@+fgthOE|>_H4vx=lA3@ z&JBA%Fl0&WZM8@#&}_}ON6OE?21~e^qvS4LXOCDd6Rxa&Z;q-P{Ag6};W9>kS__=Z zVPQzAqaZ4nsz<&baR6>R;m<7d^hLrHq;wmm+Z*K6u3b5xuJ-hJ+c(~&z`#t>#d-Pc;!dtd$O_6H7kdJhJWy_a`&cn<|YO1Iqx4Hq|OM^||vrCVw;q;y*tvIp*g zFlJg)tkRZq@Z{AWXn4dlS^hXPRk}ubre(w;896zs9R;>-<2H?&mOA)(cNmOzh~54G z|L<+r*Chs^)gaaamc?6J5AR%@ATCDw-yX3!io3%FWrxRyBqi5Sbsp=3Zk|2bzkj719?lcnx5xV+;Lp~{eF zl^#j>om2e&5q4TleKUAyU_I)VAE;G-QAKy(%Q&-j0@0thfbUNx`WBVcf+ z{?E5G-M^;a0!PuYK z=M?Q`$J5BGy)X*!nkWB7KkJw%Ry$oqwOc`yfMC#MfJT4jD)fX6q|kN*Ey z9!i?`ZN$?cj}j%QHx(xpvO_EJfE9{1y6eBCxm^U#dK7DcW6r=(o$*h!NkP%pC45bh z_w3`{iYxP#Z+E@V+qu#B9tIh!JXp|(6&!Ri2AyQ6r!xCmThUWnnNDt?oAU~qx5|9z z0c%xP+@7oz@%h9U@%g}^G7}iNI=83in{5lTq4{J?%3!ok(}|u{jS=A#%Jg|MGIv6= zDj1Hg;K1CEB#O($hN;3d#V&~Ne-g<_ImL*%lC>jsLfSj4cK8f7^gV5F~o0`NDUf zSU66D!rcj#X!c!mC!ZBTS3X>sJ)WWis?B%~y?YbArU0U9V-Os@s%%$((#8aBLY04d zE~q*c4rT=W){bFLDg*7X0f7XxY1q>y`l1%e7+U!)VmDyJd98(y^*)q2`BtK{@$72XSFdsbLt%*p!2OA1sNJ5MOPN1%9m zm#2y7V#@_d2V4j3J&)Uc3c*n*ly)_e9=6!t5E#AL#!CKsRgY#=meAa38yT|8s9Xv& zUhBmTn(A0EZ$VUUS!vU*G9>$g_-XYJ`?_;L)j=CEk1qMC{t7yuk`?*2m8In($qBMR=~l7!!*ZXB5349 z%;uOocUu*)>R8)C5^81w27gpgL_0czZ1USvwfiwy56SI79>#dU0n_tTL?hFJb19 zL&q?CBhP-bwU_|FzfN~owMQX8;K$~&_Y|~skfguq_8N5XBwF^i;Y=_aqX*#SyYwlA zHk<5bZ82i_$9cC0^<7ndej`^T|P zK#sLN9_A3)wo$s(cdZ@ALT)?ObNga-;8@*vSW?sMHO`oDL=Qe(dLfQDz%>vaop%LO zZe&QA>}UgvGZTeVdhv^Ie9OHNbzpE~UfJP4|7Jx>*Dt703l58m5zlBr_k2G#Nq%fB zNl$Vb^%s}ciFQ~MwG~@Q|0S@io1ulRfCP5UN0C>*WJ)%8h9x=+;0uZU* zT3o=zpsWRD%QNEkxLa=xW+5YS$yonn)0HNJnynxz>b?!(xBx?ao} zRTUPlJS@&?!Wo@c{(&fi37vlhxHS~xBzX!QCJ;i`^x2UuRfIH|iTE6Kv!x)h=Y`GM z?6B{{RqP03=C&G3fDheP+l94?9?|>sP4;GcVqgxl!a;9Mr^fO=OOc}I{qREi%86k5^1C)9(Iij~vhLv~U^mI`{^Z=6_h>|2h1kpu=zEkom7T9Qb|b(_ima z;`(hfMTo_fx9Ii4k=L1!#_qlvDC<=JoZq2vvRbEHyo9^TvCa#lEMJ z`s_ld#7r4VGstl5PUQ^pEaJeZInFewY77w5teQPrMK!LeN`<6;tleM~!Rr=9^ zzI)f+UluY@76_}g1}jK;@9h%&Rh=7^YX!#b9SC~)j>-bOVVc!v{?0=Xu2<_1&CJ7l zt;v?oEp4__g`&1oa;+Vd`PF*4O2`nsLv&Hqy1V^8{r*7& z-z{&h3AG{fe3ybU=mF@tL>Od=Zc*wk>D^gZ-ZHgvW$mk`ANge_$Xc)YfhlWw7oV}Z ztrTK(M25=`@`=eRruYco5tgy$O)67;MYywm_4Vk9&s9VjZk2&j(-Q>ail=_=fwb2| z$vV}3fxX>WQN-8gTZz{9KKCR|lX#aj(qgayG`xVloctA}--Z z8+pGQsmONt`KzJ)o9~7lbgrnP4^Fwh=-*_zD5Ev2Ou1rqy(TW>^BiD6I4fM7`^qhh za4CU7DmX`DsEhK)7FKjR$|b%9DSSUMzg^|{i>)Q<>|juk^jWnbm~FLO>>m&Mb`IEW zibKZ1j!y8zZu{JxH!n)o-ogHuet*ET!%jl8qECi2OcP5?Z78< zzW%eM(vSA7UB$J#)3u;RN0I{R>a_eNy;&t}#UQc%zv7)N#AElT7BmW=~LM zCT=C(ZN^$vPd~@LQ!m%T`gr;ryeWVAhHvF3s!yA0G3|&dD!$=qVY!CLVz41fkj?&Q zQ1gkl>ks3lYQ^MhuUWfSBM`;8cUi<>ZfdMne3l8-dBi^!=wtZe2R@{(a_!V_2fK89 zYpTq*z*TQM#C{;;;^!K4?&R2qb>2xvA zVwE0#+HZQ9FYW2)HeEP&Z16$sD`NBhtHT0w!slKcE*$p@gxLq#&y)GU5`r9<% z%Ue1Sp`p(PPXCV14-8HHmHBDaop#HP-hYgG3jxI}Nq=CE4c*hgOR!YQrw3m!lmGEh z@VCJ)Rvh2OznkhZ6`<9{o+C7}XLr!y7+$UdGcox#rpb*hisNl{#ruUj?YP%zB3CL$pm}xR>&+UXUB@yX?NxMu3{)&yZ5b_B!JJ~Gs;==uBmsRxIE1vFtnXR<+ zOb~&6MLfh67?j`9mU+s%Ht{ruL#8rT_9==VcJ7rS_4wp@ddS59>NYTva?gp)Z|PGx zJl>?icDa~v$sP(w84zOOv3e^)>^>(o68 z>NImkMlee!p=vw{<DJvq5PqMoG!05aN7{C{T_S)V*(w!G{rd1{4}r{- zF|E`Sy!2vu=c&cZz#NMmaO5$Sx6{B0o#UrDR#*PTQFS06JQKrX&a->ox4@yQC3F6q zlW6FGh#&tcH9=XW72knV1J4gS`wC2arw?Mq*LL+Tm9;C)Ca4+qsOzqpt2Mv&r``@L zru|gMju~I9xa-<*v`{JP#yVBQjCN7%x)1A!027pZ?~{?C!)-PCnkW<3wmUT2=5l%S zF3&>j$r@FrpH)FO&42oSyc`5a`WPDt-DZT*MeLDi`=MU5FWBMaCdW_Vxhu!@K0=Y% zJTTVy&j)@W1sn)Q@HPGYqX_=r2W1hyplZjL7KEEJ?=VEc|15e{LT(4sMcOIxAAlqZ(nM#`W znk2Ig=`O5Pw`6C;-{h%y1aFbp-4 zZ>tR?sd0~IA9?oqD^Furv%2p=uD5q;uM~}kq)g>3j_ORxE(EC1!_CbzI?fslWV*4x zpG@R0|3)^v(4uL>CzhW3zaut5{{NyylDA-S>enjOZeshicZQ`@#5vd3C->#-p+^2D z*4Lj|weMNa-@&TPsU8V=={m<>tIo6%?59jL8!J;=wdFEn9jnMYQe|f_Q@~LhpV1yQ zfIgje#+TP{;nDXSh9I{GdMtpnbV&&G+6k< z1z=SaP0P5q4pvGsR;txE%8%1K58V2mkX?ECMxfYz4f(;r<4)RLJ_^Nj_$iS|7CQz^ z`TJgSaDFA>jP*q|v)6F0K=suO4cEm%#b_tq0~O{r4}TD24D~)3Yz;Elxq-As`ir9f zr@jKGsQ^e)ori8%3^6cr?^Z{yK9mCM`K9))`s|J}>pf9dM%Fhkp!|utyn7}D^QZ0>JPQ&Foq&Ln`|z>Ld4@lZPyl*}AS)d=0yY%i#BN4603& zz>E%g$H?qPzvNyhD^{X>Sbw$9AMg03-N!#|PFVf!QEHNZjxRWT;!p740-}*~8ZQsW zs@t0#g>z-6dOYj)6THk_@uTFiZuGvOGZG88JFa~c)xEAX<&@%t-*pQSAk}vAgUzS% z(6(c`$!sXVdWtLG0~C|jf2!*8xnNn%%!)fk)3eT@Y_-g|)UzW(%m+zUUH1bdk@zS> zz3*cK40i6&8&RO({^gAvr4u|Byi7n$Gc5Pw@s6`!=?@!Oul@{UPQy)^mX#iu&+4gQ zeZ#?^hg)nm>iF`cAM95?eKR{$6H=C}omq+i#J&3pk5S~7_1a9+3QGZsgg@y{P1Y>f zXJah_^gPu3L@%Uez2bu!fiT7(B<=C8DhtvSn=4?pI5Oq>ai|yvUJG$4Cg}B6S*K;O zoa}7Lp8nMlA~Tj*%f9(u8DI&S=v!cMbD1fWOy8KY#H;oe-`6toOs_m<>Je5Lu*jxI zJLu*Oca`e0sXH^~QZ8&j^-BledjhE;A(1aE6Z$t8si^$IjY*}RrP=Woz$Lkk&IL*o zrMTs8b~atJjP&~Rbsm69vhY3qQhvkKCgIZ2?E}`&$&v9_*#}(^M&Xd}%CCJiyiz-G zifXW5c&>*l2R&%wTX18K0U!4j>l5auiF)G1g^p5oCBzdj*$oK6-#lDZA;Yq3mtr*fRRt#n{GE#k7-0L!!#ZwanrO z?n){HXZP<@)PL~!?QZ2q7fuNZa_v&!3XaLYbSru#o0vbR@i#~NH^F`HpWW>wT(geT zE>rtTZ>VH%CeZZS-SLH+G{KkCV>kE}5 zNY8Hr^h_BCVZCd7shYy~8^8MXxszaf$Sxz^`s4{@F|Gn7H z^TxRafD&gvBp@?Okhq|!Z+{OgIQHCfd{y!AbrZBJ?Rhh^7Fv4p=yvEWj9o*^uW37i zO(xyZ)PlL%l3HSSb*Qcdrz=?OW9QWgT!n8@;YN=ipS%%%ULZNEMdwMDrp0jwKJcED zSHS=0M_=vDCreX&{#MuSi!LZ2r|v^6+$DY=s{s|+F#xhm!yJ7%XidZ|jh()dKn{|f zyQ&3r&&mw9Xst(f4;-voUu-obcBFwN_cDNM<%YDDm{l_XZM~-=lk|zPuc4@km#U)s zDY9jev6oi>I-ND$niHzfyiwl+O5Ei12l#T*>WBtJGRp|`4_J6MC>RqX{o9+hwuge#*HbGz*dI3~leBd%&w7m>+?+_sF=zw1yi@SF&3X!W zx&74DPnGk9d*{wn=_h=jI(O5+CE4ygQ@Ru&bwyaiG~opJntb`lv?3L6EBo+P8lLDp zo-`XhgB9Yotv}a4gWp;^`*^iz3#`1HG6STrW4j7WS_@X49%nX492g_O1B%s7Dj$V0c=iGosh2n_m8y|CAQaWZ@pG7znzXG@aFu9+Dc7M|T zK6-GyV$cmSl)sgn{38e(*|BJe}42yd0`i2#e5~M_t4#^P^ zl#U@rKoAg>0f|9cx}-yq25APA6lsPok(3@l8YHD#5Eychc+T1P?X|D>!}EN9zwYDk z*eK`vueE-)3OVVgaw2zH<9#2rG0U)Xd>-FnKe&?MG#JHa3-eqsR@FPu;RDwbp7|cf zv?=Xq`WnAt*f+`brpuk=6(*Pj{W3$%V0SQvxdGFo=)qH_v=mI{vc7JuM>JIQDw>XB z_d^J0_A%)VJ$$_hlVItyc)S}vjS~D4#zfpI3+Q0lO52q2yEX&t<3!KBvlGD!<%0+&^hTyLw&`DaP|Qj(Ac&} zWZeGK>KOcPQqYdje|(%u-vI@O>!>qiMR%3_14cbqdF5Nsf%I|WA0K?VU33-L&8t z#~?ZesazWEphp9bFl#D>IvbgdNBL};e64+jyXIIDfWAh#?wtNdKMW)poz2eU?mon1 z#&v&bI@{X88G5P5ihWqd?=cq}f{0o}Lc2cp=&2m_)FdK1GgNzDs-!5T@j1|XzL^JU zAWu$a-;rM7v06=aQ-^sR3ZnSrbzLlBU}cDKe?7IZ_tH|KW5L}V>F*n_4t=(zzt?XG zYzmB>b7Z2^6mVTjj{G2G`uTqDaQ9@j2~rFG$T#5>?)tl2rgsDAB<;eQx;T?b@AI_! z^-qDG;r78+GOTX9Q8JYa7lfEF?LIKyMy){#+!f~`hYjD}26#uhsxJ9}@CQYPKRT}w zp6l7`)0fVR&~QClnn)=O`djx-EKY7YpB1P6v|^FUDS4*;n|L@Od=iQKP?9P!IKsFk zT|?WCl5sV_vx$?-!Vq?%N~v3{SLJJ0{;a=hSrs&W#`LZ{ogQK-s^NOEBgZ~7FE9ycv| zxkFm~NxaQ%Yu9sHzwhl)tV$N&R;2E$h{hIG?nN7lj(Lk%OdJtU%@)c`R#`O}UJ*%l zGdRFD{MdEBqHIvM>-b;Y!=3^_PWBF|Xw6ka!fgt{8mOH{Und?Lzm$TCBh9>2i-PGh zDD-uOPodlY`7-gmW`uL5Wy^i9;hkjE>Hv2E<@MN!8#E$Tc=GN|)LDZB# z5qnGW8|zU#*Ctg-PX7>c`rx{Cu7vA;oOYIhUtz2-jKk&RMr#6{D90ghnUQ~hYUn+g zfY?(CXK}G5g)UA>fKRyv6;Xjrs{Q}ENf98?Uf|&c0sqCKAJR{P(yqMXbBuv_>9e88 z-dU2ETV8O;BIh00i20B`4AHv?oYDrDf@9!ANInjfm>dBQHT=mP_}YSN!;g?@d|zt%8Y!)b`X?)k z>G5*5ZFee<7a5FfSYTjiFe0C;UlA@L#sx|bTNOuli>nvi{W9&eoIe>7p@_*i)5dZ$`2M$#Qk51cq4IjfwKk%GNq`@0CRDNgvPo zWB0=kg~#-VUoXSBFgNefAaUckY@69~@3!wzU0_-_F;_}7+68A|4QfbYe0o!6GwRRp zx{~Io3t_ZWv=0lOece_y+1bwrES^8XWY2^D#~B1UY;#W6U?pO{=&q%rr$Q{$m$DO) zPgvDt5*lh#XxhnTj^~0d71oe_<%im1D6XR1SBJK+(W9E!%^*^49`>2n3QJ~@hG68Q z@zo)=ByRbwjG9$X7UBDzChhe>APn(Rb~;5iu$b|-J)1yQX+@s|idG0U>r_1NvJR4x zUT3@k1KqIT4zk3XL*Ey>{HR|>9Ej+LRT{a)a!ZlKt0*wzO1l)5b9gVH1G7Td`04b{M0?^yt_S z?8=s-PY#opDu>mt4d-fTS5%rFJYmw|jXT|m?Hec@jya}icNcO zR`IFsM{QfM;ob-rX$(U-ej1}im-wn|hVnpPkF#L9Y}azhGoC{ipD?U*Q*JKB-AFxU zmHT3B@+ulH@bZuVy`Nm@r%nPd#s_%*GFuE2#4p>q(y#heJAF!Q*o?m>EjU535OZyQ zOmXu@cr2Nw&GMMeI(x!?+qau#=WSZv%U^uQe~qaxbLC)qm>FRR_>weV0)M1zHV#mD zDklBmzkqL+d&;6hA7{W-D<+*TG9d;2e`aDZySEb1+e9nV7c#gmBeipAI>5qR^X_}a zxN&%3`sosv5twMLi8K`_vEVw^sKc|`=8UZ70@Jp{`1a?_9Ht+@y4qI|=9vpapvk9G zY_t+yn18I4M{V}lMasKQdj2Xhi|yu0_ZHd;ex@$YL1|1UVd6jfGCAh1>7PaB3o#0> zJ0HcJ&0o573Sq(QPLFVxOAHXuE!}pTw9LIlQ`TYKz^ai*yflc^Mu@v0f3}^0wleWn z^93oYVzsh6zm>yBJ=H1Tj&J-mL zsol1xg*_?a+j}cl@t+nk9dlPy)uy1YHTP0=7Zq(VXcU^0V`+_CbkBneb(~h*DLtCy zR+U505^j@@u1_tNfA;X#-TnF-4AG%z$)^nHeyK~}E~M?%(e0px3VTIKAEMRhCZj!P z539cf>e)94ud_abg4_=^?VgU1V0xUv)3j-$07Y{UyKmE#*?4j9`SprNU-8UebR~>4krVXf<1Ak?7p>9d;TIwx2}KG`ui3G1~=lN zcQc90j%AFN!G@`*oBea6d*df!Z{ma5ELTAdeCxg6L z@a#qK#Lm>K(^R`ZVhMo$vze~ZygK$I<-3lWgjnnXU)WL@8Cx-@?QvM888hmkR89C= zXjJqy#sK}-BQBYDkF@o6wGWiyU$<($>w+aF&XD~tZ5#~Q@>=`wX(t;l7r#Hh^JiGQ`($mW z0&7w+F5Vr*?5N|SjYUSq`nD&^6j0^E58oDvO=`xEFRFU05W5^Kb}IUAW&vhRK*A;@ zSMY7(!cf#p1q0X&hC`whkbx4o{ecm0)$T8X_?CS@2+v<}DNyWE{s4(67jR7X6T%r5 zI!r(AsJyh>ksEqjvmYc{Z}j1X`egGZJQd$P=MRfSVdWowc!w%K_cz5SW=&KNtuK5+ zbTd_DqIWO`4F{k^)6lO;=b>vQeEmmSGC6LId#RzXQh(VdBN-)fmUzQ-pg>n5OZhO=TM!;dK zDL7&CHh?flrSdL^V%}c4UivfiQr>w`BsSu7y8Wvb#4lk&;nF*uPLe6AzElc}0|(W* z)tl{Is(p(otq&)kLGLIL1(~h7*{pp37{|0TcYlb4T;voulpmvF^n3*FvG}Tg^6ZqH zp~Uo?NJiFoPs%;oiWPH$E>#O4knhlg=dzUqR~w@tO7El>$Ji` z>48l*02vv>;%Q$i{@t40jz_XAk~qe1GD}=T4@yOw2{6 zH>2%FHvktRu0hw0t7svf$MKj>#m}{T`EiDeqaToo?n#*)?DXD)`GzJ>rA`W8mQ2HE zoeV;CUAYBE=58}w`GHTXBlBYNv7%2rCU+@ObxvlF>pO6!? zs8r0e#B`OqOksldPinsHT%5N1VJP4A8@Ke z5{T|8I4t}YCfi4_-4(}`>nd>mUN|OkY-nn9#RDCt{X_MxxN~$!J;gK&M*jQ5Na*=- zDd-BXCK-{b6dsS-cH4MoiSD%d98PeJ?m=-Y(3K@c)0l@hAK5d%%(fy5_a0Mno%K0# z_%7I)1E#gaq09VP3%AbUydwPxGrT!FbFYLZ9 zw*YimTR0d=@gP!cA%s90C0s@|?fYkI>{GCg2Y^U%faK%XYy#sc;P-2EadxD!Bm-aF zc+Qe1Ph@IXR%!4-|-05I4=ep<* z(2r*jjo>N=m7K7lu-j19BeL`!*mBjB)TR5eORKH$ka{rcpiBGh`b?NFjysRs)`W3u?95_8h{AtSHb#?9?>pBXB7i*=WQ4RM+%z(P4!#pRg z{V&DufWPq$Y_q@0xd^No0K2*`mI>w&)9E(98i;QDz;={pUY3fU9zPWW)EeCDChQ_u9!vIp_O=+PBV`S8yo(@p!6=Hc ztc_i3YLeUS0c0iTH0etAf+lZzZ^jFTS)f+^#2XcnAvUi2WDo*9{E;YexDSCB-h8KC7H?SH_Au97Y*4X~+?8#?7$p@y z4r%hvENBk$COQ*{ntF0t<_Y(84D|yzE*TETC6GRH`FFp9Q_$XF+XmO6N$6`Crrq&8t(bTo+6xfx)UjqJX3AsXK`UMxzW-0s-!C}7~K&`I4 zBy-raoM@O(!7z@lJ^X+nA&4&aKy)FAhiCcuX-Zu_f{4Pv?7&^ z!V8|%QHWA3U{Tbm`p#HEnn5nq_KBfmJB^>S=up?!Y*rnc(%5?@73IwY^Z}^i+U^3y zqKbvJP_DG`mz}L7H=7FXp@}oZ{lfO{ksDO9;i#YB-X@wRJ6rbwqcH+6ecZTl1#p0 zz5V;Osc`E?^+t_Kry^a&rL9%#Z$XS&t%|;OyEGowHF4g`e}~p@Z*ij9%TpP`AJtD0 zbqWmKKr`!l9zCbsq7+b(2V^du_)qUbzZZ~8!h9X*@_T|sWE^M*^}J4AWsXHPi154I ziQ=%!Ha5x}FK;Jc6b~`!yqk(aL6fp~x%oMgz00^b#VJk(Sm{K4MznZ?jbDaer$5N} zr5s<+zDmXA*D<%Xl$SZYBz#%&(FT!7h;iPC4h zvVGuqKr=C|8b6l*JS>}be=$>LS?jT}pzCrjpCOo#EHWE$#AUK_g~|F;R=mQ`-$)F| zrFLX%#ZN)HqQuW9#rGa=DTv2>Ijlny{%2p=m&WslE%k;vZKi-rm03ntg!Lw2S`Q=PIa4^D4;Sj?@JLk0s;n7 zz-#-6Exx}`cap1-&ZG`b5)c?vD2~Er%ssmI8N9%~2d|#m4g;=ftYNoy<&yAdeX%Fl ztBKuaecYB!0(GtcjoIsHUkdo88=>Qq4S?Yy!{v5sxoEvPo(~=-X{C6l6F8{C1w#-i ztMXMnFNJlgFN{0Bw`c$jgAjC#zH`1mDRwL5mYcVljvrcz-Wi~`uNN#be_{19-fWfM z%bR}qc~zF`!S0)DFMKls-3PUV0n$)ixM^Xw-Eef>+qa6{Y*ib6T~Qz(?}~95FE_ce zvJ)P1zbHPM_hKg)T4}7CPiCsjAcRxtyuvpCi?9R-*^>xaW*bfeh z{^Lf`SgEu9;dQwTz?aB;ECRc!-!?n^u6V^548e4_Yj*mZ4$Fc9{Gm?Z6jel=(7DGb z3Nb45Q9}l&G4P~s0hcm)wKSc6`;67iAmJ+(F1`y_U@D*sP#eUKku7PT32zXZ}-v<4U+VEWwgN-e`hZkQ@2l9Ny!5NN&#< zvtzK3(V2pVNJ;Qv@4hYc0{K~ywC}bvlI?0O$G!J@TYu=;|9mZM_3pJZQ#YX?U5xe^ z(~qc&aJyoxrwgtgs}`Ax5TGUpJ7k#7fXbLQ%EL?jUnK!86etNKeaFe2R)9ELF@+f# zFHI@x9uiU$&D*Y#GA7xt?yaUG_CDIhkm}1cVJiGr#OOQyaAqG&h8okPD}xnvqJ(j$ zKLYzTFHyi1Q}#8_Bv+h6Vz^wjw6J_RQBfUoAa?F*%TN zcb%)TgBq0|(S*s&j8re%S^TD0BJ(-~GYt2(p@;}i`EGbt$$E`_+EIsR=Czb`Q_bUs z^ISfBo!zC+;ruG17GJ-nU4s_C0hh&z>U9T-17fBo4spbLh}Ky0vTLEo&(L~twweE8 zCkrTPZ?Fl#zNXyiA@ii9yK6T+H@2Y7M&90@?^=nNL_QYwB( z;|q`B}>muy}^)``ZTGcj$rI)c40l>D9N2y`_uv+p#)IQKKC9x7#RTHX|F(V z+M!%d`v>h(a!u_=875FBHgQ}U{Qln08OK7S%W7$u*vtZD(DL3n@sGIhr%fWoIX3}P zPBy>!tC3#f_M9FV4=7nxNW=)q8ua zkYgs#wG6WA=soOX^QzaBEJbqaj~2y@#XkR&$W=q7ZwvF z!BWvqGajon30g0|Z9m8QKm19N*Ab5XGf)0TtkhTrPwuXv$Ja|mE!{d`k8Z@N9)#<6 z{hXJnxUyAUIw9qQVTd zY^A(K;js-`p~HY2Vc;_jX|3Pu7auQv>H8j_3_0Y>_N6LImlN~~K6ZPL{x(ndYLEge z_t3qXn{+tbq!m!1qwmbl9s@~DollGK3P2n5J&XBzx;K6>1WO&axSi|QijyywDY9b@ z7m`Xg|G;R*3jDpvK5T!HsQd-2A%qOxq<@>-TlRad0E~6pEKTG7xME0X&%7!rYBy~| zF-FP6F|80#JLzz1;?6iKN+Lzc@h0nbi$xY+A3KK#(c%6J=GQjkJW!Wpe-U{bYgI*5uoXPX2s-MzeaiTAU*5V5xE?Sf)ldy zfW`QkMRY-@RZ``pXX&!=7S^NMvP`vaQKKc*<8KOk-R{eE)}x%i~$KQW0F9C zi2`i&j=Q-UXWep8iIayN*&5(F!1G)~F?6B~kjjHbzB)fJYG}6srg_%+!iqjC@xDsS zVLS-xfnMkwPW5nFdJQD|TNhi3+oh6%Q98F_-o)|mbVxw$C&!7oPDU08qOq;VBY%Mf z!{7WNB1Aqqqp*~h7cx5!DnPiFN?S>4xD*d6K}A$hr25 z@&~h zmiX8WBJWj>v=>xMiJ6!^U@NJz&F%|pOWDSZzN}+?GU|u!X+461Xh2=RPmtt-korQl zYx%t-vvuwYwB-KFS#I!(fO|>d92VEvVzl>`CHDc1l?EQ_K{D}DJ4JznQ}(}^9OQG?dJ1LT2uKrbjiPm;0ocUd9*h)h^+TIF7n_@{ESCOD+YA)m0L}gFl?Uy- z)if4{{$rYQxn6;&hRW`=S=CfwGeS0`+<~g>R-&fsf__KwJECv_*Z2ix5W0fck7t|f zu!_-e)EWwA-hFU=lBkR(u6jQ{!H`FCpY9gca=24bX8E~Z_KL|_rUz!2p)A`_-g`l_ zKx5Zz82%`l7Zz7uHUJE6O?r`uPOB^9m`v!=DDBP{7w<~v zb%mY8dz>-$IMEtSxJVg=it($>@mJx%uHa%5s=*YYhTYZl1%Rv$PH~23(OF&+nEYO9 z^a2pkc8^z^qaIJYF9bd1GPeIwK|&45l3f@j|Mh3P>5bUj+ba^p(!XWEzwnX4+?D_J zJvrbLFyX+at}yv1vyxYVM5Q2bQe?A}H?$sW?L$vxMn*&|zRSX;;J7$KMT}+gn)4$x zkCC5KltCSqOXMNp@Fg=+te6d{9zarl2KyxbK3w63u%&{nT&+{K5A3=>uCo{AB{W@U zV!M-N4vCf2Dx-_aR z;Q#`M5lyA+jqli?nq(W{TW-eVAE;^e0?=~bVSq$#MMr9GE^_<)SN;n6wEMFyZ z$b97co33}}P@rb+onL>PcY9yCvuYjKD)#UKJodMgC;WwQ#jjhW=UChPwqHp3+{`|* zoA~)0@=eqrEr#md5;*7{jq;i?&xSMIlh=81*7)c5FONP@SX-p8fy(b1PKh!{cIm5* zlX*#KJs=e|PzI|eZ|6>c)a;HhY_fctqfj=PI&n{|sG4Hsjksz(D3Nu|Eb} z6xYR$Y5&Vqun8#3?QtXN7@>AxJL$mAP>Z4+_IxYdW1_fYflNEZf$pnAjv6C^E&D(r zcn%eA<4w8Cu&e>47aR$Op4qg$O@EZ?E3%v$S#)YFJi(LO5yqtXSOr#Anp-Ru7DXo5 z);U7^s^>?fmdk1WDmIfh!jFnI%{vx=VfbtC5F^4CeA@cgc*@zEqa{>NDl3euE`9KY zNq)mi>THSh^$RBV;M2jx0Pk5CBdSZuR+6A2gu8knBQuiRIR>$7%Okm*1+$Sk;OUbJ z_XsdNxfwat4ctwQTo?>HSIKj_9vZ1`gdp$RDIV5eB7&1*nQRcKvB4E7c%#tIEx zFS%7Mnr${^^|5nFF`ok?Upf7HSZ&zfN`y0uiHIYbqNq}S2~h7%Nr-1QXOsDEp3biU z;;PXWiW80aA&Ghd&TzCFA%fC6d-DK2&D{adqM6v6G`&avsDKkw?ui-6f2O4J0wog( zfsZV@jEetAC5^w3MhjaPmML=mWcKYKS>+u3 zW0&ic?bwg0SG=nFnx7=5bu60rY~h2Zk6lMQ!g3@yjk;x?)t#mA(~CiV{{}3&nL(i4 z*}<4bTb&TzOQRbQ?AM;di02ju&wRZW-iRj(F-(HLCHHsc__y3{qgvX_>xwqpK)7ic zXlET?^7$tZ0mWU`1`&45Dn2hd{IpohqAW|d13TwW9%PpAA}3d&TAbAZ^HLFl0Wit^ zQnuG9y!9j`LY$L3Ih4cVFbO?nLpt}Z^)V5I_}BEr_eK@z*>?Bg7Mw)Rn6xc8uhYH> zKFNyV2iA*F(;f@siB_2~>)lnOJ79?SviK+kKy3iuz`2>u7ymq1LO>3WCZx85WrLYojkGXq+$^=f%cT(DMg z(E~7xVg9F-o>iQ@`kzv&Bd`%UlGwnFWJ>zpkN+LX25_dhDM=eHr={ZtI0Pd@Vm2%8;Rt=x18juh1ZiN=tvxU{G8P9VUaXk-uU zgqu9eDDNGC{E9A7c-(-Zz3s}u_i!a<cz~rM15z++ zz`MOpg2LlAbBU6HeZv7&sO)04sXCVTGfot8BNLg#BI)4#gGAJYRZWCl3w;O%ZdH7< zDxMb+6c_>1NPQOFkjl@E0O1oUI!3v^5FZS!2g(AImu7RkSIem(tMUW+Pd(+98bF_< zin%p(q|;OTtC$`j0#-97(j9}CQQ&5z_E4HqjW{cWcPUI^E$&0YCxexC79t)+?}DS%1XBh@FG`c z8J)_98;)k^ad1G3{T)&<(ZnJZy~8Ieln%Ze|A5Sidoo#?G3&q)uogt4u_q26tcLXf z-I-MB)%<5It9y^k1Kr^9%j1k{0EAVP*)6m(n7cuwWy2QR6}?=0CDmSXdn-<_(lwm`Rv&Tm_vA|$0F4`*t2NjO4E9LP8vXejqXCKv9tyoqnvQs@j~7VU-QwKMf) z?vKoiE~utso+vpr^gc9j9WRJ_>awhvtiN=p_&9fMP1{$+7BehXXz&2CnWqZmhvtjV zEFP}~susHP-+bGb`QSQd6wf{G%kLsWpIA{W&ySm4!vDj z7E?Y+xE;}6_v)Z>+TpysWQpqrMT+=MMbCpB7$-(PFKF|05*vSfu{_9@9 zzgn>AE9h3VSh@V!`eNv5TRRhgIbMwVNAA*4eGat$Du0e9txNbg45oCpM!e*fw9c)I zzj78?^>U_3vhJ8O1gLqbF1S5&0I|G4UXO5{h(XvP5))Yu$Kh+^HhX*l>n z=6NW9IxO?FyWjPw(7R(bV9va;ci*gy-pkH%CGi(4Tg5^RjW6NJUiyX9hDu>!IXT>0 zL}$JtmgZW~`+&=xTr%}Prb#}4BU#F^fEol_i?_^hH6z>-pPH*aPXd8#t zYehE#TLZfEXvPcTt;9hturpzlt^F5MMtFU9(G70v6Zg%G5TO%pQxpAp!#(eNH?T=W z!$%VMq2yJbQF*B}xQ8w}c@(N%f@4MdXo&Em*#R%SZRCMdyGIaFMM0Z3GA$M-& zw`yjo6I;ZL<$qJkYC}jVZP>tJGlAP7&}`-U|EGLN8)Kngn#5|e3%+^F%y=j8j`E# zx^HB1Kvxk#EJqu|%;6D8CU`S!Dr}eYU>)0THgXiXlpB8`WzB9Jlxy9erp?ho)JzOi^Sfz6)G zBt^(fg{}2*Qd>oIYalZ2Avfd9R2o4_BY>bpU6Rl+M2KlUqZt^hNpW~^tJSE!=vMt+ zpQTo<_d`_##w<&X`4}e|>vnv5M!TrBPbeV@7}?&F>FuFjse1 z**uqbotuB_8ld%PkEUsAwmnM%4}A1%@zK{kNdq=<|^TG&G;W8w-20L;jkv1lc{lCJ6& zt38VJ^i66MWWSxdo0%B2hZEe}l< z=D4~$HbzTikmD7D8lia+k*8sqr)%hbv4II+>`?B9@))Sk_@H85#iJ3p@8k$gT&64={Yv6%acYG(JqAtKGx*9})^+)X^Ai}8XobYuhn8MFOH6y3?5g~nM)ootKAba4 z?b9GvhQ>>xSIM&*@rEYRjM&hKCkqPt=yD>LwrZLy4H)aYl{CpZbfRZT_p>)?6EPqb z6NX)>TB+KFgjYC>l+eBrJ1u+vr;Ne!01rOAK%*M3MU2ubWz!zT+x@_dU^N~`j{Aav zD3@8jpl|G#JK!gUTbO45Ee(PQAc`=w_Z&_hI%@Xb#uV6ugiO~jxin}%&tBI6bYv*( zGp>u1v;>{%vSNURERam}Yj!>dY%{;o{eK0BF!xK)+E0uzrB^ ze?z_3Ljp2DA|}Rkw!2po@u;sLsIbrKDyD@}iNQ$gVXEN77|1DNd=3X_mIL7Vgnx=^ zQF}D)rEcTH6Rfm!#A_2FG?5Rkqiqz?@v67O~ z7Lu-Ln&%$u)T?Ze=s209ul?D(&N2ko;D`pW8&S($0I_e`O8)icH=q$R=h$DpQioTI zSE|dWY<5oZR`&(6?E4ozMxEVK{{XE}oQN?ez+qFT;bQK1hm8E9 zv_m~9gwB`hDM;V4_gzPope@vyZ)_bAFv``WGf@z=@(+#12 ziHb!h3p{T2_Yz-kWc_L>TOIs?%ZN4nbg%r@e>xE3o74pTDNJcz#mL zmSdmh#)eGZWMhoa)2^mBk)8hjK6ps-{|p`u_`JAi1e(k1MsyTFtdG^)^{bJl5j_rB zaBPvzQt#p{{=5;tL&rlIbG$HP=wIB-QX*2TSS<%Gs}mmIH6-sG^K8Wf{Y@E`cJ zmJ`Wz4AF{fNClZOl1?V4^a%@=-zxBkO+sg27mA2 zHUCK>y7$#c2;LI4o!M(!*fC_s1jf|x4^xu=#!1u>kMpQd|Il|<6INA4 zX95w6nY)x8%|4EB97+@i-&DRH!Pw$Wnm+ak?FqueX_lZ5S3dTWWI+zeP2J!NO4sCrJ=XhRcrO)1F|C;3D@N*%A3&ob~A;Q{LN9_EE(`akq@c7`vHde zUBcw!H#TNc|5V@D!jy{iMM}r&`JZi#)$o*f!$a(quj#Xvo2$ZtEZV;7s)nB@S+>&Z z=u(m&bocS8Jysn(Ev{Nk^SbF1t*|9tzxKhO6#gFV$bS1tL+{{37nQo!SWWV&98 zWt~I-;bAs;@)ADpF94hmKD@DeBwghpiv1niWp`PT-#6 z`x;&gRN2I>+*DUxqdwl@6y_J3tcJp|S83eWf(hsM&*8uN5n4Wj{Ym#+U5TKMR@a_u%rKl0aDYN7RG(Qs9jO%Pb=jr4}cIP~QhsWb4sSl0H zSpQ}Lh)dmI{>DIlJO0;fMZZkldMo+MUVj#fDUXo&ZG7)9U#_LUJ>x|c#>z~IxhdlW z#B~5BG;zc&OKe==gs5w=R+#`h=Ci%hrrSLxQzM$0Q?I0kL@lJ6q)B18?YX!p(-^%= zb4%y^Un#K|o(ay7-bt_;n!w>(vK;E>TR6{oTmKP$G5co`23Q^4Wl_HM%(k1w?5B?d zm{;1rW@)$%X_gNv>BB_j278zrCc8_R&&tMvA~3^IMX$S~5Q|ylhAPXsvm0x1{BZh( z%v|O{+BWj+s1Iwx*XdP#_O;pWY{FsBM`eW_B#E6u>boO52)(ezke7KCLM23XWl1O8 zW=g42$E6v7PE`c{&z#e7Cl;Zb2c1@z#UyXDHo1zqc4te7tQ8`BlBgG1uXD(!o_-In z#aN#n^IY_-j197OD;P-lF6)TTNXhh`(+0{xi6N>xncrWvkXQXI?!zI{aCsso+rs_5 zMInuxBNT3tI!cL}`r9^v&zxXc(L7SjbOxs?m)fuD_`VKL~cFU9hz#h30-NvE@uLT!AJ+wL& zGESc61X{|cy*QOH{#8g1hS#ImjFk~LPOjG&x2wQ&sxSizc(b&D#sCPU--T=!bRpH0bv|!O#7a= zTmh6XO z1mza4puV(BD-Qg@)Rfr#T%G;TF7wmWw-)cr@vI!ZJqkVb4%h$JogQjx5T$+9w0UmT|z32yj4 z21`OZ`d#^=AFJ}Dcce~!7}^WS4zhzAUZ?C{q`g_K^yt~}CZ7c4LU=LG96r9QeIWR= zx2#1LCr{WvtEGLN{(M~HaE3UY7>rAHt8(4T`d9rLspq|0uej@G7z+M>E9>)nusiBC zz}u?<0kKM39PV6pv8Xk%Bz}^S`bL{E>Q{vCxBn97i{Xvp2nvQcTLm`r*p?n!p4Eqx)NnEZYl=JTz zdNtlh2Dbeq5xf!H%sP}G5lJkhBk8V|=DS{2A<1EH-4bu})@~2t_M3}-In=JbFGroh z4^kTH$Lu+3A{^S0aXOxn8DBIxG#}Cc!@dgN4;S!_pNuzjG||@Kwkt$?5k&YR#hq8O zMk90?p{9uH(|5HrZ|uCmZxCwJUI|IYtriVQc_@~}O_25AICD8|=5JAbxI{$C8`(EL)V%^{#8Z@(v_*(-~IAL2Z`zB5RSryq#hh%p=_kJinBEnCuAq+^2XSl0~SA5 z#C>=2h=cUe)8pL&8^p&52fpLlv4&!!COP~7S?DV~;%I9fM0(FI>8=Hv>bc}M_i3Hg zJ)njVUhJMaFF+ib4+DnIv6CN@El< zMb_+(Za%0QZ4-QZM0y|A^?{!l88$Ka@waT6+t&beGlyIO0vcPvEb}H|SB1X9`!R{3 zI1!rVg>1R+xySD>@A>V0_mYQ?>Ve{!{C;s5x(;9xx9~f(>lbK3Vc+RRCn@{33w1y_ zM{#~JaQi9D04Dcr)&hx~I&nDd2M#RqdS#9ZFe2M^I;6If?5CjgkN_IzJiFL=E67Tr&F&^vlNDKvey~TXBV4Wk)dyc%1`(-_e@jMl{6(oz2>~PJnC7aMm?O+<=i$zb=wpD{Ys>vAh)pk#^1=uZtZ_F zBcn@s%Vh5B(O`&kP;rg{poy#%|FeHsZ`q9i5G?tT)*|CyXdKSAzvBAiD}~M zkl0$MI^-9XlDvU4Yg0h&g07cMX!h49W7Ap%=}#R)cFSuhpTTA(%4Wt|tVnthgL)!@ zcJX_YBGu)|i)J!w?tBG4!uI#;)DH@$+sT=<8vCk-%U=HiB6vH>*Khtyc0`6#1X%qB zzao2G?Dbd(DsZKxw;Sg;x$MM)iW6avS;|V4Qip7T#vbiQdmqA~o6jC|>mB#lb!=6~ zBd*l=9rJc{gy_t;I{V$q0ePd}(_hsLjefqAYHIFw(AIZ+sBo*q+5GCHKCa8$)wvxz zW~RVjfdLsBg0fF_LH0#aZJt7l*iy6tmE1sMQX&lmXV|Rd)iIKKOSAHw8z6Ho{db!cFZx{PZ?WRM$sFI)dnUshBLswkU^6n(Jz!*ZPF*b&}evbw6!m)S4# zr_jZ+4xw0Y$)$XsO+Zi#!Lo`|{j5tF5m$9L*Rwt-lkl$4ayL_*;3tqGeFJnW6BO$e zhXCbJTa|JFL*2R_-!I@xs0XVOOl-5XwFQ72x80w~^A|2Of^9X25T?kkzS?N=5L_q> z;EiMs2-bHW=eS_3q<1n0KdV(x)VQ8^#3}@cY35NoCgU{)1 zC-vn-6H@G^1(e?1%!ljUHcp|Sk4sO173cv!kE()}<6}4H!h75xcJOynb-cgl*|m&B zXJLE9DG(mQ!@29fh_0> z71l)Wx2k5rlz4ozR9;g}^xOmy-Sfg!N@XA+t{HLG4FYYRB}Sx6Sytbbs@nBp8ffV7*Y#yo2x{@~d z(VT&iwU^om<#OG5i{^J6Ftc*`^plCkP7l6J(9HnKi zV_<`$Da@|W1?MT0yVJnGZbN+f52G%&aUua1;D;W-<7mgg%#f z@Zh=mM(t%7E@e}DiSb*i)VF7zOEF4AZkL%hja)Pl)@Mm$^*Q?oKdz9re$a?O#(0Df zINkoAkR#ZMP2dCR75{^POtx>nU|#S}S3KtbcJ$VqyfuQZl$`AJgPnb@BV&gG2UVl0 z)PwYT?w>kH>iH8~pp!CrDTak(c2B&&4B6mlQs{6bwMDJbV* zmXodmpUylkA({Wpxcn#V=%3UOnsRDMJDh45_ELS?o$6z_vHOPwi4H3(R6re(XiS8} zJ3bez&YKBTnZLDdoY64^AEIHj*kN+1grCACHqE@M-e zN1j?V47WMZB)OK%?4u;#V)roa#}a-`L^#=3d@3JI#UV&S6``6K>Imw^^CK^7FO3{E zRd|#hQg%#njgmgeH{b(Rg!Uq3S)%U&PeO-c@~CHMuFeK~Q^(`G8{N#PN2N%#qGLQT z<;N|62tik0$9$Hvr{z}H?u^@+0=vYziywujM+6s)-Pg?8vj8i0(WlD3q755wc%_CDH<;=dnX{Jv_I4Z@&t=8 z;RwMpr9yI_O3G#J3#lytakBm=DRu0_`m^f`?A=QFHA9O6k_QtaGL`d|D&X&I;|pAq zkFmWKn+qlHTq)VUT77;Ddr2&HSs@e+r~VNDLyVf1eUUjH>TH(hfug9RzlTf6lP<$b zYK={l3``9-Zr%bvPP7XW3J(|L2|7V%3Kopil$t4^Ra0w-TsDiip*{lP^x`_T)=sB_ zR<3vdAP#4|wjIDjhD(qmG{nGU{ZAs7mbQWLDL|x2>cjH1TYiPO+s?9tl%OSvyareQ zH^zC6XoMbTH1fJQUi*hr%cI8yUS4N?wSMf%LTqB(E`ICZu9e4(YvQvqyOiR1F8?Gr zx^#4Q{-;R6#EXk+*bqDjiP<@hP5d4r_D{I#;^n9~=CX-7z7}a1;Vn(n`e$mtTd60; zRXc;^^Z!3dSKYp7Qsw_@igPXhab*M8z7j4t>5uEF>zw*h)hqX(f2Ugqd{11~o|j)i z=Re6tFC8fJS|eOQveEC|<@^7OQPWD{RLAarMl6W8C!n3zEjUYK?6-*5QynMXmqC+nazxp|^3v z6`^Ap(y=p^qE2Psw;^k()aeu=+lXo`A+nBSU&fFMS)k_#?AJ+VW`Yl0 zd52fDF?%^e_oSbEup7ng*kdXFm~|INY3!ZMz91#JK$oLo1MYir|IGVSns%g)@gSjM zqul2;&u<}o8*wJBSQ_S{=OFZp3Gz$pQwH&+=T>WLd=37|yH&lEbwGY{+xli>VDd0v z4h+9|Yx5!xK$n$*E8+DyiYRu$c$iJI<{vW&J?5F#+x5jrn>kTaZ1_(2%OA*2+qLrI z2VDl>E(DR_-IZB>AJ(9FCf{$6wjl&y_I}Rb%8kHlln)+aQOctm4_A|1ao@YD6rrU;!j=at>kMnyEOm10?Sm2WUstMxpnmjM4%;nh z@|P~0p6s*hwrFW>fx7h*I6FbT1_Krva4X+^@2DDzl zkx;*lndVD6Vm?RxWD~pCcg4r(AqSj3U5FPFef42?j6MB@O#E@j>qq6dE{LBaw#D45 znK*}J5IXTF2g)6#|S`6<<1)zGmbuA=GTw_kT+WuR_S(h(+(E%2xy8=s5asoG-O^W<076`d8T^JvHJA|yhqaCoB9_l%i6DOKw zMoXsfNKuN|g! zXL@pzxwtSat$q{Ttj`fXdkjNA@mu;+TY1F&c0H3gK<1XKz!)TsgP+aTQRfp8Kb`jvOa$(`AjP+-d!!*WZ1$?^Ev{$|kch`#o1wy-6d``nSMG7hV)y=#L(w~qTu z1Yrvz&=nQd9zqIB{S66!f?@qMcOs!QzAc_4 zKx@INcGlQ9_!HO>ewpcimluH++IOp#8|8gpxU{WqZepMKdAe1ZRK#Z7iyHz_*WQSs4ioums1BZ$He)O8%--WRjbOc-!39~D3G*$AS+$7i+QUOFgJ zJO590=~sVv+Q%=NBjcR^{G^bd2d?3ePXHCalKw{Nh3z3WTjL;a`439jeL4!!%h%l1 z3uzf51^+hN>;GpAufzHqWnd^0#gu(Vo9c!<2PFMB1DJ$?x2Z3%aW$duNg>2v#~;cZ zOX&~T=>PTI*KXV~U|u_;Vfy3(AL+$(qi_3u)l^B$NP+9BDv(i>0%>d&8_7B>_k$XH zl;gA`(?P>;BO!$n^?e<&V~dHRV#eN@V^U3L4tS+%>l#yM6Tal1h1QKL{5jsn=5_wy zkoEC*De(~suQr^`xRxXy0L7)QR*0S-YsW#Y>6oy%oHO(zGtFj8*UI<=9VV?n{2RX@ z=*15OmC;Gv4I!P-iNb?&Cvs9<-4)v061MKs1#eUTx>9jJ zc3|c5%J!Z-e!?Y zwk{YGCmy!;0R5R+3xsPkr4ImtQ+xh*XvEJaopS&t1Au3ej4$hKEHhip#wMU!|4}?J z6Mt~bf-y==E7B=^uK?i04<-Rhk7Fr<)}x1-oDP_Mdibe1 zhkCfnJ+20Gw4dMB+kl7X0PqvLZ%wwyygAW8?G4H1YN zoB&`wcdiYaZ(yuV>8-3&V*n1E>A~w_NZObalNfYxX^I8Rt&?Iae|jCDCceS6l3KpR zcVUU}Mo?;M^oE)YH|k?UehN!OL;*vwBf>V^#lr0Y-S`~JzO$S3kDIqzCN8XY4VRZF zi!6!4>&SU_ws6-;iHe!1FKKtbka*RKt#~1GQ?h(Rew!kEgzrN%G)_F&oVzJfhF?L7?%{8qvuT_H>s?Zb?!?lF**`dz#BqY#yR=>YSof4)s01 zJIp-2aQb)|L9^?65z$xD+>%SDGGvH$1Nrex+(ghoi?l2~ie*jY=+Zy9Btu79nGCB; z9)>#6N;W3*XB60ovTd(Z02_wu)m?JGLf~f!W_^zor0@D}-{-$GdndrnQ0$L}V1N4E zzpG&a_{F~y35GL?1ev7Fv9Ec3J|q~kLsGbF10GWLFFiIc#R(XCZQk?QhR#2Td9Rst zs~~3TIpdR)5g>2EJV@|v%)E~`U6EwFYoB#?xu--c_V$aVRmo%dL44OKb>7V_={ltgNx&^v113e zvJL+kPI}>7ZN;7stDO26=0kttZGSl3KEGN3b%joa2hylGRzH0yKk@|Txfm4$o z(u86+X3ErCQuX}CrS5-(XlV$Bs0wTVhDD!bhrlliFcg$YXva;TOsJFTcG31xKikr6 zpvG4&d~oa0u~fb`txKs;b?K@B>pkhnaXzEFXLZhDJpLy_J99v2_u(&5+gnXsw$9fQ zTP~e$53g_@f2D;t!*l@}l!PyP6zGp-B=p@=$JJF28xL!yDS|v-y3(N&1F}%E>j=J3 zfAz)97Ctj-dw{L*b0$AotH;kY56-$MFw-D+(6{db6%8#v^1RMcl1?t>@33jGBMmav z_Sf6`K4y-(%+?+oKp6D>-V=QH^9C9-r7blhlT|vI+-6g>(?g?jO-hk+Cr{eynredD zvk~<K zv)^LtJ`r*DZGWku>bIe2ic!B+kM4`w{4 zva(@V77J``1p7!-)LTFrl4K-{)Jb&6PjOWjRP(z^#S+KPl0~Pv~Ynl-ZW6v zlp0HIa>=QPs0TVcv5)s%b8LC?8WpaxkM9zuQu>^4_OA0h^T*D$oX_=F2K*yd^y?~Y zmuf$pMPeSgPn(&=p<9yD0^$q2kFeLZ6dIQnpex4ndtTO4r9?o>c3GVMyOsXi?gSvh z)60IA2k@ES?6q-=f^E%MmgfwDMau(c_30Cr(U{amu&d7hdFYo|#ZA@$Lr_~T1Jy&ms%q~pnaOG=CV-Q%KSrt`<-_6Ms+(qf(Q65{$FEwAXFb-#|V zBbp1ox;{kAkI}fkf^*$JS$W8Bnbc-S>^h>bq-usTQzt&YP>+2QK(%SiDTbfVPhv4P z^;E^{eCh}xE`ooR50NB?cV4OMD3P0t_vOUOSK zl6r*>M5xn$&rN^Zef0GLdNz9LBTpEsEvw#%R)$uWkc>xW^Tq{-gPuo$;LKU{WWz_T zsVsix2K`L{1?=-lO0)AhNd)&}2(1cFwn=d1(dFy#uXg4dlhLN)?!Cbu7UBp8OCPtT zOV*;(eg;j0EoQyBwVs0R;(N}|Y>A%pOXv&y>oumCs$&a!SbilVaEWxhV-ui@T*;6U zKK*=SJ9BF6#;9`B#RIof^l!cGZX4dXAjtmb7DZw#Y+U9%&#h%Es0VAHr{X4v;!l*z^LTGBobt>5zx7GuTBqmCZ?gU5NaEOx}8m4vvPu>DdJk;q}txf43 zXm&7kp5D5rlfN}Tu2J@|ed)0rVR6wuHsOY9gN-*SfdNDV2{6=RHN>>FGB3{ToqqkL86Wx*&3hX<_ zgC5_m-~1|yM6Cl2Kidi_Sev*;(tNAOqSP!6@&xQ?2Q+g66S(Kg1G89r>Q8tUE%^L`5|iO5fyI6lLFc+T@oKyq(Y< zwPkyux9FJ$Qq@C;iQ3zVmPt-w`KVII2!fhkQqhcsiz~7DIkz&0ZETKd*prLG+qCOP zI}`Q%*Yu?`;UqZvpf(%AN3kqA@r>A3yQSA5{{gNwqJ621K)EAHL;^OaAy_e?SRd?& z?cGZE>hMZ*@(+@33~X%|YLm99ws9dU4dS(l;szVe3O6ZSBrgAMVT*HLI+YS57P$WK zS%Jegn{0D2(bGcv7y}RA&36WnHFASok$!2y`>XrY#EK3foYY~#K}|xPHMeFy&Gjjy zY1_YAL2nV!9>{M~$Zw-barLn%D z7(F#$l}K4nT$)juwtOOZPpb2@gLG(G@)^u*N-N2%J|FdJgIIRmE+n~M@c?FfV;36rjP(KV`X0M)3HpD)=6yWA7#A540d~W0~ zt4z-5RuX>s?Mx_I#1O6r5SX>= zjL<6q}Bx zXzaL0WUt~O-OdT(kx-ZIs^MbSSH7^1XVv&`L5;ibx*4_z*aiAvoEjZ{r&;4d=2gb`2aw&k$J~$sBqt&bft0Gw@`=uqDCD1eT3pz%}p1Y+_knUfX&48DAZCIzi~CAKnxT z7YRg@y8rlYt00SCni+tI?CkFl95%o`9{PhZ@maI1> zzRErNus?js4k5Ex7@fF%LexX)v0zG_FbA_e1XUmt491Hhu88g>hxj;!5u3)8^ zLRFYL89ILg>lU87MktbEB(`4GDx z&+`X`+CjQce6%6Z$I3ro!^Huto)Dm#HZb@u2W6rgz~+JsSZU70>9=XgVWeEC$xD^5 z3M4E%mT(W9+_%c5qPNoVrSNvbqsst!5Pd7-00qhP?LfEok=a zKqs!+#pn}~Rn%Le2{9$B^6^V%nYL_UgR8^%wr5NPsTXq9D$H*M@N{NP7ML=ryEK@T zRT}89nwZh^M<<*3`|!bIylH<+#7nYDtT2yoI&ANr?_W6^)gZ-a4noxwYP$%>82qii zTM!QtH~J68AxJoaC)_At`I)##5@!x8Q)bxvlnYP6018%N^QU2VZJk)&B zOIn$2D}FiRN|0zqO21p2LS*8$NnZzElFEymPDCY^`;*&LoMj zhz6^n&?S)y%l)R=O4gn9(#oWMw&C)!ResWEcqVOIjONgGHS- zUYmrde#pN9(ujIpVi3#6x$JGS*S71*(fZ}1Z2_txLG`qR`he@>p@20bxYnq4z64~= z7AMctpLz7TH2B2}ehX`5`sC;%5Z=DmGl*|*U;MBRP7(N+KA890Lc&!fne~j@VV$&J zmO}`E^ItL+al7FuGmVH(epSJ;z`M{|{9DPqq48Zc&#cbhH8Ts7Rza{K*K~RO$6CX) zu+}siFNW0chr3puXML~XiaLhygn}fyiI$P=3og?y#DiU9kVKix1+0%7yTVK}A)VBm z%A&Oy0~0*|S^t{6tM~=Q^xbzGP19H5#fdh&Y}GQ88%n;scAX8QF5(2*3E~YHFkWv{ z;@O=>`5L7z8_qNDu<&R~3`Ij@jY3RM3w#ZQ!MXjX6uj)Vaug3Zr~vcnv7vw80D>Xq zfjgTc^??9!UP%Yskg4rVDIkRvlW#lZOt0Y~0IJMPtC=_?m_g2S2A+5>roj1U?e`v> z=;68L(ux;M1HDuHd8A95ZGSo&QHObE#Xs$dZtz1fgP~pDuF9%k_Eazcub^<}V50=@ zyCFcB!#CRlCt92=d90VPrjQ@u_Drr@)=m`OZMbISX*F197E;;_$*D8nT8eO!T?{(h zhYs{?x{5;6$E5lwpH-)F=NdYI+Oe-#z^%{iMfEB{w-9gGLQ0*Ak1O{@=!s^Gx)0kb z{8o6FGqqCFZGnt(u9j8D?mi)B-LZ@N8um}mv+%NB*KBB*c~uP}q!rS>v;;@-*mBrT z5Rx(NXoB`zl?tVFalmC9p{R<(buwDs2PPKUzrQtunoDbws{b|vuI2g})9CGKvWHjj zVAQu&i+ZYs26NM1gDK&opxXI(Z%N8}SCaW^y2HF8b&6o2GqK;I@32w5)u>n{$mV|!vKb>5|;fBj3HJxUUIcT~ehIz&4M zu_z`P;*w~IGVGMDji%au%Dfiw3RQu3)zbx~PC`=SxAAKcTzUvsyjs<~pXy?eI(jJ) z{?(UIg`6mo3RobkVdlR?YRIbi<;k$s^!Up46!4I9;rPVWKTIV3wvldxk^8f(me(o+~e{YHzGmhHX{~ zzF#QRojhW}zqkPC&L0QzCx?URxP{Twg)l-iFTu3paOrmx> zTJ)SlSWB4F&S3r4VCKkX?TD>Nz|J<1f8*<);IyaQZAUn44zz28_Gsuy(|MFm{y&^P zXXW_F8~Q5<@@C}=COtwXSpNA??RWY|Q5D7fwRo!~#0{wp*$8#rz;DCH#3-L4ddZ9G5Fx4BrbC-|h%=u19p z2L*}tb<`_)?dD(4M@TSJBi$$wy;I~$nGxgGu zS>>TQc$+~4J)=!mIanf&dn_Vr+hXMvJcsVLD2Mzwx{w>`M)W;t7qIGU=Tg)?820he zyMfluGie}NUu;XL-M=m{T{WrY~{MnGiHl^unk#PG)-9=c=}_2jdu8HG;hj{2I1lS zLv|>T&5Oh0(n^1y4atTQxZYx5=OAO|bHEC0CuXOV9_6s{)NF4aG;s2$1`yxc?yMgA zTJL|Z9(e9~vCg?3eJ#>P4?2|^TyTU;Php-D&rfe<2 znIV-Fn!E8><{^D-)lVH(@v$@_(e2Fif=ZOzH4Cv`!i3ScQiJrI)$LNLtiL5b|Ofq|G8dKJ8NM1+~w6Rm})&$x8# zr(UpUXOwh&v!MRdJ4EpM4e^07mMT}*^xQ`_MiUQ<($v(8mXtaiJJ0&&mzh339BX}m zy*MyFd!dw1QX`7Xe%D@>jHRsdtL=9_A1M$BTqX2|OXL{Jd+ZH}75HQt>>3+!hX;n& zR6+A-xrBrgNR6Kbs^rouat@X)@W*^rk-zf();f)M|IVW)BU@ibzB1-Jx96AV5NIr0 z-I!>d(+UZ;P0F;Yx$7W+{%3c{tR~G_d+Sf#N~ww$|K5Dx43(r@+ZHL|@ZZ@VNB)@; z)OiC`!%$X{K}cTkMNM~5frgSw`Ch*N6_!Go8NV+1SVv;Rv{a36(M}MUKpGlJg~oCP zWS+@>0Qr(%W|cbJuI6>jBO7BOh&6N-Zf`6OHlk^wC{E?nJbJth^;R>A@iAa!oU#)6@2SnAxbjR-Mk5_`7ymb z3KuQKOX0U%EO&y2Z@e(zV6#Q zLB@{qCx84fV02I>?4-C?tEmgPToG&HKQPl z*!(c_HjFFia(#KNL9k@p(SSY8T-WE=hIs2}RW|c(xfr`!V#nO6q=tTjqse49*=Q~H zYL;N}L9)#R&9DrGAy~@CUQTvuJFPe23yb(VDaYpH-VPTF>E^f0)SBW|n6S@Py<`~- zXd^~$+90o-4%?mzs|y5*ixr9M^*dX^UwbS7J#~8mV4Zjxz7A-;m+j#WUX7sq98S8n z`MvxEHf}b}bCA`ZCtdJkhJ%|N9Ae`NaK9bxNR%~oLIw%-&S2lE*gvuE71U>q`q;G@IpA)jW`w>pDW&+^RX&i zP#A$9HrYZ&iRIAN43tT2i9C04(T{m@hRxj*y^wxI-Aa<<2Gi{zwR>N*sd`QdFymZ&b;@x zbNJW<@h8P|#ng9pq9RVMFpZ9UU!lIs1g|q>Id*M^B%`R!nt)A}gDK%HPg4gn`GEqB z=t}0)!^hPgs>{Quu~l<0Z41ME?>ZBiN_L{ydPZBl?!+bLUm+_O9ab;mu)ZMDwkOzA z^V|7zD3LMLGl7vHXPH^I{JLMzRpwwU1@s1!z|3x&0@-$4NdX-gV9nHh^Szw{0r(=T z1mIiq%JClb$eaq@tn{+qj<<5J^QakwN`p6}rQpvqe@AQZ%n&4#t9YcwoiRcSLIxD& z>|4-bm5|t7A{et>w?xrtmHyQ#Ts8sk3St#6?*FwQWxeD4m;>5SrUZp{;ie8#igVj}v2}lX zDW=rPW83evd#scF{6PjNu~aDOFt@6*lP zv&$UnLh&st34*ZB32V-;uJ3AZe~-|k?|q;-y`-X#2tWwWzeZ-due$Y)JR)27MsQbv z2G3c^$hnbV-G_!Qd5N%qHg@iP%I*Hi*-julTTh>mgH>@o3L5hQ(v(+7@(RPDPWrA$JLFD;<&Ypk7H2uU7uvwX7M5*2&3tdyRyax=bN|8@vDqkVBdS6ZDWYE2CrB#Ag0f~NU9e9OxbBgt=$+)cPqQP2TmJ{qRMqZz#_emDs z(s4cO)MbaiY$~C#OX2X{yt7(MZ;cAYl>>G~%gL!ku*4qMRe55swKSHE(t+BA_W2Vf zRq8jS23k{6pti2dN8!;~-4|lKp&xTJ2O7h=g)GHLFGxnTXeBeLQY+?g`)JnQzpoem zZruL8k9&bhb@#t5s~nv_mGabhDgVfa*l+bZ#1^JPqU7aXx|QDedd2^G~u5(uldGF2a3-pt_oGe1z)Ae4Evm~rN(!XZz5`jO2 zl);U~=68Le5$7U?8NH`oXY_gHeBDv}D*hMT+3hQZYd)i$8$Wf&g_Tf2?b=QHD za(g6JK;hpyDJy?2a{c52_~%hl&jjY+l;0DM)BEPF0QH7xv!QBKCr?lhDNAPBbxW0n zbt8?bWee64h@lVmnOgF?KKS%C>l=j%p~=0`?!BZ=kw`J}ZUaA-EUuX1JX3vhSdd!g%)xQNJytM8nNkc(c0Bapsa-ARN_!p-`L2s|qB9f6!f zvW3dM@c+giOl^r??~C=4VDy-2Y>DDxZkC?sn1_J(dOhZ9%0GYMf9tUUaIfFv$f44T zK^*nBTQ*09R9}J;rUgP7BY5U zNuESmaK)~kCU+-kQhM7GOSWfYrqj9oY3HHF$n_5cdg;($>~S!jQC+TkVLBXc{Pw?a za;Bw*m`lsxa!?Q6by`PbIcf5>Rcf8_hEVoQ#uHddIim%4<2N3e6A8Jnd_ zkvDraXc; zV;-hCa6Y48cZ>?!e?T)ctYcsOnvtw}OSu4}TPrgx+mf!Rr+1zZ*ed;1bBP$6sjMI6 z%<1$>&!1S}=Gr`++*7K}l9VX4=L6TicoiQH!H70>+M`TiWi%aSD6T%S9}*0SUV1R6 za$2Ce-!fw<4lX`TV6oJl?~<8v%PH<;5P6|r`w~4jsy9vkOYT8a>S89Gn^UoyeejSQ zTtU1G)lZ}zB8{(7rIcN@^x}E-5_s2WMl_|*QmM)Ph5OLCnDiN-L=u{UpU+j@;XSUu zX7&al0%aueD&;pCXT;1OyBXd_LDzD#Oi;{yqsb#cBR24f+>`l5h!mKU4j1vU^z4ZH! z6rFhnRg=9}FuVa+#VYX~RD`sxG@s(~jJa9u$>_HA@~MuBNgt za<7uDaE};eVqre*>T*j1AUB;QtF?P~*|do*KHhNns6Ua^e9k7Q93UpLB zmuM@ED0v$)je3=($M3eL1Y5&jpSX$@P%c3Z@MbPWD&^S7EE-4+{JLBD`zql-_y~S^ z7Qwp>lcvMLrWAH;USW!aQP}E3wJj7?_EQW8xV3aIuorc9WPe;><-69H6pq?T0)0|b zj?e_0$T<^~6h~l0eElG)4lbL@{J6U1>uVp8dxq8g?m>OR1{6D2uNQ!9c};wPZ_&>9 z?#d^z<|e(v2V(6-HQKnO1SKJl*g3OBbGBNYLU#YPcv%mV@+!)FO@~?6;y^>NXkqJP4XNj7ETj2_N2*Q8DPfE5tVTeEDCX@upZef8v?>>hd&h_?o8~kH`zEmV`==l z-BC~v;YTx|Ny!MhjL2xsw?^WUb}tU}TNh15YF$hup9K*}0kX&aLC9>rvaD|fh?aqTuj zFJ?jQVYfb=)b++_z$(ZZ?Aqh)-rZvfS&fexx7}bN?K*vtTsp|7X(7|G>{2n6DeEYX z0$!pV^QMiz-T7B@^lOy#e|XR!z^uLanGrLg=62FMs4%HcXrv0DMIXKE^5B z92EByy}jXx=BZK}M<=R99)F_+^JxuvZK;)T+oF?ibIcyeHRJ8bGE1Zy|vs#VdV@oe*|2h!)9D9Z^R zrOXi_8XpS)<=moxYV-(`-yjn!7S&+Sti?)h3LN{lYO#NoAOfJ$STKIa!D=eA*k(F} zMlV@j2-)EF=rTE7e`pK6W}IJ^mSS(xOOTg>oBEf|t43H7HL`69=YM}Ulz?NlFBoG~05Idv#O zmM8N`07O9B@Pu5KC-3Ocfrg0-*w$ki&F?;AI?x>q-wO-CO&mb|yAm#` zpv@s63ctX9kcZ&w(PHT8&amN!zZR4by_Jlhfh#rgwTV!cg#XLqVmjOrnP4!wtN?PV zbC?fTFz-xXRxspB5A1rUbOl%6Ht#E?(x_>VzX}tHG$+nh(YBB^la8%|f$0d?(%Xy` z5;}>o<|JKExj$^vkUiL40lx%RB^gs&(ryM=SJUWROdMQy9f2fqrbyys@*4^^P zTmvnUq4J?qoziP4X3%AICs85xZqsGuXiPC;%}_3YX2Y-If(%Wu;Z(tt8g?2=Jq&VL z#yY73;A@OcrkTSW{J0all4ydqrw9oF#*x(MB`GoY1A8`&K>NPsWb@?LnC0JnzzYtG zNq%51N1{Yi8ae0sp=?kA7YN$CGV4iFvY7|CY_C!`JNuH1KFGJJYk3KJIp9**8K61Nw z{^0zzPlwpOrGQpM=XB!r>}mH;YCB@^=jab7ZqEr>LhJFHruRV|&d;pF<6JTSbo_to zv10-VyV?6d`UH;kAvU;EXhmW9Qv!!p&xIrCtn#f#_!)~QjeYjGM)@ab?MQrSbFK}v z*Vl5&S{~tcYd=F52;yo*>(UoU2Vphk{i)ZHea$XbodjD2%!9$OmkR2=g?eQ*^m5xh z*^`jn9Toy-8Y#(=ttth+{KVhhY4@s^Nk_ysH+mPm?%tQD)kj}l8O1~osnDsbtk#3P z{KEc}iCn}%0U)E|phKNdVng^klSDG~BlM#A=>$uOUfNe(tO`~E)ZPvg;^xM|%vnxt zlTGQr>jS@9T5I0t08Q>R!jTAN`3l$_xIq#@-b&oW<_V_QH&>bM|Bi<<$?_OmsJf3c zt!|XBYq?wc7@*U9+QdN5yd+?o z(cuu4w>hhsE1jU)mUl&J^=X%yU`yp^C3EUP8aIhnD2s${_gbD_=*ox?c33tdDpE|6 z>Q$6iBd$0LrDZrwgbvVn>-Jp*2Zf382+g-C`j2fx1YjF4w}qen;ldT3;kPIJ zbnWPGk(nRZc-@iNjYe{k1YbKt>74er#FBkbDwjJdygo8Z)^^FK*j@_}IL-&}K%cEG zqkD|2!M1t*$z`(cbpeSYf$SXJ+srhwlP>TJDDc0ZcKt8M2P6@(zmv%KaRzNdXiah; zVa*%Z<^IHI|kufgU|!AeWiXe|Vb!KQbQ zdQ@3Oa)K8TK&73)$38AT^L|<~G{d7K+hZZvxYNKaByiQ}ZJQGkk-K6GSwn1z4F-^% zJ-DeZA7x?^4|Uq#=WDK^8BTxJd1cFWb~8qDQ<5_i-X7J+`CEl&68EQ?8+}yAH17A_ zq}h@zHEmyBbh+x>XnO&aouxFTM~HKA_ZxMx)@!Bq2+xjAkrO2-6@T>^XE)>oId|1J z8>1 z2&%?Q$oIgW|Jy)0Cd~`50n8Fpgv11TT?dy#da+c^{M16ZlxVvRQ4d178y^&VnmCHq zE8C_CH4}~A(nQ&{81t6UgG#7~9L>3!jmt1~3atvdQnH1KxL;BV@hGlbIiwtO z$)#6gGdo_R@kQ1ptY=qK`jqqWPr||YRewKf8p``ltWrcYA)=&2E9M5KQlNK$<9%R8 zw_)$T5K9b30fvDU;vCK0mo!y z1nPui7_<9?9ZUEHGXH0P@&Ec5M8*sZSuB7MA&_b!CDzK z^;zQyUZ-6)6cONKuZNf`L-*WAH>j^vGxU+Kl$^Tq_3V)V+N)*(EmX(1#kh#D4NwU6 zq=PQ(D6IszruvRT-KJRC2 z+9}QATv53n8m)&We58uzAJSJrs_!mSucUWpvWGcma8@mK&qQz|5Q@*XjmnAnau3sm zEcB3bjE_V7`gj7QUhoZVg|#5yw|wjIeRuZC#FR$t`iz=RC~j!zDZSBLq-}UpmW`ze z%i`?b>l^aOZE4cDw5s+r}E4_3R}J&o{x_>SEEuU?ecc z7S<#5`R?{XopIgkiEbf4jW>+Mt-;ZpY%EpE&deh$u~EOur+@pw@4%|BcU`X%WR=%g zMh37J{0%Icfw>s0`6%~9a6E>46ddyjU_-@C3#}<5T`5$Pjv$guvp_9(Sy7x;-)^+~ zL((fk78y5eZ?U!)%^gGaDDyYqq`6VRRE>-oOLOovLr11G<-9XR6b%uURWGY_(t zj`k+*dO|2y{;eXw#Z$swD>E1J8)itiCet;VqEfHyOh6K^!zElM*6-Y0E;WTsl}Wfp zYq3>RXndLBXC-V&M@91|4_=LS)$^vv!F)o7GW}a3yT0nOff`($^}kkw(_=Tsl=Su3 z+Fz^m|78&-9f35C(Tn?-@w6Y35t=yg$?ZtL!bz_J)ZqEqMJv@ z;u6GF*F%{_~>sAWoN!*+pa7s=P3TF8-!IQ>Vzl9@R=qAV&$c1j^XYa zVLNB17>EmxVWYq>gY3$k!6FKIMo-ChDarN&->9J6^Ko5qVp$BTkYn2{SP?x@SgR5= z|2$Kh5C>86mE4PptB$obEs-{DLJZ^yS_$=Zr}xI7#y-m$EjC2ReQtj#hSVzA%v3%|S!yd?SZ-48 z;Zo7Q<_wEKx;CO&&~rK?vv|!;csHVU1twRcz$NXzZL+a}K-c()CKY?rt~Ndz0cbDMkVi z1#3?s;g)E!>E+&yf=X9Lav3(7rJ>}Dh^5Xgb?mH)F>V<#=WaKjr&X^F$H=lHmK*qS zPRL&3JB_J+?s-}Q6IV?mZ)X2$zWQ=++qoiDs%kLhr0j??XO+OyLL} z&GQEOxQp1rlyL3lK{@)tt=^>}QSZ^#Hi@D7wE^xgGjXF+hu{QJ`<03Gs|OaI4aEj& z;9d8MhE3#f(8gozcTr;8T&EWw2}8#naShN6b!6>gEoiU2Ef+)%1yaeCdiwKNVCfXfL}OFQR$+s#M5YndyMG;x2diT@3-f*jYBSCw2&IP;sB ziu&DAa;(#tkJbowg*z0i==>i2h7+_|-26bz1|O$55^qOpzLWj{ZgE_7rs*hjURtgr z%d%E^o|1}>L;E?j+E-~^r_}l-76M)amU?eM0;A`B>ob};o?!;Stx@ay|FLVNGlv?c zGDs-LP}t7a`d6SSw1aHfz%z4cy;RF-_+wNtessaf*b*Y+(yXAXkH&Q1rF!wi%8=3z~pU%PPovx*iKEv<+Q5vgE{ihwdFyB3u?kvdeQAW=Z01x4l| zA-jqgks&HlM21vRaXK~KXs@qo^KAR;sBdzh z)3jYZgB8zdf#+fkGrOK;M3u3-Ob^apZyie-85E{8>>F`aJu4yJDScBn7d;{K@dNb5 z#hDWC7oozG_5wY-h%*dI5o_|mg8x3f(lvilU&T0@EdBcLltRVZV;h~DEsjSopk$W^ z*33xVThlsKNqRJ2j0RQ7O#;ur%&y9P?w6X#8=FE~So=eJ)`wAo60g)m=tVwo0%HFt z(anKwDN{&~9aVlr9MrPkR8tgRq`nzdGjj@nAOV0RBs~JmiY&FExc;q#|KckC-)|o+ z_X%Y!%dfu0Ky{dE9!i))xciD|DZ51vQeMlpck8V{qb@WGcYm1g-nEYqEfk;a)Z6b9 zuqM{OpL>H5cWb)qjHRJLCZ!>NbvVBW{MH3EB=Ilf(hE}DDAPMlLvO6_cjMDFAJWp+ zcV=^Ug_s5Ix*mga5~0!xyNWp7aBFJ(i)0 zqM(9`bjN*WMcO8!VS_u3|L;GHIr>iQyG@q>ZDjzFYMTH)-jLD!J9``*7Vdmy7)O;k z4c>Zx2;3wY;$8rr)ZA2<+o4?w!RAiIw=K5^t{_1C2Q@WWVK|`=`hPb+h`HzyKHp$R zw|PqJ!2VSgo0xE^Y&VSo_dj)~);P5#LWctG*g4@n8Xo-e<(l=nd!xGd-3sJ26|@{S z=R_5`yj^r#7EC!OL6d!d{LB7lM#Al@p{tZeEMikezQJ1T62FT} zcBI^ZZMWej7yaAc{)O9jLu%}f;o0dgdByq$Es}<g{{zJJG*T|cW`P+Z}zD5ZnTncVRwVSxv3-1+cD4~b)}1NRB-Z(V7CGt zA8#Rli4Ep^zbuSPi=yDRw{>lk`=uPdgQaYtzwQ_&ASmv3o`YU3|B5HBfA1w@iJiZQ zeI$?W|Esksi>2sBTQmrUZ>@=$^YZO`~Mun{(r#aPuh_grtx`=hHER( zi4*(~8fl210V*>Po*w*35AIklNkk*rM~rV?G4G(5*;=!#V^e$gcwjbRX^P#8-~Zfi zL@l*fv|lrJQJZ$@CmA}$(PmsHi|7;l&8F8z9N!n&FiRo^@QHM^nYRr1aIe2TH0}oL zEy{`8er-rg-B8?*Dk7RMp|`7>4{p5mD>~?Jew~wKI`i3;!(p9Y=!E9YH+gaXaOFDz zxHXhpO8i**ZSE7Vuq+ySS|G(ja33S*=*U1 zyx(tJaFzJSW0vF;7hw}IW1DM9_tf}eD&MgnacO3}bcpxN7dR(r-94Y{lQjKKlCIrcSu4H665V_B$7B^Egqd*oK2E zCI0@B;!->I9uG9r@WK0x-%@s^VM4i0Kkb7eDC5YmwjmFv>19x)Om(41RVdoMCgE)i zT5FQKPEP#4l1|tB$5P8WZK?Ra#`!D7<`JVy6=x*qNl&xwfbDH^=z=p z#Ei6V>ewUhn#!8nXd8CG;uckFMPYILJ?Yupn6W|P{_W(civic$*c$*p8)3o+sx%wy z^LJbA-)xr!79HH~?=8v3kj9(&3e_5d(ISdq8yzz`7x%he=JVArg2ztR_r5XvvThlr z#%ZE|$@cG0Hu?2=%-^cBV{hC-m&^c%XgMnjUYd~JCVVmr=kK6N*}LvzNW9BOH*rkC z8`0B64ou5po1z@Kt-zA1%n>sqAX||q^v)W3r&}v=VM=5~Ks|um-`I)fQx#CMEV7ro zCOTScb)u7B{a>R^|83ZMwA<^#+E&UOqJFD`n-_?pSuQXgJ>GpLhnEqJg#0aOv6(!! z$hnO2#49RC(@}z|-_)^y_T-?shz~lI_VK5JZmp$zy}ORvx8TONEGxd1<_1dG#lq4L z*DLreUog~+_>$ZajGy=w(@L!o7jzkV-`KT_5q6KYA#uqMEJ{{#|PFFoD0z)h4KD^Xet< z=x^GtY;&I3z50wlC4f)dr!yMp8&sTiHjEOtNSFBQ4BIxP<;qc0KZ}m8SMY3FlLd!LW}Y+eJk zG_pXvciDwN?nAU2oIJD3IrR4|rI)_sk@0(}$vGEq2|FT>T13qrC6dPOV6akeUAqQX zPQprzPVxL>Y7dH~u6^Sq_XsIniE<$t{=N|t_P+15Zfb&EVCx~bA9Ds8zWM&kpJ~j) zFAA16LIq#y5&{a*4&-=B4gs4|3m>-=3ykL#qm0zpwu#*jacAc|NzhA-$)jy{N~a?p z?;qsA1&L>ZMeF-DwkB&C!! ztN{a7-dI1QXue$u^6s(k6{O^0rMvm=seoN6c1W2I$Qm-5{VD#wKLAS8?Eu=Z_ttLy z2jq)0Yof0q|7l#vmoV4_4n2=#$>}d-T5^#$NH{X9mEGUD9)$Srf z4Jd<$<$7^Qw;cab@bF(T4^h@BKFVovNWb=`S@Na4sTQ173u-};TAl`LYCv$3i&4p` zu%-@-3dvOmM_>Q*^V2I~SL$~8*V28aG^BgjafxM!#~XNF_y>|9pr_lonwe9TnJKM7l;~w40<511)~V|Gp*#xx!ijZlwR1*V!pB?nludF9u!pk9?=&zO zhi|zxB%Dl3Lyx=jdu8#LOqCb!IS2i!wycH2aPkADi*3zCHfWuHleN=5!zLSqtTCKU zxUs+5N$=~v>3QG>z^N#H(GrkN%Jx|};eYa5{?*>EEo_sBxen9I1W!ByL*kqK>~)I8 zb=MVFZP7AJ*nIK}ZZ@~#Ltaj)AMxVkC`vFI-auLg--4U$x7&DhC$3F-u_mUd)Hk5v zXOFGC3JZ$>(`d4nznc#SE%CRPX0mI%@|2kZ4gD^L9zhA);TGl^U}^+>!7n!@e`*(r z&!uE%E85UNF_iB_CE4aWqwb#4U*x{r)Gx(EHdimLpI{Ml=+Q#tfU@Pw9D5*U{hH$T zBk*j<5oCqiY3Kr{lB ziF$mENXQ_?BHH)Q>V3_2awsl>%Up!J(7k~1u~EScIb(!LZkp7*&^}1b-KLi3=LPzU zFg4)ii<6qbm>{7h?Co3S7g7=EZLESHh%mya(ULmJ>p+}&K_$i3?r-heY~DT+uwQ_% zkH_C)!D|kIy%)keBjmm;IvC^b!$rhYK2&?q@1Sw`_@8pfff*QgYlhYKlOQ6ZsESS7 z^-X=W$`8ec(6-dBcHCspo_%^=R<7+;4UNkHjQ|?-wze@F^8%`snTcmz{dn=lwq-G0 zYjv)cQ~DN~Y%#UXCwcxUeZkwq`7G0)sYo?utf&m^+CV+;=@2{KaLv**F!T*tfHepV zMCnjUah8S^n!$~3?%4Cav-OH6#aq4(m0TLyl@$@zJTAUs;Mn({@dC!*MSt}v+XKU1 zC5uHf6Td!RyJ@cf+ zvrW8vUl3aFqa1EdUSWM=uw9v$_|m?uFNgx&oqADIdU}aho=vgbt!#ZV(06F1Fl8GY z*53aUKQpf7LAGP3GoW%}#s+beFAXtr2LY9NA8N?;PY089Dy|{ou;s35VL^K)O z7Q-XHVq?w+G4P&m;0JW}W9^o3#Qa^zJOv5@&&%m^Oe|)-QX^ES$Pv6916D=eq*Ez(ZDn-dE^{r3E9L`X`+ax-F zFYqFYOHAHAl1u8s)-2b|4D()TS~d$A^h~f33=1!1e6uLtXG|6OYaf9p^iNkK$>KQ z$E6SYZHl1N+Xvqjhoz~O+ZHc|S!{MKYxQ@=MIhE|$$_b-n z9q)DG>4@s6QJ4 z+(?i4`*`mF|<|~&~?eQ zc<*~Ve;u#aSwCN2{l!K8o@Hm2I4a)S1s(nFCtjf>P*B&CYUn+I+VlJLT>&0wUl^9( z)D*3_cg$rm`(AT#52dIIdcU}vx^k1AQoL6bi&lFq{}W9fNQ$UpI59~_uG4Yxr*1g* zdsX2Y5~u}nRnCJvV_j1hXk+LY&DhiykR0;6%2czKf!CF%X7IvHOIqc;m%u$=&p9!> zp^H_jEUM>}IwdFM@@PJ2(sYH|ITiL88sCn{qHmPU<7NK74 zd;dG6a5a;{jU`vu$u;2i{DuXV;3Cel29&}R%1`QbmMiEc9Gt(}>u0W-qa0zrUHk(8 zN7x?k2qqb8Ay7>fID?^?Qu_H&JmeDF3;+Xrj7k9na{X(b%+3 zun*M!OfQhv9?3uA&=#qj=sM%h$O>sZKbL1-Xg_Gkf$9UII@sz*9(`-d8m``YP;xGO z4GO)C|0Mc-7==2=o6(^POGN^_2|CBK&9+aN;<$3TOF(}nc#&5-f4jWH?03H%Xxl)- zHv4bh#Jq%_6CFZ(S9|UV&@urVBHjM;peoDn1a(_T_Rr-B8mKD|}Yucp4Iwxc47&;4^>sGegg~sDUJBR@1@&4H= zsRaLuKmSaWqY=Z$Kw+;Bl941*^ho6jO@*2*tL18#0=hOC7>iy0-&)h37PR za>lGn12iy?eOD=Bs$d#%3%9&7^5??L2TJmkvPux#p>spBgi_nI(Y;SvJ`;?ge4A)m#-D%0%e?4qVm>8 ze<(zAvJ!a}jI-*lpXJVMjkFvFI~fe-PEzd16i?~yE3rcve0!V1XemW}%)`wVvX$rv zIx%l#`Dp#d)Dqd;5|TvU?Om>;B-!Me3A`qDys3P3_;@#=5~Xtln;1CNYrJ)Ew`@ie zsZ7~?*u}ny`!ca)`&Wkb?QOpO_q}VZzbr6wNHQ^+sMi^7ee3J%&3jHz zug)00a@zqAkBSqL0oI=m`36gZZo5rBUFvskP1?!+^A7zc!7sxoLO#^+w{o2_8{BGe zpLcU9%r|fmCfi8*@6!}(0$U)-;JrC7ATR`x6dxlRpF^j&Zg1Y@YAdPCmChxeT$mhf z(E~ScvM=>p0v?59^v2&dL17)4mQR#|L2C4X9m?w#rlbt*f?^~LIo|XciOmN=t@ApnxoM}Tt9 zYD5PA@QpSr8Bh~N^cqlA+p8AHMmCxj#3DkC3tVoBeZ;7|-Ch<(8J~gBVQ~^8F65Wslbd-4szWC}T=@w@ zvkVLx!q|sV!u*1_hQ0c$E%@d8OrlG)hM09sjFLmWiWM_@9N_e+<4z=qq^PO zznC;58=C$a9bq@g_v9zf8uwIB3;OHBi+5#|HK(6JJ3g;pqu^prW^ud#G8&cu;-W^5 zV$#fd%lvfmm7osRhMdy-7(jSePxgGlKbR8t^2+)(A;W-u7?#iKxG!dTc%KUxeCO6| z#;eQvxE`Gwz_8_X1Y%~gu^{G@exXch)K*=# z;PhrtpvQ1)>r_ctr7Z#+5ye{K@b9(55oI54Y#WbY4^&L2(5%OUd=}T(;rezmdU>rI znbk4Hnf^Vlx|#I;{=ykspms9(B3$Va_D6ke4hE1Fbp&7J(|M~U`to41v|-;qN{qxV ztDXn!Ny?cSSVoz3VcFwqzlj~^Q!SSTYz+v*aTI^#)dUiQP*U)K&RU{L;P$pvHvWQh zUQ3cKZ^t?m&i;<``OC3?H=n>M>NN$v=)b2AQl|dWr!D(U;&?3ICNo_x@^;Df*Y*2I z;|u+U7;lL=U4qW1-Hz5aSJO1H_JW{5-w4HR{dcK#Bl!1>j_9_|t>vlGkoyw9C1&-P z&`|I$n?*38%(u;u3($*=dRc{?a5t4PFd;25M=9jnM(mR%Lymz}qh+mEQWh^O1;`&~ zI{a77kR|tx2kTx~0q28$fG{dZ1i7TLRbjKl1IlXt${9&{;}=^Sp3LZ-4|+Dk7PC1j z_@h+di1Q^@7b-H3;uuc#uj4&A0==DO9|R(WvKPIPfE+qcK;;-RtbC8%We4KUpdT=! zTC%}=S``LC)2bdR5r!Ynh{S9v$BXg8_gFeRuyDucMY`HWB<-S)sJ9Sx$&q0&m4K;c zM-#-k56Qk^3B9X*PsuTz{YT~Khj?nu&M^1}xqRx8_1|idcqUKoC3-QUz2e;GE5h0< z!rCjMdsf~#$IMRit*Y*bIpy6dD5Zx4nMJgHBjzh|k<&Z4VB1V}Y9iLw-{11W3x;#h zr~vB!CTTZegB(D4`oc`Xy^bg#whQL|Z7lA|<`!NjTlG2&s1J`?`N=G9 zyyY2P=~WWEkdw3}9JAA)B=v{&-fmoMnOou< zm-BLk_iSmYso%|s(+2M_RS}diGv<8_Zzh)y@z3sK-*OPF*%oteSR%BfbSN@)F(^3t zlj4ngw5E-=I@j?Il#R(6AP7C)G*h^POXTbf)m0X$VDSe5`v4(9Utk^f>&=#L!M}1N@}1| zturU->~%$yK^4+|SPIDp#E<0opc^7dxl`iCV0fTOzWqv+(|^qZa5%TYzXrB-Yx85@ zKWRVvyOkLI!lr=#X&pQYOW7+z5W8F@2d)orSDe=i9#*VR8^}gG-}&XfL5l`1f%R*B`SA1fh zhu`{E$3p6KP{7ranBbZ%*T>e|1&7QS8m+)IJ0~ycoHyM{#N%eM>jQzlzN;_c_fq1j z%ImDZmi-p4vLSWeD|N^XDInbw20g8JZ1&=@-{MDh*-Gk-deUfKnJP4NHKX22Dsimn zyH38dt0)p#;QQ@!H$KZJUT-@?A<9LALj@C=UjDjGx0JWidU$x#aFi{P>i#4F$I@MK)I=5EDH@rcf}7t<5YKop%r{EBE~} zNnFUSkJ`4N)o2+S`gv+I$OR1`UqZJNsK1u$PRwf^%V^9Fx@ETcH>%8&{-3X(tD9~8 zPq65&^+l-b(YzJ3DJ!q46G9cAKfv`KTfbxN3eBMc66^{?vrI0X59?m{R6%AL4Pb5~ zJ+n^yN|bB}229S|(aKESCh7xvPhI)3?ihJiaI`>afQMGucV~zz#{Kg(P1@rxu=YcU_@8 z)Z{v)(E}y=OT2luCH6Yi_F7T9T;QjllDY;@KhN>l@yO9XX5OpbinWTeElTpI*`Gl- z>vq>umKj&tOtc3FaTFI?g+)zfgI8#?Lq8>5>IgO-Z>ppEtPXEJ2ZZ0k6|~btRctAK-r zxzjgF&wmjz_|qEd7wN54NUngfepYGzwWa30l0KWuB*AlN1|iZufQ4|SlEudmq?$7l zn%#f0z>9FHlEWwb`yj?*PR!Rdw5ANMJ^OEsfyj< zu32CZT&!eOTG%7~P(5xslgS)_X6R{POva>D2eZQme$HicFRL`)o%$Bxx@&5Y?i>kC zl!@%R{@x9`N+-PP07IoWw${w^>b@qJ01(-GP0 z(~`D8*xFOW>tW~x%=a8wP>v{OdLGC++y6?5)l-i50?>_1$_(6;3u4M+&BV-TsB8;i z^bX~RLTh*F?kNw7qS0~~pMC{=Kl!B1J?H7M;~&IX#;Z11dqu9=L6|DqpOMV4cpkZj z>u#{Sc%ajL;L|hn&6SqJ_Q~oalU$Rv}dzqBe{BjXj^N6!`@}gPkBI>=ehL)-MC%2wx(AKPPVXS5ysSU6=+1k zf9qL@XyIrftd>ZkvCsnM|QP1MHR? zFbzxCaZ(Xov1j5an*#o3Y>D%=4?`N=UNR{&PhN_IDh=mI+~g0+zn1_`n&=edG&a1R z=*jFR>YEyN?;EAROvA6Egx0z$8uwtUKnHJ$f0^iyUmmEQL6076yC2f{S)AV1gkct_&-iN{7S`^ z2Or5nOf2oTK)dc4u7sz|tZj3G!~^y#RCN~E~r999{pINkZ_ZLlAXdL1i`}O!pjL8}p9UPS*n;qo{JX;{au2 z3=^EM!d?0p^$6BdDiA@ILRM2oK&&o(mhnl_f{X=2QShwlqlPF)BXhKt1o0xazfoo! z3X!l;HLUtY9bXksL~$czP%WrjhYLf>^XD`qt)wzE@GCAsrf#Kx10rj+<}8yL&OG{F zPp*zX6r){0)xf8%&x8HiKVD!mXXPvn{DwGtH85R4!xs?$R#W&w<3|A?A({! z>zz$7&+i<`MjXwCU8m$d5*AXG==;;=?^M`4ix>vF14z~Jd>s) zaUTW_V^t-mOfU&~9R{^Jm`fqit?UO2-8wSif{ogq*ZicGiZ2hj)58G7%Dp8f*SqVt z*97RyT;Y&DJV~RJL49(kxfV;h#OCAsCh#d%^=wa5R*sCM7-!xDSPX90XCa;<)fY0$ zbIIoru15a5KM4+3%_*5$Ih^A3e-xNQH^S$Wa#p_XlHj9 zH+9sM)2M^2i_MYPO*fsW}&T zc)2?l;MAIJBEdpUIk~i^B&-SQhx{cpzT1TM(=Ng>Ie9q`X6du}it`eN-D-Fknz`>V z)-|NW*B~UqtU6sKR1Rn)zs7WuB=nzW9!t{*uQI^~>vJW*^uUWKq+XY9GDiHygx5xS zZv<$n=#&o!)_G`78;IRaDUs1n;U7u!E%n4K6T|znLX-e#m|wIYxjfGS^y$7KCk)&# z!WO=iyQa8z9doC#TfE*x0i#65VS~evDjjq2QG1zAa1$N4duldX>Oh*v_%&YfHSzFQ zXH9~Bf{czs;Y%62yE0W*9pVo*Q86A5$!GByuJrK!Zzr!F0GO1R9L{^uWDr(*-fCDP^9dFK>ag1jU zd)q00WC#zfqPtcF^*l~PiY5;&m>N`2uuaY&RYt|3HT@5;Vpy`!oa7!(km;uJql6=dG9d*tJ%Bwj_rAt zcVf(}cEJ-A_iX!1pAPkW+nm3Ox;uXS#p>aiW$R9CJ|$JZU0VI6X>Z2q@w`8abX{u5 z9uUNncIr`~O9m9x0manwp8b^LgaGk0!~Q0Ler6#=grVpsud1{qPnZBTO-BG8#sV*% z+I7NtV03S^*s5jh1$7DLF;%oXJ>bSAT(VA=*mnb9Y63O&DR@0*`20v*=~}1f)l4Kn zT*5AoTtBT3d~BloLP3F6qdVaX@^uuR=XSUW6mU!bdYP}jpB4BAhx?sX$j@4ri@I4S z9lmd|Ks1xxN$DE-{c|LRDl_r9IU}+Uu;!NJ)7qIrhFzWQYroqU+*VO6R7FYJ4V{yUxFW0CS>4n2cr6>q?$PQi$Zn?OD*LVXw;V$_Z>759?hds#4My)BeuX_%tLgvt{isrOK!Vb&m zmvAa8m7*Ctw?I_km<6lUO^+7Zqf662n^9C1NzHtE7I;Z3XYB)#hS&B3d*vwV?q17j z9H+ECtpcC9DAe$Lj5HtPW=2NT9K+i+U~WjiS}+3SJkUm7@)4#Su91sGm0(g})OVI5 z_XS$$E_9SUoDqj>1xt?HF_R8XofScz@=kI6uS~F>_DbZNyDBDfs%NiU{73%5eAVJ! zccawU3U_HE{SEGw`+MQ*lFaqucOUj0DBA+a#l#m|bEC+wXvuU zC^#8ScL}&|ynB|9OUymRv}we`06S0lv$FO2MtU^!aKv23OFUmT_u>RgcI9kS*sesLLSc*A4YiVcd}J)`HvfhDWV zp?K-vWbr8L&9>ivmQvmxq!DCNV_#W%Hz=TRJV$EFTT4+neP`r2oC7E4lG=rme<8j;WZm|3B&aUzQwEK@oW?N z97!=?@&{wSv?X^mZ5zA`X)JfV1hG%xHzfjgz zsmOPJsvn$uAbU9FT?2O?%*TCjh&}Vj4an`Lo$Y$Pf>~TtDW`5zHZW+yG()T8CIEb! z;)|bASot803CFIfYGRziDECH@p(d07X|8KkrOFp#i`W+A z&})oT+B;`&ro!5iusfo#?l4`x+TrAz`Bl#;A97z!Wf82mXD`kx6Y0zrc6rj@E%}&e zspx6#SD6?+`r<;|af~8bcy|j|T+e3Of}>e$#LXndDrW42S?pArGxl2#O(K=R?NM%_ zsKO3Kk6{?ELOwh(n5v3&9_?9WJ{*3xWMuthyBrWtUi01$;BsSiZOGMIO!}uAv6w{* zTuqaEzJ1LWZ@7Pig{;G=8=3qoiU%pkF82N4u#x+AX_0VFU<`-*U%D-tfuba|nb+BZ zEpyuZx25>~gSJGiJKZWO%vLw?xhGoozRdX_rr80><#Od{7L{&CdpnH!+|OQ_5qh5V zZUm6S12rX~xhNax^?~hw%%ZFwZ9ausZ0(=WJuxFk+YRQpBd22U6IdkEsnZqd)xa}c zmP9Bg=%^>;q0`W~ccKN(*V)cG-xD)mg66yR2g~i_@VN9N3SlxK@ovx`lBs7o0I!2} zB<}QVE=X}UX8k)OEZ;{0nP;gPsCxLkv} zvbQF^I){<)n)!7zi;UF%G^>19qm#X~>4V5O(fJPy1!#KeU1JPkm`3tLcb&%+){aG6$wt)XWnyw-Jrkc2LcGtmbcHW z2M4&~o)^f0Yrw_lz%@6V*htqzMo!3xoBe^V35HS_Vh2#UPpI^PX3(doDg%*d$`r^P z&uZMZ7LSJ|2i2*~{sc?4X7LKC2)cb8VOmr$#Us_ZFck2Xr$oUyNirPWYWK(vYZ zY45SPxX;p(9pJ`l4REl!j)G=OdXlW!&nZ<0^*j@pmFH{V*Ic?x-9rJV;R-HSrbb8N z%gZT}i4o|w5|HHA;ya{vBJRXc=*wxl+6h4vY5fH803KLp;dX3wkN;NkbEAXzdQAV) zp$)-!x`~nWe4j`W-anrfr|1Fbqc6-uKPU!BlfBG5Rd>b(dg{V9a@lwa!5d4y_${u@ z1*eVK? z(9-gu=BvklXQGAMS2@;x@0WU$#sYcf(0+2PB2RGPn*{nQFU0}qLI&on?%Y!x`5lXG zP-{=W!JO}z$P+(0h}Rh6)Qep7W$m6@@N`w4hgA0g=cfyX6v|y`&SA|_JwndNqC1|H ziVR%elMi>m32ucRI*%Eb4ykZI#3;g`-uzmX9hoxiVq6w2rcG1D1LJPYIn)`G`D*J9 zyU1yA<9wb7RP`&kL~e%`;DCjjs}LWjJ!;{QOE2%^-bh4q61MTL5YRFu_al*E4T^ny zPLn0&BvMS1E4s*Kw>G}!nR7wD@gOu4G57d?;#%5mkmGbNhTmrLf#>3&jljbsc&pJ( zGj6y6TsQad%XE!;#xTR`cj84Y@bzyvHZ!z^eKa!iDXTo}5-derkRPK|%}V0MPH;wJ zX=i;79(5oFK__0Sj>MToj%Lt1-FNg(*iIjbAj@+1j|beq2NcTGEY;Trj~Oeyz2+J` zDXG(LbUldNh8w3{^1qHSc+c1YL9UD5{!;bnnq((K(}x%e&h#o1&Qzp45VOU-^7-^} z?BI=y5wp_@}?k^0S$mwfk? z^g!tBG6UpvO}AC^;)kV)r)1MtF@@hS{`OcI;ix>iKxGkdlV)e3>BXr=;JMybSLbx8 zi*Lo^k&AHWqJw%Z&^A9{4!N9&Tb1Pz9rP=j!>3W{?0K=+l|64sTYYrlMVmDk-NUuR zy5hDK32D=La~g+KKlhB>eDMn^0lCu%95=Nu?eTxH+Wi!GTNMY_IGEagP}B!Q0c=&J z!U)Mh1s#bDXri?6v;%VM2Q3yU;G-_nQ4}qUSI50q&4<%Jsx!9CqRPq@{9eg02=gyQ z0gsTT{fA`QSg8h$wLbb5$*nCLN0@C1TEYG0{(yu#ONo}jA&tAUwE)-0|9WE$m~Hb- znilLr377)7NLikEHcD1wm+@MlMbiyTjS2Cj+7(jD&-*^Iv#4mSR+voQ57_qCdRUM ziuJmd%wWm5U*ld1HE{vZXi26*T7z4_MvQjv$7iL=$QjWo@~61*(tKaVfYp)W-}KOo z1z#baqO9mmv<`_3^V?CvD-HgGhGJP)H=QgAUV25(_IOdh%&-2~b=HYblh?wI6O^2N zLGMm`Vt!2PT6N3>I8c5kXpBWatGNU%wg~Eh7+roUpy^6*;awK-KIqXsG^Rb2TU1L$v`~+wG2lzTeK0o%!u^%qrx*&Jj|gvRExLOs^Dl#1`M5m}4Tt zYKG>6@dY}T*eMOxt|ZF1{B^-lTa0Ix2RSxva!C9#M3puOonFG>$kIvXtGvlvd4S44&4sjc_so4`Toywu?xm9PRc z`ascZRnkT2bBCT%>WB{FsqrLNazuZw>J(vaf<3Qiz;s{AlUKWz%Xl73e*9%{>GHXi zU)7Am<-f(Y(573zKWdrJO*5sFcXq)7YZJ7lip@^Oah&q=?)(w@q2(@s z>g`nAX4t)nsoR9xEf((fw-QFm%Hx6JCl)RUr+qythR z>own#1sdB-k}qukw^YHwb*YL7ubI!iEnj91qjb9giTroWzrc13Zc(jEWbwJ2%ITHE zA}|ZgAfzAEq=_)H29ZjgS9+ZC<8=)zszuJv=)7S7GP$Bhd}&S0aX86ALRjbkU(KKC zTMZ18whLs<}D zbU4n{d50y6xApdPH3f@}ds)%^iiMc+iFjXK3-8T;2nRGPnPN_cUwYiE3SJ2em*{x9 zzOMK5zyy%9#_iUT&xRex6lax1+j$)GG^u-r50~t>j~nJPYag}hJb#&s%qN{X*)kx5 z(5o0E&DZ{iKsP{GQCrGJezT!VQ;^bqZS=7RBM>|Z5lbW@*7`ZUwEJ)Ql07pTc z)=x)L(11-T$D-L48e;Qv{QI)3W-+BiO0iPT=c0)i_sf?#s3}K}jX|F!z14={N8loD zh&L40{MovXIGwAh?1qngtUO8)qh)c8Xb@aX3SK|`6mFLU!%wVo_&}9f#JIBy9vrZL zvLI@5FHC*)8>>~vn`V#0XqwAvACYdD9(VaT-^0e7#Sx7dVoP&((P&zNx8ZhgoV2FD zYxkKCO<9VmTU5Mn4QAmw9w0}MAMK<}7zg{i^y|4yeCYKcIQjQSzYAO$zTh1r&%6{m z8yz+5wixkkGbe^Tn~40U_ooeyUR`;f?@52v$d)~=?QTt-BY(Lq`6{=yi5P##82Eja z4t_ZP)o*(ALpk)SQwrg8Zrts?%1p=Upx8fC*6kO?#KGj}Ej|1Pq`Uoa*ii z6wmYp7uNQfVCWdV`*2Ak12-`(8U+KOB&OJb=6b$^!8fKzfAHig2w#gm&W>GF#h@^!Wj4#-{3wo{|C0}oeaf(rVX zo(o9t6B>l;a7uW0uV379j%yUWFc>stMj6dhW#oQym|U&er9R2b9qsYY;1U&6ce4zr z^}_Ecj*Hk5_OYhI+D8UBZqqfc5H>PB%n$Oznvtm0bDstmhbeHI1E!@l~W# z2RYrsMNTZP<}kAA-dD`s>(+-}nQdHt6EoPc!gGFUz(R>rzup*id(90G>$y}K$jZmm zelsebdS*=?7Ej@!@OMNS^&E3PNuPq4$QlGZL!9qUas8-+PxYcS4K@a0w9qmYui!9L zKKpV0-3m*bsip}Kw=7ygWBW4n*kok%$F*@XDEim3Y4KD~E5MXiRU9&|CMpJ8>w!b2 z(Lg;>eM+G!LZk7rNV&iGL($EyE3Po`)A!j|@Vs#{G~)1y}u}rNLSqjzLjOo=P1IVxV3WwQ!QdrE*3M=(R#y$Kq(Su~Io3 z`Ac0MLh*#tM15(JvoL(nD81?#S56Qtl&AqfA}36TW6^}uKj;AN*T~Di#;qhS%ov!E zLw;5$&rshz@-(4eDuV*3p7d^~lX?f}7*!2@aSU%95vk%)-w8K-JQ6qM;shLV4$7OK z!q(FO@r)6YMrhk$1?poga^};c$YszI7L)7nqtcDs9dn({H36#K&{5|m)z*0{7SDPh zp#ep9jwK$OgC2is|74k$L63%>;=#k$6a&94&}(1ChFU+(XmZDgZXU^5ObISK{6+25 zod+r!0pL;7XcmOB@t||yz!)B!FSRUo8>K$jqtIt!+MA9&M5Bi&$O*18IkiB(fG6`- zBTs7^e#cCMnm@9Yzb<^NxI@g?8W)Rx`z15m$P3W7G)RyaQj>rV8EB0hb3n#^I3i=l z>ygBam{(#zkgh!I+pe+B{bm+&ktdu2IUa_<0J*SNdred_Yt752Rv}!5&yBB zX^&H9yJ26M_8ce|%PZZ%;$eFcHUW>?QiOZFu#@38&0 z6aKynzxAJ*w75n|RZuu8UKP{oceZF2$yv(o12A%lCH8UL&r`cwEa1EOdTAXW7=@2G zw0&wqcnNlob;a~A#QG|P1A@1*hBt# zqkKNgjeCVH7$eNQh>E;6F>&e=#3=0^(mYo(CBgqdT;c2HU=n{jS`1WrZ~t7W82-&3 zah5zr3yRfU*$R{e%;$O<%i*}Vl7EHVQT-Y5v`5~+k)N`MpqckZTD=aF1RL_w?cx@- z<%kLy3R|Q36B9(D{|eITxYh}`ekW7QGp(UxbA-?)r7v>y@7}Rvks#Kk|$yXaRukHXFDBWu0D6_$8Y9~CeeAfy;#iKXyO zy9K9l!5R80E-z3$u>_r&$Ltgv6V-ra9w5#FrJ522@g}v08QIoZ$~Igq@2OCb|NO_*3CJkbL<{C_7{st5rmVsDOwpQBmVc1Vm&@$}XUZ2nb<|AwpygA%skl$;|fz z?fdunUHKPc1&d_v@y zk?&po00Tw)j`7M;I73?AY4>=_9i~#L{Qt?( zXk<`24E!ja$iOSr6~E&O;J?yyhKT!?60 zVn8G@S3D6(PFdQ3@Kmms__`jM%NOh74P9uMu6E5xU`s^xxkkhFJa&mB1tuV3!*n@Hao# zBHDxsaVA??fUN0aE`)Yd_4NY5IW7x%dXEssAxl-NJT4L`lMdDPBKdtx3rwcpgMU&% z+F(=GAK3k-4i>PjUJA%mC>@5E!d?HBtH4p{0L2nj3OnIz)svzU=^M354wWB zz|gp$O$m8S1K$%;PyEN@B}eS}-+NO-RA89YpRhtGl>vA0;_FX-ztV_3l~P5@siJQg zwh{3HTB<7mMvT@g3~cC~u4Y((*9;6cc|wep;rEft$uRUy z4I~R3$iqCCHwWV)SQ*GzE{}3ABYPz?j1mptIY|pPjSP<+9BDKcl|@(LRF9*VREpWH zGll4)0gKM!<4U*E!M<4qbzP7z;XBCC&Cj?*VjJgIG>RzWW&;C@F7vg_={H3V-#`1+ zYW|Ne45t&PtYz6UqVxNX(D(`WzV}0(l4kwk+9px+;(=AC@~CF_|HFDpWj3zU_{5qK z|1$q|o@#}vFEA$M(!8`-cr|hS;7l8oX-}$cZR8?tnE`!`Wgg~KZY|phL)T#4H9UQ# z`wi$lZ@rTN)Or<_HzAf4sDlGERATKF*JG%x;)Og>236Ed;`~@0#x zDR{Ph!aP8`66mm9y2N}X^Hh2cK{V_3hJS~-4bHcg-eVyu^{ugv z8mS>>Q$jgcFe1Amt4K%sCugr%tU`i<8mY5ojkoIm>Ti@gNGhRLM-><8+sYgtsW@!7 z`_22}`(+kLTWP?H$Vofe-}klfzuKL;wD4x+jQckqh%IhqZZjSkeH-triazy0_RuEx z=`g}v5X^ZV+;+q{DxrTW_UtZqX~rf^2D7_y#kbYT z42N)I#=w&`x4^2rH|TJq1?$EoAHj%z-D zWRyhFo6+IAsB7%ic>mlJd|kh~fXyC5>C?uG^-0J5--;YdMR7;dmPM&HdAUi0K8nJz zw_ZOpRhylKeHL4an8$2_ohHNGjZ>(LusVBb8={XxHvXwwg$8|$ajPMcqga(`EFS(2 zQ3~e3f^x5SEp<$hs)li19Amb}6Rp1PPORF@7|(JtI`aM%cBo{Rm8jL_qIK1dKd8P* z_xt<)Hpq~r-^mrowO7AEPgHO>Wj%HrTZlCUgqFx!FlOsUEWdp@AtM?17*e>h&)ooiy|hH?NG&G@Hz$C8WjrT${> zs+u9JAqt$ah1^*jk)`diWmSNtzX%LO2KKDxxo7W7bFh1aQn(yXu`y^>b|Z zj!fVzCDUU6005TyV!f#^zUB|u4=FTE+Ys_K7?bm9?F0CifuFPvm9`pMQYjXkVM}e^ zY790QE3m&SWj0#EDYbh&G?MvRIDUUUI;xH7ui}a-xlYZxOhjX2O~qRFtrk}gs%RMk zr=5U@Dc#2LWPwGxd?CGiU{`pu*+3)Gcu!E3hQxcp?~lejY9cnhxY*gGvJzA$$LB`p zqW{!-g}K_J-6PW=DX&UrRldCZmq%U2oALTOSMA~HF*bky8YT$;JC?$mKg-=cIZ!7f+5)9Cp`hYh5D-Qb> zGgp=uzA`%CNL{&|GaKt$)0L%PDQm9ab0R}^4R&Fenz5UB+}3L4Zt6Wh`PO@PI8=D# znH~55mDwm(2?t4oYTlECi+A-*ye;0AS%Qjl-pADRT9PvgMy%>RR93=MzsJF%SQBCA z3%9VFFdDbjsBoV;Y`}+wibc7g9Ntj(eU~c^rf+1_r;<#^??K{c0V&&f68Jh1Sa*YE zyLbOI6EjCp-v)+4%Yc&l?n3LczaHNO7>}uFHnlpRck*K9O{P!g{D}L$344~U6PUW3 z-akV8P2V1}7@r*SWvbPXB?FKA=Yxu382WT7vY$)m3Mg;uXVfOw=&M2-BN^{MOD%wPM}PirC%ul&1q!$|AZsPEc# zu#U=YR_aSjEMK^htxDL-r;00P2{&DZ^dDq_jQ)WgER_YjC}c^{%jA=&IA1rJ%II#) zA_`m|`o`9r7zfV2-wWiV{>rM1fKZjg0DWx)b12A;Y$)F92J7f0wcQTVi}-?QUGtV~B!KNO=j2i3nb?(UzXOYzQu;T#ZWD8aB}+^0@;#SYFm zSsOq4%I0^%L*LJ6*9q*XaN;ji*aegCn?$aH!VzCBCza0%z#BLPqtuWveWNl}G52*! zxSG)mNqAy zP%c(fDk{3g*S4jtyN*7f@x}tcLQNvr)}4pgqyQk7Bam!V-%;Sp}ZG z*psW+xF zaES?Tef*D!*|ukhqi-PJ!BN0T$HD^wSB6* z{jJyOV-TN1O6`|u zVx8Mn$+AS+R7Yu~%#P=#%2%%nyL78+9nnwz_%R{o<4+i?ym396_ea%6Qb+79Yzc-` zCv9Vol4{`l#^r1zQ{TGxWAA!a_nXwAkv`h4RJ!eAj5bi2>DnK(gWRM*`j|6`ek)`& zmAEx_(vS53r1CKFHsFNKSp)JXEnW6=7}$PYO{UPa--h*cDto{?zrtiz=)^WTufbFm z0ev@+^O=H*%A9U6D&4Jq_cx(Yg9f|{6uc8AzP9t$+bBt@ccGM+-O=V!^jVE~`lDyt z=SahTTIB?c6KuD8`dv&Kj-Qxk-{4VA;a}e)LKFE6>~6f$d0&6x=-)iDQrI?TM`exH zk{TnN09sW*87ZbbP|rAOr>$s5#gQYixmlbfy}K%3aL- ziuJX4C19PQv5%1p+47AZQ8g{gt^q4tc=eJ}zZ;(Z?(DN2tUDHL^3|C2v~EROSIW+L zx}7}OB~4(p{j6ha+nJUvTm0VZ>`(TqcwJ@ek6YbKLYpL-s~^wBDr@r8w&%b0A_-O8 z{KhTe*GspDFTXNgiF30^u&OH#J`dGYa-41yMa&zm-n7B_5(2tecCvMmq@iYgU0dHm zhW#bD`~iJJHkOXqaR=I(E3)}@lQAaFoD*V;z)8OZ8>FsfnwVx$ zfq}Wa<%V5k>$9xs9vxP0{%Ef`1`yEb*g}}9yj9ftjwbGV> zhik&5^x+{;B;%{SvVQ`3^T_!i6w>Dos5jI<61wt(9 zh+YeWQB@-pzCs42Q1&VfTPiF7uI{0*p%nBncB6VpdYW{ZB9bgS&A z^fT?J>BD|st>Y%-5@mn(hP1tX;uy5gz27g}DZ`u3F*7t!ZC%*mvX&D&ROiZfSNl^O zshh_m00=w(x#nC#5wGY}4F4DTszdls2->U|k!=Ga5%>Gj;!YO2e7oF>{wk!TG=e2B z5ah&N{5u?}A{7^mNSZ+Ks0(3m&AGl~JD6nMWIIC@WV2&`B@18~K>rQH@;Ui>k zq=AkVS|tIq#v%RAOT+RSJBso?`GT~%@}BCEh1saYf_=MR_a-}&WownYsZDjDm)?(t zlTJ&+#}dAt9WwIOtWL8%#VNO*kk2kV0s?*1qRkXniDH%ULrlLzcjH&Jl<`$Z55;B5 z4W_54wSe4trhu`dM%1nulVIl;c;ih`;kK7uDZgLeFqD zGaNi?p^~4%b}JG~$r_uzWZwP^?(+Oc#O4?fZM;nkKTNiQjn#bOU~}UWvPx~C99Arc zFH*R}?y#(^hy(coQI5u{^-C4)U|n{)aW`5{@6fKKsw9zrQQsD(0K3%uGPF)+PxAY- z#1j2#?}2Am!tZ20`Sl@CD^?$USOfj;=(==r$%szRl~3_G`rCq)m0n1{IhXhiRmhtw zWZMtekbT+ZyKc8NCkH8!lZ=n<6||V7P^DaFH~LKhPrs>#!^d? zWCf=y28s!11Ari4f~ zR9syMW#otWKI0973g*F3!J(#9n+>MqK;ym@&P^n-2yBohgBv*6!JnJL#s`HuUdQ}g z$E01rZ>v6}Rt9>4SO9wOuXr%{?S{oTkciS(fR3?n!>d>Ur2Ib^G2g|+xmB8!zcA6) z_^?r3_W;;8)nGlgq_>*l13o74exHRX0q)kC$@^K4-~c0TaJ16XJB1lb#iL@;+~>`4 z4t_{;?RLfU@p;_usl)K*qPmgVtmXNtis>}A&n6Kyw5Fvuak!FZ<7Ce)>5H4UnL^si z&a2>bl`968q9@B0U!Pkeh2;dQH@BJ8_g<*MYBQ^dTtbpGmJiAs^ArEg0>~erMia7> z2yZ$oMoA;fER+6TtoWk#Do;MC+TZ4>UwIShhNEEXKW8kywZca4UW(XFM86U{-avE< z{8RAIM%pS>#gX9h9tZSjM2+1RXJ(HNqWhViu9OWVV&fx2sds$2ab{dlDMLHCNUZ{? zT0%NZ@Xh_uw|ds`l^6|G?O zn{d1ffJh*0NqwOZN1XsES`h%jMI~FRpXypH&jQEHPzH#i^pgqU*A^?aT$2L^;#7v_ZclN3ckl>!NKR>=srq?b+08QVOT5YWszdBPHVGY10tkh1WL-Q3)2dKshCJ|*PfXM8^@c9iU3J!lUc*43;+1(QY_=*C{9cp({=H7>;isWyB+t}8x5vfnD`fOwSfk>Zp; zyKRclQ2YoQU|%YJ-%`MawfqW>E9L`^ByR11$BSe@flKqPAY7{=KK2sg^)QC~O0R-Q zw(YUNOy!-$hk$i5@8cJz51%~qXb`x}$97KH?szWVqxj#$yx&#LQ+uE7@)&E~%G4uA zx~0Zf;V(25TL}LBvgTg6J220V0DBG(zC=>x&<*|}o>ccT;rlL9g4qC|gLesE1XzsE zjd49T*gv?CNRY+wUlWT@j$T>HR$Vv#ET)iiUsK7?u8cp6OTnIrotOX=uDy308!elD zl+hniGNzs}UDr)L<+x0{_LxQS=2I0OR`{yv+844}ZmPxMRjEvcR3rouRhIRdm>W=? zsm{D^aRg-Br)$H`wzo-4c<{J*+*|E$f(OzF$y(MO(j5@aQho}x9;W^Z*zQv=lxZ)9 zGEC}xvrgg?$Tr2?z0|ix1)OIwtAXtT#9EWeGdOi3v!!L37nFvW{=gM-qrK*sJ}Jk@ zySubk#xM7Z|I>3)SYIB;!m4EgdiV1PEK%(!EclH$4@X&l>O6#Spy#4Shx5JOv^O1a zc}om>KPyNbdm5XnUxd4m!KSmj?u9xT~cy1DHI?bJMcWumP`=b<& z{Z%Wf(><9?c+D*DS`n7PH_<{VE&%_V@z2@bXvrs6O)P8#C+INYbCFaytIie(HtuRL zx!?Goj%N}MM5_)fsRk_}$HhmA{UjS0La5B6eCzXOwL%{m3^*oEPnqyxztOFqlys311?nldo-dJPv2H7t) zSrw2}ChPH;Cq0|uhz4<+392pBJl!<*i-R3C(29f2(%3Du=M3>KuTpl|uex`cNGMMn zAQ_>O+S}?*E+i9yc!Zu?=LBHYxIu5@QYLv8-ZtojnM4?01I*YoA+nhYn2-$oNn%v5 zSf45MdOWz`CHZs7cmi|L)|nPdzu|01dDMfll$$qu0>uYyW$i z6G0mWo?iI&a}r8TM@NA(t<=T{ig$w$oM|VeX4AhLN?gUc4%D3Bs(vnN{9_miT80i9 zDa8!T#n`Epnh&87bq}S-0|yA{!$NZ@VJi(w+@|)HL`J9N^SIu$_0A-+;qS-fJ8}H! zP|5OR_;=(Ex3Z&zdgsU5YKka97zDWK7x%alvCDAx4`iru7z7O8JaB*L7?tW;R6iQE zS*WAFhcAA&_j=n`XwbiXAAKCR#kSu1YKt?p?cZV&x!?AIRFyY{<0)ut_9T$mu1o{* zFDptks_StELGTy%*hbQmY{A<;fC?Y)RyY{YW*W1k`;OeRQlWWTBv;m(lg zBB~FzNb@ZK9bhsih!8$B9|)kdfjnkkCJfTYV2sa9KLr;&LJaV&!$M*y+y=Gniok!0 zj~mB|wIJKb-Vf>z`K8)kE^RIdr?By-v)n(o6B8kGj?pNdQl#Y@F-1p*p`iI>!{E8G*Bag!a;1JhTSC`#`MOy8B9eUYGZYH zwueUM<~wBXwo)^aJcF9)M$TkEttVLTJkKYG)ecN8e$axSG`ynvzbgm=Rw1Q?;pPo` zWU!KO46{mH$%;Humzl3b+B8pAKlbG3FhxdV_2Spn*hiD3_7L*-{_ zj4Q=Ivp4mryTDQ)3Uh$Qsgw%b#wH?ZKR-3q98w%B_^gP5(qq_sV#deB;E!&sHKT0a zZwxlQRY~E?7i=&XI5v~bQmsHAP{c^HdUBW3C9GVL#>p0rNiRZBKrqR8lj98k>neto zKb#YPn-geE>`^38V%&kpcSefe+v23seMD0c$@v;>DfC1*C@rU7ia*OYb`u&r?ZNeXsU9RS)(Pivz}Lcbp>oNXO{& z(1lulNBQCd-_mYIP8z!}c*X-)oWI>s<8V6i$Y{Qm&+~(8W_&}kX3cz8$x9))>Ju!m z$_G@{$HvC-`xSIB&NKdPLpJ^3dsTc_1s@E)T2Cyacv;?yX6-n}h>jR5PYXvT6Sn!} zRzo$&c6aRHs+x;Zw_2$WA~`3XWt_%!zk%ds5~9svfs!k8PB0+&Ot#z`9T3tT7sB1f zn0%EKX~)~aE?A)VQ{qoj#P({%3P_s~Z6(P4a^TI!3e z8c=SBHHN(5R^1zRAkJm7->hOrDVX@+!hFsJFS6=(ZJJ?Q_^ycVJi9bRl@!YGP_wrA z$!m7uKQRqbAxDu33(pb!6CS8|@C9NMq9V<}=8EUS{#y#hn+QZg58+$y)hhWSaGfH) z1!U^BWC&zizo7l_-8a^6ElMmaB~VxqdXw?~DouIL+502KWiExaSycUdR{NnX=Tqh? z6Cmn~=y8o5b7kw`!9_FJtjzHM-OGEJBCt;NOy+zoOFtscoc6#9ANvV-o1kue2s1sc zG_h2YVWbrdaeCYr*tQ$mP29~b=Z?>OspgaA6l@mRigkqfI(1M2_}QS=+gea>G81sh zd#RxSX+hf&7@ueeV6AX~*#<%=RE4LGryI!t{EP6@&d4X#xc`r}0_JXq*=P4}AdNp) z<{$)41K_9rw<`h>d*Zw@(Ki3%o#J(T1aaBhJn-?de;@WT9ywuAMJ4j z;Bsh@wB#@)A(xIT&)P*&gp$wlXTl%u}#DiD?|yG zo`mPPJajbftZ_VV4ky?!i{iOUjRvHmzUA2yKOu4*X$v^gt;Imw->aj8K}j$X=T^t? zl=}0t@QYR4Nc@wlm%RootDoXJ;cT@qZ<8)r0ZuE^!(j}$fFy5Dt0_D*3^o|17&HK& z@YkZHqI43>-#hqemf1>9;^6m3l)@G%k*zftKEcGNG77;w4iMBgVUUn0y#hEA>EKIH z`m<|tb&5jAwGIj;U6dUBBqjK9_n(;)k&@Tn=iQCEl|bjmV@*1LYa0Y|!;QU9T-+6q zwGU^->gry+ELvyuUFqIL&*_?jqw~C3L)w_Ck7HwVgxK8*P7(QBZMG|z9pYJBy`n~{ zB`xFYH{|L%GO4|8wCeUOm3{h&uqVdqqdJysq@f@tW# zmLkbwP29XRYxy(?G8;M!Wi8cK zs4GufyNgRS|APKb9rBdu$esQjKFnDn4DF{T4rGh*rbnLC4DwFrqe-Yk!&r`<$+ zV?P(`V{6W{gKf`nIHL{7#|};3IjZzn;x=O+t@{xLJ(-LQCXwQOVnH3E+jS38HCw?* zXdJ$SwFZ026Y?u#3MS&4Ek%Ju#C!n$9IF3Ra%8wA17E06+be8g9a6*IjV&EQMDi&r z07g}IJeeTjXzM9b^*9=KY*=UbNeWk;`fo$bD#;24eEML%2e1dKfmzS%H9gyO+Ii#K z8y}T@z11C#gIS>?O$w=$)7wimVRNnMr=JR;Kc&Ai28gM}z3@9-pb|GX2v4QNglD_E z!I^!p)iL|w8CVCL->@HUll}RZIa?pPBU%L{zJ~e~{eIj--2g>br6hQyogmKA|#E6IuT9I$~4*#4T-dUxxCdwW6oDK{y~?~veH!?d^t8iB)_TTMmO8B zjZ?X$(M5G_=G?A~az$b%$i4SwA+kT&lgQLK7!=`M@F_mfNkTl_Gk2icUMRzaLbc%$ z#terCVYlv*#Tjj;;WqxI*9l^KY*9ywd1oUXB;*C)h93=z6MVZY@01O1g_rLIYiU7Fpz-ELW=@?gnN8|62)V_ zSAc=HONcUr7(AmhC{K=CvW1E*T-NHSAkvs}Y#P_o{}DC~?{X|c|In1JE$6ZyCW=*g ze5!6^#5M7VWP|2hJgu7RDR^&TpyoxAy>GPcP&?As15&=Bt@ESp+s8(|QCUOORH&GS#6zjU z-GSPXuWe8lwyQaJS_5D(dy&4Q@+|aG4cOroUa}VGdK{iJk+=kGVn=~1j~zBaC*mYL zUBJLjm?klLi~=ji^g9kzJ4RK2P_sLjSMrLh&tAyYztpBoQ2R>apY^8Fb7F)^I-?9T z%G@oqN=Mq<51WR7-!n0UMjV!-6|b6Za({S0a#pH?F8=|xJ1&la(Q@eqo^B`mE+Aqo zQ-luq2|xBEf%XPbnJ*RA-U9gsjx@A10>2~8T&d=Zx(e~~EzUusu}bGqrA*9j1i>@3 z4jx8~ljjH&mgHjae~jLdqM%Q1p5ZOT)1pzZNKeQg5!zN^vIf?9Xs8#d5GvsKI7pyG zG`=o16yl#vFBY_@BUKq%^XQw0acmilJ{9njhYP2JHPxuF!-%8UT zIfh^WaJYWf32P}i!Cr$$U`9+Y{Zv1CEqlWT;J%43JApN@4=e-Y7>B2%!KDJXApose zJmHk$z7fp89zo0nF^D&lI>7ZqtMJk$@RTD*?m?YIhnaEs`Vz7$_3vTbV^g%B%F&r`&Jy@jO zTsC~1O^FI2Iu^3WKkS;`K-g|Ddgn4%dkS(*JsiGE zcdq}wcSgSQ;Vy(M8~bZjO_Q1eb}OsyG;X=?zT3KJ>}}aD?af;HkMF(2UPjqK07P|zbx28#l+)DOO2tb=GuGd+h+I6C{#)5ISvJG zdw)(0)e%aW4-%zv07mWlD})1)S%kWAkbN_Lho!?h?}@2xCdDzGp)tw-H0ld3oM8p3 z4h)s5wHk7uSb|n8X3R@@2a=D4&?6;i2eg1k8HV^Rl24Ol~SvzwA@Ni7!?wV(VT1WR|G~9Y+S6U z6pNFD=O{!!wWAd?=Y|${VLSCbi~)l#`)l*go&twd!HDi3&c}ar2j=1*h|sj$Ls#6r zRW)1#MW2k`YKwr{?6Fe1CZw*p0-lZc!Tn?0>T`CjrN6A(?lpcWDYW;O&40d0s{R4k zJ)Lu@*h>{@ENy%L;OIGJ%=3l3ADdG~`m%yV?*dW%uRP2X)i)!_AD*HSO-o;7>Hn31 z_@cGX>Y7`xsi2uZ%a$|G11?nuzvIVJAHTn)9nmoe!nF#urC>#uN_Csl-ROXUmFCFS zssKTBLSMbQM);}l5Ug(T{#18__&uYsLxHY0F+~D?1rI%XV#^rnh4@+t2^JMsWD5C; zKLY;}bNw6FzGPMJ%c_Y9jA~7thTS?bC>^L}oa?zU9K7hz)X0 zqzSkRY1n*d-gw-nFBBTBP_%C#Ya(D6cqH3FUz^wdU!9p@_?;1BJoKq^0M8l6!mzbB zNjqZevP^Z#4z|Q{rTC{gwQ=nxes^MWTZdhn+n~k&#<)o{;2ZwNS%X;yN_1VpsIaev zy}=?`yIW+W%p>OGeeFgi9iWb=gTzy~%lbr56Q6xu7)vob4Al@lb2saE-Sb?yp;_Za zg5#wItvn#MaC8XT5Vsq z5;?Pidivk-pRYf((XYBJ8QC#kIf}kX6|UsbR$kw@Edd~w*7K6Sr-t@35RKi|q0o`{ zQkHIk0~(~x;H)1Tx%H3oR^#4d4(cmUg5M3O%h;-BMDnvf9`3&K8gL|+r!BJUeN0mW zxuiBc0jD9M3M8LNJ323 zZ5>*`55t|G1|Lq0+%YxXV47N&5Po&{v$y&m^vB1r(EXkGJ1MnOiL2qfHGdkq7z(a( zJ7mD#(EC5$I`q;xIvl?vPenrWh72w9xB?#N#NLT$=OOqN-kRqlgm)DYs%0rtxz=w*;|bht(O~d`17ew@3mq2R0b`grOW4uod29^R&g`d5Bwk8jr0sDrP#{ygxS++e zma99CnhkWS^3KjUVe3{YuB1Teu@ngNL6~JXV@54b^eiHU38zXK`%tY^sLfG9Eq@oj zWgg886l;jMjT-O?KZ)P5dS<*c8v=Q5&}!$`07#*SFvJBMyy5=$A!2TeuHgE0V(-P) zS7@G2eyOj+RQH<1s)@zccgfVVQE9&^2D|X=(z3t3_m5)+JxGm$Ckk%)FmWU7SHyH) zXYt|;+l>GuGGX%S8r`lFCj=lTE`>hqGd*P&7zUG0|A(b;bd9}I+*eC59Eb|m#t!=? z2Ok}i7%bAnAE-}iPCDq;wHY_=rVh}J+=%shBs8-J{vf-XB0MQ?{G-j>zs*XK)ZhU| zN+mNbr!LV9=EFY;F^3&&9pf6_p~|CyL?z%*ud5oTcrd_4D82QFWC3{&#Ck5Np`*zN z?9lff{_6FCW@6cl&@UG{{yVAQruA(v#~-BYAz_d^JFF`%(_fqt{B{*{eA~CP?_1O< zD)|I+D#`7+WVfduGDc!T6%@LDvRl_&$mn+0S=Y#qMwrgi!`n)Eht{g3R`@~vh?U?+ z)hd;)SnizQMlLNFVc;=!Q}6OGHNoczU$Z8$m!#L4+iG2-EF>8RIRgGx6If=tPFXQ8yP}i3UU(u^IFqLBw@4Mau=UGSL&1=d|Ys9r~h2X-gWw zE~t8|ke8~&NX0>p7tsViQ{0QdRGUXC3RCcQ&+VfT!Ptl}>;s`fFvaf8whQ`&C-1-4 z{P-+wcj?+9KLDfW$ZUDAcFS}r{1eG;-E31laFE0_t^>DmlHE{n=Z1XR`eJ}Hcn}kF z=x@cUMlogWhcW3K*lH5%o2Q_?Jzi8K1;$qzR928Yf3@K3^v03{-&r%&$KkS{U-n^0E|a6A8u1hY3_rB z-t*T>G+Iioscp+*c=Y_QYg@Y|W5E$qA+plK9j6Wxdxw<05c4MI6?`hn0S}t@8cBw8 zD!2-z5F1UN$6P%`5j8uHj~K)0y|D2bhs+SXtndPwsY1EJ$}SBxomK>Eb`v@UmmnDs zlkw&fY^)(rYo&SMVMLpA2R%o*E`GsIN4lG`=~b#*04T`{!Kd6IYVQ6UwW7c7%w9(S zM4~kG%ylBQjRu#q%;GP>Ex@RiNvl zAt7iG`J#B4R1D@2d7R#G>7j!H46Oi#+h+!(Kn!Tdp=T{~9%OeIwRO&>vO(cBDhB6M z>0z~W;6%5z|A|4J{7zx-#;_h!I~FRHeySSyMlkw5W1viT)UQNiq^tP@K@%YoK|KA_ zerIBPD9*13EEf$O zUcfM@1hIclJ)i#^;35?-xR7Lanj1O8lxZx9!fVomP}2ro^m&jvmHqqMh?ShCk}dGx zz!a-09?t`^m23@$Xpt6tIp~S$XqES-YRDVd@INZ5Iog8l8Mx2CW=D)aT(*4i)$YDY zQx+P}MDM09e4;o0(Q#bAU~#A4b|k2;CdS8jpBx}do5s8~)+8;be}w{jh8rJG$*?(e0cti{*!DlK-GAd^zJ-Yh-9{$XCyww0*g@3vOa+j84<_g|%qSN=)A zDv058h-EyBYb&{`zu@Vr^#$94$4l9Zt)M9RpI6U0*T7Gy-E;j)(0{^bi+V?*WR!II=oBxKtOh?_=6Nkx{TL(dxwGX%!vZyx`u^AIi||J(b6#Z zYGdyp_;e4H3>mzJK$fnKjsjVKVj5h_oWP7%YZ8M#DZ~QIhOT%GW^_jFba$nh6n*a; z`(;3}pBQD%3BCl}X*BJRoSX=g$j@K(&V4!2l@10&omtV{;PUAAAqN%sq3&D-VDN-b zT9nseCLC_eTlcOkPs@?shziHvTh_Diqf8T1$^{C<&tTi~a?Bh$hup{R$2`bn&ki7k zpnW;Df}C7i!Y(&B0u4>Jr}o7>0TIJ(Y1$DhKKm9b{t*%)eckwzJFD{U)plrf~S2~@Xe3clbvVw4f~8r;tV^i2jJhy z>MJ#cH)G*Zi-qV<^poG=@gDjJDIQq=@y!~87#oFj(r${%g5V8CW#y~!QSo7ObSaK1 zj3HglW%mtYwHDx^pI?-pH|l8M#Zx}66Q)q!({&L#t{OQ$Q&9^Ef~zH)z@Dptt2lRheG z+@BWp!>D&7shHSPW|KL#NSZ&}E5U!P%z^#Pa@Q>XtAUH9PCXwI@q*-_5w|O+5B)>_ zf|z7@Hq^y>L3SrzW2$LF1z*xf>mc{n@dz$& zvPLbm`bYb>9DenqXZ4WHPp#2bXO|A1L9y&2v0U3RspC+x7P%%5)Aa1?n`$NRi zIH*cG%DMY>Z&D>;`K{yLSU&nK_8Wd`cRfUyRwt|nuM|gnyxJig|A;jk9~r!~j-$Pn zR;3a9!twp58X48Lk#pf7AJeyGTH8+HpX_r_4iGzqUHZKz7vYOPzoG}MUb`)=hw7o) z1+VgAGcF&mA61%O8bj_dk<$tN+n1%XAXe^239IGJmC_ttLKS%w>V3VUB?sS!?#jM9 zkTV@s*3zs8#9&~KUvF2U`1&1berV?Cq6O8K>PzTNi`z<)F5N%7LSWmoFSDodylB*0 z9M)7ow0GgB=Nv5i_n4Ri*%Eh$$w;>i9fXUP(tO| z_18AMZ%q=P-Jtu0IKDzf;_)hqn5^vDZ)TY; zyTOd)ZS5caLl?rY89A40v#2T3RN)YLpa1!{&|hUU}nt z6x@|GlCB-2K7h^D-UNK4#<8>w-Y z3%6PX_+e&mN1h+%`+r`ghaST5kDdv)V4F(*aulw@%e>qji0tlHE*35dBKVg@U{6qs zu0S0}H$z?*u~dJL*`GLD@%4(BQy-{q5R;~RCX2}6yoByidnvjm-LKi3j7y|0;Eyw$ z#Y#W#sb?s`qNS+ptjDwm?cw|p^v~`$(ksl_A@FIlFYh04T_%*fM;boxz8^_q@AV*8 zM_#{LcgQDobZyG1mYX8PTM(QPa!u^sQ}OkVhwjh&Ai%8oL$X-&^oOS`ODiVlcycRIpD#ySWu( zKR26e;r?dEBD7IBNN>L&_}cI$W@pV`)*3i_T`DeVJ!2F30si&S4A*jngPg7}IPPp{ zFFIF!7}jx7$7@gRaUXOMHaz>_@aeE5d|CS!aic(r=)|8>{z*&OtUolg8VA@?j&{TP2g~xBBA&Sl(=@!Q#ILNR(9Bgfc zlTOWaFM>~3-X11)LS4o1a=???1^&kA2l!?w8lxFwT+>6FKi)9b%l)o96jH<#2;6^t zmfgE3z`DRUk6uj6sS2O7gppX&WBdtHVL4W(IGYnS)z z(guyJ-7xR=_feV6`i1bM?zAAqYo~A8V}9?eFb`f=Qd- z-7tngHE#}26KtyEQCvjD;cOKE_sGZJrOKZzhH=T1|H_V3iCYz)P#GV6qO!jgh(@TXS<*tr^vSwQGEv9KO0yW>iO*`L7?^|0sCH>c_i|-Q3 zuI8;3hv=5uNBv6Py;+gt#8rPyDq=6r8C9S-dR^{1IE8$)?jEObj(CkOdnh$k9>u)^ ztvE@@KF1t)>uDr&iR|8@6mUkY_^l=Dj#ynBvq-9@=rVOTQ2)Y5qZu%T3@&5*kVg-I zY>0m2@o22v9bXZ8%d1{^4j!!_e)Cp1&pcbl6}Q3T1@a>py+(-AG3SXTF$-?^@;>S> zwNRAytZXZ(D#H7B@O)x)J9RChv^ogFj4}G%*dDMHOdAu4 zPAmlt?dP-RhmYVl-)Jb;VX>S8m(ai6cjlge)c1D@`nA-@OG%5l@TKvM*Z{Q8jmuqi zihXi>?+&B4_En2W*^$R=`+x0ydt6Li*fv7WlVeUb2$f2bQ>Ph(Jc@}>sSG8UyvnGSRs6dlc!QYtl_rs+I2Q*+$2_qQg`^SzeUls zXYaLUt^2<2>%Q)_n!B?-q#X&nu%bf&G5o?PyHcTnHs^C-iY{H)9*BT0K9--b`cwm@EK6aUYWY!1r=3j!^C5y)n z^Fq5#bzb>$|IUocdH@?|3wymwgPsf8LpS+2Mq=kU`Qffd@miD6m4$&+Sywb|ry~t_ zUliZ@buUYhUZ21%iXgo-U`Nq11E{=ujINzDmnYr1gInuUWnIO4Mh;jRa*6PQG6dtG z3()D(?U9B{z!_5$hVr6ONQgJ9uSQ25bXQ1Nj!boQqVOyBi4JmW@01HLKmt(#^`H`B zjh_$eiXp(%HLAa~^%vO^^uEe<8qE!8@U)&=GDB z_FP9)wzDiD8w)I+0~J{`s?V8p^s4q_na94@A-PCLrO(LCW;K2kF0>5&NOuynt86mo z`P5b5N;gd(_0wK0c~0Z{y(0ZBSkFNb_NTSRSt#Hb9W!Uu>c^PlsUJ7dsZFGX zxH{mZgP*da_|mK@621;tyI169WQ(-Y-Anl&mZ0ktE~xk(Duu^_cYC;$q5Y*>IMgPg zNqst5hK;5TvnzQEDnp(!M~vWtv&n1v=g=>s{l{dn3NC~jMTN{Z_A=-pzSVNvukGvN zi(yRsHXZbrI1kKh_8$x*;L}Q>?VJr2I_OsPG**e4D2Cx){R+;PWVw|XL*Cdp1)Q=+ ziS6JZ4_~wuzpi`tVvxYuH(Y+PQn$pbu36#JQ~w8D6@Pg#N^b_I+&y6TV!P*6^QA=p z(RQe%0#>YtC;pO=TboL(>-~=6hW3rxNhgR!(8o|8*qhkeNa7Z0H+A_KB0;mOJp>~{ zIP+*bwY5=NOJ%bQ6Pk@%afMrhQWc(;H3daipIXe=uxW4VoyHOT-?83Dun&E)_a1g9 z2vvM6D&l!(CiX>%dyQ2Op8P8g&$S~h6m18HDpqMvd}6#%qmgt$PS(TWJrpquO(OU1 zCrL-6jaajF={Y2>aRr#_(&6v8)=X$f8a8PFyM#UU?d0`Hv#UtX(x~hh=>7+_>uer@ zDoKa3^H6M`-}w9%juXH+RcJ3Hz-QMo1aarlASJwdBBY!-c1 zl}l>nbT`@EhyOyKHn~@i4WAi^p85ye9M#{p_1bx*ZGQve0)7X60!b4S^mYl51N2IZ z)}kGoZo1aKTxd9c(sj61t}Z(p53OoQCyNd|&mjq*W>;2;P#$CjbQJlF(1Z=?uu$saWHPot!KJqM z_|_4xqgPKVhGq`)C5PX_QUgp4X0UACq5F z5cR_Q-E8?hX%e~`VONXEQO#q12}bN_`0haorvN{}wNQZL5ShbXo#O**anBZ(GNSyFHpdRZ#!9xwRYSWmiG24Gayqk;VVmU^r1PTS)a(n>flW9z0 zoiV5=6SQzF&@j*TLi9YnKmdur(V0C)H>94uCJ3X+Ku%h8V+8JfDo$ed)N(_@J)}Gf zsSi;QKy8}XdgG*FP|AUO3LcNWT1_#Q6BCpQ=WkTw+zfGZ8$NYTJ3~}981jz2%Z-(Y zVTYD~I8tFLT3;C9`7O>EUmJosp-G-Fq2=h(cX@o`|JLPDzxA04&VtxNko`TC79a$h zl1A}MT}XnXEm;)-DNce_cDQ5JJDp?4g9JQkr*EmiaZTU>5Xu^hk4x=Dq~0Q;7_5657H-kVPmRtwFh{0OCRyzA$kp>mOJTyk~*L4jxgoRjZDcpx^98 zNSDFv{zpc4$TMDiuMqDN1#7^r4oFT;4e}m8ydGsJzO~Tmn*1F4pnOafsyXj^ouk*V z9;Ee8GPOV>(M|(AMnCT9|8TK|^iC8%Q zh8}vCQ$p`y`mhl?)je=g^WKP{bDE0Bg4Yc^^S0XKi+m-C9%v(;_c1~c{e2IdH6454 zIXeJf?T1UdaTEzy7{GMVoyNK9X1}ZaEJbYr9XlHnrD`>x;u=A^P)iL6@PCXU3sRSb z+kL@&uD~2`ulZeea;D5>NS|)h%q5oAmu{xxq$~j~Wq$ip{)eFC?}1~MSwpn{NGH3u zo8p7+y}B}pH9;M5@4pVkko)%Xt3pXhkbq-`zUd8PI(U}~r93KA23K)R8-zrvfx^ku zNI?|Qc+Rqv#Fa}ycnR=HBx*GKjXePH7}F={*Phbv_8?7YktShGq)yHLyeprbzdTKt zA^&7wr}|xf1CS5A#^?^_1oC>yj_()KtUr*K8Y&Utn8i_XwmS%Pl?MGx{<*E5E&t8X zl+Vl%d(BsQ*RSZ|2cUCAb$Vm?Z0TV*q$22NiI@QU+n0KXvvt=5nem7d?eFnTMU#kd zWntZ0IsW=OA+F}5y)4;7fHlDjy{eeekk2ctF%nVmo^-(oW6HNL-6?y7g1vShY<{=& z25WB+?y)29e86ezZ?74BC(V~%5`E0y@1{Q4BHq%YO?LPUwx}et#%2Lf1Xy6N})y1djf_4Uvsm;k_2?j`-il^qe>`7gY2|$o+ zI(+xjD&cFpE~f8Jg_G>5!V`=0Yg>*!RQ(yp7e)S^}DiuhT+%fUArw{N{Qr3 zpa=t;Pr8Ib*@EOsgd&SCwU@(~PWBI(4%Pq%+D|o-RNPjaA|?)*t-rqcKKb+SAMXLx z01S#*debrG=Ice!mCQmY*+6M?Zu|q;t-yvidSLW%T@10|wL6ssnpJr2$58yxcxGow z3`&R>#uw&q8u}C@LPc^F`_^G_=1EjRFV@nFY9(1L&E#X^TJ&C$n~FAZe2&I5Mn4Q4 zFYIVR>j_w&-(|-Y9W%E{_r*?*`U-d6J;{sWAJ? zdbG&3-b!GorVrNo!zuD+IRW-4^}ZSl=^v=ZuUMqCvcL9Ao2yd;QE#x(iBzGj`4TSr zrv-8C5Cb4=?g|HkclR*(Yx%Dw_XVi?ud8*6BDwf2hpreDWBUHSu%(f>i9U(%Mt?P= z@`;s<-cy=sQuRskFionq>p$9e4m|Je7!JxKH^n}t#CSblQWygd`viXaKaL|qpzC8amJqQ>&kpZmh14V z?2`mtp(it}xF|2qm}}P@{C@V(d(?>+%L5@wt9xlsARiv1a~n!Gai|wKk*Fq8>q}z; z62hgAavHZil6gf3=CpDw6a@4=9zKNdd=UIU;Yk&t249WuQ>4Q~BE=h+G1ZEc>-)wh z|Gk=DgZAA=KoPqyi244+AlZOY1W}(KdNyFG$w@vo5bYHI?rkVP+-l4jMJ87$9U-s+ z-3En_7)cQuGUbY;HxJtg%8C}vX*Wj^eutt$O8W*$u=Nn~CJ$87?Au)atQmw?mA))+ zsNM(AuTWlx)R7~!-Jf}olK;fm-CPDcmVIobS25#Nb%$D|>J`|r=1_&|mC5fbW^qE< z>o8CAG52wm`99=dV?WaOf7WBKOQ+xPk?U72~VPeTpwhy-}^aH|69f{=Z3d*Hg z<9wnB3Np3Nk|f=;fmEvAy{2Asf-hxVaa{FsWSIuQeHtZo^ITljQ%-1}s53B_T<_i`p zV|b~Fcg%?`$kh_HrAORC$9tQ^^s(v&1zqSU`dd;9c6E*p%9z}5qm!pWu|`NJ za?qx{<|eT6X1@E@>?b_Lx3S3;k}}4#jYG1d|Lz6Q%Mb=o^H3pW>Ge-#`9UAFu}L3^ zV*l^xhYkyc8(<#-_*^~;;@U-Q=NWctc?nq!8%O2~*msR*i3=+5(5~$c+Zfc5& zl>4=(o<#A_jE%>CyS~GaG76&2sE13gQ;6G)v5rrBNK!zpumzWe-oF(fA`hre->OT; zZZM;pBtcmON)lbP)(?qd?~wok6k+qA1BlUxwK6XvBscP;kyykIkNX=PAd2W{5Dw{` zA`RtItfV*=TCTJg^lqATC{@h-hb}A;Bd=kg@P&nl{6C`^0YBQ>7xf>O7yKKr3<6sC z*0`{RgN=e>r`ix$L+B_R$R!} zN|FGQiy{P#vZV=__{TlxjwJ#SiO)rxc$n=Rnzybw{QwTzM}Yf%;0(m1cRiY*!EAqx zx$Ps_H$8)Bx8x!_l;E`Bd;C&=Miz70G*ar?k?f#&1LyB~t@N6VX-DVM|xd z2|ccS!IS4?+d1fjm(+2%>!*mWaIqN`XrqjGl>l`4WWek;SolT=^hJpMOfZyKH63IH z;9m7cW1uKVO&v=?U$t-JwTQjG5??4Co)i3&Hf5ygfRL&Xa?lvafFtb}GnHfrm-C;V zOpX@>vpet)w3(*p-pxViVWdKw!j|Br7O6LVVlWYp6^(2rGZj;)O_!>raoWE?F&K6# z&rhSd6dVJ+Z|sYz5uMsPA^*6E6Ht3xbiAZC^+tjWYjs;v;R#pVqxkROg^Yb})5c;R z7jEjwrF_VzWzjKl-cc%=Lps|gtFmWkw5!ib&&8a@Rp(tu$h%raCy$MJvm9}UhBS3k zf&?Ib!@Tbc=%WsVhJuU&R^Q7%zNbRy@V@CyFM}4u6YJ9|{phTZBKRxzW9HmV5I*Rg z@T1d1J^y+?YqWPhS~0@EWvnpUwwDBF_{9vKnhLH3%&&B=-UAKevqRb-yd&O7f&E%4 zCe*p8yrV&(iaCQk%HAeU8h;4~b-6l&eKG+_r}X#)8|XD%8ES6@bvnxEPCe(`w=iYi zr^FBBAqJ5L^s%0jwjags|Kx+bdUSXBEuvOlq{V%j@KhkC25yoU!R*)>7 zqB%5iH&Z-cI+_R}ssv6XbXHs<)T3J%t5ZeYrdE?D((iy}H`5TS_?RY4Cri*h-Pa%$ zX(xFv??)&B-T9t4YoB-d#Vyl&RxaP+&XS#6DY=B-fGzb9xP(}2XLTg&`ZVD;KyM{+ zWETHyJg+p9APuii;-ynw1xd<=o+Sv6!(Ant>65I9d4L@uBaADpRm6<3+D{&>SS?p+ ztp51{b(XdDU-g8F_lv@)|&fzKaFsK;7c;MA|?6+^qa*i_J(bPVw#l zpsAX=Cf)6@d5_hccm?M4LCi+VT-g)UCBuepHsrdq2Ih;Hvemv}KT5MF@L4rJ{wtsx z2?0;pf*7Qx#-ukfO`w}ypC=^XnhQ5`^19F?(xeBzuk}KIO*4t8&HjPbe1W>LpCwDh z)DB}(7x74c|7+pnQ)gT4=K4#*<=(%4jE8X3Z=djU;e8Gb*QFaF1v>=W5PFX=iA?>8 zF!2(=_u%hQtJ7IBkRaMhCK_-Uy7VPiKGBWXG}t}?)kjx=Xjna6JVrozWa3&O2IXr1 zV5Sj6<&pv7Yy1$zKzXp2C|2<#T}eOm?oq=v7VSs;1`bMzQmpAMdLyp18?l28z`5gd>icRcH1h!a0-#hx46JeogwEwNt6rCGKt8e<(paJ9IJ5J$%agM98dTEW0cybj z5!+m%P3J5E92!1e)#53140oZe&$%v7nEeDlkxgWwDQ##)z6ECX?D~9~s%f-}<~N<= zi?D(n3j!j#=<^P=PdY|^jG8b~zYa(kS|uqd==k||G=N`u948#DifvZZ-$TiWE-`?W zGva)N%Q40K{6-l(`y`(NcxfoV0FS>Jo%>(ZM$3H3jF) ze$6?cQ4QkTNxG6#FuC_)jd35Vuy~N>2|q;Az}!&|;JAw9jsR2KBccHYlK71c1|-{O z(J3%vO?*Zj?d>P9`6ROL)bjqXB@PIjnn^iNUNy>TXMU$E(HM@CQV6~!`TcWI5h&$v zgWBY(Y~kM=?0{F}`nKO)PXY*NukY40d73#7&5bWpz0J!k%lZoq5+v3Xl9Pi3tL$;G zxR+ywAKF`;o<%+)b6g|HjL@U!fS1tJst~k3bdP6}amq@B_nKFR(+k0@*2Lx02Gg!G z-6rfv8vYvT$FSe_Dq_g8c$LrA^5R9FmDIs4U72R19VaizysGFtD;$%G&$e9iOkszR zSa>d@Pm5>O5#UEgbM&K_Hh1xnRZ)?gzN%4O9u}1mZYyT=9da^gDz5ffGuFbfzK& zK7`7K#ZYT3PMIb=r4EQQqQdeY!njl{&lb>@8&{@kN)^$_&p7KgncpL3!bm-b(=J!6 z8A@OiIDij(USY*erIFTNwq#)AMZiclK}}r?D!ny5D@9S3E+%9C)Fbk@be_c!)UJ9R z@n4dFN7kjQBv)>Uw%jt!ll68(hHdzpYvJ{L(+SH7qgN@m`$ccovO?@nETT|5n^O|G z4Q!03(Xl4CMU>&YG=6Bk>*A!3K*MmxRVb%s#{p zahhsFL9Ya;vZbjs7%KgFaks(;M5fIX#{cA2!xq^vZ2?6FSoKK`xVU7}SQ%>lX}qDE^z3;kQ(Di*#*1sEUE20W#PzSnsL~i1MONY;rcETYz0D?_vVAN#=1$b0XWMkrtBh$Zg9O{iOEL!7_YLr>TGuQ64uB$U8^P z13*r*GQ>eWZO7$2+LG%U-0Y5mdlhFuAb&H4U07!ztv0I>lYK1Q-zD{A5vn>iGkqmq zRip*7`{bq@9sI|5aUx7aVIT-#BiZub17SIl_7cvpp35y4OE?S_GV6@ErP$6}v z=TMWvL*V>|1ho)>jkFLVx@br<`FR@`@?rvApgo^?k%b@nbsWq#J2(KA)4L7Nrb^8C zKFYBvKXn+blQ$ROTwB9@$F}^Ffl$(cGJDD#s&X5GqNz&s|nThbQXi*D)l>FnjaQ@8$mEmXOzcZvC-|_O?e3m_GFnAPpG8i_S#Rh%n`p)@vXX$b z^jnZ8&GK;`S}YyAy|~=8+Q*?|ekgi8MzNCfm1{c^I!NQg z3OcD`HMR;(kk<<7K~Ntuolk->K3|Uvzaoof-BjxlB=G7mi51#NrrdrpM&h-J^{wn> zE)Khumyg{f=n{NNOn+KQLQl>MaG+6_KcnI%Oz8RZf=)srknxXB-N2S+?&g;1SpeNY zpH^gS7$C;GxHdl+0*ht~X?T@(k`T_0p=I_OTFgb=g9bPv&lY+I-v>dp5PORos=4^p z&{L)@c{6es9qPfaR0&g2m9@;fC?d3w-f&uxYcf9%%Q|v0ki$@FT^zVFok;nRM25E{hiN4OJW}}K&h!rc&-eS_pu`zdGRhIRo2yPuW zmuX8s>84e&SJ$QxxYrlKTOON-A15UV;wzYe{sbHhmMx29abYiUJ*OmlIes&}gyGen z$|ExH+QebpZPdOBZRZh?is5V?Q?2ga*zR9Xkgg=O9*KXBq(M>+uLpf!%B}$9{?szQ zajWP{s+b0|_b0<7PHcUOfVn)f28!M49E9FVI=7n(^r?RY2})5y4Ins_S#IesF*GD< zku#NkR#93i#*{z<3Ohdi{@fC9*zlUtWI%ypD%C%iaV}3FlZc#zd|u>#bcQj8e;7?$JGJYeT>bo3Zz$#da+NJ_)`V1Qpk{Qh0k(o@8%zoNyq0Bu@U~E!m$6 z5;Zqs2%K`XLu!KUT}8J*cS_lvbQsutrE(@BR7M!?R%SR9BzP(QU4S8?4%NK}jzAj? zG3-o5KW$ag6`h2V+8|UHxCNG&FajdBsT7F9PO5$UW0!Y+|4PmPs+mA$4(Qfsh6)>k~T&XrH-GEk2sq=WCR)qrq zhPX$J3YhMIV4PwK!tldLnd0V@FhA2Z~%YQ6VwTLfieqPiaLU&GsQAa87ZQ2 zkPsl0kbEL~Q%4PmPoVer_=hTcF5v}oOFlk9tS7*;%FfgU3A P#A^SbXSLsv_Yy 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 RKbiK|!D9!q_Mf}`e*h$Yf{y?I From d154491aed09476f209fab4e0cf804ba4556334b Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 18 Jul 2023 06:40:43 +0200 Subject: [PATCH 053/825] Polish "Refresh start.spring.io screenshot" This polishes the screenshot by including all content. This commit also updates the text to use more recent Spring Boot versions. See gh-1249 --- USING.adoc | 14 +++++++------- using-web-ui.png | Bin 87032 -> 870872 bytes 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/USING.adoc b/USING.adoc index 5cc54c1ae3..8fb2a7ebf6 100644 --- a/USING.adoc +++ b/USING.adoc @@ -116,21 +116,21 @@ version: [source] ---- -Requires Spring Boot >=2.4.0 and <2.6.0-M1 +Requires Spring Boot >=3.0.0 and <3.2.0-M1 ---- Concretely, this defines a "version range" that states the dependency is deprecated and is -no longer available as of Spring Boot 2.6. You may want to check the release notes of the +no longer available as of Spring Boot 3.2. You may want to check the release notes of the related project to understand what your migration path can be. Alternatively, the message could be: [source] ---- -Requires Spring Boot >=2.6.0 +Requires Spring Boot >=3.2.0 ---- That version range means the dependency is not available with the selected Spring Boot -generation. If you select Spring Boot 2.6 (or later if available), you'll be +generation. If you select Spring Boot 3.2 (or later if available), you'll be able to select that dependency. @@ -237,13 +237,13 @@ understand how you can generate a project. These are obviously tailored to the c you are using. Let's assume that you want to generate a "my-project.zip" project based on Spring Boot -`2.6.4`, using the `web` and `devtools` dependencies (remember, those two ids are +`3.0.8`, using the `web` and `devtools` dependencies (remember, those two ids are displayed in the capabilities of the service): [source] ---- $ curl https://start.spring.io/starter.zip -d dependencies=web,devtools \ - -d bootVersion=2.6.4 -o my-project.zip + -d bootVersion=3.0.8 -o my-project.zip ---- If you extract `my-project.zip`, you'll notice a few differences compared to what happens @@ -259,7 +259,7 @@ The exact same project can be generated using the `http` command as well: [source] ---- $ http https://start.spring.io/starter.zip dependencies==web,devtools \ - bootVersion==2.6.4 -d + bootVersion==3.0.8 -d ---- NOTE: `HTTPie` reads the same hint as the browser, so it will store a `demo.zip` file in diff --git a/using-web-ui.png b/using-web-ui.png index 1a80c9cb439385b6d0af38262d57024f68ce2501..6bae0391c887399a8b4e1717a01e1439c75cdfc0 100644 GIT binary patch literal 870872 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

9|_z z!hOzXr2XuhiKhWOZQ(s*v>=1LxWjsBz=ad+4(oexK&lnNiOOk;ce>R-u>-a@+wF)k z-`VrM{@qi7vj;OSR@0|oPfp)xK<&?EskqWCSK9;Ihk2UfLjsM4WNJW@JkcGqFIOP3 z6(Z$u#)=Ux3ws-aO}ynl>MdzfET)4YxQzEtdfzAn80f67naK|LM3Ou4tO1^4WA)C2 z_p81%25aVs=ia#Ep@k>KQ%u@{e^tw+8;ud#CvIl(b$O1mSNDgitzgEEO!+OuWc9{x zbFT-vse=Ula15BXRmKXATqM3h<1t#G^EiyPLHz0wY6Ow`*3&sq*KmtLTI1PEtMo5^ zUiTJ_IK81ecGIq8)tHo8%(=}O+#?HRmoGmU^!SR`5AytpQq+oD`1}!5Mo=Wf-%AFq z@8vg~8RPCt8y+eBMtJD%F=NgH+dT6Hz-l;vRj+iC&EK*5 zO1dj@9sDd&fYhoJZ6fo@wxrwEEv;}Oz9kA_7K2-jTCFj7eDTb2YXLMAJ6xNdv97H( z(ie$yy(MQGbT8VE&4Jx-{9AAf3+KvsfRp^NcfEsb`gGHNfY-5%BSO#X_d+p4LKT9mHVF>#yId4UT zw&T*z95A`2Ta&>7l$45g=~E94eNQNZHfI3!xX!WQ@Zw=BpHQL;RA||CD=+y>O;T@^ z_?KR-(|Wuk_ca;ImFjl+L!Oe1Q{afFLqb!QR63x#q@^V~k3U!furodeTU2XJ+L+lJ z6msYHMZNe4Nl&o^@5AW}UDAPPPOjXyOZmVF;-;x615?no?e{w=GO?RF1!Zs!Cl&jt zr2yktb4e=?`eMoHu6m0LFP>q#|JM$&wf3I7uUzjlI6jrg^3{PX)#u>?W{gx6 zJ2m2G&4x$))MiJWXNQMfm-IxbCmK|#b$@!M<$y6#)Fq}dnXNZ0%N-5W{1Z%}ZY`@3m_&R#o@^fh3;h~UQc$P{+UYtKAn zwJT7G)&D?y>DwVxlxfnlD|IX!q$fsNPj=r4el)E444<4#yf6BcX6gK&&lQ`J6qTpG zoSODkprt#!ic$>SIA5J+l`mWI{SW$YMoBwGWTQEoF&la-&qlf9?y7m9WngYbxqWMv z$I;tI=%3}HOO-#Vk-nnR29#IIp^N-Ei~@i!k{%2lPH$8m%q}wwe2kNg*=Xhw&zOJt zbtvJ9w1mKqq21v&VVmc9v=%>6ewS|=;=(@X=vT|;TvNZ{bx%@TdEwX3ERR3`(Dsil za2WBO%sqE*DZ>n*->e`>rrh@ZL*mvrkOXYh(>q~*t3DURUOfqceP6EYPVSv3);Qe( zbRoCM=P@63%SI~&_gU7c5*R=3M_oPD!JcxJ%g$fZ%=sdT9oFupb;xE~;vtD>|LyL# znBoJN#iR6zRLs%SV}Ap7&@3B0Y%zG{p>E8ZNP;DsFh4QKnDTodbM0>@Xi&a?hoA`t;d0n|SZm~GlokYEOV|L|WY9OS1 z(2&k^$}>Hc(N!+5r*6A+pN?-V5&_Kl|xE6}| zl|y)O*UD*VvE0X30bX=mJhM`SQd35$shuSXii*$TtLd3 zmMYY(Y)O?sW6=n=2dw;kGCg^1#c>ZrOT15NyC>h)vKtE_9{o_#ZOQ#S$boUdI)Ffa zx<>OB5S=D%nZBgtsL|+=zw|HhY-&f z*Ii5v-2CPA`{Owh@O+K2V*Ng-=dakTcss2qac#9INrFcGEEg^bUmK^$78b1BTlD16#u(UcZ`8nj+>M5%cSY z#~Z&glso($n~A%bmbaiZuj;Ir!t_w}O|Q!XRqf?IF-D3#zx+>Ty^?83b0W#)0xwOT6g`knp#VNf= z_Z!7FkA8cT+C1(;>9hE-kE*JJ9XTho0^1lR&n91{9(uJ7mJRY!(ky1-c>BVDB%%76 zbnkEH^J@30u6OH)tLd#eLGK@&#P}zX8+xzITj!p0`+9te9+!d3seDe|xLp$*IG9`K zRg216(Z}ktNo#UB5Q5i(oT*`M+N+&AglC`e8Q%9Jrp%P2xALWdvQ-4~0^y_tfRO+) zz9-Iyi}~WJMsHmu+=>yyV<~-}!{S(%s<2k7y8v2RC&+s(&7gA7(G2Cs9aGM0PvzM%HEzEe&K_Y<{)F?$|m?4#o@*n0tpe|l`gZ#P90cB?mW zUqRg*?=USU6_a9T+@QkLd=Z+_GY?;jk!porqC~cwpy>K71)Jxn6w#4K5Tyqo&b}){ z?4DE*A;!3RvF(VE4vNiI3fWa(X^yn%IWm=42PkrZvWP&GWKRDK&spNQ`%TU(p6XEn zT^#Mgv>y$-gfdbe4{$5~_JF963J`RjHkfy{IX>!Ndxif?nbZFqu#aQOir z8NI6@mg2{$Z;gDnaFR&YXRv9YNx;Kr&-`up(E?RT>pD{}FE-2^s}>O#I%S+wqZqIC zjCah0)nENeRZ~EJST)|xtE*8?erYE7Z1&CfZ%y**&q3hs_GV)6VO7xmZHFi&_n_(U zILVCp@1$pW0t!*W&ZqLs#RCfV(r%?|T??JL(=MQ9+nJkH&L{PG1E+uZWvoGin7Hy# zbye;{^+$7fpun8HLX4x#AF*gnwSnJJDChKE&R3bV1hqvKgEDjXD?$1R8SzFMH&7tW z;~5^NP)gXN=t*sGQTG*JyY-IqCn5yC?%pZuc6FcopRLpXbsV-kF@AgGJ?&SLG5(Ce z3ET4xDye#q>cIn~tZKzfE~7UYr-TJom1|dsaZGC(aAxlkY6|;lM2KiKiBfT>aDjZ3-)2wye#WLfiT{k zwdvYQ-1Mo2@5^0}ND)j*U>vN$gBt>q{yI1@Se4yCK8 z=mxe=2EfF^%32OCWf{Q66Z7CzOPjE2CP z>z$H8SvyL4&6AO8Q|7*0GxZSII*Yc1{HWd48;*(Vdc^!Jj;*@Ei`V;f@+3r9L;%9? zpM9VH7L8Y1rATr)WY1<>EPR2YOK$LGs2a7 zy%8+TiwAHa7AEO)Iggn3l1(|nAFt??QraJa{}Mbymk=KUD-*x4PUd?*8-!WKE!fUK zyY4#x|HwUYasiqA(F^>K^tGR_en9q4`OUV*lDZ8>neoSXc=94#g#y;qPKv_y=N#qH zU)>+UjDv>nrP;K{Wkg;Hos^l#TP$tqJZWm@IjeUJS66_yQoRqYapx}ZuNVakVEhZj zIsNlmhnMCQzU{sedW?VMw64vNfSP<)*G#C9|8$(m_U7jW3&EU|o1uqq2lmTil^nGn zKkok!rO^y;($@(eXmWP#*I0?uAzh$3Lx=9CY0X{>6-OkZH2Te-5AdUL?aAt{7snr6 z(En__)726*B3}HP-gx-%E6iVitD}!Gl8@adQc+_G#?_k%Z{C%i0?*K*&5>Hq%U3%| zioJLfY(1&!jeXYVWY4&mOP;M=Tj4rEN!qu$i;T4_>_kBBn9#}O=9w~P_S%hN0?W2q z<+S)IfROCXI{y@E`>Iyjq~ERc0dY?}b#0R(7143)A&s`oV_mJ*`nEJ9nTlj@#L)Ht z{RjDlJz9#Jx1(LgeXbdFKS?htWSshn}10gJB{cP`Bb8)RCADjaoQO)&a9YmQ}OOa z{L~K1n)afx59y|$kxrdgNdtC%jh-|Y9SHdAQMB7mIg%}|KBkV%K?~WUU6C|JdbvqF z`N%YV3{mQn4b%sT5)stBH@@6&P|*a?XyrMev+*6jKb+=$ul{l3m$o^+Zr0`Wk*P## zYSwh=Omj7!`mWm^u-RlCD5gKl^Hz2t4&RAhJlmj>Np?_NBz4+R9vvAL>GA00!`lYg zt%EW4si_y0E0=9-$8qkrKqhG;OPRN$Io%&+dK&TVPpcLXN3TOuTdwb$*P-(WAug@1 z?Tr#!!36O>r408E!oQlHmEEass^ZgbnMu|t=!#+8PYn}D^5 zaV7YLW3krUYd#Lo3N6j4QMKZCCijB^4ZH$;ukb}=w4dYcU_NXVOx17(LLFW-?)>HP>%KPQMUAZ5vs2xJ@ggk zWQ3Ua5YJL9moBE+w=t%)l%y>yukxv7l(gq`EbhuO;<+3uK6(A(lc+*cJ?J-!#Uit8)psMetlA7_A5X7$2YrRE#%XHN+v34B_DTDp!?~d!DVF)VkDvC7 zoFE^`h-i2$_Fus0r_OU3VfqCm5p*B3MdK_jJS; zVffKO{v?=xb46_z1d61m!m`LNn$=Dg>a*vLdIxl7Cm%dB4k3uoDu!9(v0Kk-CI`%d z6Sm{uXo-4&q|W!!%SAM8i2>^*rz;;#l(twX}_1D<&$^EvuCWodcrfQMuY2{`Osm`Kl5@;FmZ$ey-fH3ro@V%y;R12@_!>OK z@zMbo2#SF9AX%Y)#+;PoTfdR<@~&E>r0hxw{go5DUk&t~JVuM{N2!Qlx4P^4s~us$ z-P`g22irceL3nT;2M@=OJs4-?Ix7F|&Jljq9Q@;bA7y0m>3m* zY&B!R*FPxnO@(M*+yjqJt>zt5e$IezTBux7mL)|C)#T? zpf9q~J(X}?Uq<(o2<{T|-M;pd+U5tq<@|FGk16#WXuXRU(@u}AKUZl#m!rzrd=xF- z9VSW9z;>n!NN(d>-?;jjO5Rn`%`+$nv`-@TBWjgSj`4hq_)lAW>d%Z&B=cFyPgKEHGB``qW8`}6re9^e1?V>}*n zd0pG{`Mj>{&X(_n-uVDGYD`>s^EY6Rw|?v@`2{5@29BUOcR{jk!+FYYPgl$>jac1r zxVLbb4Og(ev=>pbS0wbsA2<*gSn~cZukUTcx1*}CUZmZ@z@5o70FI7q_GL<23ibBl zUK?=Fwv9j7CBhd}F6S(j8@>G6o85)uI^<)?u)`h}-Flk&#W#M#h>6*I$bLRjPUW*5 zVW9tR*qL9iM@km`J1^KQ_ZJWVR0ciKsT6gFQ>u;Kyo$FeuqIez=zYWe4hqlVQq87W zxyLjMlDj1#Q4hU`fZ4^}d(K2B0N>v<;j)QpMCg3DK2uAdj)Jjx(=rZ$C;%@1bd4{$YG5q+o?1REYlKrdkg8Jc)-Ou1<|5v*j7qM+;%YCnTU=N!s*XC(IkEpGi1Q?DGjQuku{#FST>(qgt z+TYDL#WNn`cAZ-)TWTgMYzOq6-C_BhExvqy|4b?#qe6{3Ae}OP+bUAI->^2swYoF$ znPu%^=HQf6*tJ&&)?UPk0bf>nyA-{j!nxPqynk8De0jx3mNP;fkO2z(qO5Gr&hl7ym3!t!G^WCm%0(eQNfEy6!-1pG;cng<0cwKx^#;YqefRK7^ zxAUrv9Y}$oe}nXz>`|LbyDj*9dsFFL^*7P8bzn-RCquK(>qY33YSG1lTBut)<`{YT z_<_Xn#2$$gLT0qdhu-T zlHWspR&Mf$MV}$|EDuJr_Hh!+V(GHcrsv#fF{uT{_X@Iw@1 zG%vyMMv7xXTE~u^5M_K5fIFe+g@(u-RE%}{U-!kw(q;}mg1Pn6O1+hEb}mK?27Cd| zMlw%5@(k&ZMvm3L4NsZ-gxB0O&`H`)){#4CX$}bI^CO9`Htg4pBwFenik~ z24}RcC(q9u^#T*Krh^Z7YCFDgeB`?+P;o~ilmQD)n)$V#Y>?wL@k<0v`r9r5sW_%z z!H3n_y8wlj8YXgh=W5}Y4z*j5+^_gBGWKaU5A4o+KS7Ns%QJpe)Jd_CGwcuax-B0j zzC3~`rR+9`hmxJAD3kK$->KGqy~k$h;s5($} z*de;`b6vMz?@)|4;GO6OOUKU#uS`tXhBT>8P|9yN)d1aTH7E5>#p`F=je49PWod(>WcG&iAc7zU`8(<8bYj!cN~1S6Tk{ z=g!0SpWKO+g6nNbUhPu%b)KxhT3n&*Df!J?8U2{2W~ItMpWn6rP39I0n%CoU)rFZI zlvx#F7`y-Bd7O6T*DG?Q*IoylU+2Hw6i>42bt=s}OC-g8+rP`S1&Phk#Uu#3nw^9H88pGT6L`OUnaV2aoxF z%~2lkVW{f1j8|o96Z_6|uJX!ymIHOqA)svO4FRpKh%#ygdn)d!O3UJ2dZjA9nr9sFNGSf&5HN?s{@SFAmdfh+j57UoSAWSM{o7XGnN^;`ay)VMD6Z;4!!2cFFmk=IEtHHES!x<+nA zweY;#`t+A%C4X-A1}i}N&f)Xzte#F?Rn@5TWpd#9wNL@bsse}koFFfcVv zWD-nc_1=S*;&L63mrA_Sdz(sK{%tU@q6_6oVcdxKoDzP)#KGHs$0T)LjLUlWoyeusN%c-0 zA~Y6mwb-~x!eh9hTRR}jZ_Dx9KDT7OXgcrDbgBusPS&O`&u;I3jL+nz##x7X~XjIbtco>L{s9qJ|BVD+PwvcuJ6CAsaST;>0* zOC2j$`Fp9O;29Hpn;*#{(%@?KM(3O56Osc@!}zh4#ffjOUr-a}I)qFFdwL&!?pKjt zOYpG2!7Ha39DK-o{3Yw!m!=A|y=+4VdiIVDiZz{?OWbIN2|L=SqOp3X0sch<%WoAa zM~>JmWpKV={wT@_#{z@)ScTGea7U|Q)Hl@*gxxHFi3>-*{;B$meT1Hd>fHTXdY-eg z+@*n`Cxwm=@>~)kO~TT(B~=3%>J7b)9e>{+UQ9(Dhq8zgJ$4f|sU+Xf3VL#F>LNU# z=`IJ%t~U!~Oo`?r^URd8B|MQ-?dcMHpdYo_Dp%*{Kq*tLtVez_&Ez@)PW`*j{0@%% zou)ffQK$~N`1XR*or>K~Gv^(|w_CZYR=>8F_j+cYRibuA=CKj7a4F}KP8zz0R7VPc zj(gt9P7kqSSm|k@k>L|E>%a2%A1*CD=vy5*-1Hk}FsZhs0f40%+e>qw3zF(Zz9Tb! zhu9Q$If@H0pp++ruunD9+>2Io1SE9K?atG3(LAe(H|f`kZX!iir6l~R&>E@cA3`V} zF|-Qp663UZmbh__v5@PSIYAKCXuRTP6eD6*0BW6askBw5a6B*4AxreY+Cax6{jsx# z-6DNlS>B8RUyrtja(+DI2?Ki*=v)uKtty4;oXs@4=y~2HwzNj|ar?`gH~TJvjtQwy zr~>9v($nmMw(jIux5C8HlgX!*t)|aSeb8`@0Cc4~&|gMQS)$&kveZ7vqw<3y@vIAw z6`se=D=;3pe2{1zaQD_5tr&7dZt_KISp0_E1jc|&nR!?8@3^ML&3y3KyW)M)rFCB~ zZ5A`~k=x5%b*UogMaqYtX)jb4BenN_sVm$AlsCX9=1NpeJ9xey9-H7GxnZ{he|7;W zl!dF&3Sd0tKRo7!0#gY9uK`RdH2XbEe3`heGLY-l5x)kPny)!KHb5M!Spv_6ar_2t zInV{kFUHDfLN|K6y@cS{68?st;Z)r{GF9Gx{2$+EDaEPfTLB%_|l{;px|Ohzl=P z<}6^N@V6^;@4Xn{TlnTnza9Bv_hC3vAD=8ZT|UplCs!joS|KY!LktM0u$OK)fBwux z>{S=(gqec+;}J>bD;-f@=$1^k3`bxrJV^LPwdz_XKmvZ@6F~YgU-B5MYrL4OS`J&J zPnZi<4pDIT`w%P_q)o4C?fAi0TTZXx?e(9J;N`6KhLR}iD_3S7_ertP|v(-YtLo!|;zCJ8JLiMt{!k z1nn*CO+dlzZAbMuFqB}EUu7moO6j~_-}eA$2&LLl=GN|`nI4@(Zm1Ww9JVw+JUsw? zO1e$@;Wc&dg~-~k)yEg{#Ie_=$oIeV7=$g4CSBTIi`F^%qF46vr03eoEb+Q)5@R3h z*i?Rif#P1WEUj%UscxRNhLwx$O(?BNMnHSf+pIAGf*^znG>!wVZ!$Ov@W(Jwmi4RAByNpTWn-F*kGn`g=L!h*$(} z_h|_H+GS7*U+BdaUX2VV3(tn+6sUNX=%JQ{HXsBs`+?;;PqHGgDE1k&Qorq;&t9l?Ek2bQ08Ps<@ z4f(#ioD2GIy^I7LUz3rzzt zXKHwl3HH49PU4Qpy;)JXgJq!7qa>MwZi`3UQ}nu|&sP#)A^}WH&zkVl@8^sv99gBO zk^__&c{oE$MYuSD^_o39CzNIC`FER=O4l+Ouoj%|zaH)B!laJDMYb|_CV@Z0sC$7T z)`HP?eu^(gG3mF$%iq#+B}zq0y&RrZyYV&{sAK()6i8;X5B}i$|HD-4-`ULR9q{>t zF^TAEY5-kjAa;#^t_S1P9Bwy&-gafmptKzxcTD60&(afF;8Q`*eV;tp z`3#%XYkX#s+j`M^Eg;Nr=RSs!?VyFZs}Y+D^Dnr1;o81|5XKgrRnMK}FkaaLr!;|0 zdG7%jzKBn~>hb*RLyF4&PxF+T;k&$SlFH>%!5Wg|(XIYNP712|fDY=8r&AWOs*TTE zb*@z*%|JgzbfQGF;bGLy4D*x~gU>|;RQMB*KAF03M9WT#IvsFTiYpP;5Le3~4urP< zRaau9E3<4=@wX~V9e1xAdxW3P;s&is^MdO~!b7DgLQ&FLIpr(7CiBsjwT#U9;X5l2 zA{gV$GXgVgZn-Zix&7cp55DBcFSo^slYoqnczyTA+fs5i`I%@ICV~9$(Mc{z%H#c( zXfKjQr&q!g>6rrCyVNX9kZ4I^p2;V9tJ-=N8!c)E4PgA~%rdG_nZkaj`po1V@x=&6 zc^O@p*AVO6=O_jRWhr#&oEprNIiZwsZAMP~#gNzrE)(ipmTG0vi?O({7;>sKGT6q~ z6&#JOGpCwU29OF!hm*)}kc!_58h-BqL2d(|*Z6V&NYW!?x<_73I3;p=`L?QSA`=X& zkY_dirufWu@fAotaG*1w^-P}*O4C6$aN>?8_beiI;)@co;Ue#85y2GHeXg%XSZiPw z(5xLBz$3a!mGUQtQ&Q#3ZIIehO^t#aLGm~tavQgray@F(+~ zkEgr6R+S2Pfr+G<$rNybrOCOp)jl`#*!4nHQSWIBh6N#>BLpJZ;U@XV4#Gn>apP`MX==YTm5&5zHe9Bpzr87Zi>II5Xd8qzwr~|VMTn$@ z$Y0O5ZE3DBgza82amWf`=ok*f`|s!;@XT^wuE-56*l zQup$~dix2^Uo`TZ{Y;LgdQuh*QJXOncq~KO0)Atom5p z3HKPOyEyjI=0k97khVq-X-w;dQ-2@_cb_0j;>lBLi$^(3HdW)<@72}6_m2KvFrpZD zl*6uSjXmaP1(b4RIsMd%nkXCiI>73z$jNRUS77z2IU~yQAyj5h$3dz=JR(#AJMI>_ z8pM3<;w3hB2SWoEjK)^>qxPo7Dyv&E;uYmGp1(9 zhC`GyK+jXP7edPyg+j!tKyqcd@BPTNH+}Ko()kSj=!(K_mV5f8rHl-@mr|)uI_BHS z9jsYs7=KSs9Dn4my;&-{$NWocx=7p{-)JPGCh4Amwk*C=eNFJuap%s2Y^&=VL%0P zCXb&h@vq~*vJJZQ02)JMq+XUyW2C*;AP(F?dE3Om815D`@m9ZnKb$EzASKK5Q++=)4hpo!WKV$u)$N?#XOEYD!SSX_D&JbPG$@Y4KTJHz zj57-$RP|Q#RV6!eh%+1djy}?k|5lt+bnQE#PGHFbDMR?G!sz`WsSJF+UNgk z!JJz^w+ZK)*^11T|N5%Vy?UA@aXB!DNF)m15g$_j;1^RrrVJp=pZZ7bFXMuj14Gs1 zenfArv4FzaT|Wh^WkR7Ao>O=|=T`02@#u%3O2=n6xP{!Jv#|>^t%id_*Z@LC)x`)s ziB?pn_go%tAd{G_BoVXr^?G(?dFP@u7-zm~bVjx}uOfoBYmdy+gMctZT5U-Voh02$nV6q}BPV12az14J&gD&7ZTm0xCD)!`*H1990te z5H*#)SH#@PS?e#Yy!qprs(V6+vu=rK51ZYZj>sZxCsg%CS<0uY1lxzyZ>i|?X^@f` z^@`IyA*o-FefOu8l|sgpIr*B$s!$9@)7g71JZ-b!JIpnG4Y7i#;)cXvTcdu1Ngw5iJjMP#9^oODof<4T!o+zOpsWW~`?pPh07@i#-I z|Gn?ypP37YTRtw#`VY?#b_+HOo;BU?nf>{v|&32L}7E z{^S{p4}Zi89j_ZuCa7y)Zzk%RI~5;ucC%A;6xnb7iPkdSaRP&c{Yd`>Gi#uW+X4XP zb(MNk^@`k>UC>5wqD&np_UimYy`4`2{sDF5U|Pe*(fU|@V{$E}_+jNi%4>22AlL7V4Y z@kRl?Qyda{cD-cr%UO&aF)~pLhC<%a7bO?H-~I>*l=5w6|KD-ZM|EKK8+LE(o#dA$ zdz}_4%ZOclrzdi#-+3Au5!<&}I->a%zssnMJ`Yl)%V+Va4=R|h6A2ZN6j@aS(wX~Q zz;31tLw`h)zHI<7vlg1$hGBrOY8$lX$qTAV_TV*l8ynx|Ti+DOCx2V(3sCs%Y~U}$ zR+q7tmE6DZV;01}bSrP8uXdnHG9cmP$qZ|;x!2P>m&iZQ%O?;Zr)_;m^BCfO#=39y7-J@HD%NXw~>dBaHew!k6(1`EVz#E z3xm6|WbYS~%}l*sfz!8PURy#P!@96d4ra%Pa2Kbx%-o%R=BdZR?&G>jPzbgAz=~47 zXHa9v+G{bw-fsNP&O zACR3QH?rV^Ek>Oam;z1Lv~E!qH`dmsw}RAsh3GE{^4ByZou=d>DX1)>euQ;mR`sHU zqKgpZwOyhl%!ENm79rC|9|__Cbb-Ri!pEGHV~_u@ZV>s`@d`i$KdB!jM=;Z7&v_1W zu(CxXc5)^KvlO*aB^{f)~?XMSPN-}T1E8pl?lcTGU=9cH)ttTu_ z=3T>M;`>{wvM?a`sqf#=x<(n5EazSc4W_OY$Q zA5|_Q*)q+0fwm-ClB$y7IzNOG26F+%?S-3bTZFV$v^lXB&<3-pTXFM^AA)JMJ=d;j z&iZ4lGodyj&V`TT9mms!(%cA56kQBEN*|DbS8>F1Ac1D^{1IXEwyXKy^0(jC7Bk0u z_!Cy>+yLF@HQhIkLYKkfi{!_iEr!knYT7Y3pznM>^COvM!uIcnqFJqqOYTu?p7*w` zDB#VJh^kquJFg;er+CdTOB=qY)zI=z6e68!!RfMi8yPZ_dCj}W>V`buQ65yndofuf z1BuzvwltDvAJ4D)%T0N;UR;}f)@=znYdxM5Qp78n=UZgPb<}cl-jQs)$*pJ_D?}}M zJkJ%yl-ue$C6G9Td&t;vP}0c8%WdZO{(&cI1-8=V)s(r@lJ080(hwS|2K0^a#t9*X zkk)s3IT(}8QqUSEz~%v9wLcz;{xPv_F8INUo^@42-F zUGSdSpvyGiO3F4)iO5%ReK9vDW349lTG_!8A~(X;7f%_pmtb~~QBhT;?$a^q?G#BA z9MakdP%TR!;`#FgWRzW}PoLv^@}O9qvm?v6kPMD8-pmZ-?zro@g%)LVx3<0kwaF-I zdIxgu7oubrCbvMW&4E$UsY_XH3H<(Z$t;pzKs%vtseT20XEo(il{&>G(J$u3&vWAJ zYiHMm0EVVmxAThsJ-14GMRjfF9TSG(4Y<%Kr~GM`K~satN^N5-vo;rSxVTp-8HHnp zPwUXr5c-+-oGqux+1&0_aBI3?8>gdG*|6EjvMH=abCfE1r3Uf8-IDb0c&sneQK}q5 z|1fevpc%a-F$XabD7Q#=foe+KY3bfx%N*L@ zRW5ABqvV0iiGL_{lsQ8(*8gng6gi=Gd90kHgQM!c`PvbbQz`o`7$Je>FsNu7xi{?M z3Ak^}zAAFS*F5?{U$MjOh4Uji@p|Nhm4^oP+pH8lEPCbkYAu^tXhEK%8Gvyy%B-e~ zlKp4AH`8FLNbM*hY-n$hJ+!>CEXu+^Daq(xa4EUSdd>nQFEF+MbeWS?Yal)? zz9XB_r0M)wn=zkIJ2zH-zQf>kgx{pkM}Oa$xUNl=Xp#907p@7#Z6nyCb?Eo8??2Qr zK*@hXj|D5hsio=~e_1MJ;tp>1(e~6sfBNH3_f~J~hq0K28zX0RspV0fMNnvfdDfNZ z;$)4a--x)tv@G z&XX)%3n|FLUX$ii6b`dc6G_U^fA72!eUF}ef;P4uaT793M^H2qKk?6ZDgJBh>!@T) z;3-IDN{n+h${WAswMTYZZD11!=pZvHLz=avR^5(x9V)NCw3Vyc4M(?J32A?siupbk zu9?X;q9eYd$h^_kz{al%pfwy3Q4&a}mM=29AJupHqqc%`(Yy?`uqxditB?eV&s8%` z{(_-0ZU9?lorQIpI_Th?yrLl9Uz#87A~I-1`apZRpYGCeDz1l$&%(&|X0ZMe#V)gg zd+_P7YB@nj@1!1mkH7Svo{K5+@?^FF^6B3eg8a#R%6{yG+KI7pt|IV{Kv2KltLX!t zCBKyiA~e0YZeD;UeBe)tak%ZO`u`tIAjfvrE-PacqRNuVJY+K%(FpONn8`QbiQ)fa zlL-^;rZ*Wb@M-?R=^?;vIg`2BueUMUb8V7EG{e%N?Lms z0+M+I_xMhT53atSFXJ+O*&biQOTM4s58Bg9ppRPvmZc0aR)oI23}^|&=9p|BNNHcP zz`^_xdF&zNfTx^Y3qt3_Y!;08SGweS8D zjejjfOPXgYajPoJ=)(CVr;W(=yi*yFnN=On-fk=J8CFaUAdj1(8FK?lv9fyPyGHN- zIrC$Bk5`U13>!d9aItz!aHRYE(qv1Q`ZKtceLlSQj%%XSOOuNbrx_oIuYYyD+`67{ zF;P+11RAe#RM14AMpYLZf}uv|Pbvmiy<2x?B6Qq1;u55~7tfrjIR8sIWHNi&qTP(? z?*xO#>kL<&lzZD*+521MpM`|Rk^`R_eN2c5W4?wIi!#~d(1lY1CO8B3ILe!D(|Nr2 z=D=Vafyn|JM)ag^=y`Lf_0mwem1^8(G(ahO9x)rBNW#-U$!u8B2tW6;O723xH*ztu zv(&TAF1+$UDj5Dq*=o_MfGKeR_E$CAe0kaEhdWqSgJ@>Ebm>@e<7YQMf*ma6#Er%a z>Q46jRn4Z0YL4NT^0M&ERZ4ifm!&2$Uh3T=ASJ2nVJZTk2BMVW$q4$xhfN`-QH&{D z7-JcZOrZ{=%`eNY-B%$DIaJSlZFAzoKnbb??EDZq8_IDiMROg(IZoTP2xIKACe9Cx zo2;VVwqL?+P`sD(Wh#flbfe7*{?@de_%9PgGh+=$qCN|U9iKsqib8+rFT099NVU^fw96OXmQu>rtX z1Gw&zE_aVM6jhFMwh#d|c50%!wWO@0kme1>Hzppz_j-!bwls3*;)ez=NjeyJ6su;X zYz3IeIDh37d#`XMORXQhcIHZN8;3=gk(9`TkT~3!@|;DU1oYVBptUnhJupr6U#yF7 z^?M>Q=IqT%^Z|r6{uaK3x$98?hL5T!pLqm7Alu)|cg}F!w?I6);WTX0QfkN_7zx5DBE5GFYGB~k zHLOdI!+q&5b3Tegm~fwvKS1~RCbQjzC6ujvb&U^S5V4yVSG8|Ak?+GarfK*jx9Z-8NZbi=#0*}7^soh9 z^xmN1V{>CoxrpwbyiA?qng{5ozh+_`ue~d^B{SRwgwO>Je)P|g5YzJKC?3k?W2#1* zqbGu;1FF}$%#?bL>6QlqbumUFs+YfDQrXosdO~#E;lU*-Uwz1pD8@H)qv?B-BAbI@ zgm?LK;Pk7}NRb|^D-6|k&kT}W{UB>*P`NyM00okDYkKcUn_SB7BXUHMs2$_7`*RWQ zJ5a!mQD%l3%FmicG@%nhiAGLNs<)<9_MWSt8yP#-KSu)c0584xSC&S_6W1xR_V>nu zFVDoJAVe-1=}fO^jyVUxgFg80vvR#*bm$hES7Olhaxm5f$?uw8 z0o`GkCI|H!_0~o0b&A9E5lStwkaS0LwtT(K^J*efT1E!J`Y3AQ!G+f>ZH!kij?e2m zb^C0i>%}6eLo7~ncpvL(M`(!T>cUpdS}6DBD{h9$)Mf1CL@0UmU{|`J1n7t zO05RrCTKS@gn7*D&WcKSlw81^_*|#gBrv@01OOZNUjLDf{NH$WN5ICLBVc0*b7crk zHfmryw~=};>?TKrbr%G}ZBxIxBULla#dU`c26lnWs~E)|Lt8%aJKN(h|xa)-duQ`;PDAX8W-aVZOASEbMu^Wd+f{u9L*u4 z)Vo~T^gh%pZBxOFiWn_#WnkZhKuQ6-59H{bY1~R^{gYIj29y5BGsIlTO}$m$4fK!97}_`B zy0V{kl@h%M1LKTbiGjx9H;!%M?;I=r8i&n`I%X|*D?0Q1#(pb zJML>9l~k5Q4h+t!ARo;SG~A-Kp_p3bRR_VZ%VXElBY`jPgyRX~1+ncuq_goe`q&A_ zj<=oj&wwKLGFvm`S}tV~RPI4AMohdsKi*^7d3(y8rUdOwn=|EFKv}|TX5pZexu#Ggg{L60#*vl{ zBKK14bqIWYrXS! zJfD?r_9ai|@4u(L^m%AaMc|S{+mwiN(2u`r}VB=t7Q0r)d990zGmxMp}cPTQjW zE#s;o{uZrQfa{lTf2%B1KdX|uvT;g>4XDMJ!K~Y>)wSJ%FI0vNXcis~yu6mv0B?YK zXnQW;qCQ`oDQNySr`Nb4D;l;nKU8@95yucr#q|_Dla}kiPL{h3 z{Puu0AnlR{eGle&K5C{p6S6juro~q6MCPq9%h82H=7MK(Jm14efzK!2B@1Y5X4dn| zuLEFQ@w1o08Kp)>N6LYxtpBt_@;M|9@2=~+$8Ud)1NT8LH!$1tOi)R}QZG~MC4FbO z#WIY0ouc%?{8Knp{6(n(e}n~r^L^&YAa72N6*hLr%03m;hvh@K@+mfa*=xav;eOAD z3|}H8Y)rP^S9>gvEi9QZY8mTl%6n(^+DQnn<8x`0c}_3~C{kT!^7$t}+A57^olS&$ zZuYb%$iC80Y4|2SQtk1o9<@AN-Jbj8n?^|2J>gCE{`$E!dSW-~k&EdY5(zKsEzt-= z9Nqhsp*_0yi~sL?zo)(CW8DP{Q=V7WdK@29Krxy7!w80?kv< za!$Ehqz9nF-n6SWbTzLmMA>%BNK4VH-Ik`4h$YOcCkG`>k=ENsr!Q z(^%ILaHN|27CFR9zHfAIR@{!8i>rD++`4DU+WjEAc zwb7{-*9S~$j~gF^UlMSIp1Pm+PfYkvY&>eiYp;8X7!b`2wxRiOUS=L)f^WCV)9gB* zc-8AM`-@>LNr_nwiLvR+tCk+#9%fGp^L4$5EDcFLd8+)pDF8m;A+ zp$D~XAS^I?LZ+IWrT6}p)l~+*#|}65J0j*TwSGD6G4F1vzBLaW4nwUkgfOlz^+MGT zZ9>Jn6Z(3$Zm5mD@Yb@|n=qemec0Dp;j%S8S@3v8HnP>9hEsvYTSmG*qqck`&Guj@ zNy1@BO}i9yws;@!XmAn^a_ha~f^9{4?{=w)7s;=FsLU&cf_T+Ltvk9nZ3dHe2QGm~ zlX5bR;HcXx=zhv(9~?w1CvUB_io(x!Am5OJ4=ej=|M~m-9pl++pE1&{1t+n6e(Fa+ zix!LSMv{sHqKSi~)+PJM;*%_LyYxg5rZR=G;m6C*t+1_Jl{^4O?*zR#kuuoYZW1=gyr$oN8W5+}XFz8uMRNt1qe zVtYw5MB)wUmBy}=c;mp^!k6B=KiRh868hd#(n#>boj#lGw?743vGyPXw$MLv-hVXS z_b9`8Mu_|K_5e=R76^C*ty+}9g88bx7zkAHGc>Ueua94@6 zHZprOX-3h2DB-2B^-Mv+QCuQx_$0^ynP)=?NRiwwYSd4R-pr`2j`2LX-B|@*jVHR{ z3Z$YWRu>Eqlls2$Rtx1}?)r$Hk#oN7ZurC-UWQMD!$tib)zY_ElX?zWkq3v!P(G$6EM;L371hmywy}f!B33qd5s#+S+KeBJ1P!++s z3q2sEle8Hkp2+1*=LMOjeQ_p{ad|>*1?8G_Pb%m?GLbIt`%#K*(#G?V zHB{uwSI{S$`^sFOMk&>+MI)YDkW&rMq|ToyR;>@r^_;maqf{UGA%B_OPv5T6%V z9#Tys5=nbpAuv9lXz3~HN`Zp(R;rp%W)l*D)8Uxs`Ya9fYn-<8$D z0C(ISODNnpEw$Amhu&?pQ7^mrq}f)zRjAiUqt}b!)&oZ{!EhLM__&yD`1)+PsmQDn z^YN3ki1t&Sbmk@scim}Uv!5oRqP=gu1O3n!vGkP0#ngK(5o7jA(rY#1@AjL`OuOr< zWcLHN59%x}^Ek)HlB(JXFfa=I4GsJyY) zcXMgoU1zBcxK_5@V><`|M$d^YzEvt^61;^^OLi$LC=bxFluEOr3K*-pbpN zbkJz8;aysYpeS<9f3)HBY{EzPWMu_6SS6Asf1Ip=7`Rt%Cw8xK#eZ0?Opph`)S&Ac zs$HJ_bd9lcClJe{+Ve1bRbdS4=-%j<$y!Xi1og=CqbsM)^#R6x_RFFI4#RH;;>$z# z6GFgx3Z?B`Fk#8%*;-MK8aguR08u$)pa4EuyZ%Zvc+{$x zRAx?fPVVKl51)IZ-3YeYc)X9vQ}7KbB_*YObG{GGsd+$Qr%CL1ad}CF6zHPUA?nr3 zZnF`)U^T+&n{@H)+dw^92#Kja(TLh%MrBd6&B()6vm|Zu;ZGyWWmWp!%C8{tXpi3B zPigMD^KJxN5gYSr5HRz;x_-J1I^1&++2$}Asc@sjV({eH`j;vuXtJ9KtGO%B)nka2 zLQ7Ku?&t{Uy39Ps-;RKyLEmv4;J(ttR|!NT9a^M9O-E_z01F;H07?eiydy2;Duikf zst&vAw-?BWtO@1qzwH88x$18~wRMlDb{+csvCzLLwf@0M{qGdtkX}6Fa#={GNlf0r zv1nF_rETNMPIM2F#ciD8o@t0X#hwl5a5jIYFTO=b=y7#y)S`w&2G6Er1~vPr?Cm@q zW$G7*u}H%74mm&<(=v=)HVw7f5+HaW8+m#Yb276JdR?u?#kY~5UOM!^&X(A#GyPls zZ@;z2O?XO2ZNG_MH+? zYfe&Z_gFkoU2xQp5asdAN(T!`Hab!4s4c6nP@CQ2G=}BLcwnx1Z!5-z$Mqm=^(9vo z_&`ZI5-<-8FwcSh<7@w+c|rm6EV^!DWH?DvV>fH=c02% z5ZcS`)i}6v4P_Z3@+esh40*USikCwu>@I57lq<-vL+6O*+RJvJT`;0MwT492@A`QV zkLZgDJ`HvZi1W-5_iWqhe0fN*&HIw%iuU*n{&HyBD;^c&W8fQOG);+@jUjPh z-Q>Tv?k*6kzB(stQew7W5A~p4gA$`sL@=B2ZYC!m^NKnsDz3E2^_joqc9?V}a9lRC zDQ7F%|FxT}rTM-0vZ~KbDB5*GTFNp($r~9XF+QWh4c^ozI?IEWzMNhkN|K7fbD*WY z9nn@h??|_Kf6Dq$5j|jrwf|u~jRvAh5_9({8d=s_a7JTP>t$CUkbp2glB_qDT=nO2Nf$+>8waP&1pygZsf<7&ok_ z$1Y~7=qqTyo!?)&&2>DZdBCXe05|sSbRja&t-d-=+f{GWvKV+AxP2*$N0 z){Aqz3UqFKe$L+WJaSiiUDw37yYU(Iv98|b89wbV#Y6Q8zkVj|&~5h?fL5cc7c@C- zYJSB^BMtJ`{cU8t-P?#mHQtB0s}l3%BASH|;Hg(9=V<*wpY{*I?# z3Xr1}6twmo(VBRz{1)`PFrU+pj^7+q?@JV7khJm>zNo1jAMjq>nhBG6&msgPM+khS z4w|3%Cg5ex8W4-YvMQ+FkVxAiagOX=Sbi$M3ueh?hM^^L5ZLOrj+gRt1=D%)x$CP* zKLyLO4eDukkIfai*lUYm3iO{L+|1*5wGzna^iWc_S-V`YZ>|ulc^jWgo)tG~@VSkG zw6(a{t_~4`?n;$j{Q2Pjq|#NS`pWZu)Qwi3n%f;{1H|N4aV)6%b$~9PjSobp~*-lIEJ-Kws zMZ)YX8c$9hO`&GHYIpjw;IUm-f;gxtaq}XN47nLRafz4bRK|~MuOO!9{e<|R0n7_%>>@ zXHLmBr~8YOn|0=8lV)`k=DqwB?BP4_tqv)PI6Dj0fu1tD=?Q(0Yohnir1`sOR* zm8U@{2`&GOwfCGuxvJH8abmNUtH`j#7?a7@94js5wh1q+)jO6udlr0iDo zz5#LHAVomJf8YR7-o4rewbuT{g1?xO^lIY;StiM#K&m$e>Dbc{I`t7e@=MNUpf4sK zc}eA!gs3Ig*xFqYnQc>gBZB_=502C2lT5x2?*(nuDw9_RB%o(9d)eK6X_ znfIFCcuGWl^8)%b2*`!&FV>9)K7@R{n497tTfP%^3(i*X7-^D&yy+a zgbm`RToNbKSsEEWP_)i9F=_xGwwR){ZC{AkF6|oMe4UL=pf!+9s^-eX>7XbEG zO6zvG`GrL;Kd=PzpM_qm2=H`jL^?58B2chV-jU#FpHU8_>_C_E>R0PbEK74}z?;d- zI88aF7a8N~5h-t&d{vWcOW!$>=Mk3xI^ zqP?wvyRg*OWHu(Fx9#AoKvji#^AupGwNgse;ienT6|_TqWf4MjMPyE}w>AW9#(VV-B~|Y;EBz$J zA@-|R@uTV|M2dJ_y!JQyMAuj}mJa?uXfF&?qVk_*>J<2hoXH(BXEJjoGIz~H$Ppn&!+k}; z1w}+bMez4^?&Z0k-?R3+|N1?D_VQK9#ksEQoX_Wd&NaJYvXS&~TI2jI8&T|DEgK1& zR70=$s=rAa|E>+|!2}s2J+)x%IlhIU0aJ zpr~`kzh6ouqi-j}ppO$-LGf2Nu_-vFI>jT+B<+h_hac%w6JZ)Gl>WAoS!p-`=4GKd zj5e}du^Z!4fr3SMg?}6jAijlEGJzE41!{1XfLn>3y`81qU8kH5@azf*@xTc)DJ12T zXGy>I9qQ21`^X#a=ATvkq^^~Q7o}J30E?vFW=IJeS%OBIZyuaY^l-GBbfSpbum|RD zUh@|XgzKHK*`Da!dKktm)aXDm@(oNY4za z!9ZkLI#Y>UJ#OnwCL1xZSL{y3zG$mstFaeq%#pkY2d*7ncluq6@q@EI>%lA$KVH7E z6XmuIE>ri9^o2~_)kf}=%`Y_Sx1_i&UyjwGzfc0~R_nf)s8)I;;3Sh|^Frbx+i)O* z-32!YBZjO%D`p30vxdT#{6Ukp4}{Un=2e$ID{6{&0;hMXkPlqZ(zdoX!SceCvHI(J z@WuvM%$;3DFPIVf=s={RKR)%BSs|} z>@eTWCLe}1nA|0X6aIK=nE2f#cPt#i`!n~?26BINc;NIe*FCyxRLfJ^^7ZYlp2VfG zR%}VFX}FQ#RD-l>rLQXZv)0OJ^vD^v*O>uG&hUsR^aZ~`7ZkvPnVFUx-a@?SNvu6ft$aFBZLZMOc`YF0KI+dn$t}% z=0L1f($?Kb(y>NKlZ5_n!yS&Fz2VQvHN^w}1OgBQ!9?*$H3I#XO25>_RSGRnd8>F} zGvh`xI62f`6HzZ=?#U!0m*b`%(f63$@%M zVvCc*1(7ohFX#c?(aR=WfZJa&#>yG%{7t8}GE|Eb6R{)iAIi$1f|HK1`dhM{vAi~n zC$^hvKD9JFLa&!FPR>_Diho-*WBMBtX7_a>8R#vPdMg#UrcAWFBMPxr7ucr#@>vQv zP!}8k(!*nJYI_MlU9j(Ob%7dsUzklweDW^q-1rGc@lxzCx`=pnZyr%Tenw{;kuE7P zxS0fMcd%2+TsAO4Grw|8Xu6pB>lc5gc*x4t=uoLrl7iO5j?7T zK&{8=(FjvHN|wbpObRu@-aV5T8)3nd8q8{OYlvXt{v{`=MI);)F3rRmcs>jq)XK7T zz?L#u`ch;EObu0Q-WVHrClZ|+JrP@*_*-nPldC5ra3HqKjX8JYHpzEW_e#*dKM$HP z92=0E{sPEN9)Z`6f7Xe+qw4{1z?8Yxi2n4M>JFwTC`vwPflu z&CQ^k6uJY(AgCTP-bW=QBAKPcphV%!VEw9~3@hCgW0vqPc`f4*K5eAd-IvrI)H`0yG%tlu6r9&$XLo=}cA+?9Ge9HtO@K?>!%r zqlVGXwq5NKb>GcqMn**uqJ_(nHt0rF{ublT+vRFoIW97*R zIhSrHnsB z_AQqP7!Muu`iszIlnEfPng!n2(Pao+B#K|1{}%|sKNpi;d)7*(oM0!Kno$^$_;L9Y zn3@=6q_y1;wsHC}{$7R%`X+lOiDfHVv15(u6zKnq<986h%G>>^j?qi)CIa;@9&L`9 zcK?(*X~+wU06x~Rff_6}LVf0@20qcHM=zi-!+Gwcf_{in$L7&y?%odA-Hnt=)z1v& z=%+UFu#wW^SxZ+&ht;-_(c;X|sE>vp* z=kvB&R%SI1mTVjxS)-j%MXr`?=ZeV@UgG-mrw1eG z*7CEt(t|t~Ky)Z7Q=?@B;*zI=J!K3>Tf0fU0xEd3ga>X(!B4PaX@=UF{BBnk%vW(Y zHkcA|onK^|4HVQNCVnR$HlB|vH$|Ri+rE}vVd5cvficd#P6WymRu9-u3e;;wCQlRE z0O7!y8=Q!FQ7>6r`xP8T{!MD#Jd5m1HQC@d5=VO*D&Nb$)ts(y&D2ZO19H$6_9A*# zmi8~Jb)_FSYQyVK-c|aj*A45O$aiu0CX0xc_BbS3+B4YWW(!X+HDw(yUt=__>l8G% zMDt7TN0e>pE@T*PJbtODZLu~sc-EUe5XuRi)(J1v$)efj{T_)ymk@sei+uo@gxadV zXbub6YbGR&MHnsr(g4~zOLO}WyY+o+xc3>bl^9s>UnH)nZv}LL`W1LD;;mhfrP{JO(kS=HYl-HxzOgBLzh2G7VEU6fYedpvOJJAYN~Rz%Sh1Q^>L~` zNz$hYua7rKc!vZm)B(d*zt5GT)`DewQR8F8-3F;NnpeVHyruq4<}DN^2exb{OLMV* zLzzT;3i*lk&S9?-T{$|{$n_#WiQfHlcUm{AyKiuyv9`mTTl*o$$Y!rnw7^Frs88~k zJa{C-B@+htB;wyajAVh_ekgyU<=qEXA4L3i<%cIH+V!`{ub4;9E`KMQ7|UHRFpjSq zj@TDdmG$J9rmU;a_QG;^F9;$Suq1jhCh2b#fSE868Q*B$SW|!}Fc&w=3Na1eNa`@h zQzJx@J=}=mhNX6NAKcP108^DKC8Q1yB;CdU ztdH4SG1MIprV4vz4SAe1crG=50-dD#e)@&3W27kls?b81nR_?`wwY*BBx+^}mz<13 zy_s>@!M`ywtVx@fKP_UP#~=#MD+6 z#$&j;1}t5X1)7`P(WqOXdJ6XESjqe)?FU?cCG7uMmzTc(%L`PHM8bh5(k%uer2cwH zzYR%c!OXdHV0H!$D0^6X0Vh_7TPQeRI2{s$9YGjAJ!33x(rHx9#7>PCjeaD@M%#N;OzePiyQ;qN6Ad}i1wLHcO*s%ZV+h5moe*#66m zrlJ(sj-FlQJGh|-LWss%wJZVOvS`CTAI=K??Us{;0Qo?Q zOI;~&f z2SspXv|3_7gleILq`WUaa0mF142L2s+y8PQ{u6$7CRzs^V!|bpfT!BKXV-DMHr^`++5{?)@bht&?_6V#WxAh&EP^gmzlQ2iLKN2_* zn;+dz2Ym!9Ect3D1DWjLBB8qw*4gpCj~j6B_H7vhik8`qvonS(@l)j76qtB*eimW1 zi5n0U_T)r^bT~3%4ZVX+*nD0r9R*?uwUT1fk@z8ew;2i^L9YacBzGQ-Kz`oizLO-|#`sK#GElu<7w$pjo4d&&@$}Ddg zrqu$2izF~!+1?aahMr`>6k5Vs3$!NIf!A@Bgau&5G({x{yP4@9iBGHEaZpNgFgLA8e|W^CPW3>L=(Q+yjZR=;Jg|IR&Bdk zQZx6v03c%PFNYGlZvI`|la=zf@f~If-pE%*x}Q~RUR*uvHZ3)T^tJQn{ltzs!rZ^RdZy#%4x z&i9g#nb-+KeLiLU(gZ3qn0?dNi|2JHH5@6l7lg+Ic#x;(fEX#c?T(2g3K083O&~+D z!m*bvXat7RdH?E%i+Y-xa2U6&E7Mlbf`W^=(B(4o$e$!99`4X8EsMMIED>ZdV9rT$ z7JeLb^G!03c*44b;Njf4vH1K3xLjx_2;6MIq3ZF|TL3nbzqdOIxX}n+kPDshpJP_N z+XcvhON)(2Zn>pFkd0`iLUj2H?kqSI_$H))$G7qJVV6twKcpif?7ztzhwG#PnfBvT znbzvU$xBI14!1|rEm*cjutp+};I!S(XB5aT@BIcA0&@90nj&r)P@%*Bpz1AWPAL;< zh9*Ffkm-ik7`c7tKe)^_V^I^*V;&;cm>gE5}nU zw~*sa2Fk1QkT!dH3`NU%JAYzAAR}mIK-Gb%D34Lbu|zjXBTkBG9wWUaA{*t_0u&%b zfl8?eNGfq=r2-ZGT4K5V=A+MaJWs3@a{e5Hkj+xQ%4Q5m6HqA4|36bUff4^2Wm8}j zhAin?0=gL!E=O$Zz=IIq|C=R~tX6NvJRWA#8E>SO1C2pCwh9O@K-otnSwMS1SGDOt z)vfcABe&ji?q<(lhxip^7$er!mcqc9y>3?gygZ2vQ$p3jaeE>bD?l~@F%ce8^G5TO z<`FRJC2TNs#+!YOp4z>J2^;_ZsG{Xsw8#Nj z*8CeppzPC1ctVC6TzG+kGSG~0h+ofOgdoNGxNs3H!`Q84ITQwR2Elb}M>ifai85i* zfsp^#lI`oxvxFy290DWuXqZZL=l>vY^RL!w*RKNoz18A702v%<6vS_F0i1VNcfm`V-ebmsfhQ!k52{CQdHbi6=M9^Y@|_wq$;_@gS5r#gtkP=-$-RE9lq9Is?tP6=E7E&<_7;^9cV@o!tb z->y0t1p^}*UA~tyXv}fp-pD;f4raF~DOix@wv6|TY%EI)=e;hW2MRNeR276nr?#Zp z1~pfzVTXd48MfS$AHI$SC&JkJQ@{n)khm|6fZc&cE{Fm=M`~h~ar;@i%S9&1PjO1A z)kFY-pH8dH!=eZg!v-O1?7f~j#%l|O3UqD^xP>U=-s!KMss`-8e5O3+x})Op1I(tD zQ1L+j;}n3%IVy8$A$W!2z1=3Gp_*{?Et59<^Ys7^n_r;=+346lQEtpda!$UXGPD2- z>2>;&-OHlk9#{=p#%ENG_=zwu=}S&ySbcnLcf)UTD`oKW^7 zLfXF^Kb%-w7Ed!oiftiiW>CDuT~vFlOcRAJl;C}9h(0fW&_IX+P=mKbDd@m8|6z~q z?x@H$H_svC)91Q*`|s}hf;$ypgFIHUR)Ng)SBLUuZS~8EEWpa5Le?Sm_skV?0Rg(rf83uG9s1)g2C z_%b$~l~EjP%E8L&(B%6urbdoV%-UC1wNPM0qhVvJ?rz`}GLUhZc38x*FdTj|Di;|daR8e!*|A}C6o_in^36I-lM7|l8FDHzmcODiE8B#Zrfa?R7> zJ~bevu=+I3$U=wK|7*Pm^!C5Z5=^gcDJfZ_ zaN<;6iGztzyS3bpM%X2WdlYQ^dh>QeQ)=#xn_vcd>pRd}m~ zO=PEZDabtAm1{W@pBtmB-6$;7>APBwT-;)rWI&e(aMz>bOO{HZ(g{E5|F&AS(gO+7u5F(zX!sF@&f^l zlLNK*%(b1AGIs&p8DLQgNKr(%su8*vgPG6p`;IktgY2R8#F*}bmUH;GpnhI#Kbv%@ zZ}2nOe*3-ol?(_1YAnw@t)wXx$z7U5RNQG+HWr&9Hnt~~uVykC! zO7lt}GAGLDAF-C~G?QsDTL-%ts_svjj;5L`=y@o4BL)cwY)pa9pA6)g!P%N;6RiKw zwnW8W9tf{{Mh4^LGyS(`;hLF4OY8MO{d#``t>151Yy#SOp!W)HnV9gTr#s_! zqk;@D07_cncb}&umhJ_lS&Z-(pslcQ@x??=*}2&j)mk_2ot={3eB6ECWcz)?n%jo= zVdI##8XF-o8Xafsf^#OXPh1ogrvIi9h$G1xYrz(>-*zvJUg4?=EgEY!VwG9lBp&y> zPS^-0*OXZaWe-qs*i-G-akoiISFVT86yxdx?NJ|T#`0no0?i|+U*G_Ld6@0Q zP5NRVmJMD`4}fFnt$3du2hceEG61;5P0^Tf4YPRd!D$`3GVA7h;tZ;3?RCf~xlcVe%X{WF;%XXb{_a#S; zUh_{ZPC1i>#rU*^1^FUjRad6ESP_g<9aXPQW5Sai$(DVFwL+6hzw1J{qQDcFof{fa z)Y&1sla(Lb#MO7@4(zBmiR}I9E(Nl)CpA!KYHK_K>&tahG$iGwfZ|z4CT~tt!1r5y z5m8+b6he8qW?QAql&R-C`EeuA%GGMQEW(~pXkid2H-gNJ0*)cd8_VWbnQ7CHK>DLS zv0(r;9LgeX8FcyAG8JIQ^p*z%3`ENNix$}pz7U~1WDvbj>tYIx8FLJArj1Vq<%Xe?pb<^bM zcqA{ZY*}HzN+2sqpUAIs|W7U8b*bNTGoLTQI*TJqa zuVrsz^n|xDkJo9NCHFp&N`pK1QgzOl*6aN(snh${8Wfg9rFZ(P$_OpeZkYb<(Wq?z zeN(d9y>_BJs=8(V>G9DAHYLp#8TN#%-1R0LJ)e(6A2#n^64go8@%?ec(}clvFn-wJ z8pOmI&CUwc-i#4JBiNzycNRq@aT#GNU|6)Jpes6^qV9LH0A~_V@f4-{9Qw9_17e7|V zGsDK4-mT0!Ikwb>nv(QREcl}8EXXEIf0B$hTRf0pK688fTAlIX(+Ak@RW~vo?`tGx z6neW)dNI1G3pHk&8>FoOR-FAWyILk^#r@Ug!>;VXnZfZANqs9zo zL#bqUNZEM0S-^2^bij%mT82X{JF;|nPypfM0>D;lYFdA($_IAGfC(d#=**%n*=azAlgF}1WY05CIu1%=xJ90zKhze&-{ZL z@DoKj%2DP|AZF3?BtM|NAYkOffl>#+w3B~Jclpdb*A$Ss0<5w0xa=JW$OFJ0URr7x zzm6uH+FW(%n=H2an_N-b53gAtL#oX5AvCGk-W1Gn7_&0a4;Am2;O99q&GoMbK#N*v z7F||6d2vAt3$IN?GiRSfr&}X7%TL83Y);%xHoMk(JRIos&~otfopK7Tcx#s6PhAR+ z**ANc+~Pe|Ru{gTvvPQDcH=`9Ep+kjiuxQ+`GrsGj@Jw@cOXKxKZMgLj{QqbrIKSvOn_m#o;JJP>P@s5cbwjfA z7tCQm(LAV|G>CUngD^#rLP94%9AyAZc|=ItM@ZA&{g5W5fa|a7)Cd27MPfOcySPJ6DJ|&`bA$->6x7k^V5b1H zV$XW6EXOsjyzA=qgeZ4e;z5&(6yS7zH=BYXEuWmHQxxQBpMj+9wW?k)cYA|0(;Vov zOaXGd$Uh3NeP)igJqlQ-m=>3VHQNg;WPk#?rw+Ot*t2{>O$H2O0GZb7@^hgd{huqd z9&yIay3u|XZ4s~J-}ip2zY!HYPagZJ1cZu4*l4(1_C@yfJAwLjX1rDC4 zcaq5q1RIL3t8{(`_BO`}y;yq;U)jY%gt8Lzj5iuUaHN{vxxDjlFX8v~*$&S)OkJeq zrII(N)gN4rnTi5W2H6y!?n2`r`zJ5~C_);3YB6d@0k>yHNUwY$|5}5uE-jvs=+a!$@0H3PdEOa0TO2@~?rxze`!`uUoj*tF+bl zawgFDelHE&bLmf_M+9UtA`5HzV^v2$1TZdvtIK@3x9kNhuwy8zih*8?Z{zBtWfaC& zXuxb(X3mW!^A^|{qRz+~!zBSQl19+qY$*6fSz^Jw9O~hkxzuOV0611f#uwdvz`k9M`CRh4v05y z4V}*%KLw2hxZ79#-=klV5wuCTkbv8H9>;uF^5Pf7(jpwvGG@dE)9A%NJK@H;r|T^T z(@l`<6`;*u+4gIXr`=H~PPtT!tJC{Xj)LI_-?LAK9M^6a5~tEPRO^CdJ|5q{gk3^8 zEg$*nZMl4?jd)t+vu|c0+Hk;$H~$4v$)jrnzDd05LWITx!l+$D+x* zCz$$w_GMWg`%8_kqc1_7jl1`(P^b&^eZHaUR;KA*6-SXPEILgvj4PRVXY_Fgc0|X} z0J|;<|HD9f7)J>A=>pvNFj*lqsIUR(c!kD8W&J2ze9Y7AiBU{W&xdE$+`jynm zbHICO|9hwO*oC2^UsB}C6I@jfq5r*b8-UjblrHsS2s?M?_J4nnt-Iautt>}vOntkd zOTK8OCJX_mU+8N15)$VkK*?L+`$1|Bi&# zU^0S*0)*8t>}!mjkx*s^^s)(^#J=nco|9bKa+)#*15|b-EGe0M*FoHxC91asW_Q}iP+9SYm*@HSvA54D>gUKmi6tah!m*RM`DZZv9WPL0G$T|~-Slu9LF zkyI%cXD2D2HD$A9jPJ(L{Ip`$8sB(!;6eNPvS@GLnPm_=m^nS=V4y_zqr52vJ9 z8xezF&xeQ+Kv#C**xKBjod4I{oOQo1@5tKGVqg)v9qa?eW?(fiOkj$ciBFNWs450e zvS^kXu?6g4k=Q@0aykDt1?fWzcK{J}!eOd41UQt(WdnR&|0Ztq*|(uU^Tq1K z>QZkjepP|ek09!3=*x;)>0Oxt53VgLZ*Bk>++4HI*pyoc7EuL9!(zT1d`AF;IAgW> zID2FI(9-z$Eu3D4{c*ayxIJ6aw(dt@FFS)GFD1kF!4p zQK>QVF`wd)-i|Bt?#np&34z{7vOlX!<*QI`^>IR z9n}4Jm~Sx_A-1GezSu1w5_7Rwx?!>o9d#DNQ|I=(lJv5(!dLTR#ohbEh$)T#=)Zt? zV3pHM5V>a2FfTrB7yek>(^y5q>ZHeKMVS5uz=~BbVeJR9jjr@+$f6m*nintrsmmSt z#y9DXR_l=%d&l+ADtq2`xaXp>jE z@iTkb61IvF9>4)JdQwb)K+_dpf(wWFnEZTn$J#=kX&>U;Q%v zq~aaTZH37l%Etig=k{_)BJKV8(!_LJjbderF)_UN{#a!Cf@6v$Fg^=^iZ2Hy*1>!} zP?fmblV3%1Rcs#SHi_3UoSoGk0CXoJaoaa>NvGB(AN)HfR?KcD$xBGVg02Mpirvs- zcT@uq5=qKOtv1iqv=g+I{r#xVxIMk_8?L+0s?$mwfmDMAlY30*uu`i=h$7~nJ-aIv zAB^cok;p2hyQdE56-i-x|gM5gH0yH7D(RwTa+-Z zthLFZ4v{F?yNEE*sFzc)&Mf$pV*oaHxR`mqVw1M?l$%~ABr1UTBX*=hjeM=IklSrJ zrTDI~j&t^gDHk>w?%BzJR#cA&mJ&^t(rBz|K9zSURiT+XVGslJ_rPgyw#d>lwg%MH z!NuVoxCyfrh&BLBe*gsB--=55*zzu9gCD)Y0?no(YUY3POBk$YMPVp9{CwTI5hsjp<~2F@QKr$-bDt0+K$5*9ZfFvw<9~)*$lP(DB8{p`o7wR!lMHTfclJ#3)X1^Rin5i$3c%H3q5;D(S7b zPB9~pP4`l*WEE9_#VY_V1$?17Bgx?~32uZ33WYncnV6v^A({Z++;iDz%IpN)mK*Qu zSUV21Lt9uM``uq7kWm23#^u|=VZzA^MYmB{WZ`BL=<b-kpni3U$`a#ivXt8<%$`5hecvCCGE*z@96ebrBlCXqU z%evzm@CHC|5qKw@&Zcm)n1Dx^lz| zXY&D=g2IU3qLaH>l9us3Z}9^^E39*#h9u%g3~i!bE{$K5pgX=p`;j=3)&Pk;kP5V%<6!gpptEN3Rx5@&a-P5AQ?~9#eVBo>< zJPoYCS$!=`A0+hHCoLJ%s~2_|-UoZ&|6b0D-!47S92zto z8?XVxR|D#b~vGOPO z3KLKfb6;P~Q^FQwF}I%@ALLW*d{*d_wl@Jv2x)2A<5o{pHc4jW%(O4Ki`vvYZx|DnXfC$4Q@C;oL2+YxkVaKu zJXIQR!dcqWXeMU?_MNpdj~N!Sg+j6v00I6r5a1=|ki#Lr)c5OXI;h&pO;_cs3uC0W zH|9$NqKNBmWnOf+Px^MKe|1Ip*9<9a>iSk8WXm0C*H-u?k*LY2x=Y&fu=teuud7=j z;!#4ISZwt+n|qXjYFWLvbCn!Z^0->GYSHzSB>5jp=4Ww$W--YCNBbpC9>ZJ?*-;gOU2{MZL%eYdmjzxDIPWjb5?Md*AyU=FMv|2 z`?4_qLplPDR4BU&toOEPB^hR1*`9PXX7kSrh01#Y4jh4g$C|G92Q}S^BXWo=E9__& zC|;$0{S-Mf?Qml7TO=Z}!GYp3xO9oS>?}7}iBkL#3s-RE2SbkKekf+%JPBd-Tnzu# z2QIwyf$>!|x!Xju6(Gw$ur{$Reth}Jc~Ez8+)AD)=d}Z^r+KWJycYts8xRG~UW4d& zl8|SS#lL<7@zk(>cD@6c)CKg=&XhBk9kk%lhP`IMU8Xn`;U-=aE%fb%w_Og-4B(IL ziCmo+Tn(YyalSbHaToW@yTM1s7nN&uxv|xZXx)~qvEHak!TxQ;(1x&U4Q8u{rk(4r zgrzF{Gx2TW`f0pyk+napj{SZ${r3N&j3?{@ehbg@<9E5Bt3U!5SPn^=P(q1To8NmZ zQ2adFLZ4r}Ngi;Nl+f7YXX5wo23oE?vEJQNK-tY`PjwMN6@YF^w{h^(SepQy&rgr+ zcwS|gY+{2FkN3{vkaVwrLYQ#$Rl?quuQ7GiYup&jLTLJU#?OOo`F`w)ThL5{ZbcSN zkONZ>YTmz@uTE!GJ;i&UG}v-z(1nrafKc?Nnv1+>*6!GnV1K%2_nQ?~kZ!y-$Pgb^Y>!AG2*|MXNj8Qa=qWkbW931a!x{hgYx7 zq)NI3{#1bbAmxy{5I~DU;w9DpsFW1g0KZ6+lF_+JnEz4bJXg`XEn2iTK7sks@45Wk z#@`c@9Rp#=%`aZG2Y6B@qR(R z`gpE8sPik9K3bq0O~LBXv0OqX!sf%b8VIPONXT!;t^E2C$!19o^T4T;&iNqm#!Yr` z%;@1$%-Abh5Q{9>;$=+SXqDk^`flugyr6nPt5FA!)j~TE2FSqBxv{VK)m`}Oe*1|` zC%&8=22g_SdJ$cN#JaXFL)M4@z==$g|51XOWzyqJ<-L--ud;1L>}j!5XoX&p9)eB{ z6P}X!hcHWA`{#=+Nwa^awD5tj<@mhYYHDTs7K-gG;c1m((Ks11fuks>%;6siik)x( z^uz-m@iG!wV(ruA{y#(5cRheFj(c%NA}j*Vi2X|3$G~!-S`KhJhp8{ToIKY}x1mpz zL-^>V{QV{#^$`v@Kz3SmF3|q%DW1~>b4{(ayn+qnWKbyG)PKjZ1(19S6UY&1;e|q# zX!-|IBrvnWyW`ioP?<;8?b{xArWi+}TJBx}AU0WA>cN->3+8W+1ZeYiRHu|cJdBie zl*cM}Xr$C5VR!US2;-hi3w6Q;RyZ3}E247XcDB&HG9_R?4y*>-U`Z=88Y;>4$g)E9>4#{Gasv=z#GrCC4IWHUDhME z-lt!UK_4_su}zeItf%bSn<-&_$GY0#5%J-U*#)pW37c2T6VrDFCB4TDacmPuV zYl!|QOZ&Ir{l`y+*8Lg9nI~6VWp1Q$%El+B_NC_!M=o!+? zr1U2gX#4FG1=)1(2=VKR&Ni>eojmUzS2nrE3uYh0<~o9?Zda$Ya&N(6dX|gMt4q6M zVMug8Ej@S8Erih*-QM6FnVW5ci`RZRWnpf5FY3Ux%j?!{FgAX0&S(9}ugR;-7Z_5u=cma*JSrc4B*V?o$(S=&; zusYgG<37)@nVe>_#SY*xL;Y{AN2Z5RG+4R6_npH8eC-VPlKtrz<{zJ@V_-SQ8eQr~g>4wT=H@|A8NWdJC5& zt$cII1X#{KQu&>9@8g1%C29Xed)}ZYf&27}VV$V*FRweEDbcR6e`sz&4T95}ts=|D zXRTUIO41^RFX>C-5D179i0IO|w;-|*eS*VoIxg#EC6_uDyzL#dkmy|R@JRG7CkKx= zUFsTJ8>w9?vrA8Q|=({_1V?uz^v&!p9fziIKR$;;i31s(N|E_ zB@+xV7VMJ}p^Y>Cb1YaWQQ^1;GNL}-Bk8UeaKF0_k(6ED(-5FuE#;RVvWnaltiV!h ztQez=GY>YNaw>9!WL6_Xnp*CfYV2G06%`l&HLFuF=(O&fZDI~}iODbc4XL$lhfcoq zWotKpe8whgMtg%#3)z(8+eER)LBuc7x(uzMVWTzodTulMiA&4HXixd^zip8-5R3!zy@u zeVdLuE!kAz(xPHGb7K=)RZOkMKV~Y^mQ^Jus%uN5)GB5B^`mB2w15LMMR^4E;9cUD zhX6sArjP{-3recq;`#EyK4r(A!GT)7UFaP(&O`q|_|XRo58J-dUAtJ!cW+T&wH@iY z%o-z^C%1<5-QEv}$PIt~-v*sb=g%{-eXr_-!d%&3#b#<#s7HX;r?W1F6>ib9JC{k| zUQgKWu6hNxpQa2)zaGNBMyJ|7PTt;TZ#ONQ-1s}l_m3C$g%8N8pl>bOTU0VHvlkSI zl?5|LD=*2Cl3kq^u|LLSboDD+ggISg#JSMF`tEgugKoevp4aJz36^>hky}L!I>wAF4?gIm^8V2nuD$Po^nm7jX-F7lw8ZM-oy}3Xhs?=2s$qxvax>CA zf~t#S?Ot2Iisw7lb}jT|a{KCCy-cxr@7XXU$H9>P#eZ}5{UZYRZ4p^*V5QHlM57j? z`^)PVikb`-Q&3AOGpzwc=?LNLW1fnh&MN9kGu7?%>~d#)ouZ|FrKM>p=-8N8RR6ti z*sJ4PxN+y)&9j2ee|@I0lL5-p+Cwyd#!R2^V>thiv_zJ#q|0z_HZG&E9v2e z-Y=sK)JN}nly;lr`~I1hv83W< zLhKnMPnY7qv6G!4n7KQQ9!NIDi&HD&+UtivZuL_M50T7gp6)z5pa%*++mRpf&?jkA z)QPnl3AavpR3g|VXnpuDarTiQ=k%>>$#X5OGXL(c$+5G24|sFnftJjY`rz=>aF*_R z3iT)9;jendWQ45idED}J`QQM}{;}JUhZrh|`x`Iv+6)d=4kSu8_vjID9904Ey5-JK zZu~F5r7ZJJ$*|!iZIVR0+7=RdFKVI@gzD=L?sQL({!$2^`(V)DA39ije<;~%W*oV? z#5Lxmx*j26NS^7#-LE~47YMNLzkX!=*vpm`Qw%CTV!7fNmOXcoM$_~^9+vY}=EAP_ z1NNN5rVqh$w7<$npHSnO!eJ*c2WOD~JT8Xl~tr zTiXnRTYvf3U-RBK-E8&a`t${J!Y|?UJ&72^@@Qj!t^@Lq$k}X=-m&*axczL?ozy0~ z&idb~C*I?_AO89mGToR^hF{KnROmK&S)A-@q}n!IT7vmNBfF<1^g%26PoqiAck<1i zdiD}*y3(Yw@9>`@n>f{Fqssq>x;GDp`v2R8+bOb^r7R(7!6e@>j1iJbs8q-nlcwxU zGj{V$)@+rKFp>({2^m}2v&bY0)ybzRSWU&qyPJkN1F$NlFV z{4t+-f8MXJ)LYqS3+w(-E@H=h z^*#aFnlI+Muxc9EH8DI(t(x_v>}N>7uP!`q_fe<3_@vxh6hajnGjE;{s{Ol?9* zymw1Q>h*gzd6Bt0rwn*QQUp6p5T~rkYq2on)pCoYaso^pC&6#K{T{=jvy$Oc1HVk{ z8cJdh$`QbGGo9b!h2UGGUf&{UcJp8=-UD!>+ZuY3F@n`QpRrrVV9OQw=9|YNE(`tc zW;6}UPlR~f$=gB7#{g@tgvTe~RuAdFwh{wwV=-0|{64O*XtQjLsG^ zT`#_*`C_}7BWe50VzI0C#wcl=Ez$N8w*aQm|1FOTN@$yR)7i4>&N>)$w|%auwv;Y~ zkHsQHFg6&+&hmj-JDDbzPlbDjO+$<`VA5uCkeFM{|CA5@`;wWe_d8RpO(pp1u@HK` zb8;5~BKB~~_1NX4w6V=u!}?&opaoY43U^6xtAw58u%2XiA5P=&pqF?^!($=KTYQ|E z)_0q_iNy!G*4Ch;y&zEmB^^H6Nx0vebYZPbOkCR~H_ivxN^FwSvoWpe%;s;xMpTnp z&LCh&(l{uwIfpyla7(AOwYO6XwdW`}3fu=%O97_~yPQJSmij#SZb(fqg9Hy2!bnbU zRK-#;{%VHDO0FkNJkKgB9Nn8!f5?AeXIQ5<%HNx+yb{6L+x$lHeS#XM9PsLM%ZMax zQ-y&JON13?LK z=BD`6v0WjXF)aJPsF!VwZ;sp;?!0rSZ1%JP`365(3bFcfvo?0EwurdoN=$o+jPy-? zwu}Y4IxS-d0+O`_*?OB}TOq7T-v+x#<<$nd!WN44B$FN2Vm;H88B#p2$X@b&*x{CP z=u89>k5Gm`97gS<9L$`+qE!!06;A2wl{=zbt>7SGyygOS2*z9u@L2avx+4!WDSQJN zF(5E#ov5f>A>BdE7s-5)*bL-iMH5UiZnl6YkW>qg4610+dZ3oC(D>_CB!QZ76&a*Jp~ym-r@N2PrZRB$hU?i|hRz9lo>*@e z2-@jsA*mG=z0cndzVWr4f-;iOeRZrt*}FQJuwv&Qf08DM|u zZ|VFhT1FKC%jS0_hLMYdr?%#~WHf5*?DUWIhG5oH600_1E79+m3WwSw;z~lYpGVcJ z+HYw~#krDNGS-l+{IL&M=;GmBr!v^dFp9zj^=elG}P+K04)N?O5Sf`j^KmR)5&y znH|~Hma)W-S@g#TV(~$<>PiQP6jE6@okc2?^UGZJO7SVvjxqHyhsjKpZBRlniLyUZ zbeB4$J1axNKmB>?j9&-O`O&*Rx4`AOrUm48Oamz==?!|8J!Jx*bMvY(eX9gYd28r| z_4$ob=`~z;_!pJDE4F}J#jmobefzSjw7&w%2y~lx7&(~$rqruUkG|P) zm;BCLE=&MH%wT0Kb#ZJiV_{n1OF^ejt5{WX<5y^=!Bv{;oSId!(*Hi{|Chg{@7ZIv zYeG^A7|@~1YgnU!=DXe-YfKsIZS=rmuB->nlJ-XFouPPkgqH7Tm7maV8k>%7p9!O! z8nf_F@>izz_1O189gd>J;9*i<-cnopG=h-mKyidaq&nh-pH-^fy{TdP@rwlPax-saFmQYNl`FsxjBD=^UbcI2$lAaXtOl%!i#_DHmUrgi!b#Y7flu@Pq-(|NZ>yW9|jAUOtxvW6#_+Z|BxJ$nu_1RMGFSkzG zr@FnGFrqGeN`s_$syJ}p`B7%*59R7q@Oq;5FMPy-lO zZ)_)WLA^~cR#I`$2Zyl@LY3K(5u0xIc9$1Ou^AiUbm2FzvFcfM#ev&~X1D9?6zQy1 ziySkO#k`&!;f(XQri-qdJ3yk>@$UO-ZZ|1R zZGK3OEz$XHi)o)%`A+r0=OU=9j||h>Y^A$gQ=@tCyHW(#kh@KyuObw7*Oy-RvT-b# zDCt95A$@t2cJ8`lRG9QyXI4Q(^%8On@J zz!UTS{Xi!LUn|!+kX-OT>tj=zMhBJ>5lCyzuqE5;QC;x>wzKe@_Uw>OxYi(aVL1wN zDvX>Lb_+AuI~L@0uALzscg3FQ+Y7bev0(`mDL_2WDIK?KQ0}U&k%ySKI9=Ub@{gaX z4D$C^_WV>hBYD|LhQK_7dzl7S5X!MX z7>ks4wBNSqO!hllW7UW9IYeFUO(+Id)jIf4aUrHXauB@{gVQHVUmW`p3!G2)b%ukk zdxA$y5Ua3ZWINz74$23*#%Gxnp!6tC_4&iF_f`zdO%|7rTrBG3vx!a&y=6H3{?9E|-mijcAtWHm2d z<>G`hOFji84@xv`$Mx0LJ^$vqTwTNtMP#Ud6dcoo9oHf@KNxi%rQBwzqrX&b)?7XF zqVxlyqyb)!iyc7?yK_?BC=MIcrpsG2tVlJ|wXow2RKA8LxY1tsY4;WCM<@URfPy_# z-Y+MQ-N1z7mwu}9h&ip<8U3Kt=}jB|+05muy#mk-+v|;XqN-O|*XoxxuL0GxVwFYF zCxrK{HILG7oLlWi)4AF_8k6(3$e`w)$m)U{ec@KX z(5jmz{o2I)!Q?X0zu8MeJi`w+#|tKm$0n$&_vFMUp<@o_(FK%6fpxnE9g10fC1wZT z?RZ3&w;#1DnfIgg*LV-)?teH(I5i(C5gRX?N1waVX2Vw_sILc|8Vr`0Z>A_E8-d7; zZDkE)r}+iy^bbKJ7 z?s@2R_e1!OYLiCw`&a6(oq6QrMq|@zink`IuRXg62Ah9*+BB9UBiQL*1YC(^yKeIY ztOlMZ^bFqV*)@NZ1!ma$IABbo{chfsNv>>e0`-;P`R(*g?$q@B!7 zxSy1#7XYh1PF?T>btz>@&^{h_e5{q;{$ro)Az3N2u%LC!fYr){n1GXJ(39Y$3&NDa z%-7fkMs$T|U79(Dvuv~bDBQom$ZpBDhmlRJOHYD?9YNYrY%Cq@%#YTfRy4#8xStW2 z*<05>Kx>kqJc6k8t?FyRNX9~OibQUoOy|zC_99L%v}eEiELk+3TP7SA%dp)9q!2ad zDOPaxkMCJ^6f1YCQ06iq#+y-I`-KVACw<@bpPH1-rLNPC{+TjY0`Nzw|iSa(@`Zrk~g5|9w5 zhs2!PGw2*PeX5x>(bZ>*+R|p8)->q(lL@a5X~jzWW<;`%cI=s=QFE1sBktxaE*Vzr8en;Gy0Fiy00F0T;+y6? zN^dJ|WR95+|4Ach3AR*IK_0Dx4Hz2-y4efx#bbFq`(H=Kyj6dj@&ce2SnWI(5uO?8 zf7=@R_8n9Hxm1*TB!UF^tW&gB9Bh(7B4FjPyHVx6nSNw(H&ik*W+;YrugzG{ydgVMmOU$6!0a**BT_dS4_k$uA4iRQ-Jw^L83+qgBBV5670T6LiPyUS1?JWbAz;t5Fh~5OcYO1jazv5`>{Uc7CEdiK>h$ z44ZLgxwW|Qd%~@%%!ARWbyZ?{rO+{7eZSGL3;TD9hc0TT8l;mBJNlW~T9SM%>BaNa z(Z$ZVQ+W5x{rJK~Fy3)~@kVDLIH=wtke`ka*!4#}>44t$@T&nHAmwq3i&?Kf*M@Me zvl6p4TYKZBQ0c4e$T}FM#`%Kpkxuu@qgRb!sFWqoog;7`ZJZPXrBBb z8=Y|~^I6&iMWWWm^MsPl+ezXv-4G72CAkJ-9T12zbMY4pnhx~z<+SvZ%RLqU$}n`f zSMXg?2&bxgzIG4Psrvm6g1G7|G?QeDD2bbKvW!v`ltWoHl>z27xAWxr+_J_)L}3}S`B&n2CAd{wSg506;JT>kNvwwAbTPs<;CBT-VFbgFtTZ> zt3MRx>#k_xscji&(;3?;+rM~=Z>Nt(BVA)phuEaDL}f@)^#^-bl}u?M+!2tG8%49S z%t7YJ)k*i300-buw3ZgdV$2HY-WnKb9p4MosRBYSOh8_V`}s%n zXTu4`b%8L`AFF%^)NF->cfd-r%7uI<<62ZNRLIutJFrWA+pZQ1kVC-hA(1JazoL8hw}7W9`8$`U(>gr=}7mf`;Glc0<~#D zj4vN(-q9~gYJcf=lc9*``ZiwHtXN-g8+H_@N90%GwDQ(k@Z!^OSd&Kj$BSckUapmd z@J;wzqz5UD*uam6Xyu%r9ktkT$O$mHF$1dSocMfPK}^ z<69KGZ2w?tZ8Gbn)_aEU+%avvr+*f^ijD&pr2Zv_*+Z(>)TMJi3L0h?sTupF zd6^0Oy%C9;K+1br3FDMEeIU!F(@(@I#1~dyu=C7zgisP=1WWa_LxPaOZp|IWGX-Ok zT|IF0WcpFr7^}c{7M9$?Wm>ZWh60^a4kG~@p{oR6Z!|Sp(C7UC%MXF5OupT@x&w9h zZUojWpI_=L7enb4FFaMd<0Yr8Fe{a=8e*0%gWF++>nzH6)A!9>mVCdhs3Es5L1M)< z&@K(ze6L)uhS9T-U?xqA&J01Ksmwgr3x3?v6$fbuB>dKOA9?+ID!*^c!vj4C}u{8!+A9&;0(UcV}$- zJsZQbd`99MGBW{=4eck}yc2+~U95f1O+1wM(wqr(GBhqJj|erLRM)P(9^FV?y8P>@ zbWdA#C1AgcMEeN2^}+311{YvxRM?wUV#2|UQD$3$)vzsfdbmkq@rj+R_drI?zpttO zZqVc&t}hY#O)BEsiw%*1dA>Z+HYwY?KIIy|6n-*bzDwHsf&>ZfL)arHt-4gJtC?Ae z2@-)`+G~&8eNrPOjE<_UJ--VV69cbBiyJPiQ9Xmyki=KWk3tw(7sbQR5AENjvi(d_ zAMW_ftsIEdO$%YHc_mHxZ}g?08`vx5nTwIbvzYS}sZNISzf?WOR?geAai&2Ya-VQl zVrOJjboJJ7JOVFjYTtU*#BrS~?>=Pd&_ztfHc>05)$37a9 zKmmVL5`=yY*&bGfK#86H`FvsIzz%-=E5=Q0pYw{;vZkqKoPdLc>_tcL+coPIXbkq) zVNpwVyIfIamcr1$!Uqz!qPXZohF=(XBK2p37$CyI0URbX)xZV#3HqvIKEsE)2&}%# z;-~O)y5WD1+^PLr5I>RI>C7l6YJa^tttcRL3{p<4(Au{8-B{KasZ56JS2n<94>0x& z+-<&my){C}Qz`@&0bbQiv6G9ppDwi!tSicIc+EaSMWSit!K+>FdFOdvl!Z$T4Z$tL zCd8EQdNZu!763}xfQgg3!^1nWt$q=kLBsA<3}Z~vPXj*>PT3MPc%phHSgh%e!I$Nx zx|uq+;C)R)V4f%cGe`~84Ypw5iGpSzlwzZ#5H^M3WbI`*;k5C=8Mg$UaBHOB zm%}W7JM63(DY3Z%7!RAdPYy1_6jCyr^;}i+^-aTU5p#mYhrZz_yUg^M0rog1X#SlZ z@Ou*1w|$3uC|G8WD#}&J6+~`nsJQND<9(Upr@sK~6^ayBXzLWl&j>xH?`hY1A`D@# zMvMF8?OuLuHC2}npI7M9R~k);d2=~fd@8DCaS*T__OAqNhmE&whktOe=e=j&3DRSv zQg77%;{}k%a=Jldv5aid<4rS$WonfoS>Q_A zFu~Qx)y9YY(ILdcziswJ9t}XJRHA(?!^rMqS;@ZHA(vE^hjD)~?H%HMAGry*Z6l0M z9wvo%n8DeoMl-4 z;^Z|zAEZ-y;9vTn1wbF9T|Rkq7B*&e@=Kvr)04U#$R0cXjwPX(y@k1a-xiI|JE>!| zH}an1>=S`S<0qS68@t)zA)6hqX-~7o_)7H{1r}|>Fc2H@VEyoKaS$+4z~MLx#sX^T zfsF{cQi$#9zjw4LO@juuwwT}n3sHH&Kr?3E2_3@?&Nv8CvK)@9U%JRD1&s!tM2k27 zFg*Clkk9e+0omK%#W zlaa&u|FZ~vt+W)F6$WJhzRa{@l}fB0imfBaC_Y7LHE>$LI0!K3?re8K0&qTWZ-1r{ z9w@elIU6<1MIyjE!+W=ZbQ!6%a`PanyqD4NUbWThPrqe_|D}D|I>2pxav2+9IJx}u zfv7Zvw+jf0laCryQkhrfA)Yb)15+OBNcox-K0PBF2)S`4a zsi{_CsDOZE{M~DHa|-d$uB#kJ4>g8H0AO3hZ56Y?XMBj@lti0KM+TPx!+GIrJEzV; z54o-0yEo}_Vb6iTflUC-d_I?CcU=}ht#kp*j~%_Lm#KZrPo5_n3{|gI#wiDnhTrWn z;D_RYK zy!1(I*Tf1n1_N&YDxNPbSa?E5y+^8fTCI_OL-;S(TjT&*Uzk=9Tg4Zt>40`6Ib}Jh zHq!g*0hF=K?*Z&82UFCPyr~^hFnXdgnS~M$ZhPPk3{QdDWZ_BkkKVDZNx}e{q{ZKwBr}Zd*ieosw}31X^3Z+**aRP7=A^XW zsPb@xeytSN5PV#1V|o9%(&l?GOP-5}m?6IPs2x*0$6e$IRr@qH2%PzH#^+LnfnPT= z^YYfV7r}2%-^sNF^aBl|_NU=%n3w1{=Sab;{H46wjsET7GX)tEE+Xa*F5Z`@3HB`GNI<|;!-*Lp z_P}MUb1~6|#&hJ@(SthNBYe14?39wFz1t0TdH{-E;OyY*qapUp2EVH`K?(O zcx;2_Y(MXNYU>lFza+<$Agm}$P=!LjSBa_3THv`%MI4xF%nv5~@F<*|=L}H-e~tyT zmMb95k+RUb5@8zvB-kskX3ZN$KFSw8^NssTR{!3m?a+1b0bjHiGMpm^NeF)8e>v7J zvgP#F^UHO7H|IWaVbCaiyVNwflr3f1NPqrTx)H$^$JlUF)tIWWb!ZDWm0*AbKND3c zbjjvQ8bTz35^WRpp)GD{*0e~CsIf}ZozTY;m%?jJy zA&_9uXtvIueVENYH_aL;@#Tzf1Dv`-w#DGzQp0G}Aww zkuPo`+a~Eq=58yVYJds)g9MSX_ADi*hKZ1I(zsIitPrT}!w=zzB4mI+bJs3Y2-N4e zB+M{3I!8|6%6SCCH_&x{Xh+H4bQ^62Y!vQ15uZ z%wcdj@+-I<-=q^ap`8wYt-k8%Bjco7pq8`*iIpX|f)_i*G5+RIZcCu0y+1JN?PRFN z*?s<39i3Vh{@2hDFkgCF^=_|)yxeiaX6H=#=ULX<1hbC6=4odpst?0<4DB6E#Tqko zt`=YZ!%M>5?q|5r;ZFbZ6;@Y`$riaIpj3H1cjY2DyJ>Kh(l+ozSS!7?54Db&{kq$z zBs($k`IMwA97XZD)b>CHIs21b+vj5+gcR`SRa?2UfS1&RH)98KBVR|F*|8CoIh=}q zI`Cs(3HDjivAmHJ(`1UTef{k$|1Mtpo5!SHN{EGoW$o?m9PhO!_BuEmItrg3ZsH0> zewW?YhEoM42SYa6)yJe|IfwAm+QVn@)~VlXgebOa3+A#ePE84Q|7P(Gq}e#2PC=Id z=zx=g{@ZQlFww9=9XNn*pn;yjgTPpX>XbD19J3!RT+W0ReLQ z(U@eGzZUsc=<1Sy3i(X*5`>)6(}E(Y%hPhX)_p6Br-8(xojR_gR8+4CW7~!;B>Vpw z+fa?|J}{B$Z~47m1e36PP;$fugP@?5OXk6?;(v&l{j2XM6>aDA|Chog$5yOEaI5Ek z=$7vOOSd$FMeiqFJ6TzH{i)*!B|w0(*CkW@YsCL2vL#+QL6LuFaw3ktQMupfoD~1; z{+EI+4W@J0NcG~XO(y#SYbBp&%cGR<+?<9)L1*|{5HrpEaRPL`9s9%M@^SkJPrHX6 zkh{Ei!6R8m9|frNis{utJi$$iLQO-Sx>%S`WL2_D(g-DmRZZ*i*n zV7J)Ixw5OqM(1n^Xi@fQd0LGpXND&2iA5xqnIK$%oZ(jU*RR*$yA5l$4TAYzMa7y* zCn)V-Rtw?NwW>e}GT+&2a2G?lp=S|s6iRIQs($95HWJ+aN@Wj;07VEzw8>oAMquLm zi5hL2Dtg)C2!vg~fgX%#GR0QVGK<01;_X zRbAIo%)v3N_>@vbZj5@6>E(Lr%Q)Q{aZ6C&g@KvaG6m|&g$2WO$W27F5roKzt4h{c zCS1yaLaRTee^41tMtpbPmfjtP9Y0y6_rp@%U-`WM3bgPl-V3gb;v z{j-AVn3|wpdHBbf!ILn~90I+L5`cW{dnngReBXQ9iWp38{NP-#wz7itMJwlE8jQwr zfUyEps)0EW$*qzc|RdY;79c}7|q32g2oYX%Mw0*oxwe2GPNxn8Wy(w%R0-Ti5 z>N7uRvl=W9p;s&>pqEE0h@)av1gOBxhQJ{dfUq31iGHn8F?-CSQs}V_`?JtZ8`pk( z&i3h0u!h0$>*QRubXV%g%E;XYpH0^WrYp&Fi|LtAVLbp{%@Ra5umT&Zv_KZK>G`yt zo5VHKQ8h#k6{w7Fbf0skHShZ~piBz1U4_}>VX_}57RlkR`zO}jtczdmO*pjj;l3m4 zONP&1F#+GLU#j~fp%@-?J{MUzS9m6 z(GoYU=jRpb#atBD;v9WLHVOB0ir;yl7ZQCVU#Dwb_PVeyA2|<05Zj9UByp`f_gt7P ze{fI$3S%7Q`+F`*ZB>2DFQ}pq?j$F#fRw2K56d<%eh51WQE`)XjM8De-8C&DhobG& z7~*aX?*L6a{TEyFNIE4d6V?yV*ZifIQ7ISis|63I>R?&*3x+TuTGu|uRjOv@oJ=rK zvXa9_LOSh8-9*{Bw7;0pP9N8wzqCgp&ub{Qo5{5j=!0ldhDJu`29!UInZ7FNr2YKvn%iQJfnP4f&x+QJRl4L_?T?qTKgLZ7a{Js79s;X z)gN+5*2FX1KY}p-OX?Bl#rvjk@ktCH>!rWs_&NutA$@W?VTret2PN#4Vx*A1P7{8U z>Y37`xkxHZ*U8$)t|!j1cxpOZjQ-BIF!79U1+KhdvmcvN-s_rcF+8~R9od4Dl%(OJ zNN+|9%?GA=!e>PyN-@X0FTsg9w5Ml^S^!k{Wk8Rv=E$^4Mdz>%6kJ3f}wlvcGhZ;Wc7QF?LS-rE=JCTSrQMrm91UN0Rd*(AW3w z$KQi8)@hTe1boOKy%0A01DJRMCG?P}cg{G;ARyx@RhwsGyT_#DmYZp0RPE&p%zWHP ze^ul0EXT^dtZK8qSfSnXr{*8m2I1Sa0RxiI=?>He=)A6#Th>At;b^RvmbKSkiu&18 zk-gCe^`x#(b;<3cDK&bSBB{+jA3xsz^^S@1b)tsHS-JOJG#*%1-)QXH4sbsvpm+|*xgw#f-&`y!4voJZ^HY0v_MvZru@ep_IzzW zYHwT8{&c`KJw@f?-dw^7o{4L^IA#3#lD><6jz6MP{A~MLnvSJ_REVI^;HYwFg=>wv zzoru~>@+`1wr9eX1ZxC8)6Ag;valb;s+5nwvLRi+`CGaMrNA&cc^ev&{F}o2w&|1M zJIW9AA$WVrWxk!vle3&ceDK@A^?vahJG4=NWTi?N9Pw@UL_WS92zKc`a$=b(?1QNGm$EzvbfXR;xbk!Z(BE=qnLINI3jRHh*)MgLmLurQdF*+rc6RA(C`2&M*%r1rRI4dio zT>;T4UvKFr<}VD)Lmr2bxaoxx1vn!qgiVvW_Z)Ba0smH~Vv1T76j80@bdYkBM-IoG zV*q<9@bClRxrs94(60r*&p2J>c)R0Fw){~6w!tS(ehT*;`;N8B3T>rg#+SP0+L^+p z;Kob7tGj*kwC<9K4iadjmxWkRDZHHkk>o^q@dgPx&vNTWIGiVcs?Dnhio)Nw(&BsZ z^V^Zl<6=I`w!m~iyWXZN{6d$EC`~PC&Miair)p{2izNuaZyWW+)$OfG9%BKz#-P)A zhySRXo<_8kCmW4)5ZY^!ypOxH7v7S_|#UG3qfcO%HrvI0ugv*H!_7v%4$ zU+x~4g()P+5T1*E0^}Gn8XJi)^c0}aVV9>xHdPM_uXH)*V4&n#H~Slb6K+9v*_Gru`>wyO{VOGOvr{tDn;I2@a#3jh7Gg~O=3$EZKdHuU zG~8k;$*2))gkrky(pq1@(DlddhJ*cIKjAimBftFEdQ)}`qG$CFaZxi8A-(^xm4ED# zc5EsIGUJM4LORwrv2;rD`UK5#s}4=&HLf=gju__G+Qh0?5QH)QCxT|GW+**rxXO6y zH4;**qR&cm3>q>qsI&NHm7g25KcGLQE@6dL^ZUX)Zd6~i;H#|ng|TmlU~)u0Q~c$I zsmZpk8Wo~B+(C;x~TZu!^t~O~@H#*(f~19F&nbNg5!O2D>Fzzjhu6%|1FV8o-tRhK6nfzd@K{yy$VVe5 zj;p&$!N>{6aMOrbSZ~T zyU1X^@0CekwcBd*M{o01Q!e+YytfMg<}#;#stiqYoQp|+@&|>9lQYetNEISgR zLxIWvuA$QZ7@BrU{1*3Qx*2lqozI<8(Zy7W=q?}q(k%MzhklsmyZO0%9)-G5w*je4 zUt};?)La^zhb%xjSvA{a=f+fjh8b!l#`GRu06Eaub>7p0N&oOe7shRkt)%Z{Qes-+ zd^d>2+@g(7l#;EbpjXE)2N3=07P_QKfn&_9iOVT7wI-AF(>J~2+6G!EWOYqPRKIPL zHK7~Kx4m-TQg{juq|QrLc4^J{ zCroIy5DfmdHO5vrm=tcK5zQk28X*$Vk~M1cpl~X316vHi>uy!j1<0%}-DA_|7EeEt zTX-qkNdIuM@}BRlhU^qG@jpE~s2l*DLUp^R5Geq3%1U{J`43%GFGxdhp}Bo3tcxFQ zan!%nCZ=3%AWBY_^!gpspSngB#Po1IX1%d7gH9upy&^gC^(1y2kb_k@;~!q}%b zfq`8w+T&;Wd-r-8z``E@=w5&^2Sn@R)jtHh1ArplKH-M^M}_O$$`If08|7u(kIGtU zUV5(Y)Hh9WQMP7ZFe|zl35wLlwnsk~Pb7$b*~2B;>ZGji9@U*D0jD{B)2HfrIqP z48zS1)>%&~sG$anbt~9oGl@$%*Jn-diO^p?*cCZ{chNQ8rbv9NOOKSri z0X^)j_o(HsF*)#;1gZyygMWFpy1_OSz-noK0kLGLbeDD*u88Rq&lqEP}{djiF&<`Wqdy9Y9 zA3=o@#y}n7ZR5AuOXF;709R2#;4z!tf{zcmF#Handp2Xn6)pY;iFp!Nj5`k z_T{YwL&qxg4e@bT1^k<4LU|t@SPSwJSPK$2;#io~5Vl&EYh;cnc!ahW2!u76OkN76M3Pj&`Wd=+Q*XV_Cmq$694tk`z&G{Hu*3sd)CqYZ%G6P>)HKGmQ zQPVH>xzDpP5l5Zn zIox;TnyfOX1fkyoE?NIONbMMFV;r!r>~T#rs|@<5a2WtN}3qrln{1W9ksAFX@M zhEjRyLz$3(vgW6QE$=E5v+w0(0u)=c%i2qrFVpoI01i(igQSxOE(<-p1iZixa_{V` zd?{clmfG`O{QcM(N7F&$rMji{rP&O6%vW^-l=W4WrgleQV$%9R55s#wM9+q|tNq;1 zm5+&l&@6`$GnIyWQQH~ww}bzKtw!9SmF5{>o(KZ#KDX-gzlN+?(ZuX=4HmX z%&N4j=rL9yHv#nK+3`QCDt})^!);0mZ@kn4gSTEP>y31E=ek?TBWBf~P!q9V`@?FU zeLbvbAAd?mL+qWb%*g<|shSynmW7=7i|l!+fv9{$|FW>L`)t{z8{$s7E@w4seDA5Y zq(-+nkcFEDZ68m9vlXVTo~lD}T^BR8?{HN#-s5yiuB|X?1vZI(?=E}zp`?U47lY-4Fp6)JQOXDt@aa?BMi&a@J%OXrjA%}$^@1Q)kDCJqgi(vvf>#$+D6Ig;IOrV};M#2$mv|oXM?h5Mx~qXVu)2QQb_^!@ zLUYgPkqI{CCI`Z;J!^r(ra1M&G3Od~fkY!zygb zu&}j$wR*fE)g;g)!(gAeu zvu|i=WBx^KGtV~qoCJrsN+tgavjPq&&)6Nu3%;t$qt^Gb)-9dEco7pX zWGLgL=QjJ0<&hpaY0DJXoGO@s3@I%LKu$e6{#vf?}Y>GSui)Z&MI@a_pDbDd#W5QZOnD;EYtgA4Nv_4L&Jj+?{U80>`*&HqcQm$P!&^} z_4FLl78AW?PO=zVQ!q7Ud&`5>m$ZKtr5sqkd0dr7DdC$~m%pQAnzqs6i!S!Wa#d1n z8B{)p1^0X|EY#$ss>F({q_W|OKOK?&8=S4Bx_$p`G0h>}H+b=jXEXzf3dB1@JNG+? z3c$P1gf~4iS3Rkne#?imu^A-z3cEHQKg5%v#RNRfrU{(5Z|3OgQX}14 zZP@7}z|s|ARQ0D7r_$7%OsRl-DM}`uc-$2gV1H83;zCiwmyIB1Vc18+<%6;3tM@bx zwtR?4`D(13a_H+uW6KD+Jk3?0vecG(pmbWUS-{ngIddFmJ~?C&Eymt9}S)vY{PEN zbT(+t=f^#lLyy1Fe7qP;iFBdApoFxfwpz5O$kF2UJ_%vkya#zGSa{$e-_3Cy*|}}y zLH5HWnLnyp{v+FIY={52ER#u*J%DU|ECU+6ftln60D$I%y8$hnyx-U2CkXX;k97SB z^3a{OdpQvo9Vcf(3E*b06GS7apc_C;AgZ?QCBCwCN$aG!^_4VWIZ^tMY@4TVR&E#O z0Ai)bP8kX1%hZAD-A=Obic8W6A@Fie_=%6w2Z|$oj=66ICJN(3%&N=Ud$q`vqKbq&5js=yUXs&3->Ep%=K``HJ2(dBj;jqKNkl#S}K;n zTgVm^3_yLO)J68pZev5>9!T!_4e9UcC4%a;o2R#Y(TM%aK2kNv_X9#LZQeTj2@`re z@d2|zH#oV%<_&*1X!*B)8#n|+2~8ta|9qj74t^o%WnhGv#OEy%2W}h=Lp=N1`|1LJ zvFMYgXI>8`Ql_F46a_!$);-Kg7%@lgTC&Lm%wRb^%TxIjn8F?CX*dUWFCNMkC6BCG zH4lkqU{^fje3fLDZCUzoIVzzlvO4%{pR5?>jb&S)cZBbSO}K-R?$uLekd!_{55dRUg1o76cxU+*DSy3i!+UdT$DHY3Lr# zNcWFSvBtaB=O~zZSc}?@2QW=fcP{1JtKvpBEUqtOT`bI8o=n!(RVS9-Ku| zKpLy}!7y%+J_p%W>LBO)NFT;B0l&@l{<7)&jXf8~Jv#QbM8w~NAKaVP41Wwbl!edK z{p8Vkmw<4u(&Nl?r;iQfIwTrpkf2Psaqj+v+j<(01BPYwoZJzmiJpS6S{_tzv!gE! zn~dx#hcZs^9jrRM&yjZ@LSmosyve+lov7b_jptN+cb0KF> z*S4D|;+=o#9n;4_ZE4&l8mWp47tcsycJXbM1HE)IWWqi21_M*4@zfbLp^24F~8TO>~xd5sm5}&?*GA zl#Fnzrx~`)A^f%3Url!?GXrCIF4a(yAi0r--%(xYw^J6=bR(s69$t+6JE`47>evOp z2gR=58o<7n)v2e)-Bj?QZfHF8(ER?Ail`TF0sE~{t<6?`#GI#Uje%5MJ1j>gz|In_ z#ySs#)sgRzpnG9k^JO0G;uyXIF9x?^demj{y_^oZpglXAgkJIFSdvnSV`WQuLA2-u zADTyQix^VfB|dW^S7cm$EN>srJwt(O-XW1_3h)lsTFnZA~V#sQ;i0)|8J{ zf7bZ_tI*2cHZsk=u--wr0aXQ(B4t}SI&%HX>ySsO>Op2&X)8uCSYSoonGO$N8BC{o z;r22Zoe=-`gv!kGDgAFx7&!cI8WES`;RNpNOG7Cqh<9JJ<@PR^fkJ(^3|D(KPo+bn zccgx5^D7C3PXC)q1lR?$C&Mae*ZuUbyp1Id$YcMDyEl(YI`7-Z+gEeR7B!X1(xycv zvNRPcOQ)$c+gx&If<{U+a|L0_)GU-7XWT-_oKh1tBU5uvgd9v~(U1qx$_VHF(ab$Kg@{yzt4qm zRt@it8ZWS-&ess=SY-pexbGHLoYqn>d74C6SX9(_B&IJNQkop^E@9l#x_iwtOto{~ z)Ls_cm9(HzKmTvzBs?!!_73RW`W&2%K_N+Y!uE0X1-sxIQZT-FF zdzWfYy?BSOuNnFEF@?J}R&(RQ6B`CKEOJIWKGZstAB~`qdMO>T3EO?)3m5oniXPOW z2zPGGxs&U|K|Acqj(9DMGYf}J&Fl?tJ&wMDtHtrRtzTKZ8Dsux>r>-*kB)2W`xHLi z9JE7Hk!^c}dC?9L^s#g4mclA%7u(=%K3X4t?X0-QF*&LOq`u^QO?|PTFFY&?YunWX zJh;(3g~$L*pjr=<;!yH|XaCuPvD!yY-jsWqW9~o=KNkY5fr5BVixX4BPE~=Y7vS0_ zI&KmGLwh#X>szGgZC(?y=dhT zVop%tLZq`}*gq~gBwyB~3kKnGkJh~z zH9@qxMKF9KZCrT+A*+Hy_{uyNauMBt(wr9)7p5LgADT&vQL8aBtjJh+YH#h|Tbpva ztoG~=I%|W^ukyKN@<+ADeXT8M;|x+o(`xmUk+y21&m)?Vq4_g;4)CJ-=a4}hkjj3r z>)5fYg{n2EF-VR{6BSeDhtwZIwlx6HmiBpu4o}hLqr8c#X3m2qir;=982j}vUf5-z z{P&K>)40>s6rJspcqLWQ(mm|@jqvE}(hO9xuWsMJu#c;b0;)-;8z%0rYCoMEy8VMK zb5;9AW6Wf-(Yhm>EC*GKXZ#y}nK->+E$7zp`evurJ|nw3qeqm&UHfy0KsC*vf@R}~v;yV~G;%nh9dtT+OdGT|AHe}u5 za8uI&v+c`PR)fg0!Ic)7YD;&mwhSBTrow*yY3r`wamld{tW`CsZd=evaKVWKs2!_- zY?c8Z9l9-g{z^Y=sC|yVv_>0oqCCXbs1FZpu*QV%UN`;vzg^w8U7qhtm|ds|fj=(z zXpG(AqxL`2BLBOuyYqJNx|TiM1KV*PZrq)IH0a@?cw8NfCM4LMjn7Nd=}P~|x$$-jmFU|oQ7@fqWSIkqp9 zp_W=L{!sl~UPRXrC){`-X5_hAn5claEBF`CbMV$;G-O!*YO^sDLfx);M&)pD(6K|s z*%gmTYfSOSo^A1oz<6c)_ZGmfI&8DNm##mTn)Xob16;&%P!0BdRi0%bDLnJqcziG_ zE9-)og(3t8795ZQpH>yCgi__T;&+lY5g}<2=!Nhz%sfN-YGcy&{fm;0|8@;~*(onu z1FwSV*TdY`kUi?;|KCmvG!TNOz5XG-;j9^Xc){sUC(29^Z?nk>xBrvP7NZW#tkrcb z*!Pd^u&S#1HT(szE?DDsPC~hLtaBjX2R|nB#Lyk-+;CU4+FjXcE9e@u?@qq-Q&IP7 zOWdFD5YPt}HoqLgT|m>}Xx~8?iH@K18RwcC@O!AZ+i^&zc3v;v@x&I3*^~SuJ!<9K zKun45;Bd*NqwhZ!*_&`Yjy;WK*~RZd-dJN+m=H;=v&lQYs~uMOpy=aD7pl0;9?TfE z88RsyWROy_sfZ->AgBN4`k1P5hc6|z+pCy0X2i%Rd3tdb@AjbA4b1OQ`OE%4c4XYu z>Ae$0P%@l96@OK-xJu(+9LD;uYVGTBG@)FH*0!-J@!$>F_WeYs=vHt5#-w#jBMT-H&;)E? z^fZnOEHEMatL~oyR>||=OAmwZZ@>I*W965HW--oJPeu4Ij^h5ejioFTR)TxYG@HnZ}BSZq&I`en`cj(N+><@MOP8y8O#{&a~sgkHg6ZM2| zD$M`dUmw4kxjFBCt#|iJ6#Bzi&Tn;FDFc{4P9GQ_RPogO#iZ;o7~+MeL&+clqgO<_+Ms?pmlRLM8{G;wk*I-@r+vj_oxBMg>cRTbM6+3&`lbmJl z@3?WYSd&2cVdHK`6R*SA>i))ooG>`eGaBLOX1**l`=TM++t3l$xcE<(9r%gi-(U0(e`cXrU*Yr-vqfURm1V zaS=kLquFUBZ-3qGOX^e2j_5WK=X#u%yk>rl!w7tPQxJRV0ddmGmtKtEwISm)A_v6A zmEACu%%b7Ge5z{V!~JBqxtj&v6i*<{v znEl_7_`7|X1BfM^|7qb5#nom0D>-Y(m8n8c*vFrCZn;9QR|Lnc(V{-{sbh{F)gCGd zHrx_tgdTxqZYzq9pxN!W$=ioPri75gTLTcHKFsY;`BPT1T+d$X3d;(=_EwP}IVY%& zqhFR@VSvX--x>@=C^9}?W?rKi?Gn*atpg|3j@Xe98%Y;i8@jBaOS)0kcRL^mYq?|j z`clzhrY>syNgCrv*> zwj(r39)p*&-uuelZ+Z(F=BGfs+jnj&`%iy1Ld>uA3{`}$x`#fLI_eBPl$HXYqY$(q zn7Q0>^SLrRwLgvt>WQ9u-(hemc;E5jb`8_TTSgK2v7gK{t6VRLW?xrXr^I!NSq||5 zwAdCqJ>bsj7Nb#H@=2Loafr@V6?IH4GH3J`|CHpQHW)t;o;P8IBbFhA>|(WAlU)!D z94$%NtU*UzACauK$)A^u{U~env1#IWt*2^pu3XYM6n?I$`OY9$cSCl-hxIvl3$PCW;#`t* zMC*@n&_JfU7P*i$S|}Lpo$mD1FcV6ks8vDi!qqTq?N+ZVJm0>Oc$n;JgRY38A@i`k zo29drRq{A_2E;cqwtuNxV%s-a8+A(my$2V^FVW9%eWFXWp6h`1_`hmpNFu$@mA~h@ zz!h3UU!D)kW4wT&ti$A_*uFB(Sw??h#12cAr`FdB)ZWPwNzE*+HV9iXJ2%lzMGz_r zO#AjPb5MTD*d=F3-}Z9)l)0i}Tc<&Sjn@iJRSLJCBMD}&sW2^Z;vSj&@y)h7Co>u}z{La}d`0t_uPYd%e)N)yMd3J}mHH zNd2&J6OR53;o{l!wjnq70=Wg<7>4SbilTOi4?lGGmJN6~_fJyR&uERv&rc0NR#Yzt zoi8?2gd8Ts$A@>5{CS1Ulu1sXPTwc22CE`(fMVXJRjL!l9PFPfDMpWcv1jYFJy*3Q z%UuK&&@~j#rmd8!G>b>o&p~Fb=R>;B|Cp-!zx+YNuy3J9Z* zdm(Ld(GRy5U2QKt)i7#hVW&(Tpj+K;4SQ|m_hb->8)~lA@jWp&sTdjf8ajY?i|M3x zTB(*Ff!R_@*{w5dEd7XoQcU3ye0v9e%8oD&vV@t9%`)wk6kplKZCYyY%|j$M^VjvC zkCS2C6euS(Cr%?qsz;BRUc%{e_Q@XZGe=1;w43bb);^fipZ!9L)HY}W!9aPWBL7bD zD+Jw|_#EN+OCSDr2*Ed8Z9z+pAm9BwAE@iHB44>Gen|WDPeS$n*;;8*|9%=5eWg&m zQLAPqH&)Ii3Q$iQPJ(dLW0rsDryF8bZf0S*LXEPjJ7+0{c7Q; zI^V8x{BwqWa;;yxRJ5Ng-}7a9`F&Plh~(CS$`?P`dPbV&ZH5-7FI==Em^UD{+ua9O zEMXih$&}~(q&GpDFh!=sA>WdCD+GuYBIebr#<+p`mYA3rlM%#;!Pjftl$n>;_UzmA z4f*Hb5Fsny;I3Ei1v{rj>p4~FUX|0t=?e$4rH+Tv^P3;Nbg6SF$NDThJcyrh1`^3T zKq84rB6W4?J%YgecqNsS4V2LF?9;u4(pYbG|2P+T-x&m)XkFS7kM`H&q)gW8`OUPJ z>G)fZmlrz@<=AeBzE!ek+Aj{GK9fL;_*K{!<4X2!JG_O89x6N>-G!5DRTZJawB*30 zVJ;tO1(U~7hrRhiftBDVGriZ7tf77jEv<5`MFU|c}wwCyLK3Q`?rVTpU2Xb5;4w3PN^KA~qqxKB;=#jYu zba_#0_G`4dO{L65-&XfU{;!JBvw5ski&@5k?;*UvTMws27x&KRTN{wfB4MJ@OQnLt zqH(8Kp|OZZUbrc$W~CMu2Uzm#+RH{ss}|FjKpLWODcf-=TesXV#5xc?FEjn!yV5vm zu#y0)cJzE?xFqK%2v_1b`p6R!kb=;{$|f?aPM`(H_4;8AEQkssOq8W& zgP7dmS6kYQ}AC+E*`krkW|7lB7P+$XP58>3Pca?NC`tb{j} zBAmVEHH4h%=i4hV35h=;)`%U=Bc>;xceFIvEoUP(MsTIaRe~%GoVN1|d+olLc6O^l zM*5B_ycpy3x3Y-0m~hWQ(hMJ;Uh3iFc=+BKBa3 zTC1>4A1j`LE-Z&`^@Zk5>~h2$)wJ8tl#?sbL_npTNOqr6`$o#Y)W07hxbDuO)hphT z#Jl>fu-w{m%XvomnMF)Iw6zz5fmIbdPUkS|{7lZcn@n_dK1!^0tr6@eLDriq)D;1@ zq8%dxf&5J|#Yr=tdY;_{iRx6)arX;IR+x=tg4X~Bhks}L)(C#vAJa>5_|W{wb@mV| zO~fPB_DRf*c#+x=qfq^Iox{otCH~F5|K+~;XK&#j*rYlgJl4PV<*Tx_<(sW!Q9OSm zjfg$bcujZ17bG+3#iA#^XXgryuB7vtj@UUKLaQwJx^^a#I5RH#A>Pafz3(pgG-e={ z%f~BW0G!SH2NNbqhMyF^7h*f-#O@)Lx*v)WFl_&OwrOxu%vc~H{6+P}xYbyw$==ot zEs!Mq!~2ty)}e0@j|o~2u=0V}BS~fvcfTscZV&{gtVY!S=z^h|ERZ)F^K2pF<``{m zrO1dxQ3<;h;&KCFp@Wx(HFW|H?Zpp5tXK^l_jx|Ia@uOw>oaS20dH}1-9J9)|M(`p z{(&ZV8`PgKkM^#x#ee~}DvGdIr6}F^a$c>zO>S)PW}AIKl*gNR(n zvmf`4yG%Hv@^+>#)P4bzp!pp^^M?%+Hy$kelV^h~hpBOIu&(-Zm;;%HADyqFlSuEq z+Q>*tlD=i1t38=GOcJ*9#>WpEN% zU$nTtKXth&ewR<7yEu;5SjD(yTW;1#H%tzcZOiRXvurEVhKRtT1-_eVF2mXr z0FgGfhEi3Xdg}8J05ui-?vnS{XZqJx#b*_e@r}N|8EXRE>K3~hphEEswM~w-Ppr|2 zGs2t&f;&d_=!sA98_QM;`JdwZ0AdQThkW%n7Nt4MEP=l!kMd z_G>kb6&wyuLS!S|Z^vb-&1=zJF9#J$*fV6^@Xt;_$|UYfbghhpeTgWh^8)V-!4UP= z!=rARwhd`$VONvhMXW$GzI?xQYBfpr0e!e#7bp0mu0Z3AzAgXe2C*VwBhNjhu``G- zxIr$J=G+9ARAEKdYQm2T(9ivHG`7bD0b5=(!_l--i{jq~tHQ+2wdNaFg*|vou;Ow@ z?+Sf=eM&{BaFBjl(yOw9GkRD<{A}iASmXH{va{ z5^ve$c3{`Cw^9feg;nW7dADv9^G5T{XBKrIf7-jLvR-O-PEe?<( zYW~{KJ<_4u(VbK?9(htKd2pHZM_-`8D;_N}YQhFGx3^JfIk}3qQ1l>FT&9Lu#k>)L zO~I}p%USQyGr{F*ye}S)1NBwTV@+k%pa$k12_1J?Uqx*f#Xzr=tVx0f_VE=`i-7RZ z)m~wqC^--Z@n(e-w#1q`9AK+5-(7{dn5=~pq2IzWpmbFg43Y6bEiU8htf4GkQ#h^m zY$V*Lvv=Oo14lr6A??C9Rr5P<#e<49u>7GSVA)JSCz=B)V6y~53MhC?V68tsYi4}( zd%3cXrBll(F~hB+x@4}uyoXJU{}nEQaytC0r-R_^c1vROyE0nLn$&Tm8a`mlT13*V< zqNh(O^VzbK9!7EG$le*o*Ys{aB7n6GA(@q(74z*~L$@J5hawoaq9@HlydT$E2oJV$ zQsr@wcDfq6T(@Q>c`csOMu* z9~gL~k2O6%EM${&4T|2%Y4c*=^O~6j7PEFv4+EOKIA;+f5uPFub-3^?MBcbN#+)5G zm|fqQk0A_BUybZY$Mls@QJe5D!%k1!vN*n`p4A5@>O$=FzL>T#ZX0grt}wXYt!O(Q zdX^>xSUrd27-J?>1UN45_J_thH}!T?r7GgKR}f)J1>ZpzQ{{J#TuSqwVFi&1hh|s> zo>dATI6dCvQS~(?+>CyG;v3=SX(fNLY~O-0;4koIcL^y%xysy2_H}dZ>&G^4&+NT3 zSvu$yXgKsSbm!p7`$Wgc(6i_EVsJwN_T?C}w% z$LE}-+3G?;RN}nopk38mc5PbO?cgV*#frFl4rZ88Z^$wCHdW(4hBdaVznMg0ma2V< z<%Euh+UvEkuj<}#&rnC|7nV`N$QXgEtk&_--A*8d=?q|WG${Dm__{6t#d#^ig{Tp^ zQVJuA`5XqPD?ZWaYutVSd*ZqIzAfLlC$@tP8Lho&BBE zHF40{RNuqmRQR2jjKGo4Do8ACiS+|1glxK?467CBD>|6b+RH^z_afVw*jC!pX z$G{5NH^1aKun%oo0qjFlWa<79UvkbF%S{D5iZc;M)IR>zJ`~WM=UWtQFsiPP1&j3x zff)>e7cwmt@8FcDCKfVIFy|%$kmUP!)b8c-_cKQlr+d41y-7=PwXgdi`56B4S}$+> zWOMW&i`*Qn_$k`e!FNxn?fM_$(R8b()(3r*C%IFtfl9p!J5|w>>bwdc{?3VWG{4pg zICu8^CM_=I9>vWLkwazMEc0zF&uowlBsRv^61w(GU($S09ZE#3gNNVp9z3jmd}#+O zFn<1+h~~famq@DB%p^zOOB%&Et4C1(BHVGyFu8^@km{eYC1gi5OvFx!a87LKL#&%f zuv6rt)mAi-kqjBCjnS=!u-$KsKg=CoC{V3TTU>(%IP|Czhaz2`eM3E9V_`8q$*tAL=CZCw5%4 zO~}$ouEFVIOon&I3dyh?K$`+bwI4eak`$9bTALEM-Elp=(rmgpMBI&?7(+6rTabdB zocZOQECo3+lB%Q9|C1_Dve||6MW{xhbWM>s3igPig|>*kho1h?NfTfWv*z({#2jKJ zR58gJY*J4lH7L3ni@{7npf704-G0Rc6Am>K`|km zeZB?DR?tESZKJ0fz27eGCmp49+8ua_9dt&{&cs)4K=7Wd#3IuzjGWy0`$^=85T$D+ z`Zg#{q?cxV+BA$wL%)=*#(cibOpEc;8v4aXg{h4qb-PYQ)eyI*;4m6U_#EHgbFe%{ z{$K}7N1A75$0}9G?WI>ap{N_;JCh^_6C7hoL5~=!wpb2&DD_}zz!AZ6&AaQB<*GXB z`M*|}{DTy`s4Q3CU!G21VLQFhuvV^Yp{V2;hC3X3${sb}e1wbi@;xe-eh~#kXUKO^ zw20PbP!z{~qF4<-`+FGznqpDB^QYP0`x>SEoch!-zIBLozCpY-lP#+^YBxu>MP5$=%T+emx-tc(4LT1UVM@vJ6n))FjIU)0d7R2@(Zs=CiXS-hY`XGn> zr~_>$MC_0WBd|l1x)Vt`B!ZYatidhoz&iQvz%!k>Vs@yUalS=2yrUmq+1#Oq65d|H z@f`fH^VV*#+MWKSUHL}H6%8O4?9Ic93gtk*AL63Pm8yf?=V>rU1+hWL@k$trYft6_@-Epn8Y-ELu zUYsSLo0M^DflZ@;Utw-}(_`w+;18b=Czt;1>qDy%plSs z0^0!@Fr6<(E33kItxh~80bL10&$jd=PW1ZCl{0WtX_YC1(1_;AQ^=ylrzb-r$s>)qQqsC(z3<- zl~hMQV1$ji77o1v->NX%;MUY$ik?KG4LtML?}8#D45IL3ESckf<=4GG5BFiE!U@5ELZ; z_U-^3hffSV46yB)?UxddHn6P2&z-DfKaA_OIc(#hcYolj^Lcf` z!Y!K$Pb^)s%tN8RY2*58a}>m(98sbO(3|dnz3PU^oMXzSGhbyDAVm8ifnzp$D0Z4C zWQ1rIskQ1YTK3tfNx>iE$fr{s%FR*>twE*wyNMOVP0I68*6piYOTY0J^;6dEwwFQ3 z^j~#*vZg|&y@mq4lY8CFtPT5gg7M(uOb%0%`mUvltrL+|IubWwDjL!tb+*X237!!0 z28iwOw!$sgsXBMQKpVz9n>SfpB_3jzxagx)=n*s}Ko4^v^v+Q1njnWp)pS-yVsW#(>=T4rEUzYNcbhp+ z6eH;JJUe|sH4%+EAE`U#wa{e5?4nx@RxF1FOLHl@v7Z@;`mEweHr=TxP*7*S+VTfQ742h7w2I%h&#*qt30;HN?t^Lo)G_D>&l)~Uj;41(-M>tNo2)3J2x82y3KZa;T}HRye)I$$H&~RROdq!aw>=D z*LqY`s9&g3luwKE?h6=qWXU_Q1@)K9-p%j}@Im6)so8h#7rV;>UbJmSVEMtKcuC$^ zcl>?ve9Q?a?c_qr;|@AX#4bYg=vphjx3YIM!H5}4ZakS=;X_!MowXAh4|R2G1*YWK zsNHX(nN5t+3ySy-HWRKRq30#Y#|_CzV#t3Or4{#E&L8%f# zp;{GU6d0x1LXge`Q*KLpfhU+Rp09i#N?&7@06wMBvi;WI_Hsh~!3yi&<{rDaK}m`G z#1jzQZtbfDu}PaM0H`v9w^1_8uEi-fxo1f);8au~%iXizqd3ettt`|gh^XNUx6w*m zKjb^4{fN-c?W3eNSVA$*$w##UMCb}Jb9*S>0`!{ymU3=$T9kCOjH-)~OJafa#Y7Mt%Ky5fP?AMopO++Nq3jN}+ zt?qaTTmSuXD~!^~3(HLzJL6vUil}DLhW*%pP(=~VWsvw{cw6PQ{#pfFWSXSFoer1P z_sVm|tf!H)i?>$Y<8cE1eXMl`$a4w|MI>0|le@;68;oGfC--3Qr17C|(x>8Bc6_CG z7W3um;U4oMDkJAqkqKZe-uCZTL;9=mXcf8A3vz}I@Xkts;)c9N&XZ~?*xn?^Gu=Yw z%hcU!bU-?cHQdmfh@U8T8N!Wt!dBdk33pR1bD!v@-x6hhs8v(fXY~!#3Sl40CQZ~a z_8&BmR@jNon2z+Ae#md3GRboFhR^Y$tQSEvM1C#N`*3_GoT6F2sNMm*vr4CF{u`?hC0b3aURU+#EAkG$2hy$IpDB7eZr6P0ovq1B)MkWm zDpt7f4@o1k(J7-jY$GPm1@4Op*^g(Jq;sWjO|XMGnTA2EaU+mdVTPIyHIYjI1o5$? zR0LTe->QX_G+zAbRyEV7EYHof-VZ#hE;GX)W81wJIWn;j-+*YBZf6`Nfz_quJ2Qt| zXiFRRo@Jp4ZDsL7_UsWnQ2DT`X3DclXP+bRY$;9SyrvzosG>}el4*bz7az9JvQPo7 zGa|;)nA?|`_2%UwHWw`xYzj)u9_V#dAXHHo|@t3u$f_}olF-_{5{cq9ghuILa zKHyK)#s{)qL=d@l876ozFRSq4PZp3A>(VP$2jMvTAq3Nfp-w7XMNSJ@?9?CW?f5tW zLF118%^O95T$Oh24fX0M5ua%NB1tnZE8L+deF!>z(GKtvxCn_hXdr&PcW@g$f;_1Z z>5Cm>ti?NH-f0ER(%VU-Ik@ z`xo-b>V&1|RC9#ka5#KUB1uSc7wv9u4)i%NqlJ@#b0igANOfQ8WpPb?}KTM7+BY zLC2M623gYqc!T#P;%4}9YBN(qnlr|7Wwv@qL0;oRpKT40JeF1L52~PH&?fe(n3Yv@ zEByY?5*rDtM%#8nlRWM9d>J@uN|K-X5;mb^oG%)c@GrE}{K|$((3p9y)k%?jr~tmj z@Evx4#j7J!v0N^htcJpoKZou4F$lqq<8){uYp*^L!6XoDSH->l>a z-T$*kT8JTKCf!a28|b3Rp_tjmn{@;-DV8}gW>@3~pdC$Eu7wb6m){r8?J=X#cdYxK zswNaRSrO@a{uS2SVn}JnkT=s^;Oin?0^=vG!ug>XpzxapddO5c)J;=hQK%9gX40f3 z3PI$vihr>|G)cT&kZrXjs0=kuSMao{Y%sd$1Vd|-{0eS~GXYn=O*pP$ejL;*Yn`L| z&VA1NJP#Q1tm4z_9ya^!-H3{d)-0RLSUs$=!N|5U+ySQ&^pw7EoE(1s_Q$(EApZ?o zri{lHP#T?(KMHXo3G5o~Ea)<5&(#l|!9#~@$w zJ0Vo}w6w4c31@nxj1@z``6TD4k|@BoB=9HAUp+*qqEZ2OUu=GHXnPs3xToCPTM z?~u6=8XQ$MeS6l(4Z0H&Kk=>6V>tuzCMHQWEsBgh#ku!V!`)~b$vI+XHsz1+LzAy&@8fk zkdZWajY|_~m(rjVcZhyw?T()WpGi|+8 zi&3t4JiBEHRHbPiy67E^__$w<4&OG&_O1dEc#FWS#sS?y)m>$KfL#Uxrv)ZAP|-o? zuoQvU2vNWFcdGb~z>;5uX(9ChRUe69KJt+pscoWZ6=_tK23A6D>=l!5!{H^#;4$p! z%^}gCNFhLl{cK6_Dp&j2wCm=@`I|QEL;D_g$vh48(9U5=cKT@5*>rO5^5@3r>vog1 zY33v8XabPoBF(d^x;k7GPve8?&EnxhNVf0gPj!PZPT=j)yPoO$D|)dGzVoV0AH=;) z6i#yjXJJ?7*ygu2&WUzjd_Ajikp@|#!C++x#A?cb+UXWJU9oR#mF@m8t-@ln9vSO2 zImG)gy1lT99xyVV^%h)Gbs~!XLV}R>GXV%v0?=|c&`cm4rmZ%;ZcwfY-Jez({FfsB zUs)iQ%EvS>c>`$@_z?}(J>nP+guv9TGP_UqJZjRMeDTb4fd*|GHS6^6kFRmq5cQss zyRz4U@ye+ExNbObfuUnKB1g;*#zl?SM1H^p1|!pmEJfek;QP|4h{9u!yf$o;6&|5z zBmArRT=%>}WZy~3Li-7$7QA|;$#B&4+Qz^P_1fjorCO0Bv*m$?ea;KZx_GoBdseU) zlr}Khh@WF&sP-aCNH01+C#tmH|IW>uA_f#GvKwWm4U}RhIL+Kt@#1wH6;u&{ssL~O zn@#rJrr@v~W+;N0V*kKRI`mV;u_K#ovT}abayN>O-i+jYb^|jd%JaeMEFz*6|IYB| zz=^~LZ4{x69QbyEYjDMSFP2jgX+i0vnhP4WBb~9YU*t=#a?@j3JpwpQTZ=w7={==! zO9WX@ZR{4p$qm@!O<|_Mr-i>9)WC85pL5U$7VsY35T^6MPG=@Nj4qqtF~$b;ejbiU zox7NLl-$C?9^{H~Ni1#XkpE)-Id`9FAV-(dKENU4AZ5du_4@udt?*wG8p&nzos6^H`tpK?%*CP}aEAMXXZ!6;(dtXLO<2?wMUyK7|7 zs9&EcQC*;D#PnkYu5D0`wAJ$FA>7LV4da@+a+R$tk-_xj>Qcja?DX}zMkzTj5bNpN z(eCnqJrZVXEtp6%UlroiQ_gWtBx%b~;t@|wVnf7(=2?we?YHecQO8wzjE3_FwCD)l zjRPltZIKv;uCfdMH(B5qCE=oPcw1nQ)#G?rCjbo8RspB`VzR$=R~fkABG)Q=RjL=^s(CF65&nBpKm zj-YS(mz!(s1cf^MVy|7H~V!#6P<6FB#^pSp$e@mdbvCLi`Ei zu%4^6cm`4g!X#*418`qgHbUA16wPc%6`+3~&9jeI0#Z3Ltc@wS>A6^IlL>q{T zSQ6x7S+XbD&UybE7q|`&e#r>V&EZ-EIm7$|UIj&+Acirf!bbw~D=?F4b_Z6W2;(m3 zuW7S%wB$e1W|2v(v{Z37N!O(UD-svhngTx6jn*k z2U;6!f$031&MFPLHA$pWnBCM0Jc@0NnHb>0wJNm7!y36N+_Q!;NJU0drC`dNozvMs z23pToTZd1$^~BuvhMZ7|v?fgx!+6VAJTEmf*DRR_dccs%x%#ZbrL(o=RICs53lz1Y ze%2^DlxQxnIVZcy!QFl^tP81C&|>?Qo+1k^LglF`h{#?XAUXh$l>2wo?#gkJ{0OK&-i_m9L+OgAS64o>>>OH?QKoAF~D4qK`&{*+mL z@m$I>E>y8cGFlTA+kI@sN-qejLEs(59FD)#5Gts7xM3&%gOVyaW!R$-&j zl~JxeQCdwMFr>))oH2HB56w=0zKmk6ZXOt~A$a1V>5o{@Dx8&c5|fomXkUc^`P!Dd z6F|9G8Gr4!e+6dzx9TlWi9@-UXGxksd;rG+IyE=;o@jK&Va`%et&3bqa3C1*Iew@UNl?oT@dbIRxoPW z{QR|@AV<>fjGBGQP=8d&?CAIP?gWy6G)7CZD<3MO_sLx{jm%=ew1d@nC<;=PJr#?L zYvx!=4=<4YxA5bFM#yeKgGgJDsyA9eH{deAv z&!|GR&?(k_n9{AQVE4Sffa_$wm0lGQJEJc$h}Ol77Psl@@uXtQF@I}rYGH3n5dvN@ ztx*QPjD+Pp70^TZDw1F5m~&WRtemAfk@DL&PNUf?58-uAH6hArG!vs)WeWxRCT-NZ z`DY+=ywpP^-OU-BooMK0X-A6^Lwx|5&q%Qj$?JzpniHoK46l)%hrc%`h98-rXBnbL z3dKEhCGqAWEttTF>c&lR$BuOKp*u)mK8YVo-C!Z6)OTxL4%yRpVEvEKZ`s zF9kj0yJRW@GbPSQ-|yqv3;J5Xn1B|(ZTwWuFa;>7+O8GYx4M$)FS5YyND>d<;60Af z$n^W9;7>XbgM^N1Fw)!-l=&udvqPXmen?s4Ony&&vHC=X zc`+g)8}xP-%JjoT#YeC!I8-YuD;)f9fuHbY{#DZpvRK<`V#cSFWe*KCy-nz@SMH}u zKZXn%Q8Er+5*h}Ox#&r&hT0D`tw~d?qcyvE*H3Cwa#x;Oc$6dC zwF(k`p-lwUheQ(!ELhosa4IBbq9?p9z(JW6sb`LE{G2a!4{UN>D&7x?bB=SUdfxMw z7XY4-L72NqcA=UHWpIi8wsREUHZPHe8ynL6=%6N->->a!mbjDaqF?y%=gz>Uj?ZIJ zE|D&#(iNq0r4Xa^Nl~L&leLifYD72CFdkptUu>>fD^JyCOdbEv$1!gUy zduNuGQMR&JuICx+RxVi+I&X9S`~6F}DG^pe#b+ris2a(s_T%u8dQWDyER6Aq%6j@t`C3XjasIB zY}@6#Ashdy;XUmo0`&G!=EuBepIV&-ck?w3>>IOm9B||Iiw7~Y=_6@J@@qR1?W|A^ zV*he~MNu@&L*~qK<(F;^DXc=XwO~bW`xSkOFfJ-A1QWfKxJnt^h z6Gwo__cX*a*qqPEX)9$-*K#rk38%VCt%;~Q?5L<%jbS{Tlk2VzxrYZ23qu8@Fvch5#32>QF!p0=3S z&-2BwO6uMCO~U6s-l#X}zK78BN3f@wh9+^hwS1kM?;g$0F}@^!Ie!&)=H_59LCl2{ zzlIO?^($IORAy9ZbAYAFqdw0^GyF3TGfScDJ}{1Tu*E6xCPAKsHVHT?G^|;FyRhN~ z9FFFsm_cg$%#SVk1%~l6Cu>iX7B2ZQPTK|n0)%gL_h~*-*X|B$Mfn37k)>m>s#f5R zD@L7}k({ix*g}>#-J|1M9`!zRa_z53QS|_YsaVv0E zVjwg>RYB|3T>k22o8|+#u%!i3SN0g=k7RqlP_nk5z{zaAUnk0p**y z=zxB^6(0H+0~v$@VvD-Crpo+p(RSj$BvL_lvH)xf+r-%T%{G~_V;2SU$-=@bRWIW& zR$*tKs?37fmQM+g zs9*(YL5Wx8CIPKBum-*tX;R^DB@mj#QGMG!-_uf?yG;`tOlxv*GSh_LZZ%G6&y0l{jYQNtF#t%MJjt6@snUjl9t zP%AnY0sxr<)LZ}l(A9TJ-vjY!$sFJgQ%<-aBKw}&d_1##NcWr(ys7zT9keR+Is%Hq zykk1-$NKI~q6`m&7&1L14?fwQYtw?Ed!lNzu|$1YeBTDDe6yn_34%nOXX#>1TN00N zKn3Lk#g{p~s)+3^&@L2Q13mYE0OI;E3rLB{IhCEBDqcgqa5v|n9elGUR{Vs<%cA<4 zj*BGgTKTFo=ZFZcHpV_H$}pF7+}P8#kFZ9xqe$|c`$@5TgPqOIeii!C+eD4v;VE)_!oZtTmjBdy#JluiX%#T{E>x1 zPV`6Ls4#TBF#8MuEQvEVy6smm%zGz&{0wNA;8gBptb1a;tsO~DbHr&uhjKKo#i<4C zf!XBc%7p=HsB!P1Lc=TGGa%$m@V31~f9@?U#G(JEb4{P-x~Q;;gUFFd4@qo#P|uh z3F!R_cM=whG8Qms-tOaG3}6+|w=MGX{4nS{|1GsE=sR-^C10gX*Ix?A!x_9EtAf(6 zz9BXx1|A|0rGZIzyL2P$;M?!uOgnvRT881Jevq#Q|C+DH3QCcuHgc=6Fyv5b!&z%i z`4Q|4ur$DOL*gcR_}Q#@Ga9l-w?ZlJduvj7SGb)R7=!qgG~)QO$pRLyJws0I(hA7# zhho>LP1E9bN4rkNAzzpT$=@G@6P*ReO%}~lpo4sZd7so-mK32TgLT(BOJ{bEO&W!W zvtEd+NzIG3poBoM68>%6rJP=^O6vgaD8E(j&K?3I18*|<%|E?neGGngL?2QpJHr~% z&ei`lklTvin6>3oC8L|#iKkl;E1+b$D1ZFS9B|*Q08*3bgveAI>s8`|G1j&RZnC!J zqLQqDpguOsgdRk*%%4Fe%%l<;)mP|`2Uzff^ZYsQJ4rj$5XVAwu`y~a&UV4us$(>Z z9d<+^KMxJ@3DL(BE)7m{)sF3twCtj$wG}E#RAJGb<|tXH{j|cy%fGy6`2AK2A|fZZ5-GI zwp_7(TTKiU+n+Azf_-s@nIlQ|zsdZN1^C~z1U`hO`hJuej;xK{Rvd`GQ}IY~eY$_` z|3luphb4Xg|NpI%tt=}m!BjeI*_Ne7q^7{i(rq2Ab<#Yg6f`MK%{-t`S*eM#%`MMZ zxn)i~MV|6NCP5`aE(K44iis&6P(c)--xF8uyG3N$e`ktO?2U< zuR9}nW|T0gY$Y#D&_0<7HP8- z$QZS&UCT3M-7zk@4fk(oPrH8&4My}bkSr-O=3|zo=Sz9ruq>W0=cGveR3T2ob#yBf zr#!)lQ$EV*hSYKF z9t2B`*yGyI>H|sr=vqhR#AEupLe(afMv;~1eS*-rcC47+KYrQhtshEbEsdiD2B4B; z{+IrvkT4ze*3K`jkMi!Zsz2#H;hc#+T%OH31S5Dih7N=WF54BzdXRtn2jsZY4$K)F zV98Cn8$RY6O~9Y!57^RKQOU2dV*<^ouln=X{gC8N5(P8P4D9(A!)0HcOrT%H>!N8vmaM=|EX#At5NkeKc? zIG^9DV>p|2BdE z#wwdQ z2|kx^hplcl6mYMuUloC3vTa8!xaTY6iql3YpP6w*LD=#2y4X6K;*p+0aqblntQuq^ zaSHa?y%iGX=AM_8)|e&`RyPrSxkzm-jyf6VqK9TlQ?q#!8MyGxuX7?j>(X|$e+5oo z=8s$o|A!;j?~*<3v%!7E^!V~HtBWOuU* z_Z4mOQOiEl!OFNDP6+dtvmzdsV@c#-`4%d~XXd45+X2*$E!W*ZOex)FhS+h!YG``EyGl%S|$)1M1>Pc>W2WGOJ_(%wPhVZ7Fv+@-ypacd!_l> zkl(rFo-I&XeaKzbXf|e-E_u_T{`G}~#XOJxo-=Kr3_B{zsaJgDmmgEafXnaHnXGke z9b0wv*tNtsdKIqgE-QMq9vy}X993;qlyp~0&9w%hh|!Fc%AxEZgJ%bR0lPL2;tauW z>cK1?nXm^6A*O}3ggqGr)qF;`<4l~6hDWIf!0>vo(KtHYixdEX6j==JBXw3X3X-Ax z^p{>$k;(9|{Ru?j^UA>j(0xV+fP^1P(~)FP(Zg2k8PcUneZZTLzwTJ&d%g)C;IYAv z54SUMhn=aRSa+K02=!0`^Gmd)4CUvW;dxQ6Pc3dY$ zl~vyxJT%?HyRt)9k2(9eE{dCALMTQmCHu|Eqx)4Bvzmgc3v)q$8D3gz9Hd3UVMHVK5!Vn&2%meEC~_}-rx z2(X%R)B`ms7cE^yCfz0<;9eIFHCGr9)|6EkbfxLcYB1rT&R&laDHl@1_zwpqMQShd z@=cdca?-5I8N_{QCc+P#g^4a`M0Sl$LEA}`sfI(!wlqCv_nPZE)%5BD^*+k-mCP(UGn)em9Izdxy}(^R4DJa z7Tc4_8gShwCEr}9AGhx6`GXtRqxcXaE4SmIl4Iz8XNMQ|+>fKxlu#B?)$hc3kzu3@ zlb1L*l((`q90=mopbd&YT8x$?71cd*szQ=w#!BScMT{|F5e-9?X9u^OQXUeoak~^7 z3f&an@7Ug|7qHg|L?N%G%57XFimHZ!eEQ<#x)E}iP=N5)9mp#U%_v+4gDb$m8-u?t zQMEYp)!M7@)A?l!B8|8)i8qO0uw$~68euJd3HDpCqQp!8C4op!ySMPxDf*ybzs<=$ zo(MHIC1OWYsH>M9nf27h{)NO0w(AkIA080h3MO4qSi-B4*QnN_QGJTP)4AKDBCK&> zGBgR1^yH*a0^Bpap?>*k%2;#8IN!IgjVh|t={i`aqZEhQ^bR}olE(}S=7+}2nt2J= z?H*eh%KTPrgNweL`_kjFB6yIp1Nnh#EM(48rA23)xGkyGXd< zIWFvekztk0hLWvcA7`;6I{tkqcHa`va0T;eFF2(uM)2}XG(U`vpvpTrvO&l zwauyaMzY>L!JCR=aNTak*+u=hI>yn+6i5W%limM{95|PNov<8K-7NvZ>LN9e^4KuF zSo)58x#!(g`cWc7=78G>OT8s?2!tPxMb&<|<8zck;nk(I?)@gJaNTwI2T)VU>NZ8m zqK6poI8#`lQv`V%EoO`oYuH4L^=AeQfN^?UX~|V}G+TO-)ak4W!gq2`Mx>(i#FLrH zQ{#FDBgsMG0K}yw*KPiO`TMpQwfW$s&K4HlrZm zgC#JKyhG3CfuY5GZ2G@GZy8(!5piAFrh9tk)9p+$$+VZ0lSJV2YuFJMVep2L z6gHHVyk`-6(mp*x1RO92>4`Q!jK&`~e|n{~RPW_O)Mda2H0gkjaCPQ=8Hhi-?(9fR zb=zQgUxL$_fLBqW=rN`@h*Qq{?v<0S4B{_*D}kxCL0wh5=rcxQ5Zv)BajRO^DpKtS zg&uAA@4pEK_k-Mc^5sF{x|@y6hJa5USW*0g8~ad4O|NZThVCX8k2t{_!oISvh9BD> zV3+#R|F*-ZqRlNRi`tq&Wgh2_O1R9;L(iXAf<~KhH`IT$Bd>u`XDsN*G?g%0MNR(3 zEiOJydKstB8)=?vnyX*o|vHeb1DWL`$e*=k&l#EntZe3gCl2st+0}XxyES6WBW= zhq^e_LLSJD2i>8EH-y}RHa@%KJhh3^~dv)svc7=OC*mCI5hqrEgu=AxPPpE)`@UQxns?D!no`tiBN zAFluAyK7e$U1PGWJC}c4C_diZ>&_eF23AN;T;i3D*~ZjFT)#IcB=pNMgOaubAvhE& z|C^YP=fXg8GR3yG?lF5d$L5lptzo7|Dbz7KLCI)BZD)R@~Li$E?y zn+r*Hd3{bx=pcYWh6=0qCUj(J7phMIp<}g$=O)$57*ZfB7`sY(crd$rd4%cxLy8{c z^4Es7WRve9-j;lb3bWCS09X(SAroK4B0&xn|Bld6@)ttKh6M`Nw!nRP_nTaNZTjBi zLduE{jNa~kL|f}-^5kQ|+g!-QRf$I4fG0{Y5(Jp*VrN%(fn94P8%I(tl^~^#x;Ff0 zez`U+TzUTBj|@2($Kq4-)I+bXP@0NfpVl+7#vKPBi8K(|uP*L$oP8eTLP8ziI~T%T z1J-&ow>cS~YiHy3^tgi4wU)&|xb?wF2X=NT6gKPN^H(M2`6#Z%y$q&)WMS4imb477 zR#a1{=lY#=vE0JX4UyTwbQHlS0Bb_vxl{157>eZxaTuhwn~QK&btd`&k8he{8RGHY zQA6}6_oCk9Li$oX1|lxph>?(ucCnNeKAmf$0_Vbd=YQ)4)+fIA#uL2o5~8;?#_x=` zG=`_DXD7M%T2{qY2LH686Gui6d1L|5-~OtGSs52`e#IE*E^Lc8n@IqF;0n|Cro~CL zB*{g&-cBEb+Pq3%#U%&h?l>MceM&{7>}9ASAZfZVTQ<>1NQqputcG{2a(z)77|>|G zFKvuD78}SP9R*v8rb&d*8J=lZ)~$mx*)oav?y-LA&YtaiN1uJ{O~_boSV z+ybjf)_`nxpS`Rws|qQloK2b(!^PdFY#qs`(Y(iS(CeP~dfBC7R{DFSA+uSZKvHRNRA1zYrqfe_(V3 zz_pByK2EawiR;^B2n`1s(gdB64A^Q>~E2*%>-|RZ>1a7`#?+@5C0*~>)SjQ&-w;Jj%;iexoRpdfN)OXPk z_ncWD&s}I*OwC+!G9+)sGMV}9fdoi+&lfJO?2vGXCaBKFAwtkMe!eu#mA7pmCiAMg za+ZV!Z9B}sb6qyHQ(sm`H}*IhO&k@m04hPBA=D8yJ0zsOp>){)k<#J%E2ZPe(C9;2 zwHYMhlG{JzLGmIsz|N|EjKE%RP0@tcj8u->E4Oj~i!Vep6i)IMC0AR$!F1G^RIXd& ziG9QxNSB;~`yA)^I3!zQgKj8R?=#LWV|ot=ro(i|+m12MqE!VFjx#R2JH!{T?FSkM zdij%oa07xim6b~?RDwa5Gk}tmK;H=aaZnd zdM?l-T#s^_*dGO@-&UvFVCq&~y_idn7}Cd)6r&QNl4B}N;WTXnShqsI5Mk*k1_%DQ z!S9dhH~}7W0+^1N*_+JG%?E^)s;8G3+9CX_zRPoOv%-vfwpn&Ig#RpKW(|x+x?~P+ z5mfk}VNvZmEeZD-!yf8;f6ap&VW=xj0f;96j!Ejr7>D_rPWF-n8fEU+?%k%9!EIU4 zIlex`Xl{dTUM-b<-0pHUwb@S5cg(r#{)%~ok#UC;=sjL%i-pxlRM^t2$05tLm=0Hb z0pE{=1<5Qs;YBEqb7QVeTeT9Q4TJ>5{u&4wp%XhgYNGr&0vZpDFc3kWZt(p_7(%t7 zQ*ef%tONTg!SdMd**rgP2x;!Nub7F~t|Zr=|G7Tx<(PE2O+ra`Le2h~Yl|AT?+v=y zd$i6IL2p>++doKbOFbZ}YFHyuwPv)Wc?mBTfh#JbcZ$=I^GBx&@Tky1BIJDMflCHm z-hC+($}}W~AFfLf&-mbTF0Jfg2gjKgH)j=|1DQznv%}@&61{Uaf3v?W#$2{|#7GMhJM+K~KGuSyRE%MnZ0m-PcA!Qg9@B4&G^SU%nVoRJju8 z<1VAK<8g!0qLivLyGyxx^ZS1n2_c>hJg597B<+?5e<0?ACZ9Kv5WT;Rgw*^N3CVp8 zhqo?(**z}OlR?1!odK7VgMPlHx1QWIwlmi zkRhx>O`>)0&E%8k3)p#wL$}4^n;!A<2`#7thW<0C!~AbS9j(>FHGcwi z*nu%0@~TwNMYDP4iiNj&7Ga?eKpiWzCZeGBMtv&{j*m^V9;mOJHfrss6qyt6% z_mL31?b}F*VDtR8hEi+Rm5MYyx3`fHWAty4kQt4jRV&SAQ#*)rKqSQTO(dkFW>uo! zF%QxbsePI}yKe<$q*oir=g!JrKzLl^w&;B1GAuX}aqBHsa#-qhF0k!IRN?J}|5gNxo$>O*YI!qNU z4u#0m5v2zF;0nn@yQ`rQ>&J!+W*#So(6V0&ZBx;Xu9b}xzdB5uC76;xROF1Ui6^+$ zApL2U0f=GpBL@G^q>h2O?L*;yRUPATV4gv$g>B}&KWtMwHw!J8k4y$#Z_o7hsjnt8 zyDIQ{Dm6jdPz*viM5QHX}iy{^BZI?hao>hJ}qjv`j?Z=n!(-ukl# zUCj$;inl`~i_q&~b(x3K1F=T%ZX0-!W#@hdMzPqW-DTx&-J-UY>^+{n6ANpV7T%RQ zm6I=zv!dy*yFz53_?>y99d2d)9BwtW()v>-iPpX|0q`p6lSIb4S zxpxiu1NdDGI!Q~g6;`v{*BS1^&TToM=-JYYIc57|C56%?PmO;9KZ0B@VP&g7+PCrN zh!`!B3R?yxV61Wd?v07Pru>jFD7aFt)qzKa=?a;*xC=>!m(iN^Sa$6PddX(Nfa|*b`vSlzJ8Ifo*?MH> z2>y8nH5XB7?hi&_f`ceLi0A=T{^^uDB_L-?ogy$yL!-sQmoH!TjYMhHDGE@44n@De zIz?Nzw)5CU+H!F`pgGnyc%Wk2x1uzeW_n~MEY9dB`{PBk>Jt@;D7qYVXs9ov<)zXCh9 zo*WUpjfU*kMnh(WM|8O)G|4yhsr#MGA3atu9S8h##Umd!haHHeb~``UOa?Tqgh{&W zY{ge*{|6_K%@-Xn;TRp`FTU6byLMBwGco2BCQfsx|F+@52x-h=Nm+Ml=K2))Tp}V@ z`h+bRH!CT(z%cXPxl_V$e5J)m{&|?fF~Ns~$Y#>yg7UmS5IcMUv7;FdZYg$6v7rZU z=2@tZzsrVvFdhrCA$otwh7jLnL);pB#KH*+Oq)Q{RiCh0Z(vhwqf`9V3?enKSdn#= z(WR_Z1=2xv$3di(r~LaxB==*{&?KKchP~5&D96WG0Xeq!UJm5gfzHOH%>YVE&75_z zlCK z(DRIHx52UCDzDOY!a#56=&(ncrF0M|(SBui9RD4&Lk2bHf)ex(|H;{7ZS{ziX-7Hb zyJgEVUmW^~W4O@tywqOrDb#QuIb2RvLV7>LjXVF2*?}kZ>ElH~e@TbrS5|B&O!B*z zM-S>R165sGMg@N56<;5Zr#chgnAQ;?PQ72-SvJg`O%HZc&8v3~0N;dZ_YAULjPvPS z!ppLWFaDGcVTD;?)(^c_Qs!r;yBd}%}RNR<>TzrY@`CMKP7JM>*Q(t zDZYR7r{ovCas(B$;wVp}z#f^DOwi6t_G{-Qh3`EtnWjCyW`lXjC~)>-Y>^FeLO^|F zirR71{S(6@+=fec9TKkP9V{F+E3xAm_1M}R)%nt$`z*dC3gOSegM5g)3P|hJjV$hP z;s2HoaYc>9k#7^4=Ce}lW?}~053niiWM`949>}Z3!r|mPgpMd7K!#_27qx`oR#VAH zV}=@F1Nqw&!CSd*>V~aOu)?PMSvrgplbhQ;RlM`%bRrgB$ObW!NX?mz_>g7hHjuM1S}I5>A6A!DXyYgJ)sfusK&Q zBC_*0pthlk=wnAp*Rr8nVG{c5RZ) z(Q-Y;w1JSabPx#X_57A|?B}L$CU|^Uf1Mu7}cJ%9V{jA$%rm2)_WMCT4D; z$kRgIf0L;2z5Pu5yF$3oHC|xQ`mXwg>gIl@2mCb-7r{(Jh}hby+d4|qy&2D}kF~@0 z7J6vW9l3KyTHYieZ^kE*-(Jiaa4$&8r?&73PsN;$+=J{G5i2u2H0L_(*j!^Jz}J-cO?hOaO_B(5y? z@8KQ(C=Gt)96ula&_mRP`!r*>?`zkZt!OdR`-4U$$GYkMj@2wXZ-Exxf&98(=PkS= z?oAfNl~zYz=O6Fli^mH6&;ik2j1Q?2JYSR)^zZMjOG+y$DoP1s13CJWbF@;ab8TQ{|SQ1%SDYDs}U$J&bRXvc)<(P^j75uFXwwyOE6z zotv0vSyU)p4vi%97m_Ctj%)NExpDk8iMT8K2MQ ziKsWPCM4hF9{d(gV1+3}^rKPRY9m?tb$6~hEVplZ64pq(Ut)^G>-prXapiIxNQ0>k zdT!hxzbBuL-+}x!4uU>E#qW@VILOImW!e5v4!cnCmB)7wo{j$ILS{SW{KB1qxH9N? z(ghoxr9~EfuCrhf0%D&qY$C~Wa@2XOp<(iZ6a&U-0J-ey;FhSs$!jz~*t(LHRjdF& zS8N~}-j}ft4{0Mk6dbR#xlf^Xje|=XFzZHx&>6>la@fGOb|bE`Jd}SoA8sSqdQI3+krZ^fc5PW#OC;hfXd~JmeWy|p|6eMV z)-sJeeYAus<21EAFM>@0JQNxI7k>qK#Ey6x+clk6M?Z+4y)>eyZSz|efZgCc`d9B2 z*o}VRqWyxdI33IbY$4Sgn-yPVn#z6oIH$c_4rZ{d&;N|S z)DkOnLY1*B%N3lGX3UO7Q!o!Z&vXy5=@o?qjGgI>aSL;wPODcI=cTAW_M?~3?AwfAHr$O?j#ZtnOLTLhxwEt^TM4wvb)$n6gu)-rP9e7ow%#Ww1 zdGJTVBi5r74JA?PC5sYB;n+5#Gm_|U`z6rOZreZybRDux*l*1%4=@$&ppA95X-03Z zLvdyK^2c;WWi#kY%Z7)Ct0z}$@jq%%?-Wwr8~-z+Et67?)@LmV8C}TpbJ{Yc+i5wx zC3zkpx$*8APD50cK3b+*bn}{3jMxZ`m$>*kEV^BMF5QNX4h6ZUG%s*6jg!9-s}zau zPlxl!mvh`zPCat6w-v(YEL2iNO_YDom#p`IZPUISN@q`6IM0d=Jd+#RCJO!**w@wk z;~qTq;%N4u5c23r*Aj6=4@3CQtdcrqR?+%w)?O{kTsv`0piVbGM&E30Zz#zcrXwpvdT<_5TMQFGV3X0 zsueizQZziWDd?HVk5~*VV{rmppJ(`mR9TVcd9weDGDr7HZA--#uDpsHP4W2(7uu95 z*x6M}Yig<-F*@V0knB>o9?qgIYCtiw*CG;~IqDWs2;N5D?+m{|vM2XbLO@LYD3neG zIkf>COaa&nWS$YP4m8&)TipBIJ@L2eJ-TP{!#n_iaQl)C%Vw-R#$Mj>OW zF809$b1BGKwkSF!sB{5rK4D_Qi#PnuZdk7chJTL%$I+lni-MqHJz}SnN7c0HWsHL< zA*d_v*H-MxM51&LC{b`f+wh(ws5I?kPwvdO`}P5-GCz7z9_*PsRPr0dBY&2=sY6&wy zTSfcW2ynL5Yxh?3DT+rObddL%<2B`1g%8RQ)2)UMs@WG_5tdWADv32kWgg_x6DWo5B_t|}^m8-ZP zgk{iioD_;t2hTCM0eiB;%I%BUaBgXjkd^bt?dqv>Tqe zvM4@+=4fW0y8(|$5?IUch*6^+g07$4-KXp-{jXlU3aYqW94y|GyMd@^l1YtauFp%( zd?*;-ezTHX>+JNo)CErHZqf6NUj$o9IoMF!g0!6BS{F965KRo5xEW#)(0_((!)dsw zvjfLZ2^wt{90S7HFk-1v>St%Es~%t%$w^o&p(9eKOtIPoINHWRqO0XU34pfiXDDZD z%i^GhacXmYq4%jR09=ejgWRJ$r`K9u?x^?lv%x21PvcL3N}cG_TOwFtfi6uz379@< z^`09)A%r!HOgJps7~3h{pBD2RL|TLdx6~yy*8JB?9g$n;oJESJme)@M<1)5XWxGT! z@V0BHE%bn0%n0cgM|Bu{M?qx3!#UTYUEo^+C$Fp)golsbn~M*ZS`OMH1Baf+!owjF zzSVhKXJS*Wb68VskzBq+65(8X@_JN}I(f;7ky>D|eN?3#=P1`kgKgiNac-(jGpxDu zkh=y%Ktz%dI~LTxbjL_;)XkROn-hZ{sJKce8GLzjE;< z;=H9-D9#ZLC*mvvS?-XuLUvD~u)e&5&RFBqDZ_Addy_DF*s#ras%hLt5D5dx$m=#z zje|`4jbo`sWTdODxHOkjR`+T)E~B~o}@-ttGg3f_E@>Cw8rI4W0f?BPWGm|GItB45k#*fE2n z_m<;vDyL*ZmK#d5!~zlC)nK^?)87wYY8sDl$aA0;Dg|L}t?oq*{s2tCR9ho9GBrp=)_=*xu0Y%H~w7+PbEd48F6vjiPA)gD>RN z%sy=buJZ5q z9vFU{oZ-0QB2wF(Pk3+od7$>#8Fi#EOA8lN$EdZ9wHviNYo2gEvwdokzK)=KCW|1J zEh#5HpH{G9^?wUiT*YyR;k!*h@*a>Go44_e1>*qa0Y`J*pgcly{nD?{QP=DyXLR^W zjZsGE$O^G$W?}c`)0QlH2{j_xePl>=bEzK;J;NK?RmaXi-O9Ic? z3YM$uCUEZD4RX`@b+8?s;P~kP&J4cmH@t6dTAO=GelQ;$GnJbTyfl6lcRA5#dn4u6 zt8;N4hw45hcD~RTmrSudMDydg3C{Ss;TyT`7#W6@Ym-M&-8H3d^Z82PtY%t7m$1zA z#(tsbVVpJ^<4R0|^3H&3`+>;SMw{kWV8pYS;UD2)Co9HouD~S~ z#XSPo4qDvJts){>bPPlxG)izG&c)cl)o~dwu~J!nsPMVl#4j*3HiAFzPRv?Xi||D- zr~W!!@kX)IF@9zIszd-_9t9h;MZotb*Ur@z0UvxidIA&yi6<|KsM@gb$A|l3u0HoW zjZ)}m#_L-Gf<;6Z)Ndo=XDO8V%^>l5>XNAJ4L_l`9qjYR0uA8PAz=teCKKZD3^{vBVQYV}GQ10HKZR4>H%p;%%qC}<&sqx$Bo*0?WbNYaA(%}`R@iSOE2J-gWTg<&8{m-lSrZ2TJITt$ zDand}Ui2rNhsT`fOcm9|SKcJHqRNj&f>Lo?ImkFgXclYv=l@A~_}7g6a4KAwadDBp zed?3XlsTyHkq!VrjO+2J&zRWDqqhyyyvQvF@Y{g%lAE2Q)JI!RG-Eiz1ZQt4CGQaM zH3i?x!|_j$+Sr8e{HT>OFJXGPH}%KY2sWfQ508g?wyqC3DE4M2{*;#()GvMX#4EQw z_8=vhtl}1(_EVj#};d z*0SRHt7QcQBtie+U!OqstsDA$NDB5S+n64E%hA-H&6W|g`i!4n9K!reK^FGf3I5FU zIIrb-96tIb&1MvL!_$3`V+g})8V73L@;r((VFHBbqOR7A5db|%z5wVU>H*Q}oyGrp5y>p-T1ge9$b`B@={|>Z zYfS8OV$LtO-|%IH;X!P;E+_EZ4Vu94HS+hK6@&nRV;)E)xL~g9{L!<5pg7-N)Jz)aP=-g3_cBHImM=ZJB-v4J?0TmMi1C;>1G-^iR=p z;kA(#NeD?(iX#OfJf>7Hwv%u|uxMQYld#V$(nA;vzY4BMeM3hAde~5y8J-iSw8V<` zMDWol@gvZEtlIovoIOH53ej|b6h3y~yG!1HTX5MWvx6BQ(X-vgz9#0|e4#$f-nhpM z7JE?d%SGGvbHWs+*nYnV@BVUbcaG&xXbJype*6#HX#ImWnxfx{Rs^8JD^CbMllcrZ zn6#pmADi{WU%V5ofW^Xacb*zI&NR9pTfHPUHz?okC_1Kt9D=`#+q+4kusXs(2&P0U zesY0x1czAj7U=Lp!{n^6n>2D{ac!b%TKkJ9fe^_=WahJ`dbwU%VlExCQ-m z%Gu`Nf~SUiKfS;2(NnN|S_j@3>~b?+A7o>1>jUF6E%QSarosI{ayNQ(rEM*{*E!Km z++&Yo(T*H;H$#osnMRo?8=w5rS~>RP^}%*>xTs$`ZgggxW3@SDz-t2pKRl0I8R=+@ zz6AFU{c(msheD{uZ50@WJ3W1rzht+GgVcZFm?mJU#679brLRfUY#k^+*lHKS^zH+~ zmG5M=7fAi+)_(3pGRRndnI}xK8hbWbgpW$Y&Nf?FJZ7~y3WFJw6-0CarsH_ zLv1W~bGa3+;`QU4XGt6H@7vb;jRL5a$u2asBc;sODmAE(~8+Q)rWqG0=F6oJf7MhcjP zjT^VuPGhUUGF(Z9d3ZC>KPzHiu-Ju2^W>Nbbx-|>fvAIrs(9R+m1!mFnHjG zRIQ6h1~rj;sXp6ffSU%7UzqU_#|MK6^Wm9mf6^mz;EEiPX4F-c5ZRHb`E-SRKv9T> zJM5hx#8VKJ{X83B)0QRp>0!ckh`i{U!Aij!BTMTka2|OJ_{gO^C_z02M~_Iy4ZeKI z>2$H`tC}kAjuTsX@ZL~Q0n@Uyyt7+QMvNyF9xVrz$=?7U?tun#ZPN73?SbVOm^Jj5=^GiC_I+vpdU4NS5_N84tNVyH-EnhhDmgj5mqq7* zrGFprvgE$Qe1sMAe{r&7A?uTWAtCybYB>*R)q6ILgmKe3Bf6sd)P4mR>V~!Yr;A4t z#x7K3kIz8cnLE0h^x2HupG(`}(RtxQdva**U&Ji-e-g9!|3S>c2b>Srh22GHzs(dl z#9t#N8-Q-}&2Rd(F6M#1aWVTYya+})_~8x6Ez=3F>=59?$uMkjbr1RfNyMWxXm&A) zoWhWWj|XN{2KfzEPq(0~nyCV#(-nH`pY8T(lj!V`L2!V->G1<}q3NuJcV?crmzsw> zYIK@=`LvC{@eQ4jU1-6%r%S#EQWa zNEKW^XNe;jz)Y(uIrV*CKN_Ec529J)es+k+dZ6iDw(Uk1MjML40d(KtNIGG9I;nBfTW)Wihr} ztyl}z{nYl*Dy%xr1-GQ>2e8h%|BV8#?bDf{@|-(SN;o~u`mrSBQ*gyYFQ=8r1n|@;u5N5{`idT zU;8fP&h|xFCaDmjiLQgGZWCTY9=vNP+69OxMdn7x<(c=ZzQ-i@x1t+oAo;(BCdWxe~5C1_+!b=oUldd$i8tSo|@ zCT`)tJ9}!}vq@>Td3BCX+!(-=6Sv%>Hx$57%`|@{Zz~vzyZniTi8$&K#l$VCbb0iR z8B(zgJA4&^&z=F|3)FE1PR~NU!~1qTY~HwXv2{Z2ao!N8WPfb=;ug&hw6b}30qnx=w6Ox1WtX!(qX@tn1dOT# z4IfU0x)SayYO;WKU7(>O&$g#sTpdF6*W^U%wC2H-`A z+39{(qfv~+u~4?L1W;2m{)YnegZ?$zOHdxKTrmA5XuI|jWOyjY2GBd~!3_2wcR%Il zecvPTTT+QCOK=`B{7Nj(8QY>`3|#O_1ygj`&|rISTrEiUQEf`X{+domTFW2gfN){rY(+ z@I4H5b|JM{6ehJCC}T84l9VI}o|^tQvoP2vjv z$X(QNDyest7g7Uj8Tt#7nKPLe0 zjm&}-YhyUfXNvJrnkN;|M?U-P|L#qIS7T}s>Hl>R2@A>pn?)oJd~YxIAL&^FTrX3Z z?Z)Q+_p>3|kIy`y#%JN`pX5F2O zmO0Rqtfa<^Em77%KXxyTE%TgC^1=_qFR4*WYp8Hcx-3~-R>nyx0~eLbK78GlmfG+K z$9S<~%*OTJS7y$bT`{?4{YNV<_;XOy5cFBKxTU=icbts_PL$vddoL$XwA95U;FY~G zmXo3g?j|E5A#;nlifS+c)cia{)d9~40hx(DP)OHyeZ{{}(zRE9==7482OFo>k6U`> zS<|l{JGJY_m&g75n`>)pW6OgFt2WOQQZKec?Mtp5If$uTbS@p@?}KU#={y)bQBA84 zPQeRHw_==3WJ$;uo}u}~V>QtH2pVQ1fNhsIiQrgr@-c8BoHD(Xfo{_~(+e0w;NROc zk|4AlcuoefRP;_#bMQpP zwe;L4n}8KgY+ zVkdm^`tx5)n|G(BhkV~Yr>yDzpM5WRXRYD3@3 zR1G+jEhdGJf(fkCXk2oErz$__#KXyC=-B^s_3MXacKabbHElS*x>Ulccbl%#Yq4@d zz#z&JN#ltIuZQ$rpOwY=g^N2$8l80e6>p?;57==JOwr>{Vl&2*Gs=`dc#i)ND;iH1 zl_?(@R1Nu;ce003A5ziRVYQUepG*LVm$z1!EK7&>Y#B%2YCL@x?Xh+yE9;JPq2>L3 zb8Yg{V|Iz3B#(1?9C9(Rz9qH$`<}Kyx)J-3y`_4U0z{e5QGuN*$J3n<793`rpWXk$ z`e5I+4CHw`g5xBA^o;AnAmaX0=HktK{iOsxhgznHOwFu`Vv3i^@1A$keQ<_m6`!pM}O ziNir@6E8A#PTm+h!OD;S9)a3}M#x+73zA@MUu59D5!{~q>)#_QrG9!?3|}QSWn1%^ zuQKBagUGzPXfLBaQcR{viVIeUaJrxLvW(?qC~BZp&#^S=ed(M}dEjI>BC8o%@PwVh zgQBpzm^5gLjppGucoZt^SR?|aNE*9IwNbu$1Vxbp`&O14o1vvA&5+VZEfW*bBPiO- z&9yZx8qU1C<1az&$Qull1O_<5dT zAY`CzF*k@)r~^kr8;&25_y|jjf$gog72e`Wrt9JD`ikhtrVu_@{>IPwwxN|D=RKP;>9^zfwny>sy?KT?TW|4fWaSBDObr z%GuxNLke$;Ob&yD(qaxbRVdc*gIn=#I+Yvyin0dpt&{YEqhoSVvgHUL2x%&d51iI> z)e32h2em>P57<-WUct zND7yh;JSzRaSZuCEpkW$cNzj_v7IOtd>xo>vzg^u>fHwJwP^{IuDgz_*muTLd5P$; zW>@)u$;x*wP3qQ*`6P9pf#+nW0SrG9%TUG|kS5ura9IvxBFBJ-sztBHz1gmn`qqa z39gH8*gi#0Uf}YLnIm0B3r)+qc>%QtBu}WNjmuzw1Z%?Ium7`O|2xY~QSvmF8-Vx_ z3k-8IRP`C#_yzI)f#;CmH9S+voKM#AO0%835x#};RS-AXpOYlvG_a!W)$z^tAs29G z%q$xM{EXlc*?m@K;+kl=$>?xmBoriqQpMj=iu_y#y+~LBWH+hmi!gaYx#ErHrVQMx zVC|3B6llF)gkNY!rhWC?wXa^QJanw(?I%h+J3F570$MnN)`-#T&S|P6W(U0?>b6DC zcqsAIy!0gQ8Eq@EBawdmkjg-(?#pwU;y9>W;lk95oAei&!e{lbC!9+G?t=7zIJTp7 zV(+vnoVI^Z;lx=TsWS@&mtcJ-Pi&uau$v@x7ne6_VZS)!4*O++xTq><1$Sco@X)Nw z?80E>*-72uc+~=CivHb45S}nhvHE;n&0y4*6%ms&qEDW6R2_W2jSmxGSr#kVr(wJg z0XC>JQ&fj5y+WAX*V41!z9EFi<7ytSu zDnD4FEXz=p#gfzl67rl%`|`z#fUn(J>iYK4A(`or0Q`Rg#&{|tw6q6o7Cev1TE=9p zm#EWTTU?4VI|c~Z^`Na`v;6<@$^MzFGVnFV7GSPqqaEL5PZQU4_`QER*z4$K2y8Ck}g8#DXFb2|;KV zbDG4Z2+3LjzMi71L4AO_zF_?SqwYO}n%cs@Q9+a!hJ&Yjrt4lRw-JKfS46^n4r)kC02BOSi zm&)!j_q`zR;v>CTHO8xQp8G(Hn+(rtXJo+T7hdZUt}t{+Umi;e6`= zVbctWFMv$|mZ(XF5O8(;uU-qjLpS&j0mOP=+xPA{%k9B4`*@*I#v4c4;sLv;ys6PX zm8<=hBDReO5iSh5}v(IMXPt=P{WhPi(D z)v#R{1>8nsDsza5wriePI6I~}0pmy&S5b-kcnW7nUyAX}58?eg6J_r;lr{}-Vib?LCIJLkZG zq+e=00*5MwMJ_4fQYMo^4wZ5{2$>!+_)iS*&J0-rt&z)g8)DDNnwqpSC(3VyZWV|= zoyopNufwI~a)Vu|zU>a&7*I$nJ=kh&Va`QYGzdT$;yZa?W=KM@uXS#lRDp;@nE$H$ z3HWw8QI1;v%Z!tfvRQE@)HQ4NF(TV={_tj$o91AZkcI017XWvaJx+WBpZJ^CpC(wK zh^?QSjzQh8ey`5oj8EGC?inBP|33w^LkG!X-g@-s3OS&tF2v4->w&X>2)!{Myj3^| zn@azCS&P8`&X=`ZvK(>?{p&7Ws8ahOGhg#vU=h^Pugi;H{4HlI{FZ0Kp!4A_A-FV} z}-)eAG$r;O~xPcI_izjcK$6dBgvaz%HxsPUiPVWoPi< z1#Vm$(%2g+=fPip$@c0!iSp8ozwaOno~j^`xo7u6Twrh9Z^Z0_f{`iPqPE z$!UL){C&h6?ap|G4iL7N>25vTEA6yy8Ezb$s6m=&fvN)cfIMnrp${i$O#vc&Y9(D* zfa-igLE8V*ZJR~Wrl;nTC+p+Y`?9Ro6*W7_$PEqwFqwx!<#HS?glC3%I0% z&%$>-FE;A3{@U5kU*|u&EYG?u=}Qli%lucC#tkiH{(}*&vcZ>_*vooMQ|oDy0`uh& z)a87_h2fC*zXgs3h{NKs$~nc>#b5m5Z$`)(b5b8D_=EeOR_Dt2yHG9uE7bW^4g?+c zc-8-S$`!C8aJ?TqI; zAwOi0J}-+l#tL=yU5+wm>rS_I#pYZUjO;Q!KYRxMS^h9L1njmazc_Bp8Yfqjl* z@R`#>jEXT@idGA?)K?hr9LHOp^v1ZY#l}Sz_uiqkJRj2p!Q}ZNJT}FpK1=GGar`Bw z4KoA6zqEdGTMcQd5=Z%05`;98f69&gbkmedt*Q6QJ6`6jjbhpA9@(8pi?=0bPcu%Q zm~(KP3sbuvM4Z3yU#Zl!Tt}4zj#x!@dcqc1Z3fm5sFHNJv9CLM2=X{{*YRHcD|#Fb zX|eEXju1N^wi)!aT^7THg`ZR5b*I3EVEizf7>WFkAiR>A36tV4B!^I~pp((^`M}fL zqjL^r%}_!P@RPCTKkKCH$m7V!9=#l)`Zniifk)FUW++veZ(jA>gA0T!9P zAZOdb^PiRfm_)YwYkwl9lmcQ3tg(s8LhI$Z%SY=EoVAsV{6=qgiCrk%`K7h$Gnmh_ z3!0bcwE^n6mF5F1>{Xlz-N=WZPPZeCh9KJ#WBUpTFN#caq@Xj2XgkIY>K_ zj&t_m%XS$i%heR#$Zb?|sK9ASqjMU1RUC!dD+gNL$DY?E_(*eV5M;{hHp#b# zU1P?T7hSuTNV+oBN7a1g!z^dF{DY^fS9+BZTq-1OQ$6g5+(GFMbNPZTq~i#YBA)rN z3KkV%Sw*{E)|z6z%L%<|`-{;G=l5g~{_No{vNcvRx_dYpTzo08 zC<3dm2 z%q~R2PFAmPU&JH4PP-0G#1kj+?CsjG6bXE_6Zo$hW!XtfL}5L_2$xHC;;M$q^E zBZl>04CvCr*p{Kaz=jRx4UO9>Pyd{!-@;e?w@%Bzwk8L_SR*;VRnN9eY9500tI97%&_)z$7n4n=J}0C$OWx}s0qGrja9e> zIwqhe_M}JdVutGaR>^%b_V!L;8upmZNO@|0RoktP_>oi%#*!<0iG$Q2TEhl;Rzta( zMJ=>GjTE^Db%TU+&f_4(T8ftx7rkNuX(XcL>*b$sM)dWEDuQMzsKZ7^^HH`gMfXec zj-z({)lS${b0S%W=(=w_DNP}h98{0`i*>?Y-*BUke| zvd>^(vH;bit9G8d%{z%xS(klnZNc6hV_Wf(Bew4fH#5K2n=6ZH(uYds=jA!EGxqOT zc`S==Jc}-CyhU_@SMG1c@>Wn1&u@B|FQb|SQOw_fCk4v}NnG6P4jgyhn8WvxmUYmP zn`wK0$ZwQB$s$ch#K)l0MhG8Za!TEe>eiAyX8rnYuXhpRx5IgTZDXUCMV^|7o8EgN zc=7ybo?p-JSM%#TqK-!8aKHMKjp7b$gJ<+vjxRr$FvTYrJy@=pwCHnk`G$h+&UwH? z#eRCT0GmQOSO6HG9pwX}vmrFkKYq42G7I|YgA4_}t*-nSQ2%JL-6`8b-+M8X8k%MY zp>b|LnD957sKhKqhUcYPNNQ!cwD^2{o^D^%Xt2??UD?NXqxE>e1-BDLZRs!2ZPT!l za-)yG)gL>dp>a$Kj{;hcnt!bv1f3y3i!o9=_hyu%X_G-$IVVgUO3G0%y5fz7zx!y2 zpJ4y?Vj5_z?uVCY{n7_+sIHcbzQ4=fdFyxP$Pl&^Bj#NOiOsK76XqO~BywkqB#~Zz z9TH$*Yx`t6e8_Nay=IO_P!|AK@-Sg)=uRFMkzv}GU>tS{~NII0L%_#%V zH!YE9;5Q#Zfxn-wzII8{en4chzX{z8H({-Iskp{(dZ`s7cY)bGL&K>*$Q(|w@RYaV zD#`HX9?m*9Imup*#rSfRN1eMfyxy*v4D%S2;E+C9%UMh|v>?2}Tm7WPc>;DY{%TZ% zy56f@85b5#@BY3h`51#jbc9k{d;}fYWd(@361Q6w=B4zOHH%I^OT2$H=V5s0nfLEv z7!r5`1L5Jsx#YiHzil}NJ7154+9rSf!8(O^f43gBKdmSHO~A!n>DH&~SJhn=7OlBP z1U)feSJ6eE1k!Q)cifLkWv7PtAcc;@2s%Ianc?A7a4u@O3PR$~ysr;}g&Tet(#+Nz z^j=2!7drTJQz1sfQR9Z_#AsM2$I4V0tefBWxXr-EzNPxe#C6Vem~}yFt=N_n+Z#2+wnk>A_>@#mh;B|7WUjF_QN|P)0Pf# z8}cY8R+dOtLqz}cyQ#g^3>T_{S(jEBjuL+a-TXbWpj(n_pU9ci7-TOn2rRS-6&e(0 zIXj*AuhZ|_AJqcglEo~zw&CE1>|2}2)Xus0xvuA>7SYCtFTHnN`y5VnP~TRsSRo6P z+uL)O4;hbazl)_>2Ks24@QLW@@zpQ9E&tVWnzE}pke}%_<2vWo9cupiN6m|(ItcVr zQ`=0?USd}6%d&q*cEAVu0z$Y;^MOHNbbI8ZZ}elT&oi8AcY&WN9mOD3J3=hD^F5v= zvK9^?g~d@Vxq;SLE%C*Whgnpb5-UmNK;7kS=$r$;b5O1CTZq1v_vgseChx_~F|m*oN*}7 zu=p2KpAZM1Stb2IZKZp}$kKH%{QFa}=tP1!PWEz_0G^02UU2aG0|qHce}lp7f56~x zz^!QP+cVOgqUg#T-l6vPDitIqS=AMd3VPCKCRh ziCqwKi0)eo7P3W`(uP&8>l%dcN%Pm{QvpXm(5lg)@wbZz;EL|-ALg%;NRwuW@=(;! z=%BF_inhss5dIZMt|Ufk^s&%NJV7g9zKlmj;AV?x%7q_qUPD1(2{EKz?N zksUkUu?-IgsfoG2aK4_{y=^VOy20(z7VM-Lk4Q)Ioo&gCYcoEeN zg6Bvod{5~YM??iXP1-?xo)>;N^P4}lxU2JwOCgN7r`s2p^m_!+zgjN?tt!!jQuyCZ z6|={@4uR=t@t#nbv?Rj)9!>{+@d6E{u>FV`B^W3AX^N>MLwqA(D zexu*a@>xyum+fbxdjGROc{3dgCt}~6ootqMvnw^U62OV4IC&zXngLiqHR)zTJjtcb z-~7tRv7!t2<6O|?`C<=8mYxS^nTogUZrjxkfo^);N;bixFgoXtpx3+KE>1Sl2r@d6 z$hQo$zSDnU{@P94i~B`lYd)6$5nETh4Hke|olJR0{+-451%4|947{z~W3-yi|=eht0Osx#Pmq4k~_A~a+_jp8%R#>x;|KEVZ0|f z(@CZ=OJj-t{M9QO{&9_LB?=C%VEb(Mc)ZI_M4#_vM~shsfW2kZumC&4rVM54Pz07L z7Wu3aqTwj^+4jmsrK(2MqA@XZ^Q~JFPnjz}gYazjUm6;Fx;x&*P1G%jVhGINDIHZl zd6=X%YHp~h_pEo+bCc;N{Du8>^$=0Ef>J>q=~q=oZ<)l3*`AAr zZVe)9{AJab(WV<4gW<-q)lDsND>uA2dLxaPEvLx+)O0Q9M!xJ+hpecZo>b-uD4X0L ztO7coF&-oc5goOx0}AF3I_^6gz5_ z0#DYffN|Cc8~olQa^ZO6kXCBey?HtIpsaf2Q5so;dTo~fo?0zXP|uZ1dt)RwzUX9d zb%TQZdnPUXw)5EkD_b0ew)bE1esQo|9QyM4&jTg?Q)E8Xyw7x`*F*7 zjSATG*+M_FDzz8opycM)Ge7a#D(bjLqIx`)9?@_hBSe=LpP^oRNN#j^{wt^z#&Hq7 zYgU<831EoiGupH|7`p*a>)9Tg-z*KYGhc5ebT3M1@LqJcWc{H~rMEx|QR~TgnV_FQ zG3+M+T#$3m)VYDJicWydG?FND`W8*-&1-?&?g7*w5X;k4$8SsjAiV_u8{@)TfO|#U z-Trda-~4Hf2N(6rznAZCO9h6n+dq7?&Ti|1yaxbKl(^DzRq**c>N&i;_Jn-w-yUPq zTt%pBsz0)!#1~z4EZRm0)OV%BO=z9%RbP`+Q$oIsm>IASI1xH?`s4+CBWkHql zZpnGFtGgOSzfQ*cm8?h;_|>~Ssp2*$MbiGIx~t=2FSII8GmU<*1XH)P`XN%C zj^50>c_d!9J4NsZp*`!rIFd zBN)KSHOg*T-ghng)!qX+Saf&f<{k%w#9P_xhJk41(+=;Ep1PUc&ptLeo<$_vYZBj= z32f{K8nR6bjz4v9JS=Si=c1>=cSrV1K*WGf@bm5h86+cTQZvNv6udf|2oQt?e^d0- zseM5v)qA5m>a>e#wE{LU;kieUFK-mDRP$q?;P3TiA=~^TKyrlme;BGgi zcIs`cdT)^`QpevT!!Mad?QHCU40cr!rq*N@?z) ziD{lswP|qq`wOs|D?10?h@C9T<8u!ozGd;hy%bPqv0}-C*xk9my>xcQSK4l!MLo-y ze4gSK2ktSE1(&Bdc&ZJR#4F+d#8Gi9JL*XRNLDRLZNyaIC_-i%L#{ipzcIs|5fHV&B8r$xMlRgeQhAN+<3Q!_^Ug_bmjxgChre=R* z-Jg5`-!x&Va?^<{sE=Hm3qn+qj)3%PvLG)-7`!Xp8Q5u&Gv+f@?0T1XiOYGQNBsI$Wrz>C*v zQ_47~+$4zUM0vg)uV#ey0L1Z5?aa&K?4MD)XHE0xe2%r#&qL4GhI2ZA$73*7OhlUR zH6L)49U-a6wOmwON<`;WtvxKdlBB!Jx+Q^JW-B=CB7|?-tjhe+T}}Y2gIPN0aN2GW zorOfg@O-e8xL*jJu#1-lP<-6UtGbWdwc-hNl)RPk;~O41x1JxC@AYz1YfzO)M$w6t zez61;pJR1{P$*IKnN_zZ1;1YN`QfZmT`;?JT_hX756aq*rvT#nviygbwZ6u&gXO77 z{c5@cQNSbbRW_kgi8K=EowDXblPgEQ*4j-SK<_sYb^&(UqFC#(hW63hzg06tO(1=A zve_{E`3JxFQP-WF(Z3@ctL^uY;c%#E#Hjq3-1!^Pl%z{204;$U=+WPmsal6;>(bDBTy9&#==FTV`C~; znJ&jrY8fZmhE2WsTqR^On+0+KwkoBSGu5KeR_sb3n4+*ny4H*Bc1wECht=X#N;G62 zxr9~#>V_v70mzscIcemO zjH7#|q|+o11w#;eI#Be*=`T`h=p%{)wiWwAdW98 zSPDTxn33myi->vu(1P5BVyC8rkN3E~;Z1-(YhIXZjM?^};c}qW zte`-B55YYw(UpAm!t0f)%eS5dPZpsre)b3DFbnt9G`lc>uFe*P(b$0nt;Z50UsaSY>A@jFwm93sx0Sz$@|PI0d4_q+S0}4Y5#>NwcaK-SZ@Y zyYI3s%E|#e8;(MBBM16;svcub=PxbbV+Vf+rMwF1Zn!o>@NlL$ZsJYcv#p z7kc15J%XRI@G+s2LZ1f0-f4}2tleW-itDxTMahigGv0d(sl;SsbTUOZmiN>%1tpJl z(geoyQ79#2*(KREQpZlyam<)~LCkl4$up)66`EGstVY-vW~2+P68^$@|FbzdyToaD zd1mL1C+XCiPfA1t8sv23+XRVJFV-q@G<;9`vStvW**ThW(M*2d+xE3)pV?{nNIiQN zT_Ac=*y=uWM=M)0K%}lZYqb|#P30)UKO-WGSfF6oUb6|>AH~pSNQNMpE`fo@|ELvD z}) z!W@t~aO3Z=4G_R*o$Aal?mj$}>6uQ+R2}{fApV10;9<15c63C4d}1zKZ3IxGNco1e zf3~}PEAtR_2r^MiR${9PE~~UWZ$P~dNH(b!ZI4)_3-DIQ_?Op#237c^;P6}Z0TzS3 zumlv#4x3mRgR#xqwLiROUE8lwQx2S~dG7%I_H=e0O2qy3Nq-hD-o8Y-VuLgi>;VM^ zyxzV#Asiqv&QosP43UQr%6eyiz`OSy8UK&D^0ENn!8EK0whM3({%u$?t!s1F4ZE!q ztYSC0#T7r}7vRd=HpqyId|!|i==1mc6vvlhVLZ}d~A;k_C`0@MZ<)upKWYVob z4&N=cr7-JvPgSIRdwWYh-UuK)yX&Tz0V}Ws=HU$Kx`?dol4vx4&=?s?mvfY(G$&Cm zT8W`OMo>cSVz*sdMAqr6@xfHq$w=6}tS1g={y|@E%v17So1pZsRHSuX6a@?mN`m<@ zYfqnC=b2%vfWPuDiM&X%)w_mn94CU7iH!cC7~Mt_Ev+AGKb&vl1k5qhNs0| zFoh))ARK-lqP3&temxyK6?y-^J~hp^nD%~fv#d4nj+B?9(d!?cbhqMw-W8wPkk*y5 zpA~pwznJ>vEsJv0y^RB+*7I$b4zU(gbhgj_+VEoStTXopP)jzjsP%)CwH)PWqNDks zAX)Z!4yItWyY$;Fr#nTpnSiI}^!?krKXoK`cSsG2#yW5E`#-q^+W?0sf#OqlG@apV z{QwQ`mR;zL4$)ah-6*+nJ>5_M72cH}vuDN1*Nk~4qUR61cUV*SoA-4z6dO%lnnhv_ z3Pki*@abLU#dqovAM%rS!7X16?$jE4AN_c(u6Q8Y)byX0P5E0KW7r17vHV)+C(56G z_-U&1R44|v+DG!%emQjy@WCs)c^z*mf-R768?e(IjNH0z<9Cc*e|GCEU*dGDDzbuU z-$P^j5B`4=2}r*$1>BP){|I9d%e_bc~VtBxg2cVrGd7E9ZFkcUoPT*rkMM6m@ z4pyDJrIM8E<@SK-l6fh>`dv(TZjwmM)-cl=LU5blLO*5}4f|q#v8>{`wfh+*fkTlqFVLr#d$T=}_9hPI~i6Gb>kt^dgj85bLn-}8^aCI_AG zMgVh%2S|Ol63m&p)68MLH-CRDdl{)Y!vcdTURc*Z;OP?;0Gr0GmuUZ@_NUhWsBtg< zsBt7Xr)N%9G8VOpA$FMbrCgJWFCCL1%j$fU6&t-JoYekzmzSavSe7wEcb2CjREk>i zdzB8n{ipj<-6g+^+4_&NmlnaG%FLOLyCq)7(6D2B`i<%y0}06k?WU6imJO-TqMu9M zW8JTBB)!0?kkg=Nu*C^2k;l10@C{7BOn&3abi4yF1}m%6sQ6xonfSdi z8bkcq4@#D>b`l9@K!THSN>ZDOixZy|U#l3!jL~Erf7T7!T1ljj@F0LIMD1>oK|EfZ zX>t5k;DkrRwMZS9s68M0KJ@%61_G+Pm!JbM zQ;m(VvvYaH2vCZ-OR9D1H%ps{ssQ}dN~zKKVvUcOMv(Oz(7Qq<*`#07s%P_D0KAV6 z#!@7L=bCM3*aPelsu=0L?>f2wyQscJV}@05R~gVj{0eC z`<`G${(AOhHuu!_NB~tj#13R#>=*bW)5i@=c^#X!Yk@NW3uN#ANMiCIOTO=6Ym0m1$%PtUk|*8$wTb$e!ld#(vZ*u0t;K6$CTX^ncfAL zwSs4w2l{flD-SaRr&wrp4+v)ngH{wIOrlxj_LMSx1gN9SMBPK^Eh_*C7E;|a_@Uu@ zm>J?biH!iq{?a83k&~)*%vNSnR%l8=zi;r0G#SBvpq|-vmnTFq)9n09w{5VJW%4xw z&jSwT%3JwupLikfHrDP?NX19lR95*XuvC!rjyU+c0~2=NhT;8Ij~eC^iAP+(9Ek3? z*4nvDA`W3Fn_sv0P5Ewp(ibN{`Tei%t^z{`>ucs`IGa2MzaLS&5>l_L1ptw1a;6U; z89*L=tocYM>v;%LY~EjJzSNxT4mRYpinjsuDJ{O4UckrNo|^|?uipMUjK_DTaLNNO zBF;q`!2_&qSdQNKglhCMoWvwyn{or z9V6MiIxdEfsfw5i)aO#M8C0+lo+PKm4_S z0i7m%rT)}Co`>jie z*L0l2MRgxX1FYIwdjhj|UGL+2D$3M6-BMAi!VpbD23x$l`UO#p?)Q)NQu22Ohr3qn z8#mYV*eS0Z*z;qJ>X{?cUO;XswBn|vR^O`+P>j5KQbm=~X-Y`oO#XRpp}O6vf6NUib- zK_Gnzqoe7`lf^x}nh?~hBxvmvfDkpsda+P`n>k>AX~;~)jyX=1Tjd4TM*BY3CgDDv zN!d;_mrvbtnjNJzjeHEmTbAClymWNr#w0{5nf7lz*Nx7k#JYUX6+!wA?kwENXTj}& zAz@|{zEsi8*oUQ*Tfn9-auj3M?@2xXR9fxvpVOa3U>0_IRE_m)rJ&Gp$#BH;bq^e58o_0L4Aw2^Gr4OGA;}F;@Vh_h7X;q|Y4a~Q3|EH7hW1jE21Cm9Q$`kw(&H#{m{7BNT zK@bQMoLBCri$FNwW|xO`t;r{aDQ@1T^4CkCc6AAiLhLTG zqAG-EMg&t*Dy!?+#M4}b7agIaAytI2i6w@M?$FH;G$FjIk93C(O)1-z-B*Q)iKOoJZEMM6F%Z^xUeEOv7168dLNvT@Bfe;+5$dMi zdP2JXMHj|*orGb5$aO2JJdsxd|ING3;0_4*U4#XGk|ciG)mTkiO=3-=4blt=t0eDh zNfaN_k-f67VI4DdaI2x0fzAkaA;2_$|lUMWD5>v$a18QTSvg2+q1XT_HaQ+0$uw zV2aHCkb+2n+2UWgwJ(CpxtR7#BC=@Mz48lX7p0R}*vRW2%#l0^iEQ=LoIYo$?kWWm z;6nYnWc6Bqv3#-flefG5(mW>*VFOM9AhF)#QcV|cLo&#*tk$`!Q(LroWN)G+-GjZ_ z@3JCZSRo@5mf(qg67BHu6-3`N^5;j(sxBw}5Ie>%C5;`)0+@ zZ-N(l=BqXt?(nrjxg&MtW7)rU=MX0zqy}G`HT95eZC!?A=X{N+rj)~bXtwuifFl;l zoXSk&<&(K1VZHAaKE~8g1BQv+3E+As%2JbFyHExzllmcAP z=DGIno@cdR)NYrjDBe{I-(|DPFOk!OQoq2NZZMkTgO^es#g)mW6v%h}!8ehdieCVS zU8w4NC=DK|1w9^JB<7y(KThKvSG;|hGXFM?u~oc!xz7#UmlJg@s+ z7uTStN@ZTJsz2w@b2!>7dL*8_SY~;_I)V+M0=)dYU>F zhv6n^6yQYTl|=)_=Mmrfuz;ev6W?}mM|fmUiI;aGGo{?0Mx9yO4+!XC%2s93Yl8p- zM@0+))H1qR^ToDWh~4o@`-5gN!|fmyw_s4JPY#gFbV-iX`AM{xc1w|%JdOQOW4hL) zh(1-6nbLqT_a5WhycXJVV|+4Vn_%foS@{nEyX9T~;^s9MJRm@E_G9dkL=3?|q&#QE zHISm)6u@3Rm=#&F)-}+82>(ui{~?Om;5I5R zq4CIjM>wUQWHC&R-?xi|YRSiS`?}gSC=6=}jL;Voz%k2AWQyRa*xu;U=Avxh1^9n| zgD^HMfqZ|s3eg>pVdMb2KJ4fLAOkWHdpw)P7z0$!q+!@N^PTe`drPwY<}`> z$wU4eC-qY+e;GL9W={N|A>I*?BG^DGvwY7;uidTh)k;^GTM4aHhN|1mUtSzJyd~~z znfif%(Yf^h$gLMlCJ&zNDCx@|1O*yCrwFn}4L+)Y!O}iklwai;(yy{t?{rQ2tUk z`Dk1`U@_HBF8wtaeLl2tLs>xWBT~n|fNQ+z2x?^09aBP=EWw6YQjzW1l(}3A9F5?B zOxb)nvEl8{Jg80>X?rMOf19{r;)8B8G9D{*-<;rtHK!Tg4!#qFC;x&Kkf)?P0dBCu z_=3CpDxF1sB%2I7J@xmj0a-cBh+Qe!BF&PwubITEqQ|OaIv8!ylH^j^!;TVGZ|5;# zk`{Vi{4w`P-KX&W4-prD0r=b{$krak!olw-aHkr?$SkTEhJf!$bymAGn9QGB_Cu=zzG3UbtmN(@VMUV%O~QQ!HKw5 zWFD~2@yYXvH~}emxLeU~#`DUs!b|qTejFt0FyX^AFU{)&gJTlLs*)AoC5FY# za=BT%XS*-CS0*U>Do@(le`M3#Tl{fwjn}e`{P^JyiG%nQs+~bjerJ0^^&B451B8N@ zXw01G`b7pR`9KT^{x?W0HTz)3`u$Fxz6n>@CKx``0UcguuXb}tI_C?2aG&E^Ogl!s zQr0NJ;C{ihpVCC6Q{!e$^qlK|o$1=ln*D!g-7$ zlxF1mFyW^P?kU*7yxa$@9zuweE!nnW*tqc% zclyp11;~uWew3b9F?Ur5?i0U zYcrXs2_ac;hI_~8ulTmpZ48Y6WA5!=!(G2DXt|S9=3m+OP%>ydqd7NEqKkDAORF}R zkry}k?>uPKh{ynREmJFMY8^p7c(V0k6Xf)Ms+qgmK;*-yVV<|Iwz&C@x=pZ#7EGa5 zKc=TfKUd#k4=D>esv5bg%*p|!@uu0JSiw`moKu&HXW_cnUTFTXbQcN(y+FC*rAJ#%ZgqMSnbWMAy+(flxa z_Ny)~^_2waXB(QT#UXYuUjVdzK;!D1J-waT)Qi6%;8>x8+jJ&dl8v z=`DKQntBBc?=WPyEOQ}mUOf(vxIgU;9kI74O006FV)c8)8mz2ICz^zlTq&>20a~*U z?|eLhv+!x-iVpjFn|qv+qjGn9!5|?^LY2EF1c7650*R}ww=KuzvB#`dRX){`WYI>)B_z+X zNh31o_@zUNs58U1ceEtea~ny5gj@IXgPQS8D>uFfKOmA>0Q zH@))a#ckjf$*n>_G-AW?<}8<9(_P~0P!FN6Oij6H$9+;fKWE2ov7Poe)ENer0SDH8 z!vL<$?5v!YES_lvuBl1_&cE*}L$B6F@-^O@pOBW_;i9;fj?YM1{2$Z4Py`N-9c(z9 zODwYr834N(h^Ko3ySem6QEkJ70j$yaE=a=tSs0@ZhpDb%^LvYfazIZ;M4rko$Gxcs zb!t+W&C0)j->sK+s;2J_oR1ibOMWkY-ux?oA3+-*Xr_=ClJ7fPSP)_t4fj`xWy}oN zG@b8#{iu-n0maRdNAE*8E;~Tz;5fk)1p|M*4!ianSG0`yzNPW!EXb%iZ zqx*@iahDlu;yp;degJ1Cd_c%5x+9dJ0QfHwOb|WdW~$Ruli8ysYp4U%&$A;{S|zag zEbdts!R?~}L@rU07&mmv152!-jf-Jm{#yU~P<2QCWX~ftXVX}nEDLap^ zPwxUF|NVdo7tjl6f9N`h_I!*piLK@W;VCW2=9X)=_UT6X36&+ue--GNMwLSLQ+DZ3 zosfXYFiRa`H}P{VFBsEe55O=B$^}{}Si`>yr;H5YBZW7?9W+1fS^PNey_M0hWsb&EVSh6Io zsC(|=+}21@dx2wOByB~-FH>tm>C3AZslZWwg}V7wlCFEztv3X4)Ps=y{`PU4d`&4l zyI$}e@Rcz&N$sb-x)W-YS$YBph#&`xS_snT>*H6*k89Fn8w%ONbG>U+)z$JzRJDR2 z%6P~zsrKsC8pYQpu)Sp7=HPHZ?-KPs2O#o4orXK0O|HV1EtQ+@11E z5hcmJ?<}Spy&9bF^`)P^bM!B0mN@|g)atQ12$>5$+CcUKFnVJeNsKoRkk4tC-JGBQ z@SHSnhG;drnf*C|1DuX!#q~d;XnsSNMrxYgOgWb25h}h5Y<)2Xci>_2l*+tf80qcP z`R3hKgB$;~;c#txMk)eOp7TSw1r zXXKwe6XtiIUXI=OO37w0)|qjVKtQ4x4f<40-lRH&?KdJ+OLJbL}<>EwI8 z`lH;6C9rCc{qp@2auk1n07EwEq)>(Yj7HA2ht8$U=t_34!y!ykacMYUGsVS^62Qv7 z?LC5-ti;kMxYI7~0Pa;udqzbAqgLqVVv;KJB~ZdU9fg_n51q#&9TlrI-%-h%X|b{0 zMkKzuVvna>I*qmLQ(>?}=nekI=Ffouw_7wr=k>t|qk7SBRh%$=(S{Wejs0WN zL`S3fVHFUAR>M8CDc+K#sZG;Ahqv#LE(95XuXlh=(ylHydjIr?=go_4J)LbkCUI3 zIAvMo&W+S`9HoO+y>F&Jwdx2H$(UiCyoe1t%h_=u4q!ALi1_ZtajdI zyH;KAZlh=}cqC_f7RR&S`P~>!!!x92Q2S>3YS+CmvN$q^^(UW%)1@8Z=bI181U+Xe zSeSZ;i(P)+e-b1t;m%$fVV~X4J<+2Xnag*7NE>D$A9t1YY4KN422zGAw-S2ktLq=r z;iq)AuP)dq465O*r*-xO$0RDN#b+jajA*YaF6Zj4xv36eC{~qs%xy6|Kh^l&Ari$@WM_0I`nmV`fOr;ogdccuOyNni)g<15mmV29-CPyN+ z1nNDM@)P)L3B@6(c?(*F= zt&ypNF`eu^yuqtCrQoY&*{H78rN0?3m)(_z90m@wWv@zeR9ZFm&62D0#A6*Xwx;?$ z$IR{A(FT1oi0)TEKUsgk^y1&ejl>>&MCmpElP3D4^ybpojkcOXgFXLVZa;(dYVqL+ z=_C=#M0DmwPOhO-jd{X-Ml1;)5y#t%U}HnnKJ?C)Ybvq7*b+84&@qtKG}(!**$*?K zr_eEFlJ1`Th&`TR-|z?AuI5!@e4fiJxmc1yjGtAZ?`FCb5WwjZ_g93xroKp$(2+qF zGvp~J8v1wI=SH`ptKD}xMVpzVt8PTDYThzF1riH81N$6}E&eUk;un9CF-O$T4>UXs@2u7z)IzPtfBI4Whyq7 zBL13m&-3(-G;6c{TTIl?ils4DJ1IWpdNv|G!>c?WiGYYTEcyG7!YtpAai%Q2T z1|LnXowF~-p7lz$ak^FB<99wuiGrv~nbSO5%$^ZyOVRqag6RC%5BCd%{ha&O+WzVV z5K`~$Um9ZE4X{yt!VFlS1K?y$Nw&jy81Peze*3RO0Gu2Vc6e)sUBeF?i9?K6vNZ_& zo&8TbT^$i!jTP>fzQ@Voc1yGqpL&0^*I0<7#YhK8PzmGHP2GF?LBuFF?4uNSrON#GPSiyVQ zlW0+N{bWiq`E)vElJeq>rBAB~p^yRbw(r?=d5sYpRoC_EH1Q_F~6R(6-U? zZl7G*#Zzbe&H^xudlVp%#r&~mYXSN-01Z|0VAMC{F^c}L)B(d-vJSxjtvziAJ)%UD zh7cNsqwvFu1YKUl$u3#=^NZ%Z?YNtNWL&j}7XHS3UZy;kr6rx)#H_e%+y z`Rqw#jo`QJXJ3Ytru&k7TsDw&uWHUw#gn=}&Fadimxg4-ub4PZ=iS;OJY5I09St1C zFiGblBEGjA>RxknnXdB|%_IE{P@qg=0(Jz!Afy>WHUM$q z&e&#(#RE$j_3S6-m*7X0NG}}1cw|$9SRFJHTHERRsef0md#LM3jw!b{SI5NA zP=;!`RX9f{4XnHEFskY^kj}$btzPZf%(NJO=tz8jM9>$y)d^=22osoehPD=+4div% zm4lp-@0WIR6vVi4`k?V~Vt&2fgSAKXT67urzE>Le0e^_`D;9z?Ps9-$pMY6gu1@{= z%ELap#mzn5d$$>v%e|X9%PfcAE7BG3RixszPawe6nSJnm=Xxpl#_zRnJkf-ZuU=29 z`L>vxK;eW0C!wNkx`J|EpCs<;ZDSoz_SO~+P@}xy+N$YHuCuO4J*P+k{%SLN-?yb` zH|W-Dy1ZwhkOZqX2j8SAN#Q}t`I35&eT?jKg24& z2Xr-U6?LPI-z}&*EHZ{TzqKH~827BuB4h<>+KWiB_-sdkHg%`*#S&H=&39t^QhO4# zdW3$8#W_~G+^O7H368Ts^lR1bmtvfQ$&eDwhr zxBerRQMVjccECXJz8@T9?H%yYXseRp<7l0uK zpj7yzteo*6nSi&V_9K1}lK7*jPR=!s33)71HVT|DMiD*>SA&O`41u@xdu#9Ui$WZQ6d#f6UOVFS#TwJe zuqC%?>vLA0WcvNGoup&<{s=!<+=F$Z*29+XXnQ$XUaAveE!?GQKexn~nBt^C>tj&> zMfCBWW{wo$!O9X$mvpfslV_P-nlnpnQ?6+MIqVJC$JDaiD2f5L`df#VAaxh@rKikWReK@|)MDj8$vxlfLh>^+Cf=!NsiRq<<13;UZ zrm}o{kCRdwM3qUrQU5CV^$~-qzkw*ET|keN6T2@Q+(ppW>jx zrc}<+g5)kmS8^3WK3O7S2G`!AtQ>6>FCVfr5`_3^R_f zc2Gf>f_Aels!3&Hdgt1RpTZ|`!*aY-&L>9bYD>jSr`CMPW#6VaUWH&)XRUiuLLtlM z<0`KTSC`YkNT?Pkmqm`L3q@HXM5kvnUWo!bWqx817|X`Th;I)G8TlM{^4C4WN?dD=baxcQswf-#=;ex}q^$Y4^;ia4)!2m>Xy7u{4n5Jb5=cDxFg4%wP?8 zo32)E+nyC8eR@2xx zbxpG(W;f&F%H;j_8;1G4_11inAQ;OfLEuyux>t0Tt+q4Feullk(Ji_!=^p(eaqz6m z#Prq1XB{BIYMMo*odfNO<_(n6%7t#vq`uzo5H8NjA^m zL>I*HEd)tIoR(bAO63n5T3d6|o*=dDJ6zR^MIxD`Si)!5ez%ARo?SY4cTo7un1|-E@=OvjIP3MD`<8lZjI7H1Cb&170(+LG2MOuTmMfcDV zx}6`Bpq_E$3q?ri!JzI#;9Iw3S09BpYsIGS414`mX>aeXyx{aWf-a6&^jGA@CLBan zqB~S4#YFb2H-{IAwcWTs52-2;DuJv4hn(uhizf+>zCHhHh~wZhJ^ZZ zTCzJB<ra|DCHhAFGzkH13dQMq(D9?_;Kp6;aB6h{*89ces;E){dHrhlkMHd{AFf8++OS}f*Df1; z@1`l~VTc=EY0ZJt098sLQzNOCq19&+E3)vNz54EA3r6vNlk*TQPfWiQEA1+>&qSCi zFtC-w=;_RRkaBT32>|y2f%pnn6e#~9Vv7g-THC)*9>3#S|C^Zs#tpzEKVl!c)4uJC zNrJ`tHf2Bjqch<=Q;jGw)qCYYGuQQqg75m^nS+(EjMry{W9HdMxC=Gi!EsYlYTPt@ z>^b$4j-ZbX0TGE$VM0B!XiuVZZBSDNv_8gvlL|*aT1X-OW8)mr=q}IEse#LsdeN=w zb&L@=@y)2CH`>`^#`mb%2&SYD*hh1#+!IHiSV%UqGg9MjvB;m30EO7C>f7fk;2Y_x zO<`j2LSN6I{kk{k1agHocn;>Ih2@g65JY%uy^GQAh+oF~#8~9U<~aAQU(Na7w;w+X zFG6GN92IX;E{L$&9_tpyc2gx(-7Ya^$TnLv@V;4EQY1hU{MpM3hOdKowH#z#f2JD~ zu_~cRr7leYv%#x;RbSQh{6lErQ|iW*LL>AaDV31Y7d&GIs|i-#gWD{+SLB}+N>0DB zpn5VeYGHMg$mD)B-065q?1@7?E-P)pE7LR3}9@OA8z-hQbIcygCr`7W8ei>OS2l?ArN!ON&1hs8o>t;iz_N~ zPoQ(tgn_o22MSNK=IG-I?*5@B|0F#A2_}3S(BTA_%nY)vC0L*XYFY!*5)As`AOvOFbKnA2f3eGk!cQw!!Fn=wol7zc!45ELS<=tm* zfM)YxjLsKBm|9GX{055Vt2NuGqh-@D1y_hE1L)d|OyG+>;{9~HIl@&jB1rNQ#oTyLNv(RbMk9;_nUPg_ zYFi$-iKQgKHfxLSh^5nvN*h@@Mq&ju;f^RIKwEI+r7q;!?Ku`-sAXa$o{=go#5*_D zr>o_r7GSrXXI`n6fFG5qnzbKBVdF~vw~@1FG9PbU&C_M>>!Spm5v6UhEr!GKE&<}L zo)Q`QGmkJOxMvzOr&|Y|4cc~;*-}#ioYDFMq!;&Dgj{tFJOGFu1l$me2mG|jFjd}O z%kfC9Wj@m~2OrT#zY!wF| zfK{JRmZNZng@tdt_G+cR-kusJhHdkElO8&C9gE}(Z%5nYv{zcYjOt#E#W!WGlvzTt zm=$U4IiXeLi;Nw_wzPzbj?VAHa$VhX6OBo7bcntciwkHtsBxmr*GBv(lP7S!0ODn% zIAI8@oujq!O{IDSud$NXVvOs~j$9gBsjB2wfTAdY%QTfxg*CLh?tyh|(=xn*@U02C zeEeg%vVsxOiA@F}aFW ztX~6vY^d`FA><4U2BK?LJzojrQxA1;6pbmM(3C#9tPprt1T@cf7UpjFro0yJZbDs- zRhGCriixa(b2xqzG2&h#0lEZ4pUENU)Z z>7yXPJ~Q55_OkdW@0bOasN}eNc|q#b-Ryd$n~T_@_QuDG;!^SFix*6FIktjt%wKt( zobWus$ekSRC!r#s5J;K#Qjs}q47EjB0x|^bBHqF?NqpJ{-IIRe9J$J&N|uoj&pWUz zkte&WnUOI``@x#k5xc(%+bwSRm0P()gnHmHEV?Z?!&EUH&t{kaJ4myxp`P} zr5XIRY=&Cci^vR#TgEgzy1K~`Hy8F=>9RS0WM-|CdZL!6UJm8j?^L{eD|$nFi`W)Q z@s!_dcmB$YLR{MB?6z;xcw5_Lr6(MD~>2Z%h zBU_i#O5U;h!ex;b#pWo8$(y}=_MoF6u9=-;f8DAcSBjmYdUGIObCWN+*m>c=RU!Ihj(M2tQ$*(9tFf-*b2^9{xlDeUR3(X>l5$AIzd;mpl$`gD4=~xTZ zObtnh4(ZGG-V%}!y`Cy25aT;Fm9NysC-gW4t;&AbS?N?X=5sI}fR5*@GG{aC=?xa9 znne&RGSh9q70~1*WcwVruP&BR5uG;0T*)d4<#q+4fUQ3ybHo7 z&B&mCjGBMmlE1Wr$Ol9LE3|xR=6#AWtghn-mbTP6oVCkty$@!3Yru|Yx(=VLV_Dku zz>E0iToM#)=%q~IdN1DLMDfWXRm2h-!K!w-V;ESrxd*;>xS<((;9;KNA=^$V*p}&v5A)EM^-mW_T3A zuK*@wd1jllS|Xb{TAK!>kz^xmLw>{`JlX)^l&`k0dh_kf$lD!9G%&I!Qm{0%UItl% z{INr_3dR|VxW->J0F{95*&5Z{yt2~Oog_3ucWdCLJ9HWKX*v^`Zx7>&Hm_KK zHgJGc9#N$(FsvK}z!h*MpB@OlCR;lxcoD|eNJ)gaCp|g9%gU!kziX%xGAW-`i1j+* zj$jxTydVtZ=4I9(^EI?6?hU$i_{{FWSme(>5<7( zzb6(Zm?V^rLTZq)Gm&2=$08Ci3#Jw?2RzCfXsyofcfJw9k&ycn8^GCterI6~}ueHfq9^x2~8 zI7^b$(AME z+aW@cdn+@D;3;(a(H8_ehTrC-Tk-R1h2k&&b&B1c(zPpwT)8C^U=p5u3&4_B~Ww!H*tT5@f~`tRip2Cb3~D%gC_>T}lHrnQVwN0Zk+PR>D&VKMZnLfjUG1dpqsvGk55l_=qj}C*SBH8i!hR z-5wHX!Wu|Fos)awB+z1#3ELPc%^fiX^yd3}+lwBN;0p4(SVMPia;WB1CC!WFL2?cq z&~zq#in&rUCxZ9oeEBB-zJ-nsVMMNcbSq9lW^bR#oRJa%66;;%<~!KXCj^5IE4kZu zz<-%_PoXLRbuR6x%#gbx-e9I0dKT~83YHR0F1Td#cwh1=50LRX9XXPtZI66lq(Rvo zkQGi*6U_w19KV$^VKUZ}@&!Us8lzgeHh&2X2!lH3z!&6_&=YWJ+4u0TIcXT`hXDRt7psYrNQ3y2BSzN{O%P|q3 z=-~1$aMVli8Xt|}W1azDLmUw}8BfrzYRUMt1>xL4Oz6-PeJK&*A&LJ8HuNipVOQPF8b0BEg&2-rV%%EEg|zeXoTAZ7QnxL zjN7~7;(&4r7%`12n>S#}Ga+b;pESLVSMm3dm)_@qHvf`vfR7&J4X9`aKu=_W$EexW zYTeziTQ0ixt&=>D!K#z`I(W2S*gv3XydyR!}1ds*2navN{fvs9DE}9J%l3xdYe2q2tkoDmdf^LS(Q42H?OFnOU?)(h{`spjndt*m%IN`U}BA67*Q|NSl zh_2iVi0%p7U7bZ;o)3x8ZJ^)ett!AO#uW^E?>JAjg+7nrcsh)I?~*1vkva6b+8bwUUqKgdT)NJ}K*Oo_^fpn{M=C`j{K@zG!=VQeO^11YbV zD|P9}0M!vYO^%|7qCDHt0B@Ltd+^B+63St7IX}wobW{!Gt{k%KCbI4bLNFRC33XAN z#>PLT8wmYC7{9%j1JdTfn?{otur2rB33z{Bw7XKdIT-yUlC4)d!ZCankBUR;T)%Vg z%8>ip%W9O0J}?@E^#{C?ElX~E2>GbRa2T|W#-FT1^J=S<(-5al8}T;CCV}Nwb2~!X z7CpBd0>%`!P!B#i{)XIj4D?xQVyLC*3C=LI_yMo1%MsXa$3f4@yF9Fwn#Uc=$nD?C z(wpiP0?n^0K*-IxK>AVgbixQ{r4qoqJl5>5C@M!PRX2Yn4!E^d6on^_HoF3(M=`bL z_SeJ&!#fz#x5cPm)pk&ak=Z~Bu=inmV|h7)71d|DSA(#~?ybIa4}2R=YNTSV$@1gY z3EIyNvhG!zG*e=0YwK^a2Mu+Qtzb$TIk_;T(o^a3B2*N5!QLiIeLBA;3}_miI)*Rk zoQwND=(o;!#E!hn&Y}0d!ZhIT3k+?CC2Age#NT=bn$@h#V;$96Cmo9tu&6s`v1B>U zlb(P4JP01)OG~Ov?#Q)dUE2Wzj*6W=&Lzw8%H&ag8xjD`58DNSi5y8cw=hQe=oUw4 zJ*Gjk)qJq!l~@~~+RX=vhCQ^^R~Ie#N2T4H(FI?faMZDh`^>wusk77{iB{;Zz%01y zZ)SLJC+3!Dvc!~##Pm$RNfEiIy})h38yw+|?WkSHzj15-@#4h~KU>3S2mGzeN7IMk z#Aw9~^$4>3*t4;)pprw+mVpVa^cDy0xn&MG$@n5>kouh5-TZ$bp{a>)k}a7WN(>~4 zdqz|6NBD*_ZGnRjb>WZb+GAe4|0phem~y} z?bR^h>6oRJQW7;H*qJTK5=tB=8>E?huvJZ+q8K_LTP*QBrBx)Jh!+VRaJzRyvc-KJ zQQ=+JD4l2N9ni;jJGM!8?ugk=Bl#&Zx`z%YChb!CZ^`>#S0u!E4tC(Olf>668Y)`% zkF1F?xoG3t%DmcqsiEKh8Pu>1@Y_JoOg;#yA>~Urex^J3IrT*9OV7{mJ!ZmM==NR5 zhP;?UX#aQ3M=b=K+A$iVt%Nu#U~XWNr0(c%$xqP^;!)>-JmQ6Chvj+Z?(|$+Yj|oV zW;V?DzKPc02IK_q+c;3iQ^T63rG-G#Zw*iy8@wr@-4GMdA*(maWwMYgIMwv z549vR{(}x-s`yC?Ag-nzKyNF%F5(*r0#99SXqS|)OnITv+&fwKk2fIGuK#f-Q5v?0MVzY*Zm(nOh}USXZw6#_i6u6n7{h! z)^muh@9iE<)DZ+oloPKS#V|L#;nL@nC%(Xf`qoWY}fmE9>suK*0XO`l6Q08H56qg|}2w*}2pka@c*cU;u6C@)ZYwB8Pf3_j=qiT*WTYgYF&jFnK1Td z$|H_Y_K&RCg-;+=V^z@zjB=oG66q;l=~tLHkDhh~QRKEzGpLu#W(s;j>! zUwIeb?H07j_abpjIfO=zKu>!;5jq(!X8JLhGMd@M!J!t*3^(g!ZL6r>NI6-M*B=F9 zu(LK9*Yx5&64SjC&4e-Wv|zIdGb_HQjZEyd8b)*L?jiS+sT?G5=oXO3q_ zNP0@g6mb!moe;zqmJrN`^qF0ThJYp$lZKpzQXUeQMVCOz(>I<4!X`?#ftCO8nN}{p z!K|YYA>|;%os?h9lRBynelD#i#1@%GKq>uJ55ZIYmzUw|>VIaA|945pdI*~+;pwxN zj*;yVJ9=*$TSJR%0YviG!+30(j5BBPZ!8AR;}UZ~Q<^Ef*61}-L@3%xonaks=b&d7 zN#9j(O%`U!zdp;25e;T8et+bzTNW53Se+KA}L_v`2oT@3yUuZ=5 zR?Ph)G5HY?H)x8hPF(l%+Rb791j?7nx%8~I{gEi4EFKcl9Kd;QKY4Y-vD3Jr^tc_Q zf(DTNqxQ#pjJS21aP*9=^c5zA#lk06^fKC7eU?|mdmxMtUrv@Q(uRx{vmp`pJ*+djMm*LZ9OuQK9TYUjQy~LPq|B1k{Pw^*!^eH;H6?-X)dq+~va;9DUj&Mw zIskT=U9*I44xL_tNXqoXBZ&g@;}hJpWUF&}GS8=R35TP%>GYRC?s0VcWY#`PrU%-F zsox^)yIS)g8Z9oPeC^wZ?^Pao@yiT^$DNGi0)2g4Ok(pJgkRmB>=N$9kNDP%y5(+c zo~J%|cq!wyXxnwH_2W?&fB=w450_?dlCU3$b`GpXAG;9JZp?9G@h+Jp9HtMKo* zHYPt)qcXR=7+l+euBzZvYq~f(A9z~ONWBU{RTj!SYj59?`@%5Z(dy7ed1HlS0I5}_ zky0xrYPB8^t}ncA6oT@#sBJQZkpJ!*q1SWE&>Uo8vAEd=3`IluRe60CIM`tZ(WG$1-S`}MBE{OU|F6hPu z%4ymn8Vn6HIHlb=LL7#rf}9ua^NC5m&uL?u-!eoX}eC z8|(gCflv4XUA2u&v)!Nuc^p}oMM6Old@=wJES#^IHgCGogb5D@JS^iH0^%00UVZsC z`Ab8S4TcQhZrrB)1Auu4bpU4$`rf+VwNCafuh-?%_6G{LxTjMWf~TKch}v!50}tqA z8OfFX(g-I+ur`I*Q9c=rm-D1<&R!OQjqON%`QXCRn?ds1u&>jc9CfFDKGRR3a{RPq zMwk%kVpI6`$pw=MOH8n~8P!dJoG*E-Pc#_0g#Xj*!*@0ppbWEot+zk{OMy&sfpo%B zAnirl)=Y5(6nEBE%69y9Pj5%Rq;=>DZunl8e{N%;FDuUy?N>~s8p7K>p!pQ(ozW?e z62RJxH-s4Fg8rbF@j*Zy2Kn5l_(Jh;uK9-I>zs3zoK;@%%S5tmucqhV#i`*j#CEM#KwFMN(adM}L^@W6M;-Tt~PN7NUv&}u+ zMZ~-A?G@_6@~Wp{d2L1w!j~n~ylH(N>NzcGr|NP)di8BzVy$Bnsd+eyY|k~JW_Yj~ z)#UZ%bdwEX)4X1TjriE1^jq$WM_6HNJDSmMpcWP--niK9lu)D;inxBOS*f0Lt*65f zvIC7NN#0rQ%WQYu@hjIddb%1wU)pI9un?$}i-Jrg6xZlp-KS3ShLc=AW)f)WH0^0*#<*6;hxy=%22UO0K$UhqMA zxic3TgyFl|+gHVUQlL7-%!levp!SZPcd=uzzP;I~s}Ei-O=VT!$&TeABcoXBAnDBE z^pED5zOYgxT9>L$-#P>nCl1R<aK#4wnLvU_LEq$(n+&LgxJj!9nC{{=!4X4drp1;0lsI~-&F)lrQ^qIv^2Z{x1NrcLZt}2=*dvzQJ!*Z%v6*eL>4NgNlLtI4NQF9JF zIEFy1wLeU#=ijwG@P89LB`S#SA)E9rABMr2?fU$%_;Z7&Zez8*CDT!)yb>FlT=8n``x)hLgz9>7gVvq94ynhN*!pxLjaRy_Cqqusv+St4-EFUn$&W5ZyW^LjwZC&w^pvU)D3=+ z2`?*aK1Lix3jxF0XlX%g0W)o8_R#NL@}KSFKeGbqgI>2kQ7^K6hm~DEy?-|GuV>f# z6?`UPL!8~~ls_|29tOS^F5Y}lcpF9cdxr`02`Hh>eEv=WwIpA043CUNttxJ+sC^*- z_>?V-D0_a*Ksh}n$IydExQTdkT^zMx6zLY474F4# z^#_x<%racE8wb#jD`WBBl(8)5$~M)nJr{KDqCOMLc^8}8Le6?0FJxTdnG_0Fq`{-m z*KmeJ#Qgd9>P)kdNZGc+R9klHAFyuU$E5IZ77LX^=uFdMp4O||W?VC3xiB;y4lO}- zGSc3CmIvv1X63?nBCvix|E`}N{L^Jz)ZtpLZ^13^{~~b}Sa3I)*#y>#?jtBP z=YvFd^@TOdH539jd&yJ?6(yMu1tc6zhp`tlf*agRUZ$_OcRfk!P?q@m`e{saj!rps zW7C7?)vK3jlV&}*89NCEdKyPED?h_oB3NABYIr+tXZEOy32lX8&2Tr$(A-o^cM96H zPm(E~u6nOzq{J4sbeWFtcyr3 zHR-o#2yNqGoJ@w!tR-$eD2?7RrggWCNY?WXE>2;V=HUlpOS- zZe4OFD9fsA2A5B}5PA^|0(ram5|BUXctZNagk1)D@s+(d9K1IUWU#wSu3o0E#VNS- zNKD}iZy=t&mC8a9Ji|ktKAH;6(mFKi<_HTrui{x(c@fo9Q6KxZB|nNTrei(U`e{`s zp?xjeW-c3E4`u+GKZYa2hb#lG$e-yb5BGj?&e7or$wWF{3ix z>j}aXm@|`l+&Ma12T{8rCJzzz^bi9#^TF238yNHjZv-p{^gjHA>YtDNJBRttQ}MhP z{Qz}TeJ}Wj!|zuCjFt<44N63L(17dsdv3xs!>!nZ4jD@&x|;VsHbp| zZ7=c!>JYvd8I6olth$t9OvDBMjppWpv|=EPb+D@Wq%43~$U={VM4T;+(&D0UKI5pK znue>lHu=SIuI#lIMPz1oGcM-N)AEgkJIMN5>msNZ66+m_aWfnx-ec*#4D4t7$;5M@g-@hQ0WW zb(s?LKCUjI7@>cRdwJQY&gr4DzVn*c<353^Q5{ZogZJ*YTj-AQ242%`HS0|CdSCpM z?_|6zc%3U&C;3(e(o{oXt&_XWI$IcXJU~qHn8@m=Ja|WpkXmShy4_HAFE&nHiEHI? zH3q>cr4CkktI0=;>OC2=PR$=(RacW_G<x;-%E6 zo^dL*=%akx!^2R8)3AtL_P${0>Z`R-8}PhUfH>zgEUfBrx*W?|$phn&{vyblVNO|0 z6uTACrYa+s`0BiRwy=zbJ{dyB7~bZDsmtqG96Lh(j)+%7_~XNds9LjB4kJTXe7J{0 z>kO@qtRG#M;IGH6m`LIh!n&n?zqES zDgN_{a-sh^k7Iux03lYbN}UEQv7SkLCRAKKdH2!-PK=N4%*3=p_B?U3Ajw$ncarf+ z0ICq3(^Q-=AH26fUv#X&@oY98#fKxhnCXi+vC{^Gy`kpW@{@F9GiErq)Hm=3NT&xN z$hiKcs?Wwn-;ZZ0@17U7Dbuq*{oi#*SZgz-*gGx6?LvS_HK#KA!<4Vp4s^n`Tc)d?d#PNFXsS{oI zP^dGug-$zoUoxafUMFSnUe<<{52kBDC_fL-G=eL7Psv5gIH6k7IXvz~ZDgp?Ox1K1 zr$KR?Xb>h5=}2)@fiZLL0XFTOJANq${-Hf^B0iCP0ypoWpAppIh^?3@C*JT4f=oiX ziqi57qBo^lJFy`c%8FAnp;5fJLVD5yWvHIlYB`*zb0mDdtJRs2(gLFH%txrBNX$0{ z9Wdoz$7@f%-&N_adhEX%*)p(KOx3X8&-tkR{Y$gCh&;TO0bTpOzu#ED)8Jo~S>?Z# znH&6cg|_ijx#o9V@-{?Z%!mI%ucv@?eBnP6_LXL&7&vx%_+Mae9Pne8H|5F(aynd4 zl$D<9?9b;6=3!Ls(8f5{ni}j$oSGPm;|*Z%g0ixQx}8-)Tqv@vKw#2HX{+}(YPUdB zaouFd^-J!Eg7kC!afM0gwxN~^-bY=}nzY#Iqg@1WwR$X>MYI^Qqx;{d!QInsL8t^} zo$#+{S;wd34yYTS%Y_Pd7)Ts4@5O=r#2fk&?I>pTQ286H!gT|J34M0W&>f)aw@p+)uT@4Z%G z0DsLZ$PLLl$b{YW{BU{A75A&C0yjsy8wB(Yq{$4z8HW(xsS*yeGBx51q&4wm<1ssE zLH%~fi{0~9s_BI`hT;j@o7$$IWg%Xwr|9)q-IgiYT8Ex>=y_U~ksO;1Fc93-#u9Wg zlSuB9d~kfK0><0!$mN`uD6A2sV&tOK)w(PCIOCfbCvLG;tRtY`2~*%Twyzn`biITl zbrKhvRBgGg?ZvD<3<{0xaac30yqZml;q^!J*Y_H4HZfKcjOq$>(F63RJl<|ld8L~> zDs9ta*d%ORLKUU0-=Fh;U&3gSq-Ufa?DW^__1@*l>Kj8o&;M>Mdw4D|{W^Lcoz@HG z_wO41r1(0z-TZPdaC6b#v3e2XBKrUW2~8!gGJ*ORBWY`8Dom$2Nq20C)8owH>C@n{ zrCasjMuQT8y^BDdcuH9a(%j=>!c6jURtYkht2h?J?KB5GhM2PHKa1MJ6~7`4+Y7k zzS$@nMI_5WKnUC<|9(LD+@6jHcCGUiW{>?{hyOW%e)IvbcGASQf#er#_0PHFVudYM z$7?U%KZ_+u23xGVyS~PQus#S@mVRGDKh$m_6`&yB>4HAiRHHP%NS}o|=XawbsQCbx z=NnB|NoIOMUkWF$L^A4xcr^yelxRq`^V+LuRwH8;y;&`a$eZGI`xB>3PRI*I(;4SSkSxOguWOt-5f6Lp+ysp*CNk}t`l<>YxTW8&mE|H zZ%o2FjTBu)_TJ2zYZ(v*WnL-9AGaq*Tx`Y;yQRi(xnD}rz3x>?>gUL7bbgEre%lDDv_qlBsXXoG9*#YRh;Pl(l0&vCK zTY;Qk3EuSY|IQOKB*Fk4#4ciH$bWVj&mVxF75zO@?mwj;Hax7`+Lz@04`c~TveJ(DdNTyg>DqnV{+I~YKN?xTBy_m$zWSh2rm{1lP)``eAR*D( zb4g~07wRNLKMW~JL(2lxEXz!eBNb+8<;0;5wX-QxoK@_O%Z?6W1b6w^n#I5DRwdHBk4}e{{uo zGlWcEut|j`q0<3<4ulu*#%2lEGT1`cNx?ialLcndC zi9#$e3nG4fbnB_#&9p)c&%wCb2B32sYXo6FvOysv|BhV$itta#C{ zLsF^PRy^uHvf#wUjAKZltfSMYy>Dt;8B@-|n@aJ0PL+QZ8Qz`i%}(A!mmCMFvskXc z#(fi3lkA&GFhR2NVX*mj}K7Y(U*5+O}lsRJ($gX7BJ{?a`W@YLKOEGtt!IbP)&^mIj94;hkvYm_**Ra zg~tHcl>SEWs_?Q(P zmQa0>JG)NvjmBpszl`~&Y_!DlWjdnOrJ-3>Yq$ZuVB1k~@--fYa}Q}a842zWl}A>A zdhxRcZ7V~VAtgdi*QK9I1O^GzE+gXCNG`JnKIRBPo&4x!B1yqcf3(xJ zh#`~jIu5h5`xidvas1>qak*$8sos%!JnU+EZa1hdv;HQIGDy8Xm< zRJ+FE&-3^E3G8x7I;_$dVIQALLmdVTAYK1mud}^0=g>3T(ffWA3BNXG%>e0FJ4u_T z@4C4E1FK1TuN1w82UR4KvX#T_xt*s^H;z4t^U7ZL|2sejT81$n<2(JvaFl<>1vN#Qu|SySym9`I<})d5+T<^_p~k)acAib zzQpSW633TfiMnlDuPCCMA^i&H#wUZ=Z^E9FWbLrW9QWtMT^*rKh-($ZtiDz1RY|!5 zgG|j({qTh$iMn1hy#91yVY>|6Y=~@np!vbN!TKTn=Q_Fmn#pJ9FL*TV(&)U-eR)3_ z`r@7GJ^q*P2z$j3QZ2rr&F3-KG*JEz{s-)?0WTKSTr~hHuG;w1%VNBx?Ho`h)eU| z%R@~bzNOo#x5ci_>i5&zfiZi6VedHk#y18M^84x$VTK{%%(Q9$dCB{btwh+5L!U60 zHf7uMOx5zL#>BX1#->5-WTi5%lOh@*V^A>xr^`SK%syJ+nS`d%lW_IMqAAaqpOpCt z=PyRi+YwebTlcVSc74RprvDKY)NoOLVa`$(lXan`c8`eb()6mA&17V?(1b7LYi@TP z8Iiommf?KO>sY&%k5Vs^#u->luty1hdHy$gj3!WugLgtKbc9aU)QBz}R7)cC`L5BI zSf|Tah)yM(r-k|pjsq=rg7at;PfNS01dp41w5ao2YjZU!?QMv_cogL(04Ktp;pPGv z?vFnVKIDIWWww9k^Kq%yi`A^``=K#^7KBQy!$3~0jzA|YM$ByUORE51W>gG+g+G`JPG`S`IA9qB*F(^91U_#Ea4^&*&|`^YzelbjiZ zzZ?qo?o&o13wjiyO;GCdo#<6y7=87BI!H79GGe#f^*N1)Ry~VRe?+X5=k(_SW8#HS ztUe8g&(QM4*;IX%375B~-$TJY6oejQ-s+mPsYErv&N%!cM6~ptnQb^{gR}Xa zi2(8Uxw6M(EL=wS5v?ezC}IoEDm}N*E0d(S9~o>X>h8|sY)<+diq(+Kmrrl46|mQs z5@WqNobl-580f=qy-w@nt(ig7T;Q~t7Kp#3#5)0aN;8n{IDI=iBIa=2xrAMN3s%r!s3@K zOf)LAUWO2Rmh6L*eFifI3~wO++B{s;a9^Mv#`)hH{-XkUN)db6#(L`un&aPGt;s_?5*3% z;lRgR^+-rR!Dv#3Lsn4WIyP5wv-Xi?eY(};$FP^ETYT`%cci#Q(V_v=KsY<4pnV8{ z_lvj)cSklUJoOw-r;e0pp7o(cxfb84Vw}s>^r5ifp(4QnV!e2swfr|miK?e_IhF<8 zit<_Z4GvvSBArE`3I@ffbcpZC>!|GOSGFVTC-WaBFkJ25<)pC7Z9|=Kl-`*M6B;G7 zdyZP#=+De^E`3a&w6SQgoRsMwWye*lwM!mFZja@v&x$~O+qR@w%a?IH7ZFai`X;8% zH@bP?ip1GXbY*1m=P<>HOz2X`IS==QTIqCxX-w@Vjle5s92>&^J@nm-X)A2R(Q=!O zuF)>R9HUQ~ObzK%Rtq-^nTB4@JVRwRA1A;A{HvuD$wM!(uBLkGaA|Zy`N3?G%5{)f zQ>XZV3_m42qT}`5dzkt55P#ql9D*gRh;gVEkX=c6$|SYz>)D3_fRB&*OnFLA>G~G-8E@AW9nLaul=2G zf7khQesRsqOQ(!?jCVZG{oDc4c0*RUtXEzekLGF)kT`FR6&P}A|GvT5@b|dBbJCw{ zP5z_4Vn@E4y6i`LSAM^n-h}_YuS@?0F4Z#dXEh#%;$aZocdx@>CHxx1b184h)yx(i z#8JE8*s}ix|1l{Uk&~sGDq*k;;;A&E!FNu|_3Y^r?{kekEmt7^wCg{BLLe(4Wg)O;k2<#2fltJFzuc*uSak521f~Al`+?Kbv0%+epLe^|N z{=gJi(waVfDs2;hZhI@i>5Dvt*zjoWp16%jbZ3h%1)25oLpRuB8{_-BOj&YHmihV_ zAjD-5`wVv~)b-!|CUV?wyldM?-f;N+KVWfe$ix0gaV>>X-CF`ZyDt97lK*FbV9NQ& zl}*HHRhim$_oixIkN9Me>BU3QQ3(G?PeiuH2i-I%q>|&B7B6XYB55*Sf6{!IanSUe zma=UFJL`;A9Cw#i^ifoa;Q-Inu5Pw*rzZ2Hb$c}(yXjJj+k~@r^@kiX+ouw9>Kr@8 zlC#>galdxV{X6a*2sIkA9e@;jziJ)~B;)EqPRWV`2ggZJEUA~Wi+Y}nte<({LM70v zz1s4~&p`ef(6?Uzsgdz*G@N1}-x7N~(kY?5!kAm$u;!#08YbpIufH+0cdN7|(0W5d z^DXx1uQu<^M`W3hgntbC`~E}DO|oCU1HqtW=5@uA!&50W zi5||u+&0buFStgfoX@1Ip~zyM9e>}J8V~(4ickdpV_uDv#geaCQ4ynN%{%LdTcX9w zeWKPdd^;Kjlok}QalaM={m%55ZxK^PB1mqYHUbvkkebkmyYSNT~;SYmDbaI#8z==g~J&eam zZZy89Qc!o${Qa`;D`8(0qij@~Z+%w*ttB~!j@zPxYty3#Gsf&h| z)N?g7#bkqr-cDoX1zq^dBEe5Lx|R%Ps5D->mm@6xRpJ%S!w#+{Z|~cSjtAX2S|h1^ z0_k78MA6rX{S)Qz+wSaF8xClxfm@dPH*MC`&T6`%tsl5Mg{h2n1%oHGBSs?`fPqT? zA!oyLwY6nN2YF9zPwz|cWlXm7*qUCO^l&?GT=C_&9Bva19MaqHxiJ2EHVP`JPX>+s zLd`xC!li`Mbk=*h7qQ4dMyb)DW|dtDNPty8-nbkszC`ISb3WPOv|MOXCTHpJ;r(tx9>la*_|MfTXWZh&ob6IS{J@TK^j6^G% zpEsQh(lKGYQ-Id=9vNJ3v`zT$(gqZk4hQWF+ikSLuT6`kB3TUGXk|%YIv_g%t^QnS z&bi?*EX29_ia3ctH4s|)9sH5kMGbvRC-t>Jw zA_mJ1E^pmHXSF?}%vu793zM6&&1Rmj+KYsFYBd9#d0OmBrU!?auN_>iJBkop@A=ptoa@~vCrMd^X0 z9355s>3I8of46Y?hO|QVt6DWq<3P^!mTdYBHuu{*jD1ZQz4zDj6%%vrHXKU6uS)Rp z$LU=#JkTe$=7u}zzUJLmp{6`s`C9({w1wz8yP2Z<2s5oohC*V<*NA|qx8O&u*umFW z4&i`@GicBy0y#C;4puU7{$Rc$3b^q)DWl^m244`V=MB=X9jR9m38NXmubB$i{u@#QxHXaSnLBr;rprg`yTmT-uIDa<3K#1?WaGTf1 z-Jw?P3!@_Nv%&>U$SN*faW3T>v>m*HOa(=I-l$mfz9L^eklrz)im2f9v)TC#D1eCj74|DYzX*T_#nmodE<8|kiOc<%*rL)DHPGmfiWuDXd3 z-Cxc|5|!kQ``XZnL@prC*Oi#)Wv}&2N$m?*n4KRKMW#4h z6{R;oH|dvl=@=hOXi?y@wwFY?4s5ZttDbBg3|er)50Eu@VkXTSRV}G7+Z(WNeQtWk zQu10-;8jFSR}-YehCoyQsBpVW4~nnIOchI%vG+Dyi9o?y*B|Ov#>g=Osn; z!Q?VxK0rCJ=3v5ocDuXr5H0V8-Qx{oY$LA6kM+X)fHi2N9e6{f_q-zd5iEGkUBa^T z0i>ZxZobDcK zNt*TuWw@zRN0)%8u{4N+Z(`nu$W0T)FZL9ZrJU;QRg)XgRANM5fbT6@>5iQQ0+C1! zV3C?PaQ17aBlH3f6m5S3srkPvez17NC?IIF5~ypm44ou;LC%5K@%H4XU$0@?>906J zBo04jgZF6-ldIhW(MNN1aCZ6)`*Rh!r$7QL73puQGN374Q z5wMiU?QzUoJfi{8TlqSKL}5H}3J&o!j6Q}0KGKmo&9~`TIm^FiHj)draLXL~1#Wht z@f|k@VhEW3!V5Hn z`-LU20<5giJxf?{!X42~POT)iVs2yA`dU3vVjEk6v?fQ+W$~Ztuk@+m$}AKUi8VJl zDrkSdyvHa|ai4*rR-!uXF0NQl05lg8(GE{FSOS8F9*o{wcOpL{2}uLg)5O{@@+gj( zc>99ZENdf{NvR(So+Gd^NbXx1QZLuAY8ATGT@YPJ&t8~}XPTR=#kzrXAFyk%n-&c$HDO(>@ug#rL#kOzL9f%AgxHI9lh_&0!@V??LH!_cW?wrs>so!KDrs=Y z&`{Akej+wmXxUm^J^p~-%*=H@PH4_J7Vo;~th@(w9ho>N;makWs`lAT4eStdQl524 zJDMUDCs*Dq{UwgM{$WHQ~t7@$z|fr>E)XNC@TB;Aj6j1BBWUR=uGNBLw*E$ z8q%4#+WQ)MdE{1gNxyvERqhK7E4;(bw6%R1O)vUE#X-B)ptJy63N= zX+sor_R*To+a*72sTm@*T`T&xRjh#Mn?Y13r;{&2%)u3OT{-rV8Dvy z*bImmm$3EP`jIZo!Zupf4h1fI^=JrisOdLBSl`GgZ-a_{SJYR$tbS&de5!T*=~|bI zFez}C4%EWS!S9N?>4C%hD5o(p6oiTyaylJ-ya2C}tuftTj@l;$AY!0Bc5z5Q;TwZ& zDG0-zHLKd@^!n=!P=OrV{KtR*6ozkTP@*;AQZ_b!<$)vXcasBj2m93l^RJ*%Y;Das zqy1SHGi_r7PixTdL<&) zy_brR1a5nkv~9@?`D%n1&hV%Pkcb!S=QJW6=TY&Al-+!&L=n;=EU?8L*&bjRC zGUBvyChvEEC1oAVm5QB2_^}Z49t_p{j}TnHXlrWH{YX})TlXfTTZLY{Te;gIZp)F3 z_U>|ta8(hy%~5J7!y>wQ8W6+CWeh;{VIS<)I4QfFaKWgzoZEG-efPb%R(*7A{+by` zi67=F-$fG>FIm?6Ge1$AkO8-^0@~W=z>SBV*G=cAM z9_&EHs@K_;mv=vv(4Gm;A40}Awsy~DVrJB{ReEzQE=I)8yZB~24wpcfU-Yot`oMnv z$KhhM`Q3x79QUv(YHCt*tt%h1z=UoR1Keu6REo(WH{rLkbS&>t{M;6{%1nR0IPrF4 zA0~KR=E$G={v8BsS0O3*|r+TRy)WCw7~q)uTaf)Vg? z+&nr481fA7Z#E6)EK#Mr`eU3v)cnOm+VW^WN^$*S=`SSxq^jlb*ru?dDgG zAK$!dJh_Cn@HkI!!xLBj*u?%_fqCUzNpsySg~{dhN{RBO7{#ks+CPqgGlrB}x*xEs zo5A7V`+01&0`f>6rfAZo^9=*g?Ymw@D+qQ7aRC}7bK|M=56&EhF{rYKV2CsHdI#ywj;rj2HBI6-BHgLRr& zpK;sUFga4t6$K9K@S+rc`m>!y+a2>giCovjFz$BKk0gOVA`qRA1bEs#;&~?+Xr0Ev z*UyWvZCWQGwJp+}GRGxDi!HF}q5W!?F+}i67!Bvu5dGeA@ab_;7WOsR`22>4vp5m6{k= zO#`RMnzY*wMHl4})g8PgV{FWyasxw@s5ug9dm(`_G`vOk;46nmyn(V^Vd#nM*qDyDI93Zb3+8*ygKSmzEg=S zRoKCNvV9s3Ztv=eH||*2B{tqrxyw?XaO91e`yR}Ng-#xtHJV*oSM5;CkulxWGqze8 zR{KPns--8Ei`Di6FJYNk{FR5q<8<4&t~j2-(y0R6$$;ikxflUcKJh)Td70ESVlnmMCf z^JlJwFQ4q~dbWFzP%coc02Ri{sL^mH1%##+i^y|Tah`wyc;BPg6H=z1 zCUxN-X+(dPX);)8@_WQI!)V(_TUZcuoGDvV4rN2BEuMkv+VVf=g^|Re3p{V3R_E6UOvu{G#E^C2V+ZhyY@A*pjs7!IkA8Z*OrOQq< zqs^KF*t>nDu-?Wd-jyaKl$Ccbh@grt(tsTgz7DUj{<+-tNmlXzw3(B$S~v0AWV}ND z&ox3>&tG<~PJ}44%2s|%n7xR2K8jE1eHRA7rKn+*=Cw~JDPme%xwKfzua=V2zUW67 zr0~z&94x0Wa)_4NNta2kvolQfB1_IX9M9#uC9(7?UY#qRt;^%?sfE7;Twzt#2l|jt5EyNPX=T$vyPvEl}Be)A?ZcM->b>rco%JeZTiUGWRgMAuD&pD zJ7P~QEqgX+W2M(8uhP6i`3ZE?4{CF~>9JGVVr#W|8Ed@rWsazJpmXgHCS?5cSqv*P zChx#}xfu4fRJBqAB=*&|6H}c=>+6QY%dachSF`o&J}HD&XJ=pq^gX zgT^v+<(?qO*99Hg$O-nJxOxT~bsk<1x4Boo0u}23i)&rm7+W`)LvVmvb zV=~s#=3C7@cM=qMx2nIk5KrbW5^YA&4zOiL9A!c#7c>SIgY#vFW$(@2yrFDcud-$(569mG4yi&I} zuZiTyK5QJ-(Y-hC*o)&c4)AsON?oqM_)O)@gS@B&7==rm?jGiC-JhF?X zLo)b9G_z{OBXa=oo6q9aj$BXoy}vL|60ykP)*Cr1RP^6IH;^sRwO==%G_9~#O2AHq z87_QB3^dhEhWlJK8YwIqKCBYzq7XbR*=pG>ake{^WUE5&W!OTfPnHhvG;h7-zg&R` zGwc{9b?$2_F^8O3f3+MGA4m3e$U?Kkyf(sDRC$-|#@^d@LPz{!y{E2&PI}=m;biyu z0rnc-!`M4&A90?nC z=c=SGEr$Ebu0Lvft->)IeO#?vcKrOi)Q&2q@p(lP3R}bH9SzdQ6zEpM!}oxtnJ(X2 zq6gCakF%0b+q#>B(_-#t+|D|1ztLZ836z=Xp}MEfG4Y>A;qRN^w?-rA=LwkVjYIz2 zyzSnn@u1J6jZ&F|pJdZpE#!nj>p{!jjR+ z@Q@|%isEcY3g!o&OubXJqzCoyQtuK$~ zXwV1}Ub>#@jH(^C_okLuWl&!G8vTH}cD+wr|Ci)bPB6e!m?- zp_%#3>EP}0*;3HXzr}?uy9GTNcAc1U%g>3ml|96tub4H9oZ!r{lPc0v&&HrAGGK}_ z86<+m1V|~d6rY#GpwigNGa5~Fe~Gaz!Y8CGJ*gu$j6`iH@WiR|fC~=VO`hZNnfMf? zvejFR8En--W@2q(SpqFC&ZhS5 zX4l+PBP!4LTK&hV`Rh)a{oS#y6Nks+($g0Tox02Hj@eu3D1vau(zGpo2%a}-o=mk% z8mx#^Cd4?naIW5Vo-4`PT6MmH+FZ>fdA2QVu&&4!JBwY7JcC5$$++@6!Zh#sj*VB^ zXNn*kYs^cPu*+nmn7UqVkay@_q^_zYqLuyfi!f``ztf$v#z+rRo|UI#)lXgy{Yo!0ARz}JL%~d?7-1Ke6}r= z9BM2-mfj0j8_iZN@_dvf(i6qjs8(i{qxYgUn%!UmxWPnsj29cq$MV^m8EMY=0TpCC z?=ZLl_?IT-W z49U43W%^M<@I~+Eodf=511=y;i4!HfbbbpRHfU1*41sne@qbZfZkEV{Exqs2D$r~B zu5Cd5-ti?*@q3C-)m;Fn=fo{gN%S&&mA{$zHu;;N;|B&@Yq3u+6||uPk8x(X6BhEN z3cGC=+d926pl4wWh(_@eprs&cTIq5@Q~Z-*`vvW)vVc*dK|CHD=mW$Xr-1O}m*AD6 zr%HRA=p)V$o#z4z`$#Nz0qP;iJGp7zdI1Rr5%Eld+ z_Rk-5X^pB+(rZc`U9s>>zj)qB&nkPKZW%7>aLsRnoo;O{iL#D`!c7rf^mX9X7ZF(l zX-YDi5V4lmE;Df04bFx1+RzkL$b!{TO2}?hl z|NB-7`(niQBw5pj3MXBI^=z#R;X(-^e35U-8k{W^WiT^8tfX1B{2%w&U)S01AHra0 zB;3#{Of9q+xrYsB@P^4Z+$V(3+ctFGGra4X#vNNA&3l@6sypa~{XVDSGMwo8F)w~h zI77zU<7QmNY?ISu4-wMV_oI~0M}6Tj2g)uZ1MDHTOf zsbs5X%e`R-q$SbSp9{H-znl05ZYG+jpw;{MbNGY=vIU{xjoEg%OMhadgoti(Yn}Nq za1{)R6bt6;zw{L+rhX_7fq+9^46(|rJ$MW!h828Yd<&>Lt^21Pvbx=g{y_8Nvh8ze z+o<@T3Ui7chS@p+JQne=onm;l0HD;+I>l*+Y;gs0PXdhCRB-apeltuq-c*W~|0ZqM zMKZD}^iL)=&e0vWt5+8+HuYEib_Obu5d!`dxoR~uXO-v5^jDqw%rT*24)DukXT;oQ zU2oRlu6lx?v8!hLsS4~&7G&fG4Nc!t(D*s4P2RNtsXU+1P?QvnkX)ui& zk7qrR&0m`^8YQ?YB=H8oK&H78?MrUg?ZKNd>&4x&PPgY>2Ne+GT6NPpw+)reqVD~X zs!mJ8R4^Lwts$#aFbG{3l0HwFM$>nJg?`v7#z!=? z=VCS@?ZgYzLkgy-PdbhL3U_o2Jq=vz4%|aHr7MXkE~$ZMedv8m(~dYx#FRMhSVSPN zJ{|w22OVt9(_ArxNxS4ZENb~^NuBE4?jm~Vhvm?c+oW$WW$85EWgB7>W^zED@XS?k zzL6J6gMyRT+lSNfCs?+SNTPjsFJiE0oX3293o_oxt_3_6CChY|xq;c$HgNwLE}Z&~ z-a9XUfk4j0{1^_(vP*>R*FmQ4FzC!i_Ch3ZL3QToI zjYhH!@v3wIPbc$qAl5*cLnGkZyYrYMvDpSA);;@cz? zmQAf^3b#MA+o5X5NAp}~`cT$Kk`_NQCWG4UJu)8yI*?xk)YR{1*O9C~W}nJ_otf4x z*w^EaMcOY4>kiuMw!APJw<0fQV{8ghH z3A(Wa?!7i>0|VYZoUxUrIKOHST0mR%*>F0i5bqB7~H4}0G&1clA{m{~835IM%SkJLa znMsQ~d59=@sa+v8gLg`GC!vOxV{1Y#5+{Qu!8n34&A4xv5QuqvbD zS7i5iMa>6|xcCk(1VTT>l?8B*;z(A0ri|!V|IHftz3)@B829F%)Cy2XplMY-gIPCb z?!Ax5$`RwZmQpI5V&4cAk}!)4-|MnInj`9!MF+zlC&?%6YqANip+ZNSd)1@)GDTr< z4BNAnyHFw2@yh4*CmZR(S%sdf!18iT270!1PZY_G`NzPw0C1+$-U`2huBUu^yLliZ z>QK8Jp}y6C>F=g~cRI!Scta1&gd(va&?%##xw`4~XZAZ9#xvCw(;zv|?)vP^1-&36 zqYa09?hoK{eK8OUtVFPJe$}mX!bn4i$^RNc<$7P2*tL>uGzS>!eu4tb;t=2dB zWU>@qz}zN2TACZ+x$i+yBQXNLM<@8dxIhfxYwmA9yI3q@pwsk|I$_GTE$Ys^Q@Gpc zXj{x|iU!)5!WT)#`=vSdWxCD?)^3h0>4#|tHV(C*e3xu(0UTaF<3N>Yu)$9Z(4}DA zSMAOk_*IeIbpR7JK_vGc((r!^*l7x}qkg3m9j9vFO+Jcte{@AVkmB2fW`9$$J-ojs8rd0) z!1Uvy8dJOEWxM&4hX#t$P5MzfINkzTuDnXkFdbDoPkJiJP_-J<%z{hR*%hv z@-kS9T6Q#(_Ltk01PMy2Y4x{+iO*R{aFUF^!zmw&x~+kAx1edx% z)BO&w;Dz?|^GyE)M3U1f-goi=M&+k;cI%7QZ?(^sdVQNXI7YkEAMnDEmMRUm_=r%f zGatb=-hC`QfCLHMLaP7A-lm=$!%rWo4(Fj=*TAHD9MvyRH6JD+Yy0k=Fy;xS8kvzVfT&K(auShY(Yu0O-V zf0BUHJLLYlS$QI%W;ek!t0n%8;-fPb{+fXt2XN=xDdmx&%-e5PBec;Q4jB{p^;u#3 zL$3YK`6VCwIMdH%tL(so0h5A1p5-9Xo?VOqPfIr_G>M~OD>`F9O#>;fz8 z^z$~0c-`3C-U?@KmQAKgmaQ1HOzT3tC$27L)b&sLk+AGezrp0KN%+SaUJ6qrPoB#= zw^vhbCv@X=d`Si)@*3};dGl3UYL741iQ}3~zH*Pe8_mqsdCkMHE-M{0QOHWE=dW4+ z+iyZawP#*MIT?m!*%WY$mD_JFd!`Gd6H*9^YB3U1E@6#LYkQB!0leO^6a7Q^Gg0;h~P}7@@ifFawO1Es-Nsk4_5LajREa;Yfd5r9mA-J z8rXLtwVZxv{+eQ(1D;O6v+Q_e1SY_(gn%SZLs*ApCFEtjBP9qShy^e%huIVut6}sS zTKwY0Ji!N?`U-;S*MeXEJ1|9t0Yug259b&i$Auiyih74EUO0%&88w`E-tK6NeTU}` zu-8T5rgeprWfdQ6IV>o;u@y}~p)pI%M&fGVSUD8xtCR01@+GJOk#-4eRirJm^+x$K z26}wqhlH}(m&6>A(gyN@bD>|7=#!nI7u7a-FCWTLi~20S>B4va!Bg^K@D}QGC@=S? zui{`%&$hI*ke0mqRtr?^dxIKO#?n|c0@fzk;bf3u(ex`hap?P)%wBS8T+5};mjO@3 zSz|3ikk%<;t2DtI_>JWCWisUxcN^wtk@=UxNL#JK{k*Xzq7<{op`IP4)C1T3rD`y1o^%lq8j9L14H@Di+VWm9%d0rg- z$=&llX7v(o>MN^j!rMQ}6u%>Q!rhs!mYnU!#tdnoy88j_04-?_y9MocUGZ7I$Zj zzAkF@A2wE+q&3$Dp!=13eBr8Mscq3t0gq|Vb*8D30QK+-_;-(^YfV{+!^ejEYm;uz z5XV`!cb~P{;axp>@}f3{y%IUo`qM|~r3-VxO4V??^)pD^{E4+>p~d*9U2A7uX;8QG zm}M1~gta#X5GwX{_azWy0bYv|3lCUBP`etrd>Ziw9Qaz0dPFDijea z7SA}_5mh@d9!N<&2ZrJ%z@=4oFx>tt<9xK)2w>-WBI_5B_w{lT{K5mT1|6Ni$>FTj zt^+Ejkt7kH=guoA!iT^D)(rT*dT4@RuxNe2UkkZf;i{877|zqKi=t>QHXID-8L&wN zc+^6k)L7#SG>Q*McBp@I!f)ov+H+w?w)EZmE*A(6^fe?RCCT!80zzegoPfk7S^bCn z>2IORZ*4faI|1Ha9b5Px0a=}1zrZMh*SMph7Jk7`;E#+gIjJ8so`|-RyN5kYP+_f2 z*O_ytS&R1X5)Bv`12z+^#w%-KQq~B%ScKGn`0bGL8H+mhf5nv}w?4>(8V@VDtS?-B z7ip7p)yX&3ejii!(fUmM8n0e|44rB%1VuQu$p@3KA?;2Kj)(L)cf!{Gi~a)oI-?Be zhj$C?rU!tjibJA${DD?xpR_%&k6A^_Y-;CZ960Uwooj%&3vtBqso&Nan{j0f7Ikuineqxx}G|{_$E_d zW$Gfa_Kcs&yn)^CL7oa8dQ~Ld(!_v7uQgF`{te6`y~MaOhazA4ecge8ZK7=)?5aDG zlPScF$SbHxaDv6A(WJ_4ZJ>Qn(Jtv5*I2h2cQXP#I2hoyf&nIB9CiJ0MvMH%%D(Q41l_yiO{(S$ z4_9Q=x59Qp3V;lQ46!!JHHKq~C<)fDhTGueDQC%fDqqCZ0<9sPJ;kk(>;EBor1;vz&}qsaYLBY&!h(w>m;WawDsIhGNb}V?_I)8 z6w)0F$S<#58DUiozQGWjx>;lI+2hHuvH9pZpcyKQ6^qlGE}LR>)J!zHY9>It)BDoR zaUW(poL_Tg(mQM5Lb-(1*vRAPa@2j`D7m^Oz^BlS)BBG5-Oo>+QDlpb<9dPV{ZrYZzSV6p+Nd+HzX%Mt{W_%FAj0BiID~d!k8Ek-|$Ypy?NPU+YmmqjdA)&k+YHi|slqnlDmUiCJO8P$7vc@4$^Gv~? z<1@rsjAfaY=t9B8Bu;gcJ3(jhyxw-&^8--i=92_kLQR#>d`)@(;NALzHI&U*l*@zX z-TTNU9`?;mjVAWUyrYhK;z?V=J@LE}n5Yar4rJTsd|xa2`?oq+`*+6Ig!RgH8`PFA zBbm70q->3R954D(t^aM`wDWQ1A9BNQc~081DUxkXNa!>$?)1b{p%^r?NxBC(BcKn> zQv4qDA~gQ0d&u+XPwHY&-(#pgcq_-*9=>-8c>0o~fRACu%P(AON@~QSTF|!!!}t-y z5`Y(NJd$B*?sl!A)WGgMx4Eu;dHU6pyT+h30hM5Iq9eBjE2PQmDdI=~)JOAWQfK~GRP7uh;j!S!UAL$Gy@?ROm2 zvRK^tXw;B_9cR;b!k&}1n;tppn*uqO)66EzWu4zHdR)@7PFyvEn7=*6X^)bDV{bl} zLLc9bHI3{d@*y2uaWlztI}dZIIh8^(;OJ4WveA6QZ0aa47aWla&B=;sce|yaRq>I+ zbo+qI@cnWCGF1M}Xc&L-OAo6^iadwHnx}lvXJ_oNA@mE5_UoDEq2__aTvx+FPv8(< zChb@!Xis(fCA{Wv`5I%q9FXEdR|maIV$leWm|{tw9~#lb9dHBzEarWxBO+th4~S@&NMHRe=^S;_8|aFeR-QuP7VXqc1#`NvTWYiTu;>YsJit34ytj@DHGaL5K483c#~BAbq=zm0^!OY>qLB(zV(!gxX~Vlti|7L3PgqOpZ6h{Enl)m*C-adS-RC1|mXRr& z&ovzr687Hw@HDV0IFb7X!JPJAEqwi$vXZx$VdG>5@Cu0 z%HSWu_T9=1f@Zquf%(f>5!Y|HyQq|Qr}uqRI;~=oJnu}WgYL9IXwH=uuhfkj&3R|S zO4&nVv{W*ZAlW~Qdi)AW{`QA@g~gW!zvXrnK&^4s9ZyfuOn?|<@O7Zb$qj%Wutk>^8xA*= z<{RZARaihSMzzb*OS>@~1G3q*HxaL+*?RzH;WFRInUJpGxHFdgf^Tz3Cq2c(7Emv? zk%-#?1^m`Wz#_n?x1XtYd|Vx6vpq4K3!=3*M_J3vONfC|37H3j)T9;jOUH7Se5Dni z0QX!%8tV{^HaK450mSct>_S3V|N3I~Mk_#6&>3M;HSbNf1!8uJyfBHa#72OGE*mH*OeS5-tX&a(;gJG=FNy0$VvnnkK4%(=U8qf=V0`Gd&U*ML)NQnu?0rpSNI1>z(o<%EjU{a4x6o?`uHB=p(jmcb&egp7R5aok zeD6uv+8^M)Bd4&w<&`IN>kss5emv2K5B@mN9h%=C#g2q#5bUW~Q%7?S%TWsCtH>*J z@dc&gI1=M8E4T!XMOn``dNqCDNNkloR+UehGKL@8v`#&vj?dfumJO6}D=g9YyiPqb zm3~|~lTX$W)hxEu>%ABiwW?6AknTp32Hgy;Ztu-dqj+5^s~f}9ACk%k5c9f-l;WOt zex&VGCKk&5s}fYrZEAoj$=`ms4EwO&@iK|*=4kI$6kVy__n>wzh9yF6O6}TZo&G|e z`7@Z9u>LX`?x`JSu4Qp(&za|4G#!@jvu`y zVp4f$UVD~iT6?xqx){VqAGH+zGyc~G9BV?Vb~p>j7AF5YD4d8w1BM`(pSVm3XAfdH zj89kIR-VG}kw&f6isdl`EBkly2eRv`lxNxnfU%R_A&v=ZiW%wmXv;=%nmJxf{Q?KDPY@pz>OdDiPbzrbW zgT}V?0@zVQJ1Elp>JUFAw3ag(HuwIg6HU8vxp_uU zk80`M6Xa+W4OQ#nNDzVSPImfi(0{udP${EcmWbv`RLr)BeUj-#2AKqsu%}U}uLG6h zwA;b~M^wUMTctX*shXjF{DY)C0uL^TJ9=PI zPv!-CT*yK@C1d%#v3QIW(rhRyjzz?aN}0i8^@XTI!!m%)AcFt2`M3mUL)2G}zrvS6 z=5lE4!O#zZr>#E3EGwrim#QO$UWPIG3=e}0a<6p3k|CJ;HI7qzormZTaJta@?vAVQ z6Yc%~-~gD%m(nQc^ixdM)oPm1v#o}Y;ys%Eg=2-4Lq34HOdL=na@0&fwN_GMr1F7b z$Mwv6_LH&=D!KbB_fK^Z8TZNxUXkknPXb_Ek!TfP;&yXww;0G3!RUkbmnoP@%x@28 zBjDj|H8_>H+wl*o@Bge+-hC4X4RGuwbEXB^CDJ@_?DWWj8Iy=#`fGT!wO`#2o`>&j zXzu&J!OHuFDcH@ifZ0kIyFfA@_#}Aa5u{dQq4HTIuI?5C)aXsRQLD91vu5C;g7)Qb zc^X0{r;Deegv(^1GT9*TL(l}R)AG=G=qKB=7sg=erisJp@<&$%gb}Ubf#7+S^iEecJStQGP||kfkb*`N9y_M;{-Dn-r-0=sK$UX zg@WW&%zFi9o4FU+8*{-z4rWBx_&8EZ*Nym(sE~$ukSLpvuz&l8Mb}jpuFjYg8I@XB zU6}?We4_1bdxE|iQ@BfGyYI7W6{Q`ksV?%Wj|F%oOx!@7`c{~u4GoUZzX4cRUw$%o z7isDL1UP@HC8JDdKdDu$6u_nA=U(sYQvS3|gA7&p)UFsdU58cZDJ?{Ii!k(kB!z;I zQ2i&@h0l+^xPST+|NfN%p2CBddg8b4h;rf+5iEShq$*EL%xLprqIuM&-S9vNPc$SS zb>QYiIeJjxY;#;)uPy;^UKSlo0-yeuyphxZTe`aZUq}G9{wFefcmXXxcfIE6m z1)n>{*Ji=F2a`hAg_s^#AjUMJrPiOMh_g~Y)&-h}r7*3MLXpeHn3O?cZ4Ay0f2oc* zwah%yql3qz!EoX;wia35gO9nkK2I>A&qq?Hj!wVg_Au3uTBl^!39=>?C2)N-k-d=moyaeWO*)yl=C=jnf(VwbO&5L+TC7f=JSG`0YSlp} z7ugp#1*zJhH_R;^tQ4+lxVrNMjpr)I>(n0(7e4Lrw=?jg{Tb1L|8%~BR3gC@(QdPO z`zCS+cDiD72VQmN#wa<Ug`zansAlgqJkM=FIwNmX$B=%B_*a0}A{xvsn@x9TF-d^`D{aGn8G zSgJouElDWewt}-qNeJp%ouC?k7xCd2lsPLJkdBVA#`}-$tK)y-_R?_*5f4=datwi z7DfO6<;f_V7e@*_8F_#wW6=ANtXA=ozIjFp9unH4F%?W~GHXxLWzrH(V8uzmalMA` zMCy3&JL%C-%2y99e&uGbCzA@=755r7IALgX4~aALEj;fST28#H`1qG4<6+BRmWz0Bf+;4jan#4T z{D2BruGzlmJa3{M`iiR?_4Qi*LEHxlgM@Ausudj$x!^~-6m zPS(ZcN2NGl=|*a}7Ml%UJp1SF{Q-SN4YXWnjq=E+~awRw(8f&I%i z(JOO@q301VDrBJvUoQa1>XCr7hVrm@EALvn4_+&=HhyfU+NsfO=KW0G*$7Kj`3nV^ zt%c)EDCcsj_&wzj;o#jwuMdh66_(5@l`A}$`s_!`VyZq`cz>k%w?=8i7{|Vxb-*k2Z(~C&>i`FM*FNLRC0&~)IT4;FjPTs- zJZ_sI2C?I1NG4OJY#uk38kc}@oX&bXL+nVmh9z59gT}R9(A(bg3|Y$MH;Jk&MRO&rjBZBl!IUq= zv66`o`c)!zqG*>w!>$kR8$@u69+ND}YC0{;&AcgLeKp{^bcm0Ff_&>G-1>NMFM850EoJL>sOz3lPck|5CTHhB7Cm8<;68vn+T0M(-ubSK_{ z|KpPR`;fiiL8)z3;7O4oMz=}WgBf7)%#$pnmM1O*H>?j4*Jf~Mt?iGJL*kPIv@8R7 z?vuh9YCG;X@|Kkzy$o*43+OMeV6g@PH8Mu)i~`W-m*KSD$F`EeIPYbc-k!57Q;x4G z`fxmN_1k^owoKcb==D(KzEvM84(6R|{dp9ciHEwTuddZ_EApv3n6+&R@mp1(ODji6 z3&BRFA@TI{fKL8{^z_?f+^)(TktaW8^tS1?6zrN^Q2|xO*K(9 z^?_q09JdF1@&EB?fo(%!TT!F>U$+e=a@$~LQzSeGFY&wRC!&j<2IVOWP7U)ze%=2M zZ|@z|gw}13T2SE7L5g%lK}4E#q$5Rv1O%i?fQWRJD#QRHy`%IlHPX9+(tGbsM0)Qf z2%)|m&(ZI@-@U%y9dG=``%lksa5UL_?YZWfYtAkNvT@d{lh9p5Y-X;&VCKUe)U;gX z0$=AFrfa{A{M0D=vig?Fi05T|d#$QWE1SW;FvcfXR9tIV|1bM(?d?82O{Tls86Pf- zS?}2V;DjGCMBhJh+-Q=CH(vqNPw!8KET(w+;(Xo}!@$RHaU! z&1P!wK`ymriS5j$s!>-t9I$*g0`@LqD}hV7j$w*N{>CS7ej547g(unSN@ePn3b769 ziH*&Hl^|*3|60HQ$2U!kz~k6hbNpnDRw}q)t0_ui^kob{aAQp z8JA;~LqlvWSRwTKP4|5Z?BMXA_al0-1k^))31zH1C~hJa#y(_SZkKyxdRO7)mo|T8 z2#r_X1X*jD=T&&fmt}{h-(#@X%M!;K%1u+<&+%y?Bd;@SZ^qY1 zuJln?Uz_49qwezSDzgPAjl7HS5W~};4*JpPP$ApXV+?g8i7_FU!h10s73X|nWwZbO zj{ObUq){wW6iIj2176kqj~^odcpn(ggLI&l(gFVF>0*n{7`}lEzF+&20xpwKc*NiL zJm7S@X^+E1Yj3?}IGwzbzDTnmG9MONp4OhlC}n5FUeKDnwEZ?oRJOozCNOlRfisfZ zXHW1}fpvRZWktyF{mL0lI)>CTicl!$X@SX{+=N~3INFnnoLEaoXV;`Hr^zzckbvE% z2(N~(lbYa#0}Fbl)+g-Z7l_6qq;4{wTds1t<>M=ep-^K6SBqpFL|{6~qPFWj zoQF`rT();$j;`T$zr}|S1s)xO$QVH61gb-_^G@NE_3M7vCa-oHWL+l}O0@HP4-tt-hIHPd_XEYu= zwBAuMpU;+f2LQa}Q4g?h^Fxuu&ff_CSMmJ^`!itC(8h<3^{zi%Fe4pO-f0&dqxFOI zy0SU1#V@H{!EDb^<=OSXd0LxdRRmJvG~ zL>AFv?Z9%CMNM?5=UH)AGe;P8qVHKXGrhX%OJd)2r#V>^?nN_i6cQ|IMb7l7dS-IQ zGs2cYz~(sTx{Vk5#SPz`2h@KBF+G#9=5IzlJ;Ftvq z1GrEzt^Gc?5K-dx9idt_6*1By`kKe5ptPV%KAjgS7pGII10A zxcx8d^-n0&oxeRRW;r>L`#(cQ@PSG@Vjo3@sBX0Qh3{UAUsGH@>vPKTjjO)(y4o;( zFV1mGrl@ZEo*(rj1w*j&{bhE^n|xc+Wb+!X$o9kb(1Mkys+lIf3`VET}@!;S!zkH9kQ+Ex;MuvZ0|*L zzk(RqdSj>fI07bQa+URf)b|6U7}!dw;(Jb&r@ZGKe;lE_`nEdHkl-2T2XFqsK?Roc z7pdxFE?M%2xj3?9ah=;rFTV8Q(3y*l@Td^Du*HTUlPi)x;dHf;2Dj z@WATiLVQwYC0}Q%YcD+QvS=2{(K6rlgIjDoqA_X@uID~|(}xzGrYbOf)%ms-E9gCj z{KS&~bP&XF&%4tMiH?lj75s1Q$KPeU_65t-E0qRsYqLdwHW@u?6U?FaJUj4V6vQBU z!n+|r)j+NJ#lvaGfL!_pdS6u{H+H9O>9#A z*XW9`_2G%X@_OD!E^&65GKajrV%CsE%8gzXHftd}#hGwpC?9;LI~mM5|d z&XlO2^V@9`Y1nY6g<%OA4G@ae|GF51WAlG1#$JoYo*&^9J;_p1Tt$uK0~cO@Nt1E* z`Gj9Vox~2Vl3O3Y0!_on6T_7UOz1gMbsBeDnGPCc3`LF)6H2A45XQn_^p`dwW}ZA-m>0>-LT}(t*bJK zpz?yeZ{t?mGWPTXmM3D(0{0|NcjS3qKe#(feiN_LKpOKQAAvp>l#FbzY)6$v2?e)# zn;UMZ!{?udFiE5yk|tgqcrs#uY0&&+anj-Y>>+8AnNcZ?$1Q9rejt$8@uyOp=>1wM zXeD=b{f}73NQ87tA`^S7X1x|AE_&ZhlNbv2@oQF@wy77DpRx#$CM=-vXb9j%8B@1V z(5Z^|(mZ{eBsSw_8FbNUo}G#g7{?dEId{_?NN_yH%I>TQ4V2m=w6Hy zqFKa12++(=EvH^Q2M2XG)ju3xk;3B(2lq{}W;}#m$$N_JSiVX%GVkT-w-0e8uF>s2 zEI1tGT&3`Q&+2}kYG_PLac`N-?jg*{At(!kxRA|1x{a98l9L?6MSR_oD{zdih)}d` zhgN^|ej`UoRewzEJVD815LZ1MLcbQ;7qm^afnIhatKI!8B_J1aiy3R_|CYGAdYz53h$hW{Z$M z>VI*Hq)&NoZ8$jvGmYrd?LYfd^JRo{OAZU3-aDi|!}*NgGhl+yF0JTm9J*p0&B(}( zKpeys%Un_LHA4CC`$N)A4*L}d-7-S>t}#?u-Y+-=NcM)rDc-7=*@KgZ5sF1=6`~DAu_e>;x9WheklCu6XCVSa-Y_{P7X67 z*bV0IeMx?og|BdDLiC;zCsTB19;EW+_7v4oW@r<-fkjQd=67`Nh_#uww?3_Km^~M5 z^;gs88}!uik>h6|ue5`XmX8_cHvY%uFL-{KyWqaY{IDpi^{w!I+BY*Erh z$Epy|N@9x#M;75TWAJIfA~no~nGrPpGh|(Dp<%v!rwH4(7diH?Ng<1@@(<@w7Wwqq zzEY`r*`ZAEMBo}^a#gs+_tv-QP`7#@L=xr?(N#3#yAa6&ZiA_s*xNt8SH#%&$~JnO zPUsKsmGnH`0i(uzn3yp$DPS`CzSFH|na||(H%zC4VA}InH!_=x1L<>PUbN9el@h|j z$n2&<{leR67;HzkM`FaPR3g z+hKdL%Fs~rZXHZ-5u?|bz_tseFHs$vO7XQ*7HGvpu@7==r7Y&-8$A)Ll-qvZR%y3& z=<0l%6I5FjV9gitRP5(#*=i|6Nm5;|792N*$Lp-H=p`>4fQ(Qy>AS2@l2bgukBe%- zFjt_2)uVlVn#p{prXYt_qegQHTajU_EN8`iY?r1n$4j6EeTZ#AuRz%O|8zDKS;C}( z0=~R|JloKgT`Y8v=S9!w-c9La6UtwlPKaUzU!68`IRSJV@>m1<>0ompoU&~ zb`x<=V!Rub=D&KMm@H}f4LPemVTmez-_tK9O?M+7?`8Ruq$VBaUWL&jEG@Yutv(cE zvuAZUG4XJ@NXNm(keZbaVa?dPpyJB0TR)IO+YsRU+`6Fgy6EcTD-MH3bqA5J@ot_Q zUMON6W43SZI!ErAB+`^4X@4%G{$h>V2_GK;_!w?>k#&K4k+$dFk@Dy9D0d7ir4ax`+_ToGeC?uP!@Kb|WK?74z` znVBf~)1A!5wzeyL>*yfca%);(8a`NizJAv|&A;J3l%hxDy4gZ${|}YUCb?ka#94eZ z%?pZ@9;0pLb8eRTaii_DbKI*f0wbuF-!Zf8dp~1l1+-m(8_uto*-xd|nAwHti9*8_ zQqK0l!roxuKU+iw}-rJI3&6q@#8stI7iobR23<6Z~GBL(zJAM}Sg z7u(qxB;F*^&LA9hhy=BTT20^f=_552p z*$UuamQCg;`N#Hx7~8bl=a;?wW79q@i*4EozIJ!h`F3nj;*DQjZ!;$a=EPSPDY2_7 z3t)BSG?GW+=jsX#YiE2#VP^*L6h6?1Hs~Z9GBX%9BLs^pz*VIoK~ZRkj9Sb7n1*$5 zfVNB+J*s>=rbAo8$)qVT*f@k^kEDPH5s^ zhg;|KLBXE8>(XTjFQXaYq|y`)-P59$%9GpMVo?xH*UslP{eqsC%mV&!D8=?T+SM5i zU|eN-5;JUD3z1_MhXy=n=xpUbgX7%7_FjM0Io$f=heLzyy&Aa7KmD=yGRF2^#^;7O zG{DS)kY*#`^7K`Y9Q;WN;+qoUkhk%mQ@0g!JhaPd@Tom%WMc9X6(vJ_6^t@;>}_D@ zTAlU0nHhVXC|T1A1W(R2W{Lo$NT0pdLZ4!G)=0rAg$Onsn9yW3Sm7JIr&&+|Gh%40 zxt=XsDk{`OW860%qZem&@dB;8b)(;tAYzbZYEn2*{^14)iwyx`u|Xg#cI;u>y{uR6vm@8`yY0#E!g_L~Yw@ma}9`f+ozh%bi5Ymq=rCrCOH`^evj>o)z< zBi}8{>`p`ZQt(T2=xT28t51J|ki5U&M0F4B(4yG^Qp%qCQ?zd1{6fg_kWZ}HPb7UO z+7JnCs=WvjvZ!DY261pWq@c31i9(BeEhviv1UM_NHa%)4^_^m!$X?;sc11=|Ghj%Y z__$a3wN;0r^9`iLyb|U{;>x(KZ33xAoQ%k7O>}NDn}>Ijagj68I(f+hn&Waj+Ensu zM{p_};x?q_>etXH{B4dp)7m#E7g0=xa^4&Lz}}ajlb0t7u`*R1BdFG+b{awvi}o2S z!WLK|ds^|LUW@m!%siQt7awReeihlaKcVA9A1von%DHj!C(h?R0$cMLHOvT87l2dw zCjM zRXS;3hAH_wPeYbWcrV{xdw0jo-gQ0Dxp^njP;^Q83-^W7CBf*>*0#p!v^}*N15UWZ zPBf3pph?Un*w-xIh`rbx$tUJRx@^slZNV&u{6 zVrR@U*_H<_X9uieaJFDPs4Z00Kx?6KhV?B(GUIW@ma!}FCyqxBrD+7M1%UDB7o(3x z`P=Uie`(zqla7TFD7NTGPjjlBJ9mMH2Zzl6((B`;GM8h=x(pJn%b}t~79X=hb_%Ju z|FU0MF=;7eRA$)eWo^$oTq)wqoR*Vo2Q?3COrOG z@N&~tLU5#PC7ZVIu}>^l(ll&p=FZ4QdW-%Hcg0*-f8!o0C!q%fVDl#3pLGIPIut^C z!*d1!J?yXQ#@Bg`3Gq`L#)h6bi`whsMD6r{8hic$mko^Nm#$^A!|V+gtS=k03M`-l z;D#ZWsETL_NEZSY?>%`8v|)J$o(q3#!)|=l6g-)N>x}FGO*FUP^VCkJQejdtS-c zl_YUj;&3TV6!U;HFXHp(&;3v1ZK8fAVE{XwbV_Z5qPY5QlivkB=r5dOLlaE{h3EDE zlrL$;YuE|LPVuXOKb7;}IR1hM==U#;kk{`fVh0?dS9UU5>(MXnHuVJ=hgK+cH%4wZ z_BI-O<7O*Bwq=`OTFAE88^Ug;u3d78-pAR>+%sivL+rvr_pFR=O9&0|U`pm9iOwFj z1{+0_R1Jqd7G2Kb?9ZPN+8D9*U%eM}bwt^u#P*8&luNHJ>|Dfq-I$qhLu7Q0 z^9%BP7~eIf6%NDG(FYuh2eS7R+C}WZBeB-rLQ{t;Q&46;S=^VCgfOnJ%!MtGv7tNU zK?gmD$uFYLhJg=Li92mbkF8pU84CF2VpJqMg9l2Dg%>{BJK5+$)cF}4+o6%J)N zpGJ|T^91gkC}1M+D3pgDY8`;`70wpVPD38_gJ9U(Oo#m-7*=h>DjE)?U0gq}(ykDJeLbwSYr?M9=#)iWtKK96%FJh`!V};8`Gs*d?79&9Lmqh7_W8nx z5zyBkBoUS?spedb*&mTtW7lD4-l{1tWFZ1Ld;}__2el;~gve>J7#ZdG4FQg%j z%Zlv;@1|foLEgV6KL7rp|5IsJtA-sa-CPp=D2(%FtMcXOh93Z_Wa`w!sPfcnG7Te* z#3%{|Cz1C%8ibNBq{zVWp^>QWY~v_)AS^MIkj(ZbhAp?Y(WJCA>zRXKw85JrAIg43 z$Mz1irqK+&N3jLdqh~5^ach1BC?tbsp?Lc4O_n+}Z*SJyN`V8HJLG3Cwo#wworx3X zF7)#p<&?4!(sWddjHmGu#l#E<@Oa!{uP5-~JH5u(Qs~C#H=jPg@{Be?}w1?!R|kvuT^40cQUL1lc)UAa~70RGIL z-(%BAt^QE=<5_gvNM)vP*I&P`xPlRy864rXMLh)j@A6oC0UY5H82<17@ZSU&a`K=> zNV&Fj@CXlQ+9kAil49N8{05AIn**tiBLQ~^GWE1-r#a=QglsE=cELfwIpvyA2UYgx zWRbKbQluY+Vg#R9YYJMx78?h<`ko!c!NNftEH{XQbpi3Z8?Md}ci)FsK%xF1o@pepCZ#11L148Cp3^ya(&LUrsQ&L3~mZhlO%%`xV zm0V$Go~K9cma8u+&=Sfgo9iWlN#)rsdiM27ha}m&n&A%fL6+pK9XAtR4+Vf6x_$aV z(ivC|?}dnHu&pnH(~^vn&l0kcOfg+ze~tt1q@y#Ie*ok&e)T*cT*kC>7N|%rSGW_d z8~^kC7}?&d-Mm57lCvO4_gijof(3?$a;;9kKk|RcCI9A$JWjDi^pv#Nl^6SI>NS3+ zB&z49SKYn~kHI8#DjS;J*YjEQXCP)T3J5h0A?pbjb<6NW28D=N-t-ko>5tr_^bI*| z{D9?pH_~RwAugh)0Q@BSA>O>y6TS4=IBozYDOcIW5ITTTSEC-ehgZ+V? zjCIhxl2rW`omU(qDTnB67TAjYJBKXxkGW7t-bD%76H_p7N%E-wXAASksPQvF22z!;jji_97_bWe(%+}ZB=J5^8~}@Duz&^a;QC}Bwh#mF zf2S;ThM`l7dyoKDz>-S4#a7dwyB~eC05Jg1TQTSXC<;8LqBd1~!^=RHX;bL(6M4`q z;{|=(C+`v8RhfCd4&wb1fX$eD`qvUOR7SL+7|8D8wkc|&T2_6I&^S%3S}Q(&+5B&i zWz;>PVD5M6P#H zZ=W41iFtx(pqmKGuQ@$*z|2RZv}+EBPP_@n+@?HmGY?)xK}6>x4DH8(;gv;y`hEX_ z-u+QeRG>J|{v@zAh)VG4MsQ)jMvtaT9(`!TYt??SSR0~aw|U^9trY*f+U4|(CXnr# zbRYSF--&MDh-?dIU*w^Zar^j7NDWk}6hE5-iFI13XAaMLzx=85d`(8<1e#MuC%?PJ z()$2PG%x(4gG1vbK!T?O14;rI-MhB?INFyeTVgc+j?(4JwYO4+q5Y2AX@cWd@3bU~ z&!k6H_s_~Tz<|&K7L8saU1+?PA!R@RHrUWnN6tRsAb&?&atE+jcQjdWRi_HoYOSca znNwBo3}?<2?1d4~rH=2&v(woI&C5LtNxoNLz}G433XJ2+J6YWkD;-jx3Z?PPmO_3d z=@R~(q-!-ISswuh@wS;An}J~o`9sW-o9;|(SVqf|{BTfBgXT`@m9t2PVMK`kyK z0Zq6}BfI#b)tlNd28(D*`yX&-$PtTPuiCHL>_Qz1jUbj%eEUagPWK$ZT66|@4EbC! z9k2}atP}`K()glM=F7rMUlc z>{Iq-N+oCp+bwC;e%*SwE~Uvpm`#J2(M%Q-SiTy)2al7tg3IP*q^T1Bn>Kbol#QJp zE6H|j0scfh-|afMEc|bvtx}%R4xZat^r3q;`ht8Dy*$AG)maVy2=7fTp>DiJFw4c7 zgC?GhhF2c`ii4XqXQ$X#0aAnMdfpF0Gbf*SD%k?S1l$bR9jZ57HYrs+GpN?wg=ZVMw4(Apj@@$K_S(PFh1&Y`CRpPHl=4n=Y!8wx5wVhG zQBd{6a{lSR+W0~mR`8}%%?2)J{P8>VVg>>Y);ZarVpH&@TUswyn};fTmf-J~To-GY zd=lcwgxcQqPfKABMe}uT_otvhX1#}z0#EWo-@M#{v6OC?m=f;4vwRmomaoCs zzp{L3K$h>L1(4+{Ky3>-9n4^9WR2sADZ>=JE4?~Am9Gj?;^L{B67Kx*ggCCzDo_-V)Mh5rIDg#hR3AVe#6PUhWISbIJL&6-dg8_rmtBp45*V*B~ zBscS&wb;|nm`417gj|D21Mu=&02tcEesDU4D`g&Ecrq6b%`AeqJSt1@e%Io)SPfDM z+g-5HT-biqbq&s>e{-bKYtj2cNg$|*yl+TpR5x!pO}g$k4x9rkrS0ey?V8VA5!5aF zWHvUv-M{XS7|r?Qt?@eQNqyn}`5_IGmdA3yWML2u#n*D@Jl&hx+)L6VC{^cp%3}qv zvAA~>w^I08E^ktvWIhGZz$6kH#L9+7UGN_el zJMEbXo$;&YiH)3)vOX5QyW0n)GiSFHBj}GFp zF!((iA~SczVn=S==b#c4Os$VUunfz|mamjb^6?z|z+arXVa{F>UMox|ONtgh*1j&k zQ|7)80?aJss#XhXB#(|yHr=6Tn`b9A^q;ny=}-(W$N7MN>NBG1D%B)#QII=7fZJH0 zLkq*pCw3wui&dMh&&NQ9nZ1sd7l3e>9!%ppD9HuOr$?L6oPugZb2!Ca;cwO@6H(<# zdto~j!`Sz|!;#+oczYSRPpSe3KW8xj()15Y9~Qeq_9}mjS?%u4#}$AGvt@=&XGO%f zZxh4slnO@hFbA*D$I5lXKG{k)w5DhBpjnvQJ$bP+HXJOHCZ9>} zqTg_R8ZS0g;hZ0@u&02TAI=;Wt+_y*z7J48&iL^%?eVa@YnndnKRd+oYZk>E~>a*?E_6tNBUH^N88Uq^V z;B-@$pYY>%2lDH7{QZcLVWFe~wH2SPrSP;acm~Nje3$}iC%vNmm0D;{v&!QSc%wo@ zL6&dS-&ww@+cOE|Aj+3!p{$p6@LCOWiBis$wxV5-UjZcf)~#Vcl5duO!B4&FRf++dalyK}dmziVab}ya4`DucED0QXSt9Tn8ad~rdBB0;D`We(ap8on(Dzbng$@0DE%XB~dzte{p`l>07lFn;Dn+IF zH1+3X@7yzim|Dw|Gsv!>0UEd)uC)okBO0^?X8oKX(yT7*K@aFbRLnD*L5Sv&L+yFo zbg7eND8AheTfFtVVZ&GJXn;ofzdH=5>XO(-#ZZIisfwH6oq!jU3d^zb#alPP1w85Ql zlp#P7Y&$Z=Z+eOPmMeF=l{;>isN`G;R2iY3zFNP7jR=%Hs3XY)hT`_MR^nLSa5E4b zQHt(YHY=t)H~|>AYh)wND!*;65bHpm_hsWVk*LcF14t>--LJh!@}zzjfRso3)3iHc z@6d|Q8>^pzc}t><+pCc;6OpjpO39C3pT?s>KpER`+v*}K6GrI}l;7-k8$UTOFa!k8 zXx*gsDb&wu#;Q1c7jiyOz3Z2D!LJ+b4|t^d_L}pXVtrs z=j`k_5_Gy=1%m7}j_pf19(au#P~;2+Mgj*$4%WJX2|LMkftr!2=k&mmlREGp=;iU& z3yiH8?`t<${oH2!7t;QHKWb;NG&`X4=$3Pc^KY<=Pg2@E6ToH{5ADSMoL^l7*~Pwe z0ZEJuL~j`wZ_eIn;pg)`;$Wd7Q`B0O_Jv)|;S)M;%{yFrpe|`w_zbb`;dsCF>2XoC z?E$a$ZTN94zk;7S@xo|K3C~IdkSeFjwU=Lt6FSv;CnSp~e<$bS!197zy5E9ztP?m5U-C1n*&dZrEnef%Yf{e}puX`AzVZ<=`#Cr=%V%&un+LrC}uCNinE) z!Xj?|tLySS2#_`n(yo2bN&A)TCx9n_XdAkivK0%9I6x=1e1xw}$d<=}w+G@11V~Jz=_wBXI zkn8pQunjMR&Pi>&x(@D+eM!1Y#r&|DnN2)c*i4`z50d4qN{<<-5x-BGuu};<1k$m8 zL$2K^q7)3*a~I`_Z_B9UBrvu34B~PQOekT4*Cw$&X=P^rv>$7T(y{AYpdo3&5&7wl zJn)!clx47yFa6Qg=nRKe7T+f(f>5p{=*Kb3oMZXhcs*3VC?r-QAh;6j&-WXF|DJsO z*YoVrL~?!-u6LaOb*6CUS^e&s&g#JTRmv2ajZCHbpy?Oay2K9Nj{;Yi#=uSg5H?10 zLb~I7z1J=?-b_ViheCB>m~E}^#oE~L<(7Q6{*fX;8~r-Ci}4n*(a{wC9u;jSQ|2@wocEo$@4d zpMTOFqqCOH16z(PK@W}1QB3az_LS$=B|sNCu>Th);Cgg6cd+Hg_5es>$bl5*NP!}C zjx|*L;mbD%50g~%g*AE0K>*KgR_lYZ_FFk~6ybtQ)@N%aJqrW)Bw|bN8}X~O0`Ynh zQtyKPTm?_hGArZqV+9n++3}(jGz_lnG1mznXAy*f%&WcdL}jMtQBbD83ApUci8FQr zC|Zk$!6z3=&zbPj3mXUph7l?TD_zfxSM|w~SgzG<2S4u|H2^VlnDhmY+*Qy&^x#Zm z`G{rv@Q5~&k`6&lI= zS6ltD(Q&{wt4rk}tTxo3S>+sdz-slWpe5I5?uMs+0?548HL*Jz4 z30-851EJ4R*;wZN`8}6(QTF-=%p_@a#2#uINouWaUzU7sC5Yi|qZ91A+feKzf-w6^ zydLojrbTj5-l0mDqPolZL~00eq!EaoFk2f|_a&hX`U3_Kz6ko{kNtZtKAh z2OI=6biC`Y;l`{w67el*HfzCe)J>JKTga2W5i|0wa@*ORta;Lo%hwVtiBp0o-eU2K zo7@5bn1;J?BiA7f3wyn{2|Txu6E2H4@>%YEn!tG|gwn)1y*KRG_vt@g1+VmyIF3TY zD}2b-qQKm%&8n9=+{|FTq{NJULSqdC!&eQ99B(!3Mr%3ioqsZa>Ls|_h?_L}VkHYT z{GEkvcg`0;*gG{Sou{#;D<2my8)O|ZOctJ^)F+Y@)~&0L3ArD&_fD(($+K#Tgr^=bK z2iukjqWsC76O(1%0MFjf2{!nWqK!1I|B6a_4QR()Zro4A!K}eaG_I zSOOJ0%f@sFhsEjRqb%hL7YKB2SbT{r_-%GTMF})-F6u0spMOKW|CngeNMO$wB7a`# zD?YA4vsu}IiNs4qFq3_*(P&g2|3Yp0X{uQeuR=@ZV5H>IbU?t(pqldcra%qsuhl?O z{b6NRVl&$4bx8&xu;? zdomiL%^MTjAuq4{RehR3SS5=frwL%@%om04$|WppJ}d!w=7T46&&pH2Y9{Y~L0|_* z0CKvFfq~NM;pt_hizPM$UJBC&?dSfo_U=38Rj>ho1{F+8QsSbodE{h_xV<&f&%j9M z2~w{rdd6!Fc05CkIcWt6evf??*!8yDaChuEMRz;-cV8ug4(7(TJj1`*4nH8Gp!L^o zviehbtDW(Fy~)RAIAUe1YlC$9WR|MZgvsl`Uh?v!XOFXPh;PwOs7OmGZlVXo2F+imbAXt2{rpxuj z-HS(1;wX0mU*JvC<~Sd`8U4U{!QzUmtHlz)6Zf$rj-C5m3C`kb(^W0)oCOKVvULMD zNvoeUMWhX7PQmZ5jR0D4v1QlBJW?tw@CeJ--eT5wrQ>!MZh{WNI ztJ=!+@hS8U#9d1C>j|3n4!Eg85*i@}rqVIdh#{1rZZZuH14g&to|QJk5K6K2KG<*N z%lrs-K_c{vmi&PihdI-dX#$9(B?51O|T>LL5iZE;vCQlPQm8cqV{fH&cWuq zw)6eWd97DN?EL#;6uG&w0SWzySBVMpAH_BdyW~d+_B%76X&6L7 zExe4}Ko=R2?ZfA_MdG&QN%YwR!Ysb)fj4J^w+afPu>=}C&5q4GdCy&~K5x|%Xgqh< z7pWtkk$6@AiNR&v3Kky)nkQscd$~tg5K9jhM})T=pbqlNn{Y6N$$!jPr+TU{q{l z`Trp`&z1pa#PWqh)FRmun>du9>oIV2q0px2zB#Ufa86iS&PemU8AMzM@%+Y-sMLhc zAiDeCm*%W||IbTvun+cBo-fo%7lJw}(4>f>0oK>|G=QgbXVHLFKBH8#GNn+`Ss;(t zOq9P5=i>a9AggZ!cr6KZ#+%iq9$C^PWk=WXmCtQTT_TZs z1CmD`xfwk;LO)yO%dczAoq5Qh*FQ9IGzgx4Bz!azs3EAwxxBjn`PhBSlWDGosFKNC z(Rs3N^2$Vkk`TbNV|OPp5LMjqnnj7ttfJvZUh087N`gxgzo<;!e$tqe+KYm5rdxQ8(QkKO;ZJ;O z%;GPLfA-m;wrytFNK~l$y5v;M+Zh@dTZdIByK7Lyjo{CYFJOKnL!jDAto#_}phN8C zz!D3L6M7}Ced?^zGK9A3GXkKQV4ZkC00W3%3aUivt)b}y) zGKqb-dAx#W8on^a1RDyszhTy(;EVrk#k02<9?U1MjoyM^9hj=GkM*VtG_*$?d>mbx9;q(@ zi^fQU^6Jr;frge0i;&0gy%b9jhEa{4llIHH2i9zi)p(VpxspQ*w(DA$ z)VYR63|(Z@nQDrw?KmVmzjg;Y%Z6<|-Jvo6Nlt-rqi|fpwN`lVECH@#3s@Dt4(Z8z zDAMLMR%)>qah$tbj?QM3I|SX?eE1vZCt|46kDOWwTb;A~qFgZ=(MRC`=?EmRHKgI* zNI30m^G_gkS!lJ1vdsYNgh6KUDgHNv5D3C55_|otrt}T1=^{&aL0~7sF8V={4mVq12 zx8%c;OK2HFix&liA(6jDE;Ma;2k68U7{i7qcI0OP%!4_Uf-S(0Vce=Bfhe4U(PTpM zQ!oeaM?jqGnq9&Uf z&wvjrNA*E$@}Txm)!ME6ckVTs9;x>K!IF9hVv)B&<=qTDdSX$*ABg9rs8s)g2PDbi zmvJ?L%EFkoqnq9hWnvN|ni?ju$cN8@dy043N#@YV*8+pD+yv65d!Zy^_qMY`Lktdp zg0y+5kb@eIUEo^Yj+|0d1(st?IZ-C*Ks&>mN%e8T`EPHV2swh`%dH(c!QREreogc8 zeil?~W9FZ3J=Z&(dz&a8w0xdQ-4&yR5Z=hFP6V;q+P^RHCjLZGYolrG|5a5i<`dF$pb&_@+|#EAWaM_kYKU3`fF zlyd}NCZQQ6J(73BpI>H-?N9?_tQgC-{khm`ZV9b5>1XDZ)5)_F7-A^LaL7pCfbAlS zxLh~+Ft()|09yWG_^Ys7$=%qVbnJjOwsE{6#rw_3CP+Q#PY|_#n1DAnWn6E6kv<80 zbGm9vdIpb!^YiS9`a-+%?T{w!C-P zz;vqiGDKseU+9~4IJ4aDe6oj9!eAmuy+Q*7D;^%F-?SyU2!4rln>??J|3>ioQXo%t zdE_fkZiu|HZ87|fmjvKg9ojiiPfUc5ZukNl$Dgy+S|x?4Zsw(H;j^2`rZ4c;N(Ueu z5XG)dx=cu7+zdXQi==6Lgc}7`i-sZ4Myg}5FstU2waw#|AYhf14gqPb@zwR?+tQl1 zg;Wy_JBCsFwfZ1nQAy|BNbltf!V}K$Q+FC%N+f`k&spuJ%bPW9?y$T{bR52q&0wL1 z^qqgSy%~M}f~oL-)aEx>c{I-BAob!afRJp-Za`0}pCqVFZ9w)QH&WK_v zpar+DGDzEPrcE`M#_xZ(PuycWZR(272I{ip*%tPH-zNsbFu$aD>*D*Kv)BQse*;mw z41~G-Mf)?3ga^4Ac*-YgEnv=R#kPW+rJGdR);TNV76uYk-Y{fZx3d`>R>9t|`RX@g_YPfDtB(17pwFk8~WsFKIqo+2v ztN_zH?ksi=YDnWJJvzO4>r~soRz5UrqWbmVTI+JZMy5)e`zPm`bA08()5;R!U*FWs zhDErXsr|L-$xLIPI;B6c6V*QmKL&C~u_~aG>IQStO8QBh&1ug!HL-w_Q^93IzG(K_ z=WGmE`+nzxe%1)yCO%8+Zn{@~em;62`Lwiv_uH>#E(i~2$5-8!y3`7!i+ffuAG;@@ z0=G@MHWcaYJNcFgUF`$6zsYs6F_9b4LD9M*GDWP z*j5z{hG-I#EmKwG(8U>?k+NaE9Md(RAdRU8%Dv2JP)YV)8C5RMSkQxLBf0z@3PI=O zmZJg>x0FpVkb{Vy1UH<221LSWFqD2GdkaQ94p?!G=dj+zz=cYl`D(my z%?Qlh)s3m`)zhS>_0fd5*9;Ulwq*q7C#a8Hz|o3Heo@?cN4!fQsfG4vQQ2X96g8t1FtIt>JvO5{!G$Xp#Eetvu!-Fgo}FB9LNO;oqv(CTM?@2H zyJN=Rkt|^ng_kEjMek<-9=PC1y*O0<>e8922t%9HX<3pQ`ev z)h&%X7wJ6%eAt%NE@*%@gkx0e@nz5WP2}uJ)kMM2&5;eqWusnB~OtSOIcYJ2e~Qj*XY~^`%dHF zwhD@>D?f8vwHCT9p-W`O8i!nkx8JybO{Y?D5%N@mhW1_r#^y83G-=U~;a$tyy4ha< zew5m|{avEPx0!u>rNXntKteHuZ()fCJ$?hJUP_r}d;6w@eX#b%a31-Ia_aW7gqY5= zAdB%bSlJgoH(h~^YXeX}p`tG^*28>rw3R|UeJ}>mH@yBV2sV+YFLg-tWsy#?#^R-? zafN)TO={I$Jf!W}H=uQwpUTH&%I&-D%1VkN-wphKC_C%0s@iVds~{mA(v5;hiAx$5 zC82C@Cq8bcZ4xOGLT^L_)e7>6BP>H!S)*^Zh>GZ|`?+&vnlK>sshsb3Sv7 zd))VL{78kQb$3j>y2s&*RfAMqK_qr&I}%R{DCsch?S<+-cBJ>?Je`J@v;e)g{e=0b)nZPO1_CJt+_vN>M*QrE|jX0$L8S}KE9wH)2O~L5J*z0uAy7nG9AYd_%Xwy zRU)*YIdDvhi$gSm!B;W$jD+X|XJwwb`QJORy+gG^GNoVA z9*Lh2yB&)i0#C|`ZSM7W-deFB0w>!k2B8sTh&FHcu^0;MK{Kn0pvq|)C^iEMuW^Bt z-V}8+`OxZ~z(a=EK<*F5v`24TqB^;2MQX+Rt6`hE=-J;>LXOgRe6wR_ZK$jcg~5cz zyoy^CxYt*0B*OEXNwQb%rhE?GMuaj!whB(U@dJV3hJ#NOl z&eB0u=brOI0r5{M%umwup(sSY>Y#%JSz+~>?pDW0%6OHSiIO(vX;9Q#^GVEks-uIN zkJ^*$gXUf%7)J{qan2b7XjJFU?bxv!oTud7+KUd~N4R~VYfX6^T5;LGnxYmDs~OY` z$($LoduJJ>NLX(UhROVEj8MSh@Vs5gLv`eU7pvIwkhOpoThgV56@%r(8O_dsv}t7= zI&Srj_&<)|iE$5N6FU{k({=P>KRTXd3!FJNRd+=mG+oX)mP)M}7w0d;4kWTbKZS6+`yt%ucwGVC`HvJ=l?nUHPM{DC5WCCUz zjCGgJbCHrKb*Le;FR=6fU=Opa^uyu2&?RK_VF*9EL?X) zRCu2Re95Q7vtn~or8-j;$V4Ib^#qFd7&b&YX7qj}t(QB`SB895aq>+iQ{xM?na zOHZpW@?*#8jS)0*5hz1W2Pd*~aq*RxaR;){irTpWs2t<+4!8Su)GGz0(8Xfz4=K_= zzh&F1EJybDB;nl+54-csX#JWu4<0q%*P=ey64Uavm4+8-Ht&}i`C!j_uP-qT*w?ST z9(5|(HvGIJ*&mlePCaj0z3fDkvm*Vt7l*U~#;q;aQx)g@9;U}Wp76^udGolkFSlBx zvMK(cvZ0W9nN|LzhoD}i!jrbchrwxHRIM2r! zMM}QYpUq$%H|9@a%@B?=D(`v8Ce7%8*W}vnLC8Ryxf{dH%=LNme)^rnwH{0=oBIkE zbq9-y);;t>Esvxe0zpP!YSs&!K54jKeY<+zwE;FCUR+f7P9H+UD&9cqvtOYDJ!Uo? zI-E~3a!;GoFwG+GyF^`F(DAoQU@cm6>$jxxq0?Q2Z{Pm1*CSl`9rWOfNB62SSL7Ki ztLA98+G>C_Qx$MJCl7aH!~DD#0N+nNGZ2|K#$rYzs^P%E_CBKD@eTFz9dvgRlhH|f zq2aT9Kkg{*;3eJf&QmiG3)PsF>ecOvF@^R~e;p3eP{rY=MAh!?Avrd|R)=$Vvur7Q77_ir6xmh1a8t$aV0*Ja9* zRD~l0nQgnLYS!Jr&XPq}jrm};Li4I#WC|HEEAP_j1E$9BF4ITZO73@;mM-vo^>&-o zvdyZdrJM?zV^<*G)XQ4S?_(Jlj3v>Zmf$!eLFU&o#;I>jIWav8lftWuJ1=9h*!6SS z3}|}PcAP@4PsU9^Fmn++Ow2m>U0Y_@rZ$8(66b@^mS4ReStk3Et65&uQE}u;$|J|Z zC2&j_*YrvO8j5hMU4Ep1mrzuQv>s-!i2-7M>41b)euP0xN^Wr~-uGx|d1o%6j2P?N zq`4t&qy^=kCl0pxth-pD(XM!mY`E}dxd?q*Dk-=_rlZoj@~Ns1KsTsWlR^0F_-l)! za0tdy)Xw~7O|EN~&O_53X$MWNNfn~x*~I>tgkaAb^y-*fF*NG$lU8QSa{?yret_v{ zQaP3vEw9XW-sf6co|){Q84dQt3D9s6s0>|cKJr80lxc{%JcM@{H%9o&6^it8f8|1Y zCXzQ|5OT)o<$rsfwz@;~VqAoe>Poh$0?G11vv{vxzx06Le8cCFX5*gbOm5KfC%+#3 z8NypgPO|P?UFX!d^3qf=`{UJ*D9<1vv*Y@R7M_h ze9KlR21v{hYqFoH)Cs!>7pglcWTH^C>x^m=OrA^CpK0Bmb_zqZyYwoaQ=TW4t39jN zpuZLE+@=`jcRTX&@z>8oDVpTw^Q1IZLPxjJZi__uBUY!t3Lg0ejR>+|w7J|DSCP0nHpg2_WMWmI?9%MCBeZl3y@OkKYz4+3W@W zY)bC0mbcfVqGD0+(we+^e9OEpXqFo(7G`ecK)S)f2Nsc$)NLrWr2-7CF5Fio<{NOh z^DIG^AbP>FeVRNlg8C^&$2+;DZV|h!AX($qq;`iPdU*?5^rcbY0}Xw5hgt`lcb{zg zAF(cE!aq7w> z$X`ahSufFXTb7+Zu(mSdEwBcCfBfE|%A_szXtjH-ekB;yz+~?IpeL5hl|(KZ^@d3R zeN?qPLY9_lt6my|%bj9xiUz?uqEj;Vap{C|=A~Ut(`cf&J>)f6H6glq3*@EBg0gxL z3_y(3^>&H-o!eHUYVn$Or+lM^6We#ytE^C-SYkiUxL(}`kFnR}MUF=G-MM1W86J*G zX+?3H+M*;%-Y7cL@^01c&xPDPqbVleWInomM*m^t@!pmnC@A*Tr}_T7P6D)0PRI_g zeI{#u0J<2uzVAUTsU;7T(;mHmn3BP+7$7`?OSVa)?K z17hjuZ5#pXn3<}Up=EiQw}nL_;K32jHy@Nn5C+jWVFS~iV!(3g%(0@8S$hk`<1tjf7uE4$Nb;WffJBQXjnG%vxhj3=yj_o}mQ?cr>ElaE&y`+oGtJBg&y$0m8?~f2 zeT{sR!R5{fBw7?{rf?=CQ#S|Tu(k2AJt3p{-fu%9GDk>1^+llhUNbfm8=Tbqhn|~q z3?zr73oNiU2N(+~MVe0Zz#`u40Fh}*_ zRWCvzCh16V^y2Bg#C7*LyF&|4w8ZsuospL*&Z}MLDJ2}HTgkf1hR6Wdl@!;_M>fLp z!D94@$cz-yGMt0uq^d>lyqIa$9jP8tF~SX%8lS&R?>Kj_;mjQoOL(_U%WhBmp*k_y zu!xRpqY7I`9BWwTY9C4TKeAcVzR+X9;uQ68-ac18Qx-)qw_zXG9=LfDi+$X($*;ME zPQ={YZ4{Jvxc`9bb(t- zNU{-9&)ICAFO3d_RAAqTQ*iCa_ui2S5KIN%=vaZ#YDZDxdzamusRg7j-SD;v*3Wxl zgJW?qnc8SL3%UP@DT+KFxrL|fAWxsd3j_5VQa`rK74 z0@Q_Rn>R|G^wAjwoAG+sJdTTAn-R_ppmyf=V2hLvN3L#qYMh*$$AZ8W#snQcm36KH zRwhb2I7AK`xlV{C{d0MnM7NFV7SmkO_vN#~JC}M@-<`sENiL>?k6^tquqJNS2RON7 zH9#)UfTF3*`rzhTbNa4ve2_le7X0s%|L>5_IkDFnrP_MlZ2@*LDZP2EUK%M?Bx_hj zh-P&M&096Qalq|1hMUs*G8R4G$DQJkt!x^nPgsuj?s5_Z!zfKyE|b> zRUBR34jKzA9%O!wnE6>A(NMFD=tJk_L3PjJ)$EJn=+jpJSJv}0BQ@LAj12}v;^OE} zoW%`M+4uM`B$L+NR{g>w1nkE&(_rRxER8Kynu+-AH>eSz1|;UR$%#qLuVU$2g!zhQ z9R^^CnNN)gvP)`4ntN1kIh{(K4vjE<6|Io4-tHbZp>_%)pM$$RGNs+j6N~CbbhJic z6h`BVLxy^}mZIMkP3cDXP%o{2QLMGL@r&4{y#w^#uy@u@n}VMwdq&rl`deM2x%)-w z23h|{OX)L{ctm-t zH(YXc9WuRyFBRHHf39^R@*RCQD?X&XVV=)+OjQi`i1Mb8FO1mS}(l+_s5Uj$rC^Qc|tX9oxA>qfu+*?M0D zLB9;5*H~g&{mhe%U&NY9ieF^!`Rv&t|76$OZ!2#EDuUiQA5b9QHXK_7@!ZFl>{a2> zgv|s8!*0adJB1oF&%`KT=&0=|&3$R)xVi?x5O!bTc?k5TX(jhAuKu^ah014 z&IwD>%5N?*HVJ&&nRhjooF2w!g5joHUe!NMDuh<=A3Mat`iidf%8t_n7E!rrmB?Hq0B&C?tYe6Jl5sPTez_Xc0DA>~2bw zxBeC;h4}W#^XksUDJ!TPjxH*iEJ=>hMx8tlT{8TCpW+~sABTl<4e~mk6c*xrNP#7v zeEw)B+}84UEOlFkX@*|rfbP89lFu`Pl>dm2^BVTY-ed;p-UQxUE*2}%Za7v*7_p}c z+bQG~kkQCA$Ew&*6ml@jv`L3qz3Mro<}rL&CRabddOE`#F7TOS=tf_{1>$saX>~m; z1jVkCPgpTGJTob56_JkvSrhG&Q6W!%O$~sERlHr@lVV`uG<`n#ol|W<@Ipw|e9}It zy)R8B%q)!h;~Em_xS_KIKABy@|9rcv?%mS!jvrG81r`ytR;mfYgL5*AH1z!FBhBKs zA`;`CGv0X168Q!AKBvoCHmWOn%79hbadwCNk@lSbh7hsck5Bi+nU)lGG^SQ3nQXSe zjM3pRg=0U|V>b%%K+(tT$rdoRr)Af|n9;3?au`Kh6<6|Yj9g6F#xg|@4jf8AE520C z|Dhh7yMYfOqq~E1O87NslV_EfTsQ5bNxGCrN5B}bDa$z4Gty9A1Rt3I#uD=)br1LK zo29=~lAzH3>$nxKm99hZ98AcT)LDgImPPblXK9`(*0SLl!Kd}e5J=eOqudsZpS5k+ z(W$n~qk^H)EoV_M8wIik zC+uj#Xg#_9SUpWa+qeOT-8@a{em~@C%y+EgXP1xzXBj_dH}7}Snb97R3-eH+f-*7q zf>vjw9#4zN6I`mN(q#`eaEQ5Ii z2=c{1)T#}a%wL`j%sC}Rrrdp`lBY&R#P!l)kmh}l{2q2@dWaPJ_)7@GQ_lv(V&rW~ zq^bC=bjoaL{XV?HH;g!6S zo}A{UjT|UBt|$?#V2W^e><%a9m&|0~WL<6D$aSdcA^Qul0AMc3-XaNNKUO)O)j+-Dhf&VsaH8g>7zke$h4%aJ(v5?#(iDf$!T8y_r#shtOkJ9l9S7w1_&a@9$hMDG_# z-cAX~;aSpKgQWb@BiHHP)LmTxKD5V>sq19jRP6cE+AE@_VbYgNI${^AGQrR72Y#kX z4S+e88ezZMnW46>ncFi2(qv=*rQ7!o4^2!#0bnhveVm(D{8-n5uuzRKOl>kI$=gC_ ziJg2OiVvv~R@ha!*%&!c2|HTc*tHE#L>O<{!;dEI2EIIs+Fgo(Tpeab;N?=*4+sY- zqXWx*Y37b>c8gt)E-#L12O0^)l0eB?LHhEPv`jh^ieBGn-vfSi z95PX7=N7H6KW;m!UwZ7H3CF=PL5LO zL%wF^=N>~${^!{Q=5E15p^AdL?6H(8n^i+qrTco_4{{#czbj7R3&+zHC;G2|NMxLY z6Y`)A?8Cr_;6;1ApB=IKm7MN|`N^t5fOcm(fkPb8&{NND)KAK$dy%%!=+~RF#mrAi z#4I{k^?2jo+k)jf_u&uRHwNlxke;F9(@@B0i$c|l{>nC5Sh)(zFK~3d1_7Vr06G+E zR!&}CUK_Z5)Xv&_Ag0k->V5ccZ#i_DiPufbi|3p7@>@ifU#8TPh<7+Z-8E`#hX9Fcu2lt4*3EA^DIr&^?(ByvLk2HuW?0ZXflz z31hRnJ)i{jKB%jNfOKhcAW`J~^U=l*@C#slO2%$dfs36j%Zep{X_*R6*mI}7qu>BK zmsck}Z)?;_-e!o42RtNTOj^3@B@lrZO8scEXA|hl9^XzTd^l>xz5$zcUaLsNRjwUuidIz%y*V<5%Sf@yS1zH+?N`0mdBuj>iG?k; zCS}!aQ9c=LD*t*&H7iQZFUMLF8~gO2GU$01Yz1MrQ^TEJxJ6Qvv7NABXNI*@eN%5l zMEG!gUDOs>#WTybgioF5c{`9H+{lyTS z-c{^e1)-Ow3;s(1hT{L`gMNxd(_@vSp}!G?h1*M#=#+LT$YTmly0xPwUkI<~M_m&JO7F0XoQ z#h7#Bq-d(RzBGXf?0{;mcsP@s#_?w?`CN!G z+m^dJG!#v~|c0hzBVb1=?Dj*idTB~qIsmD&dW-M@&W#B5t zv_jpEpnma#xzaMm&VGqIUgGfrpZ=jVJ+?cexTJp#U{V-w?%=+TfBu0n&@RgIEnI2o z+3TLGK_?)GueFKY1I;uBKC-Fp=8uR@$vtm?a1-AEoP#xG_VRrC(m~t5cE4yu&ov!# zhDz7eDzxo^4Z*L?cSebA|cwKJLGzTYRi zlvvG(ZzsiDcAHtf+6r>o%_lZHi*Dmw|8RGT)uoz$imH(AS3JGbjF($|D8&z`D( zIfV!UmLLo9i*14{Bd3siRyAAc!N_kx6zuZ-ajz+ZynS zV7YisD)UJ@!kAM(%R$l-z1A?U)blK-T|qy{{vfuxwS=#4uE`(WGBPY$=%DCzOoZ0w z#;?z4#IM|f4{_AjXKEhb#Cf+IXtzJW^OzOlVncZv`2Sw|Yb&Sw^B*12->o|u#??!(VmHDCAXDO>o&jM?6hhV} zlR-qAJ4`IfF-H!nnx*x-0@3Mn;zdDbqkKd?%T*+#o#73!CV8(&=3U|CLW@l~Qm z{SZ(T}!6znq3L1K&UpYXN9B9w#f6iAjvCm%xkM=9!GIYHw`} z{*GLvEhD?#+#A#4lhs^Sk1+ztV!d3#{=Vb%TGJHg3>k{eyeG2oU#~n4hBTI*e`mC_ zgYANvFY%Ii8d&#-RLlxDl8nJl!Ihm>dZmF3MfoU}osxl7J^sjc#%L+;rI?qGZf=oS z<$8eT0#S~goH*>tOs?}r;sg-8;-OT{K5!2ezQ)EnK|$ESMe3i47!C$`t84P)mh1oA zM)C>4Fw+}%((a=f_`OfYX^JPj$@*6<1=_!OwOahEk?)Fvo_1-wDVHbD-;4Fp6i7jR z?8UWy>M$sK5NI5@7Fl?Hqt4p%)%oBb+Kbt>s9a;E4TN5pP-!W@8?w^SH0(jo zIJ4u>;FztX^+l?(dV|SRCD4zW#wb6Duh1T_W?h7|DfTzM9}icNUX`b0^Tbi+^Q z;900`T(%TJV9zq~(0fI9b@}rkHBnI=i`7CWLyBT^+Kfq0xvo_|JdrkadL$86Z*EiK z8yCG}dS+!t(1>baWyt>tIQ!xq;|z6*>rvh1ex{hQ_jXediQ1#HjjVA%MTu%JhN<|xIN^)w-I%fm?0xBB6K{?HnvJH_vY$|2I10q~@4ExTR9o50 zJ%xP@{?R#LOO2I@p!-ES*JBm~f3u(fm^@&0b5pDK#6-)_{fT4(H&NczAJdpnOK(V@(cK) z5p7$0z=_FAvegOOKX7m0*31Lcsbl}GsSn)_hdqI3CksB%R4Hgg*ZN^^@y_s`NonQD zNk2#H|ClhGkV85_;Zo7pbr$&AY}rTC=6C;L{VKZk#y0wML9Ab}PmBKJ)#)h8A5LGE zM+wKW*?zbzyh8{%5Z^Jc>AN?pWPE{>U zkXe|fFEmFC(9o4HvS)DK6i_yY9kt_kmSg<&>65h=mXbsLLoN29U#e<S95avK}4dbC35@(7&p5P^Z?og;u8R$ zt?-cBFBOQ-s6ghQ=L*8m#>5sSB1i@xYD{1DSOxwdbdvY_dg2EN9VE6DL*+1MFc9C( zuaoC$mt88vE}KmO=h^Y$42VO+lkIv03k9hkSS|i?UP`v34NMPvX#MN#FSn%4fQ9L` zdJ0?nG+b&v4lmAIChxPUjWkKn+T%^nfC;gh%XcCYvLd7R#kos5TC==pfJ<}0L7E;$ zR2^Ck;V2>9@W9zqbJ9)zs}8_WVNyrolLf1g3BWNasHp zAE}99IDdO<-RmgMYVp}*EBvtN0mwFn?tombaY3TK`@zszWpkUk2`JZd_V~FHssnP) zPWnfC&HqQQMi1TVwWh`Q*6+Y0#%}l6c;aI91_oBX5oo@76FY(6@pj`%lRrIv7V@JM z?xd2h7H_%{YYZ>1bPPW41TRUN-e_QSSi&+E41U;9*GiQtTOqrFmv|ELP*KFuH(r8v z0d#btl!GtGdeuSg3O~@`T=*IjG0LwnDv*XA%9|+lQZ`_|Q=GI>`*^v-XEcOMti;}J z*=@XedeLb6?ebR`Hys+a$I57|8Fhbb;K6;K7%S@KrtP5RVjfKbOX|+%yq)2nu@Uu| zuiYBb>se9kEfjP-?@t0nDUcK zNQ!<4t1Sr)7u(^`1ZTCi z_lh>gA*(5BT>zHwV40`6SaXs)t)N6YDx6h28wq;1j-+R1Z%a zOYbECw_pWbZ!Qmu)j{{M4a{+1vY&#VVQCcBBarsMR8(#zUxKQ~LyvkrU&Xr$eC^3F z15X*oaamvTh)u48M|UU%&u8Ai@`@>IkG;f5@6mz$4A%V5)#Dw--?6vWVvQfj3B-chf z{z12}Ef~#-&^PeZe}@CNU+JhScE8gaz!FcLm1gajt3$0@%Kz57P10YAHGPG4JO*C2 zPVuy`@StEXw(rHyzHI1qlbs-ZtCsWxm9!1lDkL*{Igvp5C3is{A^4E zZ0Mcq-HU8{lk)7dAQ&nKS-)!-}6RYLoxW9;ilfN?8w!)C%V|qT9Kp-lB3zNd#REAOH z2|BeCXT}VVm+UsGqY=;wOX4kH%bA>AQ{(-nu@NG$frc3FZ+yDu^MsBEm8~^wG`-8i z?6N$byK1Jt+M1Voe#f7DKF|q{WF3QOpOkV${x+olPBKxje+)5QtxmD5iBi~FM6 zb!f*J!wjp76S0XJE8`s-%@Udlz;Pf;#cTGohQ|deKS9~?2*?%myOb3bf^tKzmw%?d zMs3fofV$jL8wGHIvNicfV4R~M@uBOa?LG4Vgfp}UH0w+#?>{Yc7E@MrJJ|^t^cuVk zvWI5LEUX?a`s*83h@ybgqlcf$F7bhbfNP{di6-20S4lnAMVHR(D3B|d{FgktpsxtpaUHNyO3)NauY0wb8o2(YfY-G3oE|Qv&n09(nf{ z?k$p`IYA%(-ghJ1h4fbDi`69PXJ;OZ=S`eH*VC);l8#{fihCYd4W2#NyPm-I?~%S+ zdJICIU0dpUWg>~Fbl;}@Usb~tZojaK?LBC1gm$Dx6MWyk+Ae7)+~GRRHed95}Z zC4Jd$6R5?b7kHIb?W{)`b`<5%zBXvt)zq-pL=X^Fx+~Q!h;%PzDfp;iC;^wG6MZU` zq&(Jf(a|Ua7hEkw-7{A4G+CJaSu=zXS-7vJ1m8$3-IeTa(B3f)>+iW(R-zqJrfv4i zeJklz^SC02_#VFR%*aol{!~HIdHrD&X=`X(uY#qo0L6Tu%e`Ed62qX>nBicf3~q<) z+pbxH&rUzZ>d`EOJU$PSZIiVpGc4-UIFG+cZk8{Gd)!|@PO!6|nQ`camnxR$hSfW8 z?>~F5{%=oO9h$_4hcef-`uauD87Nvda^fvq00_;VJDYPAqJTp5j^M=j0l@f)Me@x( z*#oF5l!Ah9m-dbMY0%WNLYeTDeCq|(_!{h&t>wuA&0#|hehmCAVHK}iY2PZ?Jhx^+ zPix&MaRf! zU?FYNth<2_E^oYRH@Tc_Qy`ddhsi+daSedYt4@+m-O4#-k((uSug`SbOqzw@J}l{5 zpbt(aTi;k)Y-5g4uyJ)v01`dR#M{9yWm{3jbiVF-YE^F^2PMwJR)nmUpAhy@`xP3H zuqenukdy9aR{~;@!fI89HBS)Q?Y`yQ*7*VDW#{3((@6o4)iG~xfqQ)=D`4ZFg?ZHu zPzujl#C-g0Fn2ByliO#nLdSS!j2jq@P3n$ba&DSr#ZP3HBAfC2o^}P;q$g|cNbIPU z+@e?0r=Q8@-dXL<^GG#O>AtV$db5@kY>ieIsRsA#3ua6ed}rLlbedtT(p$z=hS|~_ z&VeUsBue@wLn^=S9q2s$vJ_uvjD^K9Xk;gs#`RnfCuvuC-T;#jzg1fbv$cnzu&DNm zN;g(JPq1me%c_(`e1I-Nw9`Q!8beGy-4G%nC+)XxGf!^B8G0-?`f#v@` zZ%aJf2z)ml8zqhpWWK;rh<~eX6vpeK8~!|m(N{{x|79hB&VA{D(~Ci{O$cnO@Wwxn z-AfrqaQ}D-(R*tTh}8MCf?7qi-IL<-VOk|7x3LD+GjDu$l06qHk$SLbqSJ$BLraWe z3i&98T;}*O)v7oy!u@Nvb8po$|D;1y|221HS_NLh(%{%0m$3LdG2jv24QnHG$|aSn zob<=FInv#7(eMuZrRyxJ$1m!Rcrfw9Y-Wz^7}|%VrJ0OpdvY+MkI)y6od4lcXon_T z_`I!?Sq2;|yBa9GS!6KRBWCVkreXsFx@xOpcAUC$Lo#K9J*23lFw;W#2n0S_l5t^SW(2G=@F-q zF{{5sm6@;hMC|$~;qW|@v55K5`v@)fQ7NMoR6($Y=<2@qoqml}45^u~Ds|?hbPS)R zKCdYUk9cJH5vW);8%9Nl*f%RDvXguT3qiD&BNWg3I)#EwGis4i-3?T(@tN*-!CSvI zJPR&_;3Ad{H8bB5k}bD=GNxbJF41Q2rg3i@C7wTL&dpQ@6k{JqF_!2S{L_tb?-~OT zNzR3qxv>-g=3<)09f)q}P*%3qqVqJa7wZgQte!wwIWW!gs01~}kE#PVxOMBoZ+-dq zEe0%|pJE|3UVbKNnC%+in~+{5XrA#mE&qaaX_y@h>ke}?Y?|}!!u3?++a)d3MrIY8 z5K7eyrsOrG(<%{jC3Ha5Z(*Rxz}Irmmp!n>t(wF4uhf z&GI~Q04+1%BtTn(K$v$()<%T%#1QoN4+%m`Pda5hiIPhRR+mLmhv_IBcLx!0+_ApS zi=wX2)kU9140&X(&pK0K{8hVwu))KD(!Yzfzs1mhUEh0O3AYK-FoyRwdoy)G|2P1J z^Q_@?_g~6+PURduBf16=fKJ+E;UA!`Ucqs3(el4ewSIpu2e47VGOq7c931Il&N{b_ z&ZY6BL|io`*))A*?_b+aMHEX?kcmn`I(}%adqO)V)qPxSVER?2%?qa^FRtIeaJ_KK zpvOV8gxfYNL|N8xxY$UF+kHOBC|6`GP~FmP8Ow1ay7Y|-eg2s6XQz|8d0_OGrCggpFyZ>U+BoWA0kFVI+s!1Z${`1*Y!@zQ4@JytWR!UV3!4!QFvKF zB=xcvwvqp|gZ+J*ijzQ2CK6=}mtRCqpr7i8WHZPTqTuHKi+{$y5a${+q6RFI%zkKG z0ByhM0RY~8z`|bwdd6E1-NPA{zrXH3&F4K&C?k9^BNUn2vQYf`=O>9MG@p1Lz2K_^ zBwmT_?@;U>cg%e$FwEVy^=1*P8B5A`DQ0(MCRK(86=-<3)nc8{g?WlgWa3Jd41-iW zozjc_v?tP5J2DgUs83%Z=Gm31ix|g+kDDIMUEY=D8RT>rGTAIu{#w}3Ld7qyYx%6w z#4?G-p2$P0n*is{KEpn;EKC%(sp{lZi&BC9L*_NL3fjvYPHtG%7mblX65uoA(wXD?k0|vSQ#~ zI}T9UVKeFcdK057-u>rAKpiB(K&aJkTQ#Q{z($aMY57xl6?Tm7e`2xrl5t@no&v&fqN61idFwiFR6ar-{e*w0x+@DH}| zY>T|0o4qAn8sTz%D2mbM*T#x)zGJCwR|A&D~w?kdaQJ9x3e`r)gKIX#Uw zfgCq(TeZt}6FXUQ%{wKrg=~V76LbA0W|vRPyF7EP0R;)SsYSag2w)8!pjdUe?~Cb5 zPL`fbgY9_I9#Ocigjd~GWWFWui$8lTGQCYBr+F7*96g@3=lQ4d^ZS9ty#sF7y>~8? z=Z9YbHrvAGY^QZ#V(RewH&E{%O}M)lxl6t1NfKOvpnjF$N~?mNpGwTbjY>pQOlIY| zrRi_G$Ztj!6osY^fnG}-7dYleGupO|dwCQkMu8J-1v%l}RI^eT<+)foD#&IY2=A2P?N>hM(9;&Q~!FUQ7axT>0(|!4dlkUIzk>Lizm^~q_9t^Wlqa{~Q zkR6|z_bQ&QgJeFDPu~u+F`a0K(@;Y}0D~C38MbC1$ExRHNV(r%v&}Q8zjkk^=P~~I z_RfnwqM^p{duv^Tvid?TZK!-7JHzi3UXLLUfU1CQ*B?hrH^7L=OkC88e)vxx*}D#U zm?Sj%=Y%)%z@8aEn~Ww;xob3jn~8vor+WT13M6 zWSz6sLd`MtlF*?kQj(Pl4@!3G5-X=?p2$Icj}yDby)3ZCxb-)*F#1(x%pad!vTHT7 z&M!o*5r4iGXn-2Lgqc%7>ARGS=67oJrV&=9;FN%CFOaevXn`z}#PBD-yLqQ*fgz=| zJT1&-w!`COdHB`At-`?|bG(K}*nnx7`hFQ0Fi;++D;kJE5hHX-V1c|mUN5(Yy zgAda$8We4E($Cwb(zK{IRaB#1@MZf*Uc=x(PsUrl7wLS!u)=vI&|qfCfQw3s;LadN zPOrDX!dI@-Ikn6C;b)9Ig9sW7NzR9^nPNNRwRI*YSyowE_V^}l`=40OzbWNA;2&_C z4@68Bdvcg_(=7Zn+M!@paKfOI9|EO?4)5mz(?5})y?n$k44%4Cjo-KM^Rjz|82r;6 z^Y?0Ya&svLtX^Ti6Ub9jx8Pfd9RLAqp ztvbCuGOknPfVFJBkm78goS$#7QYc5h0J$s$Z{R4%aVi@9$SNkdU&ocgQC&I=&rY|S zVb)(7=I|`Hh1(%~Gt}j~&#SNkszFkH^@DlSXIw%>`;nIVvq(A?vfXcLy84Rc_m= zjT7>DvDAt)`lB&j6XzNINf~H@ycwcB(0%YVh>I2{m-;>J<84C8=l!;!*Cn+9wY%@`E6)a7?ffD$5G)6M&L`u z%UjwQ_~QlifQG1x(8I+qqI83lE^tScnu>|4#J3E4iPS5T?HUi*MT^hgkl>|HqvVFW zBMx3t!tPDyAD>(S%TdYcKVK}PcA^i8h}hwG&5uhl7uqr}nqE(%D4KFug&dk|)vHX9 zMERZYWn5pagCVI3!B3f&S#Ol~I-F>ey3Ku1g7@C#V3y!hn0;rjK~HhX@zWhKU#q|K zY(`R3<|EAdVB7(@|C8>D{HbwFa>8J}68#1kshy>o(DTg49v1UC1l4C;bmc@8Tr3aH zCZSd|4qFT0#&`g@-E2*pL~h-n%qjCp2wL}yFR$@OWT&`P9lr>{H`dL)KV7GP@4z1L z(&OQZRrJBY8|QiBB!J<&6l)Y1g)K|s^#gQOeD>(VX)0fXP@(wTPahhXIDOf#4{vL& z{FWwo5s@;z+eaT8^ zfY?@8(GOm|6C3Z9g#oMRN=JyYDZwq$={nuu2c}jZTZF5%-STp3o{CU^*vo($CI)Zt;&Oz?g700Cq(jMFY# zQ3U3(Bd7lS{Ao!V)!@VBT$+YwLtIf!dPjs6cCL5G9OYF0~Rt>PvlRBAG|gl($-xBYKPo6_qL%> zq>D~TI6%MNm4dF#Cws;}UK;`Qv&O8eM{Vve{`8Tj;qSzZa%fb^aiN{BMhXP2PHg_D zoGy^{e1@qI}=B$173U(x#jgwx8tiu?L%P%;J4!)St9 zQejC>8wKzrec$C6k6O(ZgB1}Y16A;bRBBw&t{kXBS7a=@FdO?|;9w@JS$q)TlB3o_ zl%}`Zn~?fEFFG@!>9ucygGo=J$2?&pi0aQJ9PCMg4)Fh_^qbxm`9xPnVE(5!{;@YG zkN2(*U)8nWoUC}gJyRcr<{QuRZ{QPQ*uQ{J@UfX};s_-)`UdSvq&j)Q9X_H2bykJa z3qX9*fEyOoGji^2n-lc&8f9i8hY+RfU4g^PIRRnk4ErX5y}2T8Sa5?6csm3R9p^Ek zqyuSMi7QaqWBC!U$cFYK-Wo&GJxx2TLT z5;T3?d?_XGp9eA0F+Mp>%{a+T*==Ve6XWv-LZSX5Nv=S*RKqiHAYY6V9K;6l+{fx& zYO>(D7R>}siS##>aesPjFi8K^&%J{Bxxor|%|G2k6ke;~?#aG(i`mXaZO6}0A=!{O`ECt(!^9egfGR=x9^)EQmL>Ha4MBz(p+hjcjC zPwrk*duKx-N@}tHqOmFZ9oC&I!?QcgLJa2nGFRH`pQP*#A$Z@lb4A8wr(sIM`LKHC z?`y*52eh)9^#bc#6DU>a?QONzq*Gny-|G*n5n%P8h>#8@_Q)XuVMz|rDH@}PXT$Z* zJ1n?E07nBoaI0VKZ~y5^;68v3BXL(Gyzoy~H3vG-R(WWbZ_e3{J$Uu=6D=AhR_|pP zBR(rkN<`^>k{0ao^rayuomm!dIBSv$HjO&EA*)OK`JlGwPPAy2?qP)SX0HMV{2;TY zJZ~`S1 zXe#;A6^WU};9d$GJfm^xXrFDRx+URE?{?6LO9_WG@GSN@PovF;qQWTapG4RyDhAO- zo&Z_Q_N$sts@+{oF~|3LQu)<0D{O41MrvRv!$o=0!6Jedk!}XP->FnaVAuZlS5sY` zL>-`Z3-pe&^8V=~XObXA(#`!6)A3iij^h%*SW|Gfyc=b&$rLEu7M@Kn_TOULEi{au z^&ytx@DBfKHQ!JilT2YotfX&NBr`}~y&i#&cq#}<90kmXlfaN1UYljC^KY`rc)}ON zIK#k_j?mcwExzEwRCK2HYHoaz9**?s-SN0pEFJuImQK3mcOeAHJ~1yMn8WzP%#Z!ln7j9p=a8BRO!e?%L4XpsMN`bV zkyhhXF*GmW=2~7``(C~MwAK0*ZqptaD@i2%$3zS?Nu7Vdk zn=OnFgXu}8l|Gjxim)8fMB?)`gQbC^)_!aVQ`oJ)Sd1somg-Ue_M=k%AyY*~w+fCaB@n4==8=z8GF6Mf%3kSxxt7^Ja=1pS72-X~C19I~r~mJ+m|%BuPA!rEm64FtXMe;h(h^KgBBAT2S{ZU!SpkkSTlI)3yqEu#NdcTSaY;deJgB;6E*qMW{t(j07B-eoRgAgo`z4!sSgMjQe)4xax+glpKa1pOM;Ym z?>Ko4T?pUEToaR5_g5A1pNv|}8fAF9-wLt@qiu zbjAoMwa(|6m5vj3`jkHNR*XM4N;&LE0VBs!?z2@TdNaeui0VAql#^V3bF5xwK&lqz zobpZ84i$HRdQ`j^FhJCSCbQAdR)`G9PY2PXMZwOK3KR&>sQo+IFaQWHDJ)Nt;vg=s z8P$*fF`oVXj82I|M;0|!&GY|7B>Go(#|QzI{pKYOON_q#+CEdZz-fS8(;(Tro1_p} z-GwZc?D~l3!Rm;lMEVC;J)-egUrqo=3O*KA+$BpYP-G z{jZMxI9~UCUH5f8ujloA=3B3GOvYa!W}VrsoS08cX&Bp-q{m(wAolaz37gOn%Qsv0 z`&=;2$u4O;hbXYJHr!2Z$qGCTdzis1;e5iq(iS---$lq> z)(kKps08-z1-+F7m|Og+wTlzn!3gyosW92KPCJ9GFw*#S|86B?tk)Qd&h}w+V;*9E(X~3>POFZ$lcf~ zN4>_!`HCMPNuz-h-=15TUa2Vw0(;Q6{PjXI5h0|2TXHU|9P>$$YZEf7?^D!Gc(ixV zcZkj;Dt4w%w9pfum5SKu1ify;sV-)z3nALIC5wAFKa1|vSw8l@jHvlR0e<%0t7v|a zJ!Wb#!Q8c~ZNk!fY$8*wAy$ zmbNtgmFpF?e_XFWFw8%?6SqXJncZZEeX~>lSb05V2S5`a9^FOI1t&Jmzv6yqy9%tL zW1l2gOA;(Ta>&BwMQAQXI8&zWbX1jqwN_Ns7C_&vl(-?A9YnGA1=6rK12=@?mlrE< zSnJ3t?Csj8zkK5vKQjeEq#rdY#!xy~NizbOPo=@0JM5(&R70Hf@B*PMcQUt#VhMI22J6tO!ViDzhD1<9y#toD&_%3qj}P&BF%h`?kfvy~hLJa|q?X zTe(K%?8;}_k)NIaIWzp%L}AYU_nxl-^n7#U-X55L`l|A5EI!E7YdXjHimS5gRL@Db znV%Q3*Z*@{B~Fzv;AX`$JvZFc@A|J*71;mbs>;{J5^LXy_h|+74UIz7sU4sM^9YJb z>oAH`3e-^L@K?&2HHs`KJ!n|4$uh(1{#i=JKK{jTaNE#Od}Z)$)0go#!Uc}nzp2Yy zs~^kq0NV&>>Giwpo>z$O1I21$cLLRI(l5H;efIT{3Wz1i7>Jqw13j1$i1?*QfB)-b z3oxJmA?pNaMt1;VNDm6*R><y9%oCHurS?&`s z*TqI!l}bGII{Hywu}9bGq~^UZ`)i{MPXJI72ww9DAFgl{U@--`W4`%;Z zx?FBe$67m~8w|KMn?3XzvzSGvNsG~wt_YQ7@!L#_mDrtVH9Tm>vYw_Bb>>vF#WjR( zqmp#J@5T(HB1YtiyzE??g7uUxInEq4@Tp=up#GMB`KSeb@#4{r$}?xRzQOFk1Gf4; zFpSIpR)_h6`%6*ndO7lzW=y$p4j$@Z6c$9I-{T}_P`gbb-t|lrE>UB@NSxAqum%<_ zV~*$yl)Nyj0|M}^D#i5Bhn48_WXOm++`(f?P*eNgU+ixeleGof-SCC6PnZ7_OuF*~ z+Zy(chK~meGYv2b5tJ)p;Z_0z1#hJT^07Q(O7*$DNxGSN>DKt=XC)@gw%*b9RQ;Qt6_T0K4=LvdiEt}J zo%rLDb5yb4ZXCX=HNSPQ{R5k&cjIMG)0xjf-Ypt2;n{L4DHXrzs_(>Hn`X0l%?*bt zslaIUxkn>d*{dR5ZHBpR1l9J|imK$b5Xk`XuN2E~tiVd5d1tA=>Abk8-%R1f!W}8J z*Xs&wyiiNEP}bvEvAY%6dtHnC00aS&p;e{T9Z%Ff4WH#@!zY1q@o1aAUdGNJkogl} zW16DV?VP|WM+$H&looNW5xOBuUiTr6hr}5|2 z-2C_EWF`QhK@6eotTR6rfhZ==7sJMo&HVzpM_>k9!;Tz`UBt@;?lxP!L07fz5JX6A zDV9`xNIwsTWFPhQAI^W@by?tIZnTLH)^%NCEs~<;w;?~b%fKg zNnr2r$TrQ)+3aS0rKap`txsZON7+vm%~)#Aq!(M|Bra+f?YqP|f5yFK3Z zB{NpE_-%|2D2x1URgc?%k@-H5^uDsw5&}hI!T@)w0NUC=2<<4le8$THD*VeZumoRl zlA{Xj;bi38$X*0~Lvc*NKb!-W!zUY}6cP;&gMzBZD|{a4RJH)7M{~NM?mqyO`$d0c zrmxP&X{9JhMyr>!Ve#a2$V|!0}>8v`c zXZIV*AcncNEbv$w=!|v-TkGI!S`uu&+E}&ijPa_1>Jz?|aRSx?geovQOMnz}WA&af0 zHTJN)(u15N=&;gI8hFmMjGCzmN-Gn_m;`}7T>G7XV? z=_~VH4tM(6$lO*;W71mvkY&e~<168~CT)e0XC!`Jm2zF7lc_yti~y>OgIF0#k09!& z30O54XUhjhrcS&c!R}q|SFjH7-9c}#IyC*QS4IE_nIGb(eF8j>4zOxq?z1%Pr8o!a zMIX5giiuNEYSkNE^V0G#pps$UN%%ni$N9_>4nk|h2K_q0V%({!e6bMv8SKlf9g+Kr zr5=lj2o-oa>NNKg%E$MW>=W8jR{e5&#gN_N0Whbt&Dk1zfH=nZ`?bza zcEx$F*`{FL?EHyy#KsJB%lGtq&2@P76uSYwEJGGOO;+)3;YYrQR-VWArJwocZ(s3I zDYHvH&{CH38)EM9CV4pQf!&=9xHQr<-~0~AfSMptKSnnBozTn75H#Tl40|puu9w|e z=P_{;G3=~+R_S`AI)~F3&ODQMOTYWso*6ImdN5l!3Xn_J-850pi5I#^)||=DCYrDKiNsEUH3yS5Ad8OI1r7z>1;3qpLQBvLOm?9dOR~VNpSaou z<)J%3dhOCs7FhBq?$6gAQS03Jg9ktI<Ilxl-1;nrt*XjK6uOB6B>XBG!5inRVA5U(wfJDGh7#4F>=FDVD$J;@~P`P7;6y zz^93ib;%CI(!# zMj;DY;70AxLb>ViBcmV(P1gOzb_3!{Es&bWr;)eMVrF`d5B){@;VF`xJKFPoad6v}E2{(J$5N z6Bpks@=8ugIt{#i{|DF5GJ}5=kjNL4KJuiyc^nNBDAU^WR(MRIGt${eqV44?dI&E% z0(O?w9GoJTGnRTk%0u>83!}c{#MZ6*$FkMlU5(6$+otO-HTz);M<6OA!5@Ww-qC6C zDAnf45PwyU0eoKkbA3f-;Kjn_kMX}|kz!P_tfI`NlvBnPG^DP#@BAJKIF6wqG5}4#Q|FZvuC_Gbu96C1?u6N{v z5D?$!w$CbR36ak1oH9i&H{)8QvkG5A+oBJP!*(g!)SrizCt?7j)#Ubz*-P$T{rB%R zyt~gV6UBp#iIdJlHJ{413%vs@-IP($HX1l=9cXz&9Wq7-7IyKFYT#TrVf7FT@X%{q zRDhHD9B_4(gZ6yy1Rq|E-?tGp3-I%Ue+`;Fehr#;Jkq=O5BM}NZa_nyO7V$o(^kLF zLU=I_J{6c|;Xb}s0)DMWMT%2Z(>sGZV)%c&#hST~^!)aJfmI0LmH(AhNIV5*0{14( zXdH%(fFYr*#-X;W^Ff7wq3iuW^WC0*=Q}PH2{G`T=eoT9?VVXr)l0Cn4F?wGcTAY> z`}>z5g$&5hp&K*=dsQw?gC(|j3Rpr*fmA(OA!~|3Nblp}MK=Uch;E5S?8v!ss-OH zDBqGey?$=_MYuU4!&9-lePZ(oMHN>um$s|<7G_r82Y}MbMZ$7h%3dR|&*?r2Ibl@a z0&T}7XwN5ea{#oj-U@Xs7aa!fe-``G2;eWNpp;|I5MVPHU+)vWk^hJ=2!mT-?uc)H z{HYa?JwjNBef~oD{+A)+I|8+Kq~QP10^ng&gf(cLQW$VLV-rwvRLDKV@Hi!;Ol#ND zNXQN)n!+=~i@t8j?*sMJ+BCrdHB?HxZy>TFmRg1-IOF|rN;Gsy(ue)NulXm>vFPCz zAs)9XQaY>iPNZBalIgZ~WZ$eVBh*s1^~s*(-8(s|BJ8am@Jc>xPs*5WrfVFN_0yE( zBZ#WP+mLMq9-V1vh>*dACcdwCE5$u-5!)@4m!FLgy{~A~cH}ZkKZK{O%~{rjnFFAE z|77U4qW#Ylj{Svn-=h`-*{l_SKH5&>mqu;-7n{^8`Or%C1;fMn!HWR;qI@J{F1S$x zh8GHH@FlAC`O;^y-y&nEY&({~>X3Qy5B?TMLy#Q$fw;IAtn42XL}&@_9Z{xK&) zM95=QLQnW6;D!+G1~s)m*k=)+K3leJ=;f|zjr4ntvxPgfSNPs|7kI~|UwxmJNS>2E zaWqMDOO*Mck5AKN0}2*vcn=U?e8io88K1jssrku31TJr7t$#1$l7+GU%Hcg_fwoyD zD1B^Wsi4UI1oL;5jEwk{b4B(OAz$&G zWKMTrYT0s8I^()@QIB)oVUF?}7bN}Sl1&o+(r8wxXC`yk!|dK8SM(k3F4h`@ z(f+@!n$_OK@qP6<7;xuK9T`}}-7hzIeR3~8?JJP=NP(1(egH!e z@ODPncGzVVF)u>O1`9u2Ed-VC8Zj4M&s=_?uLoDUDr7YacFF9$(G4-L^Uf^`^(|@* zB#(q`J;B(2^X`jAPleK+3XJ3)lct=J?e$p(jU7tmY$Wl zle<6K2~rey*$ozwOopY6X; zggKx)!!d!^v z_PA=HQ2#9f>2Csvtmkg)`$TYly_dWnyd!2AwZ8;R)6;c3#P;Np``Z zf1A6Z`axL>9&q}2S(|^7*h9Zcla=p3#5brD4 zCE(F~Zs}vEIW)carDzMOp((Mct7zl+6%GPy!~}x%?h@K6Pk@c;Indm|oG@QFemn`D z@dEN(?{@GUIa%w~0B!OmL3?uW#h?CJ0vQ|9v-l4{`Zb$p-*{jCJ8bfA0hW4g5P^8y z&pkg|%5sMSXvPXQB(5*|rZ>bZ1pU%?xbpf*UxW$kP1JYt2d&O%G}j5PKU3<_+mRon z`o5c8dElGr=weXf=Vg@ix%t$x;%Jxc%)`z2V3GxuyTT-Yq%ucKyXNX{NRv)>`BnBn zpOxmfLiY&K)%1h#^LO|z?rv}PKX86iZL<G_{exw1CEf>$SW=?XaK#U> zFX%Vf|IGrRIm(u-&W-{bpUiC} zG8OcguYySneZIaX54)`G?*TWm72h4@a$inyil~3GnFicuNP7f2xK@C0#X-J6UY;lO zG_=-A*%8kHb@@vYXq%42d(GDFD0e&x6>$(@xmdw{_IB}fD&P4=aI_aB;~dWbITC-n zMo8}V4nWL*Em3v@>mz$+<32p(Jr%d35i-;`e*Fn;3g%EV0GUrp7lnTP%q{&lQ1Xwz zEUQ6N8>H{)Ui?4h-2I!NsSVrA^ZljAL5!lSDYQ@bES^~9#U9*|SkZr0@ZO9Dy{!Li z4PPIRkS46@%J@Jf`(bubska_udY8K_=7VqaIU5wKCeM+wK(C*&HZmsX8)b*qkV6@d zW8bG6yR_#JC53V(hUQJA+6*LC@_wvYi#p{>ooNwf~J$W`?+eXTQgcoRS8 z1y&uu^P$S066Q+AiQ&&ISiI6-?INxjTzhF)^76N^RVI>t< zWD9Tq5|C}b41(2uKu;4?w(580Mw&-~?A?XuZ^ZSGz|%Pm?07+Q$nXeGAm;Vai=y)V zZq6J~*;0nD`>~5g?fAxtTy+G#w@G&SzkKfQHGpPW+XKjlnCG}AT?T0wm`PZqf9)@j ze1g7Tvi8le*s2_3c>24;2AOo{;a~5j7ZLI5pU&{_2pk4N;Cg0c@HQ8!&uQNV<=TLP zsh*Q|zkh`P;!Ejne!i)R6v;z&Tg{X%iV&9VlSNs^5L8uLrVz2n@s%d73Wb&L7jTog0S%LAL1*xA)?BN-24v_vpw+h|4s3!hJVze} z@Uo}+AG)tctsczy+e>g^<&PnD-xK(JhUUlo zC$=YeTK)Dw%%Ux~?oRPQ1O21F!S)V5<#$x;w=eI%t@YFPzxmWshOjGR1OBJpBStC} zBHhRI?sr)zERM?Eznkjfa@}zC=6}$shpcF;^>Y-Hm3I-1emJlAn>nlf-iO**El}npN z&cG|_Q@O7tg|g4*C$r0GneXa^cD+0!;-fczcjWzR;RCq=bb|#MI}Iq;0Xag$duB-= zsWJA+;0(VS%ueKx8@KkxB;YQhpU{3KW3Wk+-v{2%=bwQ-!r4`*w9K^E2JBaJkE6#y zMBf2YSQj7>ldpv>@?gPtj;d0UuUXFM$;a>*;e=FV%^ozL%e_A4GkVG5+ZRnuFWF&e zM}J}x@)3zqb+Q^A%f4TZ!HHuYZxC0zu0TwIP2Mwz&l~*oSL1pNVzK^K_8<+rsVA|_ zpItAk${(;)D!%Vi;Gar9U((sk{a`VMcSS`Tm%Z_)Bw+e+-_uJN@zb{l6lq03aW}U2 z6$r{Dpe%E*8~Aj#@aVys=WJ-Ro6NZJ!SJP_@Kz{ULO4}hOUp}hF#h}m6nl~(SpfPj z!Qr$N{6*=^JgaV?7{&8sxHxDB*;|90zd?-2KmXM)wzM*h|FK{6<%0S}_6|RDC9seB za~_N@yFYL>M;$KIQBC21>2L@2yBs|DEZgQMABjf{dgpR#bj6&INj#4%=4-10Q<3UE zUe?}sD?@PKOnfFa)MnF=PTeYq?b&0&x@L3--mGZ1v*RB*)wft0c+X$Czh`6=d90_k z@Ps)#n$dm0XV0!TV`aoG0Wp&ya(*dzJIg?>U5*~|A-s895!}P|H;W#|tHM9Am$vvs zTc;dxnQ7Htxm_*mo7$zlYbmLSsAFdJAq|-`mY9xIcTtt}S$@sRPS-QuQqH)jaT+G~ zZ_-SUQUvtYs6*+}uLrhEK-Fhws?GQ_wim7wo!Ks5PJxZ7sZoF(jbG||m=8_@5|lgX zF*kDg(;Cov!6TMx^**QjB}kMrAVJU_tixqd_HQw{qv3J9|8fA$VfcqvpA|4ypik5==X!HlB8zUj1~yhb|zH zTmD->#Xq6%;Kb*C1G6vBZL#6%8VA4t+NpmijC{G~*xFmVPj;+sWaYMgX+xkByA$fUF3q9*4i11~ALkqlFUvLLorFlqMR_jjtsDSXZ51$p)RWFV8}4Bqiy@9LaD=QZ|e3hj+j+EDvhOg%f1h0_x>jCKyYo z(L9Um)H+y~pGNE5Cpi}pSON?8N*dSJtg|+|n=;snVVv4#vg3$B*upj;_N`mVSj=$> z^(yCwshq&`ohF%2@A`HW?;G3E3D}fZssp(lgjcF3Xia^lTA`{QFG%O%RE*g|pl3#z z>Hif2urE%vR#`xx*#+-eQZbm-I=o5nP5 zZ3JijiaFW0Hd&X0pC>-^x+x>8Jp)9TO58Q>h8|d2n^@aQURN(3dD65bft;1-$dW1f z{*{ij$9arVIPe{?L_x?Ij+y}cvxUq6EW)z1?<4!IRyzVcKgxO9=@;A5I0j#f;6v-{k$ z(Z~qnMB3S$H1h|SUG14oAtz!qh3R9LX{L5OQ3CMzLSZ`4Z zb`BLsuIpYy6*Nw2`(kRv_bB33?LMk>$WmUWjOUbo$H!bRBY}pa znt7P|kY#aq?Md#MZqq3q%8MDGFz7zB<5X@v1Zu z?>j~FnbIgZh2#X}wsd!bW6t+gjBbO7A9!uX#Sl?MQI+REWx8gXh1xdFf3txQ3 zzeLEfTI9?Ss})GErM2nxwc$a;)L_Jd7kR;S4IF|K>n#JfzKF{@&IQACu&gV(6FF&Q(hJCaG0EN}rkC8=p`=9;rot5{Xz`HsJ>(W~7WKFD{B>x4JLYg#IqOq?{CUiOIdLvOcFCqb z1-NSB!7$xh9C!yo<17L4&FVz+*W9}$IR&q{#M!FEeLO{>|oqZ2hUWeYQVH$ z_PfN~iNUVAV&j8fBz>&*1;se5XXjF`q3nE_^afY@Wl9cGB3sa@(x^h6`n^t=MFHp2 z_^sCmu_mqjn`j5I->+zsOZ1B4l|8r*Mz*K|MP^Z|u2;1_$$Ly5y;a7>7d02HJz+|Q zF>^09cssQXmrdxw$LpOcLG?;>=Te>~c;-EfgZWD=d=Z1sAMu^n=duAL(i>zmgc)g ztJC(X)HWUJv!j=YyHSb0OtkOknRc7veHr4{e1KqNo)`Ep%yPqwtm5UdVFjFfz4Z=! z{~C}fbzkZtu)1y>y5GPqWHI-a?>KT!6Zxs|=Qg=KsX0*78VevN@95pc)3InGEl=u} z%wE_u&mEC}N8i7WCGVtP@r>6US$B!QozowuCrdc}m{y0rF*MAr>N+JX_My=FY>6E# z=cj;~WWnVp)%?qsm0}rq#9UTo4y{78x;vjvIp-Uqr;+0lVBcZkoti(z{fu+>XdI~+ z?Kl-gz*m1KJyNhQ!Z(sFlD!pfCXA zRGM^vGit>nyuDydwC-x09?>ZbCt943^jYx~9Ya2Zsq89aV5+0e-O^{6ZuWECvxvu1&z{R3V$BtXf%B@+}ig5n8a zx^kSboJJ_1!diT>>qRCI4PibrD1NC$(Za|_Y9beSM0$j&6!z~P_v}w^94z_iAr*Fw z{KxnGGar_I751AKORVmDj92rX{Mz%Q;L3jm7nCB)cNl4xMI+^!gY*I3w02vec=S3_ymKM2G!|N(yNbu=1 z#~aV=@+1l(a+N=O&aK`pQ*6DxOeA=2d+^;~ z#}XDUx5u~L(7SyWhyyQ<)JE1Uj)3QF*wAO#PY}5+jK>7ZylbMmKE{Zqua}T{$pheDVLQt34$4PGqNWmHhZLrAByU>V_O$#Z6e&CAPDPi6=u?^gkb}W<^O1-Z#h8^m zh4n{U$vmI+g zuu(Ib86xif354v*Cnx+V5`#)VFmYo#jmqmSS#X^)0_R;9tP2u-#c!oR2in`68e^;#Azea?|fm8+QO|prpzczv%vQJAuj*yz%EotguSKwL5?GRCY4co z@Rje8s$@%~RZVt)k9}x{i^aN^-ttYdo7UZ_(Vj>>Ij_n_7Rj09=Pe2%e)nLBdY+5f zyab!j-t#kFuqdy|r4*mB6pGwQ+`3f%$B@u<4_nrmxi4OIU*>Mm>JA!g6oQ(c$i$95HUpnya_5oQX#e&YiUW zq(-h<7abX!#p_b$+Ea14jL*y;!+^oBBq# z_3Y0Vmk*RNB$g)OUSz~pvPx*{4@LY+b)x8vcqx0Ttukv_0YT*#)J55pc<5o8{HzwE z)A~QOMievFO~{2$W;q~` z2y9H7WS}=$DOp>E({--i^|mAb9=5G=M>#kz?BZPE58NLUX{onvN@gv+T{P0~6J=_v zUS3Ptg~YangUi44`Osw1q0=gd+Ns(0_;N>8+nZU*PVUd_(w51H;0t z*z?2b8EiuP*{>l-cr4`-O$?qyFE_akNaD5cr4Hx}bdtzDPL~ZO*!6F!<0iTYh51Mf zQ=Y|4sV+qOj%Qb^4)!>h=QzMUv#WzpjWsB^os;fL4k_M@JYNqkXOpyIh)73jnWZqz zLzJ?!-qU=O*vccr+x3DBYkBtlE8V7;l9Gjkg#7Gf(8Elx>aYt>s1x~6g6_K+1?7vFcpzfuvN`=7Ymibt=MUB zuUm~Fg3AK&ukyXIq`-axZ35NiikQxdZ7rTB4#ue3b@nNKAjbvfjJY-1d_2 z%pJJa{xuuzO|2x;%3NFYSd(Nhp|y<*S8NN}UjGRWjg~w`aQB%*>S& z%cS_dAIGukyGX)nvAGROjY{-td9)bjP?%3o-&fVW6-xr{LGfbCE5qoO7xwj0nV4n9 zQ`$I5to*x^4R_~DP>CJCW3b_yC%hl3;*6%he%Ja}bM?1;9)1A44u?_=Fkbyj$r}B5 z`pi@GT#Vf{(t|HrS-~}tSF^M2N!huAO7dDtiCF$b^(!k}DPe7p~G=2Rf4xs4w@)|!1Sm@aw{&Zj;(et@rIu4{#ICOO7@q2?} zN*4UhP1p8~?hu#XaZm*GzO>0b;0QLGhXG%r!2R;HDCcAJt{=xtbV8R_-;7rV=`+%* zc?boqUvO&6x|jx`%yy%2ZJ3Q-2d#+aYf{0TFk4RVPBZ!^sV8;;e*u= zlu-PWC=m~*BdcS+w6(>IJ7(3Fez@kzkwFQ?IIMonp+weR*58R6G^NyRJgxj-NB(J} zSTf%W@96Sd4hVmHuen3IFX%E4KOd1$?zolNw}xeY5q0m`qKJPHC^+P}eURp5MT95Y z7ou;y%T&q~V2n57;hv<$`sFBaPr|@GnKUvux>0-x3qtqA)}e4^!+SCbeHZ*_f}yZj zq*(xEZy6(g(7n#B>BYg~>oWC0pY=njQN^t$FBIJ|2sN0UQM2Fj6@9bR!*a_U*}hk8h>~Pc*23f(}j;YPJ56s&h43v?o7iH^@X{Kxo(2~_nhn$3NOn!9y`{vDtBJ%vb~25;_;(-}jvsoL-m&~YeJ*nV52Jb_7)wgH8A8eZzgiCRH=xMEvosS-@nA6uUDWW{0`zwxObcxlXtoD~5 zlOtJ^Ww!NRKC46gq&QXYHmAw_Kzk)CH|Bgvu> z15pSIHY6Rp!dD@8NX{PNxyaAUtw?LGr}G7vGU&~%g7x(5Y8dByeVLvdbH;MwW?!cZ zYS~f_HEJnGrF3Y=0j;D+g&z%*bxYKbl^$J={)t#K4L?9WBp1Zp^krfoXCHf>&1(vvkYh5Do|53dJS^-|$<>Ln)|Ik2w_(U#H;tv`Sfn&oWg27UBQ(z<0xh>WkkI_a$vA*hW=*fjn0W) z$H{><>_7#WF^5WFyn-|Z+}jGe#l&d0-id07Vyt+T$wfi)y-dN(_}+-6o>otjaBr6) zCYoG;jdI7xtyY?6U%k6CR&L5~elkloq&-@3tZ1@5iVJ3e1ivbYKZoP) zMR4-Tz*Kjma%@k?>2-dWD_LLbHoP`G;s64R=b-q@sc$8J*~RgzKM>TJk4F`ZsTq?C z8jU|;8^gU%#tp?FlkLOQ^(d7M$&37A?sFdkVy<{&d>J#%1mP7Sq-lB=p&6zOQ<2cZ z=VRM2WK52-!(~I%y;V~b6N6aRCkav%?%y?wzWOsyStY~r~;b@}A6=taZ%7r+S>nnR5e6?0WN9~BAmV|ut z4U6{#qrp*YVTk~oaJ}#t-BA`}glcP{x}naus_+Bk`X5b^oT`h1&Y^0?3ZFon*N|$k0 z2OadtamCD^Q@u|&YQRBdFAgeup|BhIQKb;rqgLqEFVLT4az$&GP6}r3t(^g#XBtHK zTWlYU>cuMof?FsuqEph8pao34v-8%weiehKorGj_amEBSHoJkK?9b>0QIvf{^vcaxVXUwy z2%8^^<%~&G{lO1M!CMqNKs4I$Es}!XqBrKQksH57XTT>7z6D==3z|~KBgX}|#d1ZH zYq@w^RhAW_n85E67Zly>FeX8EvroHf-JrQ^DU7IMW ze^&6rr{ku3;ImPT43t+~pfquxG3;Nnd5ppD1!CD^HE4LBlk&?=B{6lB@G8 zj5<&l#lHVZHUoU~_t?IIPf7$e&!7;rV|}ePnNOE<1vh$ben!6)QBA)#^2|caDM}8T z%bIVtNXVhR30n|o{jsw`56>E{NF*%v_{tbE?#hhJ`;st&pv(x7_Z&1 z2SC;X=ZnAI+wjZnU}K52UbvD$g-RBwo>TaB0nQkmPlTK%0oD=w%f}^6^ycw)r)mew z^h8(ya2c;4R|rb5AD2p0$iWrmmlT1SQ$-90aG$a2%f{m*l2@;UUTB8n?1I$j33RvR4pLz(oA<0$mBg&X3NO7F%97849x9LRG`(qXtd*%aOQ z0&7RNcDLRWq7S0@yDy7ADH+o=22k4v8_pln%lajAuw;9@687pTJ00zT)G~w%ukV1Q z7SbNujM;k$%W8f-Ce->vAY&Y_WIVk_#OU zyXGwxDV6>u3axA5Det;*m3x5gJA~*QC%@m_KkQzX1Aqeuc@43Ugub(p!K0|Kwd<3~ zg8JUX;2ShGT5O_J3|w^8&crwzM`kIQk;{X)PmNy;Rtj8$jTq7t6-j~7zCQC|Yqr-W zvyQxu%3t%Ms9Ee8`c8O}>uNcq@bI!>D{Z+(0#q)ho&N4u5*p>bv*+{=-E|~ui|l#!7Q^8e5hT4&1?8)ZuNZMdf-~jF4X-7<4{D8y_go3(G3J;XKVa(>a3XI ziTx>rm5BycTECo{4|%OqL3_qa+rmxs&_`$_)4LB{^(VUim#T3b`aAo8)xUK*!wnZvA zD=59kZxM6CWMY^>iORH()lpOR9&JB+u)ThmJNRffCJkm~6k8YPMyXeDCYHs(DRCFz z#OyJL;4*3<123`qsfPPn@6lI+lxXqa&J+0Pvtg##BDG!*hOIEdjx99brTT&7E}KS# zGOZaE_GQ11#p9I;0rE(lqi*3!tvKcAU%!Ak5Nxs7k*|1G5X z{;|C_VF5hf7ZTX5Id@BH6?^D;!NyLL=H9B#zZrV7rHY95wW6+3Bq_xV+hRfeIa#IU6SD2CkPUB7RH8#wL-*@UpQ-45Wot=pd(h6T#O z66?;U)K&Emjx5|KE;L}eEbdnu*D*$rEhB!oR}X@3?HN7Cy?M({ zRO9BNT~_86hl;kH1^{GXy{iyT&i1ll4r1p(y(N4BOOSJKmwIMqD;~4V+Is3F}Cv?224Mf z(Yk`&>b;TZ)(+9eq_1~2ikqO)WGL5$0IWR{HwqujcYxWdHQT@Kk8??~HR{se z`At~oSb=WUH}L#q)BKA;&Hkp%nsYMMJBo*-O6wx@}moeTvzo!dc9_o2%{tYX*0O;k3GW>CFqtdN3m>Y~3tZX?y&*Woh z5ddKti`e|LeNbZtd!NTiPF?R)Y={qCkrV~GMEDAof3@w3)a62xCbd9*%Fr@bpn2O` zWqmHmIYsGkWHfPnF2STgl-nbK%cKx-l@9Y zC4**6gVWl|P06kg?%$(SDp)bKN9yB9-W?RNn_uB%--ekVpn3c9G5UY6^8bHev%gSC zsz!e!y>OUq_tR>b=6i3|s+#T`JD}AOoM2gH#Q2a^9S#?Dd4np5@mWq~J<#2>LXnJw z*RR!gp&c@DIHUPg;*W)0)I7BB08GUbR@oh{=F;9LIDH;Q^_Z%NV@G`|hS!^I30tlx z*KUX%EK&_zcr<~reAMmVyfbWcOvPur9^Afvfze&ek9zv-mVhE{bxef7lM;yD6hX6Y z)6*IIpeIJI4eA3=-9nJKFO!^`c4-$FxS0_0S<(7|o*(r}plNcw5*KW}gl-|yqp-#m zc4xoeB-HJOS-;*ejuN1UCy-hF)nTIm>cm61U9_l272T<87>Ed|?B0_l!1FHnfVRs!_;6)_JIetRm={Gx>&NfjOMa`0VlVAYn*T=m`m%;VuoCxJWh z27lJS$Wzb2xi2-v_jXdNaGi?*1=mKE)R+==|Ry0zII>$E;g3MOzDC3|u_rCUxgQh}*-YLrv2L|`5O*;`4r zax5lcfoifGOj4Cp*Iy>vh+qWVWIylw_Vre)RVs|dD@;6Xb=x`b4kX?<_4p0TZp9P zPNExD(lvCj#ndJ-v!m4rPJ69og+`k7y>$gM8Z)s33|9jM^n{hVV#m7)s;iU(4;z&n z@^I*Vh)nnMa=xfeb zx5Q3c31?4y{fwM83Y46vC;G@@nJ()w3g)h0k??ypnnJhc?!-bk z+!X_<4Y4I*zcq!ipXTm-VSlOM{`_Ms&&YI?vbIT?#xE{Wg?%+6f}Uz&Njv`}3FlODV>F4!R%zLwyGB2RD)3Y!1-f>uwmDxzs(Hc~7r@ zjD8S5a)MhBHKN#lx6yOCDQzzq&*{l;PpiJkmm!7N)<6-+H1nNLpcZJ$AWpu+h_2wv z@+Evc1RZ=S%K{1=^%;RU#;rN(RkFRPC%@+jW06627b>F>j#XUW;i|4`Kbs!@*rs!`gCHm>c1 zN*_Ws3hCp;=>v}aJIM>X$g#3+&30CHYP=GIn&W8^F1?15AFvr2_5CTAK1ik&^A3qV62Xpyo28=xW2Ohlw8p(&UdgY>T^^}L(3vU^ z^9&|slqLf8lrh3<5<;NyDc{E*Nl*Hj$j*M`{`P}Xn>^i_3UW0uONi6XGvVlBmhqO$ zCC~ZO26u{!iLs%b-HjM|G_%wy;~-0%l7x*Ib?75AvK)xCB0F-}+0aadfg(lBz+|A9 zM1&|#fIJV88&Ip_!mToF-$CtBC{lN9!x~pp0;+K*LtXnes&PNSL8|?(2%ifX9Q;_9 zrk`?OP#6^ZPB1%F0KvK+bGB(voG!XYY)=Rq)g27BxvrTQB0g~&VUINX9$u8so=aOp z{s;bJYVW@qGrNVD6YM&DL#~Wj*^kWIdSqDLoFEo z^6F4twWYiqsYlcOyj2fcucmUZKdxDgt3jl-y@s^49`QW&sd1m+;>f9m*bYi7DX2e% zRG6Gh-T4s*02_9sl3QVl+QgvYZFurm3pWotj4z_cFAKk?vnlBu_75!p zP}Wh-rt@uB)&)Y~t?G0^?1tcN_(2G~-Pcu-c?u%LX#50Kj600Ov)%K(`?v>n11w^@aD0oaG2=5Y!;Urq8)8=V^mR5AFjNlAJom`nsK6il0zc+Ws&7asrU z9J!ZTdShKga!kxbG^yL0R*_qsUCp15TpAK2jr72$ZE)Nl>k=ewN?7#ODc;q0P5Y_C zdHXO}O)|zKpUL+42p;adPhhYjH5ez%bazWrJnL-6^UU~J{_`J<-sNCRTyAb~wj_eA zErzOo5K1>E!liS$kf?h4S9GC|RqCBR@CgUxwCzMY%9#aziLn12iTgKOg>!shV=BVg zTZ#ZlP|-9_2nN%kzLOCPSTOlW)xIJ5Ek-Ryr^E+~Q%eqLb7PIc8#Mku>fSV}$#mNq zEn8GnKvY5(R7z1nARvqM#yuCqxVq1tB0^0xAlEfs}>Plc*>tJpy8sRv8g%_$Pzhsm;kW}VfJ zu6MCxj{crmg~IuN!UX-dS(O4oSgtB+)R6_F@bf;T3g+tB^w7&uOXPN3uFrMu9Yf>9 zUE144Ha&>B9szEVZyQ}Z|69@afF-v71VgHd9=|l7qxZ#eW?_LSYcqy&y3VH>l6jGw zMibn{EKDbZo00hSv-lXbtx%5uo+V)!hn(TKyE6fl1H+$PnFC^d|0@mVn|nepahIjY zlTa0L1lmQjG3(XW-`i^6M(=S}?Nhimm3`_(DOzW1TBse) z;%y=BCzsh(3~3w@bc4K zzbOFuJwanNIi~ko$?sw{XNfUrw@5`;IFarZVYaa@oTXhw=xZO5HHssR;0b%*$njB6g6Wk>*l(8e6jFd?zdUZ7?aGSSkJJ=S!s<)ne!YNLz+H_^=#OydavZTqD8-mqj4oZ;Po96r`c@*ZI zO02?|%&v{Ey=MC`R5RHxgH6q;_Er^VvbbliJEW+$B`|tr6p&%2*AY*Wgd;kdv15gL z$%0Hn=t3D0Gx%~dJh6NcPJv)aBQlfHkayS!ENxjR2i6Tk<)Ko*IZ*`XL^s-O?Q>!v z#JU}_lO=0CzH0%(88M9i@E$tdIp$@-?^Ag8Pg?)=W3@e^8n4E$Cc{%E^UVh@bSIkZ zB*~b2y+Aczl}Zb2S+>$Jy4}xO$qEh79PNy;9t;TNnhogJn4$& z$W{#V+6xaU5;WQKtwDp0`f_j&wek&~Iex|jeB=bo)jp)a zH?|Avw8+KnEX~|4PjlgIY7xhFMzH9~u+D z4_w2ChwqV19vj?Grz+;UAlfx35|F72*+TO48~2+|5n2El9_a1ufYP zNThD@JiB@R7U!LJ6+@;|0jU^>^)J-yJ0Ez-MR`D-DY*;FB2K^;sv|3Sc%DC*H&SI2EzIpC;dM%S4hz0 z;;HgrTfR7Hzwb&J2pu21TS!}Oodwt|L|u8$n%Imeq}+0(y1mz=+_r+rTm1S<%2dSY zWm3N=<7Z<%{(@HqMCRfJia(=JOaV8SKB_(U*+8r&7-&|P>Re$hstcN%-Lo~XE%#nn zN|a2`H4G|voiXAZ6re7nK~d0y(_l)*3f{H>6MfbZ5HdjkR6g}JYKJRi68Mw_+j0{b zh1QJnbuiV@zF0;~nF(TGrD{s_Yi&FOiZVD;S?6~GxBO^-D;__azZr+mfHCxuxT&Tm zNIZnk)Vlj4Hn6SM(!cEqb#6|A?H60?e8C6D*EmqkirE0hL;tb$^)D!cpRFFPm;bX? zPm&U-rc4y_EF!^7a>^yC9jVrr&wLx!Y&UEI`ToQUTAcp&4ijQye8aS4ZG3$A8@kt= z?k+T#qaIB@gd;vhHhigoVu?_$G*TADR|aC7dbDbNc^s$wtO?XrJq-tF116GhQ!B@u zkO(+qaDPBXgs%NZDE9&PW!R~~C+mnsf+wO+5D$xKe(il7rwUHOA=uGemIpHU%^{lF zc3l4+C~0KE`H$L|Xtu*fzBq>9$_Qi({&-xVhx7lE7|>36idZiB2CyN7Ky(b8^L0aj z&8o~)<9b6#x5|1tNIksRUyMj=r5=$B!jLjmJ2|@6RlBArglp@q;-38Euf^y;g#2}$ zz2vbY{+GAw;qY}o^szN^f+L@d=iV&(s^byEr}v!vtY!OITQeEVOH`XG*2pRJUowCe zWX;p*aLBvRr}RY2NA);0r{com5Nv9pGiqU$%)IVkmn~?|Q&qgt-6g7*3)&r>Usz89 zt`YdyopsI-_7l&YLHmDU)uN4$wUXPH!Io2kV3CDjL6QYlHWhjPs{Pu9nzoX3IYkRa zh9$sg4dY~Lmtq=TfyGEo0 zj`Fkv;_F8(gH{Ck6{f#$$nse4;WDmy8Sfx=M7(3yaBglcfu?|d}7{hL8ST#T)>e5q*y^)MaFFv)Iv4dZF>Q42?iEIMqFp<;6~u&2c$>bmt(VN zGOLMfc>NnS!8DqQiM$uD?UXUzUQBPZ#(@UqArZw;(9(0z0w;j~KN#`?x#(@{59c*= zQJ63n9k3KD85UN>`?`=|1cn%WHB(8(xU{WkQprGG$?3*y!cw(Hx3%k4D=u(q9)sCM zXkV~9B4~`WCLwXdVZ0WXWpahiqPhV?m#ynVLa-2=T!YjaKMXoE@HvFx6g2;pQV(5h z)3~eW*5LPzXFGc;cv7jX)^nfQp)G2x`jU}U;GV7tZ?WGv!V^aK&EKcn7>`-|%-In4YKb?9;*cSU3^JV1Gf>>3&y}it} zl|P4Nvz|D;t%Xw8J4VzK9=@g&2&NpfG6zHz%_#+Ti~!t4hLIc%%CfQ>(4gt&+(3z@ zge{=ZpP1-~9$yx2$2?eGodX6Xp9%jT@NUv__L}5EqKN#Vkdsj&ec4Nwm=G8uqg{U? ze5F|p2?8!=2f8`Zy6LI5YmSLs6=gB3ks*VgO|0C74)S`l1ZKSq#y(*#GWi6A5|7m` ztH5gis>Hgo5pr@{pT-fC6V^Oc4Zftdn<#QS;Rnp~foBH#_> zXrbo6QvDIF2YsQt-`5LU%W^k2t$9t#|7tBCV+mW!bxCWZ+{a}fgb=wl&sE>o&wh#n zhy&RR-$I>+wHlqBmSU6j%s#)PT~)w3wfHsgSck)JkVH!3&6$G(xS$KIdFoD;4WF(! zfkkk!r50XY-LxZ%;!vEd7k`zXe(vCnEIo>ML(B%=Jm&hi9mJ0a=*C$pYUV6JE>iQ? zpjY2&TyRhk?B3ehiMw;t;g3?t;{d{RrEG0tNm(kzZ{9J#lzjloeRSN1^pr3kYlAaS z7F*~Dl^7_RS0a%SGrgSmv4TOD#Su0t02k!CXcXC#r+2qb0@2ebMHcyM(^0F+DtE1* zdgqdG>*rMQgzDN;lMg}XM6%p}>P#r}PvKlPSu4WucB-`*FNgNc^_5-KxA0xrv}Y0u zVl0%-B^EBCFhaA#B*OMWL>jxyuq$ya5!wH?o|*wm(anQuYHKC?^xDQ_4v__L5`@V* zu0+=i_G2qx^+@%8v#|r2k9uNyQ2{iKrQ?Z`lc-$8?2IjEx~*sK&iDi{FK!#C zI!@0BRY1=+G-Fm40o%Wl9?T}fp8R8+U@ffH`{HL=^e<+3gk_O%P7stu*)sdO{nv#& zZ~`s&hjGb$mGgw*Q|LdjfsM$dttj9TxPo71(=FzGfSvYb1V^y^@s~)6h9J=z4 z&~`Bje5qJ=jKH;>k4f-g&LEaZC;WSb+uE`E{+E9*EBg|Q`%Nu4wpHq!`#SN83X~f6 z2W>!9rl}wqLH$OOT7!{snnmZGl<;UT@m;_za!`|)sx~>YW zN*Gw^Q1Y2@-_D=4kkw6*YROfl(i%hY#LJm!pDgh#s>x2|RC?5#LM-FlvB`2Mue-BR zkXyjgfY!QvdQ^W6>`7&4=a$ zf-42m5qu2)pUY6rzxdAiiX)OcfA4zIAUU4$%3-+<#v0bNVwAu)>uK)ZCYin0t6_hL zCKXlrQmQ}?h8xfAx_R;In-5eXIYMUM$4$>k9dr#(U7Sl};wX)_tV(|rlcv$n-Wf|k zq-(Nbxlaw3Z@yGavD=MOsM*jb8P7kxKSb1Nz4~Sa9JKDKFM3+kr5l3^K3!HPdV*FG zxw!5^A`E9Y=EwA7zzYCtC!b`Kpy@%36-el4uswPT=IBf}2G>CYFI?@`xZb@6tyc!kzk?{!5sVSAvT%%qxD|<3?{M7fTou!AYOKPBN4qj?GG;pj`EmB+E+X zzB-HL0qPX=(gzgHkw>u$$YA(HJ4KsO4;9Ouziwg;kzrn?xf^~LxC@A`%MzicYU`eZkm-^G$l_P!9_lEqW z=S-t?I8Aii@qQnW>X1&=6ant`=&oSK3XzF%3t~0*kvUE76Qmv#ZU+zza9_3%@ge?i zt(%70d*E&F!o5eEF9w6wdvGsreBg3an1Q7J=XZN|E8w>4F-rPO7whEg-kx?e@B$vh zBr4s1zLOG&3-VOQH&d!!k$<4(F_mx61uaa&QVRv`^o-l8fivTd#D%g+sK+95!M0Y1 zWkvBfJShWh)!q`?dkq>AjOHGks+aOKmSgvR4^NnbTVqy>nsc&~#ii?UB!6-%+yjwl z=fN$aC*tecxanNI%!{h*{RT~j+XLDVY!$>{j!Dt>xjeu{g<}0UKz85(yHgSfdvyMr z1M0}4{Hc(c(#&fMYlD8*2xeDk2mlWzakc<>bbeLlb9eH zp))(LG^ic>8??3Po*JX#a!l?w*!`V71!}-| z_`_bY>(`4RDVY?UP0l z0VONlZei$pn{UNkalIs&oDH8fvGs-3WnW5*VBqb2(e9wad3SmX>;pLnW~YUMzML zR3^qnrMAswtj`cb6@J#Z2?5&5%u$$*E#{cW;Y!^uCQ|DbfNsx^(i_CqBxJz+hv_(P zJQ&Ro($yNz_N+-)ix|ELBIb7?@y;mN+=z;PL!!cyIzSKP$UuhlbYyDi{oJw$fj4UWVI^NWuu69 z;Hqf#RB2d&i(ctkDS_TG7VEBto3$b7)WMYl_`JpJw!^-*c_AY6>zkb?Do()>Uz}b> zj5M?@ywaJLHj!U=SCQzkSH#BRaAoX&RlVu|Z>l%T;RSxoUmGwNTH!+38+c{TKgr&7 z|G%5DJ|%?&ZAH%(Gm9U`_Z6+7D&v**UsPq3|9_<_^DjXCPmCfe#3&-(lWSx913B`- zIgH$l@48!TLAMcE!A%jh&ySC_Hm<5({N|tLoV3sq_G(8J3I1vvKjz!)e?`As!}^kE zmu!=_NyP9<33b%?N1+}vtXyt{5f?U8Zer3pY6X@p7ak{zVcx6+PTa{v`M)#Qu<59*hG+LBBMq z{c13}c)FS%S{7#uWg;g0q+C7rI<=weAGe3XsTqPdIZ(er#vJEto|+WanI zv&cq^)@8*&gX5Ue~kzdqw)Ckpit9WB4()Hc& zEDuOsEo|Wu^iRk_yX5iQ%3ieB&fjrh(`W{^E>G-NS4U>yX4F!HfK@Oz3v*f=fn~pY z$9up*1Hz`x2a7-UjXtl8oFlqTr?Yd3!>7Xb??p%E zcDH_c&otSt2`p|3EYb6T>cK>ko8=6^9+Nd4$$xvsTeuJzNN)VxhY7k--eGAt|J6)N zHwD{(zst>Vb};nJYCG(2%e}^wP>mV<11H8Rb0)#1k{pHJ!C=J)Igh38-K_ZF+Dzsd zBCk2Gln}<1n^z2x!wwfR+pHJn7z?jU=ZKg}7P*1IoBd+Q0b5Z%a&7E#Py-1oL7Ue9 zt?lLGfNT=m{<9?nv{;Ij{;ygru1-LUrPWXK0J+uKkLk1gQP!_NTV3 zl}=12)$0pIg@NGC+`jF^31e^@>9H_7bdeO6asF5(1A<$gkj|z+T;uh{_?--0nSi-i zTRp(O4g7odZA{M~qO=8pTk5Fzl*M?&_{S zmq!Zy!>vUu&7Yc(cl0=QaT>MC_S4}*%|})-!~0RaTML4IjM*11k5E=doGpUBNRo5# zb##2)Qi+=GyRyGM-LlW>!Z}~N#i6?efBPZm7mAEnrj;yVvST?TUwZC3CH{as(6>LNXsNFc5>u-m+G z9ff3XTi_zh57;~($Gu}NXlTb|-3z$jV~}B>*Z-~bIJ-Q9k+{f1EJofs0nf4uZZx{1 z?(km3`Bz#kOpE>$a)yTfL_50vMm>tLoopYg3E7lv@<$#8&W}~ZfI)j2^-wp2#X(0_ zHj?-OQie|2piIx@>IaoB-_rApkZ$re7Lq)IMSWl0|5!)D^G*Z}Xa%BqAKdvLhJZIC zq3qX(6+P4PJ-LVhX@(_~3t0(x6k3X8!x>iOmDyAWuWvxFdZ<j$WmvLzaxn@u5*3XBu3xnyO{t{B)jJm!7lKw7hJb9{#Dt4byr~%fH3t9H?Z>Zw zn>x93M7V)_*zwxs@np-hIMpQd$gjda~ag@&;0zv+G*s!#~~NAx~(IBwM>8)w40{8syUq?&@Ocnuo4wK zPDMNtEk7MMP(mffQrQ;l)`o1C*Nx_^O)P(?oC5BYg!1lR_Vo@)o!X!K3lTj#Q_24_ zC)T=+q$&2H6r(V9XRrM>?9$SEx>t;m!l=3vGrv?Zpw91cUpcE0wHTJChh4&<@GMF9 ziw3u#fPe*KuokLXit- zOhm;Uuef@u={=r959G{f1#z{+%FnI%*x0}8Z8x2XT zk8k=Zg{9{A)yVeb--k+7&;7NmnIP=oe-$LImDs_Al&?ACgz`>xSHR6CvEsFC({m4zeCxf0hhw$ zmIe?ZiUnY%5~&nG1D!IOdIw!+w*SIn%W8vQ+NS9fG3L|c9S1TH4`3O2z3vXQW7=*W zIDp8Iu16yokIrP_?&qAOs2$)Re^lO$-`u)5d@k|8fEDK!c)VHVwxt4Tpu#xwQRD_f zQB1SCZ##{_tF#Qb(CW)5J8Orv)nNUsts1gDy-n$TbzqVoji5TpaFae_hdi@TLQvak;`~fN*JWQ&%?$64O#B$ryAIxlNJXIx7a*Ey6&>2Y{qiRg+i<5%gGoTItCrIU31rDK zx^HpgEgx35B^usl&SQG~>tIgm%jBwn&vX|(!?+wWpW%J|%i_mr+aAz!cytRVJV}rv zPB%*W`9fV_sYRi(>rc7hAudRj(T2bdur_F!9;EX4%qoz6y~}&#u=r>Qhp zwX}NStj({!fv<~m8~&-I(c5dfsRep_J!+Ex%xHz42!cqoNg?!Brb!OsC-wd)UTVp<2O7XA zH(qOypw$lIP!;$>jWD@hfffbM??6mb<3BB?A&5fA6FOZx;<8rU>6H))E+`J3L4Jwk zttJ1H;nyALc(pVw(zFyi`vNhHl%7skbdD5jGPy07x86V#Yk19o=f<j9luf9|H_{PlF{JIq`v4&`2JB>vE;W zgv0jIKZ-JVoIdo`-|G?$HRuiy&w9F{309p>mjO#88X|hdZ55%p?gVse#7Jl{@l9xP ztPK!gAcs2hspk?7KUHU9gdNZpCH%t`kL z-{P`QgVq1Q{)75&d4I+fT`yb^9_Csg#*4`wVM~9zD5~HTmi7s7=ojbM8rx6ntUt zvhft3+r>ut_zfvLP`iL}V67y1>Y>?ht4Am^M`~LMKUy;#cJ~+slpS0>(;;d<^h=i6y7IX1CPi3XG z=Wk25p%?$ls9W2d_hKC~}~Pb7%a8H4sA4oC8Zez>1`ys*TV7YA){KZ+5^JlJX8Uu6f@&i z*+GFL9UF={jI%&>X1I%jC!%QTrTz#l0M_Tte}DYfgf;K}O<|Cop3yDk>VAG9RQh(< zRIE$iV=TUImFX^Es`5iYD2|z2ZkV(!SxPVU=gm2+&Lsr}J$U?_ix@g$(%xg;s>jdM z`;2eWA~d;8YM=%*_WoX63V!z!UI0$jgTod9ot@nuBoT`0fdJGDGml;h`jz*N+SQ2P?C~GV1j}bUJ&#E_;49~I%!Dv%DphhEA2fei zVeWFRFuSXPdlys?{x(8?w?KFkR7ocQfa1X!eho9giIC7bRt!{^V*q9i>d92oJaud3 zr_Mb%=RtO^0dv!((}lqAa7IIqt0C%;5U3u!ssV(qhlYRy?uL-SFG~0?tC&edFGn?P zUN7VjvU%g#{a1cHF!bi|8Hr1|-x4-H*cKjsMep8&DUm(C5^oBn9QK^rzYagL@9|lY zH(OrKlEojK7K9qOV(Z9&`a0)ryu?G&-*9Eb9$*e z#FJi$+!sf<%QhToOgW=G7w>Ye@rl!-^Z+_TGe3nWacRH*pC!8$c2pSZOPx=gr>iIQ zzm`5G;3$@4khHJz-gui4mJ@@?cnBOKsqBcedSW?KONXEvWXze(xT8vA-{;aw=KnN; z=VxbB**l5c(&5~btm`@p9r}KMC_M=WdMqXQZ?QM3D>qzFBf+RAEab;YZxXX-2b33J zv|%#})pIyQN6JG-1RIadD4vDzA3G)`I-?pgHT{WVk_IX%MT6y6N%j}nm$yG)KlONm zS#7QPv+>6Ii^5OmZV7y)F{Fe@iC=M@p33IRz6Km(+XC=0<7kZ|xOGvgC5!zJFBLFH zL7%t7HC^RyR>bYlUOynAZiFHG-RO_*E8&betorNBHJh3)pL%83wm}T>hx?rg6ZJZp zgrdQ9k2%LsdGoJa`z>TDZxMJ1WhFX}Wfo?AlBd2G4{mh`LQXFa)prj07sI{`imDZ< zN671b==PkK_o$QzlPw$wb@Y!oA|-xlb-u9lB9L(R8)={@ijvd+@O4^$=-Pk(`nGZ1 zD*CEqj-2a%|NcLI?NZFW)yQ|Mdv$Go71wz){nW|xgit;2%_Py0i8~%My!Eo_5$hWb zIx@!du0h+m&=FKzYq-y^s2dT4=1V(oo*q&j!z!Rg^9<+qC}iDAGsz~X40nM?o*zTT zTQ^bTunybvU>5keKBG(Zsi|FxT;3en4-Zy^+Mq0>=)4}xmieV8bw}%K%7$;b#vrv07rO~{R}IKSOm{xKP-MF4EVSuR5_ zsOQ{h26G#k+U`T!9>`BkbO${DMPTykRYF|^XwW3PXy&|G^ucJ$13&#IhrhivTd^+Z z0?+G&6yv1$l#2uWyFPBe=RbaE0v~!-lUci=xX-FeqA3elpa|{Pcpv(JFScs2;AD?c zPcCpcJw6U>gC@0|9uCKMhOVwGlv?nBeJL})=4kqB;Ak)~G8E%r3=C)uvkM`m2@lv( z4tSUVNa>%W%i%5z6#-lAfRecc*|%fuLWikGv;wT6VdMpHbnFA^LBOZ&=%j-OFsk}` zU~$u4%iprjGa`QIPJBc=XRV{0ahnUAYq4ko4&71q0T)*dBPX^r_zUJ*mE5q=`@7k! z8*Z!QY_W2Aa^7k!Fk31c$MjPJCzk~IC)Ox^x;|Z8;a$~DJu)PK;kl| zyvW zfahIUd=}%;WDZRksn^ijve9(L<7~!V6^C|FW8NiBg_t-rk}5-$9!Sm2{!nu7Fh=Nr zu3>>{+5e#{)IsgJZ%d=-zG#}X86~kM8JLTuK>Vv3(<7N%RrR*i?aA)y|FVN&6aw*d zD(<}8?xJ!3{w`sl@a(cJ0$yM@PPr6UTiu8|xZl`du?PU;)E0A_%!y;Pf&lC$hBZ5- z*I{+3^=1i=6{YOKh4nLyRH?7~(K)~`_00fDucXF8*_YYhg<~WMOAr-pGS0Z<^;H|? z2keVlKTZgMw)|OO=$8F!@kmO-cVI~sO$P2d;Ut?U)Ou>Z&`WWovuEY*$oVZ;>W)w5 zzb$|65vY#m(xD@dr0m~@yQlU__whjVvVHClC3GRX7=Pm3`Ra&!u{KfEX)1aD(Vm;B zNomncV5B`;>#%bC7;q`uqc^!YoJ=wnS|}@{HYePAf39SN>UF>iIP|t~>lUqG4tW2P2G;=n}npR`7J;HbBvEz{K%s@qK zo|N)HoHB_yY!<4~JQ3AxHeF*#UMG9bTGR8}MxZd4%>)W_&_8pb=cjeVsFoGaY;qU# zX((Fweyu`<0gEiijbs$61!K#)j6j0OS8=OuI)?9MJpM*?ZW;|fe}S||<>A7HEcW9! zMX4FtUEo~n4}`EK_7@>E{1dk3Kfkw$As86^VC#l6xYJ2F2JGU5#*cOVPHv79^&quK z=n4bG4`| z*grlZKc3k5?J>^zaZtOO&Gn~ez5_q@q~Wo4p&4>M@QXA%R$w}1`}`wi>z8SO2u?mB zjXg4^ppeH3ny=iP8T|U(*)6jKta14l?^zDjTXxi0o~lru-v052jKoJyx`V(~XMm`2 z;v#-$R#<1Eg{?-c=(>3yKXShaGb@nfI#v3L1EL(dzH%cMX?v?V%U^gJUG!Yx#9 zUX5#d>{!Zz)fvdq;zyG;%uvky(D+!l2wFDouo#MH&px(*&Cr~OrR37&l8$1IL{Mkb zD~DCm7&?3-(;fJXBOgv?bu~?XywKr(M{S+I<<8e4l3S3mJ5|KPkFhJg98OsY9vn#* z5Zi;_e%wfpEzTHuWU4=hw)8tfoQ{g}ZOGQP--cVBkq8}m1hXLU-m1OKYd8f(nrv6r zoX#_ud#4{o@vzcMY40e*5}ffF*06`ytD@z-lgr zab;_o2IOsTod4tUG3f_AR93ulF^`q--1+x{$AK`neK(5pOJ1%%%hd?v=r=^oa#&UyM6`@L18*7tfY)KZ?-9-8n+`)w}!q zA?y&=l_LCfmDGaxeT$O}xn&MUul4|*2mb2FY;UlbYkUB}B6rrpBKw3`B>08gjsFW4 z`KG*XRo*n)rRdvwkT|%dw}K9I)HZ&*^-7@fs9{(u4*lKp)!egg(+=bL#;GX76$nc( z)0YaPw*~KgW)FKqDtKSw8mh~7Y@oL3+Y=Ep8ZinA1D+9t?`^IWeC1IsED^S>qm1*o zEME`TP4ON5u0D^B_hG~@o1KgAGT)OG`sJNS7IHVvb>!u`6tOUTUt0KnH7sY3ILp$? z@Q*=Emj9x9{c}U06UcjJ!}ZLpd&k`snj12b5kFu`B;SV*Tv5MRL{|V@YuO<<*c(NdIB%XR$7E?Oamg1J;W(^zy?;@ zYCXqHb-Vvl3t+hu^WJi~4ugsU{MM)QZBGrMar1zLuPHL0s%s?*V|u-Yn1g|TA&3Xm zzK`TKi|0Zo=SN-fJ$EX0+#D}xZ7|(fxFy8svtYhcve00`ITY&eqBB*tL3#i9ZUh6o zeX|2Y=bu6<#gbkFMTHbl@oN+>9}n6&deW`!r&k{EH#tM~EM=hhuahHn()zKp@~tKM zkeNVrH>~hHD#ImefNeL|+r2GoW7Ug!!F%(7&JUXy2VtbY$99>6pvsUvIHdjGtB-$F z9QV7oSWb1xO7lg||B}S`W4}I)zG9eM4Bhc_(mZ6!V(AhK0z1LVco}deXvzGJfj*|?*m(PZW4Cb@ObEwD9Ti#|j)d<`5oy^W7;$m*J# zE$v8#%tWJyn0bSh^(&{pm`4P+K%Sbv`R7 z&0xf8HypfNV85++l&(&?ucp9%7S%SRGQ=~ZSnpCyKZKfRveN8Gf7m{;ZEl7RT_rT6 zb}U+A7>SJrmQ!-OZ{1e9R?aPZIuij5uoewJEsdt`6Yt#=R1>vv1-_3QRy z*RP*GKcf>YW$(M6u*&Z-=~_HCkm9Nhth`TWsU#Xe)b!sH%GQavbYO!fix*f4MSJeO z_3OyLxpjI8SV&Vqycaw626S$4ygUn!Sr`O`_uUIu9!yDaOY3(p&#V6U_hQl|qpcJvw{0_;)BUsUALO5Mf>|Z5@AWf zp)I1{MK*Y3+vBBcV?UKi`OduESv)#sTZ#66Nh~m6=wOM@qn4Ncs8VOA(zUZk^GNY0 zrh7R~mzUZVD@>4?dFD)|(9wa`c6K=I0Xq+0f%_w;K!^m!E5gKmfm@Py_p{xo_trQP++nCz{bQ_mqhi_#^t4gmai zcVky4gI0Bgq5k>Y;?2C-rLpW(;I4QKSiL)%y&3_IjHwz8+R3{*TdzIZV}4d>f_rcf z5QDfS5cqB4Y^H2a_1*s)zWYrQIML$%b=|p%;ho#oe&GH$>qye>sN`aqiyg){&7LR0 z!TiJc(Gc@zzBez7OgE}$CU0=IW%+8bT=bkdRn>+?zy)>SDb!x(p+Z+f%2;4!R_1RyB<|yId$@ zhP}CL#CD2ES&9!;=8v@NBbmOrMA%RTsc|gsE5oJG@R51iBXA zE?}@0ZH$<%tO)@*SdN~KK8>Frrh3QQBnxd(YdQk<`=)50=1vkO1D@mXgNh30 zgihYhE934#y8At&Z-aw1GTUU*n%_!hlmnk}D=Rj0_=suBAg?k^Qt|-Cih9VQc%>af zx!BbZami->o4(kaH__JTo35ARHa!ygJ5IYOKBZ@%xvuu*-+%Picf7YQPR5Qp<>sAP zud#_iGKkl@k@DvY$hwH%zYrVmI2E8~Uu3-OtNfMqTx?a>DRESLCDvJaf!(RQ{uZRC>w zZ^*O7nCb-#w+v!bD6KY~E0ZaSKtam5M^GP&4m=V+^x8Vg-G z@T~sMv~jod07jsRBUMrkb%h4CH_P+Rt{H~!x%;|>M5F(nr2i`HM}=4%x`%IlP#kFg zDbf`I7Pr!=ze22qM49NAKcu^8zmY#9W__|h&PdlUe6Fo-|Gg>WUWfyO!NvixY zsNb?lg$NUAt~i@fE0eqax9t($_N-ftvk#nNFYb#IPes<%E@iw6l%}t=CyxYILS+n8 zFJMwp(>kTsnwp+zg|yGg&1PHMC^JmH%p{{k(w_k5!^yU^M zfXGXb9JJya6b(9aJ(q;JW$lRkyI>ccUE2GM_2}JdatiuG6hGuJR?L zeE_cmS=HFS3fCCK-?R9C@W=N)*6I1MGr;Hwwa zd)3D1Cn#1xQtko!@?M0W1%;cg#MW8GiMFEGdrUTUA(T6U^Kf6ImqP!dV(6cgMXjbSy z@Iz>0{xi}qe(w!Y=eq~-ZK~vhVrx&c_E^~F_M~v^Td(nx z@7uj5*$2M)556zDj3}+KSej1~TSYhi$9~So&Etob%<|(FrP0J`m>R)(d!Xl8ASIjs zVhHLKn`aTBJ^L!n6jPd z>fH5vl0S`3Zy;$`J@b2Rf;rZD;*eB|ACD-btcB|zhP41O+1M2C`saGlN3lAqh(1~Q z2kfmX9T#3CZB+4{NMfB+N_r-Yz0h@A41{IwPr??wMNNRPJ$X#D8~e;hKEO>D<9&Mv z=2{&}Yb+*1FzdxL0vA5_)E_W&?E+@SR=?XQXC2(Re?Ap8_b#ny(y(0Pzyz?3e?9tP zFfH`xA%~^!G2i#v+zvjF#OAt8IB zNZvOQR>@EGr(t!d<>sgJrszy%a&d-Z8Y9-5S+l(O_&M}BmFc~CyfJ=MG8LC+plGfs z9Tmei-O0=+`Ch)~Xk5BlDB z+@bg2TG>d|Ve>l@D(JKxWB^;oqov&BSW*lS(oY<8Ow!R&LI!5i)w3lkR=zv14ynNw zuTt!J(&;Gl%v55AX?6z5!MjFo3t5Up(a{!tnfM=#h3=a(QK(Qk&$Bvby5#6ZKYkjJ&pw zw4_wEl0~PIbITK-C$kE>(%lClw2Y-}@0=nfyeL@bp}Ah*|AF(q_J+rYQn8j~H07UP zrkCovo~bVCWVeai+I-CT0YFiGKC468awpfp_N2Bdi)08o*5)T}9&dDU+VbV~rYbt5 z!ofr(#N-QxHhlWv?&yi|4diXiPJ1PEVbN`yMFRdGj1^GEb}@h7)^aFu(ge@9&&>`@Kr_bMx#MfYoqh#m9D z!;d~soi7@^WHVc!uVg<2IpD{m5k7@+~f41Yi$BsLc>4}eM zP-d8vJ`X^Vs!-+nJ-4rKQDx+R+b;Lvu8_bFir4D)MGJWl*-!T^+dn4xfaGpsDDQpM z&f{igFAw10dM%!({v>F;q@VB(sB9=6B9v|;&%M~<2bd6!7hvsPE0KK48*p)}It# zBJRL1uL5t@Bp1(~xBwq+H*(0r9U5Tw7(y8{V5WZ5SRJxidKA zSYYfBIrm_X(1m{1S(Vjch$?eU()|5P%^T{z^b(f;kwM98LkA4jJL4hK;b=QpLBQMW z;@RWv!LGcZ-IE3ykNLa?G>zN47eDwhDsvKYdCaSf|0EW8Z;0r+_xCaIKCt5%9Y z&QvRUYweWRIdS`AU&z+W$4_^4XOMe&_crW2D~6oCv^Uq@yTyzr>rP#bqAXwU0C!H< zZ886pPMh>8$F)?<9&ZPe15E%`n_3BT>igl3{Vq=5GC+T2>cA6~KMf*eo}XzD_IjFP zVQ87O$B!35)n%eY!F#4D;SWt}l}tzE*Q$Pg{Z!HL z`Bm~+^CJL`7Qajcsl{liqqQV@Ldf_a7=lc9g0j5-@XMQhkEF5|k^kJh7t&`vQyj)W zH(LJl+W(dgl9}7{7YnV5;xV-cd;?WF@?Bi?8=Xc|oLR&0##`srWGZSBHS=H1b^x>b z?{U!qUoRq%W8a@1EgU_9aferjUA72#OUl}fPNF4}{bz^#;?e`RbAi@*b}?uFPE&-( z;PuS9^rgx^i=9rj#T`-;Ok!nb{LXg>IpcjB&xzUauW=eHo`w=2XeTSleN|hD`^?t z#3l-x->NK)wLF+sl8d!S^w>C@7!g;EaQ)$>V2}20k^)tnSi)*f@o-bIEokn4rzB(- zcHTNCEuq%I`d?G1HzG7!h$QK8)DG|OYp{DlP%V8t%$__27)K?p+YO)-s)p0XiN=eH zzBzp%>3g@{+-YhXjpq-7c`m9ee1%E*H6-6O4+{0jX39glgd?h~!HSq8w-=O50}z~1 zqNyPMR<7tfb5Ck{;LOZx8I#zWlJ+uFP%C^0H<*)7ul43Q;{B`l+FEq%dh}OK>aE$r zYdEi*D}?C;xuDYHx6Ww5bHaR)sC&pB-5~s+l5LE}j$Tv`>s;NdD4z^8B|I&NQxW{d zq|}P_Y!V#-U8qJjl}ynNMb!$Co{>u|_OfB$RNv%4$C0niCv2U^)n2lL`hpN4n)75` zB7UW@@L+$3$6n3EHoq>DcxrUBLkW?w1}b?=L{~XfxNpFwK;S)@i)y05YQIk z;7!>5ng5vU_Z{Y~Hz52|ytgezK9OUQ7{ypnJJ&ayfCuaRLF{mO*Q{U_^p+HEQD78C zzsI+nossW@?9*Fr3e-81NY&cJlzYo#M!rbbrgltT-ry(3*s@&@MXo_y zmKDgAwjAa11GGrmM01bb%)Hf?p1Gj^w1ih&6KAsG13~axK*8vPbFx+5vxQyiDxm5d zmkEK7~SS<%h7i|waJs=FlK~-23Eh>Wk!KfV6>q-X#vj}TS%OE z`GcANl6&E~nsV-7tA(?t_y$-@HQzrd=SsDZv z_oXoJRB|`GcUk2DdrcEHG4{g;Fe^{%8!p9^KmT{R(!dAKo`XA+lDD&s$vA zs+;`qt$~^QhC4sY7n2!O%3maGDV&DC=UJ6dIJ6qR9=2-0f5nO7&%v|Y&2`>Mb)7kC zojHl82af9rz2BB3*7NF|w$m64)7{0qZo8!~s4t|Ojq4rYGqydoN?e&AOf$;NBBG9p zzy4?~9lb&$K;OvG%o60)%z}XzKCd>}0NdexG8F9uT90|duLc`AJ6yGPu1*X{O0NX@K6RL`YL+U*ihTwR|W_7!Rg$mcjrL79Dfd^Z?55upxlQ* z$?oqCrzkb>I*6cIxYg3^O$9u%?_0_F^Bl*hs|T6Pu{7sNZ*_!4uKQOPrs@0{OuTEU zMVOj+ptcijV?6$7QgRB0A_2wu_#f2pPJt6rt7L%)(k?@ z8HZ$~l)|q9>tZnKGyrRV^$$g5ce!S8DQsA)Ur99zI;L-fv#0pq4=#0NN{ZcbM$ca2 z_K{K~)friGogcFdLK1R#O$eY_jOy0(=;;!<{J0Gk1jrmQlD6FK>Ogc-9G2=7^V?kN zswLys1K3&5EGdhv_ieaGaykD>vHr`)uYQC2V&dWIcNu8F)g7%KEY2UhmfqpHxNVs?8Qo!&nzdKh37)-7&vg8iaMyAe2tx+0!38J)O^o?_2x`={7usJ z?6$hHSuNlAExiWQDGWHN;!aegBrwfJauAs6+kt|C6VwbldeULP|Mi_&pz;#?aEN5{ z`$MzZo zr#SXtgE47Uvr3i^gAdTX;?`{z9juq5MGtm|s(<)J#NqFDnmvyiS@_?h{{Q^KtL-ABKA!W~!TwV!4BjVM*xdvX zdsq1RGpUN>K43|FXL9{}VI^ouyonj6wWr~ZxZ}OG&Y(`rTBlbgokQm!W$AEpx_82WeSKgM4tSE5ZnasZQ zg=?wz=mOLo3sN+DUK?zR&m_ff$I~ZnFy+Os=?!qY!WUSHBIge}EucWdoZj^hfrk38 zK=TO-G;}y?xy;|cY0+0@pzA&idSYQRqNgAgG zvf_gZ)#`gWvffi$={MsQ>QnmlrDpPlsWCt;VX__(>LE*=>WX8L>aSrwWBQXvu@nR6FNBy!8>lhKRIvqpnosdrA~rH zHK(>4Ty!O#Sy;E4R%SH4bwxGwqZUgmY$IA_qNUPN&fTi>{kx;uoN3N)JM*kPGh(ETt#KEr(t=NQ#=dAI(R{@brP2l!|0Fug+Y+u?rYgWOo;#u0Y2?isu}M zu+C2~Fzc~2robQ~x63(HF%T$fR7492&PBP^J}3ON;`FF-(tKZ(07_mvrP=4dO^vwQ zkx-MCeKqr+8a_f+RJ%`9y?s7nm`G=ULidnXQpGu1$g74GkLe3xJUkwju4jgEP7vL& z$|mZG60@;#sIuFWx7jB-Be`?%w4xLFppYD8OE6^S6aZH?5sWRy89>~y^;Vy2g zk1fpIioq0BwE3Azt=qcQTqSVa{uESmDe(f*QZ-L3czw()W97B0q(6??M*Y<1TUzMD zw>@^dyHz^$`?CfEI^eh!&7*HcFfl7%)5@AswrhD4O$5+Ay0S=7iWt3auAKW?<_miG zyf!;zSxXv|7_F6E736MLgx)8{RIPt_pL`jYXi4lFU-n9V|J;OVz%hYSrK`uF*WS`Q z)T~Ze(GWWxyaT_kmD$S8MT*WAOr`2Fd)jVn5_QVk&Ey6_c3uoVdUqn+w8-)5?w6Q} zu4p}Go9?K{aH*oZref1)wTK8g_cIOAl9aDWrEToFwzcinV3+(WuuHyz#VI>`WP$l} z-WmIzaPOmLvgvdUC3u?M+O9q{jBu^9##+v1Yntn#g=!c!6fHF0L%?_6rK{hH#z@ms z3aRCa^njr(cQ>H*WSwAUik@})Im~2KsAPg~eo5_nVI2<~)c{@+2(UM3N!O}-A4AWE zJ%cIszho(YeS5Wm;a5__Bn@Ish?|96`ai`QcPQ4F5Zijyz_8CWxPueQ{7wV+Qn=3D zi&kr~*-10C4bm){by#|6r#x=58zz_E(#V_de5$|{h0Fx@CCb-ESdwLMLAxF%Y>Henq&yS*>}J`kITM7Qr!! zkZ_Zvm^~|!%H857(356~AXKz}K<^-DFZnFTcSOdcJ+_~7$Tx95@3T0<54DMJJRSar z206Pb$djKeHE$;UcbO|Bc)l73C4k&7)wOOwgHa#MtwLyb)Np{GVE#?M+ds3I^Z z6*sz`G+o-dJBe}0Dst}4+Y{YVOPKCNJ}^2y@qbi4fGCu(Ub$EJ4^apPMWIufZOqTe z4%bHgK_^~5%HJo9=<_&SN?L6SHmKfu79hM=QZXC6IylYVvpfqt4xR5Z1(t#R28V2^ zH$rBM^y;SwMkM~HaRLn)C#GP(j1ws_=7`koApbOhij_+bOJXIsumrM<4Al{OiX@wk zOl02tu{8XpjZtbE`UWF4`jEu>%E9d;@8TI>W6qF_D0hAP9l?8ZcT8JJ@Tne)+u=|!^Gzza%k;|@u;f@H@;)6!s4vlax7Dl zVfeBQ0%QLR=IvPb{#_0~fO!Y-ZCV)_MoBGCyy7kjib#a9EH^RMG?h*?_#!O@b?QZQ z;W-^ybe8Ggc`CBTB0^Nl9nV_+$??$_WTZ;&0$>RzwK?E)I2CqqJ@@;c}pznkc?5tYiarKe?UXH=Rt;t*3f^26lF z+Iu!-dTs`s5WC)mGlp&c9XU-~5m6roNzq~obzG7_ccms6&ytC#$;59pW=IE&r)Zw9 z!q?u%-EYx0MbD~CXFI)AA~Dr8ova~&b`hN#q27Ei+M;V9TGJ-PO2y}g+Y!3IyZsBv zGe-Y#g!G}*=YM{?pw#DDj}$P830#t8T$r@767L{HUbkF}Ye8bAI&ilZdF^<1thO3C zf#HonS?Y?$%wIcsD=)gU!9d@%s3u`mh-@^^A*cwa#59M7I+WIS-J!C4LT}##l3)?}qezH{C&-_!(KI@M@`O)s9eeeLOqP6xzUA_vHkF@JvMu~0w zK?70&PURI5T@*fgswwHbVm7`h#|_NYy50P1^lF@ST9Uy|3qQa=aupq%>uA4kW+j59@l2tI7D5B3W|{6< zTG@=0k6WVSCB?zplXo@Pr1W_5Y5~6JFX=T{M-OSQ1$`n!F6Z@zhq>9YCxq<{0x`5u zLc(5cch`Y+sM%M;kcc?KXT|?}>Gk^~rr;Fwo5Q)8*XwvmiM#I@#{yp&7uJ*i0ON$`- zuKk|_GV2}5nU$g$wc(WJg2pRHA29m+bdQEtYpb$+Y63*GZp*CQd&RaG!Nzjs>SGC1Ec(t7O?S$Yjd z*7n%A9mWlhH@5 zA-}5h|M6xARr)1888p_4zjV~iu~0YZ<~QD)%q^jYe^I{$gLzSCmQ)w#H$ly859`?$ z(t;|YMKh(T(PK>&ECq^erBYFjweQWEl<3;j@+^NC2`9w3_BMOe3iX-P*NRvM@Y~xe3~@xj(MaaQUu;GaOS!qx|3|DEfMX{~yBMtd;Efw{V+s zz53{t(T3^umI+JQhlNo4)l%W1h}TEx0OUv}wERPxCje^mB$*T={;AFL0&4U8iqkRA z$Vx|RSw-$EYX&{mx_H0dN;2O70WS6SM`rU;0ROEf-44^KyGh>!T7=On8EB-r$0U!A zOS8#N3Ni&f*Yvj3IeX%M_O?NTX>X^#f8AP8Qm|j@lW6MF*i#;OV``TB%GT2c^D?>ub18OZDD3V0@mxNt3DMp&|Eglr$d;$ zf^iYAtKEpN3W^9dk&w+oJ7ng$%sSPqLM|r1uD@MOGFa)T-&YIH=b#>-{^B={f9L^v zUjvSq>Nm6T9InIYOR}efS&1Fy@4AwaisOyH6sFL^`V@AqkG8cUQI8A71tM3ZU7T$S ztv}?kF=cJfHY(Xq!Q3BAO8Id_)iwuc5pwdQkcy{(DYPaHwK6vl-51-IvOSh6Ioatp z@i4Q`D-Mj`qUC3={n}aIa(G?H&u#r;2LGYjc0ICr+c`DCOFjePi6*DIce#c}myV zvhz(zIVN-Y;hSB>56;;6M%)Vz^Zgv1wX9i0U(J#)n|vsep6zFOqKSJEwP{7gmU-<5 zdd`pHzEj(ePNx;L+i1int@rS$yHD~IZ!{`h(P_)5_6?#xy8nTox*9W?md4=S6#3K|{IqKh>hASir22n%1s?oA|FGF7?xfcO0&Y#r`Gd6L<#I{J{qMdKlPXZ?fG4 zaG5VPqg}Drn!y~}GLOY!`i6F5wD1#EJ_D_d*M{yhF5-^qmGzlQr&6UblNZv~GMmy| zaKJ~9-PT~Vytd_bT-C){XYvxJj5BUm+aEHFnZR#RfB8#!=z3N4&>8PgB&`+*#mgr( zOWR7QUObICpAPHM4n=&fV^Y7|+ zQOGAoz%~|*djLi7%O3bYzF0t-YgzH|pN0>ojsq)Q*F8;_wvth|Pj7^H2j@hv%2q9B zzH`TFok~chss$}U(QKF#%Uq}H2gNWtQJ;Z{w2;C?7N*Z-D+N(vVE$FmW)Oow8&$|`H~+b;GhY&*3{Lda@XDNYW?LnAs;Z~MnE&} zhR&FOC_}rTDXY5sIKkxim${W3^zTW9T_W|9AFy9va*RK#83zrGsUxlY+-HdN`@|RaP_skOV7!R6&u)KymVfD zZHMHi+SW-H%myZ4f#`COIW#{hTl;l_(?=|u&FLJAyB?3psYy#U2*4n!Tlk8@72WmB z@=^aU`oTs!ekLWV6No^=bAc!H*JMx$;UQYF^yQ=!rTwiuq*dw!{8@c0> zfex#H4_E*eH05LDiWa%GnQ1GKz zAb%|IiuMY5fje?J|NgH$B8#_L041%yyEZLW8^{jQE@yHDv3hI%4iriB5Ky;8;@G*5*?L`=r7)u(YO9Ay@(^G4hHAWsBx$NrwkA zXAZBeI7_aqyf;V_Y`|3q96j>Pa$ESk(*h^rUQrv%#ru<;MlZEZohr_(oOtiZ$ms?4 zdb!r+=SB~ry1~?d*`eDEfug{o+=}2o!a2B)Z_| zQ_?bsjvJBQ@i6xy-|gvJ$X;yAOooyvF{*U7;r*RN=!qm~ATw{O*PEO4@CXtnFX$9G zoAerrpDwnRPF|TlJW2k6>mQ`Xgu+8y;dGd6k0Z&FUW~FmjjWbGx#+)O%+BUn_QdbP z++a+3^yj7WSM<*)U6}*Y1qwEn4~)x0Ga_f18uW?{nbInPY&L!Q@<>d3et;#Zp>PTN z*BH+2hv+7-G&y(QR-%=?HV-MVyMS|c;11nG@n89@Rl?J%)Z(^wW+-$3m6Z{Jgq^AP z6|l{y9aMQ3Te+0aZqPK^`d68WIssH#IN|(;-)DTPZ={aw%cM@ZN|hmxfa~r2t579( zRP0*jnw2Eh>MGY&#ZMXey9*U(7&W~dzxL@r`g zrEMXQ^nHY3;Tv)8bN;VU=kXZuEa`>sr9mDMuX86JWvx=4#J?oEj*gxaad~KppT2`# zjd-$ZN3wf6^XISQtOi;cJ7K>J|G%l^+b@IDX~;FbS40IIRjW*vx# zTzf19bzGY>3dvT`DEHmkA$hcZd1Hv?f_Zs8)3{B z3$}QCi|zZ>#(kr8;unO^u~v&}AXw=iRwX4K*{N^=@)Y zZRe7f7VzaoVS^=SAL;bkZ2Iu+q&G@0XXf=kGGDkNb(cP|Kipv}PW*JC^)udkvOy+) zpsgR>8@qMk$gz7U*|})=OQ~^#r}Nb$^n$L()S)obm(z_&=f4o}H1Pu}81=4L;tQkr z7cd~Lz+~1$SG26Z)kJUPSGAYp}BIJq(d&ZLAC2d;y*Y8i4mtApu7an(40&GXpg?`@hg;U~OQ`6pQs40Y z|6&1vf}%i*!;S4DiBY4dw8=l>fV6;Cy*R<0gqhdiwOFF;Nx zD#hDU5*YeAfk|lOeYDBW2w`WT5ZFD)tPNFbDT0mPHR&6G&r=fe>gxX(X-|#02FP^A z+kjWqM~(#l!y^2EIyO_aKUdXBMsJn^jp1Z*?{M+!xZ@fG#ESk4E;}IKya{xR4Y(0D zKIw0_mDnSu5|P3zX$&DFv+xw5-L(zzYF-R zH-SM;j_E+cD?-PB*AqoP5dGX2@^~OCuQHafznYi^tS_8PcEz_BiMvV3J zl-=JN$9f$*rwl*{4P6k?3P5lIBUk$DD<@v7tSla_-0T?yc(a(Q;qSl~OR+g=T1?^K zMzi88rfj;GMr&+}wOc9ZHuCgR4Sn8D#hc3|7LGs$m%^7@a`8awokhk7@1l2}2xQUO z-ydA`xp)s~wHr;t{?P4txu^@kYL8gNtnWfLjQE|*rzYI^JTmG0c4fmRva&aje4N$x zNPL};YQ%=$^{fBZArb;DA!=)mxx&^^% zQ?h1|&w6XVOgW7JQ7 zu3U0f-ub!SW3bpmUudUMgCHC@z;M+Vc(y^oWzzKJf!W}FtyI;mtZ;HpFfjRymh~VSWjjNsqi55 zSJSh9rdgKxvYUsWEb^+!}4WMux_t{oF z0!I)z{g5wr4PqP|5DhWGVvhS>Q*p9xj^|$O1I*@40MjzsmzH##`05N?T|CdzvRB>q zAlx(hMrv@cZv&9Y#=YnU?k%$(aRLpn%ehccP4w@8f0aA1f#TuqdVX{sfHq!jjiwGO z$md0V*JaB~1Xyci=j3L5q& zL6?vGQ{~{vw~m>VKBAh6KslZTJrcdkTyv0j9ua~=+%nwl`-y$Qh5mkLL1LI72CxD% zGrc#X8cg3ir{v{0Xd2);4p<(wk*`O4jLPlvptk3Yr5diW?x9msE((dN#hDMK_N^C+OSluV!mbIkSg2ak|BrwRt ziTC)uY=T>xW$J!=l2_?lPv9vxOi8h-d z`*9<5IXk1BjA6k@^cfA&eRE=cEZ%6RE}9R{+~tJg89$c9FI!-G0T+I#1shblf7fmq zCde3^HKN#Ny9Ekz7Y*yc0 zi5T$O&Ihn|f4a_~Bf+h(W6Z%a|BNZ|MG1eAy%DEn)+b~fp3m=BugPG8)J?i z^M81G==u%u*-T!r_xKs`O;#j}q4LS{saBR9w_!zF5HS}5z9oOU{&`q=iyA!zq6>;} zHHGharZLB=M_H{~Ox!x`2S)}=LWbyE0DM4_{SQuF?fZi-yZ!9D z7R8Uf!6%j-bcb?>&&q|jpZ)Tq%ye@L{-w`mwtivCWmR-G2odnL>Iv9vLE6|FL|p97 zWe6bW)o{4x#t9RqlWn@xBw9&`cQd(L9I<5%fBJd%K3AX5ZtkCQ*%zI28MDWLOQI z^X6u<Ybcg-Bx$t_Ym>7&R5#cXxZ6VLvq$hnF$5On=&qB-38@znI zBU$c7Q~>-e0u`%`bIzJJj7c(`^!c+eXH~IAgT$tGg+&i%mK2l=8Q2`{8e3Q%gq#X!01jyl`M$u8W~ICkTzUE zCum=p_U|dx)Ag8r$%L5OYR1oNdGuJcQM)+r*6dK(vxA5t1F#L`eXOI*5^q}kof8ws zjqH<79oDStYr629pI70kf82fZ5s<;J^83XWcRCr0N=!J`EN@nBR+wlx#EnCs0{l@? ziQP7FR?~MZ#SF1i-`Gp-L>2B-48Q*xT(O(?t&}lLdMI0pAyBUTPkX1S@NPwpfhHU8L`@X%q$1q+fzm$519 z-V)wY!8l0=voXabsQU6GWdu+9kU_-Yf3YR07A?fF2eO>T;$waFJ#q9CK9=^2Q#!Vl zy-P(Qi{FOqTNbv14GM}ct?G~axZ1aqr!e;EQ4kN3Vqx1x)m3Tl#k~Q+ANEb^)h3D- zU&OZ()yP(BK4hr4o(U3Z`??suD6_YxA0k(<3v8}UBb&tl3YJ>QvmzF?n8M-O=J~Tj z-+gYh;b6~;wT-fRjpy5o14-WR;uO;2V>kVhJ4Lu{_`0b6tZ#bUh7vxdP3|0|)m&$2GmGTqy3iQZS`EtO>&Ajqu zv+bVs9lB{BvZZNEY+LDGbcx&ctHSzd+Ahl|)4TBmbeMH&y7H22Fmgr9JhhK9~F ziHGE>e&13lR0q9BsPl_EO{3QKcr@X(-CzsYPy=nsn%#JS)n~M5@~vc&TNd4~_B9z( z8`Enb>3N(gU<|xzXt0r;f!=A_4$`lg(DiT(x5>=Iw;m)+bHU$nk% zG;f)$M~U#RH0o2i0I!+~cqJL*Q9CW$El6sDC61j{ffvCnICbW_YnrxOv=J$9XWx{N zSsG4I_5V#OiL)5G8a-BD@%+aPpEoDGv}9=3sBID%L|&0%km3-!q0CmSzZv;a!*j?e20#l+udpd8o7nh`ZJB=KGzm4#wTYT* z8}FSd8*@BCq}X0KEe{LyV>$fDQ=FmNX-GPL>~Y(b*+I{Py#nQZz`#(W`KTBK>o9FB z7kFznv=o1%oYpSj0@}uJ`iEfv0qP8`fz@Ap9FexQI85WP7csbE?*x(Su>u22vFs+_ z8_u*V_PW0csr~z2CF?pr2|E^4q(8@fPi|HJLG^yOa_+8sm8V+Nmasj!^<7`(Fz1-r z^G%xMJOI(DyzZX8>_YAJa7fRHQqe+x_0-*^mdyg=#{*n-{H2sR)zD`zyb%`qfY8Py zC(BfPoiY|EsLpCvc)LfDc=#>o{_Uf zOFQ^cXhi30{Ly3g(6Ef>20;QoBadKty>ZaVj1AGJ=#Tf#7fG1j>_fTQZx8h^xSy5D z`jSK%j!~y|SSxELaOG4DeRSOX)?n8%^F(6r&m8GlCu|+#+{6|yNlpmBE1kNCs^npU z?e@waGAUd>0tu_e2S41-$!_j&vw?p81<+%-^y<;Wf0#Q7X+o0{uh*-U!!%0|NpGvJ z2Z>1y@^!SEy;JFtQ|O4o^mcfi_V!`o>(l4!^S5MQ7UcfUgWPHl6V_p`8?RXcA3)C9 z80C`d%#11FN={?RRpxTRuwF58_KHo5G^S0!&IY`ze4OVUYK2no|Hk6f_#YN0xPhA= z|FzMynL3fwb6`ezgfsDKB%wYV1Lku>gISWT{<^2Y4_vRk9ZK#iNastLUN7 zTAL1cFMIPdoqsU|q=AD^;yLFwvUm~=pqE;<0XYeXX@p~l| zX{fzz(fD~fO`@4}jP zNen%zSp!5!k%LP6b@PuGUF|=Lo7&`6ZqKf@h>%1-iJc5-06bdH>E{REuIB7{ZnPb3 zY0ES?h-;TeDqMK;{K2Uk$r8s7pZLS|TINvJ?dN<7Hlp)K6#cUc< z3k!o4sIj9S-MM~CE#%Eau$fL(Xav9?!Xrc>>+W=TE9?Dy;+U}l?%c~x`21JOJaLZ3`S0(0HUU%IK&BE8 zBBwbD{%Ub(V5qd7fBnzQTh32~iQ*w4`A@&-yg77;%EW}`;^~uz20G@J`sbdhATmz@ zQ{0_Tsj>kzCMB0z8nXh~Yv86U48HK&s*}G=apI!M^AXgj$DmH%ou^OO&DT}MCC_un zhMsu#W1@V_GwA9In&>52q3DYoO#w~CpfY@x8nKbMGeqvxtz3y9Ml+rDj zXXAii9myw7XWm3BF(ky~lU_TJeYHP%n};gRn@&3Y{u5;@sORDoLH0?QVg_Ar&z1+g zUrV8$uCpGgR+ohB+r6iW8NIi-G`_YlY&6~aTEr2{B`XKOxiN=M&M>QT zy`+OK3e`v>(1}a_S^O~K?v*=wcE@aJ`WUKm%VskPPU2vTetqHSOYID6)JstnSEys&3H2`X zV}!g8qS6$KCIIwcG-%zE+j+gI-C=x>Cr8bs>e=1A3OJVYN`m9TiPt2~v! z9W}g~l=rry%Qmp+j=vFI_(Q@V5RIYKSXSU~6!%;O?`;%xH*2A3b z+(#%t^Y*PZw`Uve+HGO=3H-<39`4UH&NN53WuJU~K@4q3PVWNu?EbzoMOl=FL{qL^ z5_`Jd+`G^J9#31EByqY{#)G$hNoJC-O4Iy)2x7y}(HgBQvuRqV8LH!UMkznKKyc&T zu0fL0w7>Rjgz3%$wa3Voi>$cG+iZ^cJZobIk(3U;)UnP!nTP4DOh*d&%KQLAjx|ck z_nIV4uvEovbQH$xMPB`p=cT(*LHPoypYP=ic~4D$^-oZ)=NiyQ&b$&nj+u!7+_1Cs za&2B;iA2Ry_gkLIv%Lg*1(;a3aQr9~M@_+oQ zZD{TSINhnB<8Zs{mb+gH$h5RHR4;2rYM*gG=kw^$+c@jsyVlPqr0yQ!IR8b!l-Kli zIcw_^00T_{K<>+n1u+4yq3tu$YwhwPqcN9bTECJ3D9pKuH!T^$-9X9`7vqc|XhJ5b zeJv=DOE!$5Q|xR>#^5%<9VP#SYl^G<%20$$17?%&@CNIn3(U@RnsU>1 zim(L!aW{L%n8JVju6pX=GFX|hp%Afe9yKY| z+MCi-L95_O6tmIczPt!Xk0+izmRactC5S?x88yHe`b-`Awd3+A1seO&b0j<-#8NCH zA8+hfukE$9DkV2qpx5sZ@``l%q-R2;hj~nI2#lly$rnWh#&=n#^H+X@Suc1~c&BSKyG`mmf z{GlTk^tD<}v-Lj6av3;s0iz&35mq&?&zBO9ImyV(yXV(x1U#>@^)%u%xP=?!UY3fL zjPu+r&AaAo_pfW{w|3+%v0c);tn~Rg*^2`je#K?2HwEOeATq7p85lUWl@&wSVlHI2 z3ckJ0A7P#0>IOQB^w>c#(~!BwVqJ9c&t$VqO|6&`W{weP!<%Z;n9V{QBTXliZ-cgC z;I@l9m^pL_e42lqbx~{K{1FzaNu6Z)XpCegTv{__#)5_s@c^QzwpkY1%k>h6|WPe`C-9PugoUeQ-$LS{Nm&j${aVR;WB0t89h6Iu} zdF}_R%ndFNmDbc?mTyyKc1b?gsy-H7|&ehd1hJ<(dxn@OD@=oLZAdHFKier&KuE=vI|7-n{G`1g` z4L6h|W;Z6nhttO{g^t}x1CmzS-vg*J?sos0~|Py5T$`LzXc1#l*;T#j79q`Bf4-)IpAF!Et0tD2L$DmU_srX|4= zA8*u=QMXoCCSsK3egn;2zo#ciN4=R%?OtvL96dp$jp4Y&z=JTOd?z9NR?`jy9tz7#*DR|(&iY`CW1P$Izo5%i0{3Iouj8=J8vR-(rxyv$%Cw9J&-lqL{Z0U-QEEkCpES~HuJqX zvgKtMaY~x69L3;m`C=HlF(;SgQy3 zd&9B_J{qB8?9y{fU=_S1i$D$Ke~TP%4yLVY3+(S!p>Cv+$CLNIVI^dThi@+nKd^*T z{iyr^R&1q0)ku6Xe3aQzdxD31a}L*eYSax#DVlo*s?Ad(bY_`;LQRaGKz+nKyzh^U z=!XJZv$|EWi*-XxDx>F*jcnCRtkm3rws8<#PqMbP6`P$xpvy%Ok6MOZHPiJ!>;NWB zL2a=dK)5q`5HhtSgnGXHQ~6G(iUX~Oea0|6_3IzS(FDkWVIp^`c^n-?j2V5Op+xP+5Iy!E z&g5x~g#An)s0>;R5wSZi!(rzTz554(AlYC4V}JzStjkbsa9Pv&)Ia7<;!y6iv5v^> zYLGa%GwNml@}@_^qxlyfi89XAZsK{JgVw3}mL*gA*shi)BmX(K6y02q zL}_$lgL0mWtputx#Tzx{v8{dJ-3)~z29WjY(qmS+9=?}Pii>Wf^sn_Z{x8G7(hfi1_Y!#1nJHpgds&z7!X8|P66reZUrQiPLU2#U}ym)2ZsFa`MvA? z*4le7_Fl)azyIez=b7ieuj@LmGomG2MoKrLO|35UU#KX~Rj}NmmYr@E=xGqeMr>`^ z69qxM5wyA&qa#Z=PaKwe5Lpq{Hp~?xXz}KGbCpcOvjWQpDSad6;S0(-F zOEGvVFjPOkt!c-|3+&q;1E0TVgaL0tBt-+u0OzPpL~kmRuIz+>pLnsc45G9}p{t** zmj=oUCWjlf9W6>I1q_v{ZGlPf&{VlzPD-d^SER0Vq4Xo{y_F9}TzZK?G`}*{)2Scu zbix%+aJ^^2VRpsG-MA5o5{Ma+wAW6mU=rOw3D8D>ls0(HvgAc%nH2u=EdL(8WGOhh zUo#kbFTg8n_uMEvekjLNE%?jrjYe{|S~ZZ<)AmaFwa5}$%2OP;hq^Gm!Y#p}c_}&e zLkwd~JFojitcYasD_sdn=0giW23+{P#fi`ni`m!yoW>a8yuZL5J`S-NSY!7tO_0Am zoECh#qaeN)duFETNVBTFU%-n>Y(2<#8-(_Z^KFdq%Xos6PY++okm0X@GQp7!{QAyy zPcuRDbOL(Iq&ELWU|OssdQb~iYpW&S7tolcJKA@?Hdgoss$0;sj_nY4SUa--kAL2# z>R?p)6P57kt}DKTpJXqjjLJ_W5WYh#;p>ybCXq>y{xJN(B6?=+GDEc$CG(nV>8_=R zsz}>L+ZeC1z=gVGCjGniz%?vr>{(|F?Ph-|f{K z68$0)o<*^DUDOe^+a8x%K-;C6zHAlvUrOvL7UIiT57=^_{g%aeNv~8Md9V(JtTP z;^grWyT&W`N}3DK!kFk*4Ld$EF-U%H??9-0vxw;I=N@aXD~QnyL<1&`qbnAm(6@n#l$A z0loTw9e30W940 zn+Xuz$+t}QgVVGXJmn;&adQ@9c&_Ib^pZee#l9^AR=l)DoM{VM74M2bLMX|DQxKbC zkb;V+|HQ^Fx-Xt%D5O)>H(%iZ__dAinFEKu=Fx&NTXYT(%EUT%zq)WLZH6PoXy1w+ zkwXF(d{rra09GD1h84KcuoN{=9%lb!Ja7%eP)lAOgx`=|)C~-4$B+VjvkDCSAb*a* z#sAaQsSzY`@ERO}PErwrGMzI0CY1HGCQ4hwELmFhCd89QSQgQ)nWx4T6@xN@H(rao zMmDJJtK;U)T?C$T&J*qc0#QxH?M|~lPNM1^9glpdu`~5B|Lo@Ml$NybDqqm)0dQ-N zwUmTh_UpC2r)&EC*Pjlh>;7&HWdHDCd|{InRo2DKf z97d9tzrVzpooa9OKCi6Hw1fTO@ka zV!uQmSm*19v#ujbt&fZ~k8^Ml-Rr>nqJq`(xNt|fi(5`X=KILPyD;E=p?)|W$`?lX z^_GOQ?ETyTb|p2kDIN4kH4y^Ia18C%?Of%(_fhzh%R9Eys-Sowch#=vCe5Zm{o+g^ z<7>s`Q|)MgtNSh=KFL}-2^isMqhe^*JYX*3!tU3oT0 zA>%#KT4gyOmM!EFLE^)7+;{i&{pi>BDy?Z`8u(pIgm2UL__)?;{C7l!*}@L3>)wr8 zV9#QXlRwEE@Y^TteAcI~I~#!e8QA!<>db=ID)rF;>d7abf0$)whx^*if!g(8_V`Gg z->NKH6??m0+c)s>&D|ne+k`4FOq#^|Da`KO*tTXwtP0la$%Jmvm^b_kS}}1wyr8sG z;2{iui~juUu)?tRG3Da@V9@t5zh0N2>)$PseMu7H_|>BSl@3v+7LQg zAIWuPTJaAFc|dV=TU}vfVj_VaPx@h5xw=VDGmPT73+~MFBf`H^h&=dqc|!1A`d*Ev zO&{C&0>ytZ6CcxaePq|ByIjDLNCHH)Iw_fY8BgoVm}3Th&E1B$Jgq+)#976AcUbo^ zF}J>Exj#2W;{(_J0=N56Z%T?c%xW2Pdx8Wz*V-GLmt4A5J%;bh+-rXl_!F?)AN|Bc zlJzm6CG4E;N9^E}q)*Xi2FzvlpPDcR!o~R-F85vz0!(jG#A_&mZ33hm3}g{eNU^=h z3**h(_-C*o%RH7f(g`XK^XX$sd@hO>@W&t^5?PwH=b~0lpZ~Uc`#vf8h45?o>$4`( z80OJ}H!Ql|-XVp_#+U`5#_64r7>Kk`r~9`KL0$ZZ;CwVnXwjzr9&aWTdD`l_PqI;+ zOvDkx*!H5c;b7!by6C*iFk&&;ZRD@2GST@t(T2>Aj3oKWI#r{_{|akeSZb$UoBjD; z@!9{ZHvqY%N56XJOM-tBOUmmbNXK1UdA^O3z!AO7sFV41u&&Iko0$qqH{X zI^~rwhWjluM_I5$ZCMoagF>VEA_qI-1_Q|0mEQPHgSW@+I{927+9o|?8rQ?(E(=bJ z#pr-QkWj&DO)fLHb0`y7a#o_GxLTg{-%HrDj9!Rd=a|l6)Zr=3drF;TKEe`A4$-ib>Touu3q6L=tB>zd3si?66mVXUCk!$b-Iu`}J7rukoGw zpon7-&qA+9NXuVxF-0D(Jy>rFhLwF&yG#EsatUf|&vjWbn9|;j8=@><8g%PEvE3eC zUjO}D2}8uJcy5?ln=C{`qrRAYIt1{nCq?!mfoovLvEOLOQ5nbdVL>7KTdeBmLK*s2 z5CKb?F!AH{Fu~2m`wuvtf5QYbZrq?dmTc{*lWCtf3m_Q9XgNHK^4WwygGQ>8fsPOd zY5aUT@xcEBRp+dzO}e z?1z`YI|Tb*5@CW^*;^DOPkzBOUz6%=d6|45^0K9qk@CzCcDF-xQ2&a7!Hs)70&z3} zv%2bFs_lY5ZWAYLf^ZRy$po6J?$7MGHM`kf=dmF+uk=dg^9z3m+kGg|p$T400|cuw z5nfpPLX@M$dM07a|HnZ~&*R$rWErVa10TT>LOb#eyQp4d(bD}Z(A%tiVxGmu{R;Hi z6KCQKbkm=noS~>&++>6x12}`()mhLosWClez;sSsu?v}q42Br(N*OR)KNas*HP&9~ zGDU9y>j(q#T0psH@QOz`SgCQ%j4-at;(v{vv)fV@7rs&bFu%ni^c|;f$R1yJM)N^f zZbP=6DS4jPu%9d(FNhBH!(O#(`xunUfuz(Gwe@PV;3ZY53{Fs*)fha#g#eqv((f3>Z3!tCdw(K@Jag6`B)6S;@)S#=H+7wPb3* zg6`)i>|!s`nBjho76q0@SV^4r=RDHqxmYtK59Tnqe^Y|+X}Ao(wc@1qEKL!qi{Hih zhR(!i)BIl0nPX`7u7~O&F91^pUICfKT||StO;znqQH&_1q_kpo{;u}{2KuaM#uJJS zi#wFcUmh_fGy~SkgWyZf4B24FbwhkK5^V8^;)iT9f z7)UWac!}cvtoOl)g3-@ErIVFoe>Ud+{@Twt$^(3SA@DUk98Erz+#a4QBm}Ys?CVLV z?0@q;{J!Nk?Se(e82G^Cq=9`p_}mZK{8hw5BsiL#rxIEF0< z$h9L_lwq=ioMh2S_=?(|D3<0S#r+M{-z@dUGLC_cQu9*^z~HEh+WCIW0oLsPuv1Ko z5z~aLSi`WE^XJ&iSTJw94t)mb@x(BCCO>XDL%}HwxH)piF#fHbVIJ$YcaWHOy+j^e za{oNssozL?WfBv_se93s)mWaiGe=|kQ2cxA+E)z0Yn)11SdKQnTvBu^aTBPa0g5sxt3-&C)e@(t;tdaLSsJ&XU0av*40 zTSC54A37-Q>()Qq5W(n;*y|M!GDynhKCk0OzfU}?KgHL1q;44;X<`3Y7{_D1{|qx| z2uI=#+jr8<3`hU6z-IfWwORB5t^Sx2dwD$4KLFCv7st$utE$rvo_-?gXQGov61%pZ z4^Yrx+=N*sd^Q4eqz z0!+!t2RPMr_eTzG^KvZtoEdyIvQtX3>vfo^!A>H&e@>g|Cm4>&yusy&&p_FJw+0M} zYpt<<^gjD3KF5o}n(9O}aJEU*7Vb zh_?}_SH{3Rn$i~oPjl|3pL9+9!65nI5& ze>JTQMdUiz1?!Uc*6^L&<(3orUj68Y;pb8KcjxPx=(Zu$aw0k?5!pHbf>uHjsp zepyX?5H?_Z5n&LZZH(1J37d5L+LwI>-J&28gC;0=7?bbi0F+4fUPR-bvVt#3dOZ28|Bzl(BtQQ9vZX|q_oXWA@w`(iZ>U#|qkT&ZzKD*(tL5i8iDTn$A zT>|t0T$^Gs`DhI@co>J$?)}AV%q}zq%GX+OLytl5=wPPRA=YDW7{jeVEeHo@b8{N# z5VZ45?gEo)*|U(H1=5fh^n`pte|FL-C-n;)DCS+EUxOX2bMt6xEZ+)!&}yA@zDUrX zV^(KL=^`6_GS7C6;qxz<2jzbpF(pF0l>~|5j0WyU3d|P$az2^xXZkCm*n4KIr3}Pc z(}ar#YsDv0rHE5wO80;7qE|O31^%^*j@EgQD0 zi3s{qLOF-;Ol38sA?>AD*Ae+AG6^aKQjxA>i<=gaa83g+EwHKN!D#z6 zy9sauwK$=-G#Rn`*|6WUJ)h8|*Tux<;%b#VpHscri4kAM zNxTAyva(Do*(I7P@66Y3?lm9^i5TXa*IM343XG4&=8gQ@~qqxlKYE5`f+$o?ePQL<|!eJ&>0 zOpQo%N0JWdC4wP53|iB-V;boVuz&VN%%A?6g8Lnk^TEFje#EFRn>GqkdC@HyCSoQ4 zg4H2-XLACe;LoP(a;8Uit%ds+7nPSMKpNBq@!oqHqYic2NH_ACUbKaqe{lmq5TBLXUD(k*rL7XPfby!CQj~74{#*_u4X%4q)~6apN6A+ob2zk z-2kfV{;+~Ofqgtiz)Jd8@RycoQhR`Tq#|eo*>)uW1Ik^(p1SYc?vvNvjO~Vzps!0S zWXW<#O)XcKM(gP}_CM#QO|MQkHyE8x5r(#&=To_)=S%3qG21EHv`N38lN)UU62`wj zAjmR|-VUi^riVbx^njh$apg%1025_n0QUtkZF(CKPMg&{?xp(U67{bgvJ2Lu3vOX_ z{WM>Ly3_bQD|gg%fDPS@8uU5ipCXHro+!#PvU}dxVgjRl3hVW14%HgIp82C)Rq*Jr zQvR;zrl|_2oiN}2NWzg{yFEc?^=B}2Z&1UEe)Yz^A{$Ew)!<6OTgHT81eP;+Za$QZ zH6Tcbsto_E=mmZ_K}+`_f5DnJyc+gscE^k0J7cpX@!k|d$VwSGPx_=1Za8%*t9d6$A5 z$HUGnfwJDYPbVLc_&9%pY$=CV+N6Il6JT3*?x@8p;+)U9@10-8RG!ptIx&RQ{iHiz zSJ?L=6hB^gu`0tUaWWF!v?LYthd$LqVP&vse;S`~jcIOsmyZoJ2Lf<_=M=aFty^wCq_f5{J2{FJr z{3(_8C#rvTMi6)S_14>}^eK!O_{hLsmgHgmmLFidpr8`qWBZ0N+b3oGrMMRGS22@K zxti{;Vlw%x&%3T|(nGC9PdiG}TdIjnf82N)qx3n~&QbglM5WHsb~gDBeh%=QqYXU& z12!xbr-eZD_~zr`-Q2KOuk`fvTJo>EWAM|@OALX&u$~*j+|uEdlinvF3M}pKtGQAP zGY{o0=Xs8iT>r!fsa}bCj#irR-O+Gt5Gj!rTmsMt%{F0; z&Ci&HBf!0H6oJHSL@BNP+`ab9M1(b9eYWKnV$;16L_Pi7H47VWIr03$F#pP%6(@P! zx3eY1-arjJgui~}7Ki>sK3N#zLZvr19@eW@q7FLTj#^EgJ4LDc`>ul^y!R*V#Alp? zXeYmQUx4L~wE%tRD~0^ErjK_A3)uhd1yKHH8`NZvUkbz-o81ZT?fcgrO5E!T;Q1+K zF{zoEF{Lc(7UxVO_`>*=Pp&Losy{hqGW<0Ll43jj2T#hJhn9XkXlmO_s5~&(eAuPq zmp1--FyDJ9QNDuBYVyvo8%}8BXxsFbY zi}#P<%@=#ie`llQ-lSgs&7t|5uXo~?sr|lJ3UrwI4~ac_!~^Jjd=`cm<&at8fmbqK zzQi!ZfZWL5c|;IL;|=cjxL@ic+N@dyXFWy)!f(;V-4Y~=dgR!W^K~U~>~^%4WkcqU z*y7vvJG9h}ZjU{49zV%LMz^!SQ!{jVwwM*>$EM0A)~r2iA9ib)f{@)u_i%losXgEw z^+1}bW1j_n+g;Ogs%FE6#)EZAOW44$Tr{D1SrFj`mn$N0*TQT3^OUf?-RKaXQ>#|a zs@UcB*GHYLlii)`t2_}TTaV?3!xeH~XLUrO2lf%yIA?Zh2;7N`(i--(Ac&Qz)=okN z?hz`n%`&L&GcHo^SR!YptweVR;KlezbXo*tP#+?oflX7byO!mHYWOP(m9KZ+nlSzf z)G}TaimB2L19zh!A@hVK8t+82=z!*7s`$ine{x| zPR3C)^G##76|Hw?=h|@Vsw7wdXB6~y@xO%Xm<|nM@Qa}X=*t2L*i`j1) zaO&~-j-`6G=J7Xz>BwbbnckrA9QC8}1@Vq3h_iE%Q{~Cad0a_d!JhD}Skwm~+-qUu z3y{1uU-nlenyfmXsLLq_3;uxhe#CVOnN1x}Yl&LxAtkA2%H=)<#EB(&Ku2KJ{RulK zovq)BCeo|rme&)#iAV5IW}UZ`w3WEIq5r4l!~->{_zwQQ>+;$t z;FV=o`VrTY=_D18-p}hkql&;GB%NsX8oB^R1$}=h*f=Wzx(33Yd-D?ThHK%&-@LOm zxf5zdOias<4(P)Q)O`2iLc>04m!<>UvUPYzIG>bLr`byl<5qyqXa;xefp>8;|=YPYv&^&*nPr|pqGeDLQTIU zx)_9u$4T5cPAg^BRuc!=lVc!{_s1ClVUyYz&dB5W!bZJ)@!J+|VK}m*U{o;S*0%fD zUie*PN6<<}F8BL=#54Fkjr1LBZ(@+U*NM!gsd>H6os z1&bL3LG5w&3KTX~&EO~6-+VvSyWAJ26;mCKdkOj2^husglwDbrCcaYQ2v)(JP=$WB zWID8FL7YH#OtKGhgT6^nYy9-CItoFSI@P!H&Br@;k|->{J~*P%jgo7*{15IMPhOAD z&k*O0TqlvnJ(^2TKw!w3PtPbAI@U6TPYhuYm`q&*^T@h!(t(1F;WH*N(WO?mqg=tf zl@AD&S*KFVvEG&ApL($5v2&%AvsALty@7~l-cEZGuLsc=3$}cdgoL6Z#5VKk1O`_ID7{y~HiBt>($l#N*w{w~rS`d*Ug>wBEA3$s3b$^E|{Vt3eKCnsWpBdY>BKDCG}I7u@V48<+}6|FoIib&yIJKziT0+c2+i58N~P>5bI+sNAimnehm0v`cltk z(4(S8_4q^a>NbEWz%ybGbd&e(kV@={ujOpA{8x0e_7C>M7Q?IKEhEy`fl3;6T1n1&?gr@H&SAb3M!JO;xA@6+=4~Iun|D>~njMa7Umu6>-03@># zK!1b@&6MNc5VN`L39*u*zT&GtvWa6S(KZ8#6~IEv|^sRXFA4KtbaVd`Ssi$c53+cY!EKPDtfKc zJ~Ft(lZUnSXO{6F{uk~}L&O;g#O@nLrF+`bsKrOB5+u~tOx(~qZ*RXlz5tc6W% zcWc~KNS8{S&Aq%?Y8I_>TDYjZ8{_-h>rWSatZ#}Y>4T|7quaO$bG~`_;pK&G;EvA< z-M6Qo#E!%3Hg5sjfR^kF8H-tfJW02=fT|yf8Ls)?zIVL(RD$H_HcKj8+RFN{FQV=H zGK-g$UQk(>OFfg?Us#*_u$ayT10r>Sw4X{se^upDKwd{JJEe5vHT#+VAjs5=JpXy zTU|mF>o9q zDMKqCscFYy&Kv0jwteWgX-SWu<<9^mhtg{LkIT8k6m^Lan0Pj0_uAMzV!@(k_^i~L zKh&R=dKEpq-KqxMkSfM0VMY@4(8if_Eircx|NBi=TJcZ7?X@h;hY7mHEKix{fmQ{7 zb@kAfIID)UQ%rH0ShN^oXhhpgH+3_|Iyzc(Ptlh^^49V!aHM&mI4^Qe3vhnAp=Gxa zRAIV@p`SHvA&eZXcq5B#hEK6v9JX&fykVj(o>?S{si9uOQD+xy(H7WG1B;MH>X+;BxFXoJU9$?)#li^gkVrNuNJj9nOO? zqCeDRC&H~Ik~5OewGq23Yh#-VW$C*5K~608&oWXDUmCjX=94|#@L0j1J_^=zncdAE zE%a*p?1bT%#xsiw+jy~&iiWo9swHiD1fXqV=%|0Tq&zPqW&L=lC^8nU+R5^vLBNnW zmayWHJ#qBn%P^5J$C)ZP*B_g56OI*k3#lCWc(OK^!IZsHW=M518za7$D6*~Gm&f-|gsjZWqKb7XmVBr%;!+|P}T1EJL8=CYGk1V-22 z5Jb9jJ(`a!xkKK;f%X2j$DXA zR?{~<)fb&d^PVQl8pCHw-r@VJz5cD$sQHgkAXasDaa&Hco^ei32wK_2Ck7ajL2 zYjV9m|6f&4|8=WQ!2s%%Y-CiDuz+Zyg=+hYpdQs@~a&YWEe;69cNPqhvn$2djM8aMB^k5vy|0%>plQnZA)3HUW^qs37A`kxxV9IbetV6|Z%Fj9;_Hu*;eV+! zh!g^L@SU_e%^Ff4oaewJcvhna29-^010WSeA??%QcMMO=I%r`0TMOZA5&~9RNvM}9 zyG$Q_HtGc}SlYV#g9&nkEW79nj!VLTK{J}STldtG%Nuc!c3lIqtpim`ZTz5eQ7Wm@ zbjZssm`{*RW@C7dW%{M0?6uxow3bvk5bv3sdy*@{OQbBggT|6GER~3ZYZ2)V{S9G- zEg$Tu$nK0Zi{^HR4bg}oWYG-5d%cYq5WAWmw;#CX#YXHi9%exflnE8o|e;Z3w zvL2L+e1lr+eBcx?L8M9WmUkip00s9pUJ=1En?6&Y&UjaM1?3M-`gqTl*bC~pL$G1o z|A?#%<-Yhu*ii_bUbVFUf{T0oGU};fLnWy{OT^(th#>#$oqc2&u#NupC`}7HqX4&a zN0{Us8YUF!?ksAM8;V2K!7&=AFsBv?H8a`WwIa{}+Syv&ZiV3T)eO@9M7yMkEb$lI%%8KrWZ+=jOBOkOCFJa4L-Z#9d{kNO8L~`wj^rBIq zwNCm2WE4O-MU^-spoN#VAGG+j+V7<~ZR(FdaIjA#~Vn*^=dS*Ys3qMkV9E40JB_dXs zVZaF-n|61mQr24!vQnrJaywdQbDc8I2yLK1Zq&NIt4BDqPP1MgM2pz|9FhNIPs<0% z&-u_nZyGn%%yJf=TA^Pii=8MB>ai6d6F$e0j_4}>$qkLyYmv-L%$y7Mk)5UHBy{R7sH4GIHDJ$%tFVhe8&R*;gMzyOWCgWkKY^9FeNW%7g^dr$5!TFez zSV5}N^ZPM&(QlQm7vUuONhAxwo|k7;JTQj8jzuIpEr=o#k24RF9s4>H>}{ui?e_0b z`JeR^9XrCO>~ilO=%&qI)fUJv=!AhQxpMT*Ct@dW$fDQ$H1eO3v6Qu)OH5St;DGo| z-7O7D+IC@;W;M457(41?GrixGjH4s$i3k0#iiGOC9*BA7&a*yP7_v7pBZ%deSnI)x zu=o4S$?pkENvr#;60gh0yNgYnJPBjA!w9p&3x`M&JM7Y1X*RJ22#M)M#}ccP2BJN$ zmAX&T-)8@?ie-T2pORz9xTeeDAgeAPY{o4zX{EI(YO4 zm4Lsevp4G$UMZRkkqG?U?t0C<_%3KvOS{HKu4>4?KgDfmcV#wl%$&IDxyS^7ry>(z zU#Jj?d`X-^7uBuzuASgrc(KyJ;G%2$3_0v^keKV_LfGg4j>uLQALr}PNHMWZWGvgq zJyvT!Xh>*`p7?UGURaf?rK+0viA&pHf<%y4na^?}w>S{H^#Fo(f^!0$$U&ID;|9=n zeqzRcp;z~`%iI-9ntr3I9;ZVgn32#I*V4g&OtOZI2P<2k4Jj$wt&2KlOd+FVAhg^% zL_WBsnIY#fT~pDxN0wR8Xu*P!hq6j|MCkma5<&A;91`i6!o*Mb|KW!jKP6Y>(7{a4 z2{ytXu7WFt?_9?OxmJ8qv%i8S;-4*vnP%{`Y58!6$*|rjq&?Vmxq6e`o!tEGZ_>3mrcf%?cKHi^yk z{#qL~Fzp;nD^+#KL&+5``kCl9D59T4%&^T;~$y31H_ce@Ny(*UOqm?MSnyXlF@*U${aA_l1Rc(VK!BcTfDbXKL zgH~&Wn?uH2eOEegs8^GBXsjj+JE#AH9-_49#&f0YgdD>Q)=2yjeAPwtB?eqX`!Qc; zN2JyUljH8fe0E>o2n^0i2!wm4@9;8EG4Akn&2UWR1r&yf+1r&d4Dx?yLAF!KF-zAX z1523Oj=0p8Kuqc*@yauO8GW)x1|*ln zg>z2HG6E`xv(L0t-6QHX1UkFj)dk7|%z(2qL!CVAE)pN~k_WfKv-|gUI za3g`%pmD?~Lh_&b!kR{S6^F<_N}3)-4f)=gt)DH568=PV)mwC(QJof$74(Ah8PBQx zy(lsYgRN1boW?4$#;UQgBVP~66YGudsgb{6LCA{Dee;ten~I}+Alh-WOTivGXpan; ztQY`qO`J2QuDXvVK)307nB;-z1SKwrfLegz<(r+e zVH@Pj(Xq~b^1fuDa$|4kDl)sfDtPHOTpLS)!hgE2VcFNNBCRYzD8vMiMZT#;bK3W- z`8XSdGP54Bw{m=39x+CT=DQ-*2xqc-)Qsm{RD^fo{6zbvr%Xh?{jfh|KMDfrxA9V? z+(2q_yg+E=qybs)v_$}jFqe#X!mnM3#xUD23%$s z5qi^grUXt4+qJMvdfneLpjI8PCnnB$N9qTK<1=S$uHff!R)pPe2B<6v4d42M`<=dw zp1;>M-eJN*{Kzns7kyTu=wH`Xy%!qv%f4YiLdtOg)TFBl6%2m(kI8jn3gs>-@ zlF^}wCQjLvR#MV(m`eP?{al%lP(r#%TjOz3Ss(tMyBZwbSO)gOpAM$0x{a%=HB{YZ z>AaqkbvWd@LZ?haZ=&y;N0{2zBtoby`h#iuD}97>9TFqIuG5QVMz>pFm&k%|#x~-{ zapkRj_a9RRBVfuP?>_nUwc%ACr1bB{(0X}UXp1E2L0z*D76Yn|P6Z0Jcp=LtsU^M< zQP2m3#asFJ=C#CkBuNe;y6!Q3SS^DV>KU&hL)q?bM)Vc)uP}c=4H#|&(7lcHEbRwz zlGPfnlvx zNsgK8$F)Wj9`0qWCy~K~;^~k)7xnfv;rY#k_YKf>L78VD(Ox`s_1Mm--glPWd(@z6 zqE%ndcaIpTy4D9gk6GJX_=0ytt-qxS#V!4xzJi1;i22uaJ$)Zmz1fNQG7uD!7vs!~sJ^+)K8#!jg>zH?k~g7vy-Y zqt-2WZgEU9Sq;vf3E#Vjuwrkq_@21gggc!(Wi0T3c_}y&C3E3Y88Oml`ms|Z-2ARX zy{dQ~_yN!iGVH^=&_7{#!*S3mAT`BMF_a$D0zvnG&-G3RX=aoY22(!@udMm%^b7M) zf}17jw0sR8Y^STtPjBIk<(%_T89(zZ-r*-Xap8cl2)uj}>p~mFqOys6D}5o?dD?l4 z);e zeg&@O0&d3tW)OpnA^CUk;}j%_wuckK z$li0e^meC|M(1;MO0IX^&sSLQx}gKv>SRpd{ur`qesGeadTsn zgx-9!weIe@<^DCFNat3x5J9nt7NpCZ+n9WHd7=wEUv94unP`@Ry;682lz^H_6V)F8 z5m|w&`l5nWFQ$Q+geHnOqX!h}?ygI143bK5vmFf=h>R#c4n*Sd@FqmnBRl`~= z2oO^L-Q!(_%VdpVZtC)%FsM$Hs5y_Cbh-vB1qK()Rsv8*bSE1w6Fob8|#P zI?|@QYS{Q8{7lKu#|Bx|4g&5AJhPFN{cX#Gq|~2z+g7u`N&BoY-MyG?+apWmm-RN| z5VP-x?ZHD!`L~oA1lpS%*6aNyDdIAkNh1?rCk5V)Ikr7iIF2!q36{uQtxA4GC}D@O z$F=J*Wvte>3GHhpnjEgjKp#-=^}$eO37X%k--SfP`*vDaoRzUdEU~GvTTnT!_K~LO z@jGOzRu{ZcJlQa=SsOi1LUN7-OeePzBb;^B_Z0^DX3!E#u6iQ7t0pi88O#L6Ya=4C z1J+4_*US)gYq?*?0y#LoJ=&jzJ~RV^dbk6AWn55n_wVX=OQ2?NEJm_L?Xf^UK6W;_ zKM>SfM@Gj#F4i~zZADgm@a^ZmuuInRX4czInx3V$M>gfaqsCFQjEJuBnHm}POX4Cn zbG|Ux+_x==Gel^}gcpoR)>sxtdraG3VavBgxgW z&UspPA&_?J{XO*7DRjOq-SfdIEa z=E|3)1M{*FeqIo-xa#2rT?4a!@HOq=XMp-k38o4;fXFhFLD;br$YND}h7+ZG^v`tu z@dglQ`L{Pfu1p?t!9jll0g?{&Fui+PNuRN;A#boR|Eyn%I~A1d-B?=7tvtr4)!A1? zHD)rUE0-1uqEBiM>;_|bFO601T)uBG(ZCl7d8zIgHE~1&FC|F8Yd|UXaWIs%1|;2^iV5_;BQ)9w>7&es zN48*+?qhQ2a#2C5Xt|tjh?uk*W0X&PKt|eQi|^rUY;Ec*{407KXr3vmkDRx!&r%3P zRWUfK;&2E?5Q2Lrs3yGp7U875+>W#1;3eMbjZnzVk|4;Cemp@SL%+gnjLe2DvWZPX z7$v19iY?JS9X4&e+OE5%TcLiq<9I*uzbbw=NYDw5-z|UC5SQVx5>*f=>xsZSXo6Zr zSx&#-!TRF1OG&2ex@~Y#9lw--aLcE&3^YY2vj?F{UYqx{VwS{|jK@klahxZ-kkiQ& zA0g%($}nXbY*5mSzggW_^l}5Wn6#w}7f`Zp4=1#5m|az()>$yKS5(uSc-d8NQxG<0 z_EI$4KF-4EKP8jy614NtsO*YZCZW>?l}+JK4TIMDglSa48ogtS5lG~=lt|E&w7$#g z_|DS#?E3>mwCG(8-xa4;7}-`q}xd{t{b=p0Ky4H^4F2iuKNRuP)R7rkmUUFtM5 zU7GgNZ#?qnWN%aANbBp3y&KIIiq~H&>x+Vn2#ZydY?-w&_A~5U%cyp!X87|L8y0Nw(r8*jG0wH#t_s<1<_%7=r6xsR}Pdho$LExA|?*f?JY0z00n1&H+1WIS@keo?quqY&(9 zut6y?6GqhEwAFdu`CoN{NdrOd-Ls{~`JO;2{CqH~#Cz(kQr<{`oAa>`SuM%32B!yNCil3$NQ@)tz zzR_bhmXr;CUMACLddhIuKEz_+Zu;boB?q;I);VR1MHkN<^av}!2BNk$`nXSl5IL&# z0ED_Io9^W*fIb}CZmUYeVcTRaB!5e5RnNhP*as+zOc~ikGwJ?^XA4a3xm;I+Wc~~o zCm06*`lWzdi|F&~?TjNuJNSv(#%fQ}N~VoVd*nq`dk1#}^E=c~VN6kMu2cfY_K*&a zX$EA%d%BEbWc4FDmj@+Ok*25WG;X*pD5DcFtDjMh>01)2C7gd~H$KyGsJpiUr@hpS zzd>tXQ(n*h`W9`X6b}EN9?4)U8R4Wi-@n$GUuXE?5*1m(maAtx+Mfxvj|o#=0Qgr5 z*At<5iJ%r_HgmyVZ&bLn>A|RZ@cLV*p6^C4cTO!ziYA>I+}-$MzWr*Dl!J(YGw4uG z3zT7Mbfo*%q8Be7V3m+!zi_1w_-B6jZh(6XV(;BsuAbe2^8A8!Og-y&63_?} zvxwex)P4LU_5W46Lgk80*N_FAf85Iw&V_|5;~sLZ;g^ zn}9vo9L=)3F6M}))V`8ME$1@;0Dd@~9}Vbk8S>iNnUup| zZ>Triw7y}Xj*W>fm;Gv7v9Sqcw5|2kc2gY>*B;yzTFFi79}bsk9I1{Pt{Iu+`QMC! z1exD&uB>2`|C+{2Ve%a6?T(F0mw z=z)9@X30kD>d>{%alXQ+`PlyP0kV#_hb|rLXpf|$&5ZVxsuPINwmW(QVtn$!y?%eT z=FxzY()OfyI(~Pc<-=3R3u_6tq{#SKBdvCcNU z(LiN7EejUa+d0?XtKy6-PPp<+DtULYd(UJuKFWgXrct7Z0|3qu@4L*hO>w7%>+PgL zoLCE2Q1`Swtr1mY9rvV7f2CIu;#(LIT7RjXSDu_mOuCYfEOQrcq`OlK=Ret{`7ec& zt}5ul0BMGn{C{2AU^*k!7ZG2_ko~TAwypXzNJHmTVgv7YEXvxs??@R0bc8N&w=xT- zcxFMjteC}FFqmSOmahX)E=QN|eP}uBf-*^LhGjQ;mUWt!of#^?Rsm;L&P~2cr?R2n zpgS(g6me#F7ptCqHlDC3V0_aZ`gWaD zn>b}oUUfUk_=65p#=pc86tElq?E#nq#!Z&-C=yDe)*a%8td_nNbdT*1%SWq@jK+rC zdJm8Z(wAE@(jN*F>efY1kVQ`qlK4Da5wBwS&^u70mKnXl_WYORI6cFi=Ugb8h ze(t&Fh5ED62VfQU60-`M$s@$OO<6_U?Vuj)KUjL_>5G3c&sN`$xcOTo$?YbaG1CEb zX)?a8uEVd`razj9fZ=XVOB|i|Hq2~nj9f4XP#O@Ey;9HiY%^0fY5HN^kLUm@nS^S7 zxhxZ9l^ZFrc;Ayl2Q$m_hhU7zH);mBlm&lzS~dZ){21WL!~^&>IUt%6`oP`YJs(4_ zjii$h->&X~*mhCql|8Ed4>9KdqU|liqJH0Y-=E2#NJvT}2m;dGA~2u`h)9=!Fp?5O zmr5fkB@!bbAT1pdN=pqrG|tdn(zWle|L6Ctz4o(xx7HgE<4`$GVJ>kU>DnY!ZbeW;0N4d z_aQ|9nkWHovC`SNMiX-tgD0)_PqEIS`Ls=|Z6B#mREJwG-Ql*jSBwkdbNQW#+Mdy$ zPq?u%ODQ4@ZuGm{^(D+iXRx}eTwF_f3~G3b3Ge@=TkQ7C-`rwrvK|0ak|oe1%B%t` zC*6rnwzl@Sgl%-hA?hR;nEEITLfU`O*_iz2Q`@<5VH&eQGpH(vBHpz2kiM`c`0t4? zPIW=sZT;7~jf}q~Gk>}bRiZGZpe5OV=rJIqxBk^#`Uuc2nPQzaa!a)rVemc>q@1%ea(!A`{k0~4JWUmuYNqaz_D9wHfF6hhC2Cwo4O858MZY0e#Y|wgI9`% zbxAgxFyekJp7E#>56!%aa&=->%7R#IQh!z-zF@(1G8^Rc3yd@m__LUnixap!E<7s~ z;C}P=d)JlN@a0FiNUf^!-<(WVlZf7tGubh&lZpuQw%6Hk$^(wDW`(0Tf>ilB(|u!4B$;ZbU?s zY%>1B{BCsOswMsR)%=eC;+ffCx|g%J@V~$H@5lOY<<`Y;`9vb?(9bE`JmeaBBT_&u ze6O*#^xgl*V)7w-PuhkzkH6t&s+8r)1Lb^1w|E}|eTl2Ct3J<;0G zGb(a8mO)}INr<|l9!c2xc>o2Feg$5YSl{^0*u~^}9{Mffx!_vT`IS3qS-DVFnbKynyha%X4kd!gjh5z3Vjt-jRa6M7}{?A|f4)9O5 zkOhzC0p1r`#?a0zlcqow*lq^Ug&W9Jk{^qHgiWY8$oBEUdk3tpqy(eGumPcW9}`8! zN-mNV@bT<+sMYh!NW;W&2`|*w3_%-~o{9CaJR*XxIu7M5Up)7Y-gho4yyuOP^++0~ zzEdZZS*C@}Xy8GkOF;NneBrF_uMVFjFV}3}r#5So7A|(RC@1 z#!iXS5UE}RVlR#lB51|<4IO{pu>|bKl~Rj<|D1~ibQkN3i0CRJYM(<}|HrTO{D0S| z_^tnCh!Veb74`Qpt4}wekN%S6w_%0nkRM7XnZnjZ&_PIHBr~WjB$d8CYnbs`hMZ1z z$bN|GXVW9c8w{(D=*;BBJ?7pU9d?%U$NwH-UL{RsKU7wyJ?tMKZu!)fP;Y=x+a92< zaiksalAg;hiW?IxU%7$4P-5730l8HshI7;@7)UTPd_H>NqCet@pTg;ogy?yB4>gNP zOTPglXTyBW-DcA7p#kBrjz!{C^R^lrEAMt5V-I|n*~Z9Jx3JDCJtF4_S>ySI$J=H% z!gP#<$Eg2TLUk)srXCL9a*m@?n8X=8SBsZUHx~4XuO>i=fZj{W#>;YEfxo?g<(^gB zgPvAS|IfP2z5jiG7bLNU1>i#$Q&t|f?%(waTJqrO>Qq>+_E(J>`1br4(jHWl&cGdX zVQ3;nPj2doCsiME%erW#*^*VZ6wF2h5H||%)_HwxGLjtVPZ${)DCMTlG37*=?os-E zfVt1ffdOaO3TRHuX7KEH8UPY&TZf|0AaZVRH&HGi13Y&iGb0iNw1dgUKcF(w zV-V5t806-oNj7+(lzt$Xgt;SAwhc<@ z=m&u=Nn2EdRlIJ1|Ju(cy%kah+@)C>YEtDomNssXnH!i(_pG}RqtN8jFu;J7LCJmf z#xtf^K!)ilGW_~^%VP{VpyCMh%O^xxET7#`$N!5`z zewLKA!8z(=mhDgo%n=fO4x;zCi|zD$jYm`E`{afXV>O5!yoo8+9EB3d{P9WqL3Ag| z2Lu!l{q(FIs^cQ?sV}N@A%{jWkw;6}*%0{k(7EntIWJqJekP3jGv)wvY` zn^w!AH~RE9VAZ1c0lp97!RkQ)9x9nH37BJ1Ij@Q0}mSnIyI%e8e|Y;qrK(@q>kWtAY%rh-F1*QWenQlu`uLZos<@GmVKmWKue&N=7R;wPRn2xl`d$H6gQ6?tl=I`_*Y;k_SrGAI3*dN26g`o~6pd&?-ew2m2w_$^(oW9|^UKx5LSh0FZQ+H+yCZT0JCEHW zgjXnoZ22xqL4irp#;OhbR^vdq8fsp^i*96r&mTI1Q ztZPt!L3PY7lt+dfF$v0qlGO@IuD$X#OMnK}6Td(~w1~F?@^(FZzGo+wWr^M&g7lsk zkKH+v_H{*i_ZKw~0tGOSMP@HDo&Ziv(c}M|49*KFuBv{1eu<23P_*(z%2~{Q-G+DK z0X0KO;3~$y2OCx2?hN*9$K){V$1;@L_f~Q^b+{l(1|8uIqIvY`fg2-E?Q)UV={jQPMX8BY4C63Z|?xqecZPe zIgcPw@ta$Ti2SWOMaumm-?(D&&;MotoN{s*RPow^wA@?Q4?9Wjxm{%pd`sDETfg}H z;m?hg6qzegShwkUsf!mmj9C(;y*0$S7?y87&#VLi3yTY9*1 zbZM7BR{}kt0UFPt7*K~@2Gw6BtEL!)o&su zy^Owr<6mM_+B9FLQZT3$rGHYLc^G2?wYyUoe-WZnKF#U;eV;m^QOYR+lojt#|;rs=vjY8LVMeA%-K z*YUDf>h#WEAt({TWoO|uQPn45!Sf>>L29#itTJ#rR>oB&Us)dmqhPk=D_uFh&KH9U zOSh@SzRc%$26ZdEtEI7^BQw>?>(*tn8+x*4UPy)0Dk?A|%|4_yX`0X#h!uh(3&voc z*X~?xiNxtQ2p8&?CU#DJn)fRR=--QV$oP1s*j;HE7W05D$nGgkcC#q4xDe7q1m6|_j0_ARgn|6*JV>^JS30N*pG06jRIQCw#^yiOX9 z7>*V}Ry`k7(n?mCS}fB%0op3zaqCh6pThT@GIF8~XL@ zIeBw0M~xuiIQ@%}Wy1{*ZSofwD{xB|q-Sh?{h&(6aMT;LEmXf|`zr5ktcZfUDd13VzK}>IPU72|d^6r|159KrUQQGq)G@&P}MDy(1RyNl7=pVx38nB9q5xxPbWyE;7w4Idukhoo6!) z=O0#*!5x;-x>I|_l2^v5&%|f&fL!W3*hbS>#^>|FcY96C3k?w{?)Ux9mdVJgY(ZaQ=>=c zabdB4l|^2YybQR1CX%J@!!T{tfC;-VaQSVd^Zjs7d_2+=O%1msd%;RrKv75|)*pk9 z(l}8SMU8AqX9qTtC}6|V4_E^mX%w)rp|7r?kxix%3_cvS&(4}9_DHRTo!s&^^)UDW z;~lW+I1-s;ovM<%6S`zF$+|X&+W0g+Tt05qVNbV^w?ar7D3iRqu&e3KFAZI)N+L;2 zh@P(N<8D#2O+RI*CMIOVJ|I54MFKYrGaX@jUZzS=F&}m@DO&6~sUp1{fz$94yL7nS z2RjaC5jvEeum~#XZIFM^>*#75sr!;o)UM5$G`0B!hClG2z}`v?4gqkN{6$a=PZFmx5$+Jc*;bb!0tYMcG^iiD z`y&^vgG8U%MW}vAWD#@Uo;C4531aXOB`wP6L^y*j9XB30+6-UV4WpEAx9DFQjm-eD z=q%R3iBW@$J{8P;Vr8mPS#Y*~d~9MZ6fv=Lx>}~nhR`!IJ*}TQObKm}jta@jsPjF; zQ8u(2KLPMgDRG{stG~*B9N#tmegLM~)bk014sUfFvux=1N%=0CGIYo9BR=wc-<(T5 z;3U<|qhra@NyiD5s z5#Cu?fp^lE!ge2=R%Z&mP4NM1J^qgI>hkX$f0@cMAHq7T%ki$4DVllGpZpp3{nHrx zpJ=f~Xz=BmLeDY$!Ru*E%SN<<+my6T)rU=fETVD9f0kfLS5j3pc|<@C;orDJ3rnFF zFVDig4L#_B{k#Rn=_|>k*{?M`^G7(S-%@Z3{1$ox3@S-;UfUpV;dcKz(i}?ENoy!Y zrpjfY>sHZKd<#2K!kWr$pzq+IYerb4Ee)UFbSWmm5uc0|QQ=rhZjEMC4=4O=XX>@U zYYmEB>8iG0n|V;CExdB^B8~ZtD>lPaiB6=g)hk)W} zW8Ddgp&l{mw$Vw(siW0_t=Dnv+bw_AaT zC%ds9zoDU1GyzMdOQx=()f)L|NZ|;QH&xhHPa)jpGfm?TgsqdfFb(hQab>CGHTahpm5!+GT3k%{%a}+mY}ETXn&%vUb0m`N;7n1hQ~xOltMQUI%Pj@8FCK z{FFg=6xEtCPsW_C5k}h|EK#MkhVwJqI+2_tA(U>b+!?L!p+8Sy*j~alYH&0}@JPn7 zEUDt7uT$J>_g}h1D9V_PLA-9&OX-2urRn5^69T*ism} zN4fqbxMx#Ey($ZbYJ3>5d2hQ^H21ccK%>JDtWuK&QT6riioMyEKx0A+_rk%iiFA9L zmWF^PP8nK58~BztcA;@?D40Q=z^Q;F==L^e-$QPUMh@p~C%1_J?BEb!M$ zI9<65O3cC>y`4#KP&AoISu{VxTZ)o8latUofY~6Pk&o5Zx0h1-y0H6tt2d`qfGFLD zUJHiycNn~kC|)~Jp1kOXWPgZz?dRf7f%1fk`xUc#OnJ_n0v26gAh=dVrQCX&6W^rVw`d3j zfjaz>5n*M04B`dnXwN}WTUKz;${4Ig%KG>Vgg|J`lxzTN%JB>W_^4ncoa0|)L&)<) z|0`*^bW5?Dk1HRy@3k@bdP$vvz?)R-h(W$;dL61s;-JN`>OMG)W)wzQY$d;xKNZT4 zUs@kqpSK~S2?sGe^W{5fMBZQWO8e@l`=$N&K`q~YbJX0u zcBpjt3ei%0e`aVdO!9LYCM>y39e8k?!Aqf6$~=ZlhIuR+z#@JQ$>QxUw9WZ=W*xqV z$?%Mw>W=j6XtdS>D@$l@2;4*^Qb3 zBVEbGtD9X0$y!^_v5g&evp+*M^xr47RGO2WYgM?_;5PYhGWT#ZOT*>&9+}LT#dd$Z z%+N2&y~W*h?x;j}O+Sd+*6<1bMa9-4A@~Ia+DC+Mx~ZKei7%kTqa%}o_!k1xM-Hlf z-W6dOy3y7q_u~s*K(SYFN6@<APZm%EHJP4qB2f)pc-`I6oA5q>Xy zfBpw<7N1LZT++seV_#9;cS~KXWc=@CSM9W5(WqH_b;k`C!d5ZG8>s1+N5~A8-WUBz z5Jx|yxkU4-md{vDf=;aSB9sa&1dIp$Llvi`sMC9xTA*Ewk2yh*c-73PH{VEV4pbBQ zGXaky=%bx+mA#2H8i+en$T|%K^XNmmGBkL#s%tnua+3xq&pb^n-Aui*m+Dgc0ACta zv`{vnns*Ers9_?E-We+LabA};n3p*}*>O6}E3C;yy4t#WR`kKpATTS}1w4}r(JieI zcHvNO$!0tPDd)z@V_3$tmSCtfo>Q6L3{JpO3H)j#loDdtE-~ufdJ8eTP(8kW`UiM* zwgE!;GvZG{`lV3;h^-p}8k(flYA99jE41LgJ&5nj0Xfj9)M-^|=6taFtH+T%?_D3b z&3D4VS7WuigF3G@s@W2_@11t338fFm%Ns{uJ)6LxxiVx7BX}>K`rSV>A51yN$WX3w z{%tnkHOZnFxPSI(pRy5Le(URef3YwvDh2zZvD-fZzwcK4{BXHLDHYbPafPhS$)Y=z zWTxziP@|@X!Iu0jbr@Q(pZo$fO-boN_HBv0CV^zlXcV@RKM3>4%($vRaH|E~POG~5 zu{@f}!D6c^M*%y+k29lF78EEh%ktS>{?1rAcfg$q&Wa`Gfex z#ZNW=(B*I4zWkO@h1PTH(g*HXu?jCeMC>(txZTy_31Yb2C%Y({N&ES2hneanNn%MV z57>*HU(e+{=6}48C!!@{WI@p1FWzF3Sa~xiYhmQ#nyQzi7U`h3XpxqLX}!f~r<=6X z_`_mWAz-^P{aYyvjVCKwO!dYHYL{BeFR9)tYN~mlM9V`ms=nLWf2(v{Al1GRe+Yzx z8chO)!7$SeLMRk3m(gs1?^4P>#Hm`TS_g>qmD+vi%J$?*Q3RQPzba~&{ ze2Jy{V?>f&jinGkT!lvbG>fx%ku66k#xl)T^RV*0Dhv(uMYZxC@fE>4LefA8Evm`_ z>dI%$>Lb0%=Cn!I=|AP|!jE5xuiFnM7NjdZHhb|56@n1A)X#PanoFpGjB&p|+)P!&8VXI9uHVv_jjd5|^;@5a6q`8<+bh}%M&E>Hp zR?TqiHqLC2mZqNDz-W{+ApG`$4s)Q?_Kcj4;^qwJKF-)8-OuVCQF;?@=HjEd+n@8z zE`7Xj8o_lZ;U9`G&DXuc^M9hlhi;H9CDIsjh$IQY&{0VWZu1vN^o?c_^c>DE^FKHk z8cR9_i0%=w6BQ_-C1)?C`K1k9OHnTsdFRmiar+|nN~yC-Wk@vTfJ<6!doRMDelU-+ zWQXbvWHwV43>=4oby;m%ta&46MoHo(a+{RaGT9RhU3Axv#HkZ2hY}%~{RAb-J-)mJWutDRV?kx9 z-L2$Vd*1Np0>0D(FrG*CJ_1KeiStw2+AMCYo}acvT~X2yh;LGQ51!`NbvLG5K$`Vc2&i*unG% z_=DCnJCa|nueLl}{2rigad6L9m^7iu6iKI8uc2Z{xY=mYi9#v#%-4vJj7Y05Zs{YN z3fRbW;!oJ$Q4%h-2A;*bE_@+jSI(hXiqdc2~!cBekle@{MaPmM!eTfPS-UX25mI zEbws71Wguh2$s3@`V!${%`DVSrMRaPmA>MrD3(s@cx~G*l(2fKyvW;D(Gx#HhCTHy zED7q8Kz%V#XLgeYzfx9n zyNFsEBi(zeAN6B={K-4;Mb^gxILCe_BjJs2zLLHm?L?slw7(=eM(-VfzRqJ%@I34r z74J?KE7et+Y_qlkM1R9*F%TkhksY z!*dK6jPHdfqR!c@jom6zcaj%AqrKOi)?Qf!&kFfMeKDvGS&A$2GWS^4Kz&Rf@bNJ| zfgopZKYdI;Muzgp3$CuBmO>96MX?@1~A z8a}AJ^5T=A~ZSinE5 z^j05s#k{(G1Na{dzFo&MaoffGF| zUM>aBiruJ!Dkz6l>nzJ8BgRU+T9~joSoL~}E={q>^%RmC_eF{{{o&RE)7hj;Uxj+t ztZU@LygI+rrG7iD3EVH22S3wqjFBj4U5ON#&6jnvt1}_Uo7JL&*VIM?eHk}4;}U1R z%H;O=4r(h5fgBP`T(3`F2ova8%soq2c;{F-!#Jyjyll%V`#yIMloA|DpEZf4@^**y zi*$9Arz!Mp)cb6U4bw>Z=t7oMA4yGuZ9FOD>O=T;^-GSPvn#<{x1Pi3NUzV9sV)+d zz7Vj$ol5bhmHk=tCfB}mzd|Bmfouu7dU`v)l3>M7cm76+4|(%KsNEDmC+SU*Hn&-U zI=%4ircU{QNn&Xn+9%tkR5b*7ePMJX;IgF*il;p#Ba22k2yrUrSrfgVv^k|W<=RkG z>2neHjJ+ySKnwoSODT(qaF`}9}n%gkj!Vd1Z}nh`Zy)QLMcRuA}9 z$c-IyaGmnq4{G+dq=}6gm)sYQ`@|(tpo4a}OK$w$%41Ipb>XAkOZy|}Za8pKZhF_K z0ooj`H{MKmFZ7(#RGz5X{AIlD0`pfKGkDx_o=F*vX}5zn=Y9uxzfm8>e(VV)iO52( ze8t*^HsM#2a*3e^%m}BQ7(q+~vzPjod@=TY{I!NyJG8x8i%dXd?t0H0?3E_1ma|LX ze&~&bI70Nu!LN3l9|LF4y^Mo0+@KX1Mypo;pa!>!^FwhCQ5zWfiwQFqZ<9vy265hN zSaoD@Fuac6#zA{kxDviCG(Yr1*AE-+s2(=fR$Jy?MZDL+3U9u;hF8^klplxarDYHb z!Fyo?U(;5Ff9`t2C4=~G@yvVfx^_JwyhR{=_IczofBbQr#&Iy_7S#_$F}Ig&E$=o> z#q0IL?(>k?2Q3W0?C;(NvAOzE!9DG=AM(+jmdz+Zbc%Ic3}G`Ue~pFKMwL<+BZnj; z2jcdiaQ|x;UqEcW0f?-jF3}l*q^co%OGy_i5e;F#A2p$?$}6fDcNO>Pk4cT?ZaCRSf)3xDT^cfeU4C(}>u?IRxLiuO z+O8&YxT7JMN{B*xv&;mkw zCo#nHA9`kIUSCjA??{aS?*Zv#gg(AuENVM8`!mFcR%u!k?G|tY!rFXc0+Kp=W>Z~} zZb+~`aR=mADa#_ebbMxLrj=$t$?aNZr^FlW=4xji#2b~`9tsVw5TcPOP?GqLl&xOb zB{no0nrGy-3Fj@a+?_Sgp;%%Uw-e(j1?1xUBn+=b# zXs)@u<_d5;*F6B|j%UEe(}i{S`}w?`!mjSClP#A@puYn`f`T@i<@vJ z{&EFM(=~1{{(C$)MOCg?p5JK1f_O)()H#XwDOeC#zlP@4fB0$yA#;z-S8=>6)jh|;^y+6#Z~v+n6k#(=ek$a%Rhn$YjR(oy1afo z1}}SZUyJ&gxmJAT8DOT%Kr7;-}yzt39TAB8xLJ3&&n3~oz&N!pP0a8Xg_ zqm#%=tP)~*NZYv1+;y2>n^Piqx;i3tNUPXvY4Zd`v(1TbcwoNi#py6%PU@#dZBGZY zK@>tkFrMIgbQX z_UEAIu1rv^;-22YtwwYtpwgDGZOqIa!k0I@5Z9!6wsb!a8Dpr{1n%qR_3bUh=WZ{= zKRa|%p5bhAf==h_7hI=r@w`a+YYxq+A0+AeuJ88OJoO=>nn=6!!1cx?Uu>aM=>wo_ z^!b?1-ViMl@t|S6W!V6UwcA^(9r$Bt36qQFv zeF>9nzb$FDV^0*QN<;@sp%7ViFou-gBOi2% zgb1k(PUu4$u#^<<2J+><*LSAMsVkd63nLAj z9}#=uWVDmPd5cy0!277FiR7k-KmW*Q2EP*Wg|r&j%6D!-5}Rs8IJGB0l+D-n$(CE% zNW92ij5koIT(sI-9hGw|14`Ms_)5M8n;+4`US3_Gz?FA!h74FL)-JdS>!P|`fJ&<@ zH^1k#8~!orJmL7vzIp~ zdj$B706v(C3mITw9F4N9Z!ZN{^Lda!IPP8w2{yra4PdsT&6ggKG*#6*RWfl2qWJClkVj01@8jl;At@i zsv70HFA#1Yh*Q)L67LGjBSe$!#Snpw8~)=Vji)b?sl}g!5vO7!Lj^*)RN1?oIsm9pvTza5l^qHnk?yrjX7TE#5T2cJsFdigYH6lF@L9RpvF*MsU{} zpXjxtAx&h{Io9ey$Yg@vh#eFh-Tve!stgW7?I9X4RQvBJ6u{(=gyA+fj9vx~!BVsZFtZV$wP2CR58 zutRr;^DXFiVtzw5zD1;=Tf&F6GqK~v#*c(DC!4>EBfamP0v0M_%BvBd?K6?ruS-j) z^I0Azf&|cSmNFx`yjeEwb9{s7CGJAyqIB}eaWmU?qIH$L;+oevWDF)UrbQ5m!YeVq z14U|?j6Kb&?a)^XA*E0Q`RFmttFDC2GcMV$YLGB^?Ws}CX5;nqy52N$mQ61i@J{w< zlbGULUT5scv>eFF1i7;^bpV}8FH}#^yYedrb@BqYi&4Yv@Aj;_Afwf2?5a#WKpFBO zoz!bQDZmN*7VvdCjUSUy8NSm%eo>KKRpTsZZkr#zX-uKi$0glDY4_BNFT;8BS_MbG zvo2=`B91XH>p&T{1Z8dF1p0tiFhhBDiOScUY3r=Bba(~L$m7xX?&--;7@6_+T+|`t zd+t*gF92u<%jLlwXI}v`Y-2zOim%VRrrvARJR!VB?Z?@~`|Sm(KTp3pR!M5GMSK7; zUWEF5TTIkp(X;136KU~xj}iHeHz%(iJE;5JXoxiKD;&U-B1wX$h2)No%ogR!J0e?P zk)(ud*A#b*(_q3Y_TpQ`g*wA!K~$$Vlhnn`gE-sx5z`rIp=@~R2Dt%hLYvX0Vdmkb zpYr(>+x1h`5lz`g2Je<<6sgp=Uq)K-E_m5lrQE=05H*bb%ii$Q~ za27Ru?*7uWS@0j;Jt3p2@1_i^!YzCl-8crjkTIfznU`*S4%J{G+Q6M|@J?029jgsJJ?tXXRHQIbj z$)W@onM7)|jWU4f+uxtrq}XHLr)!w%A7>2M0AGX>WE(w#m_fs-#g`Qn=a7IK2ibm| zs2rTjY9V5n$Jjt>e28{Ni%ZGbaAmzviuc|q{ypjt@3ot$Ie4;Xe>}gC;nro`HUZ8o zsff4u8;BPo1(o#1H-W++41Gn}W)WgpOIdagTU274u@j&e-WHPeu>o(M;n2;;;Sg|l z39tiH`i8_wN2ymT1W*#Lc5ka-TZPfjCT-4jVCcSZ@rHQ-BzpyRuwZ9H`VlBP4pZjd z-GfAx?F2{G$GvSs!|q0h9okukI|~c@W3Bt;!x9PkaLmz3CK*tfU_~-Yqh1cd`^!G> z$+r?APVhD*0(TvCsQj$9C^F~-ls%82SHKSC3tSQ9?^=0*Mgim7q5$JDp1TWtNTR2p zfKllqsiF6U8aF&yLv&mOzIM77BV;NG*cgtSl;2TCBmleX;eR^=X&c)C_F<9=Nr?i+TXi#q6o9an4de!hPDMc#%u|cu+nVv2_Ngo#a)tF zDftnh0mEzh#CWy568k{4ftZ&?@r;0r=uw9^=i*iSh1I5|$l~8Y_|R z@t>&D$et|CsH758ytHaPz?e&#ztN~kK6xjPQC-OJ)tpzWK&tu;Lc)jx@q@_ogUDrY z_rHuwUn^JL3bPy5M5Y#6pi?Ky;FXADs5(Z0x6Fj#D;5mOX$zNl|@d^&1FqmB%1;_$PV{B4bquU)3!SJ$LBZkhQgad9!(i z{S0?MCT^bFXy=4Bys)?Xl9v6(_Sxfv$^{_TIg+P@jFwE3&Pb9;%K5U!PAbj%@DO{rxP>-EQDJWCxvR zoNGI>41DAE(l+@k34zy4^rL=YXj_OBGnpM5t=j63G1vysEh6q-Q$#+pZ4Ok{TaGa! zM3a%9lc{nf58bfJ6`RnE6%sA9*B5GZ1(iozASLHea`Eh73E_g)gx=OG>|*0MmwWZW z6SwLE-Gun9d;vw!VKEW7J<^dWHp5R&7caMX5ot2_rrPZ=WJm#v30TH$;@|t;!o%Rg zT&*i|9{{=U!(lxWHnB86X=R8m2oqf;`p4-RQK%By12mr>5v9WE;m`aRRGREq#EJZ0 zS)~m$wN~mbc0H(sB~f;0rHzaa+88|>A4axOxn7rgDQPs=V+pm~Pj4MepPx=YP7lSH zctg)>#pw}?%heqdBZI2}@`zD0^V{zP zs_`!2*CMGN!fEp1-B<#l7mJO%V|ybN>Y~W+X3Yyy)G%jF{JuV-jnk z84B)3P5Nu-y-%?$;hbV`M!4nRzF3jDl5^)B!N?gXtwTzp;u+4npFLb%VWs1pt$Pak9ih&JA8k7_eGvxL5(& zgB3*H@WnSNQJ?hcqQHp?MQ(HVQH@IPjhG3rvl_kI1>-PkwC-|AoU?bGOf~WnZu$~R zx!O*dCm3?nNJX+hQ)%m02~6_o9DgghZ~Cq~p*km}mgps)V&s*YG_oG&2#>wYfc%c$ zdB}{y6vqyBF*M}95RBhPgBcnjvr}ldsF;m8JjnG+J^}EuY)jF};PaJ+vphZ9@}XSN zhABI06{+tNRP6zVjp8vdQQ(w42TIz9>r7_ZfUpZK4m3s_G%vE~Qh)fV_5$s1CQ5Hj zwWmA4=mSOFe(&ZrGdRP*#YA+MTT90|A~aCEk??>!8i9!==YHpgsQV z(xpp7L_V8-t;*E=L0zt(j#*goBXdPd?GxxS*!F`?W5mWE7ZM;K^*ze(UGXvASlv52 z!Zh@3XadG)K4?PqA_dTbXnr&XGNxtmt%*}|>BUYf9zN{?0JmL|%F|`-hFrIz3}#-L zjU(Oo1>jEOu3L95>f8uA$%M_%a6v}6@?kw|=igW2RMBPm_~^5VlGzBLptY+N%2bAh z{lQ=@61)M8MhO+Sbpj#9|4gy||K$+Ig2%Z*y2&?f*yU+|Li9KP#y0;Tb|Y3=6|x>y zT2uXeE4iHA_qHMf z6AO~(xoD3>#jTFagRwm?(j4RUf$Fk^n!#6+Y+^`_5Oup0LyRn~^d2X?I*~a)L-I=u zF2GAYjDopW*+XQWitOS; z=&c{*fAxaU>2^W`EpDZSMd>-aI4m3L16l%Q;SYijdgQ?vm%y!S3E{&3P@kbj;5=Wj znM&tXKCvqogy^6LV(>#1vsuZF+8sv&;*a1S->V?=?U%YTDj3b&ZoLHI#`SzpcL&I| z4WcW?LeWIbof1=95wvafyTdbx(}z5krQbKfQ6Oh4n|v?66h2M(|G*WiHC6a990$ zD~RYxX0l#W{Vv$W%O|K4()c0?@;)=t# z10X)aPiN?LF>I8Ce%+KgUaElE@d{krOctK{upu3OZvrZ}L?(fi+A@gFrM<|Hv0?#Z zfUH&dQ;(N+ShLh%vmoL$zyd0O_Gyf;F1DH|9U%_fQv-R%r^~D)-G+!1XDxBC>7Np3 z?IeCw+zm=Vfa#dEh9bObQDC1&D?^CP|GZr#d_Vp>CNqylp?XAT!pJ7qNQ-`)?oT(& z$q9}fizjUWg3gH^Zh=hZ8+eRVHXnC?v@T2p^`P-*XpkvnU)=~JJJz{T$@OmU2X6c5 z@lGv7*?!zNBvUspRAhOqx+P}QbmLIujqi1I<2PWmZax-9Nqv0iwZySi4}7Og-kW|5 zHWd8nMJWjFB;()dl$i&&@1GIeHfA%c1ZEd%u-h-+@U>${g{D=260D_3090Kya-f|# z5l9fWeg0_De4qR8g_zI%|L$g<+J8$J6DkBYFyd6o0BI_qKtcgZ=hp%@hZfo3l0Aw| z6m6so$7DqYxG(&QAxv63yrslJcZqhH=-C;p$CxkT^W_$)y9X;!IZrt@*c22K(U^ye zVbJc%CJ_uwaD=+|@ThU9)h{!Z;&6w#)J)Tr=QS`xD)1;1vb$_%*(P{h8pm`!W0k4i zp~3OHXdA^$vZ&W;Ku!b$TzplMy~|~kH}wPQyGXHXobq>&&jGykD}$mFm3RdDA$ZJ;8Y<5usM)MUeFjrb|rZtOh~^ zf-?@)Y6dP8#r0l^aB6@?U&ytLGj=SZz61@Lol{%qtJlqOy~9FOQNPVffyrqf_7 zl1m!6s`3gdr)sX@7Nb6n+mx#80zuHJxh~~iuWW2-GO#CbRld2y2X>zIx=RN=`v){o z$z4kc9G`beP9oh{O^B^I#fw24l+GC_rkGt-y#ZM!u%LY9Qw(QHm|vKXjdG=7Y|tGJ z+F#8(%8EAFFVQ`PNZxES2d~6WBSI6adp2t>ZdwZK=a~scdQ#y1Oz&dUQwJDOT2Skr zd=_E5fumIKde(Ik`15zM2eK? z?>QECcSDH-=qCqmMwxXNqj3^x=@WUq(VE;i@MZQ3H6JgaWa+newchdKXU3+Y99f( zj{DzWRmZB|l*D@e-kN8*3lVheMC#v@GMduxufrIfn*-FB|mU03cIgACut(k!Zzk-Ne~ZVKk(zNNY=*qb-AiXNi>4! zt0~Chn_}`Xd$w+WO2YM#-NZxf2jXlp3u5SpvNbA5Vffp@q;D4nyhUMAIl9?Xj1t)Z zVtUWD$fj$2MQkz?8jH$eJe(zLLCO%|tn|%sa`Njix)+mV{@oRO#PXCzg-LcP$j>)S zHP(Aa?Jn}xf`0u#kHp5rFh$Kg&^gMNz+@nLG9&wO;(L$7vxnNV5Ye<+U&t_5k+epl zKRjXm`>zUMCviodX3T9=?lKx=DZHbY!wi4_et*4x)G}c=GvtIkXOssET1z zTdxxE;^{fb5~*YNo)O*u!;W1?irp%)Mbt%BI?t;(n+*T!=iXS2eQQ zo;riNM5-HWwdWO{spRa?oMM}!%t78&Ao14 zGxS{j^F!?b?4IrA39P#%^Sa01+|oK*#Guni4(L5AoNs5yZjdfCi&6M*XZK-EZrcl} zi>Ba$_!Wa?6HBwWyCMU*eC{5{%JI!nOV6>Y8h-rQN&OZ@wU=Y`VH8cPPJd7|7^KZ% z{9#vsqi8rb#@&oACFXQY@iDu&#Bqpa>-i9UOH^f9TvD+$6ILg{Pl!IgRy^M(TwK)i ztHQwzf$4kS`@(yheo#Lk9A+X&IPN?eX?Ea_&UMzH(v;~EKiDo-L)@;ARCf0n%8qYu z&kc#J3$LceFtcE8Qwo(UifN*PIi5q4gkMt0waljJke!vdqzB79|zMK0`AB|(Q>uX4VVGYHiiqAc#gPAVL1uvSyUHr|4sbXS{Xphs2EGRSTj+~nJM8yms4_j!?)niT$W#2c z{w|ah(gR76PF=MbLKlS^cUFUsG!`$VZOV}xByIAO9Dc>3Lcg&`~DDyg-<*>c~YPCXZP-YiJPtaahv(?N= zkyP_qO=?Yp4nBmb4pv0U6_>ZRi(8L$=$7;~rL6GYPS)NXRaANAX76I6el*JbLrton zRBM_H+t zG?y3OOSrC2{Qg1Y!%OG=yRUPexX|kInEXE_fSDQT12Xt0Qn1{sNy}*e#zeTl+)Dtwph;<_(>f%u z!nx%3V&30Bo;XOfXli=Q!wgia@?Zw)xE4P1=AhepL3p8t^KLBj_A+-?6`IwD#5PH^ z*WgG~zSMw$iM;3FBdUAksHiOoTp`3IHF zjC1wCVR)9uLT7V};t}B-yDZuL?WG6EE$V9C;SRSsPQ?~1GutNM#;$7f)Vi38|`h>1_mIQrYa&|FfN2Xex`Kb8O95T+OU{M%oLGqs*Tw;JbSxM6F8CbJ|@u$iQR zL@2DqUPR$$YhY7|;L$I?64s|w$1VHKL7{lm^HHK(vZI%X$ke5W*s}7APMUM=#H<=b zvj!1{VuF;BagrmsMb0PYTq$un@|Z8R)N$HEonG5~9q9VP0C_WVx<`~>u3HK(TL|Xm zxS6)&6NibL=_)dE#Mk9ASPV%0)2ectf_;a3>)s&`Up`4ua#!(aXU#IFme1ThGiTwJ z=Dp;Gu((Kdy43%NwJ(o{`fb}TDT)kHC`(dNWJzQgqarG0$-a&yONOjdmNAO#g9=%) zRI0JBA+oPoG6`cVvW#KIzB88hntu2FKF{a9dEe)c_w(@&P22bSUgvq7=XspRp_?Mx z-6OX=IR|5XPGWNTOWgrC_^KUkcsaSyDy~7JikATZ^3(4i(@#LDii*kwO9l^}oh2Nr zwpJbjYOn@KF8W@88{Ye-w!NT@&Eq@LEDG%Vesyn?Y!Y28T-&GemYXi@#HBmp-hHh< z0kTN|K8Ay$^_Axt!S2Ih;m4PH7}w&>a-0x&mRa!7{eOlu9^MZ+Ktkq81V*eB-OL=U zeV;tdpmx`Yzd;kqrv5oE?ym-^bS3&t};hl*R|2eu?O5 zEZ1@u>*jnEsx6kJx*egy`z7_>JwNCNF^*#r<^sJunw$sX^{>9_r+dm3je0bm@viK; zg^d>GeEmbnVgVePfoRN6sp`(z(0I<2{%@2p;A^~+R318m!{!4w$X0R!Nqkxq%^6XWt^q15O z|9d=Er5ek9#sqz4N*7RHYZLH{j;#nyWudaE(7ZYua6U%15b3!vAvMSED0SCKIRmSz z9OG1i)rDDGo+!=FocHNc6HVxAO4WmH%-jZDIQ}71k1_8^i@(`!ME* zL$CDI-A-(;O;fPu>+VUDosLQQ)i1=Ke+!B`1mT7p*e<}_U5qE%Dht3gBx%~3OFZBm z@n%V92NT8r+%~1LlbmRnp|Z5QQginYfL7!w@bDu~efD`1cSr;@jpEq%{W@{vzXa88 zZZt%Oo7eR`FxzP1+8krmit})}-l|Y9VVfH*yY@aq<8HkCCsfV_@8;|ZtlTN64x*UM z=5H5~%`?V<&|UxBo(3W<8QpdqADn``rlV@B8*$m@_Jg1u-S;ddM-PibJ{}nUYm-^; z{498%CNtcDqvKY&K*4sNO$2_?Et|sJpDNugq)xIqdQML|zgc8EdqnzJq@5X|Mukm< zsDE_&`~IYD)e!mL`i+!YXgSL_IZo!c88vB4%u>|jz?2eBtj%5NFOv*C{)P25+qB_j z>Jxbv`w8Z!9~UpTXs9pbsRJa(Rz;|5L)Pb2Eyb2Lt1-j7ZFMjX-A(5qJ6Ornuhr^%pm=H(FD^f>VC%WHNE@c#Q3Got?IW6Vow(cuSnXT(e!ypO2w`3 zGiW~HS$G~n0_HaD(q!YEudsc2GvYT=r!tos?x#_2>)-)Q9;IppKeAwyk!@;KWbNE6 zJRd#(x>`Y6dyZTNKKMn{hEY?{J;!caUad#d4R}nqCN}3l6(P7T*Dba*T9q1|g63s9 z2$-MGm7FDb1N{YwH~)x;-;!}j^bb2xY6uT+>GUvjP0LYv_AL!a6Q{I`ypfGAq`5p= z6!L3Lz3O|lbMdM-6e4+SJ=o&t1;=*3f*{mLz`M=qQM&PLm%0@S<~2(N%ig)6aMc;>_hWf!4zLn5PdKE zI!9wrUPS0>h{gxYM%QqK`WU!_GF+wm6=E5vm&I<@3nl{fvSl@3Icu%VMl^pQZdKYI z|5*dMb_b~YZRn)rYn@!Yl2f9<@GU=7?Ale0AVG1?OjP4f!cje*)7Ly~M1ge^d|`hU z!O;I~mPrEBgYF)as{v>_gVJEO>)iY|%0~?J?~d}3k>aV(W$p7LU!r@h&9Z~!N#>#y zw|o6fC%N(~Z6?k>`QOMrS&967*Ca+85TBwUJ*P)S;$3^y&!d6h)fqkHh!BbxFJMh} zV)CK!g-!0FjBHp^*xNs?y|*BcvTBZ7ckzt`bK*b$QhPMQZO9p^Q>v>0Rc*Ph{=BST z$%m#yChVp{mV8aJ&e^cAF7w-AtoQ-^@Jf6Kl=IpHr`|c+`Wn&Cqj$s&)%n!8%Qe^9F3+C*(L18?%JTHX` zzD9l5P1#HvZ+YicFPQOhquwI(tF%jh*zYfjCZ0aiTtWaiTXCwqL7_o|R|?E3X1Jr( zAM7#bc~%LGLa^ko#xqPZyTbtNH9Xr~mE`h2JBo8K`M?3C9qx;j7X^9LIatydzd2vE zMw*V9Plvo{n}1$^_%OEs!+bE%GhXX$lAA9`Pu*P8Wml9u6Kt=zd4H3!v|duzhcF-0 z^Iqyg3R&uyh(H7vQIl_4{}O-%>)-sp8yX^iMOM+uzMD{YbJKmE`5$?r>y$)K*jW$) zP^M{#YaAMU*-;E{^3O7ezmBe&f? z?N+WQa&U9=n`pQgwxZ^hhXY4cuhdSXWkCVU=#YmF9>2msQ z=Jzi*65|ax6s4s(Q>0A{KdbPdWJT6btpl$A`l+rB8oX~|crSD$aKot7=+ zw2rX9*KHB!yU|YUjUMn!>U(zJIf<&& zF#JHdVUgzOXq2OH%xzw?F3SxzjJ@+G?F_4YzS<0KJfqpj(Epe9R^0dow!Yxg#u#U8 z4EohV`AF+AHC_-sOv=<(w3Q^+`h;?vO3$aP6(*>zy;!^-I&q29s>9I$2VYY7cmV?gT}dFE<4C?fTEoR`_(`prHOr9p7^2~FEyKA$ z1Nu`IgWrIoqoU;4+2pb@%ZN1iV?+K^z_Cyw0}}_0BAM z;iXqNxv;E$eYqy}c8cpd2vkTXR40;aML1})<+z%s>GpzLdM-NDR=Fji0JWGN5ZMbL zHAOZr;tXptuCat=oEX1jMeh|19?#z@dACs|=oJ01rNN<;-_D3VeU2LU(`x(uI=H*n zJ>bIT23!DA|I5-*kY?#P|1MZIiCk&2VW9K}b4-J|HZhSgm0;bPE4MZr^?Etv`e)qB zvqw{OY_&1tV-N08mP zorfny%7q@5YMLmEqhyWwZDP$wdlE*7LV=0>N=Li(6--ktdzh_US(C+UEhOnGXr7K{ z?ax!gJ~UbU9o4;l+Kk(VlkORw05LsJ(nb86_68Z>?SM9@hwkrPJ}`Bnt# zgG(|t+H_O6hz+W6Wolk4_(pq~D1wiK2nemCY?8u?B5npzJgoAc)j4Zk`*HKKs{1WV zO#i|Zu+MPBl;7%LU|z;XeJjFQv)1uh{0c6TWEJ z67QCsutbRwbW`NU>YL=YFY{A%5JmAy9?4}M^CO=B-*I&pw|`pc2f&-FrmK~r(`TQ# zn0Pn10@y{|Xp4qmgfJsoE=o5C&qkm&dr#K2)$##XN7o1UmizPxO~BO=vD~bclU}(X zsVZw_NON^WXEg8#u)JZ@g}b__ciV;|3FU3L3hOP#Y4uw&dIAhV9R}l_7O4Hi1hIYm zlzrl_B;Ay+9ypa}5E~6WMWK}SMrIqV$M}P7rF*COs>Vavpz%KS6R<9Ed}z4FeCWBz zD{Z3n_DNp13{y(UN`ZPw(zSe87W^V3aCQ8jpy~ftYuK-vdQxHEvX~Dq~ z*i~7&d$`?o45ZR53sQ$@Ap5 z*m@A8i&O;=|9JZ5sK(|g{m zY7d&#^*?p1=i|4|s=~a^8Gx z``)?{sxKB^FLG68{jaH`cgV|cxHwnS(%@lqMqQ$GgMB?t!KlYfMcF&H?RA^=6Y2YD z`tO;97bpL$4 zj$5wi5`YN4PXw(hX@_Vojti>YH5!RzDIA*>)p`9Nw1515lt)T~_gUYx}6TM5p98y+fuvTM7e z&0~+`vJ0puYPi7WL!NBd_0Gu`=>s}+0F)Z6s-wMlZt&cWE=#zFuBvBr7?d<3ngK*( zp1(Bth*(Cc6F4|+PBchlL@a2ANey%Elw?IBpfR!eeanGg6$EMwZeGRF_Ys50QE@Hj633VFeuI3uP z_O}2tO1ALYM1VEL=1d-BkisM|F8C_jpB3~FMCgA5y*(rJRa#LtH1j2Q&qbmN+DK;5 zs(+R{wbbEA&bj9#V^DY;iR4)L_^lS}EZ@+!$q55|BGk3`%QEbIQ3~La=zif7@vz-+7Q(xyc(Tr`&Yv zl+46ao~+N!ks7H4u5)Evx zvsVK4D&Eb1v4T=8oYpJ*qT-RvyYCmn+k7sn!@zhaW55C!eYS3f0;ueD2f1wnqy{Q1Mjv!-fb{BkVSI<^?^GlBA>NsK> zaV0`d5JT)LA|Cy{8Khisj3pIK7Xp<@B|M-sHr(Gj@8WW1*%GPF{50l0nofCnUR(R> zO1>p+VI~d=!{$sOU-p@h<;9$5jG{D{|!;dj~@9P$8H5u{F zmxuGufX>f){VMtjx_2ZuwCO_C_}q1^wPfsCgJ45r&^HbBbzKpLdSBTnbU{c=o{Epl z?RagqWnF(QN#go^p{h%7eX}axchrotwZI|Av7KY8aM?oa{qb9dz9G199DU+t`wV(Ea`?Mp?s3 zpgY$v9x$Sq@zKCO?L_fHtLlGk>M#nt2?DN;I{)Ja$6vH_gNAml_DnJD^^gGCxkL+M zCp2u0{jRYlBaRdJl>}gdXUMg~9QrzE?bZ^q>Lvl0;L&V&2$2M~jw;0H@DzjbF%Cny zwyB<5So>i?J-Dl-AU4b8M6~ocqjZZD*$ZKskNN$h08V8i z3m@|S{^J=P;^((t2g|A3B+@ z1IurQKr1aUcs++;7rTJgqF0oGI{;h9hCtsVx!Rle(ZYU^0M3h+g@jt&NOoHe{u|8H zdbWl}252$9(5nlPjU(~C3K-K3Q9D|CHvt!wkHUwoi$a^VdBs1?6-v{Itxddo(CP~^sxmQO>FNEoON`I+Rd3f97> zt=#!X8T8lHa6GWEglV_Qmt_1<@^wwSn7hX(-%3;bCYON)e}ZW z*x0D^t<*~h=#j*Q_q{><*S^S(-#3-TMEis<9}IR?xfP)Wb0cc=TDJPEp|nHvd4KP- z)M`)L7}Mb+Li7QAxEP^@`mFA}ep*7m+?9z_4h8{0Wv$kO?U*glMWUgA%JZ zRN(6G$axX{IK#9^jph7SSg7p>(2Q@ZnE+W+HrfsFR0x_|XHFx%36nkNkY0_WQe z%g^i5Bff`YEbB*~w=w%_!&fetmDX!nM;xoee6MS}!E?s!!t!wZML-yo~>I2MU8O4I2@nTfjV7iYe1a)4`QO$^ySI48bSIAOXv%+yVoXafy>alURQN& z*~L+Pvle?rnZM4Cd3~)3k7T8F6x#&W=c2Sx98LG$iDA}*mE7y%GAq$toE?Uw(~&ts zZ5v1H@bGRN%SFYq87a7fP`c=B@LwqS|5j$~T+aA^-LjqVhcHc4`)L@S zg=3q;3n83%?@P+L4({#qZptR=Uy?_>LkF7S9EzS}5UJT%h++$m1;j*Cr6C$lXxYf% zokSpC0^Edy$m+${=EOwaZ z#Pe++w0fTIDto}12u9fLIaf3kIcGMUlF{iF=b7Rvtny2X*ma8sY9N&REoChPEGpNg zxgAr(lIuib#M?HwWAu?N&E@$K?ai2JZAWx)dppK5Vcxe$RdVc-BhhBc=$5SBuz7gU zxm*?z<5ZS*J_j~TUE5VAXLrFR=e)od{wS0-VY>hhW@Tz0?0<8pbVCYRD$!Hg>XxmA z(LjU3J_MVUu+}>em+7K#!}XG@mbQ1a_Ohp}&MAJ%l%bS6;0rzT`$(eorcd1hx;BIE zG`AFy-15snjt2Fx#_!-HO?tPPCM11DRyM8}tO$PwG!+~W&J$6X57C&qX8|JF?g6a& zvhv@-{&6?jV1JH7?B8~4|Ea2+2cr%47tpJGDYm&lA9Q&Ane4euP5SNg<#(0g4*zn5 z(f5@nm zO|Oq$&qwJISkbl5w!rpwA}ZY4;Y;B+oM)5Z;l_(5d18L(zn+lcACqs@_6E1tG>{MN zKY^ifvn&W!`RPn+U7bKsNyjHC%tQGqhcObHRT!9^2uvY=m9hxddg`Y5bSVcg*aB0? z6oq4(U7d1BYaiE%nws1~MF9sedIWXLX^Y7VAV5bRZ3iM#J(E*~cy-z)erS)Kar4N4 z(qFP1*tT*{kVfhmd-Lo$W@-`ybdybwauN8R9r4%VU{+;TIn%S?+W*Js=dkDBx#Z)} z%#2p^i0ba=Uqh>ppEKjpRzVBDM|r&MwT@7=WLecdb0c0hLymz`ALDIZsKQeUjdgu) z$Vn7rAlYtC>+=0Y_VL|oGm^#%mYPu}~mZ-H;VyubMeZE-1ZjbD4$?MQ;G3e?XZzVCI0<%3GmDu9_; zT<4dTrP?`~+hn*4aGOj|&FRQ!uKamkZ&~_P!=`Ptt(yWMrmz55v!Bplqg?C> zQ00GA3Pi<)ul{ld7IK+pMFVC$0<3hqe9hfG_hZXiXRGta$FLJ{?Z`N{fNPA;cl(0X z9af&(WcIy2l-iW(M=GRr%x2<8m#?>mn6V!f5)4#fKPuvFe?30+_RXGjgHrXcuoZNh zF2fzul^+rPK~NX0WAawBBlT1re5<>WFc~dJ(Dha0@%h%o)t!+M)?k}V9eWXmND{3u z^;Wm{gsgm99gLXi$rej-5lwx_Pw>k>A6soebxt2v%TpDN~5)BopJ@_zb-0FrIB+BdfU{6*SN{&*)|qsI@8iqCO-Z1T!Kjs{xMIT@-0di?bG z37O-EQh)0#g{43nc`D9R2tAE|R7Em0<2;JqIyR2W7OvR3079uR>%OtZYKB=A>HO%g4oWkobMN$($=!h-Ro2 zy0RK@gPF6Q-kcde4vQ081OWn(+=yy3$%%4t@_Idi&@jjZuS;A1M+eu zGRP4wNvfc`P5WpilG2l1lT7k8TfUU;M?yI?-gv74-c@|!c!*H4fy|>{vgd|r%P2r6 za`KGT(=~;tIspV`x$%+Bagw5oV8oa>Ip6I49Z>_=Dw&@l$)7TE@S>X$1m4 zS`k3YdLc@2J&G8MnT%}#9z3g=zxlU1_+x0kd4j~+DIoATbPIaO>33O?31*%6yXP}a zftoz%xCu5KjR-lW#&9500xnB&G+1?xiBgwKF9#M*qPEGNHilm$5Gnmfjdr^X5_Hct zt-BcWj-A}?o`B0Eap~D6cjsq=5uT`PTR>hR_t*Utp(io-?b?q0KA)h?ob-v#(mjdm zq#jlpLbZqWjcPF%;gTkCk^LGZ`aCBe*S@+be4@`v|HfLd?%T$GAG~>l_li)vTVaz@ zmO{L?{#N#UM7>qc0KCmpLWMF=_e;#Y3n2=#H#;@k04-;DkivAJiw|p-r!HSLf60Rk zIvalG)$5kn<6?f+ZHY;lI7K0K2!5X^zBMf+q01r#o(!mCR8;>on-YfNgw&4ZLa*3< zhPzRva4f42QZSCbn=22Ir#;{W+nN3pic_szc)&GZ`ZFHM+^tMvU*4Jk61cXXIIyH~ z1)f&w^WkM*Cf0n*iUM=e?^zn2De}TR|K| z{_SD@7R9Yj#TX!J5lh>nQ=OyIVu*LE z@nFF~>|a*_S717}tW`ZrijpxfhUkV97>`BNxqc()EWkUQ6O7u)K~0iybcyw zb=MM>9k>VXiMx|S38*&fv6`%!TVhsU@$qeL z5QKbg>kMYamZx}Fu8t~YcEHtSk**R3Q8g8#z^&w051wM6r^jO*FA>JIAbB%|LAQF1 zasZ2>r;>wwxYwv&ShF#R&54KF$V~b%WTFx->-DnfmcqEB>1yWJ%$nX6lKOZ)gWw7z z1FyAS>-LeAk_6HORVDP>j*D?3r$i$SotxwBUIu2D<@Blke;>_1sJ`Upw zFH|WxBl8f&<@_v~B;N|efA8yM8|l)vXah1Rd)hKuJW z5Zgq=pw$*A{c;n5qGQtOP1*ss7N&gnb+y_BUa-=ovVP-CR(%)K`=9snpPx)JD$l`q zW7ZnaX)20^{qZ#R;md{eYkrQyJdBqf5x(+`5n*Z?N$Q?YyBKPsXiTSkvf+Fb zI7DyX*+|&JEl;5Ig&-@+a?$4)m*ixbl)C24SQP+lq5i_*5+;`x{H(V(*UMJCH)%n1 zVIA*VSx)^uJBSO8&poq<8hhhZ>8V%gMYI2^V84_C_B)fDJwL^6bR)L93(RZ$Tsv-Z z#vFja^3(>R{>0~ArP($GjBw4>J&zrLNz^5zo^84Yj>jyF-*j?h>Rt-~Uui(_>!-b4Al)rIF2R8-V zh7SuyO3$}XTKR0Q)N3%q+tAd})DtdiQ+OVJZ-V6``0^C~R+b8nLbe6(;`_~-c&WDQseUdBwsI+W^5^hfjGw)HV~^Bo0LC$^GRu$+9?g*)%3bVw!FBl@D5wP z{H45P&naZ*cORE7V$GC>0_C$yeQ)b_mM5zWB;{+_p+uO!AgPF7VXkn79=|L_>FMzl zrT01qK;NJXZQYOvgqwKj=TRiuvTWXr+X77szC}Mdw{$$gPhw5};m$n&PKS@<2C!Kb zty&PN`sqyp9_3%=ZrX5FPTUkfnYo=zk5A>O0DFwBB4+cUGsyl-{an6t()qhyhL~%W zbBX-^dtC(=5VK)oHDeI=KclaKMVP7X)*DLak>n24`&MNh>^r2H+;$> zE9sPz=@M>@L%ITs(nq*kF(hX1ticYyV(zY865 z`#o-)g0_!RQ*2u-J%2)w-%9z#U0+LZ(u=UJ&sEE9LO}*A^Ygta(0NCAej^l)+vwk3 zo1XPdQ_O{{W&Bz1mjggipBAKfNwieaUxZ}1&S~ahL33+mpumOD6>9~pVyB`_KtvO& z=asEI5CvpL!BWLRabfgieD1~7hcxYUDA2fT1quXa@TGT~uV5QP>P8&&#q zR}6yWTPY-<{Tm^0wDa_vtWT&4Vpje7akoK^kL(b8o@lb!CG z<>jjuN#HOPX@`+S{5NW6+*raXnu688&oyQE=J2b724;&1Jw z8={tYNUNA`dyken?G~J_F)nGG_9Jb_t9vzUxb$5HS`f!$4)~Fp$fA{`uBDpR(UOQL^*4|D>@_AC5@iY$UUC^`g_VGZK*w<~q*tGQ}r=Ba)OL|O5)~^uF zUvhC|DJmCgUXnPZ=xOgWpy0D4)Q(D0hl=}rD^#Rx$%JB&Jckxt+Z3XM&Nlk2JijX{ zxyF@rpyQX^G!}igdg?%kQQUI&v&c%vs>hBBK3Fb{*Jq@?edTFtZ;FrWoVI_HcS0Q; zbCZCQTYHAX5muUPeO25bIg2}-HBugyKJ3ANJZF_5!0}=MBJ@&NUEcKhRX`h_k>3xwY7FpatkTrzB&hz!ssXTCCV5n%$Jprv}${D;cXgi=mb5rWcV*$)UdC*2<7O%=uhy*yX$vuZu92X}4iM=?y0f z6&H&Y-IhL#OZ0CVM)m*<7Gr0XJXi8Kok@$8lhzqOG##dKl!sO3(U1FVZrV&l<8>+1L1nXK# z5znU7G^jREhULtc$imW~>vO0?IoVDU5}_5jP&qInuiY?m)8FUOb|%R2FrmX(8` zVDt6X){z^i!BO9xRo~cbpjW_kL-e`1 z-8F8uXBQqdHuT*uH6%IvHAX^e3`8zlxeq}l+otPy-Wh=RUtY@A;B0tuSD|5w zv~-_TWD&JJ6ZvBRx+;`nGRl?omGpZ`OX(1FsebAzZ06VRNW_J%AWx`R1JCG>=|r=f zil=WwY$JJ|YN=X9MDnb7dZe#;W>FFh+Kk!)rud+7nDMFnVj0PmdeZuY)!ihP4XGxW zND-@|RonbmA%?Ab%}$=#o4(YSbv%MAZ#P79{74k%`hR)`vq|G07?amSmmxcIkS7S# zc8~8?k6G0W){fdBj&bn>5yfD8J!Qvpwpz6}DIFvcWbP#(V>=Vw65PDAAih(OWme%8 z`VDWcKg+A=(cmc)?@Fr5+plLZ9)+^JcaS0wB;xFCEnT ztZs*mWh-=>r1XbIivH|F7CB93MYrYmU9R8xkSde{Jt6x`EAgG33RLaZ#e$yk7eQ>P zkGi+BrZuprc`b-kq~}0Nk-~Itu7V;Qo6xn|mK;{`@_Su)V((dJE|w$o;>{-)U)0a# zMY`C%^Wq1978@J4|Gs6uQApyQg(zf zwju%oo4W=D!jKHooT3JreCWBF8n5E>G$XrKB!b%ix0NUk9x(BvxX;7fY(g#qL8~dY zSDbc=HmWuv|Jla8dE-H${8N7rt`4Etn8#aa^5#9_qL|JK5p>|zLc~U zLee^w;SnXfGB5QctF!%EP1oyULC{XgoyI3B+^yP5@0jTu^2(BI?_ELmOc~?NvLr|1 zq!tV!jS@Szr(A4%92MLKz_RHM)^hZuv@F)j7+>f0>@l9{j}`x1DAv%bl6kz^5`jdr ztgf1kNnO>elI9xlLD0>wnVw3OjfYvnAX@{4mz!+M^SkELJKKX%DHsEA+*@o)1Ef+^ zEW)}G!+jQp2 zaZFnSRa?f;QLL1lz!EUSFaJNa%7+YpXq^xE6DQ|+U zI@+5LEqLl)qcl>&>oCi>+7jU6dO*j=WsjwP`=b7}_XGzOcFDubf?&>pgR$mO+Vv}aKQgjVZ?|h{0TRB($1q={bY{8v4 zOS=;fa|{bVWto0`%<4WI!1-EDyuzJ!7PK-7$eB23x-OHui5ZzWC$p%@rx&);Q#R6P zM1Il)yILbRzeO(nevbxD>mmSaQd$^*=i&m;7D?~f7(J2GN04Va>Gf*(b3O zCZyTcFTX!kZn$7A%paNHjwyOOj6l%O|+Nr#V=XRcqn|&cpuiLEN zZUg(Sm`XSkxY!pY?cFFhBGu&M#x3dgBh-Vs#_s` zH!SyaHBAshRs$%xIV^lgJ_ipxoG>g}&OumOw(glc9SiTWsLy)ntGW`m$Xe%Ll&aOh>f3S6yqtHxzFFG6tMNVpSKJ>No$N)cf7wz1din7S?6?)U7jrajenX-Z`3$1CB8UCO4vOFvC`2%TB+0f z^b)J4h|2&l#KhDqEMK3)zB9g=nJ($X4;sBL_V8|x5$z`%({idq4|6=bySb4I!A(<> zUbrWuT!M2wlAmG_CJhM1D^DW9@#s-Xsz?v;U*x9SxKyYHL1u}Et2Ty;6){MoSeG)Y z-fA0`ZZtu>{a|fBy34ilu0>u?a*Z_H>lp6am*eur zQEW)0M30lN3e`9gHuH=dh>{<5mGuW@m?R;mQ*2O5;(pIbeCA>*fH)YRtv0X!hW!O2 zVfT}Pv>4~Ms-|(tBU8iDS33$*_m~QrOC`}XXB48w_LxQsO^EJsW~?W|kJPE5 zSOKbS1!5Rt(^8yt=jATQGwv+idhO!bis@g{ySMsmf&hXmtV6xZBt*8p&ZxTar|2VG zgTTOhVMMK=7Ry-MWk;BNguK~4Rh<`w*sJ?I$hGy{^< z)kK=$OC7g1IK{wtt-$vC2^R0hGAGe}@m7sL@aWM#WVR`L7%Mk&G3|T*_LOlXRE0Tk zsL;b{m1~+L%uaCJDUP_y16Q@g0I8{#W79<+J#m$x8gV3@X=KpnN=5q18rN)sQo>! zftW?M1DJ~Npe1&=DLpG^fhS72=VA*JVy)IkW)lct>(X5ITo;;!Vl^-eQBHWRD7&i&h;xbhl~lm49aHM>;M|uG~Op!Y8hPt$Ev?*> zU}LgR&YlPt@*bBuBU%{Ylcg#eX{0~iC{gS}*2?t$@ii$*O}xExyf3Are`RTEEr`@D zEqlt_-gLgOF;EpBJd`k)t=5}@5bla~;i4Q4k#47=WSLg-PJQ zqY4FtgHLOXhOqUqDB?XQFYWaoL2w;0Feh2ac~X%HqZn=rJxXlpBw+xEov1v$)&8Wi zaI<}Ovwi8hl^2d3u(Y!hf&V5E2I8H;5yvRx4&NRjq|ped+0S2;A*- zrqoX(JO-0)!}bbXscaz1UNH+v=6;qDKEi}IruhHizIR?u?`{WRXu*aCr85w^P3c3@ zUYdMMfVkcL@^VwqB(50ajoQD=+5Q0!%}*fRS8GWyTPa~km7HFmkFw%%8(Gq7DkA0N zvn;YuMEo|Rv`qmIXH-WdfgJ08~2_k0na-iLw50tP30h`qZ%1S%_?# z=M}fjX97KF^wQ@;Zs;sYypn?3TxXa9nu|)fT0CHf$&Uq{JWe+XMX-HQB33PlWqid} z`Nj7w8lb&Vi9%rmuI2t6OSS*kSc;8hv1rU?>V25lMIfx&7k!MB;)^K-jcOb?88nz= zh|@d?zUE#M{Hd}A8))SGpa^(M?uaMjOf7{LorjYr7fbOzIf$?&s9Z>dG`_yzOD6W<@?L7Y*r3G0?1!X-HT7Hki2490OZ^m2R&j6;w3c+}bh$ z_pAJOxB7FZPk7Ha zaK_R~ZZr_x6%PVrh(}aeAaW}n!@pU>Keez!D@yv~6ri^Ehkhv>PVU>8vQ;z&UWkdb z_Dalg5xr>O{+TIiTJ{;X+@(zfUc>0VJPW1kb7-K2?>-7*r05&T-4c#DJuM&o-$%lr zbZj_AiUXzN`jpW~@&?Q-MK3qxHAjVTUd z>xl_kXfDaIbT;bNfwh>FzFQ66kp-8U=stlIHn&iugvvu^1h1DBn=y)=*oxj8-C zQ--l@Qn}LsDZQXawQMonppaKNEX^=}89RLw8l=d&Z;>d8dyT|9V1ARyMHsXrpBuJg zJ1cwGP=V7Wao}W5h*iYP%$K&J+r@mO$9R*O5W~8%u9{%buX*gq>_=)?X2SRMNS>gp zpdqz!S(;8G5KqRrpXrxD_7zwYd1pOTX)r;Ykt$OuhX&k;=&!St-goAJ?2??o3{ZEw z+Mw7z@(l2xfYI;Rw{s`NObjZ4zsJn$C%|nan${wjO&*O@#FY5(APHF)K*{fGx=qtv z27G9bf1hE+;p7ld`LCxeF!;_f{5AyrF-)hNi=3_EVw)5b9Yw2w?0+MEmyXIc#^_CJ z9Sq~H^F;8&#&fiJMy&Y)PEhk8J~P7?>B9<3?a&!A#3dz1p)x5BH(MuQeX4c0bJkJ) z#I(f+_e_wXk@GKAA;`4D-90N;A^cm-`Bn4X-SJ!8->vH0fWmcr>n(*<*j3~r`Lh(E zu|(QPk(8>4%Cg`cB@?!}4>lI9uwIf7d!9c#8n*D$&*Zvo?25$eZS?K3<*0!b+$U0X zWJiidBtX|ef+y&FXvcLW0S#RPrgL?V-rHuJMvtr2;*!1Wp+LN%6`0Wv9^dKjsnnBk z?AHP2aQJ8lkh=YPIO*_>DRkY@tI_%uWL?vCsb$W;P1}V~{c=ma2-#E1>j^7>0ICc6 zj(RMzf1WO+DsH6GvQ~V|BF=8NvgRbMtob?UF>`A7Xt+g#)xMw74FclvUWCw=XSrwL zTKw+ucCy@_KOzcLaLp%`1}6JG(DlU#x$}5~<+oF(a4S)=MQJPN2Ejwf>})px3?est zMx~Boeq(2=tO_$fG!EJ|I&3nY*O>OPXudHc{v4!G(QRb1)sB~<*E3=BvO_ARot2)C z>>}&nk(0|C&}kM5+uS$on&ne2i{V=cq%zefNPh^EOfFiUQgV0`G!%QM+y}kCe!*FV zs@*9^$jxcTT3m_ffX}f1+CH5pGuZDs%!F^6>dm+E*}8Yj1k99Z&6Ww_^`DD)plTlr z!e2x(>|P@c9@8qspQP9%+(UN#T^<>DjhEE_DN1mlD4D8wd}Nnw^A`%-Jp?d{(5Qkh z&Z(3FGP^wjl!SBlF9{0^3MQAlT@wrtV32%=wKz2`FGahIhX~H7i z5+SSB_h6{555@T#A;SWLCsA^;u^2QL(iL!qicr6-K0|D|+O=ox%a_v%hg4p=gr9`f z4!^BFC1ZAa{9L^Eg;51aQEy$AqbPj!o7E%cqV)|)46^&7?Gos3k2~^?a!)#;lO8vo z^nF8ue*Y-GHE%_*jd+?MYne6OSE2fw?ApIgIL{y$6eJGg*R7gEoAO%y)8ky_CmrN8 z(aiZW61pX>DFw{mHeCS$IZ{`!d3TsI_xlW>boiEh!|gFUK<}^y|5>M!OyN*#753B!c1fv?dp={_PM4%JvOI$YhEPe5Rd_z-L~l>r&2CBt zUC~YZD;T^5FPbZrTWZ+b7VtIDHUez6}ZN4IPti%R_p5m70=^3AL8$9vb zc8-s(T$EwK(r?a^&w#bD7-_kgaT!DTNkETJ30!ErP}gCCUY4IXV!PXD`y8mStU ztFY6TvSqj$Furkoh5Ps$DO>f`fC<`ce?4On8@xMb;!pe?&;we&>mvo-&4}VQ68((!$Sui$Tf=)V+{*V%}p%o=X!}*j`}>D|JDo z#S!9I10TZU-!nzh3gRwY-f_05a6H#+b%Liz-1$Lj*F*hCY0PMRiFB{8na>G*Nh0dM z4Zl|F7GA0Xwdt)1)z-kHr&?&t6d9*Mlgjn)PLCTPz`e4-ee$O(Eo%X4;KxMI@p#&l ze(Q>Q%r1p17#psM(YpCnVRM~wyFrQ5^pzTb=&Ay%!FA-%Em{M-1I`01-4%cDR)fu=t_F#8c_b(FtoxZM;Ta7 zMds)rl33d9Ojom-y}m?}&JMx6N9$nn>-BeWJJL;DG%RRmB8X3@FSdP%ck=bR zpi(RZcMU=wo$Yy%!&x-(FhY774+*N6&(~-N2=JmG>5c$Fo;IjZP4L_Own|9SmsMdi zd_zm!J8DBp-Ng1{*!>U(e-4!xZ?Ef7sy#QwnarPi_eYTB#MKUK%Z<2HMcuFIjXL~D z%Wlu&^>N`)n@EPL1Uo-aDx2e0>{sZP)-^R02{|6xLONh*Tk{DCjDn zqS8Z&5+njb3@rp#Q4k44WmiHAB1(}^BGQ`(CMqQ&5K8D^A_>)y0HOGNzU-d!JMVeq zJimG8H}lT(&iJ1L1L6MM<+`u?x-?yD3rjD!Hl!F!i(5tY^^-1~aR;MrW%HK{tO(ga+#8O3k-XalkC##(-S|ynl~1k) zB>)xIEITu$#Y7NA(+;($%5$7C_$#Io7E|ak#TyfAx+bdVy4{Nv#3ZL19? zPiCGJ3`sECgu%wiFyr-2qqS}F8Sz?~;o6rM4#I5` zikh|F=5CkUb+zc6hfVsuUv?6ZwRJ~);iAp}enG0wOvd`d99CxYZB4TNoK1omNvFqd zhOmAtA8nYbQKLUOCR1mk!F;DgT5z;(>&qGXL^47iz}5$Wp=JCmffL?>KD}Tq(Z>3_ z-z>3C+_(M5O@quykgc@O=N^e&W@m4^3-opI+o&>5H)Hz(v1=x)%A9}s#k4H*6j@*1 z;(B|y(jP{L6JfJFqshsPRoTt^e0aw`9Furp%UrB|y^w85C9s=YG^+q@Z>gLb@=e74<#0~mFB)G@rtKieH46_@U>+;)G-(wQ?z$f+ z5#=^t!>*v8*}WaZADbGP{}U#2QJWJMGqvsD%{o~F$5RYodMXUS`6lUhu$_o%) ztS*zJDvdo%sfQDIHd|JuZoG8lx9fA8nRcUJZ#Z=GM8kvDsiUWnN7Pu0(JiSu7@|V9 zkp#TuLizPXVYf;wK(GSI3lnjvy=62d9p=?rC35J4%+y=Yn^uwjIBc#NKK1PW@3-&4 zxxXXV!gDnq_pIC*7EVBN^7(@sUp6;VnRoQCHbn~^`L}kMEn<17TfPCB9xjxm#aeub z3)saJSsW245l5Or(Prwg$qGSz)@oZm^t!!>yKEkpiD*Vf?}pVtMTMAF~fpl2IH<)I1#OQ z1kCAJ>q{%xJOCJVs}3Mb_5Ve0(caN-J4wxv3rybzbqMA|DW(|G4?%f{vEeL$WG^b!T!FHpnsURG)M zJPN4CvBUMH>FxwPnZ1T6j=X2qfEldN3!nad1ncs9XK2$#)-|qf-Py8tZSsO#HnVH7KC{NC zBi)IuTt(=VUq>NPzw`RU;)Fa4&~+;G;xa)pX{^^bp5 zG7JL9YRh>JhkxAkx6}g@F$CH6gVq5m+14FO+Kga1JRq=H_^P z55yUIKu{+i&6<37{3*mYpAI{8Z@$>q01RRoBji0j0`#A%wPjJOW zV25Q^@vDlwh0@`t8y+@!8TdQ-0=}{_lqzK(G zXiaU%SM@>QIveClsutew3d5-dnYU0lngF3%z^@|eicA4VYTIU>gFh9o9(|0&L z5YblaI)oywdpvBpX%gl`36B>QQD%oW*C7x}b6RSZ4Qebs2KOSAa2JfEh1^#3>1~Ei z_6(bKQ~$^Ae@r8lmwZRv@%4>oV@Y+(0YFn`U61J7i~d;awW4&>n*qHJxb!i0GNslzdWu_L`>iiM z9V4UyFcV+f6rO+KmR?b*fwEDDTF)Z=vUPgWi?D@>4{1>~#;?vhJIJKHDJE*HQ8v=k z^f|cs*iY?s`J}*Otorbu9)~6y3Pzdo&fa%LXBdqiKM2G=@l-kZ zoTgfAf$>(B3TeKOVzgN=pR{E>DNe@QcpgTZ3h*LqZ@Y!N0kAZibikM)ft;~GJNsgp zoO2k;InOI5yL5k?bHw1N5BvSBT7~OE@%1=hkN4o?Pt^jH@O;gO_o>cHU7m4OD-@s_D;N4~MJ_0$AQ_*N!PIfwJON}MT&)mF0_KNaczNJ)%$3%c7ww;mtzSKg(cw(vraHvO^?qk)s z#qYcSaTPjkept9n*704+I$TF?+A?p@eyOcF>Gz5cmgf|!_180*MZC~F>x%Sv>#3x# z7i?3fFV15Qs05vJz5kAkqJ|gbQH3%l<^#iL4zfT`Q?wA5s-_*@w213$^k+}X^&RV4Y%`@BB6U7W1Z#?Dj8eV9+b@q5UX4~O6pz5U&kk<# z{jh5-N;;o$<6zrc=M$UHRuLmc)XWc*Kx(%?($P@?LwqzBW0~VaZ0r_zi86MDDg?QTb}0FejWKe! z@@mQzVqK$szWP~cv>}gvs?9fx-i-=|X-__?K}c&9+&h(nafM^xvaj$x_QrtR{VxhGS%*)0%Y!|amU$9VmC^QsUcNk1*DC18PP z)Bwimesm7<54)TWRD-)Ci+3XX9ReFvioWF$h!k}yfcd5+yA$x^B53Leo(l)=J(pjY zz91~%GQ!Wth$$Udn(nK>;zu$GtEFm=-R|3Ki&A^(BR2oSjl|wMV6|_VpoxNl=9;(Raz_G-(A;I*e35#*A;~GAGX2$2zzk|VQT9Mp z#ziC5?(*F@@hATQHHw*M#(?=iJA>IpvpAw6VP)SLJ<^d}4%pEm%>_}qX&L$!pGMb1 zv2z{sy^ZiR`h8U6dz6ufkHuU*BgwHySPx?U(?b4t=@l!!e@8g1DEy~0N78yS<>a4* zk(xWp_Qz;$K7Q`lPt$9z-jLnqRx1gArT;)Bqj>+v_v43Fj+G6Dl^wmo{WSS=UbPhAj!8hVAy#%KB*q38PsahXmd_xam*-z7E zsyav5#2NQ23_H&;10`~&YGjO#d!WwNOkB(2{f^6S(6>pBht09Y;<9(zRj>Jpj~s^R z<6SUbLMV(`LlIGllXBh%@SeDKIa*F#Mz-Zcq3%l*|M~^SnePy>{lrSwU7BZC$~yR- zj`f-Y?(1%yL(9M*n_)k#^Kpa^#_s{=N9 zeQ$nqIq4bO8nzt}*n`Z8m5N!b_O6vwW96i7c~O$Heac{ER_5HEwaP&k=q$LBa#)pO ze)OYWpR%5VI(&{62|MuKg}{7cfRabIj+1fpL`P4IqMs?%)M()Tq!%?V89q50IAPxL z%ONW*iHg`h=MX@TwZ#QMhypPq00F==Vb?!RWYh8L0Fz)GJWa#)6976$cdDFbI; z{pJj4pjW|m)bOd4H7l%7&ZOwUWh+#d&c9Iqf;<&d$8YA&z0A_$jHoE(rwQQW?YW#h z21ZdpUeXd}`9~?Gs#)`kD!Er0iVa5UVL^OyxZPjWKST&NJ~reTp#F*F*1LIxoWOsR za@^~#}%_29%;>W zE{vpP0{)$cN_y!zVb++pcK(oRPWE^?;NMl@KD-NIf`j<{u)wu+v2A`x77!7|)E1d~ z5pk%mM#g;3^Yk1}yI7pwg}=YgTcN%0Cw-eEs>TR>+gELknl8PgD;{fO3vbwHv2duL z-ov!Qg2r?y1*}ee+PX(HKjo4*`(&H|PQPD0f!{tpDqkTSx%##|yO;B5{Q{@pVB<#S zpU1C%g#yOl^PXk$$D>^jtBCS(mPwI6?#ACxw}1^3s zb^CZ%M-pMb7q}sA+bA1rFZ@EeSHaSu8%+(RtUZpV#|KW?wmGoW8iPX|f?2v0SbPY# zwY9akSi}MpIFVg=z@}<}2qcx$-3O}fzS#_&AD$qe-u7b{Ud42$h9Rk4f{9xOP23Kl zi5t(wyaMTDZTUp`Go95;_d`uISNFpJe>Td^M$mcItv)>eXr({GdSaBS3@*@TG#7?i zytCDxF20SM(pSBViV}MO&CohA>#1&6}z7#$thWvU0o{#2jB~Y}@^$Cy$)d=+$tkq5g7byu0h> zS=SY)-oAJD-XZQ*&;vVoyp;F^BN+A@JYCPQ>1Bsva9X9gi#TSu8wLxuM za#wb*R-mqHHj^B$$wji#(aIsl?)J$GFdWgP{F>(xs$BuEcFo34m5bg7R=b@78B}g% zy=a*n;<7TZKk%+`NRHBvFaOo$P@~XtT~^$(qhcyfYybD^-8>D?8Fx>ekK` z90uyFI+xP1fXl3F6HgY*!BA5yw3if<2Wfc#gU`^OU9)M!IR`;BgpV z$M}y}&V`qawp!6j*d$69%qOE4j#(!?L5$iP=Fk|Gnywy5aFJ6srE;G>F;ciFHQxaNld5=b`UbS3E1NL0kWp*TkUn}KO3N-ekpsVl!?|s$@R?%yB=w0TZkJ4Qo@~@G9M209 z@?v=2#|J<+d>BePl2?CTrcl4%vb6IW9tPx7v$3&~8$X8CK+=J7vO@HSLzFl1vJ_@6 z5*c6`kh%R2C6nf1SVczsrTN+;YIN&ACd)|h+~cW&JuC-YI|jqHnJ4>S_I@eMr?~V9&mVN4wm5PM9p2F6EP`X5I z`5u(U)pG7GSq!-(>K#{p4z|O@3u#RE&H*2~cm}+W29%+ZFeNtF-nByi*SCR)iZ)>LjBytW!%%9*dZt^bf$}$mi0g9MYgfWNZ zBIX_xF?Vo75V7T_ZErtz2K37v%(SySoLJdz2n@;<)m+`C62$H3@{*Q}L+M*;LbzaZ z@gbL9;H7G5D`Un|R5@8qGe+To6E0JfqVDl_Z4o>Tua;!CcEkwRPaEez`o zBc2xOGfFwl@ceu_v~5e@RsDyuGIwPKZ|-OoCdmwDeVl1HV>_+oCVAdxV>BFZD+sl! z5##jKl|y{(7lpqvdREgm2zbR4}nnd8*Z)whtnJbxTB^=l!SqwD9)8^Oqbd7r~YwiCuA zKSGqh%^dK*6MrF@UZNYf4V5k|R{a9f1p^s(|)72$W#+=~mI`5p!554mo{EPP! z@C&EqAH1Ka$Xyzkk!|a+)NGYK3-#II(pWDgV;D_bKU(gH!3H4*G+CNVofFKk}rNzX{@Tx3Q0qAIlp1P%l&)}Z3fE)zH&P~c<`mIW5Wpo8>& zEkz+w=+glyZ>-uMF7POOsdJMI>pUy})=8LB4|jF1w>6o5u-Fny;pef@QmB^b_-2Zp zZ=MD69nk)4Vk)FgC)WOqBHVl-=H(fu20Ch~391b!F$-h)I*9uG{A6;(RMi+ftbDY+ zYpPl2=f)Pj_CA*nd>2JF{)R~N@`QbOH)CbA@>^vomL|{=!F(L^=4+`&WB0ujrGB!n zlETk`(6w-7=fCC_Aquvt*vly6C9sk?fWNc7Bx6_!YnQAng&9O886~g^9asOidf}zv z$qG89jjm6^HvKrX*4^%hn5e~uG1(h57^|6p+z@#64q~fGRfM`sGXu7e*=eqwCML^d zHRgAZE1hhjHcezLsdwhIx%h7nBDP-!zRLIvOOvWjN*o+fzktf;^HWb3RK{O)?VKOA zWiR+TR|$vX@UlViG+cWef@?K)TGQ&E1fK90l-({Eh`=MUMBq^d1Rgmn*_jq>GVW{k zc*%Xn{8OT1DmqD<&bi+DwY9r7g`t-VnJUK{>XjX^GsYjDZ^0%N6e9HJcQM90bhA*a znQC0n1@6|l2qolg=*P<>_ymy=;8!s$v_O<<*iz95aEitSzV{Cdgg4OQ`1HrTT^>~qX& zCil{2>)hKZPhq2JyItt+dbDH8LFZVXZn%zEk4KQwq+Uxg-epQ$l{Pq6AIwrq%k~a& z&1Q?ntWm!aSPlISiu(g$_Pw}y&x6e04saA3Fy2T^;p|isAKm*p>V%fI^p`ai?@v@H zqn^dnWlSuNe!|lWqc=xg%@y)*yfs=esIn!pAdq2*s`|M`ev)&gkz7Hw@3mRrTt^ut zz;XE4s;E}8@r_I{R*7@0l4U9WV2KxVgMQqZ40U*_4a-4SO}ifgB_uxnKkyE~-LvG& z54NDcyR?DJqHkn=J=ApVGc0xT3USzq@c;&M%;-Gt$~HB`7Nmyy;4(-gS}=Q?m!~Dr+SO=O&lXc{tD;cf=>@jQ zMu&+GWOO=WlH$}pby&c1LHC4Gv^^fi1W}qxrt?A)5`soN`EA#}hYl)vT(@HntfN%R z?9hQ=1M|bP%ivWv*WJ7&cj^1#o5RoUrDBJ>mRTnMR}XD(0!FB0n{Zi{U!do|FnDYM zg9r9EgQtBI)eu%0gTp-?x+*!EfrH7I^^WBu@N6+X&w@}u167t3*nv^NwUe5%E?tt1 z1lK_M;qo)BA1<&e^;C@JkNaEGu%pNTrT>USfUjqLioQMo-3m(Tc1^t5(08X3 z95%2|bVWAGjHW$vnkT~PU$x_kDs|Qx>u=p4le_(Ox5*}~sPn#wh6lm5vkTXWG4D9z zHT@Z{<7?AP6W*^*)Y6gAZ_SEl;)13Rsj>ucU5XOWm81^ZHZ;+RCoLweWz2op#S@}) zO6!t8Imm8+J8YKu9SEf~YvKo@-f2AbOY+&c;U_KSPcVMxAUHRtzYc8R+OoA7LvIs{ z{BK_O;?y>wSY}`A$(&NGpzTFSgTVVd0g?+ku^k{)XQ6x>6Gwpd6#rFo$tZK|KlK zWh~r0yMoU_YhcJix%@`Ege4MBT-lgh*I>LbLeNERx?iA*`Ua7BC;|0>_Tg~JRNX4= zF7}$ULRlG0oYUW0jY&YOQGN=UC$*&2_$_W@6%#Y(@|RSj5h!cPGU;LH6;HS?+WvC+ zWu7MW3JpeB_g!xBy|FPss*#nhYm5SgU3&UTQjjNMo^=hoGhi_sO1U{z>-n17SJpsB z2NO1`RzGg!i1N3~Ck#EDmfd3XLyc@uaA!j8~>m0SC_3rAQqgpsKQuPmAbFUV#Z zxOq(vpsTcrlS(s=DpFNkFKirxz)|b{BkGQpw$$5QdgSo_J{$b{;L&>uG7SCV*8^?@ z5l7BYL!XM#I1w~mVv1n$$$Ii=>#nXGxSO%tNc;5>Yixe3U~}rQN|-iP5xZR;Z=;3` z1Lz@`XfNqxdHQTK)F461hb~YPLOvX`f0+jrd2~AVywLJUth$|^oh)-1KIP8UVWtog zoO1S=_G;ETiZr!(TY=;G1UvIJWm8}ECYw{+Zc3(TB8a&7QcD2!4YRdHo7==Nl=y4* zi(c`lUBVgTNf`G8`nLsE{U9<(9)SL$&qe&i4}_e43X6Yl2o>Dl6Eg#U zGNu4y-&kByrQ+P}s8uWPpv5|}*y%^oc{%xEr`jDF?_DQwL$-cf-|p}aQ9(X^(^yI+ zepq`T;~gUC8{A7!itKij5*H%;eU&kqu7u{!!n*$^*a=D#$BO%GnbsHsN*hJ{wMtSk z0%-Kj-sx1&mGu0@?ku43ME_0W8R1e>w!QF|UZU|#KTZe;VzoYsX9sZ{tfhQiTX53C zraxV&&E#e)Ql*gwmfz;0Tc{-Lu2UM&9E?y=!+0Y3GU2@nwT1X@>uxQrpP4O&&ja-m zcitVkDxpDF(lApJxez0+njfXFH(eJhYzUno+YEM)^wo?_mFTr|H7BL06_Gx*ug1E> zL+Sdu;lle2>Q%x3Y!2{v#;zI`SCy6u4|-H}zr2)X@sdd$jJ)^e6Eqwj{^RtIlmfs9 zp<)K{j(w92Wu<<+R7jBlkc=dN1}_7os+{Uql{NaZvnA_uYX9?;pDz7Q^lPT^AB1*W znHWT=?Y02wc>4DlEzb|p83(=|F%7lF(LCe=jF`{!Qdj6wym%TO*hO--<1i=u_Ex z?d8XJ(FwJMvt5i*ou+naGj(7S_bm=0^4I~f4Z$|dbX<&{y`mo~Xw2J4w7I5S#;^^| zvdkI$pBt{9$K)U@O0O69hXJUH+sgV|#LoRM5xbmWll0#VF*+6kF(<=$%xh`)4XGOEdo}h0t$J$BKx3%!s>Vdk2tgp{@;4f-HvJHphw5W-D`uR@;~Azv;v@Xn02$tLqIOzP}gOt1y$nW?{ITW;0TM zy6F+MbdJQUXn_1khxmRfPsiIpTpp=8{_Ec&Z2}! z*mMk2%-Y+CwE<4OWRt2A-i4x^stPq>1KQAt#kx7dNC&$Ns1L?ECxz_-3Nb*KFyeo9 z0|lPzPupr9fMy1gj>13t>4h01vsg}9(yDnF=%tagH;t-I);iaJh-fMsv#G*Oq^f!H zWkO5P=a$sc;*$0CZL!MOHbrY|SwM2)E{>pceWs!v1zxO-T?&F9GFCc}J7!{u2;6#v71%?36OYnXLDwf~K|@-K7-thTpD|0h~< z3iKG=e~HQ11@0f}cvEjd6*o6}X>guHY`QKM!x40{{Dnbb*7Qv|YZW2j9AM2`Pav|z_1V`51RxjTGPI`(Epnim zcNlj4p{uh)Z@tR2eVwGw=l>QH^`EgpHELpDw^$L zvvO0KwH`OLysvf{VFxR*HonFnfg|tl)>rBk1Srk5+xd100JxlXHAbO?389sa(<+-u zy(RDmF&$<^Zb}ILGJS@q`^2yifao@Dnc)S(ID2LIYn)Ez;0xhBuFU%T_ugniN%L&{ zhh_G-sY~ZncD+Z6mZ8LT?1av#BwwZ`<$D~g1GoKB)UB6W{A@kl;Y}}|wbg!Q(+tkJ z0z78aK>mC@-{aVp@2)&VM0Ggj4;qfh2=Di1P*FqvT{-@d4W+a7gNb@zrqs%7B-4TZ zms=8T<(R=plucAnZOSd-e~UMhwT`UMf4$wXKok3EqiOO^dt-svq{A&4b?Cr75v|Cf%3(-Mqnt9ZiyUvietj&!&gfp)RpiqK zZuKO5`&QcVpH{3yhHT#Y^Ts!NK^m6j$_`+KG(m38tJVf=lKhGDWUDrkWB3A+_b^;Z zD_uBhi#n?k7FJM!1A<%xP74s^>ar}?AEp(WO_cA^F!Xo$R`(E!k}FS7%l>!^tMa$} zI;51PkYdk$`QuUrIvGe)P4k+n?CQ(8NJpKn8#SwVH$X9>z;9-`YirXzP1+*1q;ssI z)DXCIaPB9zm@dsNH9$2Y2H+S2WkK|UhZMe?1t*n|vFeSkgto8nAm4%zKHh>w%&KW5 zrW8d7X1t4=$olTdAJk0`99Ap!#^ol1wKm7>wOX$;lH;&;aQ9)()EKHK`rbPvW2MVj z2=asowIQ@Xw5f6Oe2m^ndUksUpbI60(n7#8vNw2SP>DP_b=WsATnpAarbh3=wZFr! z4f+<3iZtl)YJGW04fMnR<0JOP?7erm0t~b;cz$1F+s5Y9(Tl0J;h2VP`uVxtOr?1F z%Qv6u_`ckDsfxFF8FJn26gOs-X??Q?uDjFoEHzyW8SP9>*5((9ZNHV824jZkHo9Rw zf_yKFAf88bcJ8f@72)J>^xKk34?_!3-v;yjqmY6_^--%<@3hrIZw%K)IqGizod`!| za6<-dG1*B=f>qOx5`a9gt}==U+f;>~?8#{Ya*3({_VZMV`{a#e50pb*DPfRcRf>xF z+hvlh+!Dq++p-)1qFx@_D^XJvJ8A*OTleel8!=_CbZ*Aqzt?*Gkg|fxN_u*R4Gmsu zA&*yJ%S6&+w5OX>cW9Gv^=1dmv-hJ=U)g%XjMnZpFUH8Fvd*!5AS_athE8Yok-I2S z+66f?aj4J=bgj3=ILnjVsIf=>i4RP$K0+TA)TS`k&%5ybQE}okB)u`>CmRe$=0336 zZ6*!awqra|T_%=F9y@QkQRB>#aSdQ-tmiV`p$UT#DZ>z(cOeSneK2^!ITv@IvDwhu z>6Q$orQzF|b(g|YM>IPlkt6Tbg;YIuxCB3aFL9bueuPB<|ZX|-{-tE zqqt&q$iT3KMwrtnBx`}%pK5)go}5;~P=<+0m6f#{s$t65dci}c(F_pv1we;j2m9dR zDw{eR51UBZtZ)lA5LWj>YK|rx-f~4ybGt9_G%_G(tE&lAO+P(Sby)_M+H`yA+TkvA z?Qmr*aT$Kq(RG_*p(goD+;tQruG41#tY}s<$;TZJCwiRRb}Y5+ilVt1g4Oi9JXZlf8IIA`8fjk} zdTPz(0U2Tz)mwd9(?6>H8pOo=H{B$WB+|iV#H1aQ7@M7=^s=NQ6t1R>jTdY`pbrmm zhRNhk6idyKs*y-YH;HPJIQ!vm-6SzF6Vgp01c~~mLkoo+r1K0I9cBDM#UQjkOK5!U5T~II~bHr1nLz7xjEWy&%sImD1YJUeIK4fK#KZuMumq;s$I@C@vm4jEXo znr^&mTL6R3dG3eAV%F9rKi&Ei)r(H{y@Z(zrV@XLlVg%?au4A^fL9QaF!n+%8AC}Z znFHGq4!uYpQu{#!*1IST@;*-yS8M%4?Z-=C5_nDh1us#1@GHD+_(Rl|aIs>3*u)BE zyN&DnFI{>;yvJ>_PbOVzgQPrWYmSk&pcfixbVhsGYi=H*LYw#kp>et>L{upJFswg; zYU!nd;8z>?Z*_NorS~6!aZvYnT#NyC;<1-D$hP{O^aNX`8=sp$MISN)M!G+i7k_K2rgpdgcX)EJ=t*59$J(+k?9jMtogNTQc?0hQ-i7JWyS+Y_EJyx6O?KO>e2uOgZ-V>={97PBfu5oRY|NIWd z>D(nvLCH+>8n_p4;Sua)i;hK`b+8Ry&w8P9>v28tgVdNd&UL_N61yaCj0g<_= zx<`HcN)reR|8!3E{4z;L;jg4afs)S97-i#f;)*pBy?L(@E#4 zg_)M?gAG3SchWk!z*7Bd&~d8f%bp%wxT{*eyp~!o;KAfeDGVpS~`w6n0jtWNyiul zv;s1Wk=!gEOk&YnV}Gx!j`)fxCJ?Ma%yW?Ns7vKKU=ba8l9wC3mzD8siBtyZZjCgyPL}khXdqeTTQ9_jpX`57SIN;;&@n z3MC^^7}u)z=|Q(Z~%yru-nK_e5;OFp9W%aWqZdiclYM ziQ6&ePkQFga-V5^eF$xgXyfM{*=S^XJ!}77mQhQ3ijya^9;VD$q;&{|P0#I|%zuS@ zE{dq5A^Lf};;H(IjYbXa1|w&a1^cG=kTZQ;q&dg#b-tadxnTJyufRwmRSchs+d301~?46*T^)5c+B-LhEtWW5|}1pb$ut}u`O zvTE;I%yd*>+Cd822w^@`lCFbkDTfeyj>IHSJ}Eeu2}B|8{)3)O zQQ$7QxPgzVvP6wXluiQGT33p-!h#+B6osjNz1WA)0ouWG)oiYRk* zdL#DcL`?Gh^F$oWc42tzX8MsojYRFK$(H^TpJOXuD*(~l1(Dd;|NQ1-G#DDLK^C}_qoPXw5pMU=!pvJoNkG~rLTz0Z?Gw9>a zQGK)J@q;|=z^z+>1?Qf6n53G{R}<-v^70l$aMw85)N-5EU#tg&2*HJ898+BTTG(Jo z#j$%9JRoyl{lqNPUTGA+EV?TDi*3Za^3=f5226uaG9qYUB%$z;dm1OD{HbhQ#x&~e z#pVFl_v_aMG22;Np3z1MLKH2EC7grzxYBgS$>Wr>m+)3fhpRoa?uMBjTTs zt-!);C9uByBOLf8Ed=LC_W+~JC$g0j_ZHy5+Ku}Jk~m%nE)6|atrZA)ZImPi@iMJ` z3lz3m$0qsrlu&JGu3eQ?fA-A+5yN98T%+-hwo1O^xE=6XQWgqI^orrDnSw{n4)cEc z|3*T1^K~Nlnc_rdq2*x6?iK8*tLdH2iu@I=;L; z3g+|WPwOW#mWH%Mzs_r4PFn_D=)jLxc-JBLyz8%!R>bG8-B+*}dpWO3nt#Y_dbu(#7AB zfiF61|H+z<@pk9v?iZSHzh2I%@lwXI5)hQ@tAN&hlk%rIhg&Om7- z5x9$fVfQZjm5h~&s=R+Id3Vt3e26g1=}%xj8k9}&*%bb!*KVR5m>K%_1`#Z70h7}w zkYfE8(yjSHyZ-;fXAZbEXk&A!WfsALFz{muI93e_q5oWjvsO8s+i?edGhtonr@&`R ze!p-!tU^@)`TeSeA9opOy;F$4@6w3e;q&!mw&mG`G7Eh6KKzGKWDwI-ihra~2~Nh+ zIXlyXE(uC3#*y^eAOwfrJjj(I;|#O(JIS>7`xZT(?ep3p+oSYxRliI;|M;%3jjk&- z*MffA4OH)$H7z+>UdMJhb5_Zt9P#rjR2#`UxwD3tG7i~+ED%LUH#8*b1=Wk!CCN2A z_X_+rHSQUYZn6#Z0(izwloB=eGNIR zDWO+>Y;jp!Gb1zgKYI74h8gC z%m}L`m8Q>pHMKyS^l0vL#(0pTAEq|1N?26#;mjrkzd0e9CX|Z_$G@_uC`5$tU+Zr+ z{BH8^+jHM1R@)3?mMj;hfvwud>B{Mf$~T{1oGFuiiZ@eKz_pzJ0?hOHj=*zS@G<(x zn9Yo}X)-W&sGEa)bAgFCRpI8RV{59XN=K%vz7u5UT604R5^pWeei?|=PzSC7o+%s^ z<=OYX6V(#2pvZeTvX6X+O2)TP<@u+i4sXnkpM6#7oD@%w_`J=k^?vH|h(FSBn` zTAT=vg{;tIIJfxry>=mjgx;IRGB;YiunFuxfJ2@BXfY^=8YA4%-`ju(j}x-;`@*=t zaZPXnCby!nt6$3hm$H#pXF7nXdL3kDTww2YV?MTO{>5C0K2Q@c8?WEkK41O~KbmPt z@BoVPW6h(<5Bf?LQ=j^B;?PeZ@zAndW8+Pm$FDvfWt{km~&>-h}1f8Wjs{sfc>O0Glb>BxU*0XV61mmw&X zn1I(>A~@*vtJ*O$aIvuRF1#uWFi#5#GXIk4I>E?9`~eS3)^VTNiqLXPKJF59^La}( zsf1oGv`+@KLy_~$`z3E<9MzKaC`Oz!h&t=Z&yS8{R{+%yNmRK+NZb9I@e;NJ$0vFA zgYMPTJ}`gXSSQ7C(bHogS32Q$F=~CJ)T4@JpOVq3x}-{Q>Ums>-zgJX)y=iT`Ii`~ z1xBRyTXi{vJ1T?_7sxbJKFz720m(1TA;DOAerKVZ`$?Ik1~I)Y@0G1*WY!AbKtQ6n zF9}_aE%iTf)bWt%vbtu_BUT<=&}j07N-S_OES_Fi=>1M88F~!*McvBDC<}$M-jF%m zfVu4AXzyY+E zpr_98!7!ia_NE*7Yqd$0swMS4?2BuFEPELQZuQ-8ML(Nq!rFyKH5o(TS>U7*uHbv> z*igB;$qnFaSyeh`3nK>htx|4Z|5;)o6ubIM?`)$#y`*aXi-teij2zsc-A1(EkvO3> z2bpAF&u`EPJu}Ez*9ocEeru~*#3lBw?-c-VOh^A%;TA&`I%it`4&g+j?iG9Q3LLO; z>A3*x?{2-(?MbT}27WyImBFK_gZwVOf$0hp{P}i==?>3}NZ|DBUnT49m!BX>b^G5m zTm>=z!mBjacxd&**%##VF6i>QvdOsGd~5~S1WB+WcNO>ldAuNggWqtI&p^6a?y!96 zuN*b zX>KGjbhcsR%%q`0UA_$a!Oz~4!V{4={ZOle=%dD ztoq2^LdY9<9Q!7+s{Cu#FADwotV$liYy1s7mDfAZCch6j8J9S({AY~ZouCkUAkEgKWdT^=)?RB9lAL-IE-9RvrKP>yxFjMSt*DG2zQ)qx zmij)FLFM8zNI6?kN%TZY(9~#P9N;m{iAMkx)+iay+M_n8lPmlX3Am(ofUSZ+sZ5@2 zFo|buIU86wJ079u2| z61X8S;Gh_cW>I66x9U+!RtRCHW%k~!Nabp++ztd7BY3{k>-o;P6{253JzuDMb~19q zZYLzpl=`w8xcF&sll+k-Uk-X_W{oEcspvob%Lf$~x~d=VJyU8Y>u}@P?3jPm5sN+Z zz|_59r`?yUga3=YH;-!a+`_)=h$Dlj%%G);1A-AjKnPkDYC%v@0hxpdQ6eD52q7e> zsDK8drOKSBR1g^gA~FU|mvLH`yjub|dD;o2HkfO;431!`+b#^>Hyz+W~7Uq1;4 zKS{WqB~YG5Xo#C9W0^t8Bpj&tI%qL%tCHDU0zUUBls1P~IQs1tcJChnbxHf`s>|Ju zuVKaSYq76Fq>Z2B3T7dE)K0t1M&|&xfQg<;NdiTs#1WMc#V(MO=a0xP6eF1I{5h>zX8BRpZvYJ6f zRSj4q^%AEmpIyI**oha!A1!r9Sd!a%6FKYu(NoP@L+0Sl(sOkSfM52(p?P=2m$g23 zwVt=6c?eue(<1Dq{KZG|)Y2wv4%%3?P68#fURV zq_6H^IIE_zS<;sSH_cY|Yup=(ZS&nF9N4FURkXdATPB%F@%|wpHMV>SZqekP*M7&P zNm==l6_^$!p3BvUw4zrNeSV21#KA@P96A;8qneMDIcN=D%VC6>D)wTGpbAMgh*U&5 zP>gEr(%X^NJ(n=e5rallLGz(CeCu(iW!_qBKhOa{yIxg())wP6X*t3|Htjuh`IdZl z^JGOr#@bb6=R>=zstfyK-buq}x<5%1;CpJCLz!#O{GlF{ev#x1=C1n@f}mi zqtDt|1@N0(h(NLIUDqTDsA`w!?FY&--Ff^mmF@9$hDGi%>j0dGLuc9{^ zBp{Vu9e5IY%?wFH)Sfd=kWDCss#Ai7$xNAy3r|CSoYw8nazG0DeQ>RUp z`M>^yJq#u~%p}soqy>CTst^KQRkE8uV}Bv=#hv~)fw%cysAbFn<9d(prRlO?J~Tcp zOtyKlM|=r!^GS9AqPNx(9(4Eq|LW2H%z`}Ha@8&oez=a;cVMAmX6SaA6*5 z8nq%~xUWzil^~%vu~`gXJoC`!S}(_w%T8-G!oegE`m^;JrhFg3Db>dMDI6T7f~McE z3J|INqsyiDUrO)=?}j{i{FdL3-F_-Vw-gZm9ayd(RRqXFPoVC`)$&4>iwn0MYJAuw z)4A}bx3^cX*3|-p7lYWZAll+Eh)U$|D4Ra{awJJzu+5gp!`8+{Cu1j+T0sS7yjdp~ zX75Lu-Y~QuRBOu?=~DG<&KE1w!2f{Nt47)m;=rl+W8gsN!)L2(bTmXCLbdJ4vo**_ zTxy&Gm1)ASAxK7igK&0R__lE#Zm4@LxPSvU>oe;1^y7%ghN-xo-aAvYoUfY#T#PG)j-t6cBbW6 zdI)AExitn80T?ARk5Wwfw@W4ufBEi4<)@yCVD&fQofgV(r!kUrl_>b%muWc0UsWd% zTDf=n%NSF@=Pcl6mR*d77O&A`@onp^UvX}8SM!`R?a>-XRJ@EfXyy=EQGzpC@8|9A z!{x*E*Cx#nng8^=M+eX|9Vv0Z5I=FaOQjiy_@n9xWu+v-SAT~TLt&Je6Hv0rkjhiqLFI+n>9*N4b?A6rZbWFa`7sl08q10zgOM-0zX zClKwuE}d-c*&%JBbOZ9C{wa<`>o}i%4QQ^p2A{iSg14=>B8QSze(U1Wpcb^*|M)mD zM!|33jH9=H%u@>gsSb72t9WrO>h0={Ga71{PMxmTK6!XB)cmzaR_AFYT>cT_!-*eP zEoDL?c#)k~dlopFBIT!se8pd8NM8mHmxyA_dX<<1$q@4gYE_+wTxO5lq5=AP$G(SU zos+kbOPS!t9dE>YbkP-hnU?%h9);6ruL$z7Xma0PT0qu0b$e%r&Lr9yl>!3{~3z zB}bK@E%A1l1+F{u_pv?$gvNFfwg!=KO>$}}GlV+_x?QIhcJ{tc=cC?^t#`yN=R{2;cRe`CI-WtMOx@zL)8$i(J4aQ*aRKbtlw(eopBM&M5Lqeblsnb3jSD zfquf&UJMyH51;Pjyt+0LXKZ1AQ+k7KZ@A|v^jbG9#4@M8D?Z0~_8~#u662Af2KnkZ zK^5s70|a5j7KEj!PgI=k)C2MFIF_4TIe1}GSb4Q6BvFMCwcL;UY`Hj{8PsC_ORREe zS+OcYrhjv|U!wkIc_8ovGIn(hje?f;dib(mR_)}+hu9Cj7PJ(AU1Y>eYJFW*>gyIm+csaUBvIM7Eb4F zG(p!Xl+IN4mM9P*fh53mCdEv0G5BGW4ZL9d%06%=#wuKw>;2xHE?dRF$zQv&B^=if z-*Ku0{I_-w59~^>(>y zuK-n-ZaSS!8gW_TUsqiRmSYalCHp#q_Jo41=V+I}i>}uoAqZUTW85{#I|E9_->xp|bZtzYxH7xZ@lyTD`Y~|n z`U{}nE*iQa@TMH7?>1xpV>rmsyfNp|7&PZ)g#PxVwq|}Eqd;Klvm+&yRIPq$>ZN9(NO`csv~QOh8Y=5MblK=K!%M8)+s0Q z>?z19^_;6jQz5Xb`qcvwBQ$w|DHWL2YVaKQ$WNr&|((AKWdjJwg;$A@RI*T+qp^!PPtgNx-R&?9PrT5l4@#jzSqv z_u8)3$c8=uqb%!kSpZ%HgTV@)N3K7f3xlQxsvN7OOx#GWozdr+-fGZGY}MYoEx_FV z?)c0dqMa8u~q<&E7 zo`F!OC7i;g0A?d@tp+F0+}pG|+ia*BL}inuQy@%aKWHH4&QiT>u04WUs(vtaet+K0 z;U6cB(J`p78e~S5|Gn=$F#l$}DTdNyi)XC(qxVmzp%0i&{dEN;ym_gb7F;HAFW3*uyP5PseGX-X1u&ho) zu#4mMy?!bUjf)X17iTwJocsByTTFECNg~Y6IQbC@ijxiSI|6dmuJj;ej4lQ>Zgh8~ z*b@yIKVBQ93FMi|XtX@ySP+?1NN;pg=%vL(h2r~ugciid;wD7ln^SPl-S9lD1!7-D zNF~^6RQ)4Trs|^g>G7I-bzoTKZ`5^tNg>d)zJC4Pb) zD0I2h4H}DW@I$s9rIKkLTL|F4kRm$GuW||C-0p#9Ecm&r%U9TgA87bHV*P|WU1xu$ zEUzDuvrw&PrWixR#e@fTFR&Sb&R|rQ@-Wn-Z?j|)ltQjRiShu{&%xf5{WCR4xGhxb z2wPKj^qKO~a|$I8C6^Mih`JvgdQYeDdGPH(rvr&=z{tXdg03^dH*Zf#IH@jpZXw`f z)`F8r9Dx(yj?b&elTcF}G;m1c?9NK4&bR)q){@P8>9&I02@3qHW_cm*C<3JeYO}wH zOTQFlP6A6e=4sX6EF5o4zQ#@3LOVHiNw(bQ3yq@D;ZSKbh-$l92LgzzhrD&tM#=sHag7e zvqhnJMcB|8zZF`U_NB`LDU=+vTNYMziivle5q@<>iQKfzZh{g zhd;@V^tlC+3^)9(@?i}py-XbpFYG}Eh;M51Whx8ya)$+%Ld1Wh z?6NX!)WCbD793B)v+@kkOPQ8n2>}08_ZABa${`3^R0RXGB9igY^GPrS!e&IMc)vQ~ z@an<|t)E;_erl1atH?)l8m#wkI9%5P1lW=*p!qR&MnVYBqD?zk(#8XiCxNctIQScY z#$o#&^b4rLcn#8H9LaQgfXmZs2E}&ZHAq3lf)=XPxA%5i?1~q@+GYGEJJ)u66aS<6!%)XvGIQ-LTcR=Z<|Qw)Xu8`L2&6xlUzMb} zN?vr9g4tj+;9eIG=P=>7DUPF(_|CcHxyk5KZ7?g)g^=*#W-vXchUck54Cajl^46T& zs}&+~`q<;+L4Y21wa1G;j=LXC7Pk9$zD@fWmJ~MCqZS za5Qx9{0mz|kwB*nw&PU{(*DK#2s#h5Lgm`PMg zGK|Gn1gHLpnZz6Bzee#Tt zysaWv-2rY5f8z`Sz@F*V876ItVO?wUV^}|LU6t*e6b$Bb&SX$#2{S>VRtmVL8*j}j z>)P-a3)U*RyAQoK*cL$e5Tbs{+DtM9?@I&&fPD1SYSi+%kXzH0{oqZQFWl^kdp6)> zCBn{9$jijzhAgT0FcJvr=39IIb|J-(Ag2p|BCWsX+vm&fycHk?gToT$Z%;_}+J)UV z_9ifTL+*sJ`dO>1sRMwnajgcJmA>wBp+<}+(ltL8N-CmYQ>7;eJpQUps0eJwWwN_AE)2-Ca+TMNvnJ+1t%_?IWngDrzV z-LkT|cj~{A6?GZSrqdPM_GFgpyk1smTr0zjIU8d%uq?^ueg*}`i!nv&<>4aG*2OT8 zL^K?pq%IWdOjiVO40Lf98Z8>Fh=OJw7@i^^`%4c%b{qYh{RMTC3k}&!I55(nOi9(& z_+KG;Y1ss~@Y3=7h23{l9s%ln-X(AeNgja~3X)hHiUa(FFLmQzw_T~WJ`mw+Jk2os zoL%h?#zxbvU%<$SHdp#Z_(e2(YB^AED;goxeey5vZ|x6vgRab}bQ;K^R}#7sZi^NN zYhC(WWkdML$gq?xfdl1T;0s2KVyE)_>c?HPI{pQgkT}`Kz90pt;z8J!1~RKiQ8U0b zn#R$mZZ8hX1d5rNWY8v>VLIxk<1c}xRBy*JFrOfSBG+Y3eZ7fq(a7t5z_}i>-EFQ7 zf8dO+)$cdRD>ydGbN$kyOC@#9-Z4}Q=(^Dlj8sE>7)MxNcxn6@Zv~lsWXI>fDMPdK z%1{dRVa@`|P#d(()i$TYmz)x0zx5DEE6m3b>DPOG+|3=(mz({VwB!hHu&o4aaLJfc zJ%0u1#-aKH;kFh-9iTA9I(7!2KjoCQ5vywB&YnieB@OD`Y5V4y+i+lAT}qqn1$)l2 zmLPRi4a7mYo$J5b)YUI_aC7!|#3bQlg}6*$XD3B6TB`!;VXWb5joU^TNi(K-?3pxn z0ERx>N!F+Db-!TW>L_LA2a*l&b)ig2MSPSx3I}eY$+u|6meMt`(3EgVA`1LP<`z%i zJLk~b-wrOEjNuaTXrYMArpP^>)Q#R-kpi9OiO>y!y!j3dj_xV(D6Uid2-FxN9*qqhTT*S#*)wB5;+*R-xpQML&hvZiJrrV>M-?Cr@cQb0{y9itdg z8dt7P#nd2lI0^T1>;dGSNOsET6m^jFd%?m6Vju&d?&Y_2ZopM)fnCD8n1U4%Ml^9u z9>Oh~4TBLc{v&+bYK(yXi13!CgOy)jJU^R+J4bJ5cvq%gcP^-iqKF1T?_){>Rj9~a zLjgsn)6OJ1Q5>j$#1BU0B!D;3ItWO(51|R`Z97zM?Y_=p6VQh0LZ!8^Ww-9Y>AQdlWtE{WHvkN(oMlI>&+{|`JT;JJ05C0H z58lVcjul;Danusg(9N(%l-rPQdRrks5B%yYfU>^6r0VfR&Rga?40|FNO;oz%0)|Tu zAMUif)-wd%bdEES6Jqpo=zc|(APg&GHa9-1(hGRNJKuu=w%|(N1B*wXbVoW3KkkY> zLNE{W_6B3_o%5C#Ftj-lkP)l!(hLmhf3>wS&0Wibrf!Enh2`WzJ!C(q?hX_HwW0Ql z_E9bexw_u$=H<_%Ppq#mv^%mSe0e8C#7-P<4_^9aYy&}K(n|=mHmyV8sdN1d_pJP@ z!XA?XZT6W+E*o9@>x=%i3p}u*W;2xb_k`ppZ?sD0(3z1Hzwdok*oGZl&-HLNhjc&``6zN-*N9XVCwmos8{K4~t zu05A_^xQE&W<`XJRvdo%+>fzk>*h6&>B~rdTSixp?o@WNKYZ#G@x9I-Zdytp86`*@ zjV)>T!nz^GF;g>N0NY#V3vNeu%wXp!#UfG(yXKeB{E`y>kPls57 zLq@=`ff8*rd+73`2P%km#Xu%7yAGzN8NDv~9FCKLP0+KUEmOfiwoGOIwq?r8pg>!u zyal#Q#Ueb|GIh;+eHz;h+4-O?(^}1TtS<$7KB>d*b0+Vemfk;nJfPNJXI^ZI1S6)1M?fR@eF)74p$oI+f;U`BI0G!mjV=cbmQPH@ z>7(8Q=@adoBVvGhA>xxZck$M!6=Z1i84YzG{lH-5<4_VboA60tM}T<(?!!T;hmazm z(*NmNt9N`D-sz2HSFO*roOyE(a6%K3@Cj=d%{ko(i?d6WOF)D@*^sV63X8F$QPGLK zy-x&Aor~PL>r6BYxoGppG}%M1@IYV7qRINq<#){j$<-Z_Ymwpk;qBge?JY*Lk()SV zCI?J0i;i1IyArTCZ^_NoIx(kjj&VPW$6UuXmkXKOE~({g20Ym2zrUFIchyd)cE6EPP(-Z8V4#q)`Wbgxrl9~&aCp^e889ZvUV=REN-+XiLP2@(|%VvF> zWwrxJR@dCGcZrJ&p`GW#cFBPxPK#>(O0rgW#p=G`X=LyjP)+(0CnIHM^uT^G7zIsh z%K`6H?{9zaB=Wbe19ok8h0QMH0#>q&d*Bf}vblcVM#q{^VEYc6yE(u-Dm-$-p``FZ z+cE5E0qjiai%8p2^wi_MQ{<_crU!fIp@Ui}1XS*IQHb6k+A5u{ENJ>=Ps$@f#z9}J zV8YxmEE47?de_^AwzC82{=NT7_vi7L0k6BXZY!YvNcR`dr~A+SBi;XP7F#m&{Gv2{ zCI&$c4H_-8*~J=nOONkte*Hm`^(ebBYa@cs10%%Uk1W+9>8uos`?b+a%J@Sd-q;R` zlZNKmwY_a|;Kcc?Wj1@%sQZ?D3$JoTAj2Cxu~kMgvk0WucsEu4kMveVV*NIBv6=gk#sEvsk~Pj~+~B4s*oaM_~C zYpoMwM>ww``!^W2*<9>7s|i$q=tf zRv)lO)V*V#1Ca(JH~|r$nekFHkr%-`;_#)`m(WnbpaxX#G+0-o8D>#jbHUU2twE~^(PMVVT3?IlFC9m-sc9~8N8@~_m@;T zmy!b{E7^|iLuZyfF?c!vf|)>J+P^DFu!3x{ZO>mP)Ux@@VBr#&*Kfc8)nEV2`y;-#zc$Pg(Z8U5ZkZmtC^V_QJw~VAr#K z=X&0{YYgf27GJ_dJpPlLFjn^BLhtJGn1I_1jG<_E^SvvXU%s~wHRMMX32|G;%+m!* zw(^{|YSGki`IuA-8);^)hEN={Z|$&i#S4rpYyr^++Vnc~aZbW{@g?HITPD=9hCdcI zBSLP;WNEm0&6l?dB_CYY zl~y~Ce!SJ%i`Dy^pt0fxN*+jBLEfUh=;%M+fWQ1;MglTeW`*UF78h{Z%VhYQl)kn^ z@dR-fj@I9EpHb>X3@e|tr4QKDV_xW1T9l91f4IHl(zT32b3ZS0ux_123dG|po^b4V zUii6$5Hd(=Qj|~2DxeAWZfqnDN@xWgiLSi4wx`SFIaX30RvmGCHsi(9x3-^TSKrtS4f%ekMfvC)PKV^h z;!|n;0*9l&{o^4)4>j2o>b?IdS=dWIz zl^_w*Je5#`b4Kc(HRo0tD_c(&mP)s(V<uNiQ6mEBDrM*f#4uXdbk>RA zR?}`5S{tL%$sLd+kVJj3P%H>=a`gPcK3xzxaKmpi5fiWRe*uhel@25t^7b*nn!?ye zN;z0G-~C8b{6o9=Q!865h5Lqdf`U8=b_L4i{`Hj3WJ30be&7o`CvQx3%*&+RZSCwL z>eXG)ot-Wre*3XJhPM20%1R4)Q!lLqhfUtCv(uL%!9$~Fz|7J|UbcMjc-sA2$`dt@ zNb4x0JFgoGCT7A$T#Y>`*+T~%_F0c;`FWkluq+k~X3Rg8|F|E|`1^kR)_qY{CH%bo zOK*e*sYhc^I;;FCc*Vn0sB#A3Pw5-LB;)U&b z(6Zf*>PLbvRdITI>;Ceo{c&V(-}-?7;+dzf*1q3hYqi<#o9`p|$@Xi&!&5kHTqdB(aXn#HG9|4e!^c$MgKs&)sV2S5*YzMpAl#MnKl$F4(V8mnGJi6Pj8M4i$5 zJ8S~~2W-NE`;jDrsB=jtA$`=@0~zH?bYZH$en(K>CwI*%_XyR!-ItGdMW|?O;%rgE zZSOUeDX=fE@z#d3n;FfDSNI|r0o~-LH`JR0?}d{lrW*H^NXNq%on!oj(Puh>2?Pg8 zydG!hUNiEEX5s9G6a5LB7;|t9fIpiC2lKDsU=HaiHsA8c>HE4q7Mg+st(f$yW2cCv zl2Ix5?ONLu9A#|{?+pKLo%#I}J!c8ltBbcZzC@y-fRij`Gy%$!dUPs7OWE4>lDben zDN-H=cF6I=dL2$)r(zqz+)DYzm&{d@Gk+BgSk*G(aL>bMz4j8AZt6jbH13FS|FsA_ z@nSm6BIP|6hsY#6RAjmXe?e!w{&=?MaDY=OGN%_l=o!LYIsQ`h-My7>?_tj!RBUC2 zPn`Cc<2*|jE9KmIo-f4!k>|5F=1CMgeW5G0`wVeo_rQ`r zH|t$Xt>duOBK3EVuHGN+}lSJT%CSarN<`g;$ zFACG&ha$q}$PWvg(t8tf5OmwzP~gZ)4Puh#+8CZlw&SIBC;LQm|woX z41KYY{rW}?r|q0izixl@#i{bo!~HKmIM)ry5pNx~>{;kd^MT}u+ASTsw2p&K{OU)$ z_7{5^rT_%Nf}8lQaI|95wZ??$iU%Q>$sM07Y={I7c*lNtq{vI!*<=@*^!p}0^)H+F zmR~pVNwvpHE6v|lDod%DX=6>(5jdGTb^0m-FAHz~W+G&~x=h(znsuT}AQl5NU$4{M z7n0)x8Lpw40A0b24I5#8q;!fJPZBR33mR5q>X*12I=k!2i3U^7E4b@dbj5zwYhY;t z7`Mw%_)X;AmEV3v&UvkP4U*a*W4943q10>a)I(jBl zy| z<=l%E0CScq%3p|FVZRRidfk<*RGYI9xgy8~AT;Oq-h*PGY|Tvf3rE5MdVxf`QxGZr zs~@G8jftGLMd&7*H=(;UGdp=P`aSPz3u;b;YU*hi8SbO`cR9r&w~_?}4OmTkbxZ(< z2%C-x0TXSbs6cx}Q|G!6f!NbTer|8oQbz-bToL$hHvH+ktwHe;dPF#+uGXD6!B+2%Pw+fr`-y7&GF<_Vuur1@_(>*Y1QF8rJp66K|_ z`o=-1=-Rd*mMispa0DG|Vl0T|`bG9#Cu|q=cnS}W2U#!k>tC+8>TbQyj&+{IJMt>R zCsH13*J{xT0`km-p#!|jXA%OBPd{E#S%bv8gZoB{Rfr!W=qEQK+g0nDvVRH97C19H z*^}uN?j7~T)0|vSij4-1FzucF;6nD-Rq`}pc}!aJM8$o1*(q{1Rr4_76G~#7fR=eP zb3d$7RIEpirBq~r@R?XWPhB2sADFg^?U|ld?H!ZCzpavYfK~E6&@AoiNxjwX+j6Fr z0yJlKruZ)e3bus2ch4TjC4k@W@UzR;pnFV5K5=UVOxcDW1IMI?-Kf9)LT$@y-wHju z{l@Bc(JjW9ApMrOVIBjx>&QWUo{`xWJm$eQ1?zQHkOX#fwW8)7kRmi*U{UIifcucE zMOXCdoX8em4%4K_7aCN{R6pMPe(~~+^q3`qN)^R~`;8mFgY9L_?#|1om3b~5A4^&3 zH|o~GM%Ie(s^Yw~TCg7C*7w$AzaU&V_cl2tHcvVpD-+0ie$aXdYt8K_7vX(|vh%2} zDM`AKxaZjj?=%Ryedz-9@hnWP2>g1ytaS#*%aoJxz6Fn$uVsYQ%eBx||G~KUF=$#2 zecimK{(bZMHA!DZWX)>2@k_M+t0b12l`6iJDHVw{_}XU3OZQ-du8&Q%8vYG|m^t=ACS{DczPdAj<-AWnaM+Grxl?N-tybBvYdp znUaF(9(I_AhWT)SG?!o$&extA9pu}0b{GnWwDJJ5>7D@XHNK^{`g$pNG$UUZuZ3X0 z@pq-RY{8f}tF_QOqpyL{`NyW%*UQ}!ir3$AXn$@vo9gQN8cf*BcU~W31JG*w)*hFu zYn^f^NR(-e3j_vJ!?a(cGVj>HFQlPWm zJ%7{I?-1j#WVh)Gm3yuSB*wk!>lb^%4`sI5h+CaWjSrcXl$%x+Q`o7h0uaU>=&9kNevF+GUsj*@1=gspNuKBdy1+f)YD$tALO<6dt7s6Hq zBsa`wfv8~F-){G>dJst!qw^x4UDdVxQ!sEB!P7VB&8lr)Y zz>ej?1tQUK+4zG}g?oY5c=i-^O)YTZGGba-NHt(Wn8@i=rU%H(Wy*ziqJ;%Dy>Nb% zuX|FL`@fc2T^G9se_d+L$akR7uym#+*k@h+paY-zfXO%B8cF}OVV@91{6tdPuNOai z(P#RKy8B*yMb;ewqV7k846ma4xEYGIucYw3b#BHBU|#?yjm4#(pp#}{rgP!flV$`e zWUe}!ER@|Vt4M?z7C^07yVL+sE2s^CP?m1+m*vVI-Js=43}pr^R|-+Xn=^$l`c%E6 zWvKvEsnLWUSY3GCuOeD3gEqCdMs;fV*%;d>3RoK0B;G5CTG4AjMh4-_&u^RjHO@IB*FMMs2GmcYI?3^OTIbMmNe2KQve++OMXw}OH2RDk zmb6hkP{qh+@&Yk=s#AFUXdj$)u0j-@2)| zc(Ldb)xL`7JoTZZot5?}u#^;ae6S0LMJ+e@3$+6OJGEjOqE_6~Tc^wVlUl*}2eqR2 zAJmHe@15Vv$~mn zL>?S1nS#PP${E<*UJZ@>LXtjFKX$K$X9=EpYG^p$OrigR^fhZkv9@X6A&hHs>`5n*Od+7v6QkR^fe)pr;1`~r$; z#Y@8W;|70Z0Ys8K@$?FzI9$JuP&5Rcza`wwU%)w&36i(|r+Rl@>)AN3^GZjuTJyeP>=)-ao?mn1!A~;puLQRuDqH|KfJh*;%*>EZ|HvCz4N-|oI-qchBST^MjRc0l5g>j^~^sgH| zzw;{w0l(rBkQi6mo^ztheC1b|${t+QTn*eofM3D*JHO&amWIY+d-PB`%PkSse<$EOO6=8&p$&}8Owota&o20CKdX1Y_uZwuF zEiPT4|E`@)Z8$?A+q2Sb2)XHf4I=)F=q-oRO~#;OQjiXjxd7hbH7A3`Rw#~rvJ zj5ocL64e||{NbLybO;ut48A|KuGbj#(wBrg#mv^;AQj?i z1RpqlN|E3-g}&lNH~>ISyx}q%={NuZ;LU7sV0RC!wmFtT1^JUxqck72F}X6m0QW=C z6@1}o)dJb!4TmAFG@W#+Hj9;sH>#BpIxXerbb$rm zzC0a9t}fU;Ah$H9)2Sk#62!{W@gsw?IE$ewsy!XuQuz5Zxp5z5V#?mNAzK5UJ1*A> z{$}K)SQiy z2`l}B*Hhu)B|noQZT<9q-yFbcpcGqddcyy@JHQ6J1I+xNluc8SdS>V=FF9~d=Kjpg zjsL(`B$+l=r0?rsru&rHtXumBzQXLA_zEwX2ei8I%9=|1cbQmU3HX58+A8ejDcqz; z7^e9@;42u$_NSLIQ@TK4?SHL^=Ldml1z-?3SQxNSi@ABXB2bs54#gf;y8$M*jwuR_ z*DiVwooEW*gCu%3ut^gzdgFa%sw*u8_u&Q@1f?l#iAJ+x8sei1j8CAm>tfAWp;Ig9hs-?PB zs{H#EAM6>1uRav7L5ajcnL>q1M#3B`3;xz^nnYEC8rr|pD`x&lui*YcuNV^W*wnP( z74sSMP#}Wgf+?E~P|BuFtJcDd9H>enU)*!%38!W?lWVu}ZyxX6e|o%kbo>yBnIn$y zvgSSB_<4^v`*)A`!0#UKVV>Zd9&ZYhhL!W z1VNE_qq302Ri%#6nnB93g!6ce4Tg1$u{OoZs$oq!|9Gj{PDBu0#Zui-%|Mfd8FItp zIV_7c-ic~M0mlGRL2c2WlhB3m#W6aIXFVFP;upjhYcGQgE+>yCjwYN&Ie_-yTEMf* zK(lJRvr*o8N8mAHi3W%?TfSC{MNN`>R*<=I{e*7vXp~~mz)>YfMnI6_XF`p!Ie{Sw zbQ}g&cXe*XgK`o128O=3?nNhzN8E6k-Tf}C>A8if$Zm`tH>)JyNs;QTFn>@PXEZ=t zD#brE^?0fxz=%GYt!4hePwln+kvBCCDT1!l+p!@oyG2Vs0g*lO6WRb>#5UwssFcTG zYRHB|e!*kzHfy*kDRQm*hQyOOf@YMJ+H05qfJ;tG4h5|Ge<{*{T;SY?Z4Y(anzGmy}F!UTSp!S1%K|dO5>e z%o~tar9L|Dh7?Rpj%T_lT$n%V5?Dji%ZV-M-8Hm*@2}V!aEcUzVSl`0)w1ta1k8TF z?T3xm{ia;V0cMvaO-)^}6t`X!3nqi?KICTYY&LAHI`TJHZ|C1#y*%LRO#|tny}xKI zfi9qP3&JaG4?mXddGUFK6Zddu@&K#A>)X24tv}DEgXbh70hB&!lrGJrf;s6OpA8ww z^nBj|V^~jP(2I$Rl+mdd#^#-aF2E(A#~IdC&q?Mhjn&won|pI3u{D(mXuplTB6CuG zRGQGS6aCWDNzFj-PKPn)$wuT`>gPNvsWXA|jKV8vqV3i!bFY=DCkORnW6?^)dmmyN zibz=lt8W#Ev2veeY!%Z5$jgzWxQgw2Ml0($zcECrM3BhT0RS@^!Z*Z}lm{WE z31u?`GZ-hceB)QYX(BIxnFbt~jiQ=BHIOU+M~Sw8@Y@0jzZb<7=+19W{bUu%kR+~` zI1S;hPv$;aL1qFmqUFPb?@LZ;TajMdMtG|E?6vEwDIu8QE_m73-)MQ4s&h*6LX4}` zE(quG_ESea`|@-On#X1{Yz4|^ zt_bLDUM};lOaz;q_*7(0#VT>=ix%HckIe}!kIT+fS$%*W18YQ=PNWN1%$NAn|^!^gAsOpV*8FWmx!5Bbalpb#nXxNwUVg;^IC)&U(V8& z_r6(C1h+Qz!jQa#i0K#3BSHsPiI;0bjx8$4%7;mhJ8L&rlReR)*RwChAEolTPb&P* z9%%%8GYn}p7Kbp)FWf7-|0lb`_jh)MOl3|MyM>+~N;YXcFi>N!M}qU>sznvCOc{`# z5utS_xf6@Y6}2{XoSo?^bK%L7HV1U1eco(RP&=u)bUEbnzrH(a$G1mD$wX+|`lXBs zdjUmr3$*CC?!dA4lTyLsQuAYh73BK!PZ5MTBZcd zZ^Q{VQB`W^*r5*iODYCx2Nlh-YpPQ13#H?~g|3+T59kUnASFfPVv5X% zH!7{%i25B}F&(;f`2*eMyQd>u|AnrQJB7}XLRiB&d%33eSKNc#zM?BEG?wGA7YqI` zJWGWh)gsMPzS>JSLW6@Ni)*I8eT2lgL*%WyW^+!a-+s@Qe-B=x1Dm2eH-e%L{>m6& zdOx-V(zc#GIrUVLK%Y@8y2JVvCbGSnIAl3dzdL9zfY8P}r)8cW1*5GwSm5;lLw31!4M)tTmqc_*vc;t7FR5i!L=`baZ}3c`BZIG3$e z5k#7@m{{4#?QP2}h{m~dcI#qy_oOrPDJmgd*wgs#*+wW#`M;0cqEFZg{1(DPX8iz3 zG?q6pLs4hS_}v@c&U-DBQcH5A zL&u(%l$40aPf$!Di80RMTj&ZUbgx*IM&X~Jm~eKJ{4f`*iA(S0ewH=et#d2ehaWQe z(dp+VBNV+Jk=YQXqA3lqU2D4+k+ZWa?pGK1O*L+z>T36vhY3_0C#&bt6`bZS#IUmn zZBOY?rk|ul|AsTeiA8-=sxz>mu~RBwN7m4N^X?x&1t0obtkbu*KXyAqW9jfq} z4^9&dWhtQ%_Q+v}rsyFpR)CihfHopzIO>!2hT!u-^nDZsAew4k%0K|nR7+oV{uy?k z=PyR(4~|hsS?O+_5%g)AA;=y zpOEq55r8Z9wPB|_!7%>J+ut5^16=WD@G0$9jq)(Ku~yfF;z$ECxbc&_wwc~ZZh!@z z&`+BQ_qQfexAppKAY5*nbC0GM3|;;$V+1jQpbK!SB({gO3AXXK>16FJ{VW7R}U zGdR%*mklQuV4afkq>+l9DIHA#{0GQ;5kOz~om}A)bUh~e{O~iP(4^0OtzKUCj1z!6 zAl}vT7&8EkQ9Dnr5dTiDxI|YCE@h$%qYE1uq*w}Uu@}$_^N>PyOzOxWFFxK>5qAL? zmjGUE_SgUIJNjQo*UOlpr&n;<^wrD@N1Fnlc28Au{LElOhH`pIosA55Z|yVlhei>K z)BCCAo)vCGKc|xF8iUdcz?wbPyjQ5oDGRN~br4Dsz*!VSS4Llbk&w5KGh`P&q0K@j zN@xyCG*I+Nh5%=BR+Ab|XxZuO1gm`%koQX6k&OA-`aPt$!}-WO6}sIa@Z%OFuE zPGg>2k@Gvb;?NTv0=~kHaIOYuEuvM4rc&5q8?{LI?z!O{IOc)~NFKabu}H*^86&9H zBB0xL|1X{O|2k{>^Mi6yi97a+Li?a3*^0K>rFGUuK=#`I$)emw9WZjHdF3{U$ZV-y z+h{NvDYv8~H?64Ot*)T?kPFd76w6~U@?8-WWk=zlCaWzSMjywW;atg%MAtHL83*DF#}2TKUbHpU?o3>AIj=SM0N(y@zN~+Oz$Sh?UwrgvZWq; zg-j<^KLR1KYA!|zwyhg-pOja8@cbzI`Gt%}q#Q`FQZBTcN-3Fg3iYNK5l`&*vc~ni zD>KG!2nGtd8JgIEUS~-J*z2LR@_MCOUYt=Zi9L}p>`%#^a3d#5Dr%m6!H{5mBMeUR zyha`o5~1-|a0MKID-O=|{|T-r`2$?BK9I-mUQq&{j*V*mtStcr_O8lztO`cQgi|k1 z|F@>^74+K?);xayS8xTw8)puIEB<>SEcQ4hajenbX=hcNh_3(knY7}D8&oH0GtZ~J ztyU__(KT^B8~a$M@`LZw>WV3tdGL#Cwh^gtPQ?rUu&~JD#9q|iIj^&^IT{omrn&A% zl3XkA=WqZ7zc^qg*3+Yh76f}vw~8*D%%E<47y}OuW)VtNn|<+toQ~UM&r50s4cwp} z^3r?yI>Tiq&yV9`2w9D`KV0%=mOYbPpL5?dDhSc)u%|aJgA3Y_YJohQP7loNPcX%_ z*VK>?W&l=)!cU)w+A340bFYJ`zSd0Ogv_AYNSF4_n2N12#ID&!&?+3QSPsR9JvNNe z{&vBVd>1N=Uy$}kFH{&q$M7%b5=FnAMpXehrU`H}z4kY~cpqwX=ZyTw4lr#B&`+M4 zxe&t}IG`jnA~eY@k-B>s&S^AYUvNBc51JGz|f>>I~R9}L7MyqfXxQ+0v+HNPc zomfT3PRtyB7xQOrj#@3s7sOkEa3vnHbE8W5MwI&d)qxKR0?mj8UdlFWj20anQxY5h zxc3naO!16_-w|cP?bDh2dt+yhu0esVVI#!!OCLO-uI7*gm*|ZnyMi^+NF55~44VXj za|&G7WDLyswR-=j8UJc#g8<8Y{p~_0YdtiVT=k;LVHwln)G8!&D**)8#gB?f6X%J8 zwv4-qiq6klPPmKBP0+bXy?&U~3|od>Qbtt?!75!aQf1-8QN+FatXgs3a^j^Q$3KEb zgt<3|I>=CPQ@DMcUQR)}?!Mlde(aP@Bd#mlpjNJCGi}@V=gzqijUGoItl>!=^0a8XM-Q(f6yrzXdi62R2G6c~r)WyJ~~BO{di zej{_Qj+&--a+B3Tg@-W~_2h>t12^7|o5=BsJ6pla|KV_y?gAfADAZ@0QZPOXc|ri1 zmhtM;`IP;>z_NaJrPJ}&XSq-M4^zYMVWZvouKYz#I3~xDBXdo zYUP#_yxm(POFEJG>1jcPTcXGd0jyT){FiLQp)8FgyR;WN8!2KZq>TP}TGX@GXy#F! zu`*>bEsw?nrALbEuP3gq-~m0|@?4F#lh@ojkX^WCS+i??VJjg}SSZ!$gquKByp++r zW)g}nO{l1Ae=sbbIX1_d1Y^eZ>u`ZM?*uCM65L$upk@wRzws{qQmoTA6R|Gu74zWmauJ8CZ ztKzdC2r{smPbf`k+H*npAeue+6Y9Oom7?g59H3@KW>~D@BxD=COLb`q%4`7anQStt zU}9>fV2P(1(<>70x%CRTr{lmqJ^uN)`U=ViCxuloCt3OHuo=aM-MF5JO5MkVL_e8T zi}W-e!&tctnR7kFL4F)FXBrh*b=zocY@oTVCOnCePWliFtHp3RRLdlNW+_?#jUh4G zK%4sC+zx~Pv)du^0H_(Wj7{@i?=;BYpsaT!FPyXfP)h1`MQ5!$cQzob5zY}>sJ)oS znCAcAF7y8hyG&p7iT`{CLoN0}Od;Aw7Hr3CPq1tC$W3iJm1Rkals7XCJjRw?mA1$u zF?lpc+Ty8uk4S%7mJI{}(LlztPLbp+#nNm-k$V{Vv!tV@*CkLH#GOok6!H?P@R{8_ z2Bu{ci5K~)F!f4Gx{Nj{pj_U_Fv}lAR~K4$k`|@ik2c)2DIj?a4fEIV8wPoSf2NQh z+Dy3)(%Ke#1Sx_IYoD4K^`W9@7tP4C!%12iy>Ke8sr||a;U6jFkPCV~g**h(!!Q4K zRPo!J2)2iy8B(o9;sUVMH@`qLsHzXvm>yBS_D${>8_d=&9IAI0ecXedO1NOqbdS}2 zp-%bii9n&OMX_-MK^My8c2-L*$UxT3f=KS9%zuyMmdrAeh`hx*$IZ-PzAzgsY zuu&zTWn0HEt{C0ApNj4I_c`5{Z_54>tyZdtD^|rehr+f#(qE*crMQ{M-Y4@G;U0lB z<0Q-}Vio1bqVK8N2P^c3d9)XR%}BJ5G*6D?0OU^CGzQhvRvi!&jL8KS`cf{)eZpVC zd#br=FI^6uo#(biZCl_viaY>SyDChm+HG$~cYnL60o5+#0$9U1AA1aP%$#A$cojW0 z5WJYWV0iJufeo9I+OG~5_M8(o-cO!5ToJxPNmFVfChin{rkP?nq&v4`7kagfM{CL9AKQ=E)K^&a;NTn_((>SYCKlSA(uO>)tG7JNzrD^LYy|>Cr?)h9g4@ViO|HlMALiaW zsL8zj|6LUYD zFv-#>2Q7`W#WuAzu_w??>Vw}H9WDFZo_E)tD!3kVMfOvOL9xP6wc}kyWwdsmGPX*6 z>n=LICb7E9Y7MKr#~a6sO{!?Bg_F_FFrLed%Y8WVL2 zQ$@BJ7%fV#tOP)oV72Lq3mxE481b*%_h*esz(q(e2e;KXoNIwHSegB;#$&EPPJA~Y zl4>tfS{4Px7zptxxrg?8Qb&9JPxJyAvs*%-FL$xQh?CLd+Sc^%HGyau;IX!Bi`4wF zu^zp0bgA%A>dKHEm?KgLLBsvX+R7WXD+&?;VDkM3!RMeiu466DkUC#}?HjO-f1dOG-HYpfOX($!=dnOA=@KNDMRycHOb$pysibDDS58~2 z6odw<-VRb}(%nnW-*?3x{|;(2$6rf7{ud2|uh6#oH$gH!uIR7&J~LBK4vsvRqaH4dfOO4V@4y?ycc&>8ysssCwj7TKWndRN6KJq!*plbmZ9k^X zvR?v~*mG1sQRkBUTL0S1c|DPcn9XnS_>jRp7mj64Fiwn`ng9O&M>?^_y+DEk?B&!g z{omfpaY}!$^!oMe>=bD5R)ef`&sxDPi+B@RqgCa(&dh!!fo9bCnCe-P5;tBU0zA~k|Mn$%mxTfCSwO*z*4_u z*FJ_MP+y+@!yq%8@qZ68TQJtTh#% zfWs8gzRojQhnU`~bHgXZqPi>NN(v`Zv}V887;Wy4cbVw~!g+cz-MJp!bY;D(1(3)n zMV!zKCU4KT(dvDErYMGwQ=5FpmrGf~Jw}%(1|9%GuGT18c9RLc{O>)XTJdmcgfFMc-0t@Y$ZAQ73|28Mw3nClMP}zFYn9*c}4N z@eBc_EqsZ{eg3P%Cxm$PJVMk+d<;ajJ-c_~*@t?5h6Fr>Ed46m?uB{&BIJonaqCMw z)(ZiB7S&#XoXfZ`P_ljmX*LX<_AfmT_!{Hq)aH7ny{Cg~EUSRL!XgE6tjwooxxz-r zB?~DgqLiJao=*NCfIPVdemjY@Ta@E~z;MeSN`O$@)Xuzx_d2-7X*f6m1qbppob8x} ziRi51w->RWimD`Ic|hd-(Xw?0PdkAy^Dp|vHEUOdG8PWSL*y>NY*-qb*zfOuSx7P1cXn|erKl`{Tp z0q9uT12mTZA5aV%t>AYrvK54}Cc@Y}@SJCz@+kv_bJ|nb{;~@TRe_I8=4ws$K;KM# zjkLP`$ikGK2i^n{Kw-?U^$su<0u_rE$7evVDH{phcfM5yJlxMaJ!WS2|65c<2!%TC z!$^}K8~D*H&!G7iluDeCY3eD-&Yb#Z*~>cr8<;HoBZ;c({9LI*%VqZYpl^d3Yla16 zQ^_SN=fCQ4VgdYxIpL&kPAI*|(M3HmbaTWE)^<|k!QI?<+g@$8rR+DgAL+H0&=t19 z8tEl>;x^t5-yTLWqCC6Da<%!|!$wzB?Lx2yi^68*mgVCy^y1Pcrkv(wh90j3XwZ#Z zZ)oGRQTTzE8U`IAX6-XBlZ^)Js7CV$b#aEbCkuEIYdKn}+<%TgUruw1B3rVlV=oGe)Aq0z_iOylow{;Mfj93?mpQGaK zV@&1+EcFE+pd6yNgaeeiy6^rjqt%jO`&BAVW*flIY$19p(F5-(=W2%y&w}$H#x+mO zB(tcp5d5m=+BmS!jFs-bb{+jtNV&3k0J&hTnV`ZfXr zuy*V5k{0|QKmx5$g3$;1Kh?Li~76?v&)P84%vlic|IP z%w0*A+gqzpqx<}dR1u`Um()vILlEK~a=|C?J8}RERD=&c+kK}?8s58Pi$daOG=zi` z1ARS9DH>l$;+LaJ+UQ=)hR_du>nhPjVK`n8Zkzq${2lAhiz=-A1nbXz`f*e2$p-&Q zG?b?*b4UyTupOLMUzk$2+=D49>&jdi_HkL%qR3|*4nVm~*r=nKkZ#M?4Q$3Q&c2SQ z9sr2@1VmK0JKfA9XzW`+qPTEEXJN7rBr0BFfr`+3DNKeOD3pNz^Hur73_oJ!W^zvj zP|xf4zaMn7zpT1V&I%8-hTX{>_9Z}5g;gealm>q}*&|)4DW0gpr%!=Iyh2i9et=OS zIQ{SA-zz6qg6*BXJL0fE?lG=k3KD#v7#qGFI>qODoR(rJ+F2H)U)wLo`;zW@Ec>-A zRtwjE-Q6^@Cc;J4#6=7?gVhLdo1T0(EN^xe9D;u!V38q$Ya3-~ zuHq7uDEv@kn8{G~zunD7>v+UVpt;WW%NY+tOLIOk%2>h=5uf|bp!rhg#N2Mxq-k}J>)-Nh=J%G#LRU`avY=CoJs_mqZ#(LVVz%j z>Z;pJxqq}V21^faIK1cn(+#Gb0s!25GaFU0TZaoUD*89BueZ{CJNWXlqo0KCE$CVP zvZDG^)Y}2d?ot_)TycYId2iGi5x}i}v9Gs0BY|**nZ`f^_GcggJeurd(30iQ;n?6x zFnFv$2rlay^RfmCcG-F@wx}n~jLU=6hQ|JI zUM6SDRn=H`c5naKUOlr?@P1?4{S~+Iz$?JF^)G`|^YTfv8Phro(>j&`SV-*Qm*v)u zAIwK3K>F5`nJ8bW-x+RwUv8Yo1Hp!Gc}+HUN+Df%N^L5_qQII7>7g-xF1Ef)BP-N> z@&>LvvAA8id}fWycu2sOBL_fNg0JJtEj>Wqy)}zw(LF)on9O)h#x-J=;1sg ziTAtpwC-tNod}#p`}NzB<%DyW_$SsN%(f9SUEqi{coR3(l*$2I#opT-mM#(9-_(;w zHebVOC?Vsh8DP(EKx4VHp0Aw68o*D*fx`-RjehRgtGR!P+deSfWejtS$qgQj?EAvn z_E!2HnI-*?wr$0tw(Tr!%yA%D-g}J;6BgY6iYlpyGKP^#81-t(vshtU(5PPpIBF4r zx%V5eowXbVgtMXLtOo~TIql}ZElh>JngxWe+hxkxN|3^#%3$Ka9rj{`hj>UjUFUwY z_6>w3So;JA13kpAck^Yg6@pk^R*QttaVN zUR#=d;LsmqLml&L%IBjdixlQ~oXZ0OpwsS|y;<|mSLCBYLEy!B>nJ@$Iz$Aud`h^+ zhd|ROx6H~|$<0rngOT;Jf8wVC;3aYTc1+3LPY`+m%1CS<>ma)uAmUcp%0e-mV5rdV zBsE>xZ>*MIVyL5wb`(s$(a%<8pvvL7`>IBSr{q~Nby`6+v2 zKG8Z^Zl#rbxz`%md8Z{9s-@h1&YV)aUyB3P^iy2r%u8QDB7M2CJ@DcaMnINz6C}f0 zH0iz{Un!t&7;xL`9Po3Z!e>ZXl^9+qEcN3g9#^fIwl6uj10aI5WP@94KlRMfdmj0O z1R@C&s}`<>w7dkGntcArf9u3l-+_GY@|0h%{1C#m9W5{22CIjg313`h26I*z`-~j#0;P8{e>Pe_&Ug!r9^aYq z`eNZ`SR%sZ!&qraL?4Ff)R36V6Lb!g0xcna1I>*UQ}inB^BLB1(Z8f~qn4-sjtyoievNqMgatK09YB7~8mc4s z^4_O|GA7O*%FKFK=I6P?d&>owN?&~Z+sf}^IFtcYS09TZ_J}@GR2Lv_?I=ri} zLO`f?49I*O=P!3n!+mUR?w)tH?;98a6y5fy>dFH&PNj@0#H~> zIV*2g2NezC@#w0UPAXl0zN|`I#!ECfiZshl+CRT!iOM&*XyO)~*P0Zz-_^SJibq}Q z8ZA_O%z^_0F^r>ZD7D&Rb+-+t)0HlhFtO|1h;S6b7G@H9=g(k;J3~h z$eABhAkF@(7ugyC24{tGzZ?9kBljN-hpkdOw}XS4#Pv4s^iTdI`Bk!zim_P>uQ~{V ze(A-6MCF0XXPml-^W4`Id2;D_GsAj!bT$yqRYLPX6ZNZ*;Ll1k9G$WQqL|JNB?eKm z4k^^(kImxD2}4`mtaV9BrrxUDGf}#I77Ip>>Q#pHlO`?L^k66RJMR zs$(ydhBCyfv~>zK!nz+psKK#KZZ1JJx|JXy%_;{(I4@_Ei%1P*is$apBDTtHX1K~Y z$sQWb*@xD;w$lfLm6ikS65Py1QAyeZq^`K^Nt( za(l8NF`l0N6N(2rS2p_pd;4MM4shnCwd1kiUq<=&QY`qP5BP?N@*gp|QUQd_k#+0A z`Wdt>v*lR+YnwPV%QR)WQRlVO1o7xpZg`liskFPMmWw;=wmLRDVTY^_7Rzq#A{dWr zDTv!Fyf~NBO3hJMGRRoM$FCezLfNJ8d_t!phw?cX$E2TNl;}~JEhat_+je#vyscU0 zn}a)r3*mdzU2_a8nfmRg?H=Qtz8tp<4rS>Bm>c1#y-S0gw+58%j0 z$%QISl%kmtK2;T`;`y^(7CQ1G4wzy8YX`V|vs|xVlZElf*)j8oBXai|T<@P@+kMra z|78?Nw*vH~n=lP8(yG-T38V`_L%@fd?NIhM(n){Shzi7&2m~~y7C0nQwmRF?qH5gGTJ|JPP(dd6y>N+n#gA_XDtdN1CMD@(%_eM9s%*+Al-b+o0YHg zq3l?DpC-=(DYlb80YIhWmIN#?%sAnc zxs&z0dJixJwn>0lN>W|Ss=>v(t_3HO6lsyu?DM- zl8mS|k5flqZf1YugWhTdeEgtR;Q@T`2Fe9QTxjWOd^>_8{%AX7f!n<|J zunLbDN$<#)Vbgx!`$0;Fv{vL)Bv@@_QmrgaHZtBhdTbd`3z|N&45&uX;i3!=ZH_z& zQ6(kF@P@+de1vJy( zRnAVM5ZK&sfS}7NPtj;HRM0oj2l+Kn|GYE~{-7c0jzU=AbwwaU+I>lF`aw8tOZ~e9 z6v-B9CKbes7M`crrGS00e1xg+(+|zf3WKJRFQ#%=rdPs6RX;sfJ%z#4C zAK4h!lF_{Soe0L39s%W@v0VCTjmIp%UI(B^nqvJ@lI3}Nat>gPUp1Q+RQ+7T-4SR1 z#qj~jtYFVw$R~{zvLLNxXgcz>q7A^Kh&m8`Znefj$r>NT9j6;;{&p5bIxN#%pne(y zpUoGr!wR-$Sx80yroaOM^k)e18VJQyN2D7$RVEM(l+Zg_FNf$WNs@^b*(e71_<*(v z4>ImX(^?kZBj=6<0!3Wwtn%qkJD2Kv0Yh68VLbT2bWPU{#_D#mpiZm3lDQ?CJMy7x?NXU0X>mZGu)KXeJmsSq_5QQQx|!Gf@;4&IbmT?q z>mI|PGs;0$L31O=l?G~OV$W9<+8vhEB+MA@yyOxsazBx9zFx$9s-J3Ng5xPt;|;Kb zKI0|n=}NEyABm37psDUjZIJ|^A!#^qt0O}&k~O;oOM795N#*1ue5 z;llZva%!MHq&LuS({x5U7EDS1+ISnaGw%f+iFG_D0Cb6pEAot5IPW9QvxA-_D4Y*m zuF&zQR|rInz53pxmVX>jgj8D~_{lWDP?T1X=0KO@#Z3~u?f$0S?Fo@$&{{d~1yn?f z_5#nRhK~-&;z~eoJlJsLRZ9DpBhsoD)`xqIQR=A?v_8aZAe^kT8|oH01e_2C0c7u; zBF)w=ud=aEs~sorOaq`Vs=(W016E;+M2+0d2D;Kd2ML=6QTR6@=ci>%L=CMhd$?@XmOfS8jLN}q%LW%+4 z%le{qbgh6&h`tS^6W>Le4R3}pKk!C=6ZT)&ozx^~hpCH<_xdl~UsFgBYV8r2A!X%- zXvV{4|Nl>KKT2M!-Tqq(;ILZ5>i_rdKrRaMy`C*(fAqkBGY~WIZY+2D_4A_*i<pE^W-xxgxD9@IH59#!z{6n36>xLi* z*lIDzSZv0D;Pu-n;Gs;o35-XeKkgq(4FcR>YqiPWqzmFf7qR809jw^ug6~rQRc166J+}-zL6Ad)-Re z`J7dW2^XRbyyk@4$DvL<)bcl~gnKkZQ9-U)dr32Zb@7`f5$?-WVkb?0g6mXkCQd-X zYazN{{fvOPS7iJ@%EWV!F3HIwdWPQ*CI89XuarXT1P)~W#K>Eqmvt@E59b*NWZ3l@ ze}AsRz6D+e7^tXYg4J6 zx;p!*mO2GNsr%)|xQ864BJ-kyX2srt%2fUVup1YY$w&+YCF5-2q5Rx{F=0KEJ6O2O^D+p9U1*;ufsPG1L~teytK z`b8CaYvpf)TAjlG@Z&J)@+Gsyi!fhE=-o0o`grh$Lx82yQQ!VIV&`pd<{~zg z74Py10#W#aSa^HUe{i21&8WIP)_&(Ve;G*7GpSf1SNl26Obmsp)klR>_?edhxNX@= z-ku=HB(WIvtc-c@DqiBD?0hb}vPdY!z%T+nil7#@Je?o>KQfhdh#LS zzZk$)snp-V2=Dylwgt5;8*rJ>lE-cax>rl0MGZzbf=;t4vho%7rf{#SuGI?eLWX-1 zjjUL8v#A0_b@3~wb$ZW4BGGuQ1(s*iBLL?mfD@YATLLtOOX5hFtUxc;czUfHEqVey zgKMymEHJtgs5gR|XT?r${y2Ip`lQ8;>(WQgp50Kh*Q@yb^7lL3-RrHKBkbI=yR!K*Orf*!m&$HS!pOWHzO>&0_iEX z?-?Ya8~B(wbe34v(+z<(RrRo;7U%l;n1|H1V^4Cex%yf9DoMyv()Bu54;-A29!kY&xp2SyfHx_?< zB0m2W-Af%_$eG$2P`SinbBNx`?E#LlZiQ+DDaYA2)}DwNQIuJty!ES4xPCU$_PM7B+5)%5PFJQ+MYUJKs0GHRDX&sP$!fXxjlmDp4Q2GE_bIHfeq+}U*@0m2%jV=R8HQTm>C+#ztga1PFe40FABj; zK;7HQgv!fGjH~JrzHl@($*X@gzJ(#= z{LnOUOXY;P(wm!s0y2~&wmiHFsJeE-=ckB0<-N;wS}_CqxB*+ky&CI7WX!fMm5Vqm zrEznkl;|Dz?3qkAsqcUM*I%^iEL}!DY`6ES<<#4q%zLWd-1>a;-O{!whYOKjZ3HBN$@vb0eLQqqjv%b$Nm z6ummOCb-RYu4)#&rGG?c?ww9&IiOSY%rU(sOja!7TWrIs@~V|2IUjKCg6n622tUFC z1#wzj_I|Qo?~~;wC)pxzrMq2owCP}}KJJa4>AgL9b2xEVkEH9^t?_Q1`FVUu^eOedv^z7Ka?R*Tio(VG`{aO@x~ zN$BJWo~tF?ujxetIGyX;)~)PPY8;2dD0=wj8j=eAI$a86QLXgz6Yk}+uh5O=4{Me6 z0`Arx2`Ta@KTJEhpMQ=Ltmd8@Zrfpl8GlIaRCMRgy38?^zrG(PGUjP)BZ}^q9s$gO zpf_*GKqmqO*#I?zp|V8Jr_QD$KbV+XI7pLZTCOu+Cksr_H{z_9vdiX>i;!R3gnF;` zLh3XLULq{85*N_b=lj&XyagALvlr_X?i1BbDrXIk{3aahnIB6+3hp6WaY~|`JM1Z< z<3aMQExAw#xsjJ^k)HDdCi4UIKdc?Ecer9WmwQTuGgb>TbTUY>bv!ChN6QEy6Jp#S zhg?P5#bpSWF8u@~i z{tj9!DDRVy>(@7HL@ea0i*xBvH`h~U;(qomXyiSoVTLX84=x%b$>SQbDtPVmY_OrV z7lu&^Y8m&wgKFSg;AbrA87u{Cqe55uu+kEJq_M@VHLIh^D=PzNjQxe(vkpQ=dhjS7 zc;AEM>7U7YLgg*2O+}Ig4f-Q(q~Sar7}^k9GOrOZ->5EW zq_<$`Eqjn=3tx03=VF2$Z}Vj>uqKI11#Q9zq97ulXWN<7tK^29dygy^hMEXMgEtvh zfkvcbmFBq9M z;jo}?!=94hK^WVKsAqJsVgDA7+4Q=A&EkBk`5U}yDk-rojc#1Mf~-|t@4HoJ zr;H9OWVzF5`A$mqF9Su|o^(`$+M75f6|`>~_ukjqd6%F|#&b;tM4$4FqD6)9)h?cR z?2PsBsNt&tEajH?-DE5ZFPa=iA^7U`@8Mfk2R*xA>INWh)enzdu>}6V<%MmgwC)nK z1Q~fSip1lC=_hq6Zpj5{l$xEH16F301kHk?cF9k@2`iRgGP>t9VpxIn`hDC(sI!lk z+n0yqgBVIjVJKivl#NE9(88fO@AZC_pr-7Y1Dje~I<{1H&jnZUgOm8+zn7U@9T_X& za_~1fB4|cRXJfnBdy&J(wnp1*@!9K-p&shat#dd&Nr;c@4 zco$+m3INdsklkwH3gqz6M_m9r98>E0P!NwRM&}B90BQX(L^e-S7d}+CmEy3C}wI!oqnYfM{OzioJu~iL0 zI0p&1M5O?&h}UwCnkoya-lEhY&XBLMbrt4&%QjFC8PZ9ikZ~jfoJd`Zq@#`hQDOj6 zhX#wSHC*9`L6bEh+X5}u<8A)6mlUBLt`6HH?=0F5p6v3sVcP-wzl=} z5m|q|N6JDN-{eciEhC*~!o$>bHB7}w@X=5!1YhBjWWd= z-A(I_@ihvV8jY=pvi`Q+QZIGDgo*L?XkYjTM z@zFbMu=RqsX`O4bk~Ccy8vRxa=Bji{{jLHT7^6F|HvE)p`UqNntkoKc|7;aY(X=bj%aamyaFrU5IQn8IB_|TPESY~qcv18No zG(%>AiHQmis6iOUMYBHvHQ1wXjlkzh*UaoyTVFi%`0_!WpvI_!AeA&JIZ|BiftgCk z?wW3Hg1+(YE=Q)q?tq<2jk-&l6aZo@2@o8|GDI_`w}QPZEQsGNx7a>o`r8IsOC|7|t8$YLB|7njNC38%G@Z9^toVN$Ok7QBAXlxk0I z1X6*$Y%UHgXEkrZZ5Av&xU_kIO6*~8srY8;-987_Ww>EF3bE2?sc8=-XZOl1f{eJL zn^Vznd2=7)-5A7aX3yCUp~f}=dX)yjm>dyYWPr?Ip+d4ZX&Qli!a^eZR$yqFY=y)z z1z&WL@s3{wM-7cZNNbpMRhC6A$SEYv|Oyy&a`DpJ=#XEwmX zJ;ooenb?L?V;;bnBSB@k*I3YhXz5I$Fe9+r{n%gS4KN#cj?7HlS=kJJ^Y!ly?Qh$v zmOMO+r`*D0cFT_HJ^^Hbd+bA0&(Gn`!}?ZHw&PQM7JnT}GY8YT$z1x`jdV3xoL*+e zM=EYmv3i(OVJscTTP_R@393`DD$k{TTa6JVpw!L9 z(6uyj7n-lwh9Z{ey`GS5i`NDm`34XC^zcVb=v=zZDkhAK8_(D0r-ezTf_dT5hIiOW zM7wewHh}C zSLIq!OF_*!p&L7{_D_8|S*`V1fut^&$l3CD$@%w_UwpwAJV1uAklj-qn!oVbZu%a( zgMw}eXuAF8;_R1JrU6uc>f8WyEk&PM>XrA{w}( zwLJ*mm>Cvp8|cHT263!}NEE(7Gpw+L7Kx&(Xi}9k+Fa-fO|{DD^N$s8G#nZ;tj^wS zc=*$yd*^D6bj_B0<7zl|Ka9%Nr(X6}i>|e>dcsQ9h_j&R)Qlyia$vz7=8LXGIM1=v^wc0gn9XOviVTSN8bQdZc-@$v3!9Iet*|8zw~6==(JE z??3I7mDwIpsa}3px=*eFWNAv)!QuqY&%4aaULTJ)R6c#9C0y;1@quJT;fV3n)Prog z&&ZLFN2KrDGUn?*8Df=zWjA8LeY;DKa#nNhx$qK67uAISC(fWWhFQqAw^C2RO>4LB zx@E&X;%z|-}hias28UN!^0u7>-S5{cARtNase zAd5agqQS5uHgd~SR$n~y>*(BihTYh(S7)mo@7sWN%Gil+xE6ChrYYs12SEj3NMTLq z%5Nmkc4@{Lny(3rmrN$4^pxdx>oHvMB}%BhjFg4LDPZ^Si{Tx^7YfIu*6bk|O3&<% z2*f^|0bm38D0hF4AH4D@%z-A_6QLVE+etPSGkgY-Mrz{N+R(GBxuY{$-Q3kl52>Xt zrSbeLSBYv(FUag$W5%Nx`k3?II7xiMo$>0V=UNsL4_TG!g7 zkp9(T&%x|(HL^-3YXt0hmy%>#6HVDWYzr`|+L+f2)y}Hdmuu!&gBNL{nKPajzI_rL z8U%8~^vj*VA|~98t3B}!ALI6&HOU3^$`7w*$j+WH+{Bm%KZpi#n~p7V+xQ5 zVtL&bwfaovBYXFx`r)=$PIxv?a|N2-soZoS+ufM2M0Y)%!FKV4YvRU#Yoq4dxx^T% z238~Y-l{Ihf5$cr+=@AhM((P+dF0ejlwOyHP{R%0dvHtWVjAkqF7tp8N^6Up$#0Rm zZdo4245JCdw9Txb$`rIm{>~V=e3PRn7JR(y?R;zdc;I|}_{0cE%tPpVmU?UernHmp ze(cJEOs8-C-X!P5vpS7`6gv+~ zT>|BApzG5=F3S*r#)$sTq8PSk)PUME*vVT-*G|K3C9aBS^aB8R7!y94K6RC7p*kF| zovNPsrrnAymE(=|MK$K2oX8a=2!wNUO5W`r-S`2LB$C@XI<-EENTR*wbOu=T!&=bl zEVyFI?3mN|hMS*}doZ8N4ZEYz0kR(u3M*b2D^~QzYvTq`lTG=XaVFVgQLszJxK#`l zcNf9fgwk(Afl9OT7I5**R5F2?AYN};8R$|vXqQx4C-~ilYeO!PB%BWq&a)zynBc@T zz4dSt-?{YAB&zp27+oVr4HyL{H{;xoJW#7Xa8Q9g-2wdQAH94W=oLnM#bz5Iw95={ zkG2+u)^aGJy~6RSS0Bw%BA<1cQC}k-8HSNjEt5ZE+)k5@I+@>kF?06vh#IHO8!w_u zsJ<{v6Z!pfQWt`Us(W<;&!2*&6-nBt8J^m>=`kk)zj{K=M_|miuQy`Zl7plVDuZlQ zCcO8GT3DzHcgG}M!S}QZyZ6ieq*+5d6u-PFCp%@m5*^((xaHJj46XHR z`qwJEB>M(aLMl;_mlN1v8}Px29H2CUV$4%yTUbs5K&6x9{p;kKm>Yk$1^&}U{w}8H zAf-h0uOvY|T?c;@zf_io%oD!tdNuA(*S*8$NZS{)fB+FH#2Fu)Q{wDdRt||U3VP2?^V5P7b=oyeHBw45!j^~FTZ?((1 zcLU#2xp8D=t6kl$Gn8;SZxu0Rl=ZpC-aOhM=ppsEF$?X$4-bA_W58#hX5~t2@^rQ^ z{s3S6nGct=fc^Wu*aRfP{#Tb0Z2A;vlF-w~pMUR#psqXgxOzVTw~p9f5bO|uvEN+7 z^`N5J0iVO3zn?i-pV5eZ-gZI9D78Z`_}Vcg`nH$=zf`n#VI&H;=GTQ|C_13R;W*pBj zSAj8eVuZZ?7FDz0L+0ldB@q{%N8bt8^9Z=2bJ&4}Pz3J zL{mcfyMx<5AzGfj=;X(M=(hljYXgW%cI&lr8^c%bMVE2#@EC`!$|VJM9T#((fGU zyO$}t|GL^XoLIct4n~YRWjxv9?NIPsu<^iURPkF$b9f?04Z7NH2pkPw!HyApyIwA_ z<)G^9b&J#x4WW%m7RK3uqfVnAulf*>uXM@&<4&{?b6ND$7ig*AGwbSVDt1ZpG(c6& z+At1l5dL)Jy4PBslotXP&oS%~4W3W37dep_dbx^1Ma?@`Me?R_^JMn3R7oZZVOW<( zBvR*Tkz_959ZY@cOA-$hRk5GV*HX~4>)};b3AR#~c7SjDV)7<{ul~U+bnIyrp*_8& z%k@X5QvGoKFe5%jiqoxN%msDZiiom?>ci=guZJ!W2(p=JcFaKJlU?m+=HfNm8;Xb) znOb@q;VH{^P%B^#yrzip@uc+eCam~ttRn59xBIF?M4p9wUTq`YJT(^OXYY$f0PakWnNJ1WJ z?LNs-=NBG$rX3QkSW8-7%+tpWb9$L)XGt^{~+o%y>Z9K9_ z9Y?SUg5QE$N8|l&as`$KskTx~C`UGaeDQ|~p4c36G96ncDt};EW>>IK0~b{~v587` z)u+a&mfgO2cyf+8^{Vgc;92(T4+(mVa(+zirEsIv%h6hiXV*sm5|$Gy%#hsjwBoVU znn+^e&=>MU8{ViDwlJgVD{B#OfXEuN+BggN{00sm79n(FfV#D|}6cEft~rc88tJ6^U@*9;@8 zaT600bv}SNM^>3@>YXC7a)`)>v+-W|-fyqzlBqUwV`n%~D7_tEzuq1MQQ1R2)A0v3 zBiE|_XDPMZ*k|s(q~w2}YL#AK4jXS; zP_B^RNeSnCs~n}?C|hF z&^d-1mf3Wb0cVaMQqS5EqeuB5`KZ-mV9p*7)DI>+@LXpM6OY9J{8zvAs?0^c0o7mz zo)+h!v-Mhko2JD>7=n-}0NF=)oRR7F7QNi~!uZu~#uJ%jMV`&&B*oxZB1|qXxB)u{_b#b{~On1@qZpJ1~!F3Gz07$O%;s0eD@W;BEQLUXhvypg~JmdSYh2f(OBXMSwF?HnR&%f;-!0?HQdV3o;c3DXmV?$|@9}EVffc zbvb+aWUg$$F-isuxdMG9H=C~KFAmn3PS}#(qfFpd>VyQ$WksJ&KBWdDh0k+s69#m< zZAJuyZ_ah4Rwg&b8SV2C&&If)VJ5K3NzAe(z_)G(zST0Z`NzKX*cD;@tEsdUtr%o3 zQeoolk6i55|Ev-`*|x9Xagqx)#=+!qQ8YVq;7C-Y_NI!R6az+c$cE4``6Pa0#B_1? zcSM7PjzywDU<1M&%jVAK8IE0M7-dDKgh`B-iD`ib={WYNu64C>>SfJKDe6AM$cin& zKsja(qlS?_n5e?cs2Sd25U!-uj^|E)4IxkVA4i820 z?{U<#maBQF-SB51n0N2k5EqL+V^|hh&6zrrt3eTKjV+1s< z?nFW>TqB^eR0pnOFLHGSpT&BGUC9qTh(?YDRPY!FwK?ehu;7t{3Z97Sai6yTxwZIK8-yB>Sedk(~v zi9oc;X58x89Yd`53S(}l;bsm5b_D#%FQ7#LegP}K@~hoL-9R+L5DxJRL}$)Byb@jH zqUd`HBa_5sYUA%;c_ZB)P6)@WJb8d$U~dx4BhThH`4I(eucC9k*QBsfJ&A;w=Hw3K zLWqT|PjB55DZnpa8O}}_mQr5@Dls8`!Kf`dtd^8J4)_JEc-V|?PXNy?sijWCjKYGu z=f5=(GhJfjLi_l8x;u=`#fG2m&UWInH03GbU~E_k=(JbUp-SKA%c>s+k&10ObFNK- z^K^M?c5Bih|HdC#(fSZSsH+u+Y7TqKE$9`t*Yw9s&G7?1U)R`tDgR@Te~gSG`ML9Z z%CJ%32cPlddz7tsG?baXyQSy9%xEg$A8O*YgvztB%|=N>1Zp)>Fh4U zLgOvL;5H(ka@zvjMkIE7o+yq-?kaffqsUnqsfRY_CyVt^l99rwWagRpFu6nh`BhVOlf(YT_9qukQm^S?CbzaA z>Re<<>Uuc&?&AN)QW5AxViKAQfEUJcr_rS~(K}PED%f4MRC~!AqtlYC#?a}f{Ht}@ zF^>!pr%d!_J3Lk@R^8l*ZHR1cO{uaw$DGNlGFFUEU=YbF1M%`{M58QY{>{DSYZzI8 zUoi44!F9$dnl7;da~5l5b>LE$z_dsD;u&$(R`7xG_mitX)+aL55a!3~Xn_aNb0OPW zFqoNw6=+Nb*ycAzPkxOu#wd!J`nTKSak+81GdT)q4o9EwKV#;q9tsnoY;EJn^S%qa-^eIe>=a)!n#yIUZ`gub2fKelG4mUy_^}GJ z>B64Oo`*racNQ54_x)7Gwt+qH(Ok+fjNF*tmtUpf-aq9+fH%RYYJ{1=XDd>Sthr$x zZTVG&G^a7OTm@HXZgrEeEYLv5Ks`~>tWvT1Lq|n%&Ii+0kK{Pjti2aJVncINfxB(d zwQ+ZztKO&O*f$mLgzXNUh0e|0|~Q<*G@D>fy`~dWn9hfJZsph(eI7U zdunLkz!8NvIc*hv?UdI_@5ALxNy=wgg7xA1r(gLMnjji#jvEu;EU?o}3I;pfV|w|Dm_a6n(tt~EeDLJO8H*@sj^yO;22 zEMn%%?op~f8%9+eW3(%in$dF9lFYtD1D0Zmav-Ij%<=K!(}qa#dKo8G2?knIWl`UtVxReeX+A>NTYzqhtvDgF2gNb0BBgV*z zSx1MKo&#rc!V=G5(Rl7;BUwef#l$`e6l?Hjw2i2WdQ10#HVKHYN6HmT2LNN@?X;^c2m%3*->gYCjwXXhSMfZ|} zF%K)7W>?n>_Bk6%SIqTYsf);8=r;i0n*$5oN^Vr6d?D+cVBmb&^Gy)dKxA?Q{y&zO zfCbe+?WxeQ=-cG)->Oc3U}Fv{>QCiT$i5YDnva_b1 z)|=IS{1AHkk)DwyQ?dPY3uQp__WT!EAmxp;YmY%8x$gC`LY*lds-P!co6@exO9;L+ z`%)CCM{=aVoCP0hXwTGS+55xw%=dc6=wG7m0h6Z$c`Kwj$Hu>So!4f=0G6@RooZ9# zb>U+Tv-FgktdkGJ)wkNm6cQDv4AX8ee25MD?j9H=|1Aj{@q{}mJ{MU;)cMUut>GHp z-Hs}%EsTc|D6n=a_6}QJib=VASsT+QOaz%oSN!CvQ*DV*3_g)>2hzFF=)((mehtsO z%<6js8b1WRUeOovN`C)m4+l({glz@rDXB14s1Cfx2pYs4Jiqsq=s6|lL# zpUpt&L+t7$lq1qR^Qoo+fjbN`j4s0ac^0m20J^o zCdRO2RQT?j(*n#mT@B~nPBm~`g`MJPuH)XzeOrYP?Y_lRX_`W~lwzF(AM;JH0W-Q} z&<=7YMK7=D_Jp?(s;-uNzvBO+j}M9joB93jbKlsJ1J1r-&LKoZ@z|cD+0-**%AOwET>umR)<6-Y} z*80x(k882y5Ax=H?&rR*`zk3xHo1v?<6S9H^Kj>hsc!z6$U7mM@7KjNvpd>4JIab1 z&eY_;f2?J$CS^_aV$q{_QYyJfO1VQkil;>7e00zf`PMYUdk3mQ?$Gnm#YSC#0^r(W z-|ey{MX>|52_Hl}cV))(iO=iWTaUF!eQU1k=}*hwrE*1Oq4}?(v}tw}?q$?yjUGzd zSBVsZ^N-{xjlPMS*&DO7LqZ!kLD!@9#&YzUO36rDFlrAbmmEMGKAQ%?F+bPdTD0UA zZ-?NRLH~f}zn7zLH`v9WAUI|<%w`a^n9Z#_L(s!y(X~E{B4oqn~(T)+9;Um)2rnMD9GWWqo zJP;pz%B;nCM9JwcOb#;UJx>fn!3O#BWG(`;zOR*eCpX|sAN=xB#d`ki8;up~@lH)4 z#AAGGu?=M|YQ|ouv5!Qz zSps)6VG9!(H1R$pr^-!qFR43)DG}62Q@iC5RL=YhxWyQmfC*IpDf=5Ee9>d%0?pc_ zse;1uf3MBoe${Xzc%XC$2Ul~j1h-gg;D`#n#X9%-#F@y)pAQw@di>)Km&n~3X!UB! zrAO6#l~E=9OQuSGjLIp_Rr+g0BZ5?ZJf2{WJ(}l%^167zeDqEJ0nSmRgrE**ft589 z&r?EhU2D|wwSTB{?WXd|T?rlMI7_Ix@0XnD*nMAx8@p}IVW#5vM3fV)7|{_V^i)NA zEsf0gue`KJ)}t1!&#%Kq7u1N&SoG(=ut&1e(6Q8OGS!`@@V_9zT9>gS;u2`j- zqfVvO8J}d%6w>*F8bWW8`imQ?O|PY*D)^GdU3(-G_-eJs#f1xI~m z0|NE1O@g%jD;NWjvCCusMaEwA)PSw)J0Z1r^um_K+Lx$nptDPQjGoEp z9bXYS;Ks!rOhB;s^MdB!D2;_b$D5d{>NJNKT#Cs!1JeYcK(+dcA{l^eKH4corr<}< zEadA;-zS0#NF>8n4RX?Fq-{ioXgbD&PnH{gT6?i#A&|QYE}!5I|HW4T7G{r3utq;; zOPm8%F-p&Gc#TB{M9J*a46-_qkdv`#-5!$H!PunV%oQEkn_&7)`>kIRT-PcY~c-PY>sc7>!5V<;yLbXK4cs*ZQj8xu8 zm+#w|JH_T+<_IxpvaQ@(;kxsHfp-tQAbRIc?^*N(QT&VUehJXsE2z#zi*Et`xz#=( zuLQu+3wwRkIIXoH#USUF`|!~=%tpSDM(EX>NNXOv&PN2X234ff{O(lPYO?j zvsN4VfR^&+#lyOdU=R2nRM-pZrK{NoBHjc+Zw@>A$f9pfC-mk}NWJX_i#m(oTiQoi{I^+z0GAm8cBovXrq{M8UBe?`U5R4}`!7 z^eI7}3HXEhT*c2!BFs>Q6agpf_`Ug&UaYl`B!>$$$xGNsY0ov5BM(n$V8|LPp{ z)cW%WkSyN~>)*ab%F3{LmR<4MeF=uOZ=e2XFhqD+J3>r7gR$7QKaQ_Hh0G-M1R56h z@Q8H8OiWgaZAx&iettrzk`)XtI3rBR8M|GE9^c=feT= z|Gt|BtUN#~{!i#Pn23%aYaflnE$1}KtpN*xjPYk6zMv`$#207;Sxs+P({*I*>^Cm} z5M{u$Xy?aVFsmr9A@yxAki=kTm4=^o&I>!7zC{@9)4l-jcll9)GR zr!}2p(wi~NZEi2+;D1r)7G2TilpP0A1{_1qw7VaFfQ34#v`2{0#(vVqSUGb6MxU|gdj#w6 z#pN&Ng6JlM_{Q6|n=Oj?-T|UZ@>$R6f-y0aV$c}HuN{B1&Maae`k{Ri|4>e<%O$WK z5PiC}Kh9KjeDEmW$xDIrzQpJRzLgWlPdf<0p?RNR&buqo0L`9-*Ye%H7vRo3QBo;b zp@u5ksOmMx54A82=eS!h*XsGamcwmAvxtX>E*c(O^`UCSg{G=)p$0ts%d<7N_Ab}B z-agMg7~a$ zhWo+<+yyXRK5Sv*xa02fc9EdKd_Hy>xL|$b_WX;+AyE6Pzyv}CrlY-ht;N6o?{ANf zWeQG^k!qTs{@3{@(8T}}H5C7>p<=Cm;L)1fbr*~RFupGk8fWVQxAz>nPCFhFc+~1= z0=X~Crid_W2P;L5DpxLhfyrWo!DwXoa!65g&Nars>n-J9Br_K(r6?QtDib3;iOmN*p4 zF1ehMuN~!pjFF}Sr`{+fzys2wW3u!)apf~$YlQ2Y7ioklaU;6GVnE7+bN&uZ{fhzg ztzm820}_#P-OXG43LeKD*Y=?&Db|TCPJSPDG|H{Yqv19qlZFmOhksHsWu|%% zI_g8M9|VfXO=Wh*1|0>SX5+g(U)5gpmZZt)HKN?cA8$((HciXcs*Tsz2TF3doUnY4 z3n(b40Fd5YgiU2l_dfI}l^(;PN88F`mPM-be))~RO7uuIEQEA?y}%5#D>XaXunEE? z*Zyo%5v*<_yXiC%N~S)f=;u#@paQ%bd;)I1{KKT?%|MzV$J9#V$RYcMxx-*|0OFYN z74QkYPsQ)y@n_S-4G^HILuLToxM?hSPipkM!doB zUR7Bf8#VgtzS>`9Ni1c!L`O3^*JKk{gFctfKy5J0q05gZ#wz%j%qe9}27U?5P+1u4 z;*G~&{J&f)MX4EI9`3r*HIv?Z93XW`wI}cB;u*wIHEjBNu!&T$Igq5Ha!U4$rqEt8 z(83VZpq`K{!v_M%C@?tG|3rqy2c9Es5~NAGkMT|Km~dY1dfqBFm< z=oJHPE^C6~>FMcVZi71yjS#24?M2m`ft79_g167VsXqz0QaL6``EoF!+~F}<#(8fr z<2CMdC|z`+`NqK2+Z??^rdPlafv-eNoOM^|b)b zf1)ev_W`*7%jK{y>}!1IdT7JZlH4#jGf0%D?aKfq_cnH&l&j)cRWd)rn9O60)0*1q z^R<~S;xMTHf4EG7R00bXcB#?pGxk%K%TGf~e6yGbi!Sj=UkOspYex$fDbI(xRzWPx zrOzI;0TPY>vNG@9gJU!>GLMF@yf3eo(&Ir!#>82dmLMffWuK@UZDcFs;*^pkwNtG! zCP9DZo4{ibh1<_f{=ul3Wu<;#5LxX3XeUcmJnfF;o=t`?t+riwL8P>;RW-;>)T(AP z>QbJ$$)T)BHQFu8_Y2WlyV2#BPvtolQQNU(CB5-GWoS8V|C@(1Kxx6l6|+eljwWzH z)+>FusGL9Z1zR1X1@DN+#Xa2&tojkuXLwA6;A=L+sMsx`?NlS;PgNmH*P>J)?bXc;iW zvDH4ZuThZY@lp%#|AgztM4;MpOmdOhBm&@;!Us=-t;T%0og!>XM;ODA+PBuv&+>%5 zWzT-2a0K~H#xIDkmuXtBR=pXr^sQxfCGsaArNF8>0Ixul6z~A}5j|Kd3aJU!tus?d zsst=37(83rrokawh`yxc?`+H&=6!Q@7ql|b4drYwn5z>-c?S6999uBR4Bq^|swgjS znLZ=VuI1#(Z3bE4FXKFI>&|W$xc^>tOXnnP)_Sg7_-x&&qTf^{;#gzQ{`a|hS@Q3o zB=-!afh0S*bG{*FTHu4?D&Z0&HF!}vPMfRbTdhoFS?sGl7c6?6GnCH&DiHY~U-K;B zKwwDgb>fr-T_tkXc41*-w`jmQQkM6|4HJ(a5ly@F=|VaiB|ZhSbX@GbCCM-r>4ub( z@^kjHaYb1TXO_J~T#q8VFgE`u+ z2^W95w?B_QF4mb7CQxXzwS1{Np(T&u@1$U{PC{BKiWOcwEv;?FWn3X0%`<12oAi7t z4Kfh1I0@nzq!@Jl2$p?Fo#jOx%o7>+pDL^12JAaZW|i22@}HM_)Sx-C43`)^r4>mw zw{w^XNsI~01o&XzFUPqUZ6fN8gfs`amXc}BPcizM=Qn}vUIv8MPpT$;z z3blU|ODxu?NxuTNLzIBl#i}qcQvrZ2V2ecoF@*81HaN5daXD!<7;~ZVi=O<<{-5

xpl+zFN^2K0@=L>`TAJs-`O)8h%KV*@a$_%d3tmG)Va|COnP@%BbuAF8DCpr zFBnzVs63nw6cL;c3|}Chg40A<>x&H)s8gkc;5qI~t={|*?v810}Yqu;_N#^c~mu;0As*{z$`&oN5;%?+uJt;gpoz?YIdZ*)Oo+#gk=I zkCO|IO{MWTarRyc2Gaqkwus}MB@Np;kR=*umLm2EOT%sQr?q@|VTfVh9hbJ3~!nPZ1zETaxe!-QD z3u^Q;!_C5IHN*xF?_g0nTUBEv(BK#4k!T{q{nbPH3r-e0X>u^mssD}i;VYp07K|KL-&kE7Twg?xXrcds!a$rbbldbnqzOXRm8Tj!Q8@aYwW0u zDLbqdwDpolhP?%olI|Yd!{S#};DUR@yX%1H^Wl7SRGo{s>tF^Yj12@s5MR#s|Ev{3 z_HC2v1{V#qevdnPiKV1sb(9&zDGa6O&z|y6m~~E)=|4F7Aq=Con?R1CdJX0^Zq%W6 zADvB5NXxPa&i#Wm;2uoUQPE|>Oc0fDO>3CH6KSN|fu_W81_qW5rn*&M%2eVdOp#N0 z<^eP)smt7)8p_~I?W@ed%JztE#k(#l5n^~J%Z|HfAVD3BoKsI zxCw61?I;arqu|+W`@kk_WE~crge$`Zn>Cd8vXzL>uu&+bfe)tZ%>6TX>l(9h!T8v+ z7L=RzM^H$5yOd-mF1lPqAApCE;aBeDk$lhG34PIMsBP@z_>8+#25W`lA~SF=8p_32 z&sZ0|>xH+M$okFvIWZUF3hQCn3^$L)7H!D_pqot$L0h7GH?&jHXj&7NM2A-c0g)cW zqU&zTnpssAZ`O4ix;Zww4lG`6R|E77MV)a*E%pdmhrl#>Wa}QnW`G^cXLrA*02CX? z#Xs3$rhTg$7e&t}d0NFLnE)8OWD`v8CSAt)**lNvoA@m$9-Cl5?CNzWw%1hkG^(g|BYnL5x+OSD$i3 za0WZST{oKK#(kmXuhS#okX^O_Y25Si8~k{7jG5~xXh&FKpS9RU3v{1f$DIix7e=krn3dNa<4Ag+Jy6ZcCDK~ncmjdO5kzXoFV&I|e# zZ1MY~P`!rhgYlC1Q2KmdQ>VDwp?V%%CEfYT@QG^oKNuuNd@j%sD&c$iDmhGH9n%PC zihQv{J+!4Dz+i)}j@I?8(cXxOKb?+zMvws0V?_7F7LD~&#vXFrOBnfC<;SXWeQA?V zGca~QZ#IPZ(k~~YVV)pWWGll6qx+d<;6l=QI8Xj9NCXxPDargd^ty#JU^F2wi~7Im zQ2yex53zyR{*(I?AO<;T{81%wCtlV&1>ZX^ZyY=jgT#Ig$@WQTvFT}e(h?mg(QWxk z;gOY8qta$iNXu1hw1HV5xzCk%j2=peEmKK)sL$S#=J5~-2F36c?IeGev6GBJgep?V zkUiM-SUt4tJ2N+SL@$4vPhROSEX1!5m3r+RIq33QqL`9e-pW?|Wv?9WrHNiTRtlcJ zl6kMva4-6;P;M!{H+>&4&Lh{Po=mx*TDm&CYWoWnhz0eSb!@R_q{(=x)V-mjctT5c zv6=WZ#G^|G8}#R8sFrhbOlZ2H2rlI~C)>=V1f3=*64u$f=A2PMCExt7H_1Sqx$=4|yG)T$ zclY_!p|SzR_yB47v))71H0nthvC`2p@@Krd+xq}ia)f+n>Yk@2Mkj}|a6sHqsuI~r zu##RQI-wi21~gLc)` zqL{5kF*2L4X9?q!N}tm@3ts9m5u~tNxQo>v+&PNYauWK0{S*ksL|2ZV_!5DE`Nn9| za-~ysn8!K%M^V$t^}}n+Y#7pkvLxnATku{*;rYE^rY`j6e{X2DXjQ@dRaIu8sv_|p zUwoDN&$sQ!~u?i5u_Vpgj2^SGI8zps~jZE!7G?dzL(p!^=6sINyAB`qc#6&x6 z-=h`o2RuYs2Ge=d7q$KE2wHy6B92>_;HBai4yi9SOV0+D#r2>gZg%EmKa8L_5iVB; z&Q7=jY}zJsy*SNmeaz+4ucO}$+z61Xh;wmKah<>YWlKhm+p{Y5{H1`wO1b_A81}}_ zWTf}5)i}+}b>@%=Rvb&!N_C#SbFXft@e2?1+T`$QK( zWIj}Yv*H$lebx-Gc?*o!{6UlFG>ak79*-dN^n1Tz*sABJUo=d;s8vH5BC3C!iyD~7 zzS0{p78-)0sR$%`?m~cBh4(t$dQRC*6T#~Dktu!l_nKz*3IS(ayW+j5++yTHdb?CU zd-BO0p})55$P zoK+0zJ7MCo<+I0Rr8^6b9)%GmQ@jj5#|&bvSVkN~r>a?PmGe3RjR%f)`0H+_WS=ywFxwd zkS)Vv?M&BU2y)xVB4I9h?wffh^zO~aBfX42KmQo2ck{Hu@Xt3--w)JFrilY}rt7Zm zXX1;ntU9V!pPSe3C>eAQ&xtRPxA3lYkA%0!O+9;?uUx#0|0hy+T)-igztE3HjI&~~ zeRd&wBo^XckRA4O=f;p4VhTz|46MTr6H|_P+2L;P+DdULuQK+7i+F)UHA%kWXR8nJ zxXShEIxz@IQ-TE@(cvJbtRBh1A(OPr5aS~XRi@gU3U#{FS*}r((f5gta@k9$4idx7 zM~_l?qi6<%Mh5;b!2Q43DrAlkTxR8cs=%=<*XZ=1PF|@*%y(ft zu&Xw9Xsjy`B@7K<8*Dnvw%k~cSO2&+=nf&WghrS;z)39@=j6>f9p+$ThWm@C8WOn?67TeIWRO~l4QUwKt$Fp8~s065q(SNQT?FeEv+1w_=GB_J*N z1?qU6VIge|v9Wz|;@gi9@$K3Bk$`rn%|F-`HQt6$f0^(_ukK=P!HEMbLFx+ksGUDLr?~Y4 zeq@vIVCRPtqho{Fp_d!b)!|@`C9oN3>r@gAWa?i&%6X1;_KQrCn^8(~IOU%ut|l;5 zgSu=rEqxjp_Z&JxP!q*@NfIpn0}gq=?$WyWw|4g|U0IaZ4I?|6G#*;6xmYrGQG15Q ziwhZb$`|XoeJBfSPw#GlS@$5UqU#MmvZsdQctYBbLZYkbJ9&AXh0bCV7=?`NqU^+C<3xBPcs0o-|rQ%p@bsavN zK_SRey>@Nd>9X%jf~hRtj}m68?G^0CYr*D!j=O8=O;AQ{(G!feQOjL3VjV-`22Z8) z0THJbN@zwAY4LNbz4d@;glXuBoxA7cVdqYVpZ1o!@ay3!Mq9?LK z`w@{jBfDmauJ$J-iBXS?j&EhPe>&fukK#AHbK(SCy5P+%hr5X^zEmf$DUDp1V=Iai zJTvBuTFx_r5xl91$f+F6mIP4VtV+)1j8buOm))I2qrYuzKNn2_9cvLwy zgO3KE*?g$AtZhfvqf$HZBO;+lkw2z>o1!IqjHDCv7VbP($>~bP?VF>zv?^j*7v=Y2 zc?mAHrz{|}9dv0>2#Fc^-i)8mdFh*N5@%6%k`!HS8O*D>GWcwc_~agFX1ji++d zY7{r8a~}Lb_d>dp=J#%%5{R-)G|a7L3+Z%3@h}JN;Y}F7=Oc$LlA%tAm4Un;2QHj5 z+hF{nZtO+nLBr)TLLF7rc&tE7oH89FpS*^Ofgu?0W=s9-R9$FvO~>I2x9(NqcOGxtf$u?Y%^yQR3CsC*g{VDKN@6Q&XO zh$G$cd~ALjXP#F0$`Kc^fX-Y(v=c5ZLCRS;YYm}$kut1bU3#uu>5BEusAxgceyy0#)zq%hy3+!z&@GuCS=k50@uZuvM55k#41tx8l>nih20`}8U zN?F06#tPQ{%}ddB(P?lCL_GKpcoRfCc-%hp4s@}r7#L%QF*`(m)4pVkgGVGop(Z(~ z4&I*8Y`W*8=X&4rG~Gl(sufa0GI%)M+XTGQn1rm7xD--fe38TjCyF~^W5L}O7mI^nqZ1#eq=S@-g7KWP_|;C@A_{_o3T6sj0k zXbQ9qmnDue-SDi+d-VKdw7D9uTvBGX?tDpvZ+Z4;%X|ah*L$4=K;~8RZq7O&?XJJv-XWRS$wvOzj^p+P4S%HT3j+g;D~h7oU>1zgQ2o_ZL|o zn;|HrrJL9u*rBgJ^_=EuNc?o==U>bV2ihnVZ+W!aX1(EI3iA8S*Y&{lQme=Bu+ihS z16azOsN9CO^tiAtx`+MjX=TH_pf`TBCzgc^Hh0tO3Cp_aU!50?m`%4(<0U*OZYR%y zX&K3~FIz@hGPr-b`;n^pnXFHhm+%78@kB8#B}&q8rq(bbBz?~&w`z^c88~%GOFpl} z&}-aPl)~`m8M+DFgSkj5c&G3i`MSwf33nu|bl}sa4eYaHr{dYjh&Run4acnOY#G{yRuQ@rKuO&H7c+RmG+yv*J#kx{+)13xRu%FK83@w96S+cVamt}}Z4d)n)S zhu069Ra|`@W*V{T)@k`;$FKizF#X7JWwY#g%5dLo8(-sULLX`yq7!Hl7{${$%rm1y zsNdt;iWW&PdUHtrJ&11`^yg`}dVDFc1!d3g@MOue!tf1GQ!=a$XE9RKI|1`Op{{)l{p+`4m2b_wp{NEnk* z*$Vu2&8zhYL*2bdrD9@(FpjNW$v7I9H2=stxT7Q#Uax|xetGw_yx<^WgUs|3)uxCI zWo2=euh~ufWy_!D>oqC7o&ndTggkW5#@lZol!$IDck9E_R^1)2ksVj^WrW6w@)$FH z8>-M~bztsa!qMa!vTL4aj?z2l8KJX|pK)h?M8Zz7?N-Si*?NtC&^Os`@zlgc`{x3gqV)aPuGWbjbk%^tRD z-DQ`Puv|vNu`$}_`>NA}FNag*)jAiY#Nhq){^0^c=byF}*4?A@4Evn-*BjoeCkVCC zr>M@K+p>cD`TA}htzOHw7IN#4I>{Y6_Je3bfOWa8C-lA2*QLoJOLA7mP`ANPuoZtr zqnFqAO}yawate<{y)P z^-)uGT-e5{2T#cYJf&{CMBV&+#Tm|69P5lN%_5a;k-k|?Fb;q>4+De-gF zMoU=-bb3*mtUkzqC#dHFE3OVcjVfrOC;>wb^u_X_7I~3oHWJ zm%X-Uom0S|5#&V)CW~+f0)~uAy_a*k!q-`W$MQHl+2!9nmi1Rf(Z{E34l35f8zZ7? ztrm~`+4?PH>*VFGa8r)aqHSw<~oX7ZiI`OZ=;3)Lq6+YLx<)&lqK z-B%y!8l-d6b#_ki^rS{{>{;Xa&UBi(A#18BhsYU&CUV#)$L=F z;rWYlo$t>VD%l~a1Cv8l#dMVHu;zHVD=Re|UNGuZN*PPi9F{1A#Oi9@HMbdTW^v-; z1hMQEkR0v^-$RPu^5m6Nn`j8zKV6Zby5#>ZYP|JC&{6q@^+ZtkzHhD$ZUAA%S!SEzy< zv;9D>ym#&m?LtBJ1e9Jr2jwgZ`5f)98N?ZdBLywu^DNj>ZQ=*ZHKSviAZ&N`T#VND z=k20`{Ci-^d8n)Y-&HL6t8>crdxK)Pd^+{Ki|C80&7O5S4x4&5c*tJYB4?nHJ`QI$ z+*ZlN6sJIw{ap3uh!a%+(NIpWa!7oZ+XQw>(*m1)oGKTlsk%9>;FJWo6u`L^7N}|@ zj}puky(}%6pA+kNo#@mhX^E1()i1P!J1-6Ge)P-OT^3yKH(5D}Qt0Nm=rcCK7>;!Q ziP-LBr@F|(@aVjl;p?9^tYQ9&N$QIoeXlM((AXFBY8=V=7+bV9ixC0*vO?p;P3+D_ z4bHsCBeILw4bsG-8-iC29oW3IOdeDj!-uIa$K?${mS7bW)bJ`q7>wzh7v)8R5Sx*m zrSJcIYFPym1tljIMydHA=k1hM!Ivl5GrV}rs1p<%RiywT0JG04FSMV(Q4_11(%$=K znOwtz@ts>=EX+%yLBMM&6q)*ZbwP^z_s5=P0=?3+*hK5^zm*MN>!OY$ltJm(DX=1C zg4?3x8DlA6B|xxK+|ldBG%tI3k3rMUaAu%-?&Dhq;aHdnfod_e_a*LE_C){BNHS{EiaCGCsk)hbu>CDG?+$Klcq?Mt* zf+3=v_NP(e60%^K%N;nrI{K}uod8d%8K3WnAoBpEvJzW5YPnUt6p!7cdC!8ze;gcq znkS|iJTyZ4x6tgS2STR+e+mYFNqO~5Xf_2B%vOcncyk-H2I_Y`yu6Pt-=F~EJ!|{t zgdCWf#CbHxmRPaJ1@0h+LP#g;t3aY(!$Oo(Ab|jCII`;sFcT{V~X2Ez{3%Cz4|K0j(M{zAdI86k7Qsn)QU=0_*BVf#u`HN%2AMnkO2 zvL)ulW$TUG8Z6?*=jD+c!=3|wOPz&^PSY=|UY63H2OAZ5cC@YQJA^R*{u}!%DE|7J zN^?-jBZnis#r$-KsuLzEuYFJhf6h9&!2XdIPm?;S?Sgw6W>I00yXX?HgYpY*gXr+L zp^W?a6dF6Udz3H0HUxBx=G9#24C4A)se++ixd~TWWBn{}^Y#9N!S}hL76(|pdaa5;kz*5;c%OUG>$!U$qoBOptH43}LF>7zxJ^tZ` zCEBH{)`YKcRZWW4>`=@oEl`1&P2#^Xn=Y=eB9ZcW_rwObpRQ_cT z^y{lEm7{zyt@;4&fMOvP3TdWO1lUYI>>XSU7*$V^79^dR^@d$nHs9Pe8>SKUI_rM? zc@sdfl%=SI{_@>(q$z-!U-RD&z_;@N=q16G2Zk`?L8V(4sz&3_XMd>2_eKo<(+8;I zzxV*P7=85t`uv%uM+6dtOU3UBds6gN$6MG&T(=sK0WNLFmMf)xmJE*~nsqa*Y_v&5YvCX03)YO0SoQSC@*KaZKmS?f#AOHzaL*bpK?%jn7ahNYEa} ze@LoXqG`H@A!jl-<_7||U)8H!ZaUN76(XlT_D9*nIPYtGjC9bpALOTWRzZP(ejp1w z8vM@VHgGFwL-EH|YNLVdl|ELbV{=uQ`D|4X%bd=I?vu-{-nJKlfoC2Fj4#~-g`ymh z=B=}p?C$^(-VYKlx1>TrXxfcV1S`oceat+1x{cr%2?bubgWyW$-C&Rb^I(VN!~41% zWX{|;J$UceVCbHO6>B#i4KI9LAr~wzo9LDcew{$5MYuO-ySsN35&M1Sc|I-C??)-1 znjZ5K{VPQBYj&;2HmE7zT+-mQd-48?s|(Inqwd&hPg@hMs)cvP*Z6A(3I3E%cYy!v z-me}=9*HhK>F;BU&_EwaRx&yU^LoDaRH+v=Gxn*zFD1AUBy-P-o^GCD0EVfDoKUuU z3V_ruCYH|AVWW{PN|H*QAgU<+!(mKKzI4ilG`XSPTGevwiYkkF62?p-(LfL2t-AGx z4-7q$AvldCSwEbOQZ_XaM&dH_s8)M_Jxv7qk9lF!3+O10Zes)P^XKv^{+uzdU&rLjGdM z?QN=No;2^m;aB~iGpYXZn85BE8cX)L)kC(_H!{tGrwcpx@e>1F5VK#B992m+f$tPr z5?~xMPq#{KA`8x##gDf4^Gc@Dy(0}bpV=#tTNsl|%4rw9%GftX+(ifp9mUINwwM1@LG=@q{%NaDYweuBENKra*HAwmWil_$p5o5gMt?Vezxio{XRz|Ah2IHvMfvwG zwzt6-e~Eu}T?qxIE<2`K)OX~qu;+KrO1^dL$1O=iecRai z8d;vmW?iQIwkUrA7Uf24DA;dsGmCzb?$DmpAx&@!@@1d_TF8Bsf@7PYGc)R%n@$eh zV(RImgUsi+lNa`#@unX0-1T=F-{s{=GSH)f^~E7=?2##Qq1vpO_#d zaxLbaSrKtCHATNO0yEdMb7S#i$K(9Wh1pEURT#0^oCM^}XU&1&HgC{7&CrYgEcufp z$YMWSw%+j3)(gekG^Xq5)JtpaPk9q0nLCEIz~q~?99}*P_me|Seww&LC;u_Fqx-Wm zrr+#7Il8dT-GAHg+IJuVNOz4}<7efi7q0ga__g~$40vX1bg->r#DdFofvqHad|k!) z!=#kN%MQ(?(c<{m5-dz&cko5~mR~VSZ#VkRtOH@apbSQXgh>1T9ood-h#-MJ7IMH)vqa zOFjxwBffMI=iO;X@BYh`-;JjBM?pWrsL(dBU3>Mr|N864DJaW$YI)GRmIk^yC_PW7 zfMjDQ;l?ArcEK^qASyE*Ui~@qd2hq03Tl_!yVd3(=Q|eUe5b9h@X6eKEEuu|`%wRP zYp{X8TZ0Ao>uKB!CD_N``Q{BaCAAIY_Gm^nf;MppeEn#5%=A}pFmc700_Tf+O(XkR zSPX*h5ml)uy~Y=EOiC%|=DYkMsp z?mdUWgA(h5+Oa%K2&z@XX+G2{OR}f#U%9YkOUXoabXh6LLc6~&uPwW^=D>fgMXvfA zq4ujXFV6VJcb(Z^KfamWaoYszP+Fw<)Dd7AIUQ4q(0jAH!K^Ix^zZTqf~-V!mw;jF zx@W$;4Iv^0?8{`rTzPhKvfF@>_hMAiB$IzjB|T-^`pqy6@4m^-_8(Nz7bgFpk{VFI zQAr)0HU32GW;f_a& zNR8XPs)A^jpmPZ5;s9y5jw6>+jDKA4(Z`hb9}FC{O^}b-9`%{#-rgu0s;jh*(4J5S zcWjLmWNzdaiE=ab&Ne8@Z09u=kN8_%l8%L%6g4dDH@IcGH)2c#JYGFZqDv;9_JbB$ zX;?RZ@Oj!A%mp64LTPS8qzOnN^L}@cY%*I%k9#Cy<<$NRhJVeEP~mD@(a{9m!hW*@ zDS0!T;CW$P<1K_`Fk|zJtMgqYZNkD%>4p6E;R^vFDTm(AMFkWkwG*7istfz8KCKFy zIWifkjQKs;ptplGirN9FE6`vIg~w-q*g0<-wtJfuIqJQdyl!c$)HYV~{;6g3L$#q% z6U;dtWx7)FStq#PA3#kpqx%h3 zFJ8LhfkKUA@Z(H#d!E;c`I3&YClKtjT-Q^NxZ&j^C|jJ(ZbQ9Ht_IoSACG}-ahWo9 zh}Q3Ca!8-`Zk^P&*wxG`L!`-tkHlvlI7QdJS)B19;N8Z2thU0g3;`~#!ZTsXvz>M0hCIQDrLp^r-n2Gw?3g#NEh+o zkNIkrzwTXr^CvI?+&*v;Z>o9m-D=HEC4mv%Srway_tfUSuGnYJrq;)I{JtLCZm-On zfR3MUEiXr3I`oI)j$VEQ8${oQ#y92Dhxouha^}5-ej^q1Zw_zq7?RW2`QkD;lOol? zuB+b7YxCMM_2U3|`>ol((b-ZO?X?E;bRIFn@dkWOn`s1wf$w>6-^I2@;Q`N%P6 zC(>|kKZwq?Zw75&W!^`qQTJ;(m!fB~w971Fv$M8`>1C%&b!P6}?{2I(D2`hd$U*QE z{GdDc!8P3Ser-~7)kkOwpLisL@{G)&0EjR>ys~q;WZEj+VocVjx@znaYYhe;#%^n8nVqbn`cQLM*1f5&uoBFU4Q?DG86NKbTAMTS4aH~Gr4K)%A|;PlPQ}?BLt=+6kBM8nDC(r<9Ckq zrR6vA(bM@8ui2;zM`#f)_i6OZUBajRTe8<3AFC#UA&*n17$ZMj%QPu<2H68r@7}9l ze(YV#4ogbGZz=4W>4hx>9(+Uv6){)at+Poguj~U78doeC7lYWc1u;7s^fbo(cP+K- z(_^SbXv`6yx(2gJ$NhcFIbTs>8T8oI-SguW&}6bR(EN6=>16}$f_@9rv;Pd`oB%$c7XZp%?;ZjmjlebB*xu2TEcUV!7=AFGmmaqZaL_C_&hly6LzB>a|=25 zL$@D`@~lSHM2^@iUEx-v@~0aO=Z%tVXytcLKi%j9!~BqiOsJc0co{X7mKOWXflz|^ z=0Hef|NO|PVBYkw)86GPH9+BT-F4D)ndU{VJ?;VMY`iahga)1djDX@H&*44nzGv@-Kx!FY;zC1)mpO!(A6- z21|!p72nQ$oQi7-0e_EQ_YFlCo3ZLq)oZg5^p8K0T#-PX9q5NTCPx?M%j9c(U*lbQ@^oPdm=iyOk05*({T>6_ z>r8#EE#HCGTTGzcXXV0rLdbV_%|Cv8ow~Y@6LVqEK*v~;IrmPuV(Rk$Okh8q81*uj z0uk8J?3qA_z%JvQDiOyF;nF!VgDQz@VRR2b&iIy%?HUyuN>`O-QYqfp0+U_Y8N4%w ztK?)>Ouimp3fKP7W~n?%WSPpM8)-^JrGJsw0csAd>N*n?5+ui6i!xwB ztsV4Q>IJs`uW-}q<=sOP$9Pp51*j#F0AZYoF#=u8F$ko)rCXuzx>Pb+8jP5DuhF_% zey7GUmj@I8%V|T?l;;q@Vs=A7kp*6}xQjTHo~Ok!XurQ;XII?5=^7vU0{g)p$7`m2 zl$zHPvh51M_-01kpOQhq`(8SAGO2ZLoll_Y*Sui;-~mgFLzH1pm_Boa9_c(re!ngB zeqQmgcmG6{wsyQv$&8Bg!Z{m~gF*~FxH~p;-@Kuwk^$q^r&|?M-J!V1K zv%iC+yP-(!=a8Mc<#VpWx)jWL^=XBqC#?xcHgXUIKP-GHCmmS>a=s zA$jcjDIGV~@L{Bfw>hVkZyZ2J@)(g&$aL#JL#BOvgo3wmC@i~|hDplOE-+u6wrV0< z^?k(ZcM(L_gG#NL;p1r^#p#xo!q}Y9AeIa}!AV5!o_rCUXq_6$j1$45qJPEA&4!hc z&#;Cw>GNw6Q8NBTHi=O#O4JE~4NP5HEt&UkuFlDNq&WCoE$#b4f8+=F#N3Rq>VfS< zC+5gZLkikI1k*%$vrPRMG#TVJLDO>)z}oP_c?<2pjx(WZA9qBLm0s~JdsVW6Lr$Cq zQ}_7c>LNaaw3(6qs^$6I9Nz?n3bW638LN&aLT%g2bg-{rsglRu-n7EEHLc)4(B0Z= zqbIEqPbs^JR$8UPTI1;1(&~%FfWw@_L0hTPUr?RBDXSQC0F+GJPeDE%yD?eV)~|&p z_d#>bMRdu=l1{25-PdL5ciUxs^wMGNq(LTCE6yOG*O+Xry7+E>+lzx6Ky?oZT$eMl z0V?k*vnhIhSm;disQ6@tF9rU4511vTDpm%4fYDHwy%J_H5wVby^&rwQrS! z@mh>Zblj%wTm4HL8z+m(&j97=XFW8wXc?Zj>Y;SUjt)t~xiq#)>3Fq7Mc{Lix#Es^bLK!WPnT&QWiy4+Dg*}$UbSAp$31-g-Jy-V{R`Of$d|lS zMf}&h`YZMeu5o=Jc|`iSYMbpm^{Fa6Y-b$yxT@J|dRP95uyxj;9=*Mj+_loYt6(T&kMZ!! zllBFd1{|0I2%(=UXKX3xnn{95J&CmhM*RrQ6RL`Quh9jt6UYNwF4#FqaaXLi%4lw* zOHCG_YZvNw1q?>Cf-0O-(kZ*Ia=XIjp}day0(A$gw)PcwDas>8F-R9%u82oGI7!UDCAU!545)-{7@Oh5xdgz}}E&gpD@d-acrO z!jg<69b*ovWYJ{M4#(RNS(=XDZ*sK$1qf#R1qe><1J!Wmp7BE;q{IZTU4WE9jc@K` zgo{pApx`Ee^{bF$;+)s@plgG$=NqY(t4hE7fjieZQ$XJjFvdrmeM4RMTrN?)-UwC1 z1BE`0?x6OPjm7v}SFbDJTt{^bUdb(3eIu=YoAt;oj$6lzND6eLR-A;U`?);XzotIc z0|VfOMnrgnX7)hxM?vu&ik%1#`4MxP*C~zm8)ENFNu&4I6g1jy+cT-up3J4qvNw6a zJF%*b;%P%}>E5f!&C}>?%>quNLsJCV2tM^`^mAhgWQ3Mh=cj+jrHD7c>k8AiKAR@` z{rCT6;<;x72vp7oCW$ZI>P~}wx@YXXEI727;)SM5oHoc#mN;$PQ5U(hqqC%0?=ZPA zeI!0#mzNkGl4#79o(y84V~KjwIT{gaeV5PD*?_PVb#m4TzQ$H~9v zYPxBxT%wASWsUXNAUG*E+af-~y(y~PoiSoV@J!hFsAd01eVdz`nzr1JKB_O+=4OkH z^y*aBEbw0mzUN~xTVBjxSr59yRmXf;-_=cF{yRorP?3|f8fWB_me8ydyOWlCvE&d(fl~G zDmJ+w6k<`ogIYzqwFh5zzN-O~jV-*j%hP`gO>Ao7u7uUxEf|&=0tY$QZw-ZZ zU^(Kob)km~&#H6cnvxFnhpNj?`_I~26V%?^S;4BA=@^PR*RF|#cm z@M3P7d9Ud)>=l!6W%RC?`j^65o4wDgtBlrpcXVz*usUn~@AwO?A_B~5FVBKt#^c0I z*&pqtlGH4dkN@m2{=XZKc(gvpSP;i@!YSJl~f&(nS`f^ z=@{%&_5$^{Na!ZUj9dOY>8m4mg37r0+hE&#SC-0*(9c$a{A|EE#n*w8iLZ=|YVDf< zJZ4e&1pncf#~MyAO&sr@0&HPf5`x$EL#mj~RjZm_2~2}ZYbz+1cs(ajcu%_q$J`cO z*4k*OUAqnH(^%BQdHp6NZe4oVar(h~uw~X7P!(H@3;~A}GC`9LODw&>Uj)MQ%~*b`7!X7Z%sjFoWn7 zO&|4cyu0*?H0=cI)}UR$LOL#}*Rz_GR0M`+yI-Vx)g`|J_vGyM3bp5t+{E#&6U zogt_$_fbY!auFC-y!D{v{X?_#rvj$pcc_bV zXYdm}%_|aB+cf(G?$d4_EB|C2Q{dbw0gsuD?@v;1Nl2`SZ#1^$1;XfLM*)soeaLd)7FlzFC_$H(P)b0yw_nqHO!mo0Xeb83b~@Vo3{auN#Y zy5SqJI$p*HU%h%AiQcCaXBMI5C3qDe$2=cK)2ZSo;ww{V*VWNr&f7rrlhvECV~>aj z|KQP^T4UGhAFkzf?5;1qCTAkU4-xJAiNj~Pj)x$Hv?kla5F#b29=1Br4RiiUV(tb} zk9I*sJ?TyPLlG4BS+|;2CnRKX1ruM)Dqm22M_65Hc$Ufl$Lf!Mc_qK8@^Wu5JFX(y zdi6XGd;q=Nj+yc~&PRujZdg<)aCx{Uq{`LnVtv4@ z7aNvew#H&t^-e?uX{yrMdQxf}49<=ej=tL#eV7aC1%#NU#q#;wCx=4bEtDC)%3%*! zXFD(NMQ{!kv+?SZQMe&6CetMA1m zUnUqS!V9KUpR@OSj(VNom$fl0l#+!P2>-eB#reAPwSED#^QGzN`44tC2e7+yhah(M zY=|<_ejV$MgEZz1RiZBGL+Q+)=x(&1u2%skrgl`OKYXZYT}!&fc7jVR_PLIkFeS=z z0dk=98AYi?Ce!i`ru*uKHN@w6%nXzdAp{{u*CdBAE)6ItctYrI(zobtIzV?TNxFkB zX?pn;J3ba{*Eoxppr47XjR6gCe>sDa6*uM~b~Cq?26<+7;!2fVqT-suZw^iqyv=THZ;m#(|~UW#EYR-#%qIl2R}mZ|@` zXyjSfLSa}2#ws#h(GSWno07#~#HpeoOnPD0cIPcXJcWu6vdV3+i*_aOn&S&WO}QQP z5%k*ZcFlrR<`kZtg1R4~MDqCLza8Ta0!O$r^5J?P-Fd}eSdsa;1QpcU>ky{w)?C8PP`g7a&U_5~D&D`A%9TF-$xyyD{og@bqBefde-S(Wj=2Xep%H5z+gd$+z(}$-wWH1*&gBn-n zL)44(`E5YLvppyP^#Kwo${#y4&o|w>CAk@N*ezLCf{H{7j*C5JL8-}WabM?(G!nP( z%4Z>w!Fr&F+}mdM2j_B{aKn{hD!5=+84sazyAilB!wF?9z$u94n}qDL|&gb zo?z{KX+I{-+EeT%MX}oPiAI@7(dPBKjNr#MWoBa;>FNPmGH#DR4zG==_0?3kiecR? zmjSTQej>Ghoh-Kl(>KW7^w(}YR?u8 zHP0nzz7FZc_q$~|&~fFXBc!tXugk!A)yEOI?>wm{zjsPnTt<~HrKvhiu7a!Ti6}jxVWV|Dg@zQ_%}ts8k%HLkK?J5}jJZ1$xrH zv=&BIm?u5HH9Ir_6uCEaE-4F_mSoPXoa72>D1@OeT_~&MN~fy&THDt%jDxVuJUuNM zD@I+WD(z)n8`2PN*MF<-7J)7wF(wk%D;J=ZLO`#PajjRd4&VaF)kxjR7fH11TRq_N zV5N@yWu&$3=jFY8$Ufj*l-26)G{?$?>V8P_Cw4-ifC-9L(*4&!&1x>26SeFL5YKm@ z4yO0Y9I#P))IXNMOQ{J@hi4VmKndS(NA89vEtjIG{Bj$S)Van^f)yMYctbNOPmh6GZitMkNxdh3PC`w_GVK z#&7VfjJL9_AE@|2qPXp5{YOZfAbnxkPd1pqef5eg0xdByPj)}~E>L}akCc(n5|c`{ znAJ;PhiY`|KRON2B^;l6Y!Ob(B{26D(6iuTZlF9??iv%}NieZR8M{ zefG!1;?gz7^-OPN(n_PkeX)E`^QL0Mre@#qJrU9!%ALV+^4=ILo>*X;6q%F9JUNjs zd6QB1m3L142k+eDAH4Itglp{oz&povo0>MYJr5g82a5o4EMWdzcHj)u;t>wmdGm+* z;jbUhbo{A)?#Kh`=imbG9dk7Rm6t=IuRU_B$#0;++tHWz5^l=)i2=0Q(+j`MJm=5J zJl})I`F(B^{a^sCxlZz118B|{1Ly(B0QyDJ-v-d|?+u`9FGPP~p38fr5zMt;RDoy? zO(mC>J+z(UJQzdyaIjZP-o>9MKNSK{KD>x^P}~ZVF`T_?z)2OUN;gvS0MT}b*khFd zxJjj5alCNs){*|HjKIt*PK9pOw>nJTUySXOVw=j^r+Je*baWcKGlwK&_IAX_0}fXz zK@?rt>@}$_tm`bpE@Wl~W-8oeCTJ(r5ORlXDzbHjRa2jy{3rLE^Bwmb{;S;cA&7hK zLhOTLF2p@Q1y$p;@2c@1%7icPi`b#{ev)d&>3btq{JbY6xdG@|qQFuh;&PWbKH{W^ zY1)nNjG*~{8$mN_zhR$iI(pk5q)t?xbnheadygz<9`>s`3iRY&`KM^7tty-4!r(FY zxt)1+bw1-~2_C$)7FGs(^;huP?;6Mk`ZYp&Vw+{y^2y`F)&2{`7z;<`hv~BE`>E z`be+Wn0%|+Hj^^{IpQ$3cI4)5obWZ(JXnfn^Vp8s4n?r76D3L%M!TBx^lh|8-wd%D z7G6{3NsP2U)EMEE;zadv+xv)*W-OLc>EG{@tor%wd{-Bmn`H07^X7<3!%)z|_dYdE zk&W1nW>%P6Y5;s*A>3YF(zDictE*jQ%@98^t?n_s_i$&h-3gtzTO0b%wmN8AHQg;D zEzN=E6K#`h)vkr~RziS>zAY9DZV#*4y|%mC3gztfrw}6Kz(0fRTn0<_*!$ z&(Jph+$wX^PUXl50)%+LiP-sEa?MsJTe9x&Er34F=Qmi#K`wci$0b0jTybsq80 zo#30iKQzWPta^s7`T4aj@U`r>IP%EXk|XKn1yY+N;n&t|yuEd``xE_hp{*t(>6zG` z{lOd7Aj2|c7_YPFz;hVbd*zrR!EkQ^6^5^s*5xrSBzNL5wNLWp!!&fYX+15Up? z#}qlm2ts7HS0AD8U$Wy;|$R?=RnH@b>s(no+vM14vE* zR)mTaq>kxcj=2>*GIGXVlh1V>LJI5fj=)qT9PDkegL@gyveP|Bcr)ZPOl-*0>bqXM zS;Xh^-ptG^ZJus9>U0UY2?c^>r$lT)cT2yqj;_WyxqlBlt==kxuuAInU!KsuKlOyp z37pdt`e^KnxiRQY<_dyIAEzXwe<{T)Pk8IqmghJ}I9>$ptQ|dOP`TB^+H#9xGHo^6 z7?)&tPYt~*+Ltc@(v}s8BiuUgDA3(1rCAnj&aos?qpI^$>Vi*)V3^~VX*0E>h5c-e zPd4NPiyUnSo*2@~r?#{L2~Lrt5s$^9;e_Ml*;>SITjxe*`}5fPO_wBumMv0xD>ZhT zJe+}ZIse#Gk~2QRZXQy)g;Qe>*!bNj{e&BmG|g><+n(j+>EWls`m2r525G3Zw6TiOhPaYGmX(2?RR#j3*g0fAV@w(ewa?paZ6o*ZmA>Qoq5hbe=N(5z#ydk z;d9&7_Gy!^#}3_Jd>yqsRlf1$u7?8Nl66@dD{2EtV%j4xd!5zJE2(f_W*FG!l0NEq zK^yo@j&f%z8cN5T2vU4JKb0!giNzHAR+8BLWm0ls8ge*xLYc+@O~(C73qv(`2%*EM z+WaC-cZE=AJ!34x`cd21g30=&g&UFdNF{%bjCuw)s*_(NK2;G~=e&aA+ZM48=F6aL zHk8Ln&~#>JQYuCyofX}D`m!Z62Wx~`(9)podEQ0i?hsJfM2Lt8UfTfm0e`QoUH0=! z=k3P#Gdq)JdV8LDq7_&jbDfnNuYmc2hs^SG%Tj+omh<3TRg4CY-t|AY%ayla5acSE zQv4vD*}j%~A{Bs6J~|DTTGZ?mx9sYqOjR*gDn-BX8cBRalE+cvhqI2-N+&72uOYbw09#yw~Uguj&(}a{tVV$S5igS z?Ga~#;kv{;vTYh~hGJ13?%|*s5BIh|X?|B9`E zHBQc0j?{%+_dKtW@Jp#w%VXqai{}Y=OdUFQSaDvbL=kL+bctVA_c4=MLYe4CuB&>j zZ)1Q!T!{^H?bTVQTM@-^Ka0~4R)LvmH!cO{PACJvsz91gN9x-kw%qmZn^UjRop)px zLVdk6kG9Nl4T&9ua+v)}drjvGv>TxuWqzss_pG7cuTDm zbYr57)bNwFvDOydJ$ozF((|J-<#8Sr_%u@w)9LI0IcuI7^>m7cI4ZLk2o&XVyo&i+ z3f>eTTti9>AlG@h$WQnA@n$AdFIZ7dw&dnBDmG`NG4(G$ZS}CCTQ2F`2)sHfku9{F zhtkm3GIkS`Hu84fEV1@m!kFwi60@<>y8ohqZc2KIWielJz*%ebxWw}WSUTcT;2c*kS%<(QAk-Mz~GiqE*!~C;50hJGD zJfPBocKO3LP*Xoh$^q8g;C4gW_ubOCfYs{~gw^V9 zCLz>{85PH)Uy_PheNMU<-tiD0Fx9mu26`@Gf+E*1o$w4K#uK`ZSPW7^3$V@4K22vf z&v4_lyn-$$gl+QJCq$G{pyX-AUXpe$kV^;1^vF{Gw9_jfZ?8zi6;% z(r3zp{GvPm_KOb1;UT|h3w^U_*;P{S)UoUvmoZPQnQ6iE&7A3C zL3}`#iRdtYlas5$R6ZUkBM|%0fnJS5I5ZH{SyQef4Q(E_9^(aRX>>oLW}~1i>`jjF z2tZdf)%gkFoRYzg$$Ti@uCKT^#~JzU^BJiZq`A#;M*iBoG0B>)L-1Dv_X}u4|NPGC zOxyFjR6Z|5z?prfbuNAGp)&WD76C4p+tZ2>8*XA^oAvfbGavuq8C~<8XLO%Ez@)$Y z8)^0nbeqI-->O!3ti zht|_D+<*{O8v%}gGJTPNh~+hU%-=XR*|V;W)9<_;ZC0Sye;U%os;g73!D7Vwg$3E&sN3E2-K|=yyga_x|$1) zdi^{*IjRgTAYMoKrpf&LK`n%4m+NnDQN6iuHEb5+W_g0Jt*?fqR(v~x*F-Aid3^;Y{MuHX#5DeHw z!(w3il(`|L_~lai9uo7FWk6=}=I&wf1!qVwX07YM!^(7vRO=xsV@@pk(2rR3Aqb0Z zeGKqmFRuHQ)Cy1b9baSoRmdF^a1`(PkcR zKzp0daO3=KAg$@B(FZdZV?=i#eLhu}O4%P^v-y>!dVa3`&OUBxz|+k0qKA_%7KWBg z?8bN7Ia^Cq7Z?ut0>R)q(6Lmsx45~RZq zYtZqyigHp^sdaUfmct~n#2<{Uum|s6pp4Pkxpo5QfkW8b(hO( zL~7J_wp%hYC<)KlBb20vf69=1%g=*Uh%sKdv4%FSAFzJ-7_QW&6OG|-j+r_BseP$H z1ahFWY-H^Ao>s(qddi0F6c0L`D4dCr@kMMM;fyR6DKC{AFfw4773W8R1!?IxOtZqv z*+XX>3v;?&gYmZ|$!DsXEqkEDc7w76)UMKbcwmk~z-7^Bgt6GfJ9PWcpNd2bq!GIG zbc@+aLkXUGHIwCTa&2 z%RGU#p%zKKow$ z8wsl_*8uZL(s{dDQi^BLhBmj@-Eu-ErhoWdeojZy07S`GO{%y%LkNzo9^*_^wa9@S z)jOp+(Y3YJEE%zhLaZlXM!ktk;T-Hb91HDqxmCQV`eWT94|AbUWsBO&U>WPN0}S%y z$#c{6XQ@*a4LT>9{gH+{yh)e5>WdBIYfFs`coJ0o$4b5!vJFX@&SB{J-K@g#?8B(nH-Zj!?v z%iS8}OxLGml5n@ji7#Z~6*+D`Hsn6y3zlzsdaq}2X?-ay*};e6v6NonU9xKgJTVI` z`eZ0jfS>V;<|=|^v?&!)>ys-pzlcqM);aRrqESKtvHvDh^Sk#>c?F0u>5?hn_Nr9h zG)E)nz!^3;Q`TD1{VD6_&-l21E;IYbSkMB!jqQ0=Pm!4<;d7y)z_?87a(a&u{{uSq z1D`Xa}Ary7lbLjMhJ0~?K6fL_bP{g zF6;`Y+3};03DKxnPRcV$L~$ zj{Pn=M=pV0xaFsSPS-AGhYxI)M8tMmC*`FA?B3^*UU#g(Cs(tJaAB z#75f=3?0_8CsN*2bI~F?+sn!+=51Q850T{Cfepe04Q|m|mdltWCnDN~J__T;t9gCA zuqkz8dWZ%d#qs0xUTFrm#FMz)wflvquC}+Fbvt2A0;z=XQcdU@em?npn@yu2{_O@u77K7 z^4%5nWm306S>^L2)3Yw`{CBtgU&dA-IzbmXYWVIU3{)c}Af6_!Ex8^K`2SxzsIrwYwv#iN>WfRRem< znNfLa35nKqUW2Mp74wa)TOWf!hrM-PuW%ibK{$rR3{BfSrD%+Rq z<>w)XRk};0gZHc{zRJZgwKgxRDBOqaX9dZ=B1_gVa`32ui5L?>bW2-xUXHmKHK;-M zu_{_-!pfr9DU<`7-CdWPu?!!PA^EGl;v?O^+ADTj^jTjMAzs_vci-uYyypFdt>4IN zD0lyVBCjbK`z)`y_&+*jF!U+|=9D{8RWW7vOaB$vEcjPo^G!zcufXR27J<#`okD+n z@d5y}^?$`SpG=}Hxi)y3TBgL5gxvMBTrnM(ZcO*%=loO@T!Wm2!%+d`=U=hSzhawz z#Ww$nZT=P8{C{3-GfOB^y~au2I>gx>E}3n=$@sSoRVR)2J6P3ib(2Y=KdTc^UmcSa zqUo>>9(eLl*^?J;GN&V!+&)!n&ziSvtK0LfVQ%vlE=qo}^^HitSq!gX4~>ACZNA;y zj9&O@x;3Y&#k-idj^kVPEbESJ{2W!=Zb;K!|6dyBCz{=iQbl;c3$peNV;|QYEVv~v zW}_5$`qYhw-1qJs3V1!ogbss_dMd3s(=a;RKXLnj9;e^P8u-C`NBZ(i;@XJCY%^p` z<`5&jAs1g{h9s+?K4r?}sK@ggI;+xnUQ7<(q34BU*&6%WkIG>fEn(JTu9nhO9Ol)w zopzy9J0ll{U{cdHTH3tBY0YMQ`kDR-%x~mQcSmf;+0md8*!U3boit&Da-14(7%j?z z^D{_5TqPIqf|lk+N&=R>E9U=~vK0yOKldH=Ot&L;r-gLC`1wNO*fBbD!M$qwFE zclrS^OqD(!;lM)g$Go?FqJJnoScQXjdqjTJPUd2EJ%J4-FFrIKlF0jgiLBRgCPzg^ zHlUb5#2L4F7Psv#z_84zYA&@I#i%m`4PjK>Pz;8->?P~6E!lotPKclEj-+wHwNCSQ zZq>beGfGXO2q1Jec^%WWEtE#1rGt&nTE=fbC93T3f9TT8>q7Cu9e{97gAb0tEv|5T zruw(rCtoZ3Z$BvSfX>Uyxz+w5`$0dp>`_z{u;xzQcGHaw5Y9bnbx-NNXG5*U!j)C?IztC)X`$+?Y8O! zj2RJ?A_qq|?}-pqb+=O^ULhI$qDAufcNWPOvnuW=EHRRd< zyy2m^5^6ecytdAzA$0AY2f$fP#!@uK3W5jZpUjSu8k^YoBp|enyvAb0Rs^Rp<;;7f@ zGr0gK5=B23!va>vZo1cQMk!T?d)2s^qb0E+!x?tFaBkY-Yx1fVzi#v)1@)J&TH?)@ zwCs#iaJhx`&LjfjJ!uJ=&p~Auv)^>eM2=u#wd(^_CEB{hkOP{IBlv6K`Sf~X)kH&v zO{vST$$By&myx%DTo4sG}*5vU_Ww}N} zwJ0~QXAlCO`vU@gA_^ej858bSEtLt*2>b9MK(KV=DAQh9LM=ZwvDOVY*_sfV>AXCy z8`Tzt9j}XNLd+KG39Af|6Bh};DdB3cM>O)O37(R4%KQbl`^|}grTEOjwSxPYkt*Y= zZ5|vi7K6O;AcYIF2hu z%#0`ldJX#EtI1WXx9!$tywwRq>)BR&WTD`4`Nphzsuy`Q!R?&Wa-?j$OisQ+5lo}&=Lo}*vD#pv5&R*r+w_(ulBKLer6v#2L>j*Vq~^^O(5Po&O@ z$kd#g5?!zmS{d6Hxn+)lgB+yl!S&zl&i{Fo%@BaP@rx3+n5Us*SzsQK^V#B5Y~8j1 zU9p<@*0HQUWSZ~Eb@9H8p8cNhy?1t)>b;YeeNKqt4%98^6Rvtn)5w(a9yis07iG=K zT^gstpBlM~lm>fZ#?+kdv@|>N@KKguaGXq(xvng5dGVtVS7=`-JVsoyl>9Ow5ZQ`Y zpgn@E5ieExUC9CNJt?tTRJFUhVnjT^a%`l!Myg^YlL8ZFSCkkjafWUBE!yf|RP!?; zGRHH-(JYo+)tGXGeykyrgF1M-QfcY+?)$%@0+Uz)ZNr|QThtQ*iF&fnpVzZ`xePCh zm>&bI6KRnLtaioNA6mUXj&WAjKmpFFzAA+hQaP`!qU)eZHBxl2-})e}hUxx0#d-( z=gOUMR$R2^Ft|t-&#CFbMndxSjtD~X9E0|K&~!%N?7NDM#}?CY$zenm+6LoQB!Bw& z_!9|V=450+ApM>O*W_|+pFWVXPkOw+x%J|e^n7_2dtIO=xgD>2PXnxoVqx}H12`O7 z`M59`vu7@g=2?@yoV`yn4my_?4)toKz9r>b10trCZbczU+}Ad@Ve{@AZ1IU#+~*AG z$Z}0#PQ87N{L=OI@EL3EXAnOa;9=LGa%2d z8o=i@ixC5Wy`(70kI8S8SVY?fdcwG5B(RBt9OfUXoBUv$_a%zx9{RlUaF=$nJR-EO zb*`nN8?P=wPbci$R;&GwfD?UU^5=I;*93!#-L0j-vSu`dJgD}}!Uf#59Ajm7C5)Xl zuynqK8wuAFc1ZZGjxn)ESeE}b6RZl>{e%e*q}@3qn9x?*RFBa*2Q%u+{2WJceop%Z z$w-L5uAdk=$pgNl)k8 z;(kSFPAcwiZx1$c`~GNe=31VByamCM%=@r!y#+Z4O?jFb`%(Yec+Oq*oCMCMR)DHc zuCYrAwISr8P9l;BW}Us~q~!u|(iPHuBbRod&5*SpxE{#5iaUV~1dWmLbJ-vXa+t9T zpF&xOZxDdhc3!FIc=lO^=E}IeXxN-}EN%(zlKST1=b_?3o=2G0?>uNa+d0Y(YeQ&S zqmgTM97(>|w$tE*zxtjnjgrfaitE`_VO9Sl8brXbSM4>NAs)31@xiRrsM`g-^-%8xtT19q3v%kA)? zi;J!#(tLsG+7i9LO>F1b_@(?AWNJPKnO|9da9afMPHt9s3qo7n|Eh8ab!rT_xp_XX zT=v<`ZTwp|w{8C?Zf-?qqCAF7;!|ZDrYWjJ4xl!}oVwWja-^OsY!eH78P%a&jk@#x zcLl+hAbjA=MQ9Y7Sv1l-2T&{k67~)srGBQ+DVk?}y8W)bf}4^qta)^~qrC8I1p9G{ zimitkF>r7-KM~=TR`cLLQ{wwByZ%Xuulbe|Z@1%bKeXu3>w;=RyD?^cUS{24GBMK3 zWxlNJBE^rB8>hR@2*)kq`5H7#lYr}~dc+fZ#IiVWh87@XJ?X!{(AM|!<<;n`WND3r z@3nI9Dh|lDu6+`(LC@AMmgZ2XaE*dG6hYt@wxiDrd{TFjNM z9lZ!L7<;{J0cLZ6ub7qma~!ye!qFCF3ptN*!fcB=bKzURGaQDXZ@DqnY zS|iRmBXc4_>nK8zzv{Q9Ca^w_xLqs}=-Q4Mp3&(IG zEr_OZrtYlLAQx-iT|FZi&r4U#$9-LQO^>4qMI>#t=}pw32KRJ;5TJGm((WI;_{GR` zjstT7IxxmXbHW|h+yv!P$aS~zL&@|zO0e`)+99@aQ{t(U@D!EosPm>O*-yyHD(A>l z|2&+~Jx@gEhq*ktZ2$7)iqRkY?8qfr+Gxon6Yavnkt^u^narboHlZi|^q14SD?OMa zH5NZ@dqibEBgg2&;&8=4Vsa+(6X4Uo{l&FZo06L1Etn>D1(xQn5 zReW_sdyL0KaM$CAZd)*uNK1BbHFfQw$|yb1u+y5Bh;x4qA1mr3X3dx`l}-8eq^9cE zlbSPkKTcKj<(<82`nMpb=6^pv-W>nzlb>N^@9id`s)EWF(e!YYivQ00Da>rp- zGgfu!nZn;~Gf9J36jR}QUc8+w;Ke8QruxbzOr#jVy*2=I?qZex8ieD;*s5Q`#=9kV zsqT1lUh@X~4CrMk)8Ur(+?D;J<(n4QBVOiP0JJ*uWArxhVqHZ~iOd=`OJ4br7?jPf z_;jS7US~y}k>l97Xb9WEYgnJ6v~Y&xXZ1prh5EFAxX^hK?f!v_m!K;sY}evBR$_KR z5v97YZ?1mBnouaB1YF6!xyPy5?7BAKKS4moIX!CT|H(P$ zyusUNFY>VXP$`bPleVogqat;`0XvC~CRBs4;svKuR6DwbA~CRJV4d^ujpt1EdsvO# z&56L#eUmqsq+>zt*CXd)OQsToQ3S&apVNjm z++N}4r`JulGmw_E^Se=1;o0o&$j?`67@PJ!)%Ff-Bt6X5pRv0|@C?6>D2`*2PJ zi`6N2N^7gbgqFX?AXtW?Rmuowa?ToBv2!VVSK{&pdCJ`-5~E>i7-~ zIhaI90LSTUIGU##FEnu$I9B^jb9x=X#{UI=x=>j1tO)%AcvO%$`;wx`98502Aw+n{ zH2s%*dHt(d)N|!`HtC--73!{CS~7NyZG1OaS4^iMam^}O^m1)lcDu=Bg|t<|0UO=R zPsdAedDQ%gCg>mKs_aucRQ3el0_UK}2}k@UMpWW+`3=+*#~r?-12))+S3@!`lUnYG za!sZ=!E0={)Q(zpfxwSvWCHw={7u7baaTj>?vEdCMYAB%l9gzj7oMTv z0*kS7K^IeFd@AZ6)`3py-Ez;M>T%Ih89GfvP*|g1Oi72|-_SPMx3z$QIt1b`uoO_Y z{jURXF;GqcYN;zzA%*?4lf#R73!4~b zkL6#SAZmAJ8!#TWw)Ls47q_>5717Rn~0yg=@ZXz;b4zQ_6hdyL2K+F_d*1qBvNa!i@(gut$G7Nf#>_}u$zmYV$*vTL! zuOfadIeB2noQm0fvHsFgeuXCKSITK;o<}42bFRyYt3NVFU+Tl~EPlMQ_Iy0z9zlG#vw;1{3?wFAF#KeHq42+oo)_6PB*7lrNk-a_X^Tj zTZ2M&m+VUpPV72?#R{j!pQigFVmCJ)n~s!gtkUm`qu-TUhOfSUr_(z2g_hcr8Xhxg zuUp&9`0q>5Pqk6<50+|cStX-V)9eOC^<=C5;P*E7*~7iEj0*XoscFw+p9S!T-#*8c zYCFfhI$#jFpmQf_mCyLcS7i3SMT^fU(csL*=Bk7xhlPAcD{{3RuJ($rlymdh@TpVh z!7J=x%3N$R9?MKOh<0l!V#3 z5*N1YYt7J`U;C1Cbnxn-4j%Hq^q~kVvgN)FuT>AD+T$M?P-J#e}WXOwMLpVvMnpE=B*M;D~F^F2Mn45z1TLz zU&?;}GP;2Zr0x%S7k(bEZ~P5b+jvZShxhr|nH0Ddk<<62inzfj&wbHeBJvkq77UV8|HgrfPfxONMELm`aV=;bx+z1w%@IaQK4i#L_4PH3 z%<_`4cU;7}lncMGJs$qKna6pJZkeO$un21AEvUVxcyie1Qd!0e&`kzKb&po{)tyf| zPc&n3OHFEe84=#H-V%*Q9l>CASqyo(Ezg(tQO^kQ$ABgE>EA=~wM27*np%S@E{9i@ zoLrVkk;v1Y`Xoi|Y1SID!%6LY`&hxQxYxzbeeM4q-Q6NK1){sVd`ox#+LikD!x>9x zcKx4Q;b3-c`=`&1)s~cG+Rgt(pPN=@JM$NPZj65Fa}!-Px6h5KQ}as~gI`mi|Eq@i zW(M%D8s-}>)^8^Ie~+vGRl|G@D*viszL?z1{|z?wkfsRvESCdZwvN@0hSvwq1pW^C zctf|-)gtCtSRMESq{0KYyjNBBQP1huo!;m%V~(LSmaf~=&8d$ag48oo`5+?Bw3GCYDG?c;?qCvG=%%B}-XmxnU z?WT}auy_K-Vdn=^w38oyOh$`bC>FmGwtgwAyO!GBBNN9wXSQ~!z`iV0rHqg_CEr&wO?!5F6yl+j4QAIEb^$sZ?^M^Op2kBTAT*G|$aQNppJWw4)ZV)L!`-%m~XB+|A8oJg0E!rBjtqY1L zyo*h%_6`+Z>5gujW_E#xxNY*q+2ZLgrShzEs(!x}mhULI$7W68-q`My0uyfc>^)Ju zZ)*?m`C=HT-Ki>P*n`5u>SNRHi|3&m;!oj73$@GL_PPHgD8qWwlaEKI4Xu(WIxx zZG~kiBzCCd+7@ANNqu2&m0S|M115~ltL;7OTMP+xPVM{S@LbvU$(5kzY_$o0 z(Mj&wRu5kv1FbkHwY-^sUcK(t*6X_IZ{bmfKK*g?)vBaz-}~BP>6gO@X7t({gMvR8Gq?p(LTIuCUMEo0I!M zBc(;|N;Gx>nDm9YtQYQH%+nF`eLHBARJ1DzE|j(KFEV ze%=p{>eU*koU@pBZ(y$Xb~`i=2?<)6u>y>cr(Dzq`ni^71nczR2dj!U2M{#i%)!TM z=fY-IS;cdY`@kgNGM67Oiv}EoBQa6NJ`yUQ5=GC23A=2T!<{zeb#_W)YfIlC|02b< zHd)uHRX6P%^7b-v$VyLR%=DWBb!qz0O+vln?prHt_+?rdq+Ye9%$->NA&tOdk$GcX zD)A2-Xcv83?Ac!0Bsflka^80zV31X)Z|dHtuJJ?Q&;_U+6XX;dtG+Yj z27+ht?j ziR*Ge@J<6BEBc**lj~jASM!(Ni-)rlyXd(jw*o4C86JYZL;y;pRVuwP$Dy1Jkbka# z*ii`MWa73%v`B!69jbKogy6GIE+H280=1{xA)MzHfTb~g2mJY`MggTNq0R$9J*);j zsC%p46;F1Alt-yKyz7l8Sc899+kJ@O&;>pr%rkAvQeGyX{tOKPBw60OiQ-v)mQzc9 zme16vYg1F}3kYSf)xDspC2gyk_umQA=PYXP`oD;-KxO@6Ve1alIW9qwdKoazYL&T1 zWyIO<5K7GbGve&3bEjXZL1zuR#TK2HELp-kul`o8*w7+O(}+%HKcAG4^&HO#h&qPB z_>B!$6Qp@-5muG`wDU4+@zJ7kG)vvSyzV^n=+6#3ZHyj%3~r`2Gr$d-Y|&)5$}E8$ z*mKQg0~RBTxEH}Zo>bMK8YYS+gf~jKB($k`3kVNagl-Brofe9Gs^rFhy%UZ#qwQDn z(~wZ<=x>vb_Nge+_Y>l&HkO)k$2Rr08acHQqCO*CTUY?;y5d`;Yox&Vb=1MMpre_X ziI!X+@P#SvDQsWSO;(XD88b)4o`fK;YBs$_e%zW-5Za&rX73Ch>3tnxt?Xvz?%apO zrB&c`%${Fh#uTsxnDK%K5CEo&EM}yrK=5$|B(e*6HL-&y@E{d2I+#zk1t?a9=tpdb z%_3H{F$nYCU#6C+Dr(BV%aaS@mk9eFtJ0cihM?H4O3@-wQ=|`UHdUqdve7^*Qvn&P>CZ+S1N-sZNKee=-4{__R zznlX9e=kp#MO)*I8i+09S%H)>fv&qXx!_(~MK1qT^l6jQmUPcb2WEfV7(m1@Laff-BK%gDMMYE?6{Qb3t5!+SMqnu$YuuJs*AXTQk0`W z_}O5S5PL+&0PTD+@E&TE;5_s`#eT*OR>NCUfamd>l8VPN!reOq)pWO~;`W@XRP>Al zy+k8~F3T)8pXt2jp&xU#oNT0(&aG&Vc#5?4PwPLJ-lQ|$%Cz6|};`&>Qx9jm);D*4!mDY4wAS;aG~(FwoV2}kgylZewpvop?~ zfG*m{IeTz&IvnTo6xMGe?69%5c)Gk;adw(E3u|ycpnb4*B9Df-Y;~bZn;P|7v*j|sMn7H+>~7|Qy^hf z*+waYsKoN~AX;KWt03aY;EMSw3tY%=KwOV~vYxo*hdD5BrW)s)jp>?twNO}bc4lbS`bt~uto61ZEY36HAl}|UkF)y394fRj z1*qfeLqYaufR3+rvU|56?YwH;^(5ItHNDc;gm9;gbb*W0>T_Ul)}8#m2Ns-jD%LPN zhqL~aY8uT2-V&iUQoG+2_?xqdbktEdgQ}Z2Jz(?nt?mvSzWz>(U18HOQM-Tl)7(|U za?(QYN`4UE`J^rWDDz89Tg=aywySh_Cse94-LN;m_8>!p_9=NV1#=O+M#j6(xI(EV zrQi|fk3Ip|n?DXhVFZHKG>?S2U$jM$=phMg;hB%ZQ9<|9XGb?#4J5>cZG~`WR)!Ra zYw96dc|0Wjzz`s`4V0670FcF}BEt7GtrQd&?nIYQ8(z=EX>;R_$SSPeeR1#<}a0gPr3?0k0WXf_ohw*{F_5NM7%8*FPG7xE7&4Hest~Lb7ox}qoduPiK(}$AB zAj0E7Ii0v5fAPi1cdEs5gh{f(JEww?wu@ic>3yKY+I;Q&d1q|j1rT=7#$SJFqO*LR4QZ`nh-hUG@}fY zFyj;TYsKaRWTs4JX{dw$>%yL=#RTr{ar@@7@F6;?;5`odD9AGx;JDk&Cxh?*-&u zmgMCnYpuSh_F10$7s<6gP7~qQ41aEn-)Wze31Gg9QuQsgH*mH!JMXN>I_yuAf_Ir( z-4~N3Ayb=@1>1V%E`ic)2Ly-SS6c=uFh}=OV==j|uZl*Bd&5V!H7*h31{yxjx(T+N zt8lB>G9aDR?7F&JXXd#=d+I02x%vE_kpK!Ss zVM9s!CSnmNOrGPjXFzr2?|v2uP`sT!%lG?U>ri#yHwXBU?iYGO(8apiVeMQDbC$2> z{+!d$#y)Scq#|(e?IanE$nlH4tn$4Cl1)q&F>kaH0lOQbhpqmZg$fA{{`=_Dwa;< z?)b(39rjmmLN(lLib_*O=oZwrYq@4un5LyRmyS8c3(spY4_1VTXi*^-CZivIc`?V< zKxK6?a~oeaT2_HQl@#RmAOsm}rD(GPyQng#({1g!Fr~S`{3wuiCs%_H2V1EDsfV&E zRs&?ikX!|F(oDHP<|q+#k=$`3+;g5xn)*>1Up2}th^No<~P$uc5vjLg7umu?@d-DcYC!P>u=l9p6Ha^rRraCU3Uz6L=$3)sIfO zh_b8@&r;7-FFnJ9YNimtfHk*w2pK_XImZFUcG1P*?9BT(!1|4UX+B$HzP%T`YMtsz zhMT$@lias^e}Pj%tN~-v?Rm*N4B-nzY7D7XPCo)Q4TTgh{~?bXgc;f1y=JoO+^_B4 z*CtZjjn%DGc77%XSn)!9-wbpCk&l48%UTMd!?u5!>OWardP3Q(5}a%)J;{YgK$dRU z0h-21{V$XH%9VWH<9M5&#Ngo5o!enu0m>tz+afwrR8XCU`bW*YM-Ng+;-qJ>)Ol_q zH@Qjl;jWmeV2R%=f?tUzKXa|bIl>Wj@mwCv_y zhd>zKFz3wl!QcJ9tpiHFiY+RK%x7H=3pA#~_RV>17!%eh`)|ie7Pya(bVN1JO^4i| zKXu<<$<)MPM84+(vvVM`FI|&pX8dY7@av}C zeAsmxb!Ojwn?n}L!=CC`=rlWoXbJMYm~dlSPx z-L@(kG?%rQ-_u159XvA!^<>>2e=zdFUTa#CPI;>bfTL?KH6KuE3>nLLTV5)114Y+; z2r+BTXtIA*Oq+f$1`TJ>mMTHo*!j#rP|&Qt#&N~~=Cu9SD(F6&>zDg+W_NLkwQ`pK z!SOKmtDZvqy;2o3P!sX>mgKQ>o$b$twxozgDS>1BI!K7D=6n5POUZ-21=77=@^>4} zQ}T`;fOPKzp)UAmtjSxU1BJqptgrClWf6Zw5Ppmbe(`WxZK83>mArPV#WyLGfYYuS zvewpuW5i%)6*2&yhZWt(D3VPGy%E0W&RX*KYBd@vGs8(%%Q4s_WoEL8WgOfAFgb9| znZy&9Vib7-Z!-bNAPjlz@*~I~oH(#@^9HQkVe9r=7UrVh0tSrNM^`O36ejUcknWu@7FYc>g3$8kj{w!{5!}(>#;WjO zq*C^fg8QQfk>V2D4)rPlXs{ZfPMSq_w2-70ogaGt+;iajrJW#=bYsPNHo{{{L>bE&=!e^6!7yW#6V=5ky8M`^XbE4vyYMzNQrMd)^Cpyb2 zZr;MwuJz()#F;*GIajsl6vP^RW{BXxh^O7l)90!U-JLlXznhSRDSSWchMSW#~fJh^fMOCwF(bWg#W(2&N3pOO?@od9&7C5gm)3&StcyD_flfk=@r#haW8g%ZJ zoa{R!Ye>-dN7hnrq~N50)P6#9_T%EO?M4X&=yvz4%=(p1Rmw!$Mr5CK%}*=3E9SY+ z`NQlpKh7L-mmHIZp1Ty4o5l?KlH2$pJ-{E&b8eslPG=yvBF+k3{X-g@i^PUIf-AtG z?Hmq-q`O}vlrK)>Yl@;i&eUklor7S#t`*=@y$_BCku#oS$TXv#tAJ#?!KJpr)hD@I z{t+_&vC|3|Kr2M$)KuedMsc|_TpzN)P2Ar~ad{F&>G^{5Y~XE+Gej*P|d zA+CulPEjf@9I`qKdI{Z1W6nENv4ni%qncU4Luf9rtGN}#%kNm4-Zw5FeJRs8_xk(M zmE{QcHcrZi5%29??5m(qhuQ`pnN8j=f*A3Y8kc4#uDi8}03!9phG%toHdTVs zAl_SmjBaTP0AsKF;tFy3nTkSlaN6#HD^0U#?&|{}%}#16h8lrMAP1j|v6==-uIpJK zd)zybbMoHlDghP{TPL3ym1mF7t(4QR1;5@TfdD6>8C4XV6Xg~{EY(3ZV3;wHO|>-4 zfv%wNbo4)t+Lvor0o}n>-rXr~9tWM&1mKSG8|9^7JTkZD% z&EJD*&_>y>)RV$FHHzkCK;h({zRQtR!`uViUR^i?38&IW0)?~ZB21#em40uVeNlOi z-8iFM1a9g{AZcB)e%<(zu8CuWa4bctt@93?(Us*V_-mEExB}TJ5EO!yQ%xo!yyYF`UbM_Wzo$sr>(vu4$-j!X&Lt zMt73O=Z)_HaF^8SO0t==cs71HH8KZf}+c!4)HJEdF zPJS(*`qxliu1W`$H{i45N}xH#H08svI)#tbbcX$dl38% z`;{A@(smMbN>A&~7PUW(l~jJghA+b5mZn!u#QML`cM;$s6LG~Kruq4tBA`c;%_eUX zf1mw-)ph`)7c=%c_#bZZ3xA+q&gVH*_(hf2>8<*9cErYfJUE5Q@FBz}&a!Gjl`zjd zhbghXc+!Wl>VrFG8_nKnQL5+$(q(9sB%yNvFKlYa&dk?RlfE1WAsB)!iT?&IPNBom` zS5Wp2+J2d`?Mld-*))}%neN0{W#%3}Gq~f+T|1kSUz-IX+%$W)sYfb>lx^C(IN~S8 zqg#TX>Rt>PkI-@%3n1cNi1*;vdQGnq4Y%dUdxgn;2valtr|dfb_01P&FQ%^h$ME5g z`SNQoC{LtdDUpIyzX!Tza-NZSCYT%RgIVz5UCFAQ)`btI6H(J4PZdbjXwK*TYnB;4 z(te^C&Oorrfx(w2jgRQd2-jaL91#_mYg<}NUJ;2V<)cib_ZjR&yuTucoOEC9NsN&F3D{_8EgzAp;E!p8gd|{V)EYL2}-`i{Yuz)05*SJ6$Nche33Q^%~%=C7bF1zu=1Nvco@{2a^@jBbnyKnLOF}t%}w`xk48#5XqKcOE#)i{`YmzuS+I<3gMPN ztAQnxbfrPYh;qgl)kgP`SHA=ic!P&$!0-god;c$hRPclpOu#-ed~(U31xvWSnEHcu z2|LmZ(I{0eayzL-a`HBp$m%E!j|0y`5Eiz6|fc)KqWq^9q0B5c8nO}&Xx_Ig{w;E zy5E?IJZh0&DhI@G{>D^}yY@P45z}K|K11d5%qqRz2_Myt?tq0Iy@)M>=E~6EB|?$& zML>gFj5AE)fH*Y?$rw-@v)u@jb29fQ=(k9@=l+}p$ZyIo1+SiMq**SXGrA-&8U&MqS7U^Ks2@elqSA=ZN{ z&F#0>+B@8ZDofJA6}>>Q*3<_kd%qJimFly*Ee1qoHELEbvBcicc1t@=I&`LAt;62R z_l(pLi-l)JH?uV)8QbdGxt@)`nA7IU$fJOAe%4%)a%e?B;zaFHKy1yEMc4Q%cu8FZ z&v2fWePCbp#fm89Yq!cqrt0b^0$VpKqHMO~7VNY!*q=D&zy2D%R^1lKNtUPvB`Wjv zRp9w^dNiem3JjQD&U9?eUiI;^ctacq8;@ zT2lTgF6njAlJq`dDZ4x`dVdmgOE8UiO9V}7{KE#;p`(3){=^IfmVsB%XOyfdE+u!y zF|{h`UHgWKT44Aw2Hn5QBbQZKZ30BC-+k>a{agH5ljOLuvF_evAb3Nh; zdln=(1jeVl&_5^GQ?TR0(36DwT65!3)*4`Pf=iHzdn-o@*=}9Oe4A3CA)Fp=q`*q5 zE=c`8CDj~!^>4ul*+ul>VsFke3=XI;lm=q>RK|r%a?@p9>wwhe%sBLqHI3JCR$p!Q z%24jXXmCP9?6;S>H^>#qLtZI)PBT3FDz{Dep4*DX<6CofKI;3lZ{f4=)JC6T#cLL) z*jXgglyh}A{YFr)Mfn~}8qg-<`_o$JlIhWCl4@Au@2fqVR*+;#13Z3z5*dBT(hJ^y z1DF*U#R(>oT&wk*)O+PaVY6L+t6j1jYZl_ZAKoeMd!V7|S@3T7yw?csXxcO(Gfvv- z*|fxgF-QAsNNlf24;jH=8}R|HgH&MPTT|GD5=@B-l_HYz(EkH8RZYBQM zD}MMHk$d2E?C3d;sK@|n?Fnij2We;J^yo?_t}ZOChpPj3!-)bO(p z;UV)lwSzxo@#R-D9CE~yoVL#2^~Iy<)w`TCOLb&zQOP{bg6Wk@g&`xjAGmSTL#NAR zjy!a&i(#=QvMHiD#R@?Q8Sxx>^Vnoqad?V5ic>YDG}kb;osRQRe0#(OxQ7pS1m`aMx>N8uz z8A@lkTZBh>2Nf1EefGTxpxAV!t2Ynfv2AIk{+B{mMVP!N87enKkka$os3+|W#Wyk( z(NE^ipACX*Av$z>=4dDFTbhp5girt0LhmCLAN6>sbNEVtn)@IbVIBV`if<|=R)-6`v|F>`;KkG7jtF9r=p(_ z!GYL-yJM?}8jsIp75BDehO>ecNI`CrTj(!yskKcFAim~51-$Y9ySy~B*7d9Y!4@Ax7+m~l1+fSu^KIWJqK0b@tt{r;B z>qcE7ikw-PPZk2jtbgdx4i@mHh-FC`x^SS82Xzj=L~9jhP_XQqY(INI&;UY@JHf#P+@@Zv6K~x8-^ghPZ zVAB#EKygj9MM%36jG3P1UiAf$;TRwoQ7S8SLB_S2HcNbdtRYhc=>>q~CVj7wijf~f zPJx|f){7J2*Ir+Sdc~FAzs|EeRu7pCwQ+qVXa8Ps{dvr9UjR;RmG6Cjz5i1%@}-vp zWN%e76pQcgmRhO2PccUDrZP^y)MQ z-pNwk^2#qih(;4N4$!6zeEYSd@S1MEinm?ZwO%YQz2C%T#o=D)`=e8OAp`soqIeohrffg7V zvI5Ha-Mhan@~w@4cy6$)r{0j?X*H{jTP?}5I-&bE*(BMzGMqp(c^cUoEE`5N?pu7b z51r?B*D0?9)#&5O8vZ%A4v7sdMPKp_aT7^2CJnq=b2~|evgiUmjeDiA0 z$xJaY?48kqJ(qQBGsCPzpEFBz*i>t7$jPQpt~Z1(BV8n9Yb_l)SD_gqDmDV5&o&Tr z@bc+D#=75DrB&BKz(_xTGx0pg-abeiG;29d-ropZ#3Wb84Z*Z`zK>iF#7E~R9Nn?4 z`Y`_Uo(W}U#_r=2IsqdC=rPbi*H^XP7ir@}x)eT$YdTyh%Wmd(^oEjQP3>YHd&HUP zMuzn#8csS8ol;xoMgq`mJOV47gP-prc*(Bx_3)Tp#DHO7^? z3Klzcj9*@lK1&YA7>J}5a{Uvpc3TGQ45;XHFKNUm@cjyJb0ws$s zG~3kuMCEu{;^Ewd4TkRH9vX8u2q$mm>%(Zcg{A1Z|8fn;Of_Flt$W@;35_+k?hyQmxND|^8uN>OuduL{t3POX?* zW#pgnX8->d?)m`0T|4~uoFuR*1>P4I{+{A_-j})!AZ!8JrUMS(wtLm3lJV>4sbt?{ zyz|d3Dbe)_M+*ut^wKthx@t!9QA@(n^;!5Ec2>T61&O?h$_ZBB=AKSQHZ$Gn1nbkP zj3L9Py~S%`sZ1of!;qy!G8s#0xRJDnn(Vlz_vvj*izJoLypVHYj70~?N4~p!Il*1- zdhG&(xaJ0BzC7FARY4P@=@-gGvii1{t!7OLPqBwKCm>rrYssfCS&0$_D{CTz8TfH! z^d;65H*A`r+mlRiFbDNLc+-vaW?%;3L|Obpa^O5C$|mSUQ7RvCfzNZIL_;Ua?bmTH zM`*F@8s0xSq?os)DGvyh%Rl_&WE~swlP#J2*7z@P=|fh~2nyj9(ptLHD6)WPM|AoS-y=(PDa-*>tu~4Xf!I_2l-nxu8_5o;W2&cU zBDBLXp~d&}cbIS8bvHnjw=^1#wG^jH`-fSdwgi|QC}+4TFU;>D>#mdzWM=BuQEy@V zQ4G(=D-bJ94cX)jW(DiHc>qf=*iWsTs2%@&(bYBgOH-wv3OCTVs(CJ!HoZaTLPrE1$*LRbr+dn0-d5P2^~U6^IsFYnjOR zd*NdAdv2;jEJBjA<&?F)v@4=Hac*|{4J^(iK$11kiM6*k^a_3|tgJn%*tk7I5tyjV z2Rb52yWFxIBNlqOwAR4*`d3K7w4ss=I6m3a=>1KN;RcGrsxJr^*sqI}ns1rC(M5B1b-3Lo8k(2RLbe5$M^_1PP17^V7x zq?!Rw8_>NEhp#!rJ}ua@3I$fnhck4rgxiRwYLLQ6(3Ghm)*+?a9_eVB)9NkOV@Ilf zvDNf7c!q^jN;}hKxu;fO#5X?ZfKw$l0;N%36H+zzu6Dy@-FKEfQ+3x5XjZ!ol=%f& zKX6LXAi#wVf|p}e$CL+DB26Zi5qak)ch(OcYLMw)#owSJ3vrd`$+NYcBol;ZQ~3z< z7l7^c=_Q2`kTiqdT%`0&d%kDmoh>q@XGUum$U~&-1>fr+zJ0h_9)?nTCK{M+|Cl)Z zAys&6fKsF6cAoN90*m7G6Z8&YNj|dNO?k(Up+}dSW5XC9EHH01WIvYL2%k&`8-$qw zeR=mQd)Ihlc*eAWSG}D!h*<7FVyRh}C!*6$RI{UQ(^DO;H{$iZ%8SdNVICEq>Jd++ zvwm}TrN}y{dfMJ@z4GP-K%iJxEs4Q-;9D>&7^hUFF@Y;CZJaa5p%*+EI@-ohP+R_6 z)gZ-q;cq+D);j)dP``HNk*mv=yu57i+tsUEW47O1eEjFT5!;?eYd9W1a{u5D-+!;t zy?2qzcaE#O_ikQ#(Bb&rYuBzB$YgxG56pyN|59{l$Q}km{EFLpye-#Rd=kNDuOFEc zZhIXTOn5WcZTPD4zEedHkG^;%CI`ud|?DV-5PwJiUgCk`Hh{kiy0~N>F)YX${|&`a$Z4 z6{x%>9CTVv$o)EAM)6iTX)#WKVt5r&(&IxYypaP9pUoVtYTmes+4-YKxo=Wm_N>+# zKxx4l4|R^ayZ7R!vzVH^b?$lItjvpA^64p>C=zby4L6zVJyxN<8+A5}1fjKut=Fa6OVp*>(aTrka<(=)`0)MXW6qij#s(m2l_JF^l~EglofOl3Zq-G=fOhUi?pU# zx|QFTrznwHj^^ERK1w<=5R&kYMFS~F_8J)$HkY**8uCP%g8 z1+vEhP93QsGZTY{->1;a2AwLCev|E?bb=V(PauYO#KFB+9>nlU#}{5}fE9-X%W%ufEGX=|+V{p8!Z)Wi1qnGxuqj%zGd<|4RB-`zpmB#v z&v=-my1KeVc;FYH<;3j`SA$<9&YQy9yz~?LaE7*Z^``u(NUppu zc!dArYQz5EYTFR}kJ9)^TG<-)G~EKuv%cehaJ9w8>A4N5!IN1BM^T`U*Y44Pr=}k= zM-ohMfU8{+;*wFk0-g9Fv!^Xsa2s7?d8bj`#HYIN!Rr*b<_69dHQbK_2*nbI8pfIJ zNOn8DT{Tc3Ld|lXc^VE6P>};j;>1*|QAK29;s9S9Vk175Aen{<3@!IsYrr_7k)DkE zo#_=7B^{vEr>#r3%{4M3+2g?@fwHW#jN|7Sb8v3%?HM<-C(a9|-vM@d1@}GDq>r}% zFv$j&9q9a?3b~7c>N9oatYO<$Dk($3A{2AkPZGLZvLW)vU_O>TTQ#(Nc zN7L7<0uD&p28u{Rk3b|{|B8mB?P4Wn*bSDIgIn}h0=fXn8{s#qPdgZ1*qzsltqmYe z-Kfg>J4u^cJALxhEawSXsz!~>dbyaMSWcdKo$V=8*K3F(rLtggQTttIB{yoqJQ%qY zqGVYbVsS{BtwN^aa&sx!c71X<4KGXHE$};>6_o3nneZ{h9IS~Epr#CVTF3s|HzEU| zN-6B4jFb7iKc;4bUG4>3f02k@tA~HgPu(#?G|nXGf5JUPJii+BB?uzhqPJUWEgE6 zcajrW5QlAwQ?qqdr-d_S`u)$Gyb^mv7w&(~W8}epH{p?G85L>TV>1N+l)Uo2ndxMV86hyQkLeUUimb+&<#@hUdAy3wKUr zaB|$aMwEYfAY#0xO5Jh=3!m~_DwPnT2V8DG!*88pQTkR_AVo>>?Q`2@Gr6`q>grjw z^qvkEDsRnu-`g?CW3Wu&%sGd3TD%dHg3fFuGnMP@pP}FP`qQhvedWCFURkf7!QmX` zKKge5mJd+mhEI1`>?w{;kYiT#&AeZ51-aUyGFnf$g{~^g?zDzKl_Vbp5}1N*9cyMBKAxF$TNx0v0Mu9~wEN>jIX&0Y zz5NtYhOiZ5>2fJ>y^$)jtRuKYq{Hx!tBQ(1s2_5JITXP=4kCCHOJ8TEOUV}gc;*2! z&cah8>Ifbgwi`{c)W4WxK@4!?QHjaBevjZ4`AlbXO~Gp$IK2@>@Y+6uUF9weslnd9 z5eqFW91YNMoacL5bET{=Bu{hRbTVfsooq*ysrcX_%$s%T`s53a@WM3T6N5Dx7CF%u z)>v%&wM^YEG;9|m===kMRKq>Xq|-LGJW>4w^9u20I0ePJp>4$7X{C_qjSM_@HkALm zWEb?7n_#G+MqrDvtVFDiFrW6Ua?1}q@s3c|1mz&BVDQ$Fz{Jd`tzUhq zU04`P5-bpw2Ta#5-9_VM_Z?SdBnFXttzwZqF4OoWc~oz+a>W|hM4s}YjQd=#SZ_Rc zFuCU*q7@apxIxuWE1b}?C!RDB^lUV*(lq##5Ue@e1J((5iod&UN1ccK|?tXzL`I961U-k8|gGbt{Re8$&Mh0)Xs zUMp9DnaS37Y^nojUl?>m=rn!;`^m;VK-&r{Lo|2m{_O&1*?_mAu;A^wbT;kBqu>6d zRxZeaEFD3+9XpJ#ybnvYdu8qdT~#2M_aKTui-$e6UBAuCHrCAlkjPBtKCkE|7$$I= zEAx65QZOycsx;omY+CTcT3X`5P_^1JGBiSUX}lxTtK*jmI9+qT4PU z7+;>=-VPl%DL#{+*3+;BKO@uAy~qA;XW~I8b!YHk!cok?-K=jbu1l`8K?P0@_03z_ z(z~32szT`<--MGE4bg7O3TVo<12u1xosQ6ajx`7UbP}A!^kfCRE^m16n+EmHqdWth zxQbphUL+F6dZtNyQJ9z8i6I>rji7d7bIw;_Ha?FUr9R#E=2%w=cXNW+BUaYa)gyHB zl@1x5TD`s|)PVD8l`3{!LUOqrrZ({4_aYU&i(R&SH}Oa3)B54D4kFLmCeFFBsCZ-M zettTVC>)K&Qo;jY*=iLym}mZ=wG+8~S}K8`L9=XaEylx~XgNE8A#b0X{~x4M}nPAMDaX+dqmk$U97g?=azPhooc)#*%_i1*!ScVQaRa^g=T=eBmApZ zZmbl2j)-CDHesoj+N@;48^|k%>xXgi>uI|PJ+rKH{_+lda~(H+1+pgw8?0Dws`5h? z{Bya7LQ3znrr8YRdM_Iz^&qU#yLyU&h@s}V>DnkTzuV3{L?NYq@=OC|f@UQT?uV(( zuM~?*-W*zvy!o$5)*OH$cz$e_vmjA^H2W}_?sso0Ku@|^XISyvtbvziq7CL;<`5Q|8lgp z)={@!KKj(@NEiV&`@*p%b36%FdgOZb)aPHaBebxwA^c*bP$C(r8ox~v_@;j_Wo6Rq z58~Mqu%|^rM>=EFZFZzM64tY@5>wkJ?#Am0UNUDtITs&2NBxJ%4E3kUtjCPX-4Ycv zdi@tZl3mXYS+8t00GZ6-v=KVNHFd`v=By}C(`y&LHa}8`YTA!d?*ptH=Ooj&2jD??wyYz?nhtdcb;l% z_5G>+i4{GXq*?wHv*dc)<>xkbV#k{7ti+e$v4~nBl9q@J#S9gPSF*V8ZOv#V%}K{9 zjRY?f(j${1(#xl0rszNtW?B+p-6bR2nq#OT-fXtn;!oa<^3&sH8X+ZQ-jqx=e_2TM z!Ub2+5~K=NtVGvjJ6de^)8p7S#BfaHQ>H)1@T8J4{ zafqw_#fE*oY_821O2Lv$au{tb>nqt>YYF{|KmQW{4`2VEF99bKs*jC`^D1gPpi}$) z!!%y4Fwjwssg-@r%`K1`k%p{K@cX)B`oW#?`$dv2dD?=p6l9W%I8i znX&$BQx*NSsTvzAIrr^T&=+=uuJ>RZ-1ZWh4B`-S%+gfwpXY@UO`2C5?gbOVN zyqggp>^52tMBh+W+G)9>9|q4ROcW4<`q$ghXQy+4!DrEY~9++Cuo+cA-jq%h9Vz>R|Y!lah4m_jMzU}|pU znZrz3E?v_r5jcFxy=8l20rv4PN6R;=7z2B`$w+QVX!m?XDZi!QXeyTDx#+q&IH(r+ z_f}9gq`K#-m}T&OPKbV|YC+2Orn(}|aeYNbQWV*CShAlqu)C;EH z-4aP1#LMGGC+u2+d4_CTq6yj$8J4;@W4ASeB6X;7h(CyJHUBik>|z^uyOu{evY)QG zirBii|D)U8g*YWIA4bVF%#n!^$W;gvHTwr54h6a`^T(RH98(EjBq z5>|_<4bcpA>J1x1D;AIkG8{>;30b&TEYHA;z4(6!NRb(vb{Ez}OVfBrM`yLPe=Gn>n-Ls>4hP$S%HS~@}m7&uS(aV!HMNciy zU-(cyY~xytghyA6WHXbZpY&xu#R|!Tz8r7}^pQW2J~-!bGIV&gfIt@rAKh+3jI*A%hd3YT>sftQ)`J7 zcy_$?V@(?2{QY`O`lEcCRUv-Fvu92(o*R4Rp3$Xmek$ zk)>a)4wyJ*phzLocP4%N&hhA3@=1Xy5Y^60gd~BBYrrr~Ob`ZkctTfF%)+Z&<_Wu+ zgSK{%Wyd7fUAn)q?IG*jvx%P#pFKQUxAMZyu|iT)?i(lfh;C4s7D=XRpL^pcb53m` zu}Jpi+Y4F)&f)_@Y(;i8sWa;Qo*bja$YGICQUbaT)O2<;^G){5WikrS>WCm| z?BWk;vY_bRzNv+_)csy9&;C+QmdyDp*9=pbE5}WhcjAq64 zMN$bF!%SCLcMzP%470Dvy_71|mt+_RB=?G*N2wCv40UQrs(ggzJ_Bjv0fO`m8qZtB zH6dFq$1xuEx)ipugktgIiWx#CU6LG!pKh(T@^i0zYPW*iVgN*R9%Y57*l}*@6(#85 zY+^i~CjiPs`<9UzvtuDM=&#cZgAGE`pIHF^e%CzYp=6##N8$swRtY+;_f-Qi`i~Uf z_ZeSPd?SH-XB4=1;J>?f7;mDRUyV6b20`u}o^nJ9`sCLX-z1WWi6d4E%U++5QwO7e zE-{yaPNE#eE=z&`^jm3Ea-z^%TGys9d*~62(Gc(>O*Lwa-WoWzNY2^}GjjAdf}%Fy zFXr0}JQS_$;H5e+TnN`klEo}r@If_N6W|je$YE8xnzaMviMW%28^dX;0~Z^EWwp0j z5Uu$Y!m^A4U6zOa(sX8x(%(AJKi`v)Jqo{Upo2nZrsl0s!O~5nd-t_+!3K4 zRcf{kJ*ih4s>jN;T_4zwT7QW|#IuTb1CY`ym9=X{Y!y!ha9L@B%Z83hI{b~B3M7mf z_(PXf2(G`x|J(OB!4^~j6G=L#rErzr@vx%>e`Q*i|C?$3^s9S^Jb?Cdukjv%+&c&i z3+?Vsf?*QFdGQ(U)QXuzz_g~YnT|%J!bHHdewvv?bV+TIkORmbp94AF zn1ClSYeKJtH_CrRtslQhNJ1f((_VYI@~}-TvD*mR4=57v#5^Q$@9Z%G?j0#$TDJnG zwJKm*-=UwZ@vbekL6E^ym)v-miyc+xXB(OEbvLYCfP#{n4ky2vhZ!UQw6>kk!c9xj z+_;(2;Isc%hUOm+(Ey5uw6aM0`H0&pfxbEzSFiwDth6$Ok=72stKn8TjCWr4YDr8!c zEfM|iDnpG}3})i=oY^$%%<2wuQbf<8a|T+E7C+IYHNY+q5wM#COuN^b?+wvutcc9D z-YY_@J}dvm2hEu`vja331F6dX%TX*Cu0M+|E000IQc3BSe!W@z6jCnT4dvTTgJhgn z!!hG#kay?5?FvBm{a<$la!lwO;wdn3G1Xhzf@=&zt>M}5)TU<4rpYJvek0u#_mgig z%&<5773d8M3s(dT|MKC`c1{_^zpP{=+Qn1_?c6jR8lNBMKVOXc$bU1An=x%$R7XvE-+6Lbg#gx^i#B1_!;NuZQa%o$> z5DtSE|MnFf*KdCp45cfej)~K}kf;7_UC;UF4WN$Ml#fll;OXhvUICc%*FQdjPTKQ1 zK5#ehnXitpw9V@Qy6&6g z0Jxv`^70^t#g3+H?lOOOtxA)|LzVCG4duJFtGpYdd~7Q^${3J!$A>ZWfnKI1A5$K; zsJdHLrqmJj<8qe7(3oyz-M?B*?1jd@N8wk{B)PW!ctHUX=Rs>}sjt#(@(8OWsbbmr zb+{iwCzA*6s*^&;KUOUiCJX=5<;%kt0BEhBbs+?P{_zd{HS#SPqsKEGYb-c7Q#;sv zw4$}bHq#^POxmtLa}T;iN!nr*fCm!oS<7(VofuhqujG@rf?zp8NcEPvnICdv-{8k~ ztMX{?aN(@RgSM`X1wtX^m3Squ$Cz5RFfc#-aCn#~uNmVOSrTyhyUid5uP@)5%%d&1 z1@m4m?DjXqlnb$tbw`E_G%QB)I4Hs&Kx=p?ucP5whEE_gt^n3=VAa3TylkA{Ve#`L?&$_#%Q=Ny*67%xX8xx&h75$s-FN8loD_BxH;pPZ^EW(nIpr*)F%P6a*GZbdUS*2pjjH z1l^#6;I5PI*SJOhpR1L>Jh*>VC@*R7yeepf5cyHfTF3Mx*r{`I>f?#msM4S=Lph6A9d5iMPAd_Kb`u(R7Zv$s3n|E#?8LY zXUnFuPOqSWwZinMu(2xJ9jtLrath#CzmuVMpt3!8&^TXNxpeFm|aiv|M)~x39pbk*T3K-k? z!>F#MzYTpl`jm}L-FvuSIL?cFo#=r7^c$g>N^|rf!{}Mfq-JU#wPKTR{{(7k*W^pO z`c&)V+YxSQInuXnEV93z*x+JpyMh{MjWjd{_G&iCi=uRXxUK(#fvC~V#bLyv9g~`{ zgT4A07+1q|wXn$o&Fv;IqyZt?KG>yZsK!Iz-)YQz32S51?5966a`CiQC?gk%kd90D zN+l!oEY$J=<(#x|aJtC4iiB2M0nU0iG|shNz!3ele*5>&iKqqO7SaHDH1j!oHi56{ zmksgWYFAd7nZMLfIq~X+6NUZrp_^{2YnZB9DE7PLotBrtMn3*Wq^p)=t6^XEtRGhb%eXM~koe)Y@QBz>c zcLj5}k>ZRPXPc$Zw6fQ-kQ4ZoG%+`BYg+%^Ig|II$n_+-x(>`wmI zoY*v7o{w<{Z%(}kF>IEk%ueY?f#~H(lh$j)Jl-osEnx==KhV&|0KFTk3fqDj!RjMs zTm;>W5B4?Qj95N)D!j=GKbcr#Mr(UdBgmx`&aFfk=v^x~E7rchm#G6DGwUkUu-x%#Z&p@KuBA%a3 z1$2|vM@|XBycTB)FmtS{F-0+-RU9`jpxHGThc4H`8HjHYX(in?8rlgg`nnwN`}jnm znzF5Hs35V}g=Z8`zQjGTNA5~gn8u2f^*kP~Zz{n{EBx{~6V7h^I1;U*L$Uydz7B#) zlTw(bwIcAn9EmQDQ@re;4sdlQji|XmxM5_EaVYPl&ABi8JkFMt3|0ffh`WP>adE|x z=$PxT|8z6VV=d}df~MPJx4G5xv<9YEW(lXyKR)OncOUq3_9=wa{F`NM`8&(HDSBeZ z+vyMV#Nz!Kg3T-!c&hL3ENhu2of-skSvBF=cyhRxPi;y@WD9nP9tA_|v*?CKM9dVc zZ#h-k`bym&IqBE_%X3HV#n#3etAnYug|%gyQTnIKxEob4i6yahpzTpzXK}U%u&iC+ zewO$!7P^}YOHY^3*!gPMSs9W!-m<$v<|q~v z2&qa*@sRl10fV=XKLOw zDJs1-+>^3`~Q&uf5nz$3E}Hv!IMWkuvqp92-Hq zRjieg5)Mh>AmR_PJp@5U;S`%RY0JVf?V2FsZ)Lc#Lrr~EslVNYOQ1;y5r0Pu6|V!$ zE47+UM`BlXk)D`W3bUW6b|g=??@7U2DBth2Bk*Vog7X5YwE{DMN<-+L+ylSLeYA32 z8ua@HcDrv}OW=M=TnCMky3OXrs}>QUQPL?N?(T^@A3Kc9+?_VO`!m^26-u_trXAP9 zdbNd!q#r=C9b7#ep3CSUGKK0z)OV;_QRy+S4;FZJN!uKQFyT4op6Yr+%letH?eVG> zE}z-SPgp3;wPkj{de=h8^)$pcu|LFnP-)i@iHp~OV7tYK5C^JRA`O?$#h(^044^22 zajlx2%5*E16!bZlUvh&U_JH7;flh%iRkw8$>^Sy&><2i~0L<#Qk!_&$il$db4fcLPWR@^C9@c7cjr#<0n_5}O~y zP!IUTap7e3wKA+$G+Fc48z*p*qS58OR?D&CojU0zC<21x(WH)TdaTKE5Ej>Z$SMvn zP3PcmOp7#D{klRhwQ|v8W=wDhPLJlK?x1v8S<4PmtH?)=3v~GnrrJ((>wgR494ELk-2LAvWXClZF*Gg&&0Wiz#H}+65Vq z6mvZF;6E}y{$vMXf0tt3mjEfIq;y`V(ZBUAdnJceW+eCYZTHKT-E2Pl(<*O5q;iVz z;o?&Y3c9p#VfwVs2wP$-d@usG?~<63+9_e9EjdWqBlA6+O)oV`%|UHZMDbq5RZ<2W zqwC5tLPi@gjYtwQR5sF;f7^%3d06&9#W7p#Nj}~Z>{Y*XNhq_Ot@Nm1q%d5;zI&m8 z=Bfe*(#2-#v_92CO{U%Y_gGPpA}AfAGQv0_i1Zdz5JqV>qzXcmP^3ttCqYpu z(o~dA7)5#$Y0?rE1d$Sv-g^QB2oOR-Lg0Tt&O3A7^ZwsC=d5p?Z>{fJYt|Z;;~*dk#fUN&p zQ3^awxMFhJ;NRHPu0!^r6FD+SAcP*@2P*=;(T>}%JKrc8Og4*jX2%>-JXL)OiWQ6Y zC%GCTCtY(3uQpX0*u-HtiI$YXxY(gq#Wg5a>`21I?a5ZESdb{9;VoaO6r3@`@MuN0 zp{(pZ8k1URGxiqL2fgJkk8kqMoGqr>$1y4oPRmDr2`sE?FZjh>yak%556K zV@RJ*fz0lI=2&M5y-@svV-3Xo5+}XU=4#DLEAK*myELOBGN=rz^g0X% zVVR8|=mYjtgx#8$q2wB3)z!TF^8_lLGXH8f*5_T9@1jQYw2mc$z^L%6iyy$UOhnH& zy_Jg6sM^^$)R^g{@KLP9_R4+Eg59#TGk zw<2T%jdXwb6@fq;x-eKtJ@FGP7j)LcG81<9aL#InIABFq5ztm@8FWQv^Q%jV{^h@O z!1S}U*FYlhGDWbHTr_*l?W>)4O~Od&vwBucq2Yc~YKg{|T)S>`Q716xmEdBlmRFfo zJDenmt}$>YMQ>nnb%rdi{{UH6{{^y64DAOgqS$S8N>tFLJ&6JL8!daKbnizfWf9%r z#DQWB8DUZ_Ap?O@l8uong`YzwbREb6rt2G>kRxUaq(>e6m-Hx&Xde|^K}Xkv zp0`QZxg5?txXyHJ)@DSmlc%rvhee)LxA^wrzcHtlPjM62r1eX;Z4flQa&ix!HXPBaeS+xqTy> z+Vm&Ix|30rSQD$h_P$;0r~^tv_#Hised&wrP1J#mGhij9_HKc=QcW0ZF|#*3Lx?@o z-1MGE39Pc=W#Qp|-Y~aQj+_S9Y!c7E*zo?%>vT%(hqWP~tIGM`pFnp+!Mj+wf5BF^ zD4_*_*nTTF%74XkK5{lCJ}HB&Uz%%I7TT%d=6rs3SWjYk&X`>{C4Ph0~Zu#OYyO&ZtvOGLF+i#Vn z#N4oun8)pN5i`?I4S%ZW%^#b4;dWFkra+LIs7V3~x*H9@@cZbpu55@@btPJ-`=B{D zwByzb%*+Z5!1l`%wUF57Fssi1pJ40fM(rjlU{`lY}G)}#wWE! z%3bCHhMUA1lZ}%zHjkJEkKjWUDRVll)vAU3^Jg{qxfrh{`Xc%D5beio!EL`|XJ(a# zrQmyZ#K%+yyN!tTE=>qbB%@5_8nIDQXHU~3jz~$j)1G#+NGRQ)@Y|BGHda&wl>sQ$ zoW0W&%48*;d}Iq)>=MS-Uv@X0yLkiPtr^5w_Qj*+K7 z{>>TNik&+OWwPS0DxQXy;asiQK0dFV^_CH9&RWGeSv_$Q5XAajQ@L1$ipuL!%A&d7 zTs1xS!hR<+OuMlhkFH8uKJui65;z2Sk;k^?N4!;FDps;1tj73!7i6=84*K2fJ4=c}ZhOb23ue$5(odZVKL@Tb&-BIeJx~gA zX>}3`%0ZIt63*jgm`uZ%6hhPShzOCJMt~((z)wMHTswNfUFR z=akU)N$Aqmj&DBr?}unK1E}_`l*O_CruJn*EqVHEEwUh?g%`|W2W=$ywS$Y2#Y_W} zHO2x+qphjN0*(tjIrd>=)*viv}_wC6~BaZEc)gca7 zSBAFr#qLe?IsA-UiJ-A`xf0B~+p=S&>dm6DrlxINwby`V;jQzhqWn1}vSnrO{K>JMp6~p?^&C8PqauQl_ zSL?a+FnF;~c66MpU5DRmquVhfSC@-RR%gye91#MR==APSr$IJ~MntxJRU!hYY`w@R zT$c{mt#N3XO!nz|ttlI$XrM!!8D1(KDZS}YphKBA7q+Rd$kwf4x8A-Hv<8H{YAf1J z(gFE|sizp8#t*ln6@?cZ-X`dP2pET+#I|W$k<~pR{hsoULuPOgSq8FebU;=MFNc(u zSy2SCYv^rAZJnOpd-L_#LLj?_rIO}-GcELp|HzGCpSOgz6|+52zkv_ufP;+r-+VZt zP!ZfNS;Xl-szW+&DxzPCLYqhUbg^b_qSXC!M# z!v&X*0EbFLf!d%#k;j<5K(vEhjFDoa`aRvOc$C6n=LsuB>`??-L}R%m%twr`JnV}d zxxta-D0izD%C50Qcz8G#fb5#fO^IR^BGk`ArO&ySl^R6|ZjAsjp1SxdlwJt3YjjF> z*IZmeOZ|^F;J~yRkMsLGOM}f>Xj=W(9x1d>a5Xm1^o0gOIR(!FBNJnu++|jGP&Jn% zUXahLKK7O&xv2z|KyqtWRm?VlBudlY$3Dl60{Z^F|lob$_yvILca zSg%A*sT;K4VHkBsr?-!c4eH6s)<6~`Q-;Y_8gYI{dQc@En7OBdFbb26o-f6hCrSH{ z)B)o^0l&u$zytprcKnTLD&U7{YEY1f`S*ABO*C|b6O~1ca;li2+IMr&zNX;qcQ_OHa1p1b#a`RFjuMoaZ@ue#a&1f$%y zxYa5_b2znIh+>_Ns=zZGbrA@9%0s+8;|PE3XqDoVxPHSZ@+)lc^+sltTD*3Jn5uM- z&zuAFsT=NhPjl<_H>(>D(B1Yw8InK~q|Od#g7jZS*K|M=B(bkQTOYk--2%A}*{*>O zlNIx6|L~+HScFZMm z3diro*a<#UsB=V+*UG!1Bt+_xF9$~1N#^)~;F>u*N3bV>nQXglR$C<+m#$Kt*V=Cs zl|@X%4%;?(!6~PZZI(gk#k<3GtBFCv$VgO^_}p>j_<#rSbgrf*%S#RWcKx)+fBo<; zKMUQzyK0B?hrI{0A^%pFzWHRI)_N=dUs`i1^+n_N6nwtu#U^#K)(RA}4(QdhMl_ib zrEt_73XWcs9Z6la90e~=ni>>bgS-Vj`1_S-|E6|{`BA&9zD0Hajr0PNZA3eT9;8i{ zadUImuPqD`<#!63gK70EoAdd(ii_garcvrD>8{$#xmtDa8fUbIK{c;}Xomw^x~BcA z{H7akP;HN5Y*ivkzTFYiJEIurO~+D#Onaj89h49=g$OCvyD}Sd!E6?@&Bc!O67WFE zp+PlVKWL?mbi4ibDfx2e*VlB2)CjUC?hq<_?ay9#7~c`vL5Iet*5 zdccw;B_$R!v_lDpGvHnG+C9nUG$hu9o*Ys77S}70-No#B$i*j>(_7H{zg@CqmV;Hf zv*j)Mul~rbk%Dq-#H3DJOts>%xh%bFMLk#lgdMVU~=>Bp#`!59x@N$x^>) zJKE{i=p8!`TPY#=!c-79)P(LwDI#*n*hwo&VfqhTHRD-I72Qe=hKLf`Pe3k@6m@{a zEg7%@hmlJ9mTv2AF|uTP&@lsA)dK^<|2wwwhl-2R`{Aa``yt`}SGhIvkbpCtbm!QN z?Lp8O2_;-(qgC!Dhd=JVb2?p8dV6Dbj%A5rwW(N;#GqhgW1I@3GecY@)~D4_&ZO`J z0x`o@r{_%LdKR1J&1(jzrFd31J`0)MGoLtwi&iNwVkRL<>yQnerqmwQJ5w-$=-U#F z=yQ(ki6bga@b}iq@So+ga}r8Wjz9IJtnYNhY;>)@@)ugO9u#4GiwhImlP2m$>OkH= zfqeHMkaBwm*3s zQyDj#BbFaH7}tK96f=eG4hrb>-a7l1 z_by4+kIFC}iMFIDWy!QwCD3R4!$!FVdXc&Yk_Zv7gtQ7ym&MVFLfvx#h$C+=fTPz_ z;AX{NbaCUowgJ;G>o+;H-0zM>SnYryFISE>yH9d!ew+KBuk)y7!_E(R9b+KOJfiDf$-gcMmkG}PPs z$!tC}`WC`6_%2_8r*Hd%s{NSY%kAS_+i$|P8>hS%lZNe$PTEtOdZ~!04$#AEXy=oU z#-LK_HSR_!uDQ+wN_0A)M3d|mBa-TCr#^xtph>L9{t)sFFxcPm&%HM3=?92JIew_v z|FhTTI++hjDh>k#s6fMAk2C1DhPzUEq$Uah6=rEAfq?!zym9t>jHFiRjT&Dbwd#)O z(3;@|k9w8j*{z+Hca2g}=k60*0nKD%{KJDC3#E6p?ZrzV+^|Y52*MUG3g%Gwpe*Jv zAf@wB0mLp8!kRQSbgye>*Krm+VI!PHzslktS?fC%iU7UFE7E3YBBus;&~RGXfU+oQ z2cXitYIUy8~ovNLO~z%<^R!wnQ$gN$5!X{ZSiq`3O5y}o@9SCBD& ztC$U@AUU*Krna6>V!`^A80nH=UU4xMj_yLn(xVkDK&)_0>@K27YzeV$bqdvnQu4Fs zNl{e86Fb-%FnTkBmnLFiB(5ZIr-!At`r$o)V|5$XbY|7TuP|WX{pZ}AnYIg_a*9*l z9uhh}%@px?kbxe^>$*NZqkFAKRti<@cSI@>6cQSsq9+ z4gL=|ly=s0oz3M~n0(FryF*0u_Y1NrC1Rdr{WrdiqR0XfVe+?~PJnKpC$?|o7Aq7G zqjNrlEG;-|_g>zHd>F=T8{KFd2Xx(Af(P55BtbI~h+|O?0mI`ZmuUcRp|s@VJK&P- z{?@TVl5eNfa=79Ca5ac7$IAe@-7(cCmSsp#s(wAhDj5fmae7vJ*xMB12Dd%)(}N(I z$^+&);3$t}t=LJXtczj4$KjL#50@xf1PI~0mEdU;KvA<`A@6bmC0JiND*Qz5x^!JK>_8#m^x3 z#`PJ){3B1#B}9b2z=gKQRSmR>sk&#QCc8t|JT;wQSVv%nGHtg*8>d=dqXFA->V*n$iJk;TFZBG!p?bI&*_#g)WeeuWa#i8Cfhrvoo-JPor^UN*oSxIEwXR`@ zm!8JfJCq_Y7=_f$EA#by{PImhq|eKpeQGxLhe-ubg%H{(npIdI7KVlWy4qhYnf3B72&TmfrQhNRMJw^ z433UW@if|Vy6x+-bZ7#r^GMww{|UkLzM`Not)W+Shwh!AZUVw?PDFLi@{4Tk+wTD) zqt3A^pKW_WYC;|LtN$k8CRER*)UHd1KuG!e7Q3}~t@RPRkdWfjsnz?H93Mqeza?}!8(1hey^?E#(&0Gp@U84rU1{xGZob6ldf zV+&#^US40Djb1sk)GA(~yYzrhLUq@cR%oS-?xZMD1VSm5>uPFFzqraX))s?xgLRY07JEvljdpwX7!7*BL9 zhh~ADwg?4uFqBae1jq33`DNvM0{)(VU%ga?W8I%mNzwVGA$w7WRlbc6eEU5?;Cm=^ zzSINU)hbqFl3)GTJyFN~Njx2UYWO77y{-+p7ltvTN14&%C9#-0Z0W~b+GE?oh8tnZ zOBe3^FCCHMc8JSZufDnKI+soZR91E;a@?uKND$+wi;TkFJZ0VMUcE$?CR%^@OZ zXbC`W+FV%q&puf1B3ev7BV~03?jqjL-SXv&1@G1FoiEWRhXLa_UEHo}rsV8RtF^F>O|348` zimrQf-~1k{@KR^ONHcxQdmUVzzb5{c0MiNg3ZWgKFo~X zf=T(F$uf)Di9_|^UY=Cubn62hH-GQyzT2ut{bkyIlzjm7ECy~o#{MmUt=B*=^kNtG z^$XwF^XA8uT^!h*zZ<^@XZI6%Yy7BE_}LV^i+@*!l!`6DCE55;bvGw%+mpsPK5 z!Az_Ol}6bwZ0A3|)Ems{t%ry?;@#r;yGf2<@MA{8Kw)9@t(WOu|2|Oc+;KwYYvWgtoYn#FHg~?9cyV}>F zGQ@vl5;p1x=ggY%5olV3&Q1P@TG;i3;PoZC{T4l%&rds52PzsN%pDJC065kn#L3Tq zlKxYT*64csj^Ngk=YVX=xf+zgB5YC!s+Z+FYY6>q9;(`abSvor5nsw~&rMdL!qQo} z>0+ju5nI`kC&VSzqv~jB)H}q*6ZnY}Voh8+GiU4luw*}8H_qsNZO;*3_D4Rf7c(7v ztlJKp4jF;Uis-m*hixs9^3~2v=q6j!*(~ccMFlWl!C0?erJD&m?e1bnf;xtT>4>yb z{y?fBuxqj}qn%)!8ACHNFI2KQY;AJf6+FM_`Y+wAp;n?>DwT`SF}z4|O#F%IDWwLO z^itJ86m-Rj;yCk2zEK8dwD(cvR0#3MMLW918RZ(OCHC&NM=a?Kksa13NmS{Ljs}Vy zqk7F}%`kY?u#z- zUcnSO73H)!Jy06|bFf-xNOHYMc?PLWHb$Z#F2R5QKU+eX=l&mALeDS+rnblMed05$ zN`CgxXJ@=i9F{2C?4AZsqy7{pPg&fK5JOk%BLZFx058#8N7y-bt3sLikRS;lYSYPiwY5 z!ZywdzB<~fH~;wXUN*$HQ$?clZH8U_KkShD;N^N^TJKco9$v*?qbnaj_oR;0)ngV> zuuZPsdxVE%-L3U{2xO=xw2ugQJZxTYJC8blSpq;MA68F?bedar?r!Y_-Ss$KQ9FPE zRy(^0UGXya^nZ!?g$fXqE->tu#7f~{P+K~0!Z;l;cTetMfCcVuXITW(E$Ydjwix&D zs~Noi^qFq~UeqTe1o`3chsja~H(`mp9s;ewKJhon0vL}Bum1h0KEVS=)4BC4_Dlg< z&!#669CqvDve*gP>qA?ht*woi^4HRO-9iSP#)8HO=vF*F>Em~s>Cn4muIY=kl37q4 z@c|E--tywxj?Ac0z&{q*BzbOT?G?3bYdKt0|1sMBKhXfPd;9~8 zPn%*zbPc(KZ|`T1aq0T^+l}}VK=_4>^5X-qon2Q9k3ygEDBcb~sf9=QFSyxjK@CvL zn&vp0&)yKt!M63HqZe=MY`+FzaSCH>aeD=APkhsgPLx{j(NpI)@W~(3sC&_7XQQH@ zzEoq-W3Sri&BLhw2!*uj*-WLwisw4V|6e-x|c1N z;Eqdr8cCc<-<(ZvFDUSQaw;9!ARfAoZSNI6I_C*KSC1{sSdbQR66g+YY-wq{ZqeFk z$tF0gc=kM5AE*UHrBS@v66d$e{xB`J;Q>w(|6AI+p))3-W+)RAJjUj>r-b7jh%mka zC$#4{Ti~^eE3Nzs%&T_#q^AophH9}<8LhN5>i1|7R5gTJ>*{)z+EIU!DVnP3HTEH| zs);%O3|-T`9jwWo`RRiG*=tIp;>`LNvhd}Ig($SbIM+!IYLfOzDf%DI_75fchY3-d z@wn^lf3w|cC<~TDW@pgyO)I(ae`Ft4bF+;1b7ZQGjbVt@Y*)4J#5q9D3Xx)A2|)+X zmm1U;XT8*5FICyq`w9g{S+0odQGbLVPIQV))(;WXYx3a9*C=u6ialiHyw%{u_iBkg z1c*Q6Xo!m2fbgl*;0uBBQFlceKRJ#>`p^? zwmNsycDwLqZ?K7T$-49UOfV^;_7tNi~Dy@2QdUBO&MJ&_OesQ z9ag)V@B)HnZt-3&)z=-Hb4Nek!3R#xy=i#ask8D{VH@quh&5%+#XjVNIpclhPEsdR zI<4h{K#}A#RGo|Wm2<|G65kWP1qD_JWSY*Mtm>>nmKLiKq*Qy4G{+w0O6OX<{F=a% zmiMS6PC&x+qBHu-rU2ITqOIofj=?wjPs2{JHpsfV>&vjM~LWEw32u~=a z#|1ug%Wn#pYb)nm5vP@3z`FLp?6HHXFZ})beM$7) z)4n(X2L&67Y|z?#5+FdwCPMVk)E7CvS3Y%J*z)OY>Ve4^&++lg$m0Ab-i$a0e^D9_ zPFVK2ey-!f-gS$%tDXc8@~Z>WuWnzvP_c2#b`o%=dn{V|+w7L}P0XBo0zVRh? z<2Uwv!f#tob(l=CjJ8d+FEoUr88XCc!On`u@26p@J6s8|Pp~GU*yFIx@e2_&S-PQ;;HKJc`#5ox z&7iNn9P8+C5*93TE23l<_CQn|foF8a&HLfQP4mmq(bzpFI z3kKb5a?ySkW_rR;d=Ezdl6-k{boTqwa_Ff|`{2Q@bgcRMx8Gk|+&0$BcoP4zQ9?4G zheyuZQn@$^DQ<0D{%*#tqvN!NeM@Si7|)F&OmW-iSk(kepSsm#_(W7@Q>sF{keiYL zpE3Knc-Yby$H56>cdG))2fyE8%k>0rl~b@Sj_VfDQWq|DFk0~_vT;vpz?W5Jn6}P@ z6Z~hi`b-k-!FYW`*cTk1I12tKJawJ_J8itduy`qnPvH|1{sH~FnZ2u80nRrgbF;CV zwku>NsgX(QW`?{v;+sV?B^wQ@g2p)&gUn zeAwFV!c6%67!^n7aBYfvb6j8s`PTLKHlFhEo!GkEdm&!!oIT116m$WLH+=~3kDbq* z2dxYE=P4-%G58G=E8;AsrW!K!Byf@b{|hcwQ9$)sVsnLs3mUo$E@n2lz$}p% zS1h_%k!*<)tNr@ZN2PPf#mA@UUZG>pi#sjq=FCro9(g`Zv-U*b4r6WG_?1_5xVKGT z+&+P|uam5tt_g||LO$+mSRb-*yx|#Yclpr}8QIFv#|gh)x0+-R>wxZSO-HzdHNO9V zW^hBtVE1wVBDFngB}${|NMc8N1eFh(pA0e<0&B1YWyxZ?m8qJ9(|yazk<_8N<dB@K%g`xFx^`owUyxw&a?L9QiN`^Osek!F zK@l%pVCl*c#nf2cu5ki|?nKk;@j3j4#J8_qo7U>Pm2b4v3cI${bZ+BW<3)R9swa5+ z62aSN0iKcYKdxK}KFFmGkGD6FP-8yOK7L^LC_^6 zDJv(>sV;PQy*yu@X- zABsLfY484MSA%v%%yx84lv>zF3MD8O_V!O0rW;YpKQLXGtEFa`VoX*1dLknT>?Uj) zxk~Jr+^)>`{tESR^g__&t}kNCAv=CSJSYu~)zIPl(zt_m_B+jMHlQzWK$N|-eyWf8 z^stA)s#>z>NxBf zIUSu{K)Zf%XL6}$8K-WPUAGqhn8%JB~a`ZN3{B*DBvW8nR50Ag6;j`8XKt*<>;AZNVR)s zDPt%g#8~&&QXsFib>VNvu|GtpB?o#eeiPsCQftzim{2=)tc`393x0z-!mszpwFpSM zc)>@p`<@+mN0ac^DpuUXj~t!5&}O$}EQb*od65TyPrnvVsw7`bVYUCDhN8Zpqa3(#Bx7o5XbvwL;$v zS7+^R%1ex6@{+XKgEI&vXr1j3ITJ{-C8)AOn=#%vYw!YC@C ziabJoVCGWA|p-d6vIzTEALKm2>gZ7T{h5ZpIzbCM!oU~u96?P`Xu?< zYVK;??-rb2t*`61J6m;B|LUJr$Qv*AN{MB;T3WXJDnHX~xN`Yb-9mYl>)np=IjY+L z*U1=q@+kgBecRH3SjDE0^fkD{o!tn%@aHP3iz4tw){bv#yLCUDawRExyfTyf%ym}c zFe>Azr`n2 z)nEOc^1~67pxi?ZXt7T=9w?_Mo9p&q+@?`hu(+!#8wWxH?&@2R3?+0T@7BCQ9q>pC z-dsOnYIvrRC#AE8`$cnoTMeZ5W!1}YHYI{;#*@(DGuLZ!X@HsCeT&*)$}Mhna9a{N zXuZWA-rsZ&QHVM68^tqfs_vvYG!U!K?&pkkSlj+Cl(aO_huM*im}p zIPpo`+7YtTF5=M0{wB~uo0xtM@^3g`C zoqS%ACsPl&m=3lJXxDob5|tfoJzk6qx_|GiT3;Mb(9Rm&>fQ;cZy4w&Of@ZcO&`R< z*4~DhG_JQ#$NPF*AI-UO8C?1GZ$}4Df?n#qOOhY|Wky*c*~*k?Wwr$rOwXGBA$$LE z(PbkAGy{ywVKhaewSQ&c?solXXCYYf2RVDucrS?h9D-;*C{lVId+PS*O+Hj~N# zW6qGG>sxcho389*A>EreO95L+Y*L7J${}qU{_u1A!X=~K1$qI{;HobALU4hf=R9?{ zs>ny$lw#%|iRf?B1;6lRtkJj<7yhz5{FO2aeenT)=I~Zy8K3r}9bVk@(uS+~Lq%UN znDc9AH0!SxT#thfv0A zlXT0nYA$m{oNA-G`##0??C57ZN>yWNjHtyO!PO2G6Ay;s!zTI5aw8b0dL;0k;zrtt zgEzN#SpU8c7x8LXSSp#%@|6-sO1Yd*vP8-K$ya|nk%8K4d(r~>S;9o&OP~gFwzIUm z=6aA_TU+~OP?(Ztel^CbAU2=X_bd9hm}2j9FU2jY99{|vx0vLU9^Q-mwX)z-*uvDW zKsdZ_pU3|63?vc=<37DC4QtzjgQ(7C`UZ9U(Sw&L?7WvitQrZ@5pi^!IG{v7mxt7z z6phm!TB`cq_VvUuvhHm#%wHTAOlLM+bZ}z@US50^CRJ@bub~rg(m@eqqpmfY#JTlD zk8ty5FvBm{&uT^_gbXQhaVjwyq{PQY@>RF`HR~RVN8Ao%j)y7K+^!^yuLHfuLD%O3 zJ1%`=>Sv-PCBB!_rh3AEGZqv~zSx~r17V=hCD}x#l=KYww$Kvsnf@m`GElkpKs&2k z4_E4a*9$1qCu7K2%No;JD`3KQwYS=pw5$;f9?rTVCj7ULH1_D$=184u3YGiOb3m{k zc$b)V%pd>xq(@2Xs8;QTfFALhGn&OL0|Nw-hDt`pG;7- zL|Mqb_PbL@KXlBW#KxV@AD))?vw9Ei+^RbRfw<{+7nC%aT8{{^rttMCnc7el!tbR6 zNW+gx1pRk*>-c#VsP$JxWs}@8I8tGhH0UER0g&CmeCZF<) zKt;DV!PiRSk)QsG(d>!t0~h8&52@^{c5Wk$t$QMGhn<6 zq!{*_yV*5ct=)l3&WDtwq zDf|NCxO~7cC2XA4omxO)HN3T$VEMGV!5IU^E-99+*kFS}QkI#73W-%KS9UyRP%W6p zq;W`BVR4Ohy8rV{z&81LDYF<;m|632+?j=->5oAZnk7)|)JU$MuwVar=~ImljNoxv zsvV4tgtnkcD@Xhno0>;9dc*U513pT$ORvc)D4^GxNzU~&3tg=g1b&@b*+-XxfIfJh!#KN=Kt-XR9B;^_Hx6khWjTP3#X^#d}yxR zxi%-m!0%dcd(7uExab8Qh|bj5>5E-FDGLQmqj?qdT50+X zfh(2ve4s#5N-5U2(~CHp5H)D!W)Dri!V>VSnI~5d#QHZ}aViRvT< z3z~qwCt?;mM~p_yTFKYWF~+NVr-R8w#2;f8v%v3hyGOVRcYdqi0b_osTcpmH5~VKg z*M6an$`S8R!xt3U-xRs{LTi<{ib`kO1}PZb9Q2k;DGSYb)L7r1rZt$y9f_gyC;G8U6+-Gw0QsqN4e9$VjkVHL% zA2j-c|M?zJX__CI_%erR!!3+6!&5q43Mb^)8(q;|(2v!{vsMosWIlz=fnIzCXIPa} zH%CrN^@(I8S4G{Jt!dU-_7e;?EWDjx$8Ayd)jX7S`|&G}i*|0TTTz6X^`fmfpqIVc zIVrd$$Aizfsm<{lbJbvuDxr5_mnLLVGeiIyxgON5~>P>RqY^^LWMON`5mF2jgR!Dqnpza=u?KxavHaeOToB zHZ%J}+WP`tu5|V0emY6anK|BD6mojkE&-0qF8tSx4A)k1Tx`)APu?YJ&b!jDCFU{t z-sqQzyrH*W_nMm)cxM#h`yJWjJbb_*S8UCgulb@DC%sz!qa_FuGdZlL?I|{nO}VM0 zrk#-Eydr!pIAwO2ie*F)@Rd%k3BP#lZ4nSUDdF4a(BkbCDP7s%{cx)6E~S71n!nBQ z)un0{C%V-vXrOaV6B!T4C8(N(b#l6{#tyX!(?Jn6Z7_EA!xdb1teHJ_eIA9Vyc3{W zM+bkFdLhiZhva*6<;7S)e;p7kFxB$gTM)#s8`NcW#16E52d&lB_=Y0idfMG4$;wNg`jc=~ z)bOAa2QY&t)O0+%igLtp8We;SEitLmig2*>Qplihil=UX4)I+qEdNFbZB2vJLv{g? zn8I~4=R5WC*XqmzSW4w1M5Tz{Cq8DBs_}qwzXt?As(O9l#xZpd>h$%|C2gLUHe>4^ zgDO6g>z34!zEPfeT{Uep-OsCkJh^KY+rj@AjPdUG`zP<}Kk=03wRU>f)9^Go-WO@V zmlveNMk>EHn|qjN_TKW2gH1P@cX{T`>i0(U2&R$m^k9(p8xyVN>39Php#{v>R>1VXA$apS|A#Yn#G zFuvWdl=waY$Sj{#2koBCxDxhJ+v@RJ<<;Zixa0UcwO&GY`gXq+`COYfP6_#tl;9t9 z$j$F;EsEwai)rR(mVr5K{P%C9`iDP>btvunsN{&;2dlm+?GL|%H)Rx}Kmv@X zPV5P9HK2H;`;7!}KeFZ;ttm4+CDe0EV$p+2|rmD3kNC~m4!T{ z8jzMHpwbN8B=EGy{R?KM)g4YKSO>!dA5xX6rODJBQ_g325$^>#In^^gg6)`Tqw8sh zntHrflE$k{20@9onp(nw{5b=Rd&8P_KW9!%RKG+=1Q(hP_l)3<5RAVK2I>-9txojl zxEn0B)_hesd?Ro+lOtr|t_y4w?#SxbyNDaXnXF<9xvuCrqczo@8nrdQ9Vt;`0nHf~ z|DYG$)RlP(GgxTiQ?U7?9{bOd98kwGkIrmHyMXSM>zk?&XbYF3AUQnH_^V0&VJ!Z_ zA%%iEhw={3ylH)Mz`Wzx9o2PTV?HOVCQQEOJ3m$s^Fj=BTt#^Pd)D=!JQ?%x($~nc z{P5I{BI^v7^OF~cBU4}--r19yd*BRBz?yb?<&(94#33DqBN@>`$k<0;HjlB9 z3r{_yNpq-jc`2BG*f+~${GsoaL-2c5h4?vr&KdNt?R2~ zwg+1O)>NO7J?r~p$c{~sx8Gbzu-NsXEf<>ar-aWUgV&I_PNZ4;{B@?8#`KGb z;P}St`*2jB;-Cee6I(!rf@_REGnA^5!|wk`1LOJhW-(%5PicH%$@7PU-k6H5CBCh< zKmQy;KBj(s{&0I3Ozr7f=zS(M7Z+L#-eNNrdCGeQbk_E&N&Cz2eVTsR(7+MvTmVv1 z=fXxXu-Rznl=b36$n+5dU_A=1Eu{A~!F{b3>EX8sOOF+l6)9zJgRR~jZvtK%`$`|8 z4rAz;bpBpk)pD9&2wl|`I<*HDnjqmoHQ90e2~go}N$jAy*H*j@ep}#0;XHnc*XpIo zsqMe5AhaLS=$pDAK zT)3K1c{@t%hPjku2kUfJqp*(rXZU1AVN1F3R*M88cNWpwk8Cx0_YoV%>d(Qd zEs9{#T|Z@1m>Bb29&2FmJ>Z(s`<-;;GJ9#Yqqj+~g4l8gL@d|@_W&*joj$cA>j ze;o^_s&Kqgi#Bn^|Ly@DTF6!Zs@U9js1gYadWkvn{x|rmuhF277IK3dquS(UNz=L0Pz0C& zkZj;P0y*j^BP6JaQblHp7XYh6Z)sm_@Wv$lk%=R7|I$40Q4@{P$_IsM_J_|z;nixU zo*N1A>TWDOhSn%r&h@eboF=SG7G0D=kRydQqpY3z(x8_)-ZSK0gVjz^DsA)n%;)jFU=JwnIA2zRy&aUZxpd?nsQD?<#rqs(ow(+ zbR}Y&a+X~hG(w50^p_rYLMB4lCLK7q+|4Lt%wzS&`KyzHrx9h_z9y=`_kBXb^r@4t zj^4_WX$&(l89)DaDa7)i4sHAT(dE~dmoC#jEel-X*Pvawa+P0K+JEh~!Hh9G@mH-p zi5kn8;$%n-x;|ciu4>s4%q+PglKDg&$tf1&dVZrjXl}={tKWghIrMGa2PZr^R^Te? zi@I5YkF`GgCgOdrnnykuu@w(A76ZZIBpUc@C}D=~(z|^Xz+dpRu4UbNnt^EM)5}xGZq2sO}T(r3On;;m=auZY_*%nlPTwgN&}V_y~VK?}>3m0j3p zKif|LeoZ&GQm(br`Jl0exe~){BGuf~s+vs(7@u7OOo2mcO#(W{i-b-u(+UFOQ{6IA z#SAM`fuiqVBZC?F*q)VXZ_R`THRea-tNXdr$zbzw@I@ttR9RPStk> zL==57dVTn(4`4TC)b@w9>zG{U-XBuXo(G&~XFU8zVCmLt690aj!4?8<0i%$7_wamZ zdUFqv&n$nX#r&JY=8)srlndg|N&(6?bw<7Wo|J`qS$db2@L<=E(SquWiDOmZ@PB$G zUy<&8gPuJ^0wt@^p|-qp$g;w^_?Perr?R3hXUCJP9Zh-9&dcV1NK&n~R;d6=Y4?0y z+h?r3XGD-+sN)FxeB0`GJg$EG0O=VOIkC@PknF6-lmnysx0(oJy<&b zTxmWC+;t-iT=Svw4Ei420cRYlT_bKw8-o#6Q9KYL<8j5dnO{_#;YL_<lSL5g%#Fi}Z} zNDoa~0)!qyNkHEn=bCwDu3Miq&sz6~cP(Zu$8T)+|J-Le&f_Pn=*-tym3$3ZzkM7; zLZx6~OI$5#GRjKKLP|FFyJ<*XluwENtLo);4-$VYjFcSEjS`L!*ZY+yL6zu5ft&{`<9!?z6Y`|tr9Os^p?qbjGTbI;8I6Jx5+d%7X+PTWTnr64?v+3J(WWCcO zKg6l6?%Ee`0fu-Nw`rO6leTN5lHTVQoA+|he6og~XbAFm!LGSy#87Kb<0Waz>AN}dR2LU1jg8Bzq(Xeuv`NDQwnfzLy+q=9K|LIas%9j=BQE-;)U0EPYc8>K1Ca z!>4JIe4S6O$@cKcOsNgki--;1GP_Z3T55#V)H@kCcT)TCqdOVz3&>mO8-=@4XZl{G z9BkrQ0{2es+g10 z+>yLEpddCm6sh|7Woc4`-*?a|2oAF2gf;dyfa)tRxw^WyF39RNu6XV~Lyl46k-P)Q zKurqgp4Z0Jz^PDGp&S+FpBof3xZe(`4fMTkq^>giO4!9OEG`!8LKe-9{ia^>_F;aN zS+&2)VvFZe%j8EB{41Qi0L~276;44RRa23k8-Pgo`e&4gmftwE3N&hq=X!;!3P+-Z z8&lKCMr=zH665Gvct^SAv(A)Nl>%Op;V&GNX#x~K!6`oAk0@&jz1Y&nAADad6MF^0Fr~rGa;01)#}$L zLt%vllU--3YgHayE!9Ey1&jw5w<%Aw0!~|7?~ja{J##TwOt^L@Ga_+TenPCLk)|+* zP39)5<*sVe>)Ka-Srg|lvVHuAMEgv&#-Y4i;fBPizS)-Eq{~Y}bKEUtDgxNEw?A?E^V@a~E2Nj^as^z4X5by=lW@a#Nvdaeab ziI`4bg=5u8KQLw+LrzOh2bD0aUPHxvxL85Zjp_ohX@xi^kP5<0TVPHlCkG!R^(c8xyoa@8FxPveyQw!r6o{0K2PfX*?&7d~fYII3bdGXiVH>n@CH zg~J&a=*401`8aC(OF=N-lB6MMwti*TVxP=utUen_FWJ@MamUDENdqV9oTW0{;RxMz zsOUC)-G~o-8P=ej=+Vh_EgR`Hve9DeXy>(%Ir#J0jHq#twsVC2;=a<8P_>Ajj*X1po(u)Nw_f^ova|e*!|&t+ne4GJc5F^!ADM$YXm z14;o(+T1OBa~9fnQZK4&m;a{DYE@P)l+GYC&cEyau>`qZt^^U>%onC6e`8}xF$6UG%{C4&I1*R)TS0@`*n=s`ZJQ*eUU6jdfoJj4u zZQ?%09-mmhIeEk+cS~Fs@zU~H`=ng*R6^tHy)kVSOEwxy+9gX1r3{=$5Gls7q~bMb zcB{7BP3mqO+<(Ax44l%Ss`)IK)RCMQ{pZwO7Gu_?k=}Zf7?&fybc_u&s>kFOk3%Ms zOVtHkmt;J)D?gYWsNkL2ww`xST9hpMXC@zVq#VcY%N>;nqRankpfhVEY?Su|D+vTS zBTfXe1+sLVCXJNo#eIJyos1W_F-vH3ZGn@P_M^+QjZl1|bigN7{A8%i$r_nSL;=UlblOGu686+3ws6bewN!>_j zWs511&*XeP)OALz(ox?Rx#2=VZI=p1L*4CRb?qy9(dz_qk|90&g-8$0jTyLYIA*EPJzqsX`0 z(ZypqYx@Nc61&CD;}AQHU)kR6;Xlsi;?6iU^j2`|rG+*F#a1_ak(pCV9}o6}x3#rH zP-8S36m;D(A)yZ_IXsJfEXw7AS}L=)F?z&1Ki35)gUvkO0)%zx*utm79-^#S2aQ*T z9@*dGNWI^&IqsQVX|(I`n;jDiqf-}HxUuh<>s+0>z8jRL%!4Jk-v#BQgzPzeX>M1? zke?po_V>Q!-&b!y&2@@aG3l(O#KQmF^-FfU?@K4oy&ylR{D<1-uPM-*ZzsU?Zi2*c zx9jm)N?a^t_Df_2U&rJE?|aW@%g<9Io~}8%6}2ucEn50X^RsnHDg!iD{LJPCNe9hZM;|TDUDwDl z>r+P}e=qbfmf7U#C4c-G2T^;`C&68O{kv86{EL0fyaD}dw?BwYnRg|3SvDJe<;2Cu zZfZNUV*lFY*KYX-e_#Bub0!PSEM`mlVssotlx~7viO9Q%g&-H5>(t3QDIkImD)z|I z-4vCq`qw{BR_GBtq)7DlwSV>^{<|Wwj26y8jI<>?cM6xvFPbT5c%9hBdwCThP>VOZ z^?pcas*$p3dxN@=qRAFgG#kzD*IElerJ)A;X!Eoy35Xq7oL7UIp{@wbfKYb6mCVq< z(JJOYgd>S+0XC#6*RrZA{P%g4ISQ20C4p8=NJt29P(RvsWb%HD|vz&MsAaOmV+ z2v3}cPv)`oJnjAyVpe$rk7eRdLHxliJu?#ZiO zpF9B)unoY!L#u=S5j#K68u=jd>gxi?TEG9OqWyumqYE$T_(CKIS-qdMrz7h@sFCH|LT8r95S1UPD(bIK znSsN8bH4=7;UUSbbJjGnJK%Aind=wwI6H(qPVOCyZdT94V>MKNq#W@@JpGPOA}h6digEa)s`FI3!3t7-+{-gG4jPytJJ)*nl%u8Lw_uK3r#ne zf~X0h=g&2uQJV-iQL*~-5#H3McyqSqCBL;HsUxcG>RsBOW&eNQ?N}_3o--EK=dGqH zXUpl9>sFq!8z-(Z1fnK?f^ z4|^P;vejewijBVg!1EB-_o0_ReiOsoI-Aj>)?c{ong!MYcy<{=`4$XH?1Hm+&xA-1 zjj}rdfjtwnMvbNCo!V6EufeR(mp6ETL0Dz&z64qUfsSP6sTjh zS~Uc<(s~IPTD(R}|6=m{c*v}Y(XL|UtO+_JhiZ+^XlG_IHZlxb!zbPTLHx87!UYCT z_pQBoVa=##2wMc~cGd`+{~tFCyI7)k^mD;J{OMq4XsqzyRZT{zU`2oOu0@4|P#S(X z7^v!@^;#1ZDc{x~9(RC{knfFu*QmMkpH^ZmXARn({`KDZ$CE}+_|bn z$bj<+IoWo4)kqlI%=MlA`I6o^mZ&Q$EBWru!jFvDi|6??IfF*0)4Co?4s9gPXD6DaYj8cL6S!z&=VoSS z+&y19rsUIB&Mb6lpqL@M%@vm&c~f`q>3z#(6jRXQ!+qt~HGgd&Uus0>pk-#?>7_8r zP@^u!tXHA|FX7m-Dg?T4Z|#}9D&HN8wWTOri_`V_M3V|+dVUq?ROV1uHE2TFU9TkURJr<8z_Q)z342Hf3wE<@6wSt7MtgiXs!BJrJ z^I+AcRoB09Nw6sG=?}i#scogRkMp;a>T>bCOd(GwEYtS!_nk(6N{5bJvK2P3xcmX^ z_D+i%UjkO_fCj(DX^Te2G>+f>f%!#e^Sj?qe*b89+*lII-bH zZQ^)d_0kWY#*xSMR^z-sd>UP+jo2?3_9~*sQcT9Q`8X>}TG7Ex{Cc**WmuXDgfn*u z26O$>r%{T7{oFFaZ_4pRu`r@Ef0uR0*cuta1X~hDqauYBXkn$Z}c>IA>g_G<8hoP zljTc}sY|%&T&5-JKq&;DPRnHgv1hNtmS$Lb;z*XaK3M7!J7;W2 z7;XdQ&fCdy3C0+th;yOt7QPx!GL&z!$o2B}@K;)w-yozDX@1$W;Xeh*fBnj(fVK`f z|2?A=+p!soWkC=B$}q|rL`GtrYWvC0r9jQ^l3()j(_H4$#^VRF9HYN^OK(;|>A$}l z+2C_F7TpnVc{rJXBuRC>46vpK*Pd-E`=ST{9RJ9~C6oeoX+TaczR0ezvY^E~ zp>sSE4(uC;(Tznxz`l{uBJVaJ2J9Q%fPLdLlLRKb163jwuf0bU*f$pA{;+TCg31NN9$%s=mw$RA4;dGU1aIVCshks9i>E|OOc{2O)KqEQ{SE`Fpr?AuJ%z~QOia0bHQC+`=+GM-pg=1* zE_RdTKQbKJEAcSg2Zf%0xovY}+SU50+x9u!sr)qL)&5jsDQp@kqU#C=29BM;!13m| zSnHuD2zsn>;w7B?Xs&H&3E^O0O*WHym2rgbvdFQS^E??5Ye5b zb@OLFrdyW9(>;v{uD!D6Fr+iOiI6X`4m|^J8JZjFo-F+XU)r>FT7!ysc_I3ksEbcd z{eBB+EDnnduR{Of;E3*rNPA&r@_PPoaD;pEzrJ&j0S=DZZl&_T!4XP8Eex5B{%~-7 z_gUVy7lTj`3oY#|?5tjsqnEhwu}jbu?Iha*s#$p&GKOQODpoC4Xh&Lra3FeuynR|i zHxnBXSf^)7MgFF?Jzxf>zE-92=Vkq+D50PmiJwOX{#=?t5IWmDI3iEqvI1z@?T|`Y zUMC*g=0-f(S_#az)lkf+6vT_jZ(D81{IkJZH^5fgynN?K{e*}xQ@txD8y4Vl+__&5 zdeX?0Gs2&56G1Gfuo{FGjn&)plRJt&AsRZm(qWN*dI5YHZ=FeGUADH#<)}K^y3hia zF3v}Eq2-WMpH%bn8+T+4!4RC(l%;&*;3{B*9>}W_erZxhyrgEgKx2MoPJzV1 zRPJTyMg?q=9bL^ZNdeavXckN$24vZbB2xH#UQ#%b7uV0H#AL>C%(RHh=ZqrZjMAn7 zEDhJ_XNyQ^_~CBY4&y{qp)7b#n406Bwk%%4&`r!v0_L9BCq1mBQ{wWDHmov8=2~8GaXoS2t}}*dwa18+62y_2YL_1On%W5&M_+w%gWkX|e*9YPu}i0gG4+IM>CdyHOI2&Y1zHH~M!Ns}0s&VqfME%7@p|%g zq3PM=;J%*B5GC=A3W(KXia7818F*pRY$Vmt?Rq1eOE@p~sRZMq8)0^Dq^!0aRm3@8 zAc;dm$YZw6F(V2s{w;^1q-v;88gd{tPnrFh3YLziC>e2AWLW&d2qzmCAl}eqn5iHQcF7 zh%YxxUiphPq9I}U5poK5=K*uT)y)H8PPbxQjy4mY4Hrh*o}=%>_l=471DQae!yq;H1<-ZB!?sn{sMo(%9*Ki0UTagFOp6q`6Yx7z=9B-No)Sd`D}9dvXEmsWb#@AQrl3CK&s&pxNmPHA z7WJxl`cVG_yVQjJN{Q1?rI|=CM__7WJ1T>sq+GCk;8X`CAh&w>qcXsM@FckZ zrWpAPKfedGZNe^^1yL*f7cOuIg-Dtoh!Ht|RQ675%iDjsz(vv<@eWOx-Hry;>BIm^ z!l}r8xOH&aYdgAQt^LT!3$Ud01qfEu)uCG|vIiFn3idI)V4-*i8Vvr?GY#pldb)=) z?c^wxB`Cm@qa!Baj-%ezx=y)csA1bsi?x$^ZXZI|z6&k2KMLuXigKnNMqKKRce?^esc|1#vSdmmp;pGvw|WYq}Z(N_n{hK}KK( zE+tmn)twSgC7}$)P!VzzUc=*&Ox9&0%ZHXYLvF>8Xnx7Az#2x28*$;pcMcT&q2o2( zsM21x*D*5E$n!~sM@w;$w3Dd&>gr}UvGp3LHFlyD6)%->_fPc`tz;vp;Ox0Ey%gUi z7vrxSbTTqxZ0^fM5AVV$_$${w^tgA<@YFhI*9Z3yNoeC%_TV-5V1g<;Z=a$5zw$O0 z2Ac%Kq|jd+%#+O@s(+x`jVcuVXT#X1)~({7`Hwx0`+w|lQcbcn8TcyfR((~2x4<0- z#hpUh(u*Zr2yM0&C$q4Yq!4^jkE(lcEO%~3$qqnGIhiNq(ilAxMI>brRyhiRV;nPr z7su0Q+DWDIZyh67mc!NeHOZujJ>hL#TV5>q`Wdy;ZbNM)%D*r21-H|DIuVMIL5RT84$UTrzz4_5m)DmWwb@=tLQ3IVu!-R6dd)xV_nWZDR10Ba zy=t%z?nM5t#he#K;2BdkU$EU)l;m=LP!Fb;8R5H4Z~w^(DKnSgtu&1H(?S7MHw(oy zi7btkIuB+ACHNe7${ksC!68G0f+NZ+&(nqRrt0wAY3=?cZHFPP7`3SxXEY5if};!- zDDd(q8P#&XaoA&1v`O*_$Jkc~9zj{dyVm_q5}BH8ffDjj-N86_D9UR^WN|f~_}S)g@$HAMPw2yHl#^C;AIU&Hurg#)w;P)dpBo*nz-p zTT{Ev?Kv&IQ9*4?PwW#!%9yY)qBCV0o6EzD9E}SV-Kt6ggvMM?yo1f_+@xH}BOXLO z9OsiYkTS-P>Yr%!%B^)sZm4Ks`3SkDE=#mOxTa~^Pem@I&)R1drcKq}7vI!0o^NM( zhjOTums#2ey)kwF&U=1Ekap0wJz?-Z`Uw(<&3-rlAt@mGcv6~Xo>UW?4aYVza!e9A zTJ`)+Ak6}B?0?78*vR1WDzMD|Dn0-6zisP47UT)u=>u=MlKQ0v|YA;g-0t z1FhsvfUxXy!Wl@uj`Wf<)-Fd`y`MISpJAK>TjKKBn`rVnin}jevM+3Z8h(_<3BByT ze3PDiV)%mi`QRgau7FDl!XW`8ZYf-;qs0-v*FPzx?840NGSMEqk|CPr#|k z;OgDiOdp@hcsh7IHzKT{_3<C##+_GFfA6+R&==lTAg*jW%vT5=;C>w{P{$-2G(+AwdRGE;tABpK_moS#V+=( z2xA717)joXve$uNz19$_ZtEGrLf{U_=gR~uW6J4d-yG~@_F;)?g9BU@2Qs#8Zg5Y1 zNuzf3h76Uc^NEhBD1tG!sq%-B$>jHRB6TJvWC#J$Lr_G5srz)dn$S! zNxxG#Ouc<Psw34J9vZtLgEv?aUL;Eq$175CnP1W(uog*(ez{35}V_|d+OsR!-r*xXQd z;m_--f51(plT9+mSD#n1@!o$p?Vg7?eQ%ht*>Zr_*syWG0qI?dlnF&~{XvrhsuK9z*4ej^{no4MVzIL`O4Y`Rh|ZOHoytXcuZQ87 z77VFren+mOv~1WyWi`Xd)?u;~RkYw-j&h&AW=y$|YX__5%pf;u!!A_&Trq%pB&A>$0%85AE@qZjhp6v>sg*SnEY)vIV-sbf)dVf)&Zxz;GA@CELD;5RgZ$)6i zE~Vef*M+cQ=S`y{48--yKkBZ^6yw2ePno4{B)xND(##Z3M@BvJnM6l5Of2Ov0+;x- zx04U5CGM5^wPJ8Cgv6`~&|1zK;}g&(_%*;%YD!2NK#XuN6=X z+Ez(pRo$Q*v75QN_uc#2M8eHGvlvY6MuA*7=i>SY%z&r|j3uUg)VuC&>T~GAIHF`Z z`8C@Fs~WTPgLVqf@+^>8hlL1fr;=D)e;vX)`%?qR@3r3TzgA1x0}{U2!_mP1{p%6g z`_+D8g$nW9zlMB2{1*72GgyH#U$AfDYsl^Ud1iR*l8-P3HMd{Bj9vw{p2)4Ef4t=J z>wME2Fnwf$++oNud&EC|vh9x|E> z3EkWuejd3`UHhNSE$9)@=tA9)ag5sX50SO15Lu3U0|L?i{anC~UA?@lw8EKqF`$_j z4nYf3uEHyw<4}RdhZ9EhGm*opVdjsR$lA@h^@SwR7*3b8Fm&-~Rb{&%KSbo`U@c)b zdnp>gafM?#CwMWzZ+3HUMdR3q!Zm3AeIGtrl3IBYHJ+jlg3|i^b1Xt_0z%zcMonSO zu7I}TP&l>bL3jYf-9b|PJ|<-IyBR*~sQ>A#DH?S&8YU~|-iIswaFgc*kFunUm7^B+ z&eD4WYtcD_{Mv?DU)R3GQ$d0FQsz7&12yuhPDv{>=K@t?{mnnAUtolzu}rvSung4% z{b$+mV`js<=_1Tdfj7SJmCMax~hI+rAu5zN4{u7kXf)j9K(aX&4ux(5=Rag;l%uDHz;*$!&<~13d{! z6Hk)bN_wvo$Ka($G~bb>Kv|e7SEOO}!Uw&C%0p^8u$Bs<(Vd|qwNBarPz5pf5nHI6ZOW#8Z3jVcJ=)qTeJoT~Vl@^w9Y-e0Qi`lesP|S` zNq~oX0Q`%%)K3J`c7@@^wOhq5)TjF%SY;pwKCYJ<(O?4eb(yfTT0VOOoA{46JoYAd zr#PXH!74FzujxOc)88ESGlgU&A2rE#$jz>DKe2GA*N0(*U~%7np;2RnXjD~4`wgj{ z9e+ckX62%qN~1R46Wi#lOT^4w>X6cPm73ts@XXM&&Iw{L!CT9OXUVMr1bf2A=g1MU z=^4RTtBPY9lTJGf;O^?5!rDqiuGGlff~>=d_CkDgVLKJ+VB`BulF0_gYLX|O6`fF; z6<(?zW;7zycp%RJw1 zt9v=Xrx~#59)n{@?K}Mn9L`GN(=F1rl8*UDyX(?#APDD*nFG-Q$~fY$$>D#kUs@&! zM_9t6(zy9vI$1emLyr|L#9Z90E*&BXyJ%9BwN#>MT9`5qcP&iPefjJ^nAAhme3xQ4 z;#p&VJ;0=va0=w%u?S9qlfzyxJ*Wz7@j_q;8ZGv@1EgfD92VM$5&=@)y5_=yfop$o zQWN2jyB71CkVW2b1<<;*>p#1+QkXrPd@$Qt!;s3M2e<79sgrnC5+kt)4p)#e2{H z@6}wK=hjy-lW#>x7dHV+>g&5w#x8e-nADlQOKoDAxuQk!;(uaNe|zMcyHq$4PvE)U zF9!*%JI=)cJSWqcSL8@76Bd;R^0UxDOE8FxV+c8^$$*o3n#8{#*j9D9I;%#zbz<(s z=xKw8bg6{5+E91(LHP(wB7B$lsSPNXjw9Y4hy*xHT&4fWZV5*`_A9yzUs>ge!Zktg zEklBVrr;wv{d|I|h%Qnwxe-a|x43LW|G1tJf3X^cY9;%QH)rCO)+E0bmrejz=l`P4 zhpiY3H|6C%)q1@Ht{Yx|;^)u(&c8lfw+BaTl!6Qp$}gvv_N@tO4$277?}<=)j0!Y) zUrjliDk2wVNl-JmesTRNJ6-s|o@Aeo`Y&_;${08kS{VM;nzbnu zv~MWhN`iM!4K~q&v77sYr%S6iTi7UTB7_yIS6vE(ESw3(M?On6SqcDb$7-Aa+-jC% z;rH$)W*q?J2#e7_RdoMLgDjxuF^BxJ&g~KI6BT z{9S!D^L&Y4d#OHd`-xNqA5Rw9#F&z3*n{a9bivHPUFw0+iIkyx2b{r@+IA?eCO(#9 z)EZ=470z{{$D#;MpXg zLfB(~gwTB+_Ra;k8EXsEUh1K^f5hRPe`GMe|#6{Lg-U3dzsZ&P~Z<2>oPt8@eOyZPSxk1UiRNfyXfk z_Iw+FON|9MMifOxz~iI(S=fVo2&OQ7FH2TJ;Ekhb6fB`gSOIUpH`?G8T?*Mo@F6ki zfj989m0!`&$-9JMG-?C$je|7@Yn(e#8f(&Fxx{)pPQ|UM?SJh_=)26?+>f`c?%D4i zOp!h%a|)5LnWMq6U*gZ$z~F@(>msHWCyZ^g>fcOZesqtc{&n|Qf5nR;s3>awYh$M1 zJBy)mq6Jp8s`yQ8Sf+adAG6J)xEBfXn8X5Bw3?zzF8 z0(b4RByxkcyE?S#B5t=;oa%yQ$A-uYi_zax7tR*ATizqkv!j&^z9{c zNGpj`;e|+LX!pTe3#+N+pa!(;_u0XXy@wJwDCbN-5C%p$-4p!rXn21{I~cCD!o^(k z6@<`K-c&+kMbrMI*PR?8t}XaZ%RoZ?DN@ZP=&fTUX26V~I4{=KYUfN6;|DZVrDftR z3e~d5_yI=QS4{!Y!hV|F!%Mg638wW!W2c(7dZ~o#KzbMol+I?isqvff6|542B4XL- ztGfDh*OvdP&j0$A|Mmw!Vg_v8u?Tj>Ut#zke^5bzi6+%ab3&5i)t*xLWKFX2OE2eb z-p}tSZ(DDcI(9Dg0{sdO@ZLFW)$nIw+jhLXoj7u=Iajl~mG&^91dkI8dKlnaVOz#qsx8ErYSZmP08$ zxjpO$YkAF?&?M>Pd&k_og;6%@@Y zZw7MP14A6%NbaT9i{5 znKItrl=>v-m2Zz@4zn4b%*nJHYxSPULUhT$4nm*K-jC7Rw2f7mKLbJMzMv1i8U;MBOYw;ag@>N+eii#qjzRc`?_W-f7u!h9pjW z9WO$aBql)uJh%<|)k|JQJh5zM(d66E(wraQ)Zci!v@?0rhW`TX4#t^IV%pSSoXNqR zpyt|s#OPD+(@@bq;cVgPBtc$$$Nn$_@kVkt*Kja38-IQW87~+*x_3w?eJWG-MWk4x ziSbfS^NJC%+2;(kd?|ER?vqC-*U~E2Gt!L{FkLJm)hH1)-R9Rb=wh(p%Ej-epbMXA zXRU_NOZ*^h>G|l}>aMIyp%4)tY@tB!t3q-h|I+;J0sABd1m&V%TevqK8*CrT2@cM3 z7G=&4p~u66>)$di5_)SO>ecz~PX#qagex0cpSk04poC(2rL&%o@tfAX3IP2rPoUKN zH@(s68X-9qdG+V-vYX`1Md`*TDM_4KpeMP$TqAegKgg+vgyhtIAvsl4NKSRZG66Xi zCnTpja;?PsFV5d-HZ*2J5a`j{?;tn=g0EAi9-NbVC*FS%g1D_+kJ;$b^89}2#iUH` zr)G+Ek9B>@1SDVj5Qr>o8kDfkM3GT-qYb<5He8}5pi1&$!}D4-#H@1Gp2Mn&q?(}k zTLn6nUJey1g%KA1*7T1xmz2~G&MAj*HaX$F=J0a^?RR`|%&fK8`aymZt!857SgR9? zqDlFT%K8*lr&R9N`c`DlO3@SeeF?jzMk{DDKM%37XyG_XXwdhB${H1jxvjumKEh`v83Lu)OJTl?25tl zzq}Ar(Va&SlWoD}Jy8}xfOAl%J|h-84bSxg-KhNm4i>OPojj^h$Sx5)ftPE(`Yl)K z@7ox^xHQVbOH-BXXZ(v9U{3CxRAhkz#P^r@4%$b;oN?7#-C*2}_d4ZEz>! z`lmK`^mx;>(aoWUJQA5EeNE5Gl%{e_#sZt&40<3G=W+|)3w{J5xrmTTnS_gAMHduD z>yR^WFK1juzKdgAcqz)g??Mbyn{}{t)bU}vlPyYblm7=QD{r{Cs%pFObwyUM$eQp} z&#ABTdua)_fATVM+)~l}CGADjxjq}J$dLoLb;?jkIvN1tRl}GXF0Givuix~adRCMU zzT3#q@}20$nd8<(+`Ikes!;2<@yeE8%rQGR3$=dZ57=*hep^&Dg&}9?_vpMe2LJ=> zD5A7iviHTsGrZKRn(nC*=L_zV`~|iC_YUFN4J`Ak-pRG`nepQ8?y!3>)f^H!DA0!g z7Zq|HphB`P+W{)%OdOy>&d`C!C?_v`IAFvkQXLkc=C-FD>?rJps;#SV?qBX8^RPJl zQ1{aPdvIDOr4I`}!N^_eKd6w1gnVK9po|Y~c4mKbQpS$QZTnj{V3rP^4#5-{fo+IewDc0H4lcZxCxMLOtl9<@C zvn_^BE+|SOD3f0s^!veBZ^KQ?d+=56)L6p=5RttzMqjJ*M=T;R$~g=TZV+~3FhNpl zM=PVa6j?>p_2xYBIo#68=?NSN^JBjRc*1*kPr({lnsJ`wP7~iR3J-sbC3Ynw8 zFzDZXM?ZQoBw;VcPK4q7^HT!77-8e|s$%p@*)t(*vrNI@zV8;R>GDj5?GOPUjY@kW zo=pxkDN3THepMiTb17cnPnr#(X-C(ebU!_T&a&$%s_UBm>|{sVrEDOxG{fsp?IOZW zBD1+On_WF9SJCrb`*EcuQMlPCNk-XL!b0qlPNn4c!ygHaPi_S%Cd&8+n$29O(_2Z4 zIc`__r1pLcoVD&2swG!;&(e&I7|gLp8>QmFi|Y_hFubd4?Fshd%_tOFdnJxpc`4qX zVMc#KMB)3L=a7(UgU6{LnaBD5j|tV^Qs2MA&i_*m-1`-%Z7MYq?FPT>8&ZK6#%;Y- zJ)$>^u01oP8aBRdDP3I$1Yy;1xQij(*$9e+DCG8;EY=Q@iKgWy4iOlf_X~aovOP6m zhpNKTuurD~H;K&zi&gc(4(4CJYf>T8v+h_k&$i!7E}+qk339m!MebviI6bSko`{Z` z6#y3(6AC9l2|)?3xB{NDIJIi)dBK^NHr4Us^ZZyRV+TRyjKB}qa+WX}KOd`=AKLsk|5{k=A+EeG89-bguDFTXs#hJM zB;IH!y_C*0LZtDB#53y)NE1-~27>8irt=F%aBvjR*x#0tEpC0hg#&FNKeZd1J1q@k zE$UR(wHii`@LkSE40Gp##@KZ?7jjIDdJ4{%5waasakEZ2Cjb@xjR!4qT~YXO=oKCP zcR6DyjY6>x5-TyeV#)q!u=P55ff10SH^v{o=T8$k*#UQ^puNHfYp%BQk_HFXr7>B)C zgH@2!lBy*yqxw(K7BoQwP{m<*0#h}bG;0Ee2-QB5BmZ7Stoi?-A_kL8b_`qOp6%-Q zSJk(zZ8WHfFcN$YJrouuj;;zc3Es+b#U%!wVS(*MfYGa+;UthOTgP14neZz*6uQ0L zj{N~w%d7h51x20v^JAS3=N1Ln6fnrdi@IF!PBF7e_lgZ2HP667_Gde5!v|KaDhe8H z-TW+{=CkCIqakuhdyhjtYC?vQtQ%oZ@W*~3gV=1-13Flv=&l4fqH=Ho%>%|r1sriU zKT6n&nE=uEf(B4j%L@zS=W*7*c#rLbI}5=&6Nzenw)6hpo!GgmI0RIaR!0#?ASf{~ z1r>t2c52;m@`;p4O0-&<$&URFm%LM43?s(YPt7z(8B?3jNIUKDjPx~P@!TD3dg6lz z(uiG?rKB!o4EX)7p#_n4NkWGx8vJjXAlW-BvDK~D4vC7I)-EZGPV70E&&Qhqk=QHGWbw zR&L@IAWDgyD9zrHo1#VvG^0F2TZ&N)vyOntM72YXm{J4cZ9_7tV=MzwH!!{DdyU6bs&=`Ggu zPNZZ(tKP#w;S&w&$&OkfMpqO$aKCZ=o0yE9{syljN+gmL zm`3{5^UmnP2G=hWINS!jm*Q4=+k;ni!y$ZH(WY?QCSJra*23=@;)+sf(y6g-unbvj zLxj*!?%4Zgl^F|Avagc6Ll+F!pFV~CjpoytiR8!XJW&1S{7jO3aP5TpVA$kZIwoaP z&2sp1NGMTlb%A`h<>HDFs`K2_O)A`Fkr*4-#bxsKv8ddIPFG#W1nbzPZ-ipH5lO>^ z#@npfn5N;;vxqn>iT&QH*fYCDd%{8GU(5xbE~#XEdx2#a%d$9Me@G~y2#;Y9mlbEQyR}5A>@eb)!c0$tK?9k;deDZyQnoXG+lJv#ov@H#MME7 zupW5cGKfS=-piRCeq!|)8ZQFdLomJLW5gUdf8DhLF%`Rn-@)8UU@qqLc5YYUz~qyC zY+(~`+bg6mC$3!Cgm|fQ36an zcTy$yMnOSF%bfh-qk)mXe>lBn)f)Zd5B9Birf55O_vG(xtvhEwo&RoWTKdxBfa0Cq z4lnLVY|WdyYngk}^!Y8XT`Sa{uiMjeT}O+pGtQ;QeWRZ~#I~vKsrPWrEt=!v*aZ0r zw>vf30fiwV1nX*5e^dsS?^Sj8PT8`~ELB!ctUs1D6x097r0S5a zs|w|g-Cg}6zd=*H3n6x(RU2LSF?*4QzMEY{D6j=P5m=QR@*y|AM>+3)IqOS%@-@KpOv$cKI;PK? zA6<%(+M&?jG=xBepRtrW!`k}=XHal(A0;;ty%9eMaX*c2`t$-bsLcLkDMf{$NkgYU z+Qs)>J&0Isw!x+4Yz%kw1m`f-vOUTJMVdBi&6Xjfbo)>{sjiwgWRlektwl2fMqX{S zTpKX8az%*K$f51H>>45>-bwU9o{hZI1&fnaD4%;OyWyTyB;js zpzD<%74KhIR}xR`g@%^V7;%MBNC>>z_)#{l274wCVGK@$@<8+HFHU5G@VclHnIgZq zE^B2kz2)9Y85@3sDLnwz0aH77taewtc)F|bG)zY!-e_1qwS8PQ-2Bl+*U1_?%|@?- z`BP*^Tg|iY%~9{62Y!RYr(HHKG(2{onGKmm6U#c4af3uhkNvQPq9=%X`)MjMmi8F) z7^X|vwz9`7yXF1lJmF10!u>3!E%C^jhoV-x5La)FzC6*?NM-DbJ-RnH-wMRPKk84& zUA#a{Hwh+a6i&6)>2Ju=zPC7e#TGZHfYQgkKZ9C?51z#@Ugh|@E*3uV1@U%pf%mLC zu>I8)Cn|zNXg~cFzGAz!df1nnKfMU2pR(5sTqoSEo*E^UUSTA4iKzY0Z|TS1Tn)Ri znnAzj{m6L5E`Qrivfm{Js}#Rvo=xq2{&e}{Ws+lQ%=j1$OV@XDuG*V1yN^-s+|-pf z+UHKOq-uY2i8h>)v@oVjJvefX(-3ngYV#>6vq7ii{OJSC=)S$Wh^j-2lcpQqHv|rT zk&4_egSlE@!5ZO6!U{HDt4M<|^F)tWGxxbYqRSrGUU;=QGGNEKP{K!&M!bTk`^Z^n zR!K+*v8C6F(x}P0(!~tCR{QMICll@WdzU6nl?KTs4F_8;l4Ix7kE^~;M^;bg{|4h< zn1r@wk)+*0pg9R{jsZq9_7^v2tMKNS5j(u=BsYLFCo7|JZ3?q!S~IydEHd>cuqVoqCF7d|7L_?)EyZ>m?uy=-w2wWEB#|AZ6U zD$`_6*FX;DF3uo~BhyW+rXXltNa@}$T$deK2-e}DNS|2WBf&xJ2d8sIYN{FfHi<>1 zYPA%fGiq6(U%{%yuET~lIU;LLV&7jfep4g^JH6yp*;kO=Q!(-c>IaNHNOoF1jKMluns)5^?s>tFW`MY-HGE1~vD$WV*mAaxiS7*+c0QDE*% zt0qDw%ojCZ%s1F>f}!cyzS|*_-W@tCDl8=F-(Qya5RP}x0~VRdlK7{zmGH2be47|q zf6(e{{HL^ak-|C^_s;k>_k*3P?USJ9?QiB@&0&hz2VQDuenH3lNR-S>sg*h&_$*&q zxFgHQ35-*L8k&)<)Ub{!s*|CW8?7L;oZTKTvc%R?C+#Y|fWJqF|6bz`D~f4u2EQBN?uqPb^y) zVJSFbeyLmhU2p(LgBh><%mb5g9q|Zt^YG}54GPUH{4e62NO3zFwySc>Lv$$G_#dK4 zo7AZ(-yTSrcd8YZlSUl0-1oQ|RcM2YMJhu({}PMb{}YR@Y=T&{#W2D4=NAXgCW zv`xc!xPZ2l+@&rnf+KRy`LUoL>Jzac${OBxku1sjsG!-MpsQmWBw%?(cq$yIq6i#pU>v?wOb$>;XQQyLHTAm;PreU`(G+CD-!*$ zG%^-rsuH2sSyi%OCfpqffVHy_MJk_`KvRwy9;w>pjZ7`;jv~zxaDC73rLn29vq}*y zQkYTfS#HjL(%+FIBDJo^C1qPKkX_25P*pbijzY7+tKQ6w$nQqZwZVB|N{4Wjcn9a) z;>!g5XWb?8x6Rvm%^tMVp*X~cZrrvT?x5DZH}R%GZm~}>Ed6F508S5zX+WW98qp2P8#)b)ouQXn z;UoM|sH%aNx>+ug!PmAeljmcO8B{GfB}o%uX4BXmYo{AD&oZ62JE(*3p^S$vnCdHl zJ7ppgYhu21M%xnn#Aj3Q#0)l+)f3@mTJoyrtNN{#cY9EW8<6X0n&g}OjDaE%@jLt` zOfk^oRvnTh1>x@F;}onJCz3^8Te7D_bzO^3K{D~UV0dP2y-ereOX*y`FSHo@i<#BD zo6or2{NpZ{5Kt*9jps2zX!{Uk*zmnZ5rBf1K}q4k9~1a%W0pDkRPW7@le#~jPM`Qi z!qjA|wP5BUL#GzBO7o>=z*DB!%0XJ91O?=Fg4-lx(?og;5VUG` zUD$b1L6$L(2pW5NS6a2?;ftLjjIW@mi#+e4zRIL;1-~Z5$3oXJuG}MoamDRaZ);LU zWt!5Q_Lo?k9;|QoBYv3tjukZDjpuQCmYzs#(i2U}g$6&2*1k^kJL|&^Vz7hsobNR& zt_QfI((x}xGIRUgIh6Cvt;`P7%_r%Za$NDA4w41h9CR(ghVG zqCjl6d$!2(-ig1oShi^|F*|1NX8_05@+NELTU|~Q-GBs_Y-U%89qKTVEKBTowx}T4 zTU?sc9(1ayxqY7yP`H>4jIX;;A1=n_YYdDJO|)WU6X6 zXK%?+YhHtQW(aQt1WBjWd5!hk7vCjy%7L~$LkxHKXU)kpcj|l6bf{rgqti~IS^Gy^ ztOD921gTahfy>=(e*DTH9tXY_P5GC2Oor>UNG0qc!+$<8)?i$x^``0I<=9eJeD<)8 ziLdFcDh@D%Cz|HeSE1ef_G!I!I~t`4HgCR&`Q8G|o^tJVGj@94k@+Z&>|-u@9c(U5 z9<3HroBF-ujj($5MpO>e)+~0hv)K0mTcfpQG->%RJ4y8z#p1wu9EMg$xh?az+YAj; zBKh;Wte~7EkNv7W5u)}-?0dQ8k%;k|_eS#W-`XorrGLNAd*yAlGwB+iyejt21Maro z&?gbGP-{CwOm3{nj&6qtFGf={xS8(Y*15BUWGG|LMzO?G3LWT3*uh9w+a{Q2h-@QT3QnR2$@=s(|?hiF{ElxkC~5Z+~>X${;+Odz1OSb0otqWG7r z4qcBm$%@ji?iyzaJNALE>6f*bvs^w86x;gdCf*f9SRnSzh3R)<<8=#0&tlWYx=kl8 zJ4EnhV>1zPRY@(4{AT9eT|xRMR>siWpIn*-7y-#O{bZW`?-Q3C-bKVZEbwLN!-pO) z1~y&{@PedXQYNXvakzVGVr#KL_Ge=D(tjb}5KD5^zh%(4UV@`I849@(#mC={qk}*K_+LI3su2 znHnfYG~wbSnh$$!pj@`1KJSCtJo}$OX*lpc9Y6^n-)5EDcI$N z$dLH=mRW>mK$o=cEp@2v?7gJbL|_(W`m2tiG3a8da%bpO(h*M5Ga#_zupr~%_8UV= zVf_viZ^YkS*#BJru0Ss}%vX0XRYm<a)29RIF*+oYN+u)3 zM%fFAZx&v$mp|ZSYv{Z8iE=M>C|pTFF&V17*g90@Y!P(yR>DTv!N;Qey$O)m`K5ta z`V^;D?boiyA~kVj6E3`FHw%p+hA0}Hhe37#)hEBNqZ7*|-wxQx9d@D3SD_?%J^kFI z&BA9x`){G#k3|bc_&R9HWdYacL18~(i+-V1cuMG_Wax3ifsA;eX^LStG!R;RwA(|` z2I;(O;>=F%&^Ahgm>_j<3bCvO!TLXJALIcs@=^1MFv!C63Tv0bM;S+FF#>oQXIGTXq!!#?Iwt zc|F1ndm$VpF8t^!Tc4OPsE>fWGT{5b0pEwgH=JRKsa&W%#^kmwmbN2@qqU!I=@Tnk z0L{=qwXG4+lE{+Iy~5AMB0e22@MwxloWhB1;G)l~ZG6ZuW*5wjPUqgViTc;?4w{nfj3VvSMCltkL9NBRY}l#R zBig?IunSwz@q-02u`au6P+>o=$7dO15UiejEj$|Bq(!`yrGGiB7CfI8IH{BmWctrf zjP5oFTr#&9v)(=gF5scBlhdadGl%}e_<^b>Lno4C>=fxwIcii_m1r}bhpYDmD2^3W z)7YLo;p?OcBwhbPp4mgQ@YFW6tf&)7bMlFmsajAXl9j4cF0_yf4vpMOh-o|_*L+`+9>qJf^k_WDnBdjwd_Qa4@kHrJ$FoSC zNIvbNj0kluDc`m}<8mJCSfyD`6vQFC{K3f2_?-t#CnG5%&Z^2#%6MTK1n6lty6~IP z1y%EysT>E^K6czaYFmB&FGr(^w<{&zHtTbMocfmCyV>&R(ERHEqOb#v1pWXh+=B&! zrP_$By^sCfKw~GfsFV_?vBN~nW>+qmt3cBBj`f+j1)|VA99y7{ zz;rwnT*@91Wi4~G4R_U7QW5X5ncXYrP8wh7Y7AG8ES1`&P=Hb@AfN(*EKMGTQ?l2> zFPnDfuRK}>%%40s>X$-&qMY-ftSTL`btH%S$RZzRp!YNs6@i z16~1+tzNE4Nc?aFePE;VCkR#f`E5{ei<3WN+Gy`r9pkVk|Xul zOjaKy#;28~9X$!lt2^S7D&LjkqxZ$|su_64HauHA>P$1-&1k1FC(aUR1xh=GpQFf? zw2!-VlJrJQJJsm@b~U&n7ux$)R36DU?wWAny&+#H5h<7%(bXeV^<*D`l8})on8@K< zrF^gPLR?hue)&^!Hyae+Zyl>6og|)NV--j*m|XXMhA`udTmU}`%+szYeNX-I3ioH;(OhW>m_Iu@&Bc8PGy<%3ty{N_#9!Q$F< zs}G1i9a}rM@O@XZd6Wr}8_X5-Qn%5j?J)86aS3~{sQ(|iorQeeetSDRC6jh2Cf07K zXgM=V%IV9K`@W!Uzv9;xZ0T)6XGN5O)Gye}E*4J8&}KS#YQk2ZkEMzdHWz#oJ{tUp z9LE8w*|`8^{7^x1*KadOx7#%IzDYZOhv>vEvtT9Q7U}kP%Ol!j(%fhj&W3))`|+3d zTh$q6``X_3{D~CKIw~W7x)>B?X167(pu8ktfoQWNZl?poP)9}~@idD6Cm0NrI=LPH z_MV#japke}*8`tEGI1Uv0wKA-SU>|_>GMMoJ^M~RUlwJ%!x5V11<{RWPXG<*4e9!D zl%*h+cUAFcRPVE$gh4uIvl@XUr%f3rnwFgMS?BtRBy&cG>+ruscLr9J8bhNF(y`s8 z4g5>b!$mM7r=0>V6!5q}h7q?A$svtZ#ROw}z zURMf}utiuL!8>=ctmaKzGNd6N>7@b~3hzkoX?7 z(Jh#@_6z$)@X6Pvn1AH2(9eeYP$i3i+0O)*uai2{{JNP6)0NX-7G~)t^&UbU6vh&)_)|j=WExF0+)0B zuFkyv^AQ%TffF`8!{t8dspi8)FCUx6M)h$5r~v_&E=#VcyAgK&Pd zXxqD}vW(DNIw><=HNy}ou*|s#R<<@NOnhP>M!D_j<1-lxwyMz8QM7eh!KmnxCDGuF zUX+^9Y4OO9pehT4lH3k^JciwiuDrCo z^c2>fVAUh4UQsb8!ahdF29U0!cQY=7DyzU2;N;z-5nb~LemJU|->NsoWy~}vQ$=Xn z_#EnyP<1#}b8kVYjwRN5|}Pu+@qxFQ4HOI~>Z z1p*X)oSUqYWdiaLlU4DqeSH>nemG@eJSt{C+y>-No*|lQMI(*|eHp~{l1>RAhc$Ri zRqwZ?5Ur@{lli1AI~>3sBH>V{=k>dq>ppo(vkARf(0v6XisyChuU!ci)bYywbMciV zC3q(i4w_B(U+tOQ`aS%X$JZvB`sk7x!_sGM#3rGiGHFZ&Dksq@vcfFRc8{iaCl`8< zk1b$flM^4S)s0y!cn?*T?BUZvv0c4a#m`9@8&G8-UxKB2IqUSrIlTj!H0R<*SGP2NDl|1#Uje zs~6P&C}CeeVFvIN+m+JjKTdlSngFKPj4ngeX}VSQ=>s+kF-W(!9kR>vCa8Uh3Rx$# zhzi-y1`;%Ym=b>!NsJrq;@L{ZHK33iEw6R*oT$;caH4x&!TunVrr$n!f&8tn<~q@a zQkKLb(x;jPa;&dJ?{{1V9bv!fivrp~tENj_r}rgwt6^H) zy9*hkF(5P*?djBgi-VZA;?X&@g;*NUC?|Us7%D^#n3T|r%Jc!3o9vO6r}Tb3i%QJ# z2W<>;nBl0;2YPxkk|>X_WzaTrhK!NK5H;^p_R_^l63PD^vY?M%Mrv;t*yA&KJg)&R zWCQZ_4qraUW>w62W_nW21mm7M5pH7jsNduJKcm5iYk$r0R>2%^>5i3~=synkpMB`- zRcY{-S9kB|6v4~zkV2(LAJ(Ux|^8`Nk9 zI8XYhSd#`io$di0?`XAq$Q>n<2=(KF%96w5_xifh z@<;cXSFeE4>+Il%yGjE(jmN_-{c_ZI&!Vr5sfumJAb=Inmma}M`=+E^29Sg~SH&uE zXBi%jyNru3c>Zx-uS3{ymoc@3?_VyX3oi7y_4RVT1a&Wjp?&(*EM)gG}rKt5n+nf?qOEpPp$rox9gw178l0=w7%W{SY8ctv&i+ zaAEs1FS5muFO=yie<_C~BepCMk(eg3#B-|Ks7<+KMSO+jW>$SP#BbB&Yc5A9eUH5; z5Zd^4ixpF*w(m-^#A6;ERgRlOm@pJFcZjN6>TMG-84QBN!362o*sg0K5&JTGes(Bx z6${*wl5lJvm&0jyt45*vRh3nL3RN2Co)>ER+v4M`A04$=wwo@KenBIpq|Ps0ZtQ+} zetMWKaWKXr0sP2SaX#t;Hx2BezuqHGCTFvN6BM73=Tht{D%nw$&#G71$4?yC8mZxw z^55BQRV_yDH5}ISNZ@QnK|WMEo}4|4Lmah0P$sE!@m#@Z;Pb`fP;If?W2+R;t&(;! zwLAb^lsfj_1&QBb^x1A+1={?E8I|4WE(WYw$FkHp#-&GK^a~Iv=j%z85G(cE2{TDy zI`|qyEIf(xoZE{n_PHyuu7^|ve+2ys<9xw*In^5`y4NQ&D0#A>shU~)yM}A|E>pE* zUY^_^ecWoj}qfPBicP^;UTs zmgY8Lv%1^GqgIzcX>K#r|vCBu?*b_@@u-Dk11GD0YJKKIin&UyubQBMv%k)R!xn5v){3*{z-Z z-RlXOk7j??xqNE1Alb~>?Q4&!G0esm+(&l>dG0FF)AvLQhj!^>-Usc|2%I!WF?1HY zCRq`S&@5wzercPW+==ULW>|NH4JSqA)}?wG$`7y>;AJEL7G3f8&uc-?NlZw7)=j)> zrq)z09HvA4GAXh!3@l!lGl=@!V5~Y~!!x9>*{+Tl-W}ABpfFhH59HB4_z8G)iL^Xm zuDYeSI0W#NN!@J*O8W>35Jr3+D{y(RPO^at;@-22h*yNo=F@Ta4dMdc2LC2gWzLzj z&WPA8?2Gd3HXne4D_VBEb{v{p{Ck5%{G^pl@_kX&La0mE{mK_m#sy`(x45XE4d0XJ z^pH>K(0g&?d7hf@VuX+-`E6;rYfWTmr&@ta(*BMuiMqGa?_9m~=%C^J?8K@c#hPsY zp{U__ZEqZj5DdC~@a78PRpPKQhWX`6U^Y|H^tG{3szdfM{&L9#t_*_J?~l|mL=s>T zm@bnnoPEVAa8Wb9X~Fce>7w3+;4$z}FiyNx5kZjegGxO0{P=!rnrTT)`#B1kTfndq zGqn+LXjM7wri4?UM~kWdzSPh3#<1#kxa^ORA2A1yiI~~fF;_0kh_qJ1mwS7pr%n$h z9q%w}>qC0?{Mp2r{b1w{yA3-G}KXUa6^7l zYT477jx4O45j_RbM-lq~Z|e|e6MioX0SsJ4pG#b>qX=e4g2!3bE4uz-zO;d!OdPEz z^U}MMBm2wwQPlYls5J}fE((i5my*S9U2ZKSa7zOgdG0*|NzIMeB_2$?h{r*2AkJ_i z%b{{wa4Tr*C-69itbW|`vGO`yH<=|rnDO3H0S`c@21J7a+&A1^-12$&QD3)Mw>RPX z2PBvAPUs%^e4=3i7{o8Jz~u{sl9vh8r4CA>Tzy&n&w=rC^sLH^R_m`Vke^D0W8LGn zj2qTHRH=PZdk8FWxv;9qX=`{6Wh5pSXXAlJ!ZJJu`dRUaWo1+3`BsUFx>|%qfMMcu9lN;opGBbA2*EXBb?79+UmEO#b_8-b|27 zQZ=xH4@Axn80g;0IaSeT{DUjXpJUBO3#8dB!x19d$GoaU*8+CpZa%nKf}Dnn6W__U`MQlQt%#SH#Dgl5MySxC!5z zQlL^h>$@L*isIAyPUPyhW{Gj{GX-icRzuaF@TlV0{br zy-=EA;$YbLS#jlz*D!Dz=ctaVnQCxCE^5-T>g_rhxw0sDTD^yjEZ%c_lnN2%TjhfIkh@A ze_%>!8+o4wJa%oG5ux6KSP}PobYMY-My_$Fc`8!f9_4JsTuznPSd5$J^sk``mrj^1 zG5$#Ai#iIU<|&eXsvoeerwO*(tf-_nu;VAY@r{N7pQ3j)bd>DL@>c%E=)%_-k)nCm=N+k} zH!pH`FuEI3Nl$XZYMFRD_^v&2?`3?mb`eeF|5cFBcf8A3yN&1KGvJWUBZ@tmAz+46 zH8wpB_*(AOV`r?{<}jo+#X3FTv0PDHTzvha3svJ$A2d7CdFPaDVS^JkQRHzmbBDW? z$Kx5ZA#$tx`RsdU>tg9CBkoP>psJed>fZa{+wplw!hkais?$j|2rd^JiL5|3lOlNe zeu<3E8X<1(z=;vqDKq4TFR%AJp^0ulU-dE0>Td_Fezrp>j)C83+|y{|A-AqFQaiBn zcfZ|wS`Ff!l+Bh5u}8|w@7EI5f>Q-HCjRaqvZ!9KFKkg28BAc@2?y6+NrwL!RY+*^ zr}*L5@ocbI*+YXZ;Q&v%v6&d@tuS7%)%QX%qgtt~AEwb~=WLhZ^3htn(t)ZhZRKHq za4#%YgC`XBEZ}@kU_t{(8Ye0Gb?WA-XGXZizJZkwl@G|HL)&BNi0>Wi+FqZ~UA3^u zh#00x(l4tVvUbR9%Snc9@F-$O})9o%Km3HzJo z%0Zua{2qOP2*^FW_*3+?dCGS$TPBjTA)1D+Fo=JWOMDbrfN zE4`vTFE`MokQV>`%{FZbUqC$N=TbamU3c)u+>`V@g>k{q)?RqJ1W)IIx?AX*6}^4# zLP5wq|K1^=v4be*7aXi92eX2bb6?1D1wl^7ZI8%Ffl`9|lB0STw5a{!-t zL*{OGj`RW~z2G?V@+TYNFNw*)-_T>;m7~cj9|Df%-s>FBQZS#M@5lk_66>iwy|(+G zwWc-_7jKb)(%XCziccZVA}iBZ;DM_Gse~Xp8;#BFLXe@<;io zIp34bN_WE2fyn!M-@b%S`s6dZPdSa%cM#VzEgz zKAgUT`h^xqcq#&u>Af^vWh3b4*Q&C!&s&XbI1+C!L>etCJP1yRcBkJF_`dY{9*n+s z)^}R=Gl7q%6!4lRB_?nJUbIUht>4X|vL&ZGgmlbvsS>3w)Se33d+iV zOXaAIc$~^J=o_ie++~dC?Y_#t`F~9=EMM=OF^8J*{j(GQ=hv@Gz%0VE;8z`t_mcH} znV^?1D7llTSrl`B%FZc|LqqqH2VBzEW!FP`OO21s0Mv2(bl5N@%#G5B!@(#=3DT3h zmu;=Ss@a#XK_;fu$mz=^;HBeI6#P-^4nkh4i$Py+xU7FjBcrV?=yn9RgN@UUIfGO? zziLkvK=fc;X>=|4^*p||$GRfLB~*Nxd)b1YBfjbBc?N&G4{2u?rJPF`d@ax+%$wVl zj^9i}dbNa)RJvTYSN!=zjF-W8t9DPl6-^JD6-_b;&Ao3s-*dNb>`LEujvE7}*01?^ zb~f1Sz#O2OXCg*K9VI_rq_ssR03o^VASq6eMlPZ07WQT=@p};L^%dk>UkOhiaa{XJ zTAxQ3HirR@z+N{c+Lmi3UbYb9+s}1!6&F-_(l#D1ry2;8W530H@A>E|bI0=sb5NNt znYl0M={Bl3C`!gMAg3$$yy}4ux|no~^!PC`GWa4n50{kCh+C~`^eckV8DRBJQl%He z_t9tfr$fKcLN83ZMB{6OFf|nBIml6YjU_H_ThDuq)dR(BcX<-v*`LCXH zukkAmotiG1)C7Q5F8{T>*sD73MoQ7yz&4NB_(3%(33L@G@Fq)! z-w|L~Aei95nh^yCC)vnmD-U*=v9PhaWDaVfo~U2i7SlJ*fsvZs!>VRHq>mcfn~uwHV)wVT*e<$evDrd#9lSjmTD138y?gJl%650*N?oZ{swe8H=>*)-v&&$Y z=i-i%Z029DMh14y^t1FuRE-VfQBBW3k`V=<)eO0KB}s<;ISVNhUp!|V9D147tJlxo z+W3ek{4eiyFXhf&buuYr)Ei@pO;jEGicsc~>~gh3{+@yam{8w%-f|^oH-4?P%;s?|fr^nI(VW{&2mqys<8o zu~|r}QVF^OIzt`cRm%=H2q3)-SCsPt- z#zcmCK2saMd?a>LNF!=Qv6-*(>1cpQsLlh#y1{JTy!x=r4$ITTx9&xg#%Gj5FJmi> zSv(rhy<+$qZw>12(kS?N&H5g?9;G<7(>lPW*2ELG$=@F{d2jS1ZU&#|T&Z2l%im3v zI%+13^s4oduj-Fm7NA>%cQ4nTP2E8;Y*@N1RsH&)w3|wY6y;=Iju;p4mRn)TDJ(yzgpsixok+AfgqKMr^IcMq9tR!S~F5^NEs z0MERr_|+hLv|rA0PqGdpS>r>~zmvl2Rar1{R?E&_E&Xp4u5{!6K1%+Kj6) zW(4}z)SGsAAeTrVlfF(0k}V9%h91)`GUp?^9;U_nCrNG|EBROHeYa}u_1aO~mvAuF zfVrdEGPf6Qd!epmZ#yGH24*?o88d>{A!HMi3gabOs7hN&WuK~NM_)G~OF735Uj|PJ zJC>6f07)t;3jG)lNib5ibU3|*a4*N8lC54p^T{fGwMXiA)RG{$ozNkk#kdUMFWZhe z!I|B5^VaZ;at(H_W_s|no){e0=5- z_#GQCD0N4fHaSd8i6c*r^K|MtXHmTl zi$0{$@m6|5A@3Zkm*S3}DVQu6r#3%r=VPHxL)UOnOOeXkPTi~@);1u12~pn0I-Vam z>IF+ColhTqr*7b#-Il!dllL-@M>FBB9%d=zJx!&1OIGq6?dx+s(5Jrlw>hx~5D}F( zyTdn07Dw>f&=J2_sI2XxZuFwZOaECO;TUnYt3S?!=3PWek*0sc4o zI#Vr~Zcy0Eq&-GtH;{8HF`iNwSCOQ63Xe^Gk>2cG}0CIt?EdPy@Xo+B~o#Wo8d$9JHkwoHs~kSMc7lHziT}Y4U>Q(q2Vn{r!MB zs5j1!`UyUx%Tv%Ab4!4(8@c(>ZGt1{HfLAYaj+%DAczGDHk zum|3jkV6%7BiDnnlEbPieDP$@v+h@n-EMQ};%FVLW|VGVcn%PMH7V>o>0~pB#9p6U zL$sQtNPtJB#AqRT<#ZO=Ix3e;Jey3iV%qq0O^40wIT+g*U+;%|7a1&qVZ!6T>Vs!L zE0P_3@4=p^FvE~7%x=o)Wprc2RsE^(Wa)&|1#bxl0AF&*u3!FW_M!kwpe@-ks48~9 z9(3cslNMczy^TWYE6`J`*=ecLM`Oc0{$Ey&w!CywPeA)SjzBKloT0olEH3%MJ+gEW za{Kt1-)|#|V!XHKTj!^Z*u>|^jPj~efi{O84*v!Y*?bmb?jomr7et)C2LNKT#!Ic1 zk>~0PjG6NnT?t;nB^xMG!Qg=;Ve}z(LHhbg z@5af=iDq!_AkL4q)m_?#xj_}_J%iRDNF8ipYTqhxt%UcAu-!MT;tlvD=ojUBsK|l% zc{^Z5*!6_uDR+YmsrYtNv$RWi2hXcJk}W%gG#IPbtTHRf3l*!BLhtO@M|qnLgIOY1 zXdrp$(zMfirz;9lo$GW)y%>Uruf$M4fj&Tv(<&KY49s@y|5(aPHW^ zv8Q8Y@u>!0j( z@tXltLdH6>#*p+KemeVAxYt8{ur7nBHr~-wvmg0DI(RnJL2WJ}A8{)Ydo&j{pM6TE ziJ?+k*L%x@4p)y!6Fgh;@>$BJqw-Bmb6Ofj1V=sab0hHl=je9?%pyYqAJRRVdcM$s zYwq=8PU0J}7JV-XK9TR45@at1E>6kkggvL0xpN5I?1gdfl_Mr%^64NB==Xm}7|8BIX77&x+V2!?lpPpW2I=gHm@ zoRhN^Z3L1fxNlTU!sz$4aRbKeDpRpG;ugIXk%0?74Ws&Yh22J%d`48`65w}EexXk{ ztfa&UzhYGBB6iNUf4lM_`dMJ_)qJFUz{D5%{RoB#uV0qf`uTlTr*45tgsJhFx=?G? zEEXk%c3Vn|>#jU>QZySF>8v9s_Vk*k-`_C!KX)R(?oxn>SRoc^tu-}o3kGku4t(L1(=UUxDWc;v z&0e(kc|C}Nm8Qh2Qog5HOt5XeaUOoVkPWI$P;-{aHf*T8Bw{0*8A)kH1LsV8fj&dR{EDAJJ z@{+Ku{QtEPITGrGf?{1QCyuxvi!=?tJRZmBF^7x&V{efZ(4ksgwAg9+PQ|nZ0hI2SC2^zz) z7z<;eV?y7n2dd^>*qPCrPIgDpse4~42<+by3;w7qzx}~d)#_nP)@1Se8!Nmi+yv8k z0(Pm*S*i?YtSnYPPwe=k#kHAFDDd_KQ&>ctDFs-iKXMw`6;b^%mzewmjJIb?=2Uzv z$=r)K4gk<2=G3wernAY1;z_5@C)>E$@*z zwv~IA0i-7LTQ3^>y@M2x6(YBMQC9(Sm$lUX;&dQ*L0PsZ0)r*0S&S4LNV40NDh(2Z z9WPTelGViviK9zjEw}KjZ7W?`EctmHe(Rgm;S?N=Ebrflr{DE-Yni5$OiDQTdt>l* zE-N57WFKD>Zv1n5U2u$}j_s$-cY@2z)z4?y{SNG)j-~OZ3{kF%-*wJX<5>P3C3&02 zB`1MD)mq*nNoMRx?GPfbIHfyQBv=O(1?yDq>|on{ez=E~F>&6qwa^f*D^#kF|`gos9hruH{wuW6X6{-||ES=0}C! z8LqtMg%9nG!l;hR$S)0M<F#@B?i627^NlH8#UcBN zoXCULTRS3Pk+&2NR<&6XYDQ20x{6p+3NMe*ZOqjEk$!$0w~>Cp99IY7ysm5W6>1_n z9+;NHGI5FCBu}f)<_;NSWrxC`#}b#xcqI9(M0GuoseHCxSZVBy-5XSc@V_8%m_z_q zhsRXkYl|9~ePAa6bJZ=`Q!-O{6VTB@_{!&?3Ul0VEv;lk!H^}6spF582yTg)5s!}J zhB4JZ+?08G(eIhXY}IgCOYt=X-aXpDxoQ@L@oUVE-bkkwxX5t7LQS=R!> z_b-^F{-@!XF_LU#PAF1y-2=Rc-VJv!Ty+VL`ho_Oit2@0PXAgKC&+u`VCq4cZAOG( zUJ;;4gqFg-{bbd`4oFi~N|5TF4;Lc@wj>Z7=1qpaw_5whq$aY0_Kk`e1Tg<)UqjMkw9M5MN6WDTYyQ{lLj zK(Ee;C~AIJKYIUc9e)_Gdo&?Tu7051@F8`MtD5(G<_*l!S@OxY-F>qasDAYR9gx4? zAg}tZ=9gDwaGV`$tuPb%=ZBEclqY}doKX`i5sh1pBRkKkW$$cI?=$^PXHltrKZ3QU zhcW%r(w9_v3u8+Dw6YU@SHFA}hy%NvSAP(-gUgo{rT&i^)=GY%OjN|2a$Z_%#Oa^R zGvz1ql1g0DKf&b)l}wpF-dh~#8sI*$w&|bJ=o?e?3$xT&Tye3{ZiONa$d$%k?XIX4Q3H|VR&hlA3*_Sx94r< zNJ}QNB^x!*ry9|h2$nfodozzbqgU3iEM_h?zE_=>dzKte)m&<N>*8nR!Z zo>OU8zJGBXdR&Hiw=u*irl2x^`5;((UZ(QvPtsEJ#8-eCe(#2Peln$aM`4tnI91x= z_2!AEfx1LeK=UAyUT1P~y|@vv512qiR9WkW95HthQ~HL?_SmUq$TxI+hX7$d1*-U zmweFN#-i(_~0O^XE&EP@ogl%S;obAS!KF8w5 z|K7?G?sbcdRI_lF65O~%B@>60rPB2Kn)I-KfCQ@8q9Nw3-)l-E*G$m!>7uD@{ zrsPkeSL4>l%%ghFrty%$zsH5Fn4(lhtbTzJeDBs7;AY6z86oU(^SMqmz{NGivE{=hz?QASW`T9s`B_n-wLWpC6Qw`f6WtBIi% zVGel4r~Qqv2iaPdmB%;4*Ub!NdnsMM)F|r!dqw`76*UfP4bTB=$&D!kM|RHgPOpCX zK~BbdNjl|sJ>pcglO{B#?$zHf->bA$%H|^G5s)0%0OZPu+bfRv0VV!aU?Rx(V~C6QL8n>c<)Olbn0QBSB^zG?UEN1%OnH zQToPBi&5?QNA8q*pX4kfSiK) zc#50tHo1RmO}Tu7^g$DkcW70s8PJf?8_IZ6fit$KTib|5N^c z!x6#??bTj*ZLqmqQjj0#xo&2~p9m04i`y>p#UhPbju3$f6_<|#95I(;3*dCn!WKMX<&TW>QKns=bek7nCZd&$J7x3`=OxvimZo@o>7L6&mo*GXQySVmw#8kH35<#A@odox zee!$VVVN2YFY8_fr+8k>Y**MQppK(XM0nPsH?;jGbCzYtB|Gc1C4|-(4Sa!AWG?2Z z`q6Wz7BFQd>|l`xCTEW%+x}Xe_IU>4DvMzx(uZ5kvs3fx^w`PFVM7Jv%(WTq-hlpC z(G-uVtlxAnGRF}J^KgC=dE9k$itJ&!aDb)2mbctWGyMa8$*+v}zyOSB8^q{l-LcB* z(XiEU!U=1qqOfi4nFG^6`4?#<+WojCf`@jKGm{>LpLsUm}Qp6EOr@ruz(raLUh9drkIWIm%2CN5*3 zBjrSdq+=V>dzQ~jqI~T~U0X4r*VNt#qcd%qI5@@@EH`*<_r{OJYG?b7>Ri^^6ZTj_jK%7 zB3(VFsFv-jet-2q)+cv4!Z2-Z2NcJOS^uC$Mw*rhcqG^9T>FE2{#OgYV7QFK+7kr& zG(j(;vO3%1n-168Y2Zg+@u zf~Wg*huUYj+a?7+AD_LSkF@5VxIKzYoCOv)mq;yZ>lu>fnd?%@2TTKR#8rx;zwdt7 z9Z=lsR+^#Cl6e=a5cPr-$xhZGRHqnM80a*fOmFR0^N*@*W08JmrM@j(h+r-?FbrB7 zP~s`%Zp7}c0dUP8$Lp!ncb|5J7xf6u*3tbQ8Qbl)75eLiy+o>e!=$&B3jlk%aZ$vn zWdn4Qy3EShgUZH_jw^tJSU)Mb;i$#mx?fj|o6p|7iynXE;l0yFtyApTW0xl|YFIj9 z9wl*=AXS9x`*TUL;8SuHwBCZY0gdl&bXvDGLiX#l7cTxnv_Bs7Kg7x@feylPv)TzSe<(9v-rC%2^53>P|8%L9hg7 zAB~pKduDD8N>#&jMQ_KSzOfp)l_UuqTfg-AU%6LIz@TF}^U}A+YvtPFI$s^>Gh&YM}ApZZ& zVTjV@ldrm^!h6*iu>ZK1L5bJ5^0+@PT_RH+9(olhHrwvy4&*3Kg%@c#>=msTaD;32 z)#W{&3s2koW^E0*A*ZijR(sSRe-=mQ%MH)d2@{+!vW-wEl{x7WmgMYSR3mDC5eh^D zdkbk2-$;!UWlk~RfA5UwR9HM(p939&aQl#z@?rsnOZ(o#J>I?T9M9)N;<^)go;l)% z5Sd7{i|F*-OZmW^r|t)!Z)|$1mQ_YP5V{Tt+%#~I zMfyB_hKxGsRd=(Yl6?MuhIcvKX|LJ^dJkf@BJqm+mNf+46VI3qW9DsQgb;dP{l=h_A_eSk|z+IjQf-FLhWF3HQ(w$$Id z@J9c8LA%pH?c3pEC<#4K|0lfGtNUoO`{BumEPp9huxQK?M|ja?gXqgLS-zWQi3e!q z$B*BBI5tbV{dk8ZkJy^wa6wE|*1k6hD%x`)k76*oFMI>!O|4H!_VR{|{%-?{75baj zNlGZWKK-#0Z?$YPqk^=sx`TD$nHAUgYrj^Wnwo;mZomv=j^6?;^wxYX3wFcex7mnO zgzzw>J|%Ip)z6;qx66zI)5!Cd#8In^{@-dIXmEz|87mg(#i2?{3zWNkY$Cj%4iPnVDmP99HO`MZ>7B}70SsxKkvgbs^C@)s z`qnMG5EWAIO6)nEF84HMSV}#k=)^BiiXv!^({~gLyk@LX!LB^Rdq+!3CrY~Ou7sF8 z6y9@OcDeh-G4MjPws4OY;TK<^V|;8a{QFXy9RZFDgigbAu-d;nF#hiFe=w66*OG~kK0SdKDw&=>thV`c| z&njU<$o&UGYMwJb#w+4)1=S@!!v1N%^@Y*p#cF!pkvMg+%k9VNiRf$dJ&R8uMsv5? zchz`2PTm54_wD!7n!kA8yS}j>!|cA*H!8lpn`@J`aXh_IoCKP@APfF;SPE^4rBdIydX#%$xNY@-8K_ z>6XNw{RSTopUB>#`vvRy>#kR)#d?5McW!(aL3?HA)EY^Z`w=_dME)sBrOU!oi~7%d zCTCNROcn)MZ2yerRm+z!q$So^O}2#e&Z*T0Cbvo zvPC4G;NdNobbvOaq`r(I551Z#JsygUo2W&hN6J9SZZVcwMSXpt3oz~qdc`TisS2aJ zM-g}Lhg3^~K0zy~6IMXdYpdLQB3;eFC{c~>S5Eb>@P8wz(_2{-t>*#kJ+3vIFZOjL zZ9fja!LwAc;C}a13Et;^@8=h%<)=cr9g>biXvb|5jyoNR@YAW{Rm9A2BT9D_nFHbo zYZpRX`F0e)T~EMK32Gxv-}>|pG;U!xR(b~a4JsZtSRM!;m=zBZ)ofwy_cR1d+ft7Md&VBWVOD9d^DjW7BC;vSE8DLyKK0-$s<#5g+Et>eau0+ljCi^ z7R})3^&hn2JBEz2P*KL3f@=MNn1Ep53FDn!lB5@I>I#fKMs~g2>tLu!jPylH-9;C& zo3y&_)YujBo|!iVwCo9pyHjajEIFs7rXIXi$qHBIat?EKbEmR(u=`hQ6x&pgh0QHXmq_~4_9swa8v1t-V$45Z*WJEWOCrWw&HcEnir#e! z@>utcc#NF*6;K%Lk~3vEb3U>bug{lW*?13m^&`o=J*%DgR~iiib-1fYHx%B;2QDdp8|XS2ODw>k-Jd^3fAS)ZUFv#c8rxr7DF9ToMR!#6 z1fYn;LuK^ot}AthMIPdFQv=?h{8PVlu)fP4P8a_2Rs$|aDPH~#k7x<=?%$p9cYMGB zd2o={DXDNn!RM_gt%&A-*c|P-m|`9iY~^v{9r>5@2lK#+`i;Tv84Sf}b-bNrwC8#6 zho-#g7pKO4y@YOgL7z>7cQ;;sZF^wCz1U*$g`)=EeQN0Co5-v(xO&!s!P&fkEW<zKuwLHvIs*(R`sURJZ`Wk9)RtVcldXN?i(##K;hil|zzhV;;1NL=p!acf# zwlg+Y@d4Y+G^|vj_vg6mHwunQCDp~v)WKj;3^3B0NdH#;=6~`zN;CNpfMevf{^P+- zKfj39>(!qC!mI5k6o9ig`3-uh;(m#dguZ3h0i$D~4Rj+TB9IPj_j|cF?wEyv^EDLL zI<%1Wo4>OmN!bH@AW<5y44MDNz2t#-M);SS9-R*tFL@w-Gu1os-8QtiS(;2W#AC$z z#b8U((qHS)lwv6lbun>_$aL?oAEkMcfuG|#7e2<1r1o&o^?uNpJzL z8RFg2R*u=X1O4#rilWiLvnMYuKBGQbv?i1LEw@tJ6vDQ+sGLtoz6`zNy_`NKiLt+b z(r09j zkGZ6ZM^MG|R@G8xrTA8+M1k;Pb+VW6FPaMc@Q&g`Q(dcg-Xm=G0yRsE(nlI9}sWY$pdhaP}VLv*r&U@k)Y?bxmwFmN?#M6uEw#*`^+Y|a6 zgfL_rn6!^5_He^7$Ud9k?mD5~;tur0AIgH>|7agD@?r$^PrDuef!KP%`h|F6mTQlR zMtpV%oOrbTpv`>>k`q_Ji4Usj6yrpvuX}EQU%>Mhr(;uqy1Tc$>iWMWGHq2U;8Za( ztw7xHH~aCuXM3C-=;E`~_%;%6D8VwV>F|v5@q2hKC-SjE**=E82g40V328}1O5y(6`_rqccy(jkP4+ z%}%??pC(S&j$wXg9$+dRXlr7mJ))PpxaD*z29IBYw=k)?3_GQSi7@*BWEy<=p^;1h!)@%~S9HXSxR1LWXTWAQWMk(cBY2^V z_pWbm&&s0c+y1w$cBG_$eT@3Xw`O7i8<og}6;M(R<_A=;Hbl z@Txt+T6+1wewp&Gz~Jl*&l+m@L(u;5v%sTDKMH0Hu$YFC``0E^G`pv} z-vlkr9>g>%P}KWt%1 zX}wtgC|JQfwR8C73)`zIA#=PYjgMrUs)y%Y6K-UV%gOw#EDfR(bI3aTYzZwEy;2>s zw{W&qAFZ&wO)Y+ccr6i5M&t56gOBA#u_Lq_6O(4MK|MM^?f}NpY8y`8Xx}$I%2-!@ z^Hit7!{tJl3!Jq7b&yiC%9vXnsl7Y6zQ_f5Vl4s(!Op8Hi&hUDSAbg+o#&GzNG}}P zV>B2y0G6~x!_ZM#Wn(JvM{N%mw zo&00KAy|87w}RN#;rCz1BEzlpblaG`7>YbxXURM|&tfHNPxQ~kjp$5kqxg>Ls^19F-AGUZMuKrr2=QwhWO2_;Haa4ie4uVaZc|iKZyAwD&xHk6= z-^WetBkuA?-&+Ih?*G&3h*01#$a_N<>AV@w3j6Q8l%3W_gK4*7_(SRQvQm}&JHx$O zzc%i3(`^cVd>lKQFbkaBn*x9zw}<-JKC-;&AQ2>U=II;4l@~$2iIcZabWB>6Iis;~4b4HewMj*1=S3>&Z<;c?*pd0;U8JH!@9yB>xYiD-KtO_vxe zoPyON0r@Zi&aur0%QiIrpBzrb_Ha*3C&E^DNqYC&pOz4iPTH1kAWesJOV&v&o!Knn ze8Wz8+zu}LxYSKj{qeV{fz3a{c8w3d`QzL%=2B?d?9;4ub|yRIulr_hpGb6nbWI~` zqD9C3Y+RIdmYv4-Um}`EnzMc0nIu;u_f}yOOpGZ-*B4$Qj;3ByR$@}6Bq08=e zwhyQ*5&SaieT3YRv0oz*q!rY#HCIQ6NqQ0z;EN48oG!3_@N2z&2zo40OLAs{Rohvj zJp(zCk}-lO4#%uDMQDy!qSDS_rUhswNzVzu{z>z$Oc2)EI;bOQ<1XsIucKT==1Bx|u~3a8_ETNh%fCkWX=7 zt|nUxC9}07MPe(;D=ObbF5;-fZrM<&6Fb-b>#t5ZQnPotWdS{xb^rdyzyDulQ>X-s zdB=C^o^;k8NB?qf)ElztpR3|>8Q-mnlY_}{&<1BX_-Gk2qSG?k-Yohh_nm2X;#i{L zKw3j_CTKiyHFUq>X)^V$_%O>1CB#GFnGIJhP&f_*$#!ah;u@br**0@;s-5t?*I2uP z3u||so80>Ama%%-_0L)N{0XL-j9wM5GQweL7$TI>ZGZ{bx!JW5t;=n~P~L10cDy4T zS7Hs<-LNPXR?mE@!{;$EA#GK@H>`bznNY3ANLRyUNU~oFnopu|qj+zm9ng$}YZJDf znl9bn7$Rx9xBf6#_k|0VaLFlxE2YC zWNe~Ps>#M@!YBpXum++PX>&b0uoJ&z?b5E+8=v_EED9Dyw|X@o+4)L3pWBx3nP`)W z>FXf_<5OtS;(NY)_?JbyL|cj1Ki&UAI33>_^?%=wooj_BpK76|+Juv@SNr^5^re3C zM@zqKRk_3EZr;$sk-M@a0E8%)=fRn>si8CUPhDP zCoh^jF2r>7Yy!fBqDv2hxbJt+ZCsj+sZ&u4N7V-})HhA_*i6N9UsZII^B;4YLeiSn z!G0b&SgG>)-tM&@BugSjxX8mW$}Py zXaWPz_ZNHHoTx&M{o0iKDs}rqWc>M?Nl}lOHybc4Nus)N^k{k=wDYV`Tb<(Fm~T{! z55csjR&=(*4U;Lp9}pDu5Qgl2p|xf}heh-m4s}dASavzk!kr)^sGaYnOj5HDblxeG zW{v9`Fy@+}d4m3PC9zIa8_oUi7T;HuadhHw(&hPI2ihX`$f(@{*DXXpl7EoQsrMb9 za!V{;O820lUGfO#GQqVA&hL!oVRdu$OG*UbV}-8dKfUi^v9prTIduT?@A2cW4=e~j z>geB_VBK?4?Z3pAKMyMpJdvR5Zu76F)2&h;-_v|MJi6wK#~>gcJmtN$3@i&0qJnuk z%s5av8wxp)<(4!1%u4M(AxRMS(2{sF+)8zQA#>&^?pMvihO4vJTXHM#Lb&5NO`1=%+JrakYbq|Zm1jnDz@F*gq4Sq7 zg-^;qp>j!NjNfv2bQa9g|-SqtTe zc&ta}vX69cjJEwRYvJ-Z&W_RQfvC}=%$o?&>{;PR;tzr>OU=MI(UW{uuRRQwH+t5# zWJ;;to3&C+@D%t*6sqG#UsfP`WBlvqx=BbGh8r<3u4IFXKyedH*NZYgpwheU73=OA zcNr5c{gjNp1trv6=G{IPPUu43rg`UTePVOQ5hHaA8P*R6S#@dj_!eh6n)X1hLWp@g zDQCPgPRCirLV^U?03OyJfvMhLl+vy)%zi>&iEjmPsdHCMDTjKn~eD&*U z@x!T4oPUUcgFSky<)7=8;MNJu=F0{aipG5gsv{3blKjZP&)8$|?1M-XdE=7w?Fumb zW+PU1ztuv$%H_1<&L%gX&sI{4nE`?>@ekyq9n?av`GeMj7GSH>egW|np87`A!OZl~ z44#>ACeOc{f_g6)&fC`+aBS%TBwb}_tG*QJixV_F48z|u-Js}Wp#t)9RKgt64m)4k zlADt(tJHv}2GH7&-l)XO-uzN#Vo-g1b4GK8U4nh1F*$__5#$mYZT)MV>HbQiAP_NR z+Gd{e?9mdeoKw@ADc4W0{gL+Oxoy^J!6VmEVyP-k6wueRdPX!MNs68)B?=sWjAK5xk@+f;l@EDq9POKYj=4H;LKTg=jjR&x2*Va z@Bq9qvhm?czAe+<1X{059y-)0O#FbFpKjpi*-v3Z7?-=U@=HP*aYv!8rMI&rYclS~>hIj?@0y6q)1~VBbYo>=atrM@b*y9)_qWLB7Dk+X3YM++>IbY+xW#;X|yeC;n^%xnGamPb6=GNAGYOVlHa0_S+xd5?Vf8 zs+aTjp2%T=840t<>?Vl!n`+44=pTKJet6}iij;QU;S{nH#tVma@vf(&rW{2^C zk8aZ5)fqZT_;hoWnsD?~mWL6p_wp8Z7r?2l4F3uj5NvclQ@znzI3ab!;0;XFu!p2y z?>~_Cq1V1`rMmykhCF;Wp^A7odHQUFu^p-E$K$6QZq2(4`6EZ~li=!)4c92CLw1b| z-bla4xJ0YN@a9CaL4D*r>7H_Xkm6v()xJVeI%}{~S)c~Zj}=8?Cfl+ibz&DiS8ikp zWt0X7J%Mo?j)`USuFAEO#V2y+;=WZ+L^X6yCYdqiPb(e&TvigONLejq%e9At@8O|; z@vGTd5UajUmts(FD5hmUt0`MR4?o>_zsb|U&(S*}M zS(f6LY+x0JJo)6KEkUy{7U1sb@IoWu0;j}(?^p*t#wJ?dCDU1zKXH{3Ja(3Z#9sB% zgMB0HSWk6lPrq}x{kEQ{zmH^UbFctzs4XZ~kRGI}+( zd8L=1hrS$9MS82>vod2-|cnd4b@p|n0t0$^?~A0| zJ~8gEPRkD6#o?2__92kMww#JO)774oxzuc+S%On$t#s&-^68-F8+|^^?RMs78mTT< zf|kQ`?brmzqiRHcc zk}N5?*K@<}eLn;e1aPg|_(jd5KGP4d4Teg!C-5#J_H+n5%+RhjctT8 z6`|$|;|#qLklqIj#Td2aORmKV-~(kk_<;!$OzkmLMuqit&`Z@mcG~@Zt?nL>bgdG% z-8(9wsl8S-HMw4Jyu{-B+DQ5s$UDWAqnlV+{m$&Lbiu*8C>M_%2+ z9{EZRRpEzn*HsK3R27ME{vSKW z`||s}u6~i<#hG{gV$84SFa|S;?ptq2=y<_>eCGW3$M+p%z6HLvcg<%X`L)J;UgFu| za9*hwN-D55@Fn47U!>+EM1W;Y1>?{kl6%5!$Vf(j^`<&IBY4YCwDK00=nnc~Hys&p z4i5n(4o-D`Jb8O7!n+>6L@=2Or;DDf$6-`E)U7X%$7Lh=9S!-9iK-uvUdh8}8^UZ& zi|l_lZZwQr7i-9|zZrf^6Ityv?ks4}`f3LuOWpbKW;>i?#aa>UX~efvAwHSU`s^^c zo;IVt2P;FBcW4<HyfAlbeX#rHL?@;Yc?fQlEHPypxUPN@TZOVWHTQ zM_}0q3W8B9`k>yXZ^E4<=mnDRhp7a(2)a})r)bO^h0gb-DzPpU?_q+4R-41oPu2OR zl--yh2!a<=g_hCs4L_BQbAjXFimw8DFB!qd^Iq%11=ZZeVN88oHoW&B^=MiNbMRin$Um}$a7YG*d8{2MOTJPe|?R)Jn8@w+Rr`^F?VKKhP~746Y( z{cYP;3)#DG%!^B?5^QthqC6y?dcag*K3GgZjh=0deC0}UZO(xWVkqgm5DpaqmUvK5 zFFeUmeDN43u+g!LEi^cb%VQaFE6FsaGZK0 zZn?*BkimXSg>(c@#$e0U0%x1;AB=U};-d~=XEdt=GzAluF!uor?3+CmCG1K-+~FRu zNHXv>f1hz|ch|oK>)DDD#r91T2H#&0eF?z1a5rRVfg?)&%txAVqj<%T}AvK6>yI}AFB2=HF&V;?PH$J*OR6|^D|L$72+6R6YENAmg+kJU* z_(Pp$PtHBRuGK?wgE-i1zIu0Z=Q~Lai$s0zIh$U6+B`*4WAEGZv+lPEO%F3Wf=))L@7PDK$)I~vwI-;B* z6^9U_bo>LH*-i>%^s&ZZ&NzmW*wD#Q=EnPD;_|7;t)@nkQP8unXeM7& zi*Pk-Ly9SyuY<7n)?ey(=k5WQ;?n2Li{A&Ce;!r4)>>jep`zFCP4stR`d@!#ij$f5 znJmu2d;X)a_vVBBn^?n$*5{OwO0f86x1&i7BU_cpc5itHX(bl2E`AK%SC*4JHTIy zH2P9|m= zYc>AnD4ObqRUoqJ{9g;D=Zlp9v?)JfIy%9=+Hh4{^LgVJr{2xJQ|5|w`mGpI%9P?ZRr9Z+i za&(WGTAZ--5NNaB*&784=yUlkzSM<|wCFsq&BrLeE`QXhXGu7G~E+J0}jdBumd9n<7|bceWx~E2Gw28ZF781n(ZGD`|aRZ1q=#xkG;Do8P(S(~gc)>9leM*75AJ zXgDdxVD{*6y?s6fEwrm!skUXs-UIxCd{uJa+>I=e7BsnRx-!gOC`;YtAH2Lkn(p*% z)skz!5Awwp=ZinDT2v~D%WSMx>Da1=hS>>lF68M&pW;5zBvX;*r6L22rJfAizz@gA zq339Cw!rXn8Ke4hB_=W-!+HThWN?nNpe<@?@ybCsEx&&7%&rl+H_c~r&P@39RuKHf|#2ic+q4o0N)lN)hhnR!; zlX}?Yzw&a;mn?A*+23-qD*fVlxx)eGf~K1w|8Gh2=E#BuAWT6De!2QpN{Y(}{IZBr z-40;oQrZU<%oS?>bS_glnHgll3TLfErA0ES@R>7Al|b#!4@k=7QTv7+*}kk5_90SX zU^OlF?3Xk~C0u%_zw}Fxn~Qjrnwr=A!28`Y&N>uZw-mg-Hlyu|#)PFl(qMqRZkow$q|vADRrAX^A+*BKC2)-S=#!JaYOCK6M?U2L@Q;Ugc!Bt&H2o%ISDb-lezmb)!6-`89^Q zV&LJ}YB$8w#`vd|B$s)#01e=k|>dt?u)oPi^n>|F4s{-S7(sTa$vB*rg`!#%Np1bRZs&Q7L z|I#5l=G!V?|NPp1ovC_R3FxS|{&l}>FX&wz$0*eD5B)xw#8UlW=*%tQrs{aLE75RT z;oP|Kcp|AU_SaHk(3w3JrM~ZIOW`2w z_`oZv>m~qsx$Zllu-f|&P>upB#xJLI)2dWV!;fMrMlI{h&Ku&O3$ZGnCQqN!NLxC4 zIH|Ge-b>pW%Tk=na@3(1`|K<|H=;i1)P~XO`eLm-tH&Acr@0-3Atr$W0h2!wipJl8e z(8le!$1^vwS+Ho&^fy`BVU&`Q$1vg&Ebt?zLzd&_o~S+DOM&15 zZ%x5pvlELe3O`iV_Jbp#?r`)Eu7TuBUH=uFM~eP|?W>+glvqT{XzRJUnpE;GPZo$s z2W{rdhrty=>;%yys9#AV-OloGVsIXz&5~?jQC&Z*Hy48~Eo@19#n}}e)CPWB@3^<; zmXdV}p@E!F^8AdZ1w)eWv@@CJ*XTD1CDaqzG0_%}_>BxZ(a&&N&C2)#qXfh0JnXn< zcOst3FCI4B&}V)-_UlmxGg*iFb(`L|6U@nu7Z_fbJL5qKb)rT`AJ9(RO{pXibCw*i zkbVs|=)Zrq2Be*OMMme!(s0hF4*VIWkUUbksmhWj8mUSKq(;a=YyS0v!*jQJC}$~J zPG!tVr~e=cu#L#d6+*(ytJCvi1FI_oC!BP|Db3jSStN+Kj>yMTDy%?8n5+B*_ux&F ziVw#c!^_Ue!<(7IDVoc(Y$CYnk?R2h|ztdn$(}$Tzg^HgB4OMj^^d z55HU9)ud;Stv(ZL=(GO4a)MCm7bBdozsmj+Q_&<7jVqzebK+^S`eeiU{I?7&+0UsV zXuFyG6p?W=i>X|}tLG|@8(l%g(hYn^w}Ao(-mp7Y72y7^yv%c};(k4G{nOX$Kfh}I z(0DPCanDV~EGh*@Ly*rN zaW^*|NUKEqZVMSuH!;GIoA6stlSNIBMt3xa>DaXy;$HPm3?e`1v3eJ@Sr%wGw)tB; zX0tE1xKN4Jwa@?jpi>FyMK;NIa=7w?bM_ZMv$ojvDvrMysf;_fIQ8Z1PcWLt0%_^o z`H9oc1>fSJ@7hcO{hh=*MDJUfJx9K788kG>?(Bi>!fClTHLKt{=`iWQK@2_dG=pCx z!3sP68VL>sgb1fq4`qkA80sw@)m*(8iWV0`e~PlIcd!-HLHr*=(F(>Dk(%<&Ochaj zr#T{J$woe-5#Ok1diHQ2YN55@)m|7Kh<~)Za%#8OkGA5ZMTAc|jaXNTjLx^&(Z&_G za}zmxAH@}~1hJ8h(nDSJm_k30vu~MMH*=Rhsev-czCDa^=2@dQF>luDr|Vv<$`{0A zD^5En=W67=4&s;A(t|l2q^1?xJ^y;ekKKkQf)0#lgKadr8wWEX^E>INfSKB`{5luG zgXI2Hx^TQfl-@6c3}&r7g_}+XU3T<`{`BfUB- z1FO#_;B7HxGW7v1U%JV?q4;aGC;kF1%Ecz3F43P|5BJHej5lN_{$iM!H|iBx$ti87 z885rX7(egc^H7=nWY@-1bVc3_#hzS->5wABUGgZ7amdhpP zJ9KDGvHgku^O0Yl#d2Lhn?p8f>`V60C#s>tL419{0^DTEjL4BuWo-k*cWDsWR^mI} z`~OBSfhWHctaBz;kHSYKUW*0mBabhepCB0v9a3dud^f2vp6qW*f!Smq;C z*@7H2M_cf(ZR6RBTK*F(YJC1Ib|@X1Eqr9+MEW`CEoAEiuK`tx#sC&izBOepe5lg=Sr_9&h@Cp zB26|E;zZL=lKV>XdJ(LvA;n5q4Oa5EGs%+Z^Pg?+AfGG#x!emWIeRFAK#ZB){sSB} z&ObC|1aL*nJlPsVP=+9_DsiF`4m1%bgx0d9m7VkFHVtU}08v?aonaa3- zX5rropaMFsnc7|a%?7&sCC-?7nt>_8tAfU6*{h$|wmE~8oO*#L>n@Em=accT) z$Yu5L@NJles&YWF__u^oM%bCds-U+CY9I&fCFW8XHh`8zIuG&_tBFTJSvcW{+ClyZjsx9=**m_;Qm$?PSE2WRhg(oAmdk-$Bor`8yjIIa z?P7|5;>l!S4bQvdYjvc&wY2mUMCJ~+i;=unK6-EXEh~+EXbvQpcDX8b`U&#wnY-`F z!>2~VV0h}>_!}ee0}VMXq#4~iX;?xWXGNTS0Ael1!b_M>we7NB9_p%sOojFt4oriQ z*vG#0`RF-mkHe^!-m=n_m8i{q30gym`i+$@w&{)G3mPX0>CTR(yAH*3p>wDl z{D8lH$pD8yMJ~qWrCO(k6zUcyk|5?V__#AaF@O4g6`FUb1q7vNSoYUrgT+BoG{=}P zN-7^6D5sTkvKK)8=!3SxtWtU$bm2=vIyC+!zu^C`t- zR2%~G;cDVM@&RG8KY@!W?q#izOI}~X`h81myN!BDSmQ_|C2Pj|(!FWxF7DFuK6-Sz zUcb%71L{3g#Dea2#uaaWCAus;m!|H7lS@9T1T!i19^a9lU>t&1LJSO_gsRQOv3z?# zx9*0)Zu*fYOend%;tGm7w(0)?y#Yw;<>0HhDx_tK3(LG`J!9_&2VY6i`gCat%rIRA zjTA>a*Jzr2LrOps+|VYUbn#)6%0PrQ)_{91!QVvC8e`WL%q}faZmAvy=&k9I%Q!#R z^*L-X$bl_@HT!xREhU_m_KxFKpM6kPoGps1^4j9UwdaQm-AwwE<4Fb5B>CU&myS=? z)be~#dfr{K&( z0l_)YZ(dVnwIXtN?iO*Oa3k~M6A2KjKK2us{+_DTfD0yv6H#tQx9v>sxj9)r;Dk4+ zeaSmf9VrED>3MPS=Q#_t7`i`qHV+*f2+)3L+T!qO9;W3S#yv#9Yw+WlfreeRJZ0}{ zn<@iNSDlK8oh*%S{MhS>UID$i(ALcU(6S$Vp9pW9k*4O_xM2dE#skkLEs#?w!WQR7 z{d-|q2NYcD)ox{Dp~B7%PPx82&q6Gw^jU9{%HAHdHnn#yaS4(gvXZGk7@Ks)19QDwFgxZ+tPA zly}Rs)VC>W!0OZWq<(|p9CVBQd_)Z?{AMGjPeQ_82SN#S* zveKTl$X2I!4tH?TE8i=>EbTN9;3hJysS}sV5+%zdefvegDoI$#o0o zrkldn$?L6?Q@CA*62>WBX$Vr>iCp-g)3=hjCdKg-xrKN4K2;`Erx=w<=;mv-3>>V^ zWyZ_p%iw)%g~rZ?Gqv=wj&-3rLI|(-36dwMqRO47N>aEp|KFt`5NwV>5s75fC~6xr zpYvoMt<4@i!<;=j80mW6I5}$9_!TtH=yDf`ACiUK6-==J`_p4Xp_QY?fw_Xk($TAt zFQ_0Q)CK--DTA4QkjnP!ZB7kl&q)~#md@^Ct?-eNh7ZpUr7@hffsSfSIOWofwXCh) z8b)nG$~LG14Vx)ZkG`LF*S1f2Vfe^=LL0l88PT80EKNz_Yi8b zR}51mjizT?KyC)PdNPc;ocANG@_~mrh@R{d8H%e#5CQ2g^m0s$URLbiCj2+( znlvTHOXgE<6#qm@4Ahp?46H96-W+D{6H(b-HJ*2=u235yC-J~b!=*lzCYm^%$jybp zhir^13PHC*PDr`BC<}{H)1ALLS(mDab^*T}!n;r+6jVjx3ei44duh+w9b)NgSN*T6 zRsn`;pA>2H<9GdfR-?6VYzCPfwyxz@P2=gH)^|4s{bf-Yuzn%%k2P0MFw={aU@|Ew z%{f{uv_QLnUM(M%m$H{JT#gqBDyg)ala^qdBm0!HVLCP+jdOp6h2rLuWZIOO%9x>* zp$9mXWc++-f}u(6F=<1%aDtNR#~QTW=;7=@ISps(&!SReaaudw20GMCW8i3V`~qmb zCB+&T|I~)aiz|%V)L}T4MTZD%E+s$$2lzp=a3HWlrfNF#&u!xAFjOi68Dr|<@tjXp zD*`@+;c#egtV|{Uz>O<%?Y{#Urg81!fz@=NamCOTZTJ5{cz@c5G5BjZ;(+AcKZgKX zl3&VSZBS`QaWrBuRjiENOM~ZV98e-p>sV|3s?j!{=USkN^ZkSELPr|*;zyP6u(g$^UolWW zfhrNBV&~=%ZYaVV&U5b#V9beu?XZ6B#gafqbe1m+{z}xX#tJeO45t?FZOfnF5H2|rE4Ua3dSvaK{r@n zT(Hmz)0DwH8yd{86UzHm~QrV0 z;cOqI_dsE{t((fg=E_hWM3Tt?B6l_c83Vj`JI z>ZfzZF)e=Rshou7^0~~xczyTwKAl`vA}N2=uMv%3-wn`6wfn4^v?#+5!&<73q_e`N zKAAj7jz>VsBqaHJ0?wGYl&awIDv@We0P-_)w-bAuU;ky~u5H*^?Ij7M@CoQs@zKR4 z;1Y2I(aw!%&M6g9QH7uPPvLx>8QCL7v-5Q~T5w8TtTjp5g zB+=VWC1=%ds-HvYqd9kWU)=Y@(RXz+caFQPfiQ=^M$X?IgJo}n;-J_4SZH?t!BPeG z?A%rA$T3Y~T2+K?^9p4g&fOI*nP4jXqTaZYIl@|;eqvdQP|72mm<~GW=idg?nzxN?`;A zfAV#yPG3Af7-`uv;(?)*Hv_^u&wA;KwOoW%HsL4M z9t~$hn-RS_+UMGoWt8}TA^vDqCiQ=@K)&jxA&2VIrd?u&Q51MDT%1h`lH3n7XEkvr z8;2Seho;k}+LPEG|BStpkh(@&Oj-xw8kRH4=Z@9>TgHtSrQ z;Q%&Smr)KU)96Ipq0iQM&kzv_YFPbD-ft^vr(^=Rg~=U;CUdUZ?2wc?`U=~iBpt|j z>viylCm6;jR?uKaf`^0rJz1p$ep*B4%J?NJAo;@k^8LN$Arstv@@)LKVu~3AhN9I8 z-~Z>~s=ojULJUZHyNg#JhLE~`8i1PDs0>|+q}27`$!rJ28*%VhYNU-#!``tT+ zsHkl_lE;R2F^kpm+)y1lbh(~1-*Jqg3!&xhA-!;KiWSwMTe6IcEOxi%qJ$ZaNr3^k z0wx;MCpy}##-iwm*GB?Omf5qOxc7_8$Dd`9t86S!Wj@h)%k5UwdoAs-HP))7t{VaW zA)z5)ZJtqZz|uL?rec9EL&aqD(>gFl)nKqRj?)mzV+|cO(ZU^;o2kKVRfU2If3o1c zq>RsmF$&;%9#DL6Z5Jv|I2nuOtlwmI;KvDMy1M2ww~|!|oNb)T_n*qko1HsKToTasE`fwtiKKwD-@U zM9u}jrqxdD#&vN=EylQ{?JgKf%-C@I4Fv>|6tQiM-Px0$h7ld6&5=~%;irrz#+y4W z$xZQ%Jo&o#_^21mn{!9DVzh#)N0ayB$uWkF@2jByhr9QVYC7%OMrUm3pdvB~C=eAD z#}*Nh77`VOnXzCQ1q2c$qfrnLB9K5r6qF)O2c?s!sHk+2ULr+M0z?E7si6l5kdQz~ z&$;9CJ#XzFSu211l(lq`+}Zcu*S?BJw1Gg^dLvxA>)Cb#M8iiLee6`t zul5G+``%zpy-OL^QfHbTV@5LwX?rJQgIc5cgK$BJ;A!OHk*FV|EBm6^R$ynY zkZk!p=@GVK1lRBm@tk3k9%SgWE#QF(8yhWjUWY$yOmn=~f`z(Ol~jds4tdiEGZWT1pQ_7| z(n5@@ZF6OrcCZ^*7#81a(O!5j@n`BK(e|}!kLoE7{m`7)n07JOx=@Vv$T5@7w&0tM zZKZ|9VVHTBdLJ(jKv1=?&9x;Lh}eN?J=WMVqpPbpXVnZ_70v7-g0R+Uf$~TF1j_Icpz;g1(5Y)E$tcgEiXkn5d2(z zSjuT4mL%Y{QS_u65iVIkZU8$7Gc&X$mqmAA>Da=9-X|Q;o-!A-5DS-_Yuvyv_PUWy z0d%K>5VvIw_x1^igfqyLj?`UdXDrNOed&N!~bu36fp3N zKH;^__U<>hm3$4zKR(C4waxsr!KP=T8%L;bMOkjAJI+6u+L$SfH!pf6+}5v%7JlRD z)WNazH`RY23L4sJ=C&D*Nz!-Fnk`3Arc8D6@E zR;N2{f0E-!D!pJ5)@E)iEw$&#Lf?1eJZSfzFvMWT>vPOl((=gvGYY5LDp&FU8Gbux z^qFhy8T&3I^t}pGxqL!gYf^i>=*gsA+bv5w=$otS5VN_Fv%8u^E$CK$VlWIQ~k$F3kcY1!+WzQ$$;yWt{A8j=jsjw9gFre$CC=-rkx#@*p2Q)90KO#1^n zfX)NxU^c*N2cNv}F-2|~+m;;k%doXZ(bu|c&)x8ak7%!zMPi9@ut&^<`&=W2G=|k5 z)}8Q{CFM43P^PghT3$fqvuFk;_I3(Tv`u$aHGaK_1xw29YKGyU*#z0ygW`4n1B?ma zw0X#Y#DB(VkEn3kOMTL3s+ssUPdLlFhk5th-Ma0j|Ty$n;Hk7*QNSh_kd%CYu3>R zlHzG(Xqo{4eN83@GhY&;hhKcwroxBzp>#Z?oDAv_4E?Y^*W{%dbR_~W%+!br9s@!c zmzKhUC(OkSg1eh>)ywSuhot>)WVrt`X@C1St)gQ!7RJ@pNIChAQutX{zTM-*9;1u) z^JI6cPs26#`f_yn7^jY2x4}?t&yEb^!nmq3YE^hpPF)K2p^a;_rNoKT*huI%w2#Tb zOCpL61~nVY$d8L$riN1r(GBg1YK9OjG0+d}$9z@$v8ta>K`VoHFy{DQeh`EoW!+5I zv~d-FT({ig#*E=sdG>U;2G&y_rBfiuo(}9!^$0``?E~!Q$qf|a{yU}ur+p_Y7j)Z; z3_N5FCKQi+<%3z5;K`2H4$=SLE1$E}!a0pt4({`1w`(T&HHtSHS7J1Qq|o|S-nhN| ziy$c%&)8=>{mN87GGm#v>q635=kf&~rN z!K}pfX(yE)vBn+gY{pfXcgDb(n9ym1gmME$S%#WXcv%R`*cG+@CP7niGe7)HD3SW| zh62psK556#6hZH`DbRsGpdfh0R)08+5G-v!Zv57I_F;vyM*!(=cGat6_So#}q+s)@ zm^h;EUS0a|TA0R9U1O?Y2$YC_9EQBV4MT!A71#dhb~Zn#8iv5$qo)=ufaJA;mVX(< zY%f1?0)m~(bT{ivnna(>wxnCI^p3Sn%?>!UH>D5=GjS7v>usaIIywBFZ866_OtqvW zTfm!TK;SOT_^pVV@`u})MBv0GSUdpp3#0$u!$yF-ouqJV;=mZ>b6I2T@IA}Axes6L zALdtCt0fATibL;|GPUh13z{d?36f+C#8w)#cgPsE1G}Kpg^4RO#h6NN<`H#_TRlkp z@lS>tt$U-o>|?_y!83(s3z=bv5s|etv_Y>%;0Nl*e~~2qd*Sgnu{7wL1xF|6pDjoR z9943>_1QtFTi5mg$w zb{}zb|HE1hJ~ZaSp3=1QY`qc#^tzlgp;(hZwbmE-t3zEBLBwUxz1Sfqlg5t)%Yd{B zyL~>t;SF`$vQ)vTpw+Wk$5ub|O+4-HhzZ-ViHNMHS@{|Z$8emM3?I>}6$i!`y6uZE z@52fUEaD8Xl|?-1+FlGDXNwBM4)qx&gd@pO)&@X1kQ-X@mkmOQD`+<63^wXinan36 zZowR)seZiwo4WNYb`e(@zp%$!QN`SACadw@qa2RQLn+1+0`_n#VyHXJ71&h^BpyFP z&DtG5S7*Q1Ui8rj=+e3{yER116^5&wmdqr-uK+yuQB3d{CP5V(McdfV3mcVi8tF`k zye&l(VFz=w!1G7=&yB3F<3SQq*l5lznqAOH$t*V9?@#{+%Su8N8^!%P*;iMU-Ko^xt=n>F02+xdye)&lyh|aVukv z*qLgKF0K05Ws7R)3fus6c|X>S>$2fT4kWk$NxKvFhlb-@)~9mF!ZgKW9brVtb`QW> z^d`6dTrYiC4G5@8+6SwiC+-e_j98=lLmy}cm zido83r4tnc-qBOLDMAs{5iS@>+?@!Yx*v3EhZ}T-EK$ivC4da=4>VPR-xV1X-WpjG zsb!RqCr-(8s-8%#zAhfISBzkre)%tgclL4MIzxe$@xOn+|JJ_&!y2cxG0tmsfa^?j z;Qw-+`2;B!?6Vu5fYfr%HQv|JaedW&#*H10W4PM|s04fV5b6d`d;XY3fiU2?L6H-B zxn7o|pU(F?gAhh*!>vLI4AqQ@E*BkAWo#rx1+~Nwc^q`_&q@dzuT|DL6Xx zhOGey&=>kcA6f^Vjt?fc7cJx~T~dQVL)yq6P;1l+1=s^_Anw*jN=RHKB9l`_OU=%$6(ESl%P!rcLAeU5*AA?$c z`A|LYO!dP9V|?864copa8V`j2i>vOX($vW>U7r3&$bb3K0WUC3RXZQ>)VuSI$Nww! zI!u;X*7pAcGaINVggSSe`pyMJZ$N?LUapFtvjaLgR zSG3;$PQ5?11`MoLhc5mjp1xd9rPj7F+%;&hoQFDH{cXW}*?S|9=-f(;2x`MW>-%Fa ziek~AR|VV~%o+zW!;V}Y>I`YMsL$Wd3^$*9CN#R5Yn`BW@tp5#&%GI#j4*k64{(|@ z#d@5M$I-9smL_?O)#Km{;GRO)-zR_E41QqS-z>27N?zBj;AUf`F{7DM(E99I6= zV|oLu82+_&nX${^N~^ifiUyWwBb(3_4lI#r0YqlN9+oJEg=@7~@E*s1t+`uC7!-`yYIJ+2vFNRn6p`ilw-k179V5;U2y`B>`x zr#(lp_n)@^aVR=h%OuuRL+TFe8a|_D2^{7!8|8bcwIq2X(vFw=Pdt_OqlxwDS(L%Ba3V*P!VlS^%Ljp!b+4dR%M@GIG8o zlDWy3HNShm*{4*uk5$%|e?pKBEooJGVRe;_Sd$jXm~HleQa<{M7Yh{F)t)f-{cYFW zu9j91Qc=qX`)cdxSp!j@;c6U%gmei%*$9))9N|N>?qtG7f1z=Z3*{znNPSFV zAKzZ_2{DK$!iFiy>s3Nm{wfx46%8TJRL(_zR^@2Wyk!mEX@gcxLowcjVg6zSZ!rxe z&m#GW=j@ep*uC>0^96T!poR3~d+2$}aefJbR+5d%XG7cm{O-dB*X*}F-L#5Wv=Fn{ z@BTlbr)%zLs06l%DP$K>@%|hAOs(ph9b(SQ5Leq zHzJh?Si#Z4FWySLckT-cE*iUK%M;}dhH>IUwZdhFWzhmSWK9H49UDLjHRQn+t)OtCJ}ps6O{d zrH23YyEjSlJmq}o1C;Co%7v_$%Y1AHOvhM>y4J~x8P`WivcH)FoA zXCLN{)3V#J&$|AAsy2+m&-eGI*yznpo?yGUYtcVeTb}jkp{E2mgr?{aTb?4y&qfms z7}0a+G&-$Yfi7>Iwj*IbZC-6cHg|t(#w=C8!Q zDjf@CtmVk%=Ey7dhZ3SE^GHE*ynTgQ#@&MfHF6jG8(5wC*SJj{;TGjid^jWpA=_FM`nb z4KFcYzYRSoSrn-txbIP(4Ru(b>u8`9HG;&36_k8g8DfFm>a?|m^;vQcCAv3%{EIi9 z=DfZhw|qqO=9eQJ)z=%A0gb}0gP}*aeSR&tQclskd^PPov6c z>X;`?Rm$*unNlvMXJ zMe)1xMyPuHK{Qo4voSHTax9hGxma10No4s>)a8~s1c7`+2cNta(U;jwLQ`g1TN2a? zGyzJUZneOb$0hect(9!0jKbw}^8`7{W(*uV$g(5!Dai`g!*SrUry#4RXw^650X><- z?#w-TAghr6x@c&+q`{?0CMv(au0xZeUmX2 zhN%e`bzGULJ8S`~b$c2!ai@TL%x}nqY&ml-+`{mZv2;`h7Cv|rX|$!#zJqM-}_G{=Ds9p+hPRgJP&ph%Z$PQTT9DE{%i%Q5q!HrBAhAw zN13~o6QIm5zCc|FqLvVPN{Br>{i{dUE7aFw%&H9}s3xwJk>Y^&+n6i^lX2znsNZ5H${&Jog>thMYkg?QJVNU z*yzclF)*~a6D9Ag@LEkrgVd+ zHnv(J1@XSPb;|0&Ro;%G-}l?bP~=?{S9S%p_h#KH8k?kGL!&pK&W)+JMLh7XPF7le zxGpUu3F*10U;T;pA?$!Ejw^>5t7(V^%@wL((;D)J2r$DSN(pslgt~I&=WzHf`7@J% z!=e)VVtaz1Ug@T2ksE6ATJO?MOr&_In+FqIM%2azgi4It2i`U`(bP!54> ziWVpT8b|!RUnU&@sbn3sC^x(c)F5=&5j!N>hsmI23I1HEnz%WM5|pS`doN3p!;&0E z_e6hpU;|cUlXOfKEFtjw2;?5jb^a$%8CZDPs7|h6C-z(?r#!japi_9FGZ_&q7rN>tC$l zQDuorU%ar8VjaF)l>p^XV1mLmfN8q=8eSowP-V#o0cL&m@6o@CP)ZJ|ins23eJPcv zPR+lcy@y}3guZ-{=2_}&jJHdjrmNt}kd#GH{#Mq$#)|}oWpM~j)U+$lMOqs5RkD#f z3vT18sViBW-|Pdw@Kt}tEPtt~O_F4iB$CJOA*$%q(QuL|oLS)*UI^NH0?l>FJ-c`qulY2J3Ck

lLnLw8zPLZaij2cKP2hgCaJ0Ya$5c#peG6sHuKRP$xSpefGc;i4omlNJA2%{42Z;HNFsHAUDb18xzQU45GlM074E7}keyDX6;nNAqn(11E5RsksYsJ8@Npj>fC zx&xu3C4ZBog~=*uB)f#w_fKQ-`-7^zPF=yyfVBg|_lIpRIjp7w-yANk3hcv4s1_a**O(m9ILTvhrmfX(M_Iev3_L@ET@Zr$YQFCB5`+mo!P>E0hz7; z(pV(#5|Gj5!hOpScz5CimkggT%(eTd%YLDO7gFfIO+Ag?VrRNK6mKzR&}6fA7#?(F zdx8!jx)t-ju4;og>2~DOwMF|l&Wj;LcCes3P@-cjn@eJLbPx^;3lP$gfy`xb3kSl9 zvK_%X#(_Szww^O_pd%WCt@vq;`zF#qsZ?k1-03pQ~}%haMmaXC!wtM!5IWu1DP0L?9$>ad7nT%n~}G zXl}xuBvD6rrcJx z@Y1a6I(`Zb3Cc&{qsNXeipK5r{hB2 zg^h=nMjh+8C_Vo!_v;sT*W1NApRLb2w%8|Y>AbJ_^y^*c&-}dm*RDl(U7zp1d{WXP zN0gz)DlJx6uw@$ex!khcPt7nvv!J<`JNW*wz$&zQ;wN%Ik7voLS08B|b&R(bldm$G zSh5z@$|Is13*8=hHEGNe;-{bi7mGt9v763TP*;%c|$J5kM3Ho&(#|J)kW zuD=~7&~8;+Dw_%uG;xGh)v}=`ZXz^Ie#e*HSCW`x)|CtMogt4-#KCa2L~7QlV9jAP zMEZ3gQ1*5iOXF&7zl2eept@f}J3t7!vhBrwJMM2Q15cqR z+CtZ6EPG_!kVYJNZv1j0uWql=Y)`SBWb*8Rp z80&Z>nTBC4w3k_jToR^6=`6(4B@E!E=?L7flWeGElV?kEsZ~bvEf||44MbHh;=Mz4%w>DDF3SE5_rSq^^~ zU#h)(LyOsXlr6TNeEZZJ;q!El2t6qyh)-!@jEb zO%gfC_#X6zIOSH(KI?S#w3Sz;5bDpxCbw~|M3 z1`*e13Ou~Z-|bek1<_n-+}$L_JB@^SOr9i4?I$t_myN4%C|n5ss!ogd5A-s6Qf<^e z9=)c6?8k5lRTmsFrd~7F3j172e36bSKeVPdyw8`m=Sr$)@dR>!E$un#53<*88LL4E zH^rb`?6|k-_h1lYei064?nDPLt801gQq`m;gP^H1xO>SckxntFO6`5hZ3A@06#b{# zQHE%nHZqB{P{DGI1^KZn7PRsPl9j1HQIqPZ6(Ypi8}Hg|JD%aC!pK<>ad)VJxPa6zwKeR(f$605$i%!qBH*?Y) zn_Z&sO>GF;Cy#bQdwIEKN74mn8j~#bIxx}r3%;9!8+3*PPOg?jZq5v<)Sl02G-%K% z*vL4T_mlioji&k?_==;vUZa+_kDWh}HN)D%a;kqtOzo6T71|p`^brIt4o-DG6E6}I zAhH3qbkPimNZ(cI+kCuP6-jIKPL)Ec1`X*4YRJWHb2OBKf6DP>EC@^Q92E`6Va$Ko zxE=-x9Dh2Brw1X$;O1bA4lW&0?Fajk8IN>~S>T!{`47RC1TK%qKm6Gkl4oPMn*dU= zJ6{~S-5B+}J8YwuW2rVcuJUZK;)?URUR%9R!`^`x{aK>wuLEys6po+>k|8M4357XzrA*G>7kzTLii7Jr2sE+5=! zoH2s?9BS}~7l>!9d7M|tZ#s{B3fX-M`+irGMldf_&8fK8m&VUR$=&x+W(JNy1J5i( zZLWMtty#7)`>z?0Kgu~;&jPi*oMfbPn->_hr+6G0%wP(=adjJ;K(b~JQR&o2Tkw<} zMI#f&wEx^&IuLT|mbG5!K(fP(<|S+^h!OTS-zr$M{LX(~oomK}bLSjRxD&^+O&Xh{;s{Anop`3C zIp;c&I1T)2N46q@92Z>t%<+Po@hm)jHE^uGJ+N)*;O5Au1+hNYo&qPuxe~F9H}pQx zX6IZc*1w;EAWd@j`f(y2=CC(Nd%fu!<`1x^=5N$V|Ls`I$g$V=9YX7qQsan>l7rYK zbV1hbn{7vHYs=TG-}yx=VgTPXZtIWUg+n?ohY}}_(;|(?jttPHtSI5R8-*N14yAqk z`NFQ}w!cngrGnV=05J$T@9_j<8k||R*YZrPsrX`zNyv4iqg=H_@S;t16;^1!z*`5N z^zXWo=y#;LkPZ(jx;(;}aHJfinm&=G3aOEMG)sixb%tqB!&`@x>VOH8k07*fmwq2gm z%*Wa=A^n0A#57zG8T42R&kq~ z7g7E?XI8@R=@%CJ&UZQ_<`j4TzVL)C<$}EDCKcv#$NTN#yR8}|QC$Vm$%o%c&E0R^aoCF)e_Y&oL2(Pe^j? zWBpqsW9V3)hGL`@rjNjIi`8sQB4363`kdkvHl(MQh}sW1B7$i;m>A0LEWX5*+CsT3x}?HmR2vgAcE}*GvEI*LT?!1J&reKof%+|P%Tqkx_W2S`W%JxzC24qVbx4Ir<|z1e)kR#Nlx0# z{A=6sWee8?#UYr3n+K|=iwl&Y4XPXRt>smNm8VeRCWrC~@85a7O3xQ>!Hp>o+?3BVwUN~z1L5x*Iold^ zo9@$2+xGuA1?`gCBC*xW$g+AXzeU&nnzV6IW3D{zUh(4K|I(z*O*{Teljg4Xm=zzc_7TQ>PU%@>b9EgtCx){n`h~5IKL+Tp zj&_U*tba~}R$t4bWW6dYmjhzyLBzgi3HckIut+j~KCAC_@_ z56=Da*b{AFq+A@_kc}3mwe-%Iwpz?K?7OO8XcQaR%c}UQRVSXfUSAv|iAaeoFbIly zUFUUzh{TZ{l$&8oF}s&YRNW@!fSsYkE}X5of9(pR6XK!DMfZ8@hUZ)JNOI1oW*n}5 zrx@p|W4vMLa`rkHbzmuUM zo(q_QhJ$}wdYP-*W5AC;x~Hz400kv@6byZPHhO&|)yC?wAZw10IL<6p;}bV?nA+o2 zvCfgV=$417o$n&XRSezV#rSxS8x@fO5DG|QVXI|UFX(;xT*b&Tu;g9GM<{0FpjOlG z&WXW3r9EN1L1uNeu;t(`S?zDTzdNp%e3$TR1tYj^mf!v5zq?RXUA%ODktQs!X)Ad` z>lG9R&2~y)H2ll>nlX4O7OC|RYHfM?9l3QnE6c?9(ww{PgmIv+V<_32Z;@MfCpjy} zyRvMm>rbzS5%kHNH{!^)Ib9nsX3Mda?84Pp1~6h~8!-Eh$CU-#ICwAs_JVwbn5=zG zfWJwIUV1G1^bfahCqkFpt6#J)wx6cORm-K8TjH9pf90k4HP<e^(9CcJkZqsuE}Wu*Dy`rPOQ=->gsP3J46H1NX^EW& z_i`fQR3O}~As3|K2OKcp)%VDm-7+4sRNYcL#PY6xR$=@p%h!6oA2;{$^9OVbgsJ^= zFTFhDPagb*O%C$v0u8FsiFp;OG`bifdVgseoY%1{9O1EPfDw~6F8`_)?rd>s`W{&9 zz9*8jU?fqGo&QjO&C;2=AGZt{l6{+r7ko~JV1gI(=LCrJ)dH515t+umVM)DFJa}O= zwj$xN^Nh%^Y$jn>lYRi}!oi^T7e*U;a(CqgPx@S$xr$a2a6c}gCn8B+Vye9|KlkB` z=3p_)Y>f;qpRlKBZqK9y2jUw{$i^S5q%#!(iw5sxgx^tSs~QFayWNZqA3cVB4koj^`f_{Fpp2nlmgB5Jvgltj)r_jzEp0w2iD-SOV$Q0)1YE_WN!`iadw1^Hh& zNjeP&7V;b#gOh46)85`tEeI$*r-R*^ zUBg`~F;9&0EO3gO6(BYhO8#}zS*F|OeOJJ@(O$Rjqu10qo-7+D8QWr-zGX>& z3&K~8Ch&V zWyYq19W&k`>~kc4f`!MY2?Hg3I)I{_3q&8fzO- zIiKUbha1SOSXQQCHI-kpP;v*G5(>bFsvDpR-qY?A2S?A!by+oP5SLg)@DN=N?s}>^ z3*Ezke7*M%`A)w`Pt(GY&AA}drrZi0=lAJDu<#*W672+( zw`h5`6Sb567t?ge+0d+^+<1;m@xy*O=YYLIl*i9l*FQH~?a8~Xm#rTUp;Q3{c;aO* zy-h!SO0jS@&(`IX7yR&Nw62Zy!bbWs{*4n)!PEFr5SAK ziwnGHtsfyr;5Wb-f~u}%nnKEDwa7zRy+@9IjA~xq{qxA%{-4NBRx(~)A0sk*0leEY zAFia;JsWfODtmFGxa;aYnFju&%}>yn{g7fVP^FIEUc7n-EnyEQA#5q#JaM##vmQdNCvgTRDt_%uXz`SG4Ww&y=eNNTc3z`~hpuJy<67&ZG44eZL|X zmZN{E9&u2fSBwUE?^2tYeaVj~3(B5_X(OfWAvXj4pfKR6sZniDoIE%B0t|icYoNhA zddrEgh6b|{d;n4SK9IyyWPi@Clin!||B+Q_Z#~};@;NCnfjajB>PM}-GmfJWg-)LL z8m(u1RQRa@0Wlb4vgkVUp6x#Cht|{A?RQ0Fi;u0V2C@_~Ad4heV8@Q~D!2dYr2h8| z{>z$=8W}Ht*yH^DA^rZjLGvTaIHvC5ZyHN3{6yAf{Bhi4_};NwDfb`iws&}2+AfK< zKU3g_zLkDpNUujLsv+KVp*>@xX`ElP-R@QTuhHo79&RK6H6+Ig> z3@ez|J=d=Bq3{ppfL=psI2qOf%=#To;^3Sw?b-HeV%g1ECl=1_nk3!9!GR?2c25-~M;B7FmU4<0= zF;}_0#$=YA9)J|f0dY2WuR!aR`BOcgdd-zqHt!c8%2`Msj_De(2ecR096}SHlr4@) zq;ShQxi$LR*TUilYSp2;Rj0!04l42HxW{2s`rCiK&W-m#Izboo}?s zLvCwEt>3d#O}`$RBE*0h%6EZgcy&a%fzLrH%WnVzNO>Sf94wWw5mdsM3FQ}PU|Uqv z=5W0)kx7YrU7Nf==N7MKF>$LDlUaE)NzJKdc`*LNxT)&!Q|~5J;F{%~1J7nvQUawB#ygd~-i=LLfBO62em}iGRMpIn!E+{ovu{j?)VRmp!Ek;`OMh3G zE%4h-^Jg|8eIf$S$XnY&zkCk*GVEa2qyu?L>6PSkF6}^=$HN=z-N`gau}Nmae9mF- z6G6eUDdSjUAIZnzUaW%yrv7u-JhlFzM$7K17z+jiA~-Q<|C2qlx#maXy_17FC5i9t zVRGIFp86+RImMJPH??>*I%Uj&dg&`Cn9y-R4NYh^rrW?51~S)si1smByl<3zmR;V1 zetmgQ!x+;pjeU7{qNQGRj(yywRH-43j9Pjp${nJ92dM%*ceOtJm6181d&xVnJ+&za zEb2So0= zqlRA4X_QwKd&FwykfuFQoK|AnG3|B8vEVQ9h=|*;BRYKFWMb71IIO& z`YBT#6n#|dMPCUqaHNlosDhE0%(=6InRNk={V=nX^;snxuj*%n0q49u(ka={TbAK! zJ#A4W7jmAFT6Ne$v;v*?I?h=yCC#S>(_}_RYy)geAE&-K)let~RP}?7V~;V&C^n@E zenZS3y_Y!H!%SE80lq_#M#6`|kM$}iTcetRG{K~t)QUf^`=eQ&Y2GIlmRZ{e=;+Ea zj(BNYWHmK;*oq}SwV=LVHBQlHD!92pwFW+O0LFI|_6Kn*0X*^4{O=q7(&UnIh;1iz zh3me6){gi;G5<}I`uY(5)bV$@txNYU#lxbe)SQZlzx{zkcn2rob)QiLEv- zax_aYT~LKzWSC{5W%c_p6t@Y>DVea|QJrGSdl>H*O*U;kf{wAUjS)tZS5fB6)X^&u zw)P#PYi`?ezoee_quR|<1c&eD6A^oN@5XBgb%%8dmK z%!!jTHC5U6bhzw5gC|jl?l2BBrd!UO{;)HOF}D*L6M66bb8xa@*Z(x6KJ~6KIns43 zYW-ssYj5-|ZSO|j==^9STvz}I>4Ol^E#i6}OD`af1U&nv<9=TzmhP zlgFE8F|rTfXfme+aaUSj3Nl>um`*Jh18v%9)y4tl- z3lRCZU8DG=r3L7CtTcTpD5!{mrLyGxNI%6C2H^|`$1V{71pd(X0`-jxR|zb(bgT}j z=uS-$I?p>i24JXrt*7j-NNRnpKJ!miKWZWTimpJx2Ja~^53`JAR*UZV{l6agLomp| zippYV50CkjYrnNcxrua#(Nh~Po@*GlZ}WQt{a{zeYx{g}=MDdy@?}2DBR}S7*1-v$ z#COle960VoSz0La@>&ZWt*BFvT|D==IYZFVI*k0{mkS4sIFo@nT%>Pu9no`-aIMu9 zLH@Z@`M!qu=FvOztLPT{5}$fQFJ|ihIrQULcw>@FYtFEuykpcuF6t&m8wYYs%)(Xf z4fxfJG%J6obpzbZ(Fl_ohpn)UoBeQCGb%X|mNY-^Np92uApD!#Ud9{UHh(s{vz#n_ zp6t@T`Mvt{~M_PUKPiKX1mez!000f7oTHgyjpb{K+HR;>S5mfmA|l4nj1EH zR~7^vn^#?FOQHd?nba)wUFZwYuJ8AFt7<~8u!sxOZV=vWwV!7sPt>fhopio>%hR)! z0QOOSd6%#krhsnm>^Ig=20JBk1SQS0f5dggO`dp;+{TWFNMye6_lD;VQSJ{*oD&l4 zWdr*2h$D<&Nc<7%F6SHXCTSiBB!Awwn|^9XkoDZsD@xbZPA{5CC}}(YlS$lOdpy`~ zwnM~!ooD!*X0zyuOXB&r9<-Jc7Pv3(KHBcT^P{H&UQ?0IC15xyb4jRr9mQyfiuctA zy?ny5YwJM*SOM%+5yzW~d%Sw&Yd?N@ah%pI8!}jstCT=*#bc=fEECbaSko?Y&`g)S zBGiFwB!SbZ&N!zHs|i#BXphnWvcBYi$KTiazNL%Ampguba^?7cR|m~i0I84p{)xy# z>tGONsK-!caN#8%HgSg))*Yrc9=&Ri-?5h=> zOhy0%K3Ui(X#kfuBQpS^PEIvIQ-UTwu~XPrXR0lyqRVDIV;OYuD|-WMQe$cP0aL@8 zTRGN8)uYufXZOgSR31n?Qu86rba>pDIq@k*GaLY`%c?9UK!}S=YfMJwUi_yQ)YTOr z#AOfFyc@ccqZL;G5$vrW%E+Cch{>uuOho?WB@domV^8!ATusoKKO@_WL*6x9zlgXN z%tZDnpVlpEH@v;+L1HRPSX}bhp>k-Q*8Rnr%Goam^2lx~nAu|RuGUKj+=dE#OJJO} za7SftAiz;pAuGMkk-<);k65jga|32v{kvYIfi0&8VOwdRvge?JR}#0|p&!>4ZNO21 zlCiiZ<0?k!Y%!;a8m!d6(&cKFXzecweJe<7OpG!6n(g9WhhJ(eC_7Gd_V4qe@IxBq zPI8S6N|Qfjnz&Ih0xJF;|Mg(SW25Q0%C{}sdzi|6r!%<<%5mDZ`E?T}P_Zwbch$%8vhMeZa=A-vo|;${F?>xU*VvYn&7Hk{_D%CHLpV0_e|R! z7wySf1wwJo25tznA9FY3$k1q z;epMN@Vc-@NjK7b`o-69$R?NAvX-df%mVMy>O;*=Hsw0Q$*FY9`eG?h`gE+r z>uGJ0kpppJ0H~tJV=_u&IZH}V%bR1&N?dS*`0#bRE~L3AH*ej$eo+yp=Mz9;R}}K{#!m=cqLL%Ye!X+=7RggyC{3(nqM;0 z&aSo`f8w)htP8#S9^YqTfTKSyMvN?5bQvgAj;trqM@L}6E^iV8e@bJGuF+CRxKp1ng$;^Xb% zWqQQ9wmuKRG(W-F%c<3TIGV58G5FEHihxYo-twujsrW@iQITsvUlA{AZRI0+GPh-o znc#>p|3Na>1gP5_@X{Vuf8;Ciy}!UXoxRphp&!s&02|h&?|=aD!%U6~=Dd?9p&MyR;%x#^VNQTO0brZ^oG= zik;!UwkvvrnQwikTN1zF*~C$N)G3#$nsQliXLlEW9gUWk=<1pa)-_!tKRPFrrS9EP zh!Inu9*Kr$w6sJ33p@uDPTJX90=I7%6sQBf(OYh{bbT=Xl8WH-mkaoy?~&G10a)m# zjF$5gsV>_rYA-LT0lW8wogUO(v79_=wRD?0^6^+Aw7Ac|hxIsX)Zp(Mj_0f@KgtUv zn1#zf-*LTAz|{;#E{0MB;3ZzhP*t%7h-&kVc+qj7-v%zk~~Qz4wka z3>b#VqrtlE{L$JDJB&Nrt=9&mxM6#=;*wMQ1;tYRiUxQCImY6MMr+Ro?9xrZxrS5d z<+1*UftY$L=irGoBUdaQXlvco7Q7GHSDdajoCVy1j{mk`a&^@iAN5${ zASc1%%&>XRO&7Rqqma>uS`(C`3l)>XV4!;^1`u zv96@k9--a-pp+gn|E{CjypOo3@<|0C0G@jHQ9V-|iMw1TXtk=S|3>QnQBCjkYU{br ze86J}kbDSizB!hRNle#T+L?zUyjNn*+h?G!*6-K3~ zSm-SZNGL)K5Fl6(0un%Fl%D9I(h?v*K)MPB8A?PTp(8B;LJ>nK0rcF_DbDxP_j}hl zzw=)fYq1u2c32e+;-Qj{ z^r*lR3ALX;lWHsdjO_g;hi{zlB}u-ISG521G5*U2EIujXx^PhIb5+xu^Bwtl{WmDW z^FAQ}HmMCgFDCnaa$ps0^+$h`DjKwLS>Sm7LwTP4`#(A*sE<01Ep}{3ZT3D;+v@u} z|J+n&5wPc48ftdH_k`f)uQb4BAFX++{ftj#GK>8%{@4Vx>g-)0G|_=0f3pj@w|NRTmRDaZ zUo}nWk|%rHc9jb+i?g41kgEX;z!>0RpDdLv)-|lY304a6dvl)u9<&t;2qL7&%^LT4 zfH=Odz?GpY6euKW)?Yu~^lN5cz`NXKmdYP~}(R{k|^ zq+_VUUUE1A8IyP+#zX9z$G+~SrsSKA4Ak#&v~Pi&Z$Hy^fF`x`^vQ-x>pr}9Y|ECn zowGgLH9>n^UGvuE-P>!xq9;c3D6&bm^x{l<<%})92Z4s9snb(tYwm?&KJNKcV@?QR zLn=5wKZJ18_O@NbhiW9TG|>m3IfL+yDFjMr(X$wt`0Hn`BJxdFOrxpcWu^XW(V?Qy zhvkY)YK4faIC4!DrX6SbVmkCgRH!CFo~#7%nk(kZNY$2XIluV$txc7f$Ok@^p&{8t zd}>g|&wL8$NSbfgOF;!xgkPh*Ic_?a&>{%-v6O>y$NN9Ss_a%X9vmV2gGxUab8tPl z3ykir0Cok~y7)iLRTo`=<;SoCf6j|b*2o?&S`N9)Si`8xZkmfhT~Z2|SP*L7N~M#y z*Ei;D6$z=kA^p3vcBT+AjaMtINC*9A-JAJ$Cmi*Dn6HobymRfyo$@vp5 z8~+d!7gPwb`rkyE!~RLmJFZTx_5%2(Z|9Zt2O3Q}X+Z1WF?|2j7>gCH?I(v_#=X3? zW|$g_^XPCT;r;-E+VXq=oAw61JNEC^Qygs6(c%(uJO61?zrFvBQouE-^l6RyQC69wm;Ni^eKXr=L)! zUVd=eHz7UjtI<%`#_VWqhb}pMY|0^|2T@mkU8qb!3~e!^nV!6{3VMr6mNB2g_a_9f zBA=eAM^lXoDtTjLOEcq-6;Z)?1Q@TscBDdMLB{)R*OI_Sgp`HbxB8p^#$00 zS!@d$NXuMBsrK<1JKPZ}wnc-)kG#T7CRuWeDi+%k&Vsd<&c)i3igc#G!gZVag3VD_ zV_s)6E6Edqn-O$qUsh_q)_4?qSna@>DLm|q>0smzmF*)2NE_n_dOk~l(dk#bF}*`F ziiWM#M_%7tEj!J=)Ra&`w&}B6W_utFl3|#j_^RkOiH%hP3~kEW$n`(QF{(qnRsY~pYe36|WhxY%xRE4fX;BX-0CTb_m~*&rEY zO`dpxB4Tc2&Z`06h_-U@q9@k#Mo8zTZmQ6(+;S8fJudmvs*T8opDH#v+Z+DszVQY` zmK&VFZDWg^!>1;a*85C4^)dm)%~O7nl?#||kDZ2I>Fe<$=aybQOHV8o)8i@5kk5ps zwDMA#D)9WS?pCC?O_iC5gU;mRwV$gNv6A|sDokx52BVx5{QXL$uKN{06%_)gBeuHQ zqW`)}{&_@yH=7SuXT4u|p=)d1MWH?Zl8;r;Cd|h&-M<_8H6M%RR2-`*Cop5S-Mk;K zS(wIjGLgrD{nWT8SFT!@-$rNlKi6kp&h=?^GBnD)aNZ8s9+osIy1&1ua>|oKjI-?x z)tn9T4q|c77L!7(jhYeUHApkno3LV^%>Gk(M*HHoI0p5PP0qHIu?*&wJEI(w9^xR> zYIw@x>k}!ikNwS)YX!6Pl8c5VJ?XKQHOu6u3fdf3m$G_iqmy7#&if%ww|X z?^W<$JZy@BBAlA+<$OktQ_M}0%glg>&FuZIiWy?GJk#I9z*(I`XgqAj&tjufdqH*K z2RB5g*8&e4Zoma}Aq;shZmH#1T(_2LxxsHDuT&1Q!j5c`u37E42|+*DKny@mZ_KcB z?Y?#7MT3YN0W&eZDnSR?SCz6o9PEB2Ux?0-kfe{#2>6(iPx~F7;`_8eE=WUDQ zWxvNtMuD*+4%AEBJCmG${`ucfizOiYg&30?uD8VV`wckgc9s-cOir6N0jJ}`4_-Z` z^;F&uKZ1NVqSc(@JaTZWL>jl|ZJu+(6>|3UrRZm3g<^Uw<_a`Y%zDS3rSZ$6V610a zp?HHz7Yz2GSq7m&wgm_uVzQQtNzSshFu&URCc58lhZ)mBx

  • BP~lTw@NT?Q>X9LkKb~%25W*XdfqXYBKv}ZVY2b`EhajWQ$t# zyFvd7u`*5P_C7&Z_t37jB>re4qg_C#t2VGox3_^-VLIj45uvu%xsE=|_&hNraJ>;8 zDrBO`4-S>PkmHqs8z}Mq{v(<(7q*6pF@bc!bB{z#6!X;|{dYPg^!v^yCz%{ff^?eF z9?e6L^H-|F&HFWwz^gZGwE5my5ks~tkLisYqwzaJ`<1Tm-NqkhQV|A5W@BYwYNb&a zx-MRG1Flt?LL(MCp%IH0I{a!V_2z~Y=qUk(-joLLKLG4|fS%=Bh; z+6p3TbyRdM#)@4O=iarbqu&<9SK4t*Cefk}dO0nVA8>Z|ba*S%R8=Z4v5( z{oMJv8A45qruY>_F_m>YfX#IjwYL5q9tS}>TS?vZxh47PDvq~ZUzr&&i)^Zky@!WQ zhxpuEg_?4fr;_!6V*N@}qm#h^3}r>qp;vmDrUc1|Pvz!#;RZXsi-Q+F#&I>c^I(hx z=I6wqqlw49`=0Dj2OP=jjC+f3(EZc1{3A*fBZ_}lk-4Yl>!PzB9No#^N z2@^bFrysXKHa905$-~&{v5S;p#bvgVII`)F&JQ6=7FwIlSPjCoEUZkI&ThQ1<-S5) zc?j43oC;#FZcrBsX(=9X~!(NJ#ZF{Gi6Z?if#j-l@<4`b#d&`G(LWsH=X zje7~eLtOLLAx|;i| ziXGMYc%nhj?8~jMcF}0yGD;meASsI+(P;B1LJ8hxZe}D!YZ6M3gN;!awvcYQ@XoOw zRSHhel^X3s9DFi?U>bxXgO*wk_6i#KEyyOBWN|3xWrnE*gNtCQGcUb^k3om7FuIuP zE@vz7iLKAp-!j-OGVtF1w^c!s&Tb7Qw^1__AvYc!)D}Ul^f!bh@cgP4I?TOh&w|9P zrpVXrvCT@qK10B2kTqCEU+cc$Nmp?yc`(gN$fgc)jxKPh5_AgYDO1=tRcAcGrLKYM5aJAf!8x?6Q&Fu%JUokq^O=}l#rQdHnu^wZW{jzwYGDVdTA_Wrr0 z7A%Unsk3^}7}~}8%6#UitpN&yVaxio_LGO8y*75Ku}NepV2q!g-O_ZwI&l6{3%#FI zc+as^+2p2=jNz8x*7q-JXops>aa3dIvezVPD6V~@xHOKg;wP>$sk%E-Hz@KdBzRp) z$0?*4y0PqTRDndbEIP13m(Wq)t+s(jja~LcptfIiQBdmD(@^dOk-5&9(>FTVZGF0y z0I2>q_VCX$`lg2=$O77jzB?&k@&{AFvXEbP{aG53icqz2X-uN!`2sKhQ=aZRqgR9p zS{mszls~gXw^di(O~0Ao?sg7#JC$HFk&Z^?Gnw1{K^s~on5oHk!F|lWyo-3Qw`?p4)chU zP6|~!xw`VfFD)!k+`$4wMG(}oRy-1DqN$Za-iLPc&^J7-Z!1jmj=NB!=qA_HOELOE-A-o=Xaq>D4DBWDxS=FTml_5rg@=ZM!3WCNa-*T9!L zY6jL6s_X>53_v*2R50Qdd~RO-|J1Vf<~w?k4Y=dyrETy%#M$vljd;vNhsI^4(QA#N ziN?=u?;kDFgsh6!q}vvTy|kZ|2&INwA$8)>PH&agxm1-z_!usbz3m3{@%#v8c7VJU`e&=#4&>Nk;JwUIUv;~2AjE~@k+ zevLsOBukUcR;DM->q9Yw%xYD75NwV-bYzJDqfaGGf6+!}IN`WhW281Y6np+d@P?Sb zWjxA1(1a4U-JHaq;d^UJH>7Gy z3CczQ76_YJSXnu{G_US^zfU7bm8tBh==Dx6S@dh5)`41ZkPb3oV*3xORVRJYB5@~< zPs3EIG|9176PBw{^tPv73b1^>Et0f2VU+%7g>+ByF8V*MR;3#hyZrA)Sb&QwJ^qaEN4kGxsS5)rji-H_LH<4Sbi z=_-T0$Y8qMDMcFvKO-`?wYn218)G4zy5bpwYxrTD;|0S<0@7er2Ok~JgS87rMc+wI>y;9%0D0-Jvu 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�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 literal 87032 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ÃodV%u$jA!)Ln0780A0;OS=d+V zRDj&Vu#eP(o(I%sZ=f}R7RY3=3O*bPn?O1w%12UPAa8;HV*_Lud6yv|x5a7~#5PFk zi6At95^aWEHjH3XJ=6q&5qWD0S;!E~1N}G}xqvfX7Kak42mS!)TWL`M2)N>)L+AoU z5lao@y_e9!^U#c;q$xmXpiBrbIg7*|sQ88P`xe$c#JIw@JNzr93k6Alh}Ch#n-XE& zppKn|NHi9OXo!LhrbBLD&;g=sH>BnmYECm{nlAgT@cCE^bkMEuVnD=#84w!%t6Q6! zVu5Abv&<+y0O;pKZ-6mi8K_={wj&QDYEn`Bs>J+1-RX=V&Ici^P*LbCZa^P_03>9= z0-^2qz9Igv$X<**rwBfxOLjZhKXb!24XC#d2!sB2<4b7f*h6A2_{V&&x%eeKVuTrfdgKIZwM*h!&dc6($ou0a0K(a|ih_6D>{ei;DWt0jJK|b6tM%@8V6YoVG6oHglvKfFD^} zSjfUxhTt6_cEdycV9p@O2|&Fh5b-#U2i&C-2g7$4pgS2*M)_kj!5dKqDRiSnrqKE$ zzt3vhU7B#OyW+??2O4RFQXvCAd_S;Ka6WqoYepk^^Ucj4UI2UG*?%whor5_7L4@TK zwqTZ!f~6;VtEjZJl=o;e{u;Ct3J@g%odb+xX60LkQb~4@_zf+jdM5}EMSv9_%eSGZ z27tzFr?^tPF3)*AKQePTg@sME@&|YoV8&meM!95cp^(ek*mw^fts)9yDslmS7a?wN zQc)~;FJLQ0qI8@T`tmaXGO$E}wNewd9EWwt0Em-M zJ%mcX4u?ZnkZB3w(9kn-LmDBJEK-5Ue}%>+6w4f1n2yjD=_Ir4q+_Dq6yDO6Bv++# z8pa{)#VpEuhtIGk62wr*|KhKH10u?D#at#6x&AzqEF!24gu%z72txpw+`vUaq5M{& z9dztSKnMOR6m%bW1v?{+O{boE6x{?MxH*LD(S0hU>fKG?mB!T|vo(1XT94wRzd zf;CWOWCESB;s_;vgH2{9q){~QS_xtCn*<9dK_;}jl2SUR~Win`2LkbUM zuSaGF=vlS|3Sh1y76BEL2x3ISXGo-hxU)2nNs}9yK?a~6kpiHi%+Sz)x0|uY5{Z^! z+ksT3WJDqX@`u_hSjL<93%2~|qgr7!lY{CONC{>L761WqezA;6Q0Jeu+52u5zBmsy zt9ajMyG$Snk%VAhJ~GX`ga#H-lm-hpgBrqNq4Y(nZ4jS)8+Z*{1LQ;J0h0svU~#0V zMj2CpqC&qY10e^1C!wQt$nLs-xf+J=R5Uy+ z`!Bg)8q^3k&{UvtS#2{7bpmrBf+UcI1^B$S8%rf|&<&u@8s$9za(gJjMutwPoB=G8 zMD`*mFWTW7K$dpMC8`HDF_6ptr#48}Zy`b!V8O%WJNT9lF$I?mO@u{&gAgTCz-FHS zAyY;`?x2y1Dp8myCNSR+ic7}`8CkH!q2oXRU_(j!VB5Ka67Q^>Ac$ZMWK`khoAjxs zz#Abs7TO7raRrKcgsMTMk^u2w$ZUg%1mMHsktGdCVC4CRNxThqgE$nQ0qb=L9THc9 z5f;AxP&!ongNeEum|kX>nW$3&>zQLn}`cetNF4Pd9cq^0?Q(w&W8wNN}iIg61;vt&}rH?{nha6Dk zh}%Ix6TnJol2w`su!?!_-~MCI^Q2X&rm6&j2>hJyICMo-Lw^grFvk5s1oHdk{(q^H z{C`WSnXj+;=kLV``Ur%!dTBEiX&Utn+j~Gjpo~(8s0D0u9KbxN_~*b?p#Yg!^~J(} z-t|VIrg9d6yP(EZL2MHYF6(}M$Y-QQZV(`U(YEvv|IbrB&*Sw?k284v1Mm~5n^}Vk zs+5|+9&iZv1H1}E5Sz!W84Cxu;!rSi=xi8#(8eb%$nRNzgAj_3!w7N0che;w080vf zsadj{11wIdD8u%)cS@i&>I`8Kf&+Ds>4ifX@6Ua1F?TU5!MP4`AhbwU*@4p%KOpv+ z%p|(t*M0fG7iMN3IsXJQ$)2Lj)EIf*g;mU)p)v@v=B;*hHXJW#BPz3eqtO2n_9>x@zzOHK4E|p?Lz;f7bL8WW{y@hc97$qwudZ zY0-KB|HF^xmdx%aiItEx5aEVJeGo}&4bcXa#ltX*0ihq-9RR7sZ(r@*n4L!AzaryB z>m#W+c6Wz$Z2+=$$R7qtrO0dnxD_Z`AZ!rOm08-g-yrv+Adh=_o)S|wonP>KRy<8IKS ztaor=tl~uySB8&9oXK~vPj9%1EIPq6Qu_A?e-!po1X>x?bQ8wJFaThQ#~)mRe}jE7 zFm({rz|gS$l`~>s;K#!6A1a2nrXag733l7Sc!Za+m97RNn=aPI8Wcb#Q0+QGx4A;~ z8wJI{kdW}hOND3=&Vzw;bsltP3*@EV2iz3#+Q77nH6eRm6}ZIrW*QZv;K0K-KlR3KR0 z`k(w2C{(NS|9QaUmHAw_r$JZ%hml_qheMXUP}mVL9YTTDfWO16WNvZFHb{ng-J|Bu zd)(V)N0rkgcrw)%0M*-a0GtUz)N;X9jAW?DwE+1+)(vYfMaN8cmLNq#IrY!N%)pHc z5)!8LN(6_%s1plB^$;vEAnpyOL z63*u^3g6Sj#*r6md)SJKGL6l4ePYEcoVtFUFGcs3yJzA(xg4EMoqNryKZdGyj#x4+ z>SAF$pB)Wm{tbvfQ7(jHET)I0OIz{Napjx{nB-lRDZs?uQiB==Q&pkLOh79NSfc_JeljaX0JVXbd<49w%Qu0v@s{dJ zn!Lzq@FYV;g7j*tq1XdCh&31)xqx@~?xkqn`_r!14LzJFmq_c93tt_>U?9@SRi?0MOvTAf=~* zx#)^#(G{;BUJ^F_BADK6GLiYkvgZktC|q8!LcHZ;7Pzjua-NY;MR)Hus3NVm&pmdifs z%NS=+;`_>!HAAUa`{oRnQ*WAj7xNCeem;(ScTFucCdlr_w`JRg@Pg!{?Yd+FZt=x= zNgtn2z@3!E8gJR%Zw(atsJCC#qGa>gg$mc}9Nsg@z>^{4nmM`?YQ`N`Rie)|UDFB= z!2iXW)J-5KGT<9q-x~5p+PI^vsp;;mEL!ty^#i3(@0APqr289R2eg0TZm&J>6%)(H zBAzu(t818brth?##p7g$w&FEjMf8~)@<01d>5rcq&VD)M+fY96BD!Gu<@^#$ut~Ch zDCWED#h*Xji6v;noK@m}yGP^ZE$Fi~!pk8CnSF%T%esm`OWq&9$ zr}NV@{OiwYY3ak2ZG0pS4lDK6Ss=T-f-)Pf8b-P@ySJa%*XgjZVEjsc*g8JhcA*g&qm{Knl+H|Vs$v^ z1m(w{J#l2GU4(Y>U+m3ohDglwH}(q33`V_+abfj1v$J~^KV#|g$FB^QRh*^mR&lgb zqD(r*1VyS&)Yqs}vkIK*H+#e+{D^wmmA%O9uix3RmHsqPCU5b?Xks+%LrYrWLNBO>4_l+y&WafBdRQ2zb2|IA5o`K zIbBxmjQq72EolE*vG;Z6z$i_iw~gEg+ws=3PgvIKn~$Q0SWb(*^P<(a8M`yVEz7gV z_Wsu_3Ve10bsI0QbJCkh`nB%roeFYvOT_7L99pm4p(w>Iwc1Ye%A||0Q|mfKZ6p!+c$@aTFp~E$%_T={F={H zHozG_%4QjPKl~UzO_zA7(j^AVHckn1qH;` zUDD;YR4df!e$`q>!IG=1lRw7VW2?{baPX+jnO(n=wq-H;PBq3xwU5VwzB+`Fd^}xc z@F@C8Ag!$rQ-w1FUdmJ!$?Vqcvo;Yolp3P?62;dD9I1z1d^o3(k|I)zp&DsKg-!mb zgekhRAy?;s&O4vkM@sBfn|Z##FOJDjVSNTm)3B3jO|99)pGteU%`P0QD+Vw39;bT# zJmB4dVs>2iM=ZW=!?}yMZthV9wd(kUn2O1^JaJpMTqX5(nTp##;JI^b?=Hh*tLNLq z4Fam&CBypZQ|EQZZsF(&;%YNqm1h?4Z5JtG{Q3Tr2>;I1fd0Ael4esb-KB@=DyNfA zyLuE=HF)x!$#~gzI?#zA&w@9t>WO;pvUbw$-Y=DP>BEtD8FBX77Yr6SO^X=5^=dT; zI7}EMF^T7kZV49LW}aN{@lB3-x2i&|{D$Jqow2A{RjuN}6~d-|wNKF#wvYI4U*sDa z@ChU32%)(-NSg6eSbXT_nuOSgfuNYG5%v9Is*3mLdG9q``n;zGDji&c@Pk1~i{m%!6o!1XarpNZ!-l}+$acM2Qe|33x8{Oem}#3>j9tMK^%09~ zm}`6&&^bcnIrW$;fBULuitd%`52j<-sAG)eMqU|ZE6dAq3XhI`Sq%saC5ny)RAE zOJ;Z%8GYC|`6T$qthnd7sOG2OjMuBVb`(O2+COA@mPxWY?U#GLYwNj-*%!~~nmI>M zkdQEv;V6j+)7^Pqroxx@NVUt?O5;uShuNYNnFWp(tnap_?^wlS+2s%r9J`%9!&q0X z%gKL+D(jSJjdz^*s_fIRM|+JUuNxabX*?^5C)>C^Ud!KB%h=)5VHB-RKtN91SMyOg zELg$ws|a>#ms*{CqB)(==1v}0S#a2Oytu}Jlf)i0{Tz+gU6n6Z3b9kKx92}h$sUUn zpxRM7{=(?>dC4|Pf8D@Eb&au69o%N0Hur@shPLFsAHIIPYJ^n``x-wyR9*yq#P6v; z_Da#9O2A)$gYqiJEuF8=ZR$x9ybWTE6}fA^T{{!~nBJL_H^_BhF_?5H4TTZ{nsd`VUN7HHx9`Q!y%^YpioT~cVS;0T#b0EuP=%*`> zH^^JBd2cU@QB>mSX2FA(n;=)1-r;6ECsRD)7`)A6I z1}ToI1dtmr+uz_iEkRU?b+%jQy_4z!y90k+$mEISOLI?@rLxUQdZX~$_B^pyvO>3? zr8T}kAWzYZc;s-=WckZ+0|P-zR*9Y0YQATP&h*4%uTKV?AJOA}NjT$Lt(1I1CS!7y(_vP&1&uc8SwDQ-ZwJ>MFgjiY2+fKKO|C^_tIW-?5mCVrPE?B zqt85w|CIUj-WQo>{pPo0`Cs!hs1Dw}7)Z@#4_K+dqR(K$X1D0(%{q5Hu>+G|S!n2? z$W@Wis^w6Jn!&28G!CkP54e&T8jnV#S@j03#bF|fGF68#Sc1iHs5T$+msrzI}*w(nt{X2*EmQuf`n+Fvc=ira6lD7x|7T;!GVq#~Iu*TGcS zvIXf9VWBVeJgqaG#BjF2=+xV<#CX2t9a5`#3^%_sQYSbxYe`{erMPk_igGtAP8?bP z*nydQGt$QHM^0-3@C5kr(;i)*ae|yINszM-?d;DR3hF{?zM`mPx?{`DZA+WIEr zdfU*D9{k+9FmjY-6@~Sb(t=($?@LEYYU{}0sYzT38eaO4GS3+%K1y#T)ppHdf#%)N zsAAj|8-WtyXUo*YKLme#aP%yf2x+=`TqfUM(SU_hiJj)my*HeM^DQENiy8HW71w6Y zN@3q(^0cd-#vhzKaanf;<6Tl6kJf1H!YaAF2VnyibB$P#$C0coiwP`kh3vfrjJ3EK z%cd|IZ8k8@|==md9lMJA!(K8!bAGG zi2k4H-{@ODlB;KwUAnJxe(icv~Zx<)2t1;n9sQTkz{SwwGkNx`cCz;%vTm zh{^DB_0gCrartB^m8H7k;QKl!`4(%-oD=rmd+5t4E{X(>JL+FMcQ${lH;am0JnDEy z_k2t#kGP)Qo9W4X6aTh}S(!i~W7CKX8cadX5L}E#U4e7NTOBQ0_oD5vpMCbrQ_|0? zjTk%}FNxF17;rLQJqX_Fz-IQg#}(wg4W|{F5JC=gm!ymgF(D!0rn3O#+-(6BD(HX4 z-*=$-ibAFs9>4tE+fOrzTyjQ+4yavfx2K(|q(ow9A6z20&*#>;C}MB-=6((^!ZZ_QGSYcn{%FG1>&bGgQg8ms)+ zsFre+^u;Weip}vexEXs@fNx#eE97q!)EV6D>HT%wSv^Tj&Lz+M*!vdOK{`wAE7k7U zwO<;UdY8*O1p6{}9;xel1RS|(zB*oTzVAw}vci2=#@ibs$NIj1JXJ~Q^_6YX)qztq zJoq_YZQn!kIrY6l(J%IP!Unue-#<8i%d>ryb}==Q;jyxka7Y>`RZf zm&f(J@X9;~|Ku}H#F7gNdbo-n<1r@!PEu0UNw)x08NN~mSLUVar|E4w)6b<9tiI3mjQqJ8X% z==X#hW^C(L3-%BEC_j{hpCZVx?YQ|V>Xx|{--qaxHlLisQ|Jjn>*_*<&*IlTvFCxcfgWkug|hF$nBse)-tpBIYHENEw+xoey7q3=2Y2 zIK`;fM`lVm9-h(-KD%-9Z3Y$fmod*T;`MJ26AC<#iIY+8vXa9PW5{+vEy+pfnzPjA!l) zU7J=x>o1)fBW>PGjUAe~<-NBXy0m|7n!+iF_%YL@O#85=KiJy>zGocLDdq=?-Y&T; zIgu_x^2TXoJ~Il|Qc|h`!3HKeQyb29pf^y|A_?dp!s78LeR5I;*LNddR=w@j#{sNl zy5wwl1F$Q;gNa5%4Qn77jAZrt>&1yNvw&Y?^^h0vN)-7b|G?seAgDrmY~z5K0% zB=&o1LTF#ogQz8j(PLMvb6l+6^if835;;8SQM}JV>GN#ckLq}~U!rH}q(VM(? z@^sh~-YKyJ$}FpEPQRj!1y9nSdxeeLWfB=TbEQVbqFYh-+;a^{Ja#$W9McZLYknp3 zaeI-K+fFwNDNe^rKmBRyug$tPHX!T${%hf%(dN-*?mTwZ+Sc~Lo{NRW8=xD0!dWjl zU`mOMlWd9Py}Iy=O;bW^Vrig=G}BH4-sYww2~+a(+U%1k4stLxNLsr5C&q=?^6+waqWLlnw0gK%o^&#es3T;r)6RdnZItEPYEvPncA)9A6`y{1>gGB0RWReGR)MBw<3{;`Cm zA}s3iw9(l|Pa0CL#nPWU@_^_BUwduE7Tu|9^Qq@L&COzyV|30`R<82S3aqkV(b$fd zWYiW3j^#@Q^u;V|lP*=y=PsGi=k`cWJL6xuHqWeKy}E57s8P|60sH6!W7^zL?-N32 zXLe>(*n8=U<3b*-uXof5&GZTKS2m?TrZ|_mMv}K?lbFuqEH2c^j@`Q8QeKtDBruvc(o4z!~f!&}XEN$KhOU>3sI9i=SShTX=2 zDzVNS+nrcoKg`mFScC7M9t)XnM=f5mya~FenAL^lJ2znw}5zb;^k4-;N}O zJ?qW(MtRXxgI3x1u1$?iJqj1wHmfwqTYiefVVm0!jQ7aQY!ckbx**nbUiQ}-w=3V# zd{CRk&#}DhO2(J%T>fdY8T3#f-nFZo!`SUj?4j^oZrJh46Lqj#l5(@G^FH1&8 zZ5vS8IPcAAvCVQ&JI!auhOqtX3W3Q`wzD~p5Wvw6!R_tsu|egaD*~QYDd^LGz6iNC zkhUmhMnPGbvSi-eZKofH4K!DOUV5CDcxG?GF|^uH^V6L?2HHO{>x{uz45E_6qTR&wZT*(yXsz*aHP`gLzq=4uU9ufB_CKBd;i2K7zc6J30Ez zV{d+XIKyE@w;6Pw8DuLM5Q{RJ*YjWuROk*1cC}P?KSAKX0^VoH5_(ORXz8&1W9&6! zkEbfFCF$P8s*y2`3)#xAi3m;d0QD$2HHntbOTPpqLz@ea=cxv$M{FParsQjNTR8p% zq#*EYIBzxZd_EIR5bgZy+lvhr7;=r#`>XV{0Z09WJpAe4LnAtDp&70;+`; z7eIC!pPwHB%C!|y1=Bt<74m=<&+T=Q2lv{MZx|2YaD%h`;RF{>maYK_^-Fo$>67f zu<_4pT--zPU+)Uw|Hs|X2GS#d@$c(b{D1l|2{T)qzdsTd79c3w8C;Uy>_by*&b7z) z-`6Cm!IPnPdhpLrk^3&x>F1gL&)d*DMUWs(rhxO$Ppk>Ql7#=yUmBPC=T-ju_qtEx X>tDIUVfx`PC{0{MS~%mjw&#BUz}w3% From 5ce4e489788f39c431e2a06521788c1526a319e8 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 18 Jul 2023 04:45:35 +0000 Subject: [PATCH 054/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 179751524f..ecc31e516d 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:17ddada88a13fb1b13646ee91d20d72b8baf0452598387ebe15c1a24f957d0e5 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c965b2008550d823999ab0fb33863b72b2022c80192f33723d68a5042d39fa60 lifecycle: preStop: exec: From 145dd3dc45badf27438580deed56adb7bdf8c3a4 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 18 Jul 2023 04:53:15 +0000 Subject: [PATCH 055/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index ecc31e516d..2fb8750dfb 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c965b2008550d823999ab0fb33863b72b2022c80192f33723d68a5042d39fa60 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:ddc00367c985323778abb06635f7c0eec5f14826e2ee3d701e048a5bf6bd990c lifecycle: preStop: exec: From 72e90fa60a9ecfb41ba8abc417e138fe19ce241c Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 18 Jul 2023 15:24:43 +0200 Subject: [PATCH 056/825] Relax Java requirements for Kotlin Closes gh-1250 --- .../JavaVersionProjectDescriptionCustomizer.java | 15 --------------- ...aVersionProjectDescriptionCustomizerTests.java | 8 ++++---- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index fa6b73245f..2bd2268a03 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -20,7 +20,6 @@ import java.util.List; import io.spring.initializr.generator.language.Language; -import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; import io.spring.initializr.generator.version.Version; @@ -61,32 +60,18 @@ public void customize(MutableProjectDescription description) { updateTo(description, "17"); return; } - if (javaGeneration == 18) { - // Kotlin support to be determined - if (description.getLanguage() instanceof KotlinLanguage) { - updateTo(description, "17"); - } - } if (javaGeneration == 19) { // Java 19 support as of Spring Boot 2.6.12 if (!SPRING_BOOT_2_6_12_OR_LATER.match(platformVersion)) { updateTo(description, "17"); } - // Kotlin support to be determined - if (description.getLanguage() instanceof KotlinLanguage) { - updateTo(description, "17"); - } } if (javaGeneration == 20) { // Java 20 support as of Spring Boot 2.7.10 if (!SPRING_BOOT_2_7_10_OR_LATER.match(platformVersion)) { updateTo(description, "17"); } - // Kotlin support to be determined - if (description.getLanguage() instanceof KotlinLanguage) { - updateTo(description, "17"); - } } } diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index 97756196bf..f69fc6449e 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -86,7 +86,7 @@ private static Stream supportedJavaParameters() { } private static Stream supportedKotlinParameters() { - return Stream.of(kotlin("17", "2.6.0")); + return Stream.of(kotlin("17", "2.6.0"), kotlin("19", "2.6.12"), kotlin("20", "2.7.10")); } private static Stream supportedGroovyParameters() { @@ -117,15 +117,15 @@ static Stream unsupportedGradleGroovyParameters() { } private static Stream unsupportedJavaParameters() { - return Stream.of(java("19", "2.6.11")); + return Stream.of(java("19", "2.6.11"), java("20", "2.7.9")); } private static Stream unsupportedKotlinParameters() { - return Stream.of(kotlin("18", "2.6.12"), kotlin("19", "2.6.12"), kotlin("20", "2.6.12")); + return Stream.of(kotlin("19", "2.6.11"), kotlin("20", "2.7.9")); } private static Stream unsupportedGroovyParameters() { - return Stream.of(groovy("19", "2.6.11")); + return Stream.of(groovy("19", "2.6.11"), groovy("20", "2.7.9")); } private static Arguments java(String javaVersion, String springBootVersion) { From f9167b69c5cb1c0cd8b6c1bb6938875bf1febb24 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 18 Jul 2023 13:48:21 +0000 Subject: [PATCH 057/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 2fb8750dfb..1115ab19ff 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:ddc00367c985323778abb06635f7c0eec5f14826e2ee3d701e048a5bf6bd990c + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9012dfdfb1875608f4e6040e776b9a17486b76a59873ef09b1378251166d894a lifecycle: preStop: exec: From a34df352efb57bba701e2f7223ae6f51ce8d4170 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 20 Jul 2023 15:20:11 +0200 Subject: [PATCH 058/825] Add Service Connection Support for ActiveMQ Closes gh-1251 --- .../SimpleDockerServiceResolver.java | 5 ++++ ...ctiveMQProjectGenerationConfiguration.java | 20 ++++++++++++++++ ...MQProjectGenerationConfigurationTests.java | 24 +++++++++++++++++++ .../src/test/resources/compose/activemq.yaml | 5 ++++ 4 files changed, 54 insertions(+) create mode 100644 start-site/src/test/resources/compose/activemq.yaml diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index f44c1d2d6f..7bf42870ec 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -32,6 +32,7 @@ public class SimpleDockerServiceResolver implements DockerServiceResolver { public SimpleDockerServiceResolver() { this.dockerServices = new HashMap<>(); + this.dockerServices.put("activeMQ", activeMQ()); this.dockerServices.put("elasticsearch", elasticsearch()); this.dockerServices.put("cassandra", cassandra()); this.dockerServices.put("mariaDb", mariaDb()); @@ -45,6 +46,10 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("zipkin", zipkin()); } + private static DockerService activeMQ() { + return new DockerService("symptoma/activemq", "latest", "https://hub.docker.com/r/symptoma/activemq", 61616); + } + private static DockerService elasticsearch() { // They don't provide a 'latest' tag return new DockerService("docker.elastic.co/elasticsearch/elasticsearch", "7.17.10", diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java index 2feeec815b..78140df2fc 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java @@ -21,6 +21,10 @@ import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.core.Ordered; @@ -34,6 +38,22 @@ @ConditionalOnRequestedDependency("activemq") public class ActiveMQProjectGenerationConfiguration { + @Bean + @ConditionalOnPlatformVersion("3.2.0-M1") + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer activeMQServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("activeMQ", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofGenericContainer("activeMQ", service, "symptoma/activemq"))); + } + + @Bean + @ConditionalOnPlatformVersion("3.2.0-M1") + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer activeMQComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("activeMQ", + (service) -> composeFile.services().add("activemq", service)); + } + @ConditionalOnPlatformVersion("[3.0.0-M1,3.1.0-RC1)") static class SpringBoot30Configuration { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java index b3953916d9..98f04ec3f9 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java @@ -22,6 +22,8 @@ import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; + import static org.assertj.core.api.Assertions.assertThat; /** @@ -59,6 +61,28 @@ void activeMQWithSpringBoot31DoesNotAddWarning() { assertHelpDocument(request).doesNotContain("ActiveMQ is not supported with Spring Boot 3.0"); } + @Test + void dockerComposeWhenDockerComposeIsNotSelectedDoesNotCreateService() { + ProjectRequest request = createProjectRequest("web", "activemq"); + request.setBootVersion("3.2.0-M1"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void dockerComposeWhenIncompatibleSpringBootVersionDoesNotCreateService() { + ProjectRequest request = createProjectRequest("docker-compose", "activemq"); + request.setBootVersion("3.1.1"); + assertThat(composeFile(request)).doesNotContain("activemq"); + } + + @Test + void dockerComposeCreatesAppropriateService() { + ProjectRequest request = createProjectRequest("docker-compose", "activemq"); + request.setBootVersion("3.2.0-M1"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/activemq.yaml")); + } + private TextAssert assertHelpDocument(ProjectRequest request) { ProjectStructure project = generateProject(request); return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); diff --git a/start-site/src/test/resources/compose/activemq.yaml b/start-site/src/test/resources/compose/activemq.yaml new file mode 100644 index 0000000000..0e7e1de2d8 --- /dev/null +++ b/start-site/src/test/resources/compose/activemq.yaml @@ -0,0 +1,5 @@ +services: + activemq: + image: 'symptoma/activemq:latest' + ports: + - '61616' From ab56ed6215b027bec43de7d77ae0b14c7a628b87 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 20 Jul 2023 15:21:36 +0200 Subject: [PATCH 059/825] Polish --- .../site/container/SimpleDockerServiceResolver.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index 7bf42870ec..a6d6ff1a64 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -33,8 +33,8 @@ public class SimpleDockerServiceResolver implements DockerServiceResolver { public SimpleDockerServiceResolver() { this.dockerServices = new HashMap<>(); this.dockerServices.put("activeMQ", activeMQ()); - this.dockerServices.put("elasticsearch", elasticsearch()); this.dockerServices.put("cassandra", cassandra()); + this.dockerServices.put("elasticsearch", elasticsearch()); this.dockerServices.put("mariaDb", mariaDb()); this.dockerServices.put("mongoDb", mongoDb()); this.dockerServices.put("mysql", mysql()); @@ -50,16 +50,16 @@ private static DockerService activeMQ() { return new DockerService("symptoma/activemq", "latest", "https://hub.docker.com/r/symptoma/activemq", 61616); } + private static DockerService cassandra() { + return new DockerService("cassandra", "latest", "https://hub.docker.com/_/cassandra", 9042); + } + private static DockerService elasticsearch() { // They don't provide a 'latest' tag return new DockerService("docker.elastic.co/elasticsearch/elasticsearch", "7.17.10", "https://www.docker.elastic.co/r/elasticsearch", 9200, 9300); } - private static DockerService cassandra() { - return new DockerService("cassandra", "latest", "https://hub.docker.com/_/cassandra", 9042); - } - private static DockerService mariaDb() { return new DockerService("mariadb", "latest", "https://hub.docker.com/_/mariadb", 3306); } From ea3ab2a67aa096a568ddf5fed0fd7a885cd0f554 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 20 Jul 2023 13:33:10 +0000 Subject: [PATCH 060/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 1115ab19ff..6bb06524d9 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9012dfdfb1875608f4e6040e776b9a17486b76a59873ef09b1378251166d894a + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d8f26c7555e7daff0212e98d6bb083f55485eab1a47ce3920e27fba1c49435fe lifecycle: preStop: exec: From c40dc2a1c668ed80c9b0cc82ce37519a12924d56 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 20 Jul 2023 15:41:44 +0200 Subject: [PATCH 061/825] Upgrade to Spring Boot 3.1.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bdfb3124b5..6e3381f226 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.1 + 3.1.2 io.spring.start start-parent From cb194df6f8174a49690a82e80e3b6079147d281f Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 20 Jul 2023 15:43:49 +0200 Subject: [PATCH 062/825] Upgrade ubuntu version in CI image --- ci/images/start-site-ci-image/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/images/start-site-ci-image/Dockerfile b/ci/images/start-site-ci-image/Dockerfile index 47dad8bc54..aeef34451a 100644 --- a/ci/images/start-site-ci-image/Dockerfile +++ b/ci/images/start-site-ci-image/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:jammy-20230425 +FROM ubuntu:jammy-20230624 ADD setup.sh /setup.sh RUN ./setup.sh From bc361819d4b72a7d0784183b256b1a3cb0df4ea5 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 20 Jul 2023 15:44:45 +0200 Subject: [PATCH 063/825] Upgrade Java 17 version in CI image --- ci/images/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/images/setup.sh b/ci/images/setup.sh index e34d82f62f..8926802b00 100755 --- a/ci/images/setup.sh +++ b/ci/images/setup.sh @@ -20,6 +20,6 @@ curl https://raw.githubusercontent.com/spring-io/concourse-java-scripts/v0.0.2/c mkdir -p /opt/openjdk cd /opt/openjdk -curl -L https://github.com/bell-sw/Liberica/releases/download/17.0.7+7/bellsoft-jdk17.0.7+7-linux-amd64.tar.gz | tar zx --strip-components=1 +curl -L https://github.com/bell-sw/Liberica/releases/download/17.0.8+7/bellsoft-jdk17.0.8+7-linux-amd64.tar.gz | tar zx --strip-components=1 test -f /opt/openjdk/bin/java test -f /opt/openjdk/bin/javac From 168b821eda2774088dc4d9f2529398b1261e2a82 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 20 Jul 2023 13:59:41 +0000 Subject: [PATCH 064/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 6bb06524d9..ca22766767 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d8f26c7555e7daff0212e98d6bb083f55485eab1a47ce3920e27fba1c49435fe + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:71855a9111316ca1555664fdea5764c42b2c5aa112705469d3a93e3bd2325c48 lifecycle: preStop: exec: From c4e06cec101d763ccba04afb95b191320294115d Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Thu, 20 Jul 2023 16:05:16 +0200 Subject: [PATCH 065/825] Update dependencies --- start-client/yarn.lock | 346 +++++++++++++++++++++++------------------ 1 file changed, 194 insertions(+), 152 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index f3af9fd5b8..b8574fa263 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -25,9 +25,9 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.22.6.tgz#63f5be2a0abd587ccfbdc93424fa85f43142cc53" - integrity sha512-Be3/RfEDmkMRGT1+ru5nTkfcvWz5jDOYg1V9rXqTz2u9Qt96O1ryboGvxVBp7wOnYWDB8DNHIWb6DThrpudfOw== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.22.9.tgz#501b3614aeda7399371f6d5991404f069b059986" + integrity sha512-nb2O7AThqRo7/E53EGiuAkMaRbb7J5Qp3RvN+dmua1U+kydm0oznkhqbTEG15yk26G/C3yL6OdZjzgl+DMXVVA== dependencies: "@jridgewell/trace-mapping" "^0.3.17" commander "^4.0.1" @@ -47,45 +47,45 @@ dependencies: "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" - integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== +"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.22.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785" - integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.7" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-module-transforms" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helpers" "^7.22.6" "@babel/parser" "^7.22.7" "@babel/template" "^7.22.5" "@babel/traverse" "^7.22.8" "@babel/types" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" + semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.7.tgz#d2807fbd1fa4376162716da63dfd3c69a2249fed" - integrity sha512-LH6HJqjOyu/Qtp7LuSycZXK/CYXQ4ohdkliEaL1QTdtOXVdOVpTBKVxAo/+eeyt+x/2SRzB+zUPduVl+xiEvdg== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz#75f8aa978d1e76c87cc6f26c1ea16ae58804d390" + integrity sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - "@nicolo-ribaudo/semver-v6" "^6.3.3" eslint-visitor-keys "^2.1.0" + semver "^6.3.1" -"@babel/generator@^7.22.7", "@babel/generator@^7.7.2": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5" - integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== +"@babel/generator@^7.22.7", "@babel/generator@^7.22.9", "@babel/generator@^7.7.2": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== dependencies: "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" @@ -106,40 +106,40 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" - integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== +"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== dependencies: - "@babel/compat-data" "^7.22.6" + "@babel/compat-data" "^7.22.9" "@babel/helper-validator-option" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" browserslist "^4.21.9" lru-cache "^5.1.1" + semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz#58564873c889a6fea05a538e23f9f6d201f10950" - integrity sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz#c36ea240bb3348f942f08b0fbe28d6d979fab236" + integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-member-expression-to-functions" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@nicolo-ribaudo/semver-v6" "^6.3.3" + semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz#87afd63012688ad792de430ceb3b6dc28e4e7a40" - integrity sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" + integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" regexpu-core "^5.3.1" + semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.4.1": version "0.4.1" @@ -186,19 +186,16 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" - integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-module-imports" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -213,26 +210,22 @@ integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== "@babel/helper-remap-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz#14a38141a7bf2165ad38da61d61cf27b43015da2" - integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" -"@babel/helper-replace-supers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc" - integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg== +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-member-expression-to-functions" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" "@babel/helper-simple-access@^7.22.5": version "7.22.5" @@ -248,7 +241,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": +"@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== @@ -270,14 +263,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== -"@babel/helper-wrap-function@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz#44d205af19ed8d872b4eefb0d2fa65f45eb34f06" - integrity sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw== +"@babel/helper-wrap-function@^7.22.5", "@babel/helper-wrap-function@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz#189937248c45b0182c1dcf32f3444ca153944cb9" + integrity sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q== dependencies: "@babel/helper-function-name" "^7.22.5" "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" "@babel/helpers@^7.22.6": @@ -1009,16 +1001,16 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.18.5": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.7.tgz#eb9094b5fb756cc2d98d398b2c88aeefa9205de9" - integrity sha512-o02xM7iY7mSPI+TvaYDH0aYl+lg3+KT7qrD705JlsB/GrZSNaYO/4i+aDFKPiJ7ubq3hgv8NNLCdyB5MFxT8mg== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz#a87b11e170cbbfb018e6a2bf91f5c6e533b9e027" + integrity sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ== dependencies: "@babel/helper-module-imports" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" babel-plugin-polyfill-corejs2 "^0.4.4" babel-plugin-polyfill-corejs3 "^0.8.2" babel-plugin-polyfill-regenerator "^0.5.1" + semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.22.5": version "7.22.5" @@ -1088,12 +1080,12 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.7.tgz#a1ef34b64a80653c22ce4d9c25603cfa76fc168a" - integrity sha512-1whfDtW+CzhETuzYXfcgZAh8/GFMeEbz0V5dVgya8YeJyCU6Y/P2Gnx4Qb3MylK68Zu9UiwUvbPMPTpFAOJ+sQ== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.9.tgz#57f17108eb5dfd4c5c25a44c1977eba1df310ac7" + integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g== dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-compilation-targets" "^7.22.6" + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" @@ -1167,11 +1159,11 @@ "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "^0.1.5" "@babel/types" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" babel-plugin-polyfill-corejs2 "^0.4.4" babel-plugin-polyfill-corejs3 "^0.8.2" babel-plugin-polyfill-regenerator "^0.5.1" core-js-compat "^3.31.0" + semver "^6.3.1" "@babel/preset-modules@^0.1.5": version "0.1.5" @@ -1217,7 +1209,7 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": version "7.22.8" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== @@ -2160,11 +2152,11 @@ "@types/node" "*" "@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + version "2.3.5" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.5.tgz#08caac88b44d0fdd04dc17a19142355f43bd8a7a" + integrity sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg== dependencies: - "@types/unist" "*" + "@types/unist" "^2" "@types/html-minifier-terser@^6.0.0": version "6.1.0" @@ -2213,11 +2205,11 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== + version "3.0.12" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.12.tgz#beeb511b977c875a5b0cc92eab6fcac2f0895514" + integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== dependencies: - "@types/unist" "*" + "@types/unist" "^2" "@types/mime@*": version "3.0.1" @@ -2245,9 +2237,9 @@ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node@*": - version "20.4.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d" - integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== + version "20.4.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" + integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== "@types/node@16.9.1": version "16.9.1" @@ -2337,15 +2329,10 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== -"@types/unist@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.0.tgz#988ae8af1e5239e89f9fbb1ade4c935f4eeedf9a" - integrity sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w== - -"@types/unist@^2.0.0": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.7.tgz#5b06ad6894b236a1d2bd6b2f07850ca5c59cf4d6" + integrity sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g== "@types/ws@^8.5.5": version "8.5.5" @@ -2876,6 +2863,18 @@ array.prototype.tosorted@^1.1.1: es-shim-unscopables "^1.0.0" get-intrinsic "^1.1.3" +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3351,9 +3350,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001515" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" - integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== + version "1.0.30001517" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz#90fabae294215c3495807eb24fc809e11dc2f0a8" + integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== caseless@~0.12.0: version "0.12.0" @@ -4096,9 +4095,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.4.431: - version "1.4.455" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.455.tgz#81fe4353ac970eb971c07088c8da8b7f6280ddc9" - integrity sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA== + version "1.4.466" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.466.tgz#17193d70f203da3d52a89c653b8d89f47a51d79d" + integrity sha512-TSkRvbXRXD8BwhcGlZXDsbI2lRoP8dvqR7LQnqQNk9KxXBc4tG8O+rTuXgTyIpEdiqSGKEBSqrxdqEntnjNncA== emittery@^0.10.2: version "0.10.2" @@ -4180,17 +4179,18 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -4210,14 +4210,18 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" safe-regex-test "^1.0.0" string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.10" es-module-lexer@^1.2.1: version "1.3.0" @@ -4414,9 +4418,9 @@ eslint-scope@^4.0.3: estraverse "^4.1.1" eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + version "7.2.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.1.tgz#936821d3462675f25a18ac5fd88a67cc15b393bd" + integrity sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -4486,9 +4490,9 @@ eslint@^5.0.0: text-table "^0.2.0" eslint@^8.17.0: - version "8.44.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500" - integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A== + version "8.45.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" + integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" @@ -4515,7 +4519,6 @@ eslint@^8.17.0: globals "^13.19.0" graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" @@ -4527,7 +4530,6 @@ eslint@^8.17.0: natural-compare "^1.4.0" optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" espree@^5.0.1: @@ -4540,9 +4542,9 @@ espree@^5.0.1: eslint-visitor-keys "^1.0.0" espree@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.0.tgz#80869754b1c6560f32e3b6929194a3fe07c5b82f" - integrity sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A== + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" acorn-jsx "^5.3.2" @@ -5148,7 +5150,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== @@ -5703,9 +5705,9 @@ immediate@~3.0.5: integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== immutable@^4.0.0, immutable@^4.0.0-rc.12: - version "4.3.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" - integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.1.tgz#17988b356097ab0719e2f741d56f3ec6c317f9dc" + integrity sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A== import-fresh@^2.0.0: version "2.0.0" @@ -6198,15 +6200,11 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" is-typedarray@~1.0.0: version "1.0.0" @@ -6237,6 +6235,11 @@ isarray@1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -8392,9 +8395,9 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.4.21: - version "8.4.25" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.25.tgz#4a133f5e379eda7f61e906c3b1aaa9b81292726f" - integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== + version "8.4.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" + integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -8820,7 +8823,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== @@ -9079,6 +9082,16 @@ sade@^1.7.3: dependencies: mri "^1.1.0" +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -9128,9 +9141,9 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.63.6" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.6.tgz#481610e612902e0c31c46b46cf2dad66943283ea" - integrity sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw== + version "1.64.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.64.0.tgz#9ca8d0acb1a704b86b7f1197dc310f568fb34638" + integrity sha512-m7YtAGmQta9uANIUJwXesAJMSncqH+3INc8kdVXs6eV6GUC8Qu2IYKQSN8PRLgiQfpca697G94klm2leYMxSHw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9201,7 +9214,7 @@ selfsigned@^2.1.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -9819,7 +9832,7 @@ strip-json-comments@^2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -9940,9 +9953,9 @@ terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: - version "5.19.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.0.tgz#7b3137b01226bdd179978207b9c8148754a6da9c" - integrity sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q== + version "5.19.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.1.tgz#dbd7231f224a9e2401d0f0959542ed74d76d340b" + integrity sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10193,6 +10206,36 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -10626,9 +10669,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.88.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.1.tgz#21eba01e81bd5edff1968aea726e2fbfd557d3f8" - integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== + version "5.88.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -10702,17 +10745,16 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" - integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== +which-typed-array@^1.1.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" which@^1.2.9: version "1.3.1" @@ -10741,9 +10783,9 @@ wildcard@^2.0.0: integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + version "1.2.4" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" + integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== workbox-background-sync@6.6.1: version "6.6.1" From a05582a13dea94cc3c5446759ef0c0f9dace7fe9 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 20 Jul 2023 14:19:14 +0000 Subject: [PATCH 066/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index ca22766767..7cf3183f90 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:71855a9111316ca1555664fdea5764c42b2c5aa112705469d3a93e3bd2325c48 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d7b9bf156b79b4061ac526eb6ffe865a5f98a483bbba31b4cc612e5d5a7dea13 lifecycle: preStop: exec: From f1eb9abebbd4da8b796249ce186595b3c2682d0c Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 24 Jul 2023 12:28:48 +0200 Subject: [PATCH 067/825] Open range for Azure Cosmos DB Closes gh-1252 --- start-site/src/main/resources/application.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 23eeed501a..defb99c7fb 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1382,7 +1382,6 @@ initializr: description: Azure Active Directory Sample - name: Azure Cosmos DB id: azure-cosmos-db - compatibilityRange: "[2.6.0,3.0.0-M1)" groupId: com.azure.spring artifactId: spring-cloud-azure-starter-data-cosmos description: Fully managed NoSQL database service for modern app development, including Spring Data support. From fc5aa7c217eb377bbc6fd6e59589b9afe2c000b0 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 24 Jul 2023 10:40:27 +0000 Subject: [PATCH 068/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 7cf3183f90..688bc11130 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d7b9bf156b79b4061ac526eb6ffe865a5f98a483bbba31b4cc612e5d5a7dea13 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:dd9fd041d2ff8157fbe4231f9c8e198bdd66941229c1c76708ef136472ba91a5 lifecycle: preStop: exec: From 23bee192ae5086d08c083afbd117e7229c112b92 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 24 Jul 2023 19:44:50 +0200 Subject: [PATCH 069/825] Configure Hibernate plugin with the Kotlin DSL Closes gh-1229 --- ...GraalVmProjectGenerationConfiguration.java | 7 +++ ...ePluginKotlinDslGradleBuildCustomizer.java | 54 +++++++++++++++++++ ...VmProjectGenerationConfigurationTests.java | 21 +++++++- ...inKotlinDslGradleBuildCustomizerTests.java | 50 +++++++++++++++++ 4 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java index 0d8ebac0e7..6da34f3d8c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java @@ -105,6 +105,13 @@ HibernatePluginGroovyDslGradleBuildCustomizer hibernatePluginGroovyDslGradleBuil return new HibernatePluginGroovyDslGradleBuildCustomizer(determineHibernateVersion(versionResolver)); } + @Bean + @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) + HibernatePluginKotlinDslGradleBuildCustomizer hibernatePluginKotlinDslGradleBuildCustomizer( + MavenVersionResolver versionResolver) { + return new HibernatePluginKotlinDslGradleBuildCustomizer(determineHibernateVersion(versionResolver)); + } + private VersionReference determineHibernateVersion(MavenVersionResolver versionResolver) { Map resolve = versionResolver.resolveDependencies("org.springframework.boot", "spring-boot-dependencies", this.platformVersion.toString()); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java new file mode 100644 index 0000000000..0226979e49 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java @@ -0,0 +1,54 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.graalvm; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.generator.version.VersionReference; + +/** + * A {@link BuildCustomizer} for projects using the Kotlin DSL with GraalVm and Hibernate. + * + * @author Stephane Nicoll + */ +class HibernatePluginKotlinDslGradleBuildCustomizer implements BuildCustomizer { + + private final VersionReference hibernateVersion; + + HibernatePluginKotlinDslGradleBuildCustomizer(VersionReference hibernateVersion) { + this.hibernateVersion = hibernateVersion; + } + + @Override + public void customize(GradleBuild build) { + build.plugins().add("org.hibernate.orm", (plugin) -> plugin.setVersion(this.hibernateVersion.toString())); + build.snippets().add((writer) -> { + writer.println("hibernate {"); + writer.indented(() -> { + writer.println("enhancement {"); + writer.indented(() -> { + writer.println("enableLazyInitialization.set(true)"); + writer.println("enableDirtyTracking.set(true)"); + writer.println("enableAssociationManagement.set(true)"); + }); + writer.println("}"); + }); + writer.println("}"); + }); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index e280370b76..1e91ddae13 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -76,7 +76,7 @@ void gradleBuildWithoutJpaDoesNotConfigureHibernateEnhancePlugin() { } @Test - void gradleBuildWithJpaConfiguresHibernateEnhancePlugin() { + void gradleBuildAndGroovyDslWithJpaConfiguresHibernateEnhancePlugin() { ProjectRequest request = createNativeProjectRequest("data-jpa"); assertThat(gradleBuild(request)).hasPlugin("org.hibernate.orm").lines().containsSequence( // @formatter:off @@ -90,6 +90,25 @@ void gradleBuildWithJpaConfiguresHibernateEnhancePlugin() { // @formatter:on } + @Test + void gradleBuildAndKotlinDslWithJpaConfiguresHibernateEnhancePlugin() { + ProjectRequest request = createNativeProjectRequest("data-jpa"); + request.setType("gradle-project-kotlin"); + assertThat(generateProject(request)).kotlinDslGradleBuild() + .hasPlugin("org.hibernate.orm") + .lines() + .containsSequence( + // @formatter:off + "hibernate {", + " enhancement {", + " enableLazyInitialization.set(true)", + " enableDirtyTracking.set(true)", + " enableAssociationManagement.set(true)", + " }", + "}"); + // @formatter:on + } + @Test void mavenBuildWithoutJpaDoesNotConfigureHibernateEnhancePlugin() { assertThat(mavenPom(createNativeProjectRequest())).doesNotContain("hibernate-enhance-maven-plugin"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java new file mode 100644 index 0000000000..cf195c36a2 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java @@ -0,0 +1,50 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.graalvm; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.gradle.GradlePlugin; +import io.spring.initializr.generator.buildsystem.gradle.StandardGradlePlugin; +import io.spring.initializr.generator.version.VersionReference; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link HibernatePluginKotlinDslGradleBuildCustomizer}. + * + * @author Stephane Nicoll + */ +class HibernatePluginKotlinDslGradleBuildCustomizerTests { + + @Test + void customizerAppliesHibernateEnhancePlugin() { + HibernatePluginKotlinDslGradleBuildCustomizer customizer = new HibernatePluginKotlinDslGradleBuildCustomizer( + VersionReference.ofValue("6.1.0.Final")); + GradleBuild build = new GradleBuild(); + customizer.customize(build); + GradlePlugin hibernatePlugin = build.plugins() + .values() + .filter((plugin) -> plugin.getId().equals("org.hibernate.orm")) + .findAny() + .orElse(null); + assertThat(hibernatePlugin).isNotNull(); + assertThat(hibernatePlugin).isInstanceOf(StandardGradlePlugin.class) + .satisfies((plugin) -> assertThat(((StandardGradlePlugin) plugin).getVersion()).isEqualTo("6.1.0.Final")); + } + +} From e4c868c5df32bb509d275c486503077e036427ae Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 24 Jul 2023 19:59:54 +0200 Subject: [PATCH 070/825] Rework Hibernate plugin configuration with GraalVM This commit switches to use standard properties as the accessor we used previously are deprecated in Hibernate 6.2. Two properties now have a default that no longer requires customization, so they have been removed as well when running against Hibernate 6.2 or later. Closes gh-1253 --- ...GraalVmProjectGenerationConfiguration.java | 5 +-- ...ePluginGroovyDslGradleBuildCustomizer.java | 20 +++++---- ...ePluginKotlinDslGradleBuildCustomizer.java | 16 ++++--- ...VmProjectGenerationConfigurationTests.java | 42 +++++++++++++++++-- ...inGroovyDslGradleBuildCustomizerTests.java | 4 +- ...inKotlinDslGradleBuildCustomizerTests.java | 4 +- 6 files changed, 68 insertions(+), 23 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java index 6da34f3d8c..5789cb5e9f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java @@ -28,7 +28,6 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionReference; import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.versionresolver.MavenVersionResolver; @@ -112,7 +111,7 @@ HibernatePluginKotlinDslGradleBuildCustomizer hibernatePluginKotlinDslGradleBuil return new HibernatePluginKotlinDslGradleBuildCustomizer(determineHibernateVersion(versionResolver)); } - private VersionReference determineHibernateVersion(MavenVersionResolver versionResolver) { + private Version determineHibernateVersion(MavenVersionResolver versionResolver) { Map resolve = versionResolver.resolveDependencies("org.springframework.boot", "spring-boot-dependencies", this.platformVersion.toString()); String hibernateVersion = resolve.get("org.hibernate.orm" + ":hibernate-core"); @@ -120,7 +119,7 @@ private VersionReference determineHibernateVersion(MavenVersionResolver versionR throw new IllegalStateException( "Failed to determine Hibernate version for Spring Boot " + this.platformVersion); } - return VersionReference.ofValue(hibernateVersion); + return Version.parse(hibernateVersion); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java index 49ab506488..d1cff3c514 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.VersionReference; +import io.spring.initializr.generator.version.Version; /** * A {@link BuildCustomizer} for projects using the Groovy DSL with GraalVm and Hibernate. @@ -27,9 +27,9 @@ */ class HibernatePluginGroovyDslGradleBuildCustomizer implements BuildCustomizer { - private final VersionReference hibernateVersion; + private final Version hibernateVersion; - HibernatePluginGroovyDslGradleBuildCustomizer(VersionReference hibernateVersion) { + HibernatePluginGroovyDslGradleBuildCustomizer(Version hibernateVersion) { this.hibernateVersion = hibernateVersion; } @@ -41,9 +41,11 @@ public void customize(GradleBuild build) { writer.indented(() -> { writer.println("enhancement {"); writer.indented(() -> { - writer.println("lazyInitialization true"); - writer.println("dirtyTracking true"); - writer.println("associationManagement true"); + if (!isHibernate62Available()) { + writer.println("enableLazyInitialization = true"); + writer.println("enableDirtyTracking = true"); + } + writer.println("enableAssociationManagement = true"); }); writer.println("}"); }); @@ -51,4 +53,8 @@ public void customize(GradleBuild build) { }); } + private boolean isHibernate62Available() { + return this.hibernateVersion.getMajor() >= 6 && this.hibernateVersion.getMinor() >= 2; + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java index 0226979e49..c3a16f08e8 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java @@ -18,7 +18,7 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.VersionReference; +import io.spring.initializr.generator.version.Version; /** * A {@link BuildCustomizer} for projects using the Kotlin DSL with GraalVm and Hibernate. @@ -27,9 +27,9 @@ */ class HibernatePluginKotlinDslGradleBuildCustomizer implements BuildCustomizer { - private final VersionReference hibernateVersion; + private final Version hibernateVersion; - HibernatePluginKotlinDslGradleBuildCustomizer(VersionReference hibernateVersion) { + HibernatePluginKotlinDslGradleBuildCustomizer(Version hibernateVersion) { this.hibernateVersion = hibernateVersion; } @@ -41,8 +41,10 @@ public void customize(GradleBuild build) { writer.indented(() -> { writer.println("enhancement {"); writer.indented(() -> { - writer.println("enableLazyInitialization.set(true)"); - writer.println("enableDirtyTracking.set(true)"); + if (!isHibernate62Available()) { + writer.println("enableLazyInitialization.set(true)"); + writer.println("enableDirtyTracking.set(true)"); + } writer.println("enableAssociationManagement.set(true)"); }); writer.println("}"); @@ -51,4 +53,8 @@ public void customize(GradleBuild build) { }); } + private boolean isHibernate62Available() { + return this.hibernateVersion.getMajor() >= 6 && this.hibernateVersion.getMinor() >= 2; + } + } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index 1e91ddae13..6b5bd6144b 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -75,25 +75,41 @@ void gradleBuildWithoutJpaDoesNotConfigureHibernateEnhancePlugin() { assertThat(gradleBuild(createNativeProjectRequest())).doesNotContain("org.hibernate.orm"); } + @Test + void gradleBuildAndGroovyDslWithJpaAndHibernate61ConfiguresHibernateEnhancePlugin() { + ProjectRequest request = createNativeProjectRequest("data-jpa"); + request.setBootVersion("3.0.0"); + assertThat(gradleBuild(request)).hasPlugin("org.hibernate.orm").lines().containsSequence( + // @formatter:off + "hibernate {", + " enhancement {", + " enableLazyInitialization = true", + " enableDirtyTracking = true", + " enableAssociationManagement = true", + " }", + "}"); + // @formatter:on + } + @Test void gradleBuildAndGroovyDslWithJpaConfiguresHibernateEnhancePlugin() { ProjectRequest request = createNativeProjectRequest("data-jpa"); + request.setBootVersion("3.1.0"); assertThat(gradleBuild(request)).hasPlugin("org.hibernate.orm").lines().containsSequence( // @formatter:off "hibernate {", " enhancement {", - " lazyInitialization true", - " dirtyTracking true", - " associationManagement true", + " enableAssociationManagement = true", " }", "}"); // @formatter:on } @Test - void gradleBuildAndKotlinDslWithJpaConfiguresHibernateEnhancePlugin() { + void gradleBuildAndKotlinDslWithJpaAndHibernate61ConfiguresHibernateEnhancePlugin() { ProjectRequest request = createNativeProjectRequest("data-jpa"); request.setType("gradle-project-kotlin"); + request.setBootVersion("3.0.0"); assertThat(generateProject(request)).kotlinDslGradleBuild() .hasPlugin("org.hibernate.orm") .lines() @@ -109,6 +125,24 @@ void gradleBuildAndKotlinDslWithJpaConfiguresHibernateEnhancePlugin() { // @formatter:on } + @Test + void gradleBuildAndKotlinDslWithJpaConfiguresHibernateEnhancePlugin() { + ProjectRequest request = createNativeProjectRequest("data-jpa"); + request.setType("gradle-project-kotlin"); + request.setBootVersion("3.1.0"); + assertThat(generateProject(request)).kotlinDslGradleBuild() + .hasPlugin("org.hibernate.orm") + .lines() + .containsSequence( + // @formatter:off + "hibernate {", + " enhancement {", + " enableAssociationManagement.set(true)", + " }", + "}"); + // @formatter:on + } + @Test void mavenBuildWithoutJpaDoesNotConfigureHibernateEnhancePlugin() { assertThat(mavenPom(createNativeProjectRequest())).doesNotContain("hibernate-enhance-maven-plugin"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java index d5c7499eb5..61d7007e4e 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java @@ -19,7 +19,7 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.buildsystem.gradle.GradlePlugin; import io.spring.initializr.generator.buildsystem.gradle.StandardGradlePlugin; -import io.spring.initializr.generator.version.VersionReference; +import io.spring.initializr.generator.version.Version; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -34,7 +34,7 @@ class HibernatePluginGroovyDslGradleBuildCustomizerTests { @Test void customizerAppliesHibernateEnhancePlugin() { HibernatePluginGroovyDslGradleBuildCustomizer customizer = new HibernatePluginGroovyDslGradleBuildCustomizer( - VersionReference.ofValue("6.1.0.Final")); + Version.parse("6.1.0.Final")); GradleBuild build = new GradleBuild(); customizer.customize(build); GradlePlugin hibernatePlugin = build.plugins() diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java index cf195c36a2..b52ac3b86d 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java @@ -19,7 +19,7 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.buildsystem.gradle.GradlePlugin; import io.spring.initializr.generator.buildsystem.gradle.StandardGradlePlugin; -import io.spring.initializr.generator.version.VersionReference; +import io.spring.initializr.generator.version.Version; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -34,7 +34,7 @@ class HibernatePluginKotlinDslGradleBuildCustomizerTests { @Test void customizerAppliesHibernateEnhancePlugin() { HibernatePluginKotlinDslGradleBuildCustomizer customizer = new HibernatePluginKotlinDslGradleBuildCustomizer( - VersionReference.ofValue("6.1.0.Final")); + Version.parse("6.1.0.Final")); GradleBuild build = new GradleBuild(); customizer.customize(build); GradlePlugin hibernatePlugin = build.plugins() From 9db75fd2cfab2147127e456677b19f51cfa1d19c Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 24 Jul 2023 18:22:48 +0000 Subject: [PATCH 071/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 688bc11130..743f55ddea 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:dd9fd041d2ff8157fbe4231f9c8e198bdd66941229c1c76708ef136472ba91a5 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5fe53d83185ff1c136f47b6fa99c7cf69b80c3a73a18400cb2b46990b4e958b5 lifecycle: preStop: exec: From 2319e283b1696b3a51bf70b6a589d14d80e59eed Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 25 Jul 2023 11:57:14 +0200 Subject: [PATCH 072/825] Stop hard-coding Hilla version in test --- .../hilla/HillaProjectGenerationConfigurationTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java index bb52f4cbcd..4460c91521 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java @@ -50,7 +50,7 @@ void mavenBuildWithoutHillaDoesNotAddProductionProfile() { void gradleBuildWithHillaConfigurePlugin() { ProjectRequest request = createProjectRequest("hilla", "data-jpa"); request.setBootVersion("3.1.0"); - assertThat(gradleBuild(request)).contains("id 'dev.hilla' version '2.1.1'"); + assertThat(gradleBuild(request)).hasPlugin("dev.hilla"); } @Test From bad3a53bf96a033594407e79d3bc5154525b39a8 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 25 Jul 2023 09:02:42 +0300 Subject: [PATCH 073/825] Upgrade to Hilla 2.1.4 See gh-1254 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index defb99c7fb..6b3d593223 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -57,7 +57,7 @@ initializr: versionProperty: hilla.version mappings: - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 2.1.1 + version: 2.1.4 solace-spring-boot: groupId: com.solace.spring.boot artifactId: solace-spring-boot-bom From 7ff8bb78071df01acf48dbeb12c419be3593baab Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 25 Jul 2023 09:01:05 +0300 Subject: [PATCH 074/825] Upgrade to Vaadin 24.1.4, 24.0.11, and 23.3.18 See gh-1255 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index defb99c7fb..82de54a7c0 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -148,11 +148,11 @@ initializr: - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.16 + version: 23.3.18 - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 24.0.9 + version: 24.0.11 - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 24.1.2 + version: 24.1.4 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From 2e7d86275487c10dca09529b78b16dba1531436f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 25 Jul 2023 10:12:34 +0000 Subject: [PATCH 075/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 743f55ddea..3e97c868d6 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5fe53d83185ff1c136f47b6fa99c7cf69b80c3a73a18400cb2b46990b4e958b5 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8f4100d20299e73ae0f8d9951ad871100df2c75fab96c2a07ace50feeb78c62d lifecycle: preStop: exec: From b9036106c1637a2d73bfe576f8169a2b0e84847b Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 25 Jul 2023 20:25:32 +0200 Subject: [PATCH 076/825] Disable GraalVM Native support with Groovy-based projects Closes gh-1103 --- ...GraalVmProjectGenerationConfiguration.java | 20 +++++++++++++++++++ ...VmProjectGenerationConfigurationTests.java | 10 +++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java index 5789cb5e9f..2081f5922e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java @@ -25,14 +25,20 @@ import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.condition.ProjectGenerationCondition; +import io.spring.initializr.generator.language.groovy.GroovyLanguage; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.site.extension.dependency.graalvm.GraalVmProjectGenerationConfiguration.CompatibleLanguageCondition; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.util.function.SingletonSupplier; /** @@ -43,6 +49,7 @@ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("native") @ConditionalOnPlatformVersion("3.0.0-M1") +@Conditional(CompatibleLanguageCondition.class) class GraalVmProjectGenerationConfiguration { private final Supplier nbtVersion; @@ -124,4 +131,17 @@ private Version determineHibernateVersion(MavenVersionResolver versionResolver) } + /** + * A {@link ProjectGenerationCondition} that match for any language that isn't Groovy. + */ + static class CompatibleLanguageCondition extends ProjectGenerationCondition { + + @Override + protected boolean matches(ProjectDescription description, ConditionContext context, + AnnotatedTypeMetadata metadata) { + return !GroovyLanguage.ID.equals(description.getLanguage().id()); + } + + } + } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index 6b5bd6144b..ce193804ec 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ import java.nio.file.Path; +import io.spring.initializr.generator.language.groovy.GroovyLanguage; import io.spring.initializr.generator.version.Version; import io.spring.initializr.versionresolver.MavenVersionResolver; import io.spring.initializr.web.project.ProjectRequest; @@ -173,6 +174,13 @@ void mavenBuildWithJpaConfigureHibernateEnhancePlugin() { // @formatter:on } + @Test + void groovyProjectDoesNotConfigureGraalVm() { + ProjectRequest request = createNativeProjectRequest("data-jpa"); + request.setLanguage(GroovyLanguage.ID); + assertThat(gradleBuild(request)).doesNotContain("graalvm").doesNotContain("org.hibernate.orm"); + } + private ProjectRequest createNativeProjectRequest(String... dependencies) { ProjectRequest projectRequest = createProjectRequest(dependencies); projectRequest.getDependencies().add(0, "native"); From 798c01a453dab609529583e89ffde34623eac7b4 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 25 Jul 2023 18:41:48 +0000 Subject: [PATCH 077/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 3e97c868d6..f23535f9b9 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8f4100d20299e73ae0f8d9951ad871100df2c75fab96c2a07ace50feeb78c62d + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8740b2246abb8d4b74ecb536694f57537981e2ace89aaa05316b444326140920 lifecycle: preStop: exec: From b4629b3502ce0743185c5596c79560513a460d70 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 25 Jul 2023 20:38:21 +0200 Subject: [PATCH 078/825] Remove Open Service Broker Closes gh-1256 --- start-site/src/main/resources/application.yml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b0cf68c465..4533289c95 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1139,23 +1139,6 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-cloud-task/docs/current/reference/html/ - - name: Spring Cloud Tools - content: - - name: Open Service Broker - id: open-service-broker - compatibilityRange: "[2.6.0,2.7.0-M1)" - description: Framework for building Spring Boot apps that implement the Open Service Broker API, which can deliver services to applications running within cloud native platforms such as Cloud Foundry, Kubernetes and OpenShift. - groupId: org.springframework.cloud - artifactId: spring-cloud-starter-open-service-broker - mappings: - - compatibilityRange: "[2.6.0,2.7.0-M1)" - version: 3.5.0 - links: - - rel: reference - href: https://docs.spring.io/spring-cloud-open-service-broker/docs/current/reference/ - - rel: guide - href: https://github.com/spring-cloud-samples/bookstore-service-broker - description: Using Spring Cloud Open Service Broker - name: Spring Cloud Config bom: spring-cloud compatibilityRange: "[2.6.0,3.2.0-M1)" From 126b21d7ca17cbbf8116a3e22effc9662037f427 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 25 Jul 2023 20:41:16 +0200 Subject: [PATCH 079/825] Upgrade to Picocli 4.7.4 Closes gh-1257 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4533289c95..5d84cc8416 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -896,7 +896,7 @@ initializr: description: Build command line applications with picocli. mappings: - compatibilityRange: "[2.6.0,3.1.0-M1)" - version: 4.7.0 + version: 4.7.4 links: - rel: reference href: https://picocli.info/#_spring_boot_example From ab13ba362d3e7267e90228b39239edee97eb8fd3 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 25 Jul 2023 18:56:44 +0000 Subject: [PATCH 080/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index f23535f9b9..cd9dd13ac7 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8740b2246abb8d4b74ecb536694f57537981e2ace89aaa05316b444326140920 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9eae099aadd21ced7d07a9161ef42d5966c9be518f292e0583ec255e552170f9 lifecycle: preStop: exec: From abe39b71355c42fd7e427b244a866bebde484e68 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 25 Jul 2023 20:55:20 +0200 Subject: [PATCH 081/825] Upgrade to Spring Cloud Services 4.0.3 Closes gh-1258 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 5d84cc8416..c7f6c8f127 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -115,8 +115,8 @@ initializr: version: 3.4.0 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 3.5.0 - - compatibilityRange: "[3.0.0,3.1.0-M1)" - version: 4.0.0 + - compatibilityRange: "[3.0.0,3.2.0-M1)" + version: 4.0.3 spring-modulith: groupId: org.springframework.modulith artifactId: spring-modulith-bom @@ -1312,7 +1312,7 @@ initializr: href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-introducing - name: VMware Tanzu Application Service bom: spring-cloud-services - compatibilityRange: "[2.6.0,3.0.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Config Client (TAS) id: scs-config-client From e8a5e43ea8ebdd273ffe0b56adba4f8c016d9190 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 25 Jul 2023 19:08:45 +0000 Subject: [PATCH 082/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index cd9dd13ac7..fd5797a4f8 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9eae099aadd21ced7d07a9161ef42d5966c9be518f292e0583ec255e552170f9 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:449b2360db88433378efe2a7ecc0c675b6cf2047c2eafa0068edb556565146e2 lifecycle: preStop: exec: From 30debf2217512cf883addac009481304b90585ec Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 26 Jul 2023 08:50:41 +0200 Subject: [PATCH 083/825] Add support for Sentry Closes gh-1114 --- start-site/src/main/resources/application.yml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c7f6c8f127..2a4ab33576 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -58,6 +58,13 @@ initializr: mappings: - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" version: 2.1.4 + sentry: + groupId: io.sentry + artifactId: sentry-bom + versionProperty: sentry.version + mappings: + - compatibilityRange: "[2.7.0,3.2.0-M1)" + version: 6.26.0 solace-spring-boot: groupId: com.solace.spring.boot artifactId: solace-spring-boot-bom @@ -941,6 +948,23 @@ initializr: links: - rel: reference href: https://codecentric.github.io/spring-boot-admin/current/#getting-started + - name: Sentry + id: sentry + bom: sentry + description: Application performance monitoring and error tracking that help software teams see clearer, solve quicker, and learn continuously. + compatibilityRange: "[2.7.0,3.2.0-M1)" + groupId: io.sentry + artifactId: sentry-spring-boot-starter-jakarta + starter: false + mappings: + - compatibilityRange: "[2.7.0,3.0.0-M1)" + artifactId: sentry-spring-boot-starter + links: + - rel: reference + href: https://docs.sentry.io/platforms/java/ + - rel: guide + href: https://docs.sentry.io/platforms/java/guides/spring-boot/ + description: Getting Started with Sentry - name: Observability content: - name: Datadog From 919b22a69152997557b95a7586bd2d4d20b6557e Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 26 Jul 2023 07:09:50 +0000 Subject: [PATCH 084/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index fd5797a4f8..5ffdb97af0 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:449b2360db88433378efe2a7ecc0c675b6cf2047c2eafa0068edb556565146e2 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:92021bc6589f7fc99804f0f470628bfe5d4703fdcd81310db86e869c9d7ba3ed lifecycle: preStop: exec: From 624d01c2ec18402881f3aaef60d2888f2e7b4a5f Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 26 Jul 2023 09:11:45 +0200 Subject: [PATCH 085/825] Run verification tests on PR Closes gh-374 --- .github/workflows/build-pull-request.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 44438d12bb..9d7fd2aab5 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -19,3 +19,5 @@ jobs: uses: actions/checkout@v3 - name: Build run: ./mvnw clean verify + - name: Run metadata verification tests + run: ./mvnw -Pverification verify From 57336d9d8975bdaf0fc148c05c6b71cf8a053325 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 26 Jul 2023 07:23:56 +0000 Subject: [PATCH 086/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 5ffdb97af0..509ae1ffe7 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:92021bc6589f7fc99804f0f470628bfe5d4703fdcd81310db86e869c9d7ba3ed + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:48fd325c3d2005ff2c79249a0c0c6570547b92b933c6d271c3f4d623997006c6 lifecycle: preStop: exec: From 980222b102161372eb9403cffa631e3db3a9b60e Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 26 Jul 2023 09:23:50 +0200 Subject: [PATCH 087/825] Use htmlsingle consistently for Spring Boot links Closes gh-460 --- start-site/src/main/resources/application.yml | 116 +++++++++--------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2a4ab33576..79704c64d3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -194,7 +194,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#using.devtools + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#using.devtools - name: Lombok id: lombok groupId: org.projectlombok @@ -211,7 +211,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#appendix.configuration-metadata.annotation-processor + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#appendix.configuration-metadata.annotation-processor - name: Docker Compose Support id: docker-compose compatibilityRange: "3.1.0-M1" @@ -222,7 +222,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#features.docker-compose + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#features.docker-compose - name: Spring Modulith id: modulith bom: spring-modulith @@ -249,7 +249,7 @@ initializr: href: https://spring.io/guides/gs/rest-service/ description: Building a RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web - rel: guide href: https://spring.io/guides/gs/serving-web-content/ description: Serving Web Content with Spring MVC @@ -267,7 +267,7 @@ initializr: href: https://spring.io/guides/gs/reactive-rest-service/ description: Building a Reactive RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.reactive + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.reactive - name: Spring for GraphQL id: graphql compatibilityRange: "2.7.0-M1" @@ -279,7 +279,7 @@ initializr: href: https://spring.io/guides/gs/graphql-server/ description: Building a GraphQL service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/html/web.html#web.graphql + href: https://docs.spring.io/spring-boot/docs/${bootVersion}/reference/htmlsinge/index.html#web.graphql - name: Rest Repositories id: data-rest facets: @@ -296,7 +296,7 @@ initializr: href: https://spring.io/guides/gs/accessing-mongodb-data-rest/ description: Accessing MongoDB Data with REST - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto.data-access.exposing-spring-data-repositories-as-rest + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#howto.data-access.exposing-spring-data-repositories-as-rest - name: Spring Session id: session groupId: org.springframework.session @@ -320,7 +320,7 @@ initializr: href: https://spring.io/guides/gs/rest-hateoas/ description: Building a Hypermedia-Driven RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.spring-hateoas + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.spring-hateoas - name: Spring Web Services id: web-services description: Facilitates contract-first SOAP development. Allows for the creation of flexible web services using one of the many ways to manipulate XML payloads. @@ -331,7 +331,7 @@ initializr: href: https://spring.io/guides/gs/producing-web-service/ description: Producing a SOAP web service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.webservices + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#io.webservices - name: Jersey id: jersey description: Framework for developing RESTful Web Services in Java that provides support for JAX-RS APIs. @@ -339,7 +339,7 @@ initializr: - json links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.jersey + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.servlet.jersey - name: Vaadin id: vaadin facets: @@ -380,19 +380,19 @@ initializr: href: https://spring.io/guides/gs/handling-form-submission/ description: Handling Form Submission - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.servlet.spring-mvc.template-engines - name: Apache Freemarker id: freemarker description: Java library to generate text output (HTML web pages, e-mails, configuration files, source code, etc.) based on templates and changing data. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.servlet.spring-mvc.template-engines - name: Mustache id: mustache description: Logic-less templates for both web and standalone environments. There are no if statements, else clauses, or for loops. Instead there are only tags. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.servlet.spring-mvc.template-engines - name: Groovy Templates id: groovy-templates description: Groovy templating engine. @@ -400,7 +400,7 @@ initializr: - web links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.servlet.spring-mvc.template-engines - name: Security content: - name: Spring Security @@ -417,32 +417,32 @@ initializr: href: https://spring.io/guides/gs/authenticating-ldap/ description: Authenticating a User with LDAP - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.security + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.security - name: OAuth2 Client id: oauth2-client description: Spring Boot integration for Spring Security's OAuth2/OpenID Connect client features. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.security.oauth2.client + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.security.oauth2.client - name: OAuth2 Authorization Server id: oauth2-authorization-server description: Spring Boot integration for Spring Authorization Server. compatibilityRange: "3.1.0-RC1" links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.security.oauth2.authorization-server + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.security.oauth2.authorization-server - name: OAuth2 Resource Server id: oauth2-resource-server description: Spring Boot integration for Spring Security's OAuth2 resource server features. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#web.security.oauth2.server + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.security.oauth2.server - name: Spring LDAP id: data-ldap description: Makes it easier to build Spring based applications that use the Lightweight Directory Access Protocol. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.ldap + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.ldap - name: Okta id: okta compatibilityRange: "[2.6.0,3.2.0-M1)" @@ -480,7 +480,7 @@ initializr: href: https://spring.io/guides/gs/managing-transactions/ description: Managing Transactions - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.sql + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.sql - name: Spring Data JPA id: data-jpa description: Persist data in SQL stores with Java Persistence API using Spring Data and Hibernate. @@ -493,7 +493,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-jpa/ description: Accessing Data with JPA - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.sql.jpa-and-spring-data + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.sql.jpa-and-spring-data - name: Spring Data JDBC id: data-jdbc description: Persist data in SQL stores with plain JDBC using Spring Data. @@ -502,7 +502,7 @@ initializr: href: https://github.com/spring-projects/spring-data-examples/tree/master/jdbc/basics description: Using Spring Data JDBC - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.sql.jdbc + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.sql.jdbc - name: Spring Data R2DBC id: data-r2dbc description: Provides Reactive Relational Database Connectivity to persist data in SQL stores using Spring Data in reactive applications. @@ -513,7 +513,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-r2dbc/ description: Accessing data with R2DBC - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.sql.r2dbc + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.sql.r2dbc - rel: home href: https://r2dbc.io description: R2DBC Homepage @@ -544,7 +544,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto.data-initialization.migration-tool.liquibase + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#howto.data-initialization.migration-tool.liquibase - name: Flyway Migration id: flyway description: Version control for your database so you can migrate from any version (incl. an empty database) to the latest version of the schema. @@ -553,13 +553,13 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto.data-initialization.migration-tool.flyway + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#howto.data-initialization.migration-tool.flyway - name: JOOQ Access Layer id: jooq description: Generate Java code from your database and build type safe SQL queries through a fluent API. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.sql.jooq + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.sql.jooq - name: IBM DB2 Driver id: db2 description: A JDBC driver that provides access to IBM DB2. @@ -639,7 +639,7 @@ initializr: href: https://spring.io/guides/gs/messaging-redis/ description: Messaging with Redis - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.redis + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.redis - name: Spring Data Reactive Redis id: data-redis-reactive description: Access Redis key-value data stores in a reactive fashion with Spring Data Redis. @@ -650,7 +650,7 @@ initializr: href: https://spring.io/guides/gs/messaging-redis/ description: Messaging with Redis - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.redis + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.redis - name: Spring Data MongoDB id: data-mongodb description: Store data in flexible, JSON-like documents, meaning fields can vary from document to document and data structure can be changed over time. @@ -659,7 +659,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-mongodb/ description: Accessing Data with MongoDB - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.mongodb + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.mongodb - name: Spring Data Reactive MongoDB id: data-mongodb-reactive description: Provides asynchronous stream processing with non-blocking back pressure for MongoDB. @@ -667,7 +667,7 @@ initializr: - reactive links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.mongodb + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.mongodb - rel: guide href: https://spring.io/guides/gs/accessing-data-mongodb/ description: Accessing Data with MongoDB @@ -676,13 +676,13 @@ initializr: description: A distributed, RESTful search and analytics engine with Spring Data Elasticsearch. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.elasticsearch + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.elasticsearch - name: Spring Data for Apache Cassandra id: data-cassandra description: A free and open-source, distributed, NoSQL database management system that offers high-scalability and high-performance. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.cassandra + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.cassandra - rel: guide href: https://spring.io/guides/gs/accessing-data-cassandra/ - name: Spring Data Reactive for Apache Cassandra @@ -692,7 +692,7 @@ initializr: - reactive links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.cassandra + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.cassandra - rel: guide href: https://spring.io/guides/gs/accessing-data-cassandra/ - name: Spring Data Couchbase @@ -700,7 +700,7 @@ initializr: description: NoSQL document-oriented database that offers in memory-first architecture, geo-distributed deployments, and workload isolation. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.couchbase + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.couchbase - name: Spring Data Reactive Couchbase id: data-couchbase-reactive description: Access Couchbase NoSQL database in a reactive fashion with Spring Data Couchbase. @@ -708,7 +708,7 @@ initializr: - reactive links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.couchbase + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.couchbase - name: Spring Data Neo4j id: data-neo4j description: An open source NoSQL database that stores data structured as graphs consisting of nodes, connected by relationships. @@ -717,7 +717,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-neo4j/ description: Accessing Data with Neo4j - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.neo4j + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.neo4j - name: Messaging content: - name: Spring Integration @@ -728,7 +728,7 @@ initializr: href: https://spring.io/guides/gs/integration/ description: Integrating Data - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.spring-integration + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.spring-integration - name: Spring for RabbitMQ id: amqp description: Gives your applications a common platform to send and receive messages, and your messages a safe place to live until received. @@ -737,7 +737,7 @@ initializr: href: https://spring.io/guides/gs/messaging-rabbitmq/ description: Messaging with RabbitMQ - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.amqp + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.amqp - name: Spring for Apache Kafka id: kafka description: Publish, subscribe, store, and process streams of records. @@ -746,7 +746,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.kafka + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.kafka - name: Spring for Apache Kafka Streams id: kafka-streams description: Building stream processing applications with Apache Kafka Streams. @@ -761,7 +761,7 @@ initializr: href: https://docs.spring.io/spring-kafka/docs/current/reference/html/#streams-kafka-streams description: Apache Kafka Streams Support - rel: reference - href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#_kafka_streams_binding_capabilities_of_spring_cloud_stream + href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsinge/index.html#_kafka_streams_binding_capabilities_of_spring_cloud_stream description: Apache Kafka Streams Binding Capabilities of Spring Cloud Stream - name: Spring for Apache ActiveMQ 5 id: activemq @@ -771,7 +771,7 @@ initializr: href: https://spring.io/guides/gs/messaging-jms/ description: Java Message Service API via Apache ActiveMQ Classic. - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.jms.activemq + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.jms.activemq - name: Spring for Apache ActiveMQ Artemis id: artemis description: Spring JMS support with Apache ActiveMQ Artemis. @@ -780,7 +780,7 @@ initializr: href: https://spring.io/guides/gs/messaging-jms/ description: Messaging with JMS - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.jms.artemis + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.jms.artemis - name: Spring for Apache Pulsar id: pulsar compatibilityRange: "[3.0.0,3.2.0-M1)" @@ -815,7 +815,7 @@ initializr: href: https://spring.io/guides/gs/messaging-stomp-websocket/ description: Using WebSocket to build an interactive web application - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#messaging.websockets + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.websockets - name: RSocket id: rsocket description: RSocket.io applications with Spring Messaging and Netty. @@ -865,13 +865,13 @@ initializr: href: https://spring.io/guides/gs/batch-processing/ description: Creating a Batch Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto.batch + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#howto.batch - name: Validation id: validation description: Bean Validation with Hibernate validator. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.validation + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#io.validation - rel: guide href: https://spring.io/guides/gs/validating-form-input/ - name: Java Mail Sender @@ -879,13 +879,13 @@ initializr: description: Send email using Java Mail and Spring Framework's JavaMailSender. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.email + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#io.email - name: Quartz Scheduler id: quartz description: Schedule jobs using Quartz. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.quartz + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#io.quartz - name: Spring cache abstraction id: cache description: Provides cache-related operations, such as the ability to update the content of the cache, but does not provide the actual data store. @@ -894,7 +894,7 @@ initializr: href: https://spring.io/guides/gs/caching/ description: Caching Data with Spring - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#io.caching + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#io.caching - name: Picocli id: picocli groupId: info.picocli @@ -927,7 +927,7 @@ initializr: href: https://spring.io/guides/gs/actuator-service/ description: Building a RESTful Web Service with Spring Boot Actuator - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator - name: codecentric's Spring Boot Admin (Client) id: codecentric-spring-boot-admin-client groupId: de.codecentric @@ -976,7 +976,7 @@ initializr: description: Publish Micrometer metrics to Datadog, a dimensional time-series SaaS with built-in dashboarding and alerting. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator.metrics.export.datadog + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator.metrics.export.datadog - name: Dynatrace id: dynatrace groupId: io.micrometer @@ -986,7 +986,7 @@ initializr: description: Publish Micrometer metrics to Dynatrace, a platform featuring observability, AIOps, application security and analytics. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.export.dynatrace + href: https://docs.spring.io/spring-boot/docs/current/reference/htmlsinge/index.html#actuator.metrics.export.dynatrace - name: Influx id: influx groupId: io.micrometer @@ -996,7 +996,7 @@ initializr: description: Publish Micrometer metrics to InfluxDB, a dimensional time-series server that support real-time stream processing of data. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator.metrics.export.influx + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator.metrics.export.influx - name: Graphite id: graphite groupId: io.micrometer @@ -1006,7 +1006,7 @@ initializr: description: Publish Micrometer metrics to Graphite, a hierarchical metrics system backed by a fixed-size database. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator.metrics.export.graphite + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator.metrics.export.graphite - name: New Relic id: new-relic groupId: io.micrometer @@ -1016,7 +1016,7 @@ initializr: description: Publish Micrometer metrics to New Relic, a SaaS offering with a full UI and a query language called NRQL. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator.metrics.export.newrelic + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator.metrics.export.newrelic - name: Prometheus id: prometheus groupId: io.micrometer @@ -1026,7 +1026,7 @@ initializr: description: Expose Micrometer metrics in Prometheus format, an in-memory dimensional time series database with a simple built-in UI, a custom query language, and math operations. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#actuator.metrics.export.prometheus + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator.metrics.export.prometheus - name: Distributed Tracing id: distributed-tracing description: Enable span and trace IDs in logs. @@ -1109,7 +1109,7 @@ initializr: scope: test links: - rel: reference - href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsingle/#features-stub-runner + href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsinge/index.html#features-stub-runner - name: Embedded LDAP Server id: unboundid-ldap description: Provides a platform neutral way for running a LDAP server in unit tests. @@ -1119,7 +1119,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.ldap.embedded + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.ldap.embedded - name: Embedded MongoDB Database id: flapdoodle-mongo compatibilityRange: "[2.6.0,3.0.0-M1)" @@ -1130,7 +1130,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.mongodb.embedded + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.mongodb.embedded - name: Spring Cloud bom: spring-cloud compatibilityRange: "[2.6.0,3.2.0-M1)" From 27997835914104df8da429c9d3fd6ac576f3e134 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 26 Jul 2023 07:37:37 +0000 Subject: [PATCH 088/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 509ae1ffe7..6ead1fc5b4 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:48fd325c3d2005ff2c79249a0c0c6570547b92b933c6d271c3f4d623997006c6 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4b30d441915501f81b1fb8ca802be1b381accf42255b90f6ee87e2a2a95a156c lifecycle: preStop: exec: From 4f2932ab93259bb22d2961abea2670f1a5aa831f Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 26 Jul 2023 09:35:55 +0200 Subject: [PATCH 089/825] Make sure derbytools is added when derby is selected Closes gh-1152 --- .../DerbyProjectGenerationConfiguration.java | 41 +++++++++++++++++++ .../dependency/derby/package-info.java | 20 +++++++++ .../main/resources/META-INF/spring.factories | 1 + ...byProjectGenerationConfigurationTests.java | 40 ++++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/derby/package-info.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfigurationTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfiguration.java new file mode 100644 index 0000000000..315255089e --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfiguration.java @@ -0,0 +1,41 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.derby; + +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Derby. + * + * @author Stephane Nicoll + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("derby") +class DerbyProjectGenerationConfiguration { + + @Bean + BuildCustomizer derbyToolsBuilderCustomizer() { + return (build) -> build.dependencies() + .add("derbytools", "org.apache.derby", "derbytools", DependencyScope.RUNTIME); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/derby/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/derby/package-info.java new file mode 100644 index 0000000000..47324302b4 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/derby/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on Derby. + */ +package io.spring.start.site.extension.dependency.derby; diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 5b483db2a0..7607e94a2a 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -4,6 +4,7 @@ io.spring.start.site.extension.build.maven.MavenProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.DependencyProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.activemq.ActiveMQProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.cassandra.CassandraProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.derby.DerbyProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.dockercompose.DockerComposeProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.elasticsearch.ElasticsearchProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.flyway.FlywayProjectGenerationConfiguration,\ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..0ba0b7be07 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/derby/DerbyProjectGenerationConfigurationTests.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.derby; + +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DerbyProjectGenerationConfiguration}. + */ +class DerbyProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void whenDerbyIsSelectedAddsDerbytools() { + assertThat(mavenPom(createProjectRequest("derby"))).hasDependency("org.apache.derby", "derbytools", null, + "runtime"); + } + + @Test + void whenDerbyIsNotSelectedDoesNotAddDerbytools() { + assertThat(mavenPom(createProjectRequest("web"))).doesNotHaveDependency("org.apache.derby", "derbytools"); + } + +} From 9557323c0cfda1da82463f4e5fc0f227a4bd619c Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 26 Jul 2023 07:49:14 +0000 Subject: [PATCH 090/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 6ead1fc5b4..bc93b13dff 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4b30d441915501f81b1fb8ca802be1b381accf42255b90f6ee87e2a2a95a156c + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9b46467fa7bb2463728fbaad303319b8e17077d1469b1892787159756bba4be2 lifecycle: preStop: exec: From b9e21151fadaec602a8e60940852a3bab22b47b3 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Wed, 26 Jul 2023 13:11:21 +0100 Subject: [PATCH 091/825] Upgrade to Spring Shell 3.1.3, 3.0.7, and 2.1.12 See gh-1259 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 79704c64d3..596cfba55b 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -137,11 +137,11 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[2.7.0,3.0.0-M1)" - version: 2.1.11 + version: 2.1.12 - compatibilityRange: "[3.0.0,3.1.0-M1)" - version: 3.0.6 + version: 3.0.7 - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 3.1.2 + version: 3.1.3 testcontainers: groupId: org.testcontainers artifactId: testcontainers-bom From 47afc5ab58323db01d122322a92f6d74f923d15c Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 26 Jul 2023 13:52:10 +0000 Subject: [PATCH 092/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index bc93b13dff..89d4d872e3 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9b46467fa7bb2463728fbaad303319b8e17077d1469b1892787159756bba4be2 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9ebe69b6225420532375093ab517e2dc95ee42e762ef4c086783dd75e9c0a029 lifecycle: preStop: exec: From a36d08f55709f154b34d39d10121e928a7ec7b52 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Sat, 29 Jul 2023 20:37:32 +0200 Subject: [PATCH 093/825] Upgrade to Camel 4.0.0-RC2 See gh-1260 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 596cfba55b..2bb6fb19fd 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -833,7 +833,7 @@ initializr: - compatibilityRange: "[2.7.0.M1,3.0.0-M1)" version: 3.20.6 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.0.0-RC1 + version: 4.0.0-RC2 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From 601ee7aad17e9614ec97adb74540417b2add2a73 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Sun, 30 Jul 2023 11:01:30 +0200 Subject: [PATCH 094/825] Avoid downloading JARs for metadata tests This commit reworks how dependencies are resolved for metadata tests using Maven Resolver, courtesy of Tamas Cservenak. See https://github.com/snicoll-scratches/MRESOLVER-362 See gh-1192 --- .../spring/start/site/DependencyResolver.java | 110 +++++------------- 1 file changed, 32 insertions(+), 78 deletions(-) diff --git a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java index 72f3f20325..90f67e470a 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java +++ b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java @@ -21,7 +21,6 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -35,8 +34,13 @@ import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.DefaultArtifact; import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.collection.CollectResult; +import org.eclipse.aether.collection.DependencyCollectionException; import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.graph.DependencyFilter; +import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.graph.DependencyVisitor; import org.eclipse.aether.impl.DefaultServiceLocator; import org.eclipse.aether.internal.impl.DefaultRepositorySystem; import org.eclipse.aether.repository.LocalRepository; @@ -45,21 +49,13 @@ import org.eclipse.aether.repository.RepositoryPolicy; import org.eclipse.aether.resolution.ArtifactDescriptorException; import org.eclipse.aether.resolution.ArtifactDescriptorRequest; -import org.eclipse.aether.resolution.ArtifactResult; -import org.eclipse.aether.resolution.DependencyRequest; -import org.eclipse.aether.resolution.DependencyResolutionException; -import org.eclipse.aether.resolution.DependencyResult; import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; -import org.eclipse.aether.spi.connector.transport.GetTask; -import org.eclipse.aether.spi.connector.transport.PeekTask; -import org.eclipse.aether.spi.connector.transport.PutTask; -import org.eclipse.aether.spi.connector.transport.Transporter; import org.eclipse.aether.spi.connector.transport.TransporterFactory; import org.eclipse.aether.spi.locator.ServiceLocator; -import org.eclipse.aether.transfer.NoTransporterException; import org.eclipse.aether.transport.http.HttpTransporterFactory; import org.eclipse.aether.util.artifact.JavaScopes; import org.eclipse.aether.util.filter.DependencyFilterUtils; +import org.eclipse.aether.util.graph.visitor.FilteringDependencyVisitor; import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy; import org.springframework.util.FileSystemUtils; @@ -124,20 +120,14 @@ static List resolveDependencies(String groupId, String artifactId, Strin List managedDependencies = instance.getManagedDependencies(boms, repositories); Dependency aetherDependency = new Dependency(new DefaultArtifact(groupId, artifactId, "pom", instance.getVersion(groupId, artifactId, version, managedDependencies)), "compile"); - CollectRequest collectRequest = new CollectRequest((org.eclipse.aether.graph.Dependency) null, - Collections.singletonList(aetherDependency), repositories); + CollectRequest collectRequest = new CollectRequest(aetherDependency, repositories); collectRequest.setManagedDependencies(managedDependencies); - DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, - DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE, JavaScopes.RUNTIME)); try { - return instance.resolveDependencies(dependencyRequest) - .getArtifactResults() - .stream() - .map(ArtifactResult::getArtifact) - .map((artifact) -> artifact.getGroupId() + ":" + artifact.getArtifactId()) - .collect(Collectors.toList()); + CollectResult result = instance.collectDependencies(collectRequest); + DependencyFilter filter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE, JavaScopes.RUNTIME); + return DependencyCollector.collect(result.getRoot(), filter); } - catch (DependencyResolutionException ex) { + catch (DependencyCollectionException ex) { throw new RuntimeException(ex); } } @@ -165,13 +155,13 @@ private List getManagedDependencies(List boms, List private Stream getManagedDependencies(String groupId, String artifactId, String version, List repositories) { String key = groupId + ":" + artifactId + ":" + version; - List managedDependencies = DependencyResolver.managedDependencies - .computeIfAbsent(key, (coords) -> resolveManagedDependencies(groupId, artifactId, version, repositories)); + List managedDependencies = DependencyResolver.managedDependencies.computeIfAbsent(key, + (coords) -> resolveManagedDependencies(groupId, artifactId, version, repositories)); return managedDependencies.stream(); } - private List resolveManagedDependencies(String groupId, String artifactId, - String version, List repositories) { + private List resolveManagedDependencies(String groupId, String artifactId, String version, + List repositories) { try { return this.repositorySystem .readArtifactDescriptor(this.repositorySystemSession, @@ -184,19 +174,15 @@ private List resolveManagedDependencies(Str } } - private DependencyResult resolveDependencies(DependencyRequest dependencyRequest) - throws DependencyResolutionException { - DependencyResult resolved = this.repositorySystem.resolveDependencies(this.repositorySystemSession, - dependencyRequest); - return resolved; + private CollectResult collectDependencies(CollectRequest dependencyRequest) throws DependencyCollectionException { + return this.repositorySystem.collectDependencies(this.repositorySystemSession, dependencyRequest); } - private String getVersion(String groupId, String artifactId, String version, - List managedDependencies) { + private String getVersion(String groupId, String artifactId, String version, List managedDependencies) { if (version != null) { return version; } - for (org.eclipse.aether.graph.Dependency managedDependency : managedDependencies) { + for (Dependency managedDependency : managedDependencies) { if (groupId.equals(managedDependency.getArtifact().getGroupId()) && artifactId.equals(managedDependency.getArtifact().getArtifactId())) { return managedDependency.getArtifact().getVersion(); @@ -209,61 +195,29 @@ private static ServiceLocator createServiceLocator() { DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); locator.addService(RepositorySystem.class, DefaultRepositorySystem.class); locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); - locator.addService(TransporterFactory.class, DependencyResolver.JarSkippingHttpTransporterFactory.class); + locator.addService(TransporterFactory.class, HttpTransporterFactory.class); return locator; } - private static class JarSkippingHttpTransporterFactory implements TransporterFactory { + static class DependencyCollector implements DependencyVisitor { - private final HttpTransporterFactory delegate = new HttpTransporterFactory(); + private final List dependencies = new ArrayList<>(); - @Override - public Transporter newInstance(RepositorySystemSession session, RemoteRepository repository) - throws NoTransporterException { - return new JarGetSkippingTransporter(this.delegate.newInstance(session, repository)); + static List collect(DependencyNode node, DependencyFilter filter) { + DependencyCollector collector = new DependencyCollector(); + node.accept(new FilteringDependencyVisitor(collector, filter)); + return collector.dependencies; } @Override - public float getPriority() { - return 5.0f; + public boolean visitEnter(DependencyNode node) { + return this.dependencies.add(node.getDependency().getArtifact().getGroupId() + ":" + + node.getDependency().getArtifact().getArtifactId()); } - private static final class JarGetSkippingTransporter implements Transporter { - - private final Transporter delegate; - - private JarGetSkippingTransporter(Transporter delegate) { - this.delegate = delegate; - } - - @Override - public int classify(Throwable error) { - return this.delegate.classify(error); - } - - @Override - public void peek(PeekTask task) throws Exception { - this.delegate.peek(task); - } - - @Override - public void get(GetTask task) throws Exception { - if (task.getLocation().getPath().endsWith(".jar")) { - return; - } - this.delegate.get(task); - } - - @Override - public void put(PutTask task) throws Exception { - this.delegate.put(task); - } - - @Override - public void close() { - this.delegate.close(); - } - + @Override + public boolean visitLeave(DependencyNode node) { + return true; } } From bb68ba611b641d4b377af42c6766a1b0f6b203df Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Sun, 30 Jul 2023 11:16:08 +0200 Subject: [PATCH 095/825] Use Maven Resolver version provided by Initializr This reverts the downgrade to a previous version of Maven Resolver as the underlying issue has been fixed. Closes gh-1192 --- start-site-verification/pom.xml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/start-site-verification/pom.xml b/start-site-verification/pom.xml index 911947c8e8..6d15809c9a 100644 --- a/start-site-verification/pom.xml +++ b/start-site-verification/pom.xml @@ -11,10 +11,6 @@ start-site-verification start.spring.io website verification - - 1.8.2 - - io.spring.start @@ -34,21 +30,6 @@ - - - - org.apache.maven.resolver - maven-resolver-connector-basic - ${maven-resolver.version} - - - org.apache.maven.resolver - maven-resolver-transport-http - ${maven-resolver.version} - - - - From 0e01c5345afa6914b8285fd4b287e2632aa43619 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Sun, 30 Jul 2023 11:18:49 +0200 Subject: [PATCH 096/825] Upgrade to Spring Cloud 2022.0.4 Closes gh-1261 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2bb6fb19fd..baab725129 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -92,7 +92,7 @@ initializr: - compatibilityRange: "[2.6.0,3.0.0)" version: 2021.0.8 - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 2022.0.3 + version: 2022.0.4 spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies From 0ace8aeb4d5c93b076438431d30ede04cf5d8503 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Sun, 30 Jul 2023 09:31:10 +0000 Subject: [PATCH 097/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 89d4d872e3..c059bfbff6 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9ebe69b6225420532375093ab517e2dc95ee42e762ef4c086783dd75e9c0a029 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4f38be38267dae1968432fa602a697dcf8e79092a2f3e71ee5320f51ba705179 lifecycle: preStop: exec: From cea6622e8fc9b6af21cdb010174da51c4c20e613 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Sun, 30 Jul 2023 11:49:32 +0200 Subject: [PATCH 098/825] Configure RepositoryPolicy for both releases and snapshots Closes gh-692 --- .../io/spring/start/site/DependencyResolver.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java index 90f67e470a..a94286769d 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java +++ b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java @@ -70,9 +70,6 @@ final class DependencyResolver { return instance; }); - private static final RepositoryPolicy repositoryPolicy = new RepositoryPolicy(true, - RepositoryPolicy.UPDATE_POLICY_NEVER, RepositoryPolicy.CHECKSUM_POLICY_IGNORE); - static final RemoteRepository mavenCentral = createRemoteRepository("central", "https://repo1.maven.org/maven2", false); @@ -103,14 +100,15 @@ final class DependencyResolver { } } + private static RepositoryPolicy repositoryPolicy(boolean enabled) { + return new RepositoryPolicy(enabled, RepositoryPolicy.UPDATE_POLICY_NEVER, + RepositoryPolicy.CHECKSUM_POLICY_IGNORE); + } + static RemoteRepository createRemoteRepository(String id, String url, boolean snapshot) { Builder repositoryBuilder = new Builder(id, "default", url); - if (snapshot) { - repositoryBuilder.setSnapshotPolicy(repositoryPolicy); - } - else { - repositoryBuilder.setReleasePolicy(repositoryPolicy); - } + repositoryBuilder.setSnapshotPolicy(repositoryPolicy(snapshot)); + repositoryBuilder.setReleasePolicy(repositoryPolicy(!snapshot)); return repositoryBuilder.build(); } From 4e7d3ebdc0fc23e1e74d1858264efe7e6d4b8129 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Sun, 30 Jul 2023 12:22:13 +0200 Subject: [PATCH 099/825] Polish "Use Maven Resolver version provided by Initializr" This revisits the upgrade to make sure optional dependencies are not considered. See gh-1192 --- .../spring/start/site/DependencyResolver.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java index a94286769d..025fe5f38e 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java +++ b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java @@ -122,8 +122,7 @@ static List resolveDependencies(String groupId, String artifactId, Strin collectRequest.setManagedDependencies(managedDependencies); try { CollectResult result = instance.collectDependencies(collectRequest); - DependencyFilter filter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE, JavaScopes.RUNTIME); - return DependencyCollector.collect(result.getRoot(), filter); + return DependencyCollector.collect(result.getRoot(), RuntimeTransitiveOnlyDependencyFilter.INSTANCE); } catch (DependencyCollectionException ex) { throw new RuntimeException(ex); @@ -220,4 +219,18 @@ public boolean visitLeave(DependencyNode node) { } + static class RuntimeTransitiveOnlyDependencyFilter implements DependencyFilter { + + private static final RuntimeTransitiveOnlyDependencyFilter INSTANCE = new RuntimeTransitiveOnlyDependencyFilter(); + + private final DependencyFilter runtimeFilter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE, + JavaScopes.RUNTIME); + + @Override + public boolean accept(DependencyNode node, List parents) { + return !node.getDependency().isOptional() && this.runtimeFilter.accept(node, parents); + } + + } + } From 725a5af59941df125d38775a7ba1fa3c30935eb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 30 Jul 2023 21:07:25 -0600 Subject: [PATCH 100/825] Add support for Testcontainers Solace module This commit adds the solace module for Testcontainers if Testcontainers and Solace are selected. Note that it does not add support for connection details as Solace does not implement them at the moment. See gh-1262 --- .../testcontainers/TestcontainersModuleRegistry.java | 2 ++ .../TestcontainersProjectGenerationConfigurationTests.java | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index caf5a98c1e..43749a5887 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -71,6 +71,8 @@ static Iterable create() { .customizeHelpDocument(addReferenceLink("Postgres Module", "databases/postgres/")), onDependencies("pulsar", "pulsar-reactive").customizeBuild(addModule("pulsar")) .customizeHelpDocument(addReferenceLink("Pulsar Module", "pulsar/")), + onDependencies("solace").customizeBuild(addModule("solace")) + .customizeHelpDocument(addReferenceLink("Solace Module", "solace/")), onDependencies("sqlserver").customizeBuild(addModule("mssqlserver")) .customizeHelpDocument(addReferenceLink("MS SQL Server Module", "databases/mssqlserver/"))); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 3288cc20a1..f233a2d6e7 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -69,7 +69,8 @@ static Stream supportedEntriesBuild() { Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mariadb", "mariadb"), Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), Arguments.arguments("oracle", "oracle-xe"), Arguments.arguments("pulsar", "pulsar"), - Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("sqlserver", "mssqlserver")); + Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), + Arguments.arguments("sqlserver", "mssqlserver")); } @ParameterizedTest @@ -102,7 +103,7 @@ static Stream supportedEntriesHelpDocument() { Arguments.arguments("mariadb", "databases/mariadb/"), Arguments.arguments("mysql", "databases/mysql/"), Arguments.arguments("oracle", "databases/oraclexe/"), Arguments.arguments("postgresql", "databases/postgres/"), Arguments.arguments("pulsar", "pulsar/"), - Arguments.arguments("pulsar-reactive", "pulsar/"), + Arguments.arguments("pulsar-reactive", "pulsar/"), Arguments.arguments("solace", "solace/"), Arguments.arguments("sqlserver", "databases/mssqlserver/")); } From b8d9c6f47ed6d78a93813e70369c5f17eaa9f5c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 30 Jul 2023 21:10:57 -0600 Subject: [PATCH 101/825] Fix testcontainers module location in HELP.md This commit applies the new location for Testcontainers module. See gh-1263 --- .../testcontainers/TestcontainersModuleRegistry.java | 2 +- ...pringIntegrationProjectGenerationConfigurationTests.java | 2 +- .../TestcontainersProjectGenerationConfigurationTests.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 43749a5887..4f231ed0ef 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -93,7 +93,7 @@ private static Consumer addModule(String id) { private static Consumer addReferenceLink(String name, String modulePath) { return (helpDocument) -> { - String href = String.format("https://www.testcontainers.org/modules/%s", modulePath); + String href = String.format("https://java.testcontainers.org/modules/%s", modulePath); String description = String.format("Testcontainers %s Reference Guide", name); helpDocument.gettingStarted().addReferenceDocLink(href, description); }; diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java index ea2193d2e7..08fcd72808 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java @@ -101,7 +101,7 @@ static Stream referenceLinks() { @Test void linkToSupportedEntriesWhenTwoMatchesArePresentOnlyAddLinkOnce() { assertHelpDocument("testcontainers", "data-mongodb", "data-mongodb-reactive") - .containsOnlyOnce("https://www.testcontainers.org/modules/databases/mongodb/"); + .containsOnlyOnce("https://java.testcontainers.org/modules/databases/mongodb/"); } private static Dependency integrationDependency(String id) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index f233a2d6e7..c745b568ad 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -77,13 +77,13 @@ static Stream supportedEntriesBuild() { @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsPresentIsAdded(String dependencyId, String docHref) { assertHelpDocument("3.0.0", "testcontainers", dependencyId) - .contains("https://www.testcontainers.org/modules/" + docHref); + .contains("https://java.testcontainers.org/modules/" + docHref); } @ParameterizedTest @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsNotPresentIsNotAdded(String dependencyId, String docHref) { - assertHelpDocument("3.0.0", dependencyId).doesNotContain("https://www.testcontainers.org/modules/" + docHref); + assertHelpDocument("3.0.0", dependencyId).doesNotContain("https://java.testcontainers.org/modules/" + docHref); } static Stream supportedEntriesHelpDocument() { @@ -110,7 +110,7 @@ static Stream supportedEntriesHelpDocument() { @Test void linkToSupportedEntriesWhenTwoMatchesArePresentOnlyAddLinkOnce() { assertHelpDocument("3.0.0", "testcontainers", "data-mongodb", "data-mongodb-reactive") - .containsOnlyOnce("https://www.testcontainers.org/modules/databases/mongodb/"); + .containsOnlyOnce("https://java.testcontainers.org/modules/databases/mongodb/"); } @Test From 5069af784bfbf98c2fe0bdf6f3ec5310901ca557 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 31 Jul 2023 12:22:35 +0200 Subject: [PATCH 102/825] Polish "Fix testcontainers module location in HELP.md" See gh-1263 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index baab725129..f9f1655a7a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1087,7 +1087,7 @@ initializr: bom: testcontainers links: - rel: reference - href: https://www.testcontainers.org/ + href: https://java.testcontainers.org/ - name: Contract Verifier bom: spring-cloud id: cloud-contract-verifier From 0eb60fedce75bdeeac57c69d343b5ff493c6d3f3 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 31 Jul 2023 10:32:11 +0000 Subject: [PATCH 103/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index c059bfbff6..fd4b0c295e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4f38be38267dae1968432fa602a697dcf8e79092a2f3e71ee5320f51ba705179 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8d0c53eff7fbb8770c774e9e4443f1571667d4305b88ba512d966e1b879d4556 lifecycle: preStop: exec: From cc467a74e607c6b335b98490f56ba31b7a95c841 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 31 Jul 2023 10:36:28 +0000 Subject: [PATCH 104/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index fd4b0c295e..3e96d4e6d7 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8d0c53eff7fbb8770c774e9e4443f1571667d4305b88ba512d966e1b879d4556 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:aa6e346a8812f6d26be3fee7054045f6448e1f5061624d01e240d44fb668b350 lifecycle: preStop: exec: From 300b65bdb046cd2e0422b4185e47a0c89e31cb47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 30 Jul 2023 21:42:16 -0600 Subject: [PATCH 105/825] Include Oracle flyway dependency with Flyway and Oracle Now that the Oracle support is in a separate extension, we need to add this new dependency when Oracle and Flyway are selected with Spring Boot 3.2.0-M1 or later. See gh-1265 --- .../flyway/FlywayBuildCustomizer.java | 12 ++++++++++- .../flyway/FlywayBuildCustomizerTests.java | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java index 0cf05aa416..9fa2c621db 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java @@ -34,16 +34,21 @@ class FlywayBuildCustomizer implements BuildCustomizer { private static final VersionRange SPRING_BOOT_2_7_0_OR_LATER = VersionParser.DEFAULT.parseRange("2.7.0"); + private static final VersionRange SPRING_BOOT_3_2_M1_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0-M1"); + private final boolean isSpringBoot27OrLater; + private final boolean isSpringBoot32OrLater; + FlywayBuildCustomizer(ProjectDescription projectDescription) { this.isSpringBoot27OrLater = SPRING_BOOT_2_7_0_OR_LATER.match(projectDescription.getPlatformVersion()); + this.isSpringBoot32OrLater = SPRING_BOOT_3_2_M1_OR_LATER.match(projectDescription.getPlatformVersion()); } @Override public void customize(Build build) { + DependencyContainer dependencies = build.dependencies(); if (this.isSpringBoot27OrLater) { - DependencyContainer dependencies = build.dependencies(); if ((dependencies.has("mysql") || dependencies.has("mariadb"))) { dependencies.add("flyway-mysql", "org.flywaydb", "flyway-mysql", DependencyScope.COMPILE); } @@ -51,6 +56,11 @@ public void customize(Build build) { dependencies.add("flyway-sqlserver", "org.flywaydb", "flyway-sqlserver", DependencyScope.COMPILE); } } + if (this.isSpringBoot32OrLater) { + if (dependencies.has("oracle")) { + dependencies.add("flyway-oracle", "org.flywaydb", "flyway-database-oracle", DependencyScope.COMPILE); + } + } } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java index 43c6b07619..774c336785 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java @@ -50,6 +50,13 @@ void sqlserverOnly() { .doesNotHaveDependency("org.flywaydb", "flyway-sqlserver"); } + @Test + void oracleOnly() { + ProjectRequest projectRequest = createProject("3.2.0-M1", "oracle"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("oracle")) + .doesNotHaveDependency("org.flywaydb", "flyway-database-oracle"); + } + @Test void mariadbAndFlywayPreviousTo270() { ProjectRequest projectRequest = createProject("2.6.0", "mariadb", "flyway"); @@ -71,6 +78,13 @@ void sqlserverAndFlywayPreviousTo270() { .doesNotHaveDependency("org.flywaydb", "flyway-sqlserver"); } + @Test + void oracleAndFlywayPreviousTo32M1() { + ProjectRequest projectRequest = createProject("3.1.0", "oracle", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("oracle")) + .doesNotHaveDependency("org.flywaydb", "flyway-database-oracle"); + } + @Test void mariadbAndFlyway() { ProjectRequest projectRequest = createProject("2.7.0", "mariadb", "flyway"); @@ -92,6 +106,13 @@ void sqlserverAndFlyway() { .hasDependency("org.flywaydb", "flyway-sqlserver"); } + @Test + void oracleAndFlyway() { + ProjectRequest projectRequest = createProject("3.2.0-M1", "oracle", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("oracle")) + .hasDependency("org.flywaydb", "flyway-database-oracle"); + } + private ProjectRequest createProject(String springBootVersion, String... styles) { ProjectRequest projectRequest = createProjectRequest(styles); projectRequest.setLanguage("java"); From 44022d0036f63bb9798f118882cb7ed56a446309 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 31 Jul 2023 12:33:02 +0200 Subject: [PATCH 106/825] Upgrade copyright year of changed file See gh-1265 --- .../site/extension/dependency/flyway/FlywayBuildCustomizer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java index 9fa2c621db..c0b5e38fcf 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From cd4faf72747fb2b80cb583e78796ec205d8f1e1a Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 31 Jul 2023 10:51:52 +0000 Subject: [PATCH 107/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 3e96d4e6d7..06c2e01fa8 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:aa6e346a8812f6d26be3fee7054045f6448e1f5061624d01e240d44fb668b350 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:45ed8089f1ae46fe49180d6abba53d2b4952a19ad57b864ebfe3576a81012229 lifecycle: preStop: exec: From 3efd14baf612af78e1e8d98d5c59697332a5677a Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 31 Jul 2023 15:52:15 +0200 Subject: [PATCH 108/825] Use dedicated constructor for creating containers Closes gh-1266 --- ...nersApplicationCodeProjectContributor.java | 9 ++++--- ...nersApplicationCodeProjectContributor.java | 9 ++++--- ...nersApplicationCodeProjectContributor.java | 7 +++--- ...nersApplicationCodeProjectContributor.java | 8 ++++++ ...rsProjectGenerationConfigurationTests.java | 25 +++++++++++-------- 5 files changed, 36 insertions(+), 22 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java index 0f1a5968f3..cee6236a48 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java @@ -85,18 +85,19 @@ private GroovyMethodDeclaration usingGenericContainer(String methodName, String String portsParameter = Arrays.stream(ports).mapToObj(String::valueOf).collect(Collectors.joining(", ")); GroovyMethodDeclaration method = GroovyMethodDeclaration.method(methodName) .returning("GenericContainer") - .body(CodeBlock.ofStatement("new $T<>($S).withExposedPorts($L)", - "org.testcontainers.containers.GenericContainer", imageId, portsParameter)); + .body(CodeBlock.ofStatement("new $T<>($L).withExposedPorts($L)", + "org.testcontainers.containers.GenericContainer", generatedDockerImageNameCode(imageId), + portsParameter)); annotateContainerMethod(method, connectionName); return method; } private GroovyMethodDeclaration usingSpecificContainer(String methodName, String imageId, String containerClassName, boolean containerClassNameGeneric) { - String statementFormat = containerClassNameGeneric ? "new $T<>($S)" : "new $T(\"$L\")"; + String statementFormat = containerClassNameGeneric ? "new $T<>($L)" : "new $T($L)"; GroovyMethodDeclaration method = GroovyMethodDeclaration.method(methodName) .returning(containerClassName) - .body(CodeBlock.ofStatement(statementFormat, containerClassName, imageId)); + .body(CodeBlock.ofStatement(statementFormat, containerClassName, generatedDockerImageNameCode(imageId))); annotateContainerMethod(method, null); return method; } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java index 6f542d5ca8..774cf4ac3c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java @@ -84,8 +84,9 @@ private JavaMethodDeclaration usingGenericContainer(String methodName, String im String portsParameter = Arrays.stream(ports).mapToObj(String::valueOf).collect(Collectors.joining(", ")); JavaMethodDeclaration method = JavaMethodDeclaration.method(methodName) .returning("GenericContainer") - .body(CodeBlock.ofStatement("return new $T<>($S).withExposedPorts($L)", - "org.testcontainers.containers.GenericContainer", imageId, portsParameter)); + .body(CodeBlock.ofStatement("return new $T<>($L).withExposedPorts($L)", + "org.testcontainers.containers.GenericContainer", generatedDockerImageNameCode(imageId), + portsParameter)); annotateContainerMethod(method, connectionName); return method; } @@ -94,10 +95,10 @@ private JavaMethodDeclaration usingSpecificContainer(String methodName, String i boolean containerClassNameGeneric) { String returnType = (containerClassNameGeneric) ? ClassUtils.getShortName(containerClassName) + "" : containerClassName; - String statementFormat = (containerClassNameGeneric) ? "return new $T<>($S)" : "return new $T(\"$L\")"; + String statementFormat = (containerClassNameGeneric) ? "return new $T<>($L)" : "return new $T($L)"; JavaMethodDeclaration method = JavaMethodDeclaration.method(methodName) .returning(returnType) - .body(CodeBlock.ofStatement(statementFormat, containerClassName, imageId)); + .body(CodeBlock.ofStatement(statementFormat, containerClassName, generatedDockerImageNameCode(imageId))); annotateContainerMethod(method, null); return method; } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java index 6bff25799a..715d462022 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java @@ -88,8 +88,9 @@ private KotlinFunctionDeclaration usingGenericContainer(String functionName, Str String portsParameter = Arrays.stream(ports).mapToObj(String::valueOf).collect(Collectors.joining(", ")); KotlinFunctionDeclaration method = KotlinFunctionDeclaration.function(functionName) .returning("GenericContainer<*>") - .body(CodeBlock.ofStatement("return $T($S).withExposedPorts($L)", - "org.testcontainers.containers.GenericContainer", imageId, portsParameter)); + .body(CodeBlock.ofStatement("return $T($L).withExposedPorts($L)", + "org.testcontainers.containers.GenericContainer", generatedDockerImageNameCode(imageId), + portsParameter)); annotateContainerMethod(method, connectionName); return method; } @@ -100,7 +101,7 @@ private KotlinFunctionDeclaration usingSpecificContainer(String functionName, St : containerClassName; KotlinFunctionDeclaration method = KotlinFunctionDeclaration.function(functionName) .returning(returnType) - .body(CodeBlock.ofStatement("return $T($S)", containerClassName, imageId)); + .body(CodeBlock.ofStatement("return $T($L)", containerClassName, generatedDockerImageNameCode(imageId))); annotateContainerMethod(method, null); return method; } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java index 3bc1983643..6e5667c39e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java @@ -23,6 +23,7 @@ import io.spring.initializr.generator.language.Annotatable; import io.spring.initializr.generator.language.ClassName; +import io.spring.initializr.generator.language.CodeBlock; import io.spring.initializr.generator.language.CompilationUnit; import io.spring.initializr.generator.language.SourceCode; import io.spring.initializr.generator.language.SourceCodeWriter; @@ -51,6 +52,9 @@ abstract class TestContainersApplicationCodeProjectContributor("redis:latest").withExposedPorts(6379) + new GenericContainer<>(DockerImageName.parse("redis:latest")).withExposedPorts(6379) } static void main(String[] args) { @@ -188,6 +188,7 @@ void testApplicationWithJavaAndGenericContainerIsContributed() { import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; import org.testcontainers.containers.GenericContainer; + import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) public class TestDemoApplication { @@ -195,7 +196,7 @@ public class TestDemoApplication { @Bean @ServiceConnection(name = "redis") GenericContainer redisContainer() { - return new GenericContainer<>("redis:latest").withExposedPorts(6379); + return new GenericContainer<>(DockerImageName.parse("redis:latest")).withExposedPorts(6379); } public static void main(String[] args) { @@ -207,7 +208,6 @@ public static void main(String[] args) { } @Test - @Disabled void testApplicationWithKotlinAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); request.setBootVersion("3.1.1"); @@ -222,14 +222,15 @@ void testApplicationWithKotlinAndGenericContainerIsContributed() { import org.springframework.boot.with import org.springframework.context.annotation.Bean import org.testcontainers.containers.GenericContainer + import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - public class TestDemoApplication { + class TestDemoApplication { @Bean @ServiceConnection(name = "redis") fun redisContainer(): GenericContainer<*> { - return GenericContainer("redis:latest").withExposedPorts(6379) + return GenericContainer(DockerImageName.parse("redis:latest")).withExposedPorts(6379) } } @@ -254,6 +255,7 @@ void testApplicationWithGroovyAndSpecificContainerIsContributed() { import org.springframework.boot.testcontainers.service.connection.ServiceConnection import org.springframework.context.annotation.Bean import org.testcontainers.containers.CassandraContainer + import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) class TestDemoApplication { @@ -261,7 +263,7 @@ class TestDemoApplication { @Bean @ServiceConnection CassandraContainer cassandraContainer() { - new CassandraContainer<>("cassandra:latest") + new CassandraContainer<>(DockerImageName.parse("cassandra:latest")) } static void main(String[] args) { @@ -286,6 +288,7 @@ void testApplicationWithJavaAndSpecificContainerIsContributed() { import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; import org.testcontainers.containers.CassandraContainer; + import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) public class TestDemoApplication { @@ -293,7 +296,7 @@ public class TestDemoApplication { @Bean @ServiceConnection CassandraContainer cassandraContainer() { - return new CassandraContainer<>("cassandra:latest"); + return new CassandraContainer<>(DockerImageName.parse("cassandra:latest")); } public static void main(String[] args) { @@ -305,7 +308,6 @@ public static void main(String[] args) { } @Test - @Disabled void testApplicationWithKotlinAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); request.setBootVersion("3.1.1"); @@ -320,14 +322,15 @@ void testApplicationWithKotlinAndSpecificContainerIsContributed() { import org.springframework.boot.with import org.springframework.context.annotation.Bean import org.testcontainers.containers.CassandraContainer + import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - public class TestDemoApplication { + class TestDemoApplication { @Bean @ServiceConnection fun cassandraContainer(): CassandraContainer<*> { - return CassandraContainer("cassandra:latest") + return CassandraContainer(DockerImageName.parse("cassandra:latest")) } } From 1808a0aaea64524083750f3243760b4f42f9191d Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 31 Jul 2023 16:01:18 +0200 Subject: [PATCH 109/825] Add support for Kafka container Closes gh-1226 --- .../SimpleDockerServiceResolver.java | 6 +++ ...endencyProjectGenerationConfiguration.java | 6 --- .../SpringKafkaBuildCustomizer.java | 11 ++--- ...ngKafkaProjectGenerationConfiguration.java | 49 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 1 + ...aProjectGenerationConfigurationTests.java} | 4 +- 6 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java rename start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/{SpringKafkaBuildCustomizerTests.java => SpringKafkaProjectGenerationConfigurationTests.java} (92%) diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index a6d6ff1a64..f81853f084 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -35,6 +35,7 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("activeMQ", activeMQ()); this.dockerServices.put("cassandra", cassandra()); this.dockerServices.put("elasticsearch", elasticsearch()); + this.dockerServices.put("kafka", kafka()); this.dockerServices.put("mariaDb", mariaDb()); this.dockerServices.put("mongoDb", mongoDb()); this.dockerServices.put("mysql", mysql()); @@ -60,6 +61,11 @@ private static DockerService elasticsearch() { "https://www.docker.elastic.co/r/elasticsearch", 9200, 9300); } + private static DockerService kafka() { + return new DockerService("confluentinc/cp-kafka", "latest", "https://hub.docker.com/r/confluentinc/cp-kafka", + 9092); + } + private static DockerService mariaDb() { return new DockerService("mariadb", "latest", "https://hub.docker.com/_/mariadb", 3306); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java index 45c13da2d8..d3671ac0f8 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java @@ -30,7 +30,6 @@ import io.spring.start.site.extension.dependency.okta.OktaHelpDocumentCustomizer; import io.spring.start.site.extension.dependency.reactor.ReactorTestBuildCustomizer; import io.spring.start.site.extension.dependency.springbatch.SpringBatchTestBuildCustomizer; -import io.spring.start.site.extension.dependency.springkafka.SpringKafkaBuildCustomizer; import io.spring.start.site.extension.dependency.springsecurity.SpringSecurityRSocketBuildCustomizer; import io.spring.start.site.extension.dependency.springsecurity.SpringSecurityTestBuildCustomizer; import io.spring.start.site.extension.dependency.springsession.SpringSessionBuildCustomizer; @@ -87,11 +86,6 @@ public LombokGradleBuildCustomizer lombokGradleBuildCustomizer() { return new LombokGradleBuildCustomizer(this.metadata); } - @Bean - public SpringKafkaBuildCustomizer springKafkaBuildCustomizer() { - return new SpringKafkaBuildCustomizer(); - } - @Bean @ConditionalOnRequestedDependency("session") public SpringSessionBuildCustomizer springSessionBuildCustomizer() { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizer.java index e06dd509c6..adb2b72535 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizer.java @@ -29,15 +29,14 @@ * @author Stephane Nicoll * @author Madhura Bhave */ -public class SpringKafkaBuildCustomizer implements BuildCustomizer { +class SpringKafkaBuildCustomizer implements BuildCustomizer { @Override public void customize(Build build) { - if (build.dependencies().has("kafka")) { - build.dependencies() - .add("spring-kafka-test", Dependency.withCoordinates("org.springframework.kafka", "spring-kafka-test") - .scope(DependencyScope.TEST_COMPILE)); - } + build.dependencies() + .add("spring-kafka-test", Dependency.withCoordinates("org.springframework.kafka", "spring-kafka-test") + .scope(DependencyScope.TEST_COMPILE)); + } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java new file mode 100644 index 0000000000..af981eb215 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java @@ -0,0 +1,49 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springkafka; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring Kafka. + * + * @author Stephane Nicoll + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("kafka") +class SpringKafkaProjectGenerationConfiguration { + + @Bean + SpringKafkaBuildCustomizer springKafkaBuildCustomizer() { + return new SpringKafkaBuildCustomizer(); + } + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer kafkaServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("kafka", + (service) -> serviceConnections.addServiceConnection(ServiceConnection.ofContainer("kafka", service, + "org.testcontainers.containers.KafkaContainer", false))); + } + +} diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 7607e94a2a..46689d7dcb 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -26,6 +26,7 @@ io.spring.start.site.extension.dependency.springboot.SpringBootProjectGeneration io.spring.start.site.extension.dependency.springcloud.SpringCloudProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springdata.SpringDataProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springintegration.SpringIntegrationProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springkafka.SpringKafkaProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springmodulith.SpringModulithProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springpulsar.SpringPulsarProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springrestdocs.SpringRestDocsProjectGenerationConfiguration,\ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfigurationTests.java similarity index 92% rename from start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizerTests.java rename to start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfigurationTests.java index 846e923bcb..cbf3adb08c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfigurationTests.java @@ -24,12 +24,12 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link SpringKafkaBuildCustomizer}. + * Tests for {@link SpringKafkaProjectGenerationConfiguration}. * * @author Wonwoo Lee * @author Stephane Nicoll */ -class SpringKafkaBuildCustomizerTests extends AbstractExtensionTests { +class SpringKafkaProjectGenerationConfigurationTests extends AbstractExtensionTests { @Test void springKafkaTestIsAdded() { From f8238b401f755344d4adb50a1eb50c85b59dc636 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 31 Jul 2023 14:18:05 +0000 Subject: [PATCH 110/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 06c2e01fa8..1f92527c6e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:45ed8089f1ae46fe49180d6abba53d2b4952a19ad57b864ebfe3576a81012229 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:788825bff6bf01628cca9984c952eff4757cfe7d4a354d965f2908d758e67cbb lifecycle: preStop: exec: From 5352d48fe24423ecc691f7918567a8db111e3a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 30 Jul 2023 21:19:05 -0600 Subject: [PATCH 111/825] Add Testcontainers GCloud module when GCP is selected Testcontainers offers a GCloud module where `PubSubEmulatorContainer` can be found and be used for testing. See gh-1264 --- .../testcontainers/TestcontainersModuleRegistry.java | 4 ++++ .../TestcontainersProjectGenerationConfigurationTests.java | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 4f231ed0ef..1a2da2dd5d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -41,6 +41,10 @@ static Iterable create() { return create( onDependencies("amqp").customizeBuild(addModule("rabbitmq")) .customizeHelpDocument(addReferenceLink("RabbitMQ Module", "rabbitmq/")), + onDependencies("cloud-gcp").customizeBuild(addModule("gcloud")) + .customizeHelpDocument(addReferenceLink("GCloud Module", "gcloud/")), + onDependencies("cloud-gcp-pubsub").customizeBuild(addModule("gcloud")) + .customizeHelpDocument(addReferenceLink("GCloud Module", "gcloud/")), onDependencies("cloud-starter-consul-config").customizeBuild(addModule("consul")) .customizeHelpDocument(addReferenceLink("Consul Module", "consul/")), onDependencies("cloud-starter-vault-config").customizeBuild(addModule("vault")) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index a7c4909686..fd87356cb0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -57,7 +57,8 @@ void buildWithSupportedEntries(String springBootDependencyId, String testcontain } static Stream supportedEntriesBuild() { - return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.arguments("data-cassandra", "cassandra"), + return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.arguments("cloud-gcp", "gcloud"), + Arguments.arguments("cloud-gcp-pubsub", "gcloud"), Arguments.arguments("data-cassandra", "cassandra"), Arguments.arguments("data-cassandra-reactive", "cassandra"), Arguments.arguments("data-couchbase", "couchbase"), Arguments.arguments("data-couchbase-reactive", "couchbase"), @@ -86,7 +87,8 @@ void linkToSupportedEntriesWhenTestContainerIsNotPresentIsNotAdded(String depend } static Stream supportedEntriesHelpDocument() { - return Stream.of(Arguments.arguments("amqp", "rabbitmq/"), + return Stream.of(Arguments.arguments("amqp", "rabbitmq/"), Arguments.arguments("cloud-gcp", "gcloud/"), + Arguments.arguments("cloud-gcp-pubsub", "gcloud/"), Arguments.arguments("cloud-starter-consul-config", "consul/"), Arguments.arguments("cloud-starter-vault-config", "vault/"), Arguments.arguments("data-cassandra", "databases/cassandra/"), From 84cc8b105bb345b4ffb514a97f924048e42e927f Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 1 Aug 2023 11:57:28 +0200 Subject: [PATCH 112/825] Polish "Add Testcontainers GCloud module when GCP is selected" Testcontainers offers a GCloud module where `PubSubEmulatorContainer` can be found and be used for testing. See gh-1264 --- .../testcontainers/TestcontainersModuleRegistry.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 1a2da2dd5d..4be1a2b167 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -41,9 +41,7 @@ static Iterable create() { return create( onDependencies("amqp").customizeBuild(addModule("rabbitmq")) .customizeHelpDocument(addReferenceLink("RabbitMQ Module", "rabbitmq/")), - onDependencies("cloud-gcp").customizeBuild(addModule("gcloud")) - .customizeHelpDocument(addReferenceLink("GCloud Module", "gcloud/")), - onDependencies("cloud-gcp-pubsub").customizeBuild(addModule("gcloud")) + onDependencies("cloud-gcp", "cloud-gcp-pubsub").customizeBuild(addModule("gcloud")) .customizeHelpDocument(addReferenceLink("GCloud Module", "gcloud/")), onDependencies("cloud-starter-consul-config").customizeBuild(addModule("consul")) .customizeHelpDocument(addReferenceLink("Consul Module", "consul/")), From df241d699aa6c7e080bd6525cc7e6e2470610561 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 1 Aug 2023 10:10:16 +0000 Subject: [PATCH 113/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 1f92527c6e..37190107f4 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:788825bff6bf01628cca9984c952eff4757cfe7d4a354d965f2908d758e67cbb + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0521a201e836e1d28e3dccef4965a871c8b7ab87389ce9665b98d1a22a81468d lifecycle: preStop: exec: From 0cd59ecb2ce89680a922c6c02664378a6775283f Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 2 Aug 2023 13:40:41 +0200 Subject: [PATCH 114/825] Upgrade to Spring Cloud Azure 4.10.0 Closes gh-1268 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f9f1655a7a..1f891b86f7 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -99,7 +99,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 4.9.0 + version: 4.10.0 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" version: 5.3.0 spring-cloud-gcp: From becf4950e2f92f874633bacdcea750142ed2cef4 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 2 Aug 2023 13:41:07 +0200 Subject: [PATCH 115/825] Upgrade to Spring Cloud Azure 5.4.0 Closes gh-1269 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 1f891b86f7..e94fac434e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -101,7 +101,7 @@ initializr: - compatibilityRange: "[2.6.0,3.0.0-M1)" version: 4.10.0 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 5.3.0 + version: 5.4.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From 7da3b90fb8de02eeaffe5edf047c47c8c626f62f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 2 Aug 2023 11:53:44 +0000 Subject: [PATCH 116/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 37190107f4..c76922f949 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0521a201e836e1d28e3dccef4965a871c8b7ab87389ce9665b98d1a22a81468d + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:efe7b4c14d09e6a8cd195f7a8778f1916573cc83e77dc3e585ba4fc048ed6d9e lifecycle: preStop: exec: From 39d0e5619725bd16ff6e100ccf614d34810a597b Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 3 Aug 2023 13:53:34 -0400 Subject: [PATCH 117/825] Upgrade to Spring Cloud GCP 3.6.2 and 4.7.1 See gh-1271 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e94fac434e..c44e06ea22 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -109,9 +109,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 3.5.4 + version: 3.6.2 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.5.1 + version: 4.7.1 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 1515582aa91770fc4184fe440e256703394ade91 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 3 Aug 2023 18:20:09 +0000 Subject: [PATCH 118/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index c76922f949..ffae2258ca 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:efe7b4c14d09e6a8cd195f7a8778f1916573cc83e77dc3e585ba4fc048ed6d9e + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:84422a5f3e1b305e9e6275ec289af00944a2a8be5e069b16cbdbf59ff87973bd lifecycle: preStop: exec: From 0fbd282fca5ea858bc7235296ba07be78f0087d7 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sun, 6 Aug 2023 15:31:28 +0100 Subject: [PATCH 119/825] Upgrade to Spring Shell 3.2.0-M1 See gh-1273 --- start-site/src/main/resources/application.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c44e06ea22..7e4041f3be 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -142,6 +142,9 @@ initializr: version: 3.0.7 - compatibilityRange: "[3.1.0,3.2.0-M1)" version: 3.1.3 + - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" + version: 3.2.0-M1 + repositories: spring-milestones testcontainers: groupId: org.testcontainers artifactId: testcontainers-bom @@ -912,7 +915,7 @@ initializr: groupId: org.springframework.shell artifactId: spring-shell-starter description: Build command line applications with spring. - compatibilityRange: "[2.7.0,3.2.0-M1)" + compatibilityRange: "[2.7.0,3.3.0-M1)" bom: spring-shell links: - rel: reference From 3bd7f9fcdd2288a974f7ea8539af3e52e42e0935 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 7 Aug 2023 13:25:57 +0200 Subject: [PATCH 120/825] Polish "Upgrade to Spring Shell 3.2.0-M1" See gh-1273 --- start-site/src/main/resources/application.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 7e4041f3be..3b37a4510a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -142,7 +142,7 @@ initializr: version: 3.0.7 - compatibilityRange: "[3.1.0,3.2.0-M1)" version: 3.1.3 - - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" + - compatibilityRange: "3.2.0-M1" version: 3.2.0-M1 repositories: spring-milestones testcontainers: @@ -915,7 +915,6 @@ initializr: groupId: org.springframework.shell artifactId: spring-shell-starter description: Build command line applications with spring. - compatibilityRange: "[2.7.0,3.3.0-M1)" bom: spring-shell links: - rel: reference From 599f2006417b6301a1ba98a37c6ccc7d5085a99c Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Mon, 7 Aug 2023 12:18:01 +0200 Subject: [PATCH 121/825] Upgrade to Sentry 6.28.0 See gh-1274 --- start-site/src/main/resources/application.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3b37a4510a..e620c2dc00 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -64,7 +64,7 @@ initializr: versionProperty: sentry.version mappings: - compatibilityRange: "[2.7.0,3.2.0-M1)" - version: 6.26.0 + version: 6.28.0 solace-spring-boot: groupId: com.solace.spring.boot artifactId: solace-spring-boot-bom @@ -957,7 +957,6 @@ initializr: compatibilityRange: "[2.7.0,3.2.0-M1)" groupId: io.sentry artifactId: sentry-spring-boot-starter-jakarta - starter: false mappings: - compatibilityRange: "[2.7.0,3.0.0-M1)" artifactId: sentry-spring-boot-starter From 024bc3f36671947235d5a908f742b537f440399a Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 7 Aug 2023 11:41:50 +0000 Subject: [PATCH 122/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index ffae2258ca..3e3e4b4f8c 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:84422a5f3e1b305e9e6275ec289af00944a2a8be5e069b16cbdbf59ff87973bd + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f92649ec4524f1fc295d7fba3d5e095a0db6391ff817d461da643ec3d1abd074 lifecycle: preStop: exec: From c2cf5bf2521c97241fc9c731b9af691fb944b33e Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 9 Aug 2023 19:00:13 +0000 Subject: [PATCH 123/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 3e3e4b4f8c..1b6c99255c 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f92649ec4524f1fc295d7fba3d5e095a0db6391ff817d461da643ec3d1abd074 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:e7cdf0290aa447012ffee29369f52784a142b6391adc420243c1a2544cfa7de1 lifecycle: preStop: exec: From a2873cfc266a0fcd2ee7db2939419584a89eeeea Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 9 Aug 2023 20:43:11 +0000 Subject: [PATCH 124/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 1b6c99255c..37fbcf1a49 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:e7cdf0290aa447012ffee29369f52784a142b6391adc420243c1a2544cfa7de1 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:95d927ca790cea235221b980f570ef98d64daf657cddd877ad4065535bb5f658 lifecycle: preStop: exec: From e12cb2c15f38cc84883819498e9b0cff2e170e55 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 10 Aug 2023 16:25:45 +0200 Subject: [PATCH 125/825] Upgrade to Spring Modulith 1.0.0-RC1 Close gh-1276 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e620c2dc00..d831eacdf0 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -129,7 +129,7 @@ initializr: artifactId: spring-modulith-bom mappings: - compatibility-range: "[3.1.0,3.2.0-M1)" - version: 1.0.0-M1 + version: 1.0.0-RC1 repositories: spring-milestones spring-shell: groupId: org.springframework.shell From ac4d64110cd82fc74f838b993f4f4726cca6aa1a Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 10 Aug 2023 14:38:29 +0000 Subject: [PATCH 126/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 37fbcf1a49..3be1a76f1c 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:95d927ca790cea235221b980f570ef98d64daf657cddd877ad4065535bb5f658 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:fb8cb53eedf0492c56d8b4cf9365b0b6b2bb01797fe4d1f8429d93d41108b159 lifecycle: preStop: exec: From a47422758acf103f3fea8ed4c615caef076212ef Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 10 Aug 2023 16:42:11 +0200 Subject: [PATCH 127/825] Polish "Upgrade to Spring Modulith 1.0.0-RC1" Close gh-1276 --- start-site/src/main/resources/application.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d831eacdf0..b2c28b69b3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -236,9 +236,6 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-modulith/docs/current/reference/html/ - mappings: - - compatibilityRange: "[3.1.0,3.2.0-M1)" - starter: false - name: Web content: - name: Spring Web From 0fe179f2ae3283733f4979d35a1fa9c17b6a237b Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 10 Aug 2023 14:54:02 +0000 Subject: [PATCH 128/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 3be1a76f1c..ae90479e91 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:fb8cb53eedf0492c56d8b4cf9365b0b6b2bb01797fe4d1f8429d93d41108b159 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0f755d2e1a459a2106ef6e0a18cfda6b6f1c341036e9e42133ed9e231d15adc6 lifecycle: preStop: exec: From 6823d53aa57346d50c1a7368492854c474270379 Mon Sep 17 00:00:00 2001 From: paparadva Date: Thu, 10 Aug 2023 19:08:00 +0300 Subject: [PATCH 129/825] Fix typo in docs urls See gh-1278 --- start-site/src/main/resources/application.yml | 116 +++++++++--------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b2c28b69b3..4db46fa544 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -197,7 +197,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#using.devtools + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#using.devtools - name: Lombok id: lombok groupId: org.projectlombok @@ -214,7 +214,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#appendix.configuration-metadata.annotation-processor + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#appendix.configuration-metadata.annotation-processor - name: Docker Compose Support id: docker-compose compatibilityRange: "3.1.0-M1" @@ -225,7 +225,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#features.docker-compose + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#features.docker-compose - name: Spring Modulith id: modulith bom: spring-modulith @@ -249,7 +249,7 @@ initializr: href: https://spring.io/guides/gs/rest-service/ description: Building a RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web - rel: guide href: https://spring.io/guides/gs/serving-web-content/ description: Serving Web Content with Spring MVC @@ -267,7 +267,7 @@ initializr: href: https://spring.io/guides/gs/reactive-rest-service/ description: Building a Reactive RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.reactive + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.reactive - name: Spring for GraphQL id: graphql compatibilityRange: "2.7.0-M1" @@ -279,7 +279,7 @@ initializr: href: https://spring.io/guides/gs/graphql-server/ description: Building a GraphQL service - rel: reference - href: https://docs.spring.io/spring-boot/docs/${bootVersion}/reference/htmlsinge/index.html#web.graphql + href: https://docs.spring.io/spring-boot/docs/${bootVersion}/reference/htmlsingle/index.html#web.graphql - name: Rest Repositories id: data-rest facets: @@ -296,7 +296,7 @@ initializr: href: https://spring.io/guides/gs/accessing-mongodb-data-rest/ description: Accessing MongoDB Data with REST - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#howto.data-access.exposing-spring-data-repositories-as-rest + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#howto.data-access.exposing-spring-data-repositories-as-rest - name: Spring Session id: session groupId: org.springframework.session @@ -320,7 +320,7 @@ initializr: href: https://spring.io/guides/gs/rest-hateoas/ description: Building a Hypermedia-Driven RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.spring-hateoas + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.spring-hateoas - name: Spring Web Services id: web-services description: Facilitates contract-first SOAP development. Allows for the creation of flexible web services using one of the many ways to manipulate XML payloads. @@ -331,7 +331,7 @@ initializr: href: https://spring.io/guides/gs/producing-web-service/ description: Producing a SOAP web service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#io.webservices + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.webservices - name: Jersey id: jersey description: Framework for developing RESTful Web Services in Java that provides support for JAX-RS APIs. @@ -339,7 +339,7 @@ initializr: - json links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.servlet.jersey + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.servlet.jersey - name: Vaadin id: vaadin facets: @@ -380,19 +380,19 @@ initializr: href: https://spring.io/guides/gs/handling-form-submission/ description: Handling Form Submission - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.servlet.spring-mvc.template-engines - name: Apache Freemarker id: freemarker description: Java library to generate text output (HTML web pages, e-mails, configuration files, source code, etc.) based on templates and changing data. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.servlet.spring-mvc.template-engines - name: Mustache id: mustache description: Logic-less templates for both web and standalone environments. There are no if statements, else clauses, or for loops. Instead there are only tags. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.servlet.spring-mvc.template-engines - name: Groovy Templates id: groovy-templates description: Groovy templating engine. @@ -400,7 +400,7 @@ initializr: - web links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.servlet.spring-mvc.template-engines - name: Security content: - name: Spring Security @@ -417,32 +417,32 @@ initializr: href: https://spring.io/guides/gs/authenticating-ldap/ description: Authenticating a User with LDAP - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.security + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.security - name: OAuth2 Client id: oauth2-client description: Spring Boot integration for Spring Security's OAuth2/OpenID Connect client features. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.security.oauth2.client + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.security.oauth2.client - name: OAuth2 Authorization Server id: oauth2-authorization-server description: Spring Boot integration for Spring Authorization Server. compatibilityRange: "3.1.0-RC1" links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.security.oauth2.authorization-server + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.security.oauth2.authorization-server - name: OAuth2 Resource Server id: oauth2-resource-server description: Spring Boot integration for Spring Security's OAuth2 resource server features. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#web.security.oauth2.server + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.security.oauth2.server - name: Spring LDAP id: data-ldap description: Makes it easier to build Spring based applications that use the Lightweight Directory Access Protocol. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.ldap + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap - name: Okta id: okta compatibilityRange: "[2.6.0,3.2.0-M1)" @@ -480,7 +480,7 @@ initializr: href: https://spring.io/guides/gs/managing-transactions/ description: Managing Transactions - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.sql + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.sql - name: Spring Data JPA id: data-jpa description: Persist data in SQL stores with Java Persistence API using Spring Data and Hibernate. @@ -493,7 +493,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-jpa/ description: Accessing Data with JPA - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.sql.jpa-and-spring-data + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.sql.jpa-and-spring-data - name: Spring Data JDBC id: data-jdbc description: Persist data in SQL stores with plain JDBC using Spring Data. @@ -502,7 +502,7 @@ initializr: href: https://github.com/spring-projects/spring-data-examples/tree/master/jdbc/basics description: Using Spring Data JDBC - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.sql.jdbc + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.sql.jdbc - name: Spring Data R2DBC id: data-r2dbc description: Provides Reactive Relational Database Connectivity to persist data in SQL stores using Spring Data in reactive applications. @@ -513,7 +513,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-r2dbc/ description: Accessing data with R2DBC - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.sql.r2dbc + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.sql.r2dbc - rel: home href: https://r2dbc.io description: R2DBC Homepage @@ -544,7 +544,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#howto.data-initialization.migration-tool.liquibase + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#howto.data-initialization.migration-tool.liquibase - name: Flyway Migration id: flyway description: Version control for your database so you can migrate from any version (incl. an empty database) to the latest version of the schema. @@ -553,13 +553,13 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#howto.data-initialization.migration-tool.flyway + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#howto.data-initialization.migration-tool.flyway - name: JOOQ Access Layer id: jooq description: Generate Java code from your database and build type safe SQL queries through a fluent API. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.sql.jooq + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.sql.jooq - name: IBM DB2 Driver id: db2 description: A JDBC driver that provides access to IBM DB2. @@ -639,7 +639,7 @@ initializr: href: https://spring.io/guides/gs/messaging-redis/ description: Messaging with Redis - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.redis + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.redis - name: Spring Data Reactive Redis id: data-redis-reactive description: Access Redis key-value data stores in a reactive fashion with Spring Data Redis. @@ -650,7 +650,7 @@ initializr: href: https://spring.io/guides/gs/messaging-redis/ description: Messaging with Redis - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.redis + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.redis - name: Spring Data MongoDB id: data-mongodb description: Store data in flexible, JSON-like documents, meaning fields can vary from document to document and data structure can be changed over time. @@ -659,7 +659,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-mongodb/ description: Accessing Data with MongoDB - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.mongodb + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.mongodb - name: Spring Data Reactive MongoDB id: data-mongodb-reactive description: Provides asynchronous stream processing with non-blocking back pressure for MongoDB. @@ -667,7 +667,7 @@ initializr: - reactive links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.mongodb + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.mongodb - rel: guide href: https://spring.io/guides/gs/accessing-data-mongodb/ description: Accessing Data with MongoDB @@ -676,13 +676,13 @@ initializr: description: A distributed, RESTful search and analytics engine with Spring Data Elasticsearch. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.elasticsearch + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.elasticsearch - name: Spring Data for Apache Cassandra id: data-cassandra description: A free and open-source, distributed, NoSQL database management system that offers high-scalability and high-performance. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.cassandra + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.cassandra - rel: guide href: https://spring.io/guides/gs/accessing-data-cassandra/ - name: Spring Data Reactive for Apache Cassandra @@ -692,7 +692,7 @@ initializr: - reactive links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.cassandra + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.cassandra - rel: guide href: https://spring.io/guides/gs/accessing-data-cassandra/ - name: Spring Data Couchbase @@ -700,7 +700,7 @@ initializr: description: NoSQL document-oriented database that offers in memory-first architecture, geo-distributed deployments, and workload isolation. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.couchbase + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.couchbase - name: Spring Data Reactive Couchbase id: data-couchbase-reactive description: Access Couchbase NoSQL database in a reactive fashion with Spring Data Couchbase. @@ -708,7 +708,7 @@ initializr: - reactive links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.couchbase + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.couchbase - name: Spring Data Neo4j id: data-neo4j description: An open source NoSQL database that stores data structured as graphs consisting of nodes, connected by relationships. @@ -717,7 +717,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-neo4j/ description: Accessing Data with Neo4j - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.neo4j + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.neo4j - name: Messaging content: - name: Spring Integration @@ -728,7 +728,7 @@ initializr: href: https://spring.io/guides/gs/integration/ description: Integrating Data - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.spring-integration + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.spring-integration - name: Spring for RabbitMQ id: amqp description: Gives your applications a common platform to send and receive messages, and your messages a safe place to live until received. @@ -737,7 +737,7 @@ initializr: href: https://spring.io/guides/gs/messaging-rabbitmq/ description: Messaging with RabbitMQ - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.amqp + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.amqp - name: Spring for Apache Kafka id: kafka description: Publish, subscribe, store, and process streams of records. @@ -746,7 +746,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.kafka + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.kafka - name: Spring for Apache Kafka Streams id: kafka-streams description: Building stream processing applications with Apache Kafka Streams. @@ -761,7 +761,7 @@ initializr: href: https://docs.spring.io/spring-kafka/docs/current/reference/html/#streams-kafka-streams description: Apache Kafka Streams Support - rel: reference - href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsinge/index.html#_kafka_streams_binding_capabilities_of_spring_cloud_stream + href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/index.html#_kafka_streams_binding_capabilities_of_spring_cloud_stream description: Apache Kafka Streams Binding Capabilities of Spring Cloud Stream - name: Spring for Apache ActiveMQ 5 id: activemq @@ -771,7 +771,7 @@ initializr: href: https://spring.io/guides/gs/messaging-jms/ description: Java Message Service API via Apache ActiveMQ Classic. - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.jms.activemq + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.jms.activemq - name: Spring for Apache ActiveMQ Artemis id: artemis description: Spring JMS support with Apache ActiveMQ Artemis. @@ -780,7 +780,7 @@ initializr: href: https://spring.io/guides/gs/messaging-jms/ description: Messaging with JMS - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.jms.artemis + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.jms.artemis - name: Spring for Apache Pulsar id: pulsar compatibilityRange: "[3.0.0,3.2.0-M1)" @@ -815,7 +815,7 @@ initializr: href: https://spring.io/guides/gs/messaging-stomp-websocket/ description: Using WebSocket to build an interactive web application - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#messaging.websockets + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.websockets - name: RSocket id: rsocket description: RSocket.io applications with Spring Messaging and Netty. @@ -865,13 +865,13 @@ initializr: href: https://spring.io/guides/gs/batch-processing/ description: Creating a Batch Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#howto.batch + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#howto.batch - name: Validation id: validation description: Bean Validation with Hibernate validator. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#io.validation + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.validation - rel: guide href: https://spring.io/guides/gs/validating-form-input/ - name: Java Mail Sender @@ -879,13 +879,13 @@ initializr: description: Send email using Java Mail and Spring Framework's JavaMailSender. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#io.email + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.email - name: Quartz Scheduler id: quartz description: Schedule jobs using Quartz. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#io.quartz + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.quartz - name: Spring cache abstraction id: cache description: Provides cache-related operations, such as the ability to update the content of the cache, but does not provide the actual data store. @@ -894,7 +894,7 @@ initializr: href: https://spring.io/guides/gs/caching/ description: Caching Data with Spring - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#io.caching + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.caching - name: Picocli id: picocli groupId: info.picocli @@ -926,7 +926,7 @@ initializr: href: https://spring.io/guides/gs/actuator-service/ description: Building a RESTful Web Service with Spring Boot Actuator - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator - name: codecentric's Spring Boot Admin (Client) id: codecentric-spring-boot-admin-client groupId: de.codecentric @@ -974,7 +974,7 @@ initializr: description: Publish Micrometer metrics to Datadog, a dimensional time-series SaaS with built-in dashboarding and alerting. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator.metrics.export.datadog + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.datadog - name: Dynatrace id: dynatrace groupId: io.micrometer @@ -984,7 +984,7 @@ initializr: description: Publish Micrometer metrics to Dynatrace, a platform featuring observability, AIOps, application security and analytics. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/current/reference/htmlsinge/index.html#actuator.metrics.export.dynatrace + href: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/index.html#actuator.metrics.export.dynatrace - name: Influx id: influx groupId: io.micrometer @@ -994,7 +994,7 @@ initializr: description: Publish Micrometer metrics to InfluxDB, a dimensional time-series server that support real-time stream processing of data. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator.metrics.export.influx + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.influx - name: Graphite id: graphite groupId: io.micrometer @@ -1004,7 +1004,7 @@ initializr: description: Publish Micrometer metrics to Graphite, a hierarchical metrics system backed by a fixed-size database. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator.metrics.export.graphite + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.graphite - name: New Relic id: new-relic groupId: io.micrometer @@ -1014,7 +1014,7 @@ initializr: description: Publish Micrometer metrics to New Relic, a SaaS offering with a full UI and a query language called NRQL. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator.metrics.export.newrelic + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.newrelic - name: Prometheus id: prometheus groupId: io.micrometer @@ -1024,7 +1024,7 @@ initializr: description: Expose Micrometer metrics in Prometheus format, an in-memory dimensional time series database with a simple built-in UI, a custom query language, and math operations. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#actuator.metrics.export.prometheus + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.prometheus - name: Distributed Tracing id: distributed-tracing description: Enable span and trace IDs in logs. @@ -1107,7 +1107,7 @@ initializr: scope: test links: - rel: reference - href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsinge/index.html#features-stub-runner + href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsingle/index.html#features-stub-runner - name: Embedded LDAP Server id: unboundid-ldap description: Provides a platform neutral way for running a LDAP server in unit tests. @@ -1117,7 +1117,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.ldap.embedded + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap.embedded - name: Embedded MongoDB Database id: flapdoodle-mongo compatibilityRange: "[2.6.0,3.0.0-M1)" @@ -1128,7 +1128,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsinge/index.html#data.nosql.mongodb.embedded + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.mongodb.embedded - name: Spring Cloud bom: spring-cloud compatibilityRange: "[2.6.0,3.2.0-M1)" From b4377b3aa0abd3f15c913bedf33b2caf6e9271cb Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 10 Aug 2023 19:31:53 +0000 Subject: [PATCH 130/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index ae90479e91..3fbc8146cc 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0f755d2e1a459a2106ef6e0a18cfda6b6f1c341036e9e42133ed9e231d15adc6 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d87f238ac452218e78d963fdbddbb21dad2d29a65691d65f01056bffb1c98626 lifecycle: preStop: exec: From b6221fad6a153189f205179d45e3af189d39935c Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 14 Aug 2023 10:27:40 +0200 Subject: [PATCH 131/825] Upgrade to Spring Cloud 2023.0.0-M1 Closes gh-1277 --- ...ngCloudProjectGenerationConfiguration.java | 2 + ...udGatewayProjectDescriptionCustomizer.java | 28 ++++++++++++-- start-site/src/main/resources/application.yml | 14 +++---- ...ewayProjectDescriptionCustomizerTests.java | 38 +++++++++++++++---- 4 files changed, 62 insertions(+), 20 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java index cc4afd36eb..69fd7f548d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java @@ -24,6 +24,7 @@ import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; import io.spring.initializr.generator.project.ProjectDescription; @@ -83,6 +84,7 @@ public SpringCloudCircuitBreakerBuildCustomizer springCloudCircuitBreakerBuildCu @Bean @ConditionalOnRequestedDependency("cloud-gateway") + @ConditionalOnPlatformVersion("[2.6.0,3.2.0-M1)") public SpringCloudGatewayHelpDocumentCustomizer springCloudGatewayHelpDocumentCustomizer( ProjectDescriptionDiff diff) { return new SpringCloudGatewayHelpDocumentCustomizer(diff); diff --git a/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizer.java index 2a057e1675..ad49eddd55 100644 --- a/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,19 +21,30 @@ import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; /** - * A {@link ProjectDescriptionCustomizer} that checks that Spring Cloud Gateway is not - * used with Spring MVC as only Spring WebFlux is supported. + * A {@link ProjectDescriptionCustomizer} that checks the web stack that is used with + * Spring Cloud Gateway as it requires a dedicated starter. Before Spring Boot 3.2, MVC + * was not supported. * * @author Stephane Nicoll */ public class SpringCloudGatewayProjectDescriptionCustomizer implements ProjectDescriptionCustomizer { + private static final VersionRange SPRING_BOOT_3_2_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0-M1"); + @Override public void customize(MutableProjectDescription description) { Collection dependencyIds = description.getRequestedDependencies().keySet(); - if (dependencyIds.contains("cloud-gateway") && dependencyIds.contains("web")) { + if (!dependencyIds.contains("cloud-gateway")) { + return; + } + if (SPRING_BOOT_3_2_0_OR_LATER.match(description.getPlatformVersion())) { + swapStarterIfNecessary(description, dependencyIds); + } + else if (dependencyIds.contains("web")) { description.removeDependency("web"); if (!description.getRequestedDependencies().containsKey("webflux")) { description.addDependency("webflux", @@ -42,4 +53,13 @@ public void customize(MutableProjectDescription description) { } } + private void swapStarterIfNecessary(MutableProjectDescription description, Collection dependencyIds) { + if (dependencyIds.contains("web")) { + description.addDependency("cloud-gateway", + Dependency.from(description.getRequestedDependencies().get("cloud-gateway")) + .artifactId("spring-cloud-starter-gateway-mvc")); + } + + } + } diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4db46fa544..1c640ba22d 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -93,6 +93,12 @@ initializr: version: 2021.0.8 - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 2022.0.4 + - compatibilityRange: "[3.2.0-M1,3.2.x-SNAPSHOT)" + version: 2023.0.0-M1 + repositories: spring-milestones + - compatibilityRange: "3.2.x-SNAPSHOT" + version: 2023.0.0-SNAPSHOT + repositories: spring-snapshots spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies @@ -1089,7 +1095,6 @@ initializr: - name: Contract Verifier bom: spring-cloud id: cloud-contract-verifier - compatibilityRange: "[2.6.0,3.2.0-M1)" description: Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development. groupId: org.springframework.cloud artifactId: spring-cloud-starter-contract-verifier @@ -1100,7 +1105,6 @@ initializr: - name: Contract Stub Runner bom: spring-cloud id: cloud-contract-stub-runner - compatibilityRange: "[2.6.0,3.2.0-M1)" description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests. groupId: org.springframework.cloud artifactId: spring-cloud-starter-contract-stub-runner @@ -1131,7 +1135,6 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.mongodb.embedded - name: Spring Cloud bom: spring-cloud - compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Cloud Bootstrap id: cloud-starter @@ -1163,7 +1166,6 @@ initializr: href: https://docs.spring.io/spring-cloud-task/docs/current/reference/html/ - name: Spring Cloud Config bom: spring-cloud - compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Config Client id: cloud-config-client @@ -1214,7 +1216,6 @@ initializr: description: Spring Cloud Consul Quick Start - name: Spring Cloud Discovery bom: spring-cloud - compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Eureka Discovery Client id: cloud-eureka @@ -1265,7 +1266,6 @@ initializr: href: https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#spring-cloud-consul-discovery - name: Spring Cloud Routing bom: spring-cloud - compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Gateway id: cloud-gateway @@ -1302,7 +1302,6 @@ initializr: href: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer - name: Spring Cloud Circuit Breaker bom: spring-cloud - compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Resilience4J id: cloud-resilience4j @@ -1314,7 +1313,6 @@ initializr: href: https://docs.spring.io/spring-cloud-circuitbreaker/docs/current/reference/html/#configuring-resilience4j-circuit-breakers - name: Spring Cloud Messaging bom: spring-cloud - compatibilityRange: "[2.6.0,3.2.0-M1)" content: - name: Cloud Bus id: cloud-bus diff --git a/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizerTests.java index 4d6c5a5b66..e5e8196f07 100644 --- a/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizerTests.java @@ -16,10 +16,13 @@ package io.spring.start.site.project.dependency.springcloud; -import java.util.Collections; +import java.util.Arrays; +import java.util.function.Function; +import java.util.stream.Collectors; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.project.MutableProjectDescription; +import io.spring.initializr.generator.version.Version; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -36,10 +39,11 @@ class SpringCloudGatewayProjectDescriptionCustomizerTests { @Test - void customizeWithSpringCloudGatewayAndSpringMvcMigratesToSpringWebFlux() { + void customizeWithSpringCloudGatewayAndSpringMvcPre32MigratesToSpringWebFlux() { MutableProjectDescription description = new MutableProjectDescription(); description.addDependency("cloud-gateway", mock(Dependency.class)); description.addDependency("web", mock(Dependency.class)); + description.setPlatformVersion(Version.parse("3.1.0")); new SpringCloudGatewayProjectDescriptionCustomizer().customize(description); assertThat(description.getRequestedDependencies()).containsOnlyKeys("cloud-gateway", "webflux"); Dependency webflux = description.getRequestedDependencies().get("webflux"); @@ -47,24 +51,42 @@ void customizeWithSpringCloudGatewayAndSpringMvcMigratesToSpringWebFlux() { assertThat(webflux.getArtifactId()).isEqualTo("spring-boot-starter-webflux"); } + @Test + void customizeWithSpringCloudGatewayAndSpringMvcAs32UsesMvcStarter() { + MutableProjectDescription description = new MutableProjectDescription(); + description.addDependency("cloud-gateway", + Dependency.withCoordinates("org.springframework.cloud", "spring-cloud-starter-gateway")); + description.addDependency("web", mock(Dependency.class)); + description.setPlatformVersion(Version.parse("3.2.0-M1")); + new SpringCloudGatewayProjectDescriptionCustomizer().customize(description); + assertThat(description.getRequestedDependencies()).containsOnlyKeys("cloud-gateway", "web"); + Dependency cloudGateway = description.getRequestedDependencies().get("cloud-gateway"); + assertThat(cloudGateway.getArtifactId()).isEqualTo("spring-cloud-starter-gateway-mvc"); + } + @Test void customizeWithSpringCloudGatewayDoesNotAddSpringWebFlux() { - MutableProjectDescription description = mock(MutableProjectDescription.class); - given(description.getRequestedDependencies()) - .willReturn(Collections.singletonMap("cloud-gateway", mock(Dependency.class))); + MutableProjectDescription description = mockProjectDescription("3.1.0", "cloud-gateway"); new SpringCloudGatewayProjectDescriptionCustomizer().customize(description); verify(description).getRequestedDependencies(); + verify(description).getPlatformVersion(); verifyNoMoreInteractions(description); } @Test void customizeWithoutSpringCloudGatewayDoesNotRemoveSpringMvc() { - MutableProjectDescription description = mock(MutableProjectDescription.class); - given(description.getRequestedDependencies()) - .willReturn(Collections.singletonMap("web", mock(Dependency.class))); + MutableProjectDescription description = mockProjectDescription("3.1.0", "web"); new SpringCloudGatewayProjectDescriptionCustomizer().customize(description); verify(description).getRequestedDependencies(); verifyNoMoreInteractions(description); } + MutableProjectDescription mockProjectDescription(String platformVersion, String... dependencies) { + MutableProjectDescription description = mock(MutableProjectDescription.class); + given(description.getPlatformVersion()).willReturn(Version.parse(platformVersion)); + given(description.getRequestedDependencies()).willReturn(Arrays.stream(dependencies) + .collect(Collectors.toMap(Function.identity(), (t) -> mock(Dependency.class)))); + return description; + } + } From 86dfb2888bf3b9f365c6862d7e0a596ac43ad1ff Mon Sep 17 00:00:00 2001 From: Joe Wang <106995533+JoeWang1127@users.noreply.github.com> Date: Fri, 11 Aug 2023 13:44:39 -0400 Subject: [PATCH 132/825] Upgrade to Spring Cloud GCP 3.6.3 and 4.7.2 See gh-1279 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4db46fa544..2dc21e455a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -109,9 +109,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 3.6.2 + version: 3.6.3 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.7.1 + version: 4.7.2 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 136d31ed4cbf463e4b5e2cea49ecf64398655e42 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 14 Aug 2023 08:40:12 +0000 Subject: [PATCH 133/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 3fbc8146cc..fee52c490c 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d87f238ac452218e78d963fdbddbb21dad2d29a65691d65f01056bffb1c98626 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:18fe622553d017734da433d0b3a418af9e17d64435ead36fd263e900742ca3ab lifecycle: preStop: exec: From 781509a96e6048be06bf20e52bc986f9ee4aa9b5 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 14 Aug 2023 12:17:42 +0200 Subject: [PATCH 134/825] Upgrade to Camel 4.0.0 This commit upgrades Spring Boot 3.x to use Camel 4.0.0. It also documents the version to use for Spring Boot 2.6.x See gh-1280 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9515c24ae2..1e49701548 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -835,11 +835,11 @@ initializr: compatibilityRange: "[2.6.0,3.2.0-M1)" mappings: - compatibilityRange: "[2.6.0,2.7.0-M1)" - version: 3.17.0 + version: 3.14.9 - compatibilityRange: "[2.7.0.M1,3.0.0-M1)" version: 3.20.6 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.0.0-RC2 + version: 4.0.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From 6b6469d25de286cc39f2317adab267f207bed625 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 14 Aug 2023 13:17:38 +0000 Subject: [PATCH 135/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index fee52c490c..abd94286c9 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:18fe622553d017734da433d0b3a418af9e17d64435ead36fd263e900742ca3ab + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8add7686fef3b55e5527f18c486e82b77e31a5e7d220b05240592c673b9bc34f lifecycle: preStop: exec: From 6ceb77ec0175641ccf61ac536de292ec46d06691 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 15 Aug 2023 10:11:02 +0300 Subject: [PATCH 136/825] Upgrade to Vaadin 24.1.5, 24.0.12, 23.3.20 See gh-1281 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 1e49701548..f940a966d5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -164,11 +164,11 @@ initializr: - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.18 + version: 23.3.20 - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 24.0.11 + version: 24.0.12 - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 24.1.4 + version: 24.1.5 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From e2c57a85e4796f80ac268ffd24d051dd3897b786 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 16 Aug 2023 14:01:22 +0200 Subject: [PATCH 137/825] Upgrade to Spring Modulith 1.0.0-RC2 Closes gh-1282 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f940a966d5..560026e510 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -135,7 +135,7 @@ initializr: artifactId: spring-modulith-bom mappings: - compatibility-range: "[3.1.0,3.2.0-M1)" - version: 1.0.0-RC1 + version: 1.0.0-RC2 repositories: spring-milestones spring-shell: groupId: org.springframework.shell From d50d075411f5c656cbaace34d1caafb70bee9502 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 16 Aug 2023 12:14:30 +0000 Subject: [PATCH 138/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index abd94286c9..772c7ea5d8 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8add7686fef3b55e5527f18c486e82b77e31a5e7d220b05240592c673b9bc34f + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:430c6289c8f0631eec522acfdfd2df5b96057617b3a1841cda58da0f646a7b5e lifecycle: preStop: exec: From 4a2712c3836b15570928907779a39dc550c30bc4 Mon Sep 17 00:00:00 2001 From: Arvind Krishnakumar <61501885+arvindkrishnakumar-okta@users.noreply.github.com> Date: Thu, 17 Aug 2023 20:50:43 +0530 Subject: [PATCH 139/825] Upgrade to Okta Spring Boot 3.0.5 See gh-1283 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 560026e510..a3700919c3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -459,7 +459,7 @@ initializr: - compatibilityRange: "[2.6.0,3.0.0-M1)" version: 2.1.6 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 3.0.4 + version: 3.0.5 links: - rel: guide href: https://github.com/okta/samples-java-spring/tree/master/okta-hosted-login From e29bfcbfc50820beb4fa3b6a3fc3790db0f8797a Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 18 Aug 2023 07:12:19 +0000 Subject: [PATCH 140/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 772c7ea5d8..7e2e986e13 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:430c6289c8f0631eec522acfdfd2df5b96057617b3a1841cda58da0f646a7b5e + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:290c63381109db15c09eae5e38a2cefb22edd9a720205ff36daa1dc9d9d92e06 lifecycle: preStop: exec: From 16745612a5bde80df024dcdf8f8ba2dcb605b447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Ko=CC=88ninger?= Date: Fri, 18 Aug 2023 10:52:11 +0200 Subject: [PATCH 141/825] Upgrade to Spring Boot Admin 3.1.5 See gh-1284 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index a3700919c3..b3179fb636 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -50,7 +50,7 @@ initializr: - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" version: 3.0.4 - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 3.1.1 + version: 3.1.5 hilla: groupId: dev.hilla artifactId: hilla-bom From eb66f4fdaef2b07c8203a22e69968da7d8eac7f4 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 18 Aug 2023 11:31:15 +0000 Subject: [PATCH 142/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 7e2e986e13..dee6be7a3e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:290c63381109db15c09eae5e38a2cefb22edd9a720205ff36daa1dc9d9d92e06 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4eafca19d0109494416898159f5ae97303ed279c77f682ba66b473f7208da923 lifecycle: preStop: exec: From d878863966cd809287dec6727ab158ff0a4eb020 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 18 Aug 2023 15:59:20 +0000 Subject: [PATCH 143/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index dee6be7a3e..254781ed09 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4eafca19d0109494416898159f5ae97303ed279c77f682ba66b473f7208da923 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:76acae7a34137b462c9a28b00114d1963c5d64e43a514cc342d1191b3d63c62a lifecycle: preStop: exec: From 6ae3617f4bba4ed961e9ab727b4174829858913c Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 21 Aug 2023 21:52:07 +0200 Subject: [PATCH 144/825] Upgrade to Spring Modulith 1.0.0 Closes gh-1286 --- start-site/src/main/resources/application.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b3179fb636..d7794ac314 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -135,8 +135,7 @@ initializr: artifactId: spring-modulith-bom mappings: - compatibility-range: "[3.1.0,3.2.0-M1)" - version: 1.0.0-RC2 - repositories: spring-milestones + version: 1.0.0 spring-shell: groupId: org.springframework.shell artifactId: spring-shell-dependencies From 483064bc27b49f17f42c51af5ee93fe392b46735 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 21 Aug 2023 20:05:07 +0000 Subject: [PATCH 145/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 254781ed09..d00353af87 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:76acae7a34137b462c9a28b00114d1963c5d64e43a514cc342d1191b3d63c62a + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d09b97d54e03807c98f1e794053a39e54117382fd37e071f8b263747224d4fbf lifecycle: preStop: exec: From 5ffc23af7357acf2863f32de43b5afa850e5ab5d Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 22 Aug 2023 11:13:10 +0300 Subject: [PATCH 146/825] Upgrade to Vaadin 24.1.6, 24.0.13, 23.3.21 See gh-1287 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d7794ac314..8a7c947da9 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -163,11 +163,11 @@ initializr: - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.20 + version: 23.3.21 - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 24.0.12 + version: 24.0.13 - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 24.1.5 + version: 24.1.6 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From 23c91862240c2bd0d51919dc611cbec496c3a5ab Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 22 Aug 2023 10:14:59 +0000 Subject: [PATCH 147/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index d00353af87..c8f9c736c9 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d09b97d54e03807c98f1e794053a39e54117382fd37e071f8b263747224d4fbf + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:14997a5f71116a7587255885fc47b7dc48efd41603ac9e92b0306bf74cba5d77 lifecycle: preStop: exec: From f44969dd68ffb87ac987eec579d029db1546665d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 20 Aug 2023 20:06:48 -0600 Subject: [PATCH 148/825] Restore R2DBC MySQL support with Spring Boot 3.1 or later `io.asyncer:r2dbc-mysql` was added in the dependency management in spring boot 3.1. Currently, when r2dbc and mysql are selected the generated project doesn't include the new dependency. This commit fixes the behavior. See gh-1285 --- .../dependency/springdata/R2dbcBuildCustomizer.java | 9 +++++++++ .../springdata/R2dbcBuildCustomizerTests.java | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java index 9bf352c5ba..72f79b2e77 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java @@ -38,6 +38,7 @@ * @author Stephane Nicoll * @author Andy Wilkinson * @author Brian Clozel + * @author Eddú Meléndez */ public class R2dbcBuildCustomizer implements BuildCustomizer { @@ -47,16 +48,21 @@ public class R2dbcBuildCustomizer implements BuildCustomizer { private static final VersionRange SPRING_BOOT_3_0_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0-M1"); + private static final VersionRange SPRING_BOOT_3_1_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.1.0"); + private final boolean borcaOrLater; private final boolean mariaDbIsUnmanaged; private final boolean sqlServerIsUnmanaged; + private final boolean mysqlR2dbcNewDependency; + public R2dbcBuildCustomizer(Version platformVersion) { this.borcaOrLater = SPRING_BOOT_2_7_0_OR_LATER.match(platformVersion); this.mariaDbIsUnmanaged = SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion); this.sqlServerIsUnmanaged = SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion); + this.mysqlR2dbcNewDependency = SPRING_BOOT_3_1_0_OR_LATER.match(platformVersion); } @Override @@ -71,6 +77,9 @@ public void customize(Build build) { if (build.dependencies().has("mysql") && !this.borcaOrLater) { addManagedDriver(build.dependencies(), "dev.miku", "r2dbc-mysql"); } + if (build.dependencies().has("mysql") && this.mysqlR2dbcNewDependency) { + addManagedDriver(build.dependencies(), "io.asyncer", "r2dbc-mysql"); + } if (build.dependencies().has("postgresql")) { String groupId = this.borcaOrLater ? "org.postgresql" : "io.r2dbc"; addManagedDriver(build.dependencies(), groupId, "r2dbc-postgresql"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java index 40479d9c22..638dd1dac1 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java @@ -33,6 +33,7 @@ * Tests for {@link R2dbcBuildCustomizer}. * * @author Stephane Nicoll + * @author Eddú Meléndez */ class R2dbcBuildCustomizerTests extends AbstractExtensionTests { @@ -72,6 +73,7 @@ void r2dbcWithMysql() { build.dependencies().add("mysql"); customize(build, Version.parse("2.6.8")); assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "mysql", "r2dbc-mysql"); + assertThat(build.dependencies().get("r2dbc-mysql").getGroupId()).isEqualTo("dev.miku"); } @Test @@ -83,6 +85,16 @@ void r2dbcWithMysqlAndBorca() { assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "mysql"); } + @Test + void r2dbcWithMysqlAndSpringBoot31() { + Build build = createBuild(); + build.dependencies().add("data-r2dbc"); + build.dependencies().add("mysql"); + customize(build, Version.parse("3.1.0")); + assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "mysql", "r2dbc-mysql"); + assertThat(build.dependencies().get("r2dbc-mysql").getGroupId()).isEqualTo("io.asyncer"); + } + @Test void r2dbcWithPostgresql() { Build build = createBuild(); From fb5ff99b46f4cce7d65ca75388c4299fc863dffe Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 22 Aug 2023 15:07:54 +0200 Subject: [PATCH 149/825] Polish "Restore R2DBC MySQL support with Spring Boot 3.1 or later" See gh-1285 --- .../springdata/R2dbcBuildCustomizer.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java index 72f79b2e77..3e0c6051ed 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java @@ -56,13 +56,13 @@ public class R2dbcBuildCustomizer implements BuildCustomizer { private final boolean sqlServerIsUnmanaged; - private final boolean mysqlR2dbcNewDependency; + private final boolean mysqlR2dbcIsAsyncerDependency; public R2dbcBuildCustomizer(Version platformVersion) { this.borcaOrLater = SPRING_BOOT_2_7_0_OR_LATER.match(platformVersion); this.mariaDbIsUnmanaged = SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion); this.sqlServerIsUnmanaged = SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion); - this.mysqlR2dbcNewDependency = SPRING_BOOT_3_1_0_OR_LATER.match(platformVersion); + this.mysqlR2dbcIsAsyncerDependency = SPRING_BOOT_3_1_0_OR_LATER.match(platformVersion); } @Override @@ -74,11 +74,13 @@ public void customize(Build build) { addManagedDriver(build.dependencies(), "org.mariadb", "r2dbc-mariadb", this.mariaDbIsUnmanaged ? "1.1.3" : null); } - if (build.dependencies().has("mysql") && !this.borcaOrLater) { - addManagedDriver(build.dependencies(), "dev.miku", "r2dbc-mysql"); - } - if (build.dependencies().has("mysql") && this.mysqlR2dbcNewDependency) { - addManagedDriver(build.dependencies(), "io.asyncer", "r2dbc-mysql"); + if (build.dependencies().has("mysql")) { + if (!this.borcaOrLater) { + addManagedDriver(build.dependencies(), "dev.miku", "r2dbc-mysql"); + } + else if (this.mysqlR2dbcIsAsyncerDependency) { + addManagedDriver(build.dependencies(), "io.asyncer", "r2dbc-mysql"); + } } if (build.dependencies().has("postgresql")) { String groupId = this.borcaOrLater ? "org.postgresql" : "io.r2dbc"; From 39d85d3fa06893d35e9b26be81ad6159caa3eb21 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 22 Aug 2023 13:22:38 +0000 Subject: [PATCH 150/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index c8f9c736c9..178bca6bd0 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:14997a5f71116a7587255885fc47b7dc48efd41603ac9e92b0306bf74cba5d77 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:1dfb63304542315619b4330891f4d67664294f70b03ac511f5ad8adf310fbf99 lifecycle: preStop: exec: From a9d274ef1319bfe1438e9dfe7297b928002f1d9c Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 25 Aug 2023 10:58:55 +0200 Subject: [PATCH 151/825] Upgrade to Spring Boot 3.1.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6e3381f226..13030873ad 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.2 + 3.1.3 io.spring.start start-parent From d0faf674b8d68cc34da8bd2ce4898e657259f174 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 25 Aug 2023 09:25:22 +0000 Subject: [PATCH 152/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 178bca6bd0..111f5e8a91 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:1dfb63304542315619b4330891f4d67664294f70b03ac511f5ad8adf310fbf99 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c9d3aec552bd17efb051c582abc386e5e72791f4937271b907377f012cd1e4b0 lifecycle: preStop: exec: From cf2e29851d1650b4b58348ebc4631d675ca6739c Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 28 Aug 2023 09:10:42 +0200 Subject: [PATCH 153/825] Upgrade to Spring Cloud Azure 4.11.0 Closes gh-1289 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8a7c947da9..f19d60f116 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -105,7 +105,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 4.10.0 + version: 4.11.0 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" version: 5.4.0 spring-cloud-gcp: From 97d5779ae57365ce9bd21bbc9b9b039dea8471ef Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 28 Aug 2023 09:11:23 +0200 Subject: [PATCH 154/825] Upgrade to Spring Cloud Azure 5.5.0 Closes gh-1288 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f19d60f116..0ecd9c03df 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -107,7 +107,7 @@ initializr: - compatibilityRange: "[2.6.0,3.0.0-M1)" version: 4.11.0 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 5.4.0 + version: 5.5.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From 851b1f7ef8f90c395656e17ef2be5dcecd93a5f7 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 28 Aug 2023 07:33:22 +0000 Subject: [PATCH 155/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 111f5e8a91..cc04fd8fe4 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c9d3aec552bd17efb051c582abc386e5e72791f4937271b907377f012cd1e4b0 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:b3813390ac008ae19264970b9bb0fc2f25e4d09223e61daf62e886dd4faf2e6c lifecycle: preStop: exec: From b92ec4dc7236dea180bc6faf7894b52c596d10ff Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 29 Aug 2023 09:22:28 +0300 Subject: [PATCH 156/825] Upgrade to Vaadin 24.1.7 See gh-1290 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0ecd9c03df..39529ab611 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -167,7 +167,7 @@ initializr: - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" version: 24.0.13 - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 24.1.6 + version: 24.1.7 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From 4f1c333de8a268da12cf1419c3feb3c4d9d57396 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 29 Aug 2023 07:07:44 +0000 Subject: [PATCH 157/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index cc04fd8fe4..5ac1cdff71 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:b3813390ac008ae19264970b9bb0fc2f25e4d09223e61daf62e886dd4faf2e6c + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2335980db2eebd22cb2fb3a89728437f384b780101264c57dfe7432d106624f0 lifecycle: preStop: exec: From 53acf2ef792d1b167c889ab4f19501c7acf730b5 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Tue, 29 Aug 2023 09:26:28 +0200 Subject: [PATCH 158/825] Remove SpringOne banner --- .../src/components/common/layout/Header.js | 5 ---- start-client/src/styles/_main.scss | 23 +------------------ start-client/src/styles/_responsive.scss | 3 --- 3 files changed, 1 insertion(+), 30 deletions(-) diff --git a/start-client/src/components/common/layout/Header.js b/start-client/src/components/common/layout/Header.js index b79b4a8b18..d7cb7f260b 100644 --- a/start-client/src/components/common/layout/Header.js +++ b/start-client/src/components/common/layout/Header.js @@ -14,11 +14,6 @@ function Header() {
  • - diff --git a/start-client/src/styles/_main.scss b/start-client/src/styles/_main.scss index cba40d36c2..70ce292e0e 100644 --- a/start-client/src/styles/_main.scss +++ b/start-client/src/styles/_main.scss @@ -108,7 +108,6 @@ body { // Header #header { - padding-top: 40px; h1, h2 { margin: 0; @@ -1317,24 +1316,4 @@ ul.dependencies-list { display: inline-block; height: 14px; background: $light-placeholder; -} - -.banner { - position: absolute; - top: 0; - right: 5rem; - left: 5rem; - a { - display: block;; - background-color: #6db33f; - color: #FFF; - font-weight: normal; - display: block; - font-size: 0.9rem; - height: 40px; - line-height: 40px; - text-align: center; - text-decoration: none; - cursor: pointer; - } -} +} \ No newline at end of file diff --git a/start-client/src/styles/_responsive.scss b/start-client/src/styles/_responsive.scss index 7fdf9c2ae0..3ebe0d3953 100644 --- a/start-client/src/styles/_responsive.scss +++ b/start-client/src/styles/_responsive.scss @@ -90,9 +90,6 @@ } @media (min-width: 320px) and (max-width: 767px) { - #header { - padding-top: 0; - } #side-left, #side-right { display: none; From 804dfa20825ae9fcaa01fad9e2eaf912a7754b4b Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 29 Aug 2023 07:38:13 +0000 Subject: [PATCH 159/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 5ac1cdff71..539ebd9fba 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2335980db2eebd22cb2fb3a89728437f384b780101264c57dfe7432d106624f0 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:04586ee874ce95cc72e1c13e6a1432506013f2e57bddf09475f4fac1a834812d lifecycle: preStop: exec: From 972dc8f5b61aba0af7eb07767bbe9b0e7f7afb53 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Tue, 29 Aug 2023 16:10:52 +0200 Subject: [PATCH 160/825] Update dependencies --- start-client/yarn.lock | 1012 +++++++++++++++++++++++----------------- 1 file changed, 581 insertions(+), 431 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index b8574fa263..cd1a439ccf 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -25,9 +25,9 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.22.9.tgz#501b3614aeda7399371f6d5991404f069b059986" - integrity sha512-nb2O7AThqRo7/E53EGiuAkMaRbb7J5Qp3RvN+dmua1U+kydm0oznkhqbTEG15yk26G/C3yL6OdZjzgl+DMXVVA== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.22.10.tgz#25e4bbd8d0a0d8b4b389e1b5e2d7a238bd4c1b75" + integrity sha512-rM9ZMmaII630zGvtMtQ3P4GyHs28CHLYE9apLG7L8TgaSqcfoIGrlLSLsh4Q8kDTdZQQEXZm1M0nQtOvU/2heg== dependencies: "@jridgewell/trace-mapping" "^0.3.17" commander "^4.0.1" @@ -40,54 +40,55 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.22.5" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" -"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" - integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" + integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.9" + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" + "@babel/helper-compilation-targets" "^7.22.10" "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.6" - "@babel/parser" "^7.22.7" + "@babel/helpers" "^7.22.11" + "@babel/parser" "^7.22.11" "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.8" - "@babel/types" "^7.22.5" + "@babel/traverse" "^7.22.11" + "@babel/types" "^7.22.11" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" + json5 "^2.2.3" semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz#75f8aa978d1e76c87cc6f26c1ea16ae58804d390" - integrity sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.11.tgz#cceb8c7989c241a16dd14e12a6cd725618f3f58b" + integrity sha512-YjOYZ3j7TjV8OhLW6NCtyg8G04uStATEUe5eiLuCZaXz2VSDQ3dsAtm2D+TuQyAqNMUK2WacGo0/uma9Pein1w== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.22.7", "@babel/generator@^7.22.9", "@babel/generator@^7.7.2": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" - integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== +"@babel/generator@^7.22.10", "@babel/generator@^7.7.2": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" + integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.10" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -100,16 +101,16 @@ "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878" - integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" + integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.10" -"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" - integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== +"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" + integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== dependencies: "@babel/compat-data" "^7.22.9" "@babel/helper-validator-option" "^7.22.5" @@ -117,10 +118,10 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.6": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz#c36ea240bb3348f942f08b0fbe28d6d979fab236" - integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.10", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213" + integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" @@ -141,10 +142,10 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz#af1429c4a83ac316a6a8c2cc8ff45cb5d2998d3a" - integrity sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A== +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -209,7 +210,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.5": +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== @@ -264,36 +265,36 @@ integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== "@babel/helper-wrap-function@^7.22.5", "@babel/helper-wrap-function@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz#189937248c45b0182c1dcf32f3444ca153944cb9" - integrity sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" + integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== dependencies: "@babel/helper-function-name" "^7.22.5" "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.10" -"@babel/helpers@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" - integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== +"@babel/helpers@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" + integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== dependencies: "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.6" - "@babel/types" "^7.22.5" + "@babel/traverse" "^7.22.11" + "@babel/types" "^7.22.11" -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== +"@babel/highlight@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== dependencies: "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" + chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7", "@babel/parser@^7.7.0": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" - integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.11", "@babel/parser@^7.22.5", "@babel/parser@^7.7.0": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.13.tgz#23fb17892b2be7afef94f573031c2f4b42839a2b" + integrity sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" @@ -320,15 +321,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.13.15": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz#9b5b73c2e404f0869ef8a8a53765f8203c5467a7" - integrity sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.10.tgz#d6a8c3a9018e1b13e6647f869c5ea56ff2b585d4" + integrity sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.6" + "@babel/helper-create-class-features-plugin" "^7.22.10" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/plugin-syntax-decorators" "^7.22.5" + "@babel/plugin-syntax-decorators" "^7.22.10" "@babel/plugin-proposal-do-expressions@^7.12.13": version "7.22.5" @@ -441,14 +442,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-throw-expressions" "^7.22.5" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -477,10 +470,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz#329fe2907c73de184033775637dbbc507f09116a" - integrity sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA== +"@babel/plugin-syntax-decorators@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz#7d83ea04d893c442b78ebf4c3cbac59a7211deff" + integrity sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -653,14 +646,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.22.7": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz#053e76c0a903b72b573cb1ab7d6882174d460a1b" - integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== +"@babel/plugin-transform-async-generator-functions@^7.22.10": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz#dbe3b1ff5a52e2e5edc4b19a60d325a675ed2649" + integrity sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-transform-async-to-generator@^7.22.5": @@ -679,10 +672,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" - integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== +"@babel/plugin-transform-block-scoping@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" + integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -695,11 +688,11 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-class-static-block@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" - integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -726,14 +719,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" - integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== +"@babel/plugin-transform-destructuring@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" + integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== @@ -749,9 +742,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-dynamic-import@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" - integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" @@ -765,9 +758,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-export-namespace-from@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" - integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" @@ -789,9 +782,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-json-strings@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" - integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-json-strings" "^7.8.3" @@ -804,9 +797,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-logical-assignment-operators@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" - integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -827,21 +820,21 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-modules-commonjs@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" - integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz#d7991d3abad199c03b68ee66a64f216c47ffdfae" + integrity sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g== dependencies: - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" "@babel/plugin-transform-modules-systemjs@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" - integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" + integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.5" @@ -869,28 +862,28 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" - integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-transform-numeric-separator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" - integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-transform-object-rest-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" - integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz#dbbb06ce783cd994a8f430d8cefa553e9b42ca62" + integrity sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw== dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.10" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.22.5" @@ -904,17 +897,17 @@ "@babel/helper-replace-supers" "^7.22.5" "@babel/plugin-transform-optional-catch-binding@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" - integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz#4bacfe37001fe1901117672875e931d439811564" - integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== +"@babel/plugin-transform-optional-chaining@^7.22.10", "@babel/plugin-transform-optional-chaining@^7.22.5": + version "7.22.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz#d7ebf6a88cd2f4d307b0e000ab630acd8124b333" + integrity sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -936,12 +929,12 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-private-property-in-object@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" - integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" @@ -985,13 +978,13 @@ "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" - integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - regenerator-transform "^0.15.1" + regenerator-transform "^0.15.2" "@babel/plugin-transform-reserved-words@^7.22.5": version "7.22.5" @@ -1001,15 +994,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.18.5": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz#a87b11e170cbbfb018e6a2bf91f5c6e533b9e027" - integrity sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz#89eda6daf1d3af6f36fb368766553054c8d7cd46" + integrity sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA== dependencies: "@babel/helper-module-imports" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.4" - babel-plugin-polyfill-corejs3 "^0.8.2" - babel-plugin-polyfill-regenerator "^0.5.1" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.22.5": @@ -1048,10 +1041,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" - integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -1080,12 +1073,12 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.9.tgz#57f17108eb5dfd4c5c25a44c1977eba1df310ac7" - integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.10.tgz#3263b9fe2c8823d191d28e61eac60a79f9ce8a0f" + integrity sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.10" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" @@ -1110,15 +1103,15 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-generator-functions" "^7.22.10" "@babel/plugin-transform-async-to-generator" "^7.22.5" "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.10" "@babel/plugin-transform-class-properties" "^7.22.5" "@babel/plugin-transform-class-static-block" "^7.22.5" "@babel/plugin-transform-classes" "^7.22.6" "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.10" "@babel/plugin-transform-dotall-regex" "^7.22.5" "@babel/plugin-transform-duplicate-keys" "^7.22.5" "@babel/plugin-transform-dynamic-import" "^7.22.5" @@ -1141,38 +1134,36 @@ "@babel/plugin-transform-object-rest-spread" "^7.22.5" "@babel/plugin-transform-object-super" "^7.22.5" "@babel/plugin-transform-optional-catch-binding" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-optional-chaining" "^7.22.10" "@babel/plugin-transform-parameters" "^7.22.5" "@babel/plugin-transform-private-methods" "^7.22.5" "@babel/plugin-transform-private-property-in-object" "^7.22.5" "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" "@babel/plugin-transform-reserved-words" "^7.22.5" "@babel/plugin-transform-shorthand-properties" "^7.22.5" "@babel/plugin-transform-spread" "^7.22.5" "@babel/plugin-transform-sticky-regex" "^7.22.5" "@babel/plugin-transform-template-literals" "^7.22.5" "@babel/plugin-transform-typeof-symbol" "^7.22.5" - "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" "@babel/plugin-transform-unicode-property-regex" "^7.22.5" "@babel/plugin-transform-unicode-regex" "^7.22.5" "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.4" - babel-plugin-polyfill-corejs3 "^0.8.2" - babel-plugin-polyfill-regenerator "^0.5.1" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.10" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" core-js-compat "^3.31.0" semver "^6.3.1" -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" @@ -1194,11 +1185,11 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" - integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" + integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== dependencies: - regenerator-runtime "^0.13.11" + regenerator-runtime "^0.14.0" "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.5" @@ -1209,26 +1200,26 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.22.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" - integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.22.11", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" + integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.7" + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.7" - "@babel/types" "^7.22.5" + "@babel/parser" "^7.22.11" + "@babel/types" "^7.22.11" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" - integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" + integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== dependencies: "@babel/helper-string-parser" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.5" @@ -1251,15 +1242,15 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== +"@eslint-community/regexpp@^4.6.1": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" + integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== -"@eslint/eslintrc@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d" - integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1271,10 +1262,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.44.0": - version "8.44.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" - integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== +"@eslint/js@8.48.0": + version "8.48.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" + integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== "@gar/promisify@^1.0.1": version "1.1.3" @@ -1831,10 +1822,10 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/set-array@^1.0.1": version "1.1.2" @@ -1849,23 +1840,18 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" @@ -1892,11 +1878,6 @@ dependencies: eslint-scope "5.1.1" -"@nicolo-ribaudo/semver-v6@^6.3.3": - version "6.3.3" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" - integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2099,9 +2080,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.44.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.0.tgz#55818eabb376e2272f77fbf5c96c43137c3c1e53" - integrity sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw== + version "8.44.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" + integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2117,9 +2098,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.35" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" - integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + version "4.17.36" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz#baa9022119bdc05a4adfe740ffc97b5f9360e545" + integrity sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2237,9 +2218,9 @@ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node@*": - version "20.4.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" - integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== + version "20.5.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" + integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== "@types/node@16.9.1": version "16.9.1" @@ -2284,9 +2265,9 @@ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/semver@^7.3.12": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + version "7.5.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" + integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== "@types/send@*": version "0.17.1" @@ -2602,12 +2583,10 @@ agent-base@6, agent-base@^6.0.2: debug "4" agentkeepalive@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" - integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== dependencies: - debug "^4.1.0" - depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -2637,7 +2616,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2832,6 +2811,17 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +array.prototype.findlastindex@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz#bc229aef98f6bd0533a2bc61ff95209875526c9b" + integrity sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + array.prototype.flat@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" @@ -2917,6 +2907,13 @@ async@^3.2.3: resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -3015,29 +3012,29 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz#9f9a0e1cd9d645cc246a5e094db5c3aa913ccd2b" - integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA== +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.1" - "@nicolo-ribaudo/semver-v6" "^6.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz#d406c5738d298cd9c66f64a94cf8d5904ce4cc5e" - integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ== +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.1" + "@babel/helper-define-polyfill-provider" "^0.4.2" core-js-compat "^3.31.0" -babel-plugin-polyfill-regenerator@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz#ace7a5eced6dff7d5060c335c52064778216afd3" - integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw== +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.1" + "@babel/helper-define-polyfill-provider" "^0.4.2" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -3196,14 +3193,14 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.9: - version "4.21.9" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== +browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.9: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" update-browserslist-db "^1.0.11" bser@2.1.1: @@ -3349,17 +3346,17 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001503: - version "1.0.30001517" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz#90fabae294215c3495807eb24fc809e11dc2f0a8" - integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== +caniuse-lite@^1.0.30001517: + version "1.0.30001524" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz#1e14bce4f43c41a7deaeb5ebfe86664fe8dadb80" + integrity sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: +chalk@^2.1.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3693,11 +3690,11 @@ copy-webpack-plugin@^11.0.0: serialize-javascript "^6.0.0" core-js-compat@^3.31.0: - version "3.31.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.1.tgz#5084ad1a46858df50ff89ace152441a63ba7aae0" - integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== + version "3.32.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" + integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== dependencies: - browserslist "^4.21.9" + browserslist "^4.21.10" core-util-is@1.0.2: version "1.0.2" @@ -3921,7 +3918,7 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@2.0.0, depd@^2.0.0: +depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -3991,9 +3988,9 @@ dns-equal@^1.0.0: integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^5.2.2: - version "5.6.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" - integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -4094,10 +4091,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.431: - version "1.4.466" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.466.tgz#17193d70f203da3d52a89c653b8d89f47a51d79d" - integrity sha512-TSkRvbXRXD8BwhcGlZXDsbI2lRoP8dvqR7LQnqQNk9KxXBc4tG8O+rTuXgTyIpEdiqSGKEBSqrxdqEntnjNncA== +electron-to-chromium@^1.4.477: + version "1.4.504" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.504.tgz#975522945676cf2d55910988a169f07b83081488" + integrity sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ== emittery@^0.10.2: version "0.10.2" @@ -4178,7 +4175,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.20.4: +es-abstract@^1.20.4, es-abstract@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== @@ -4223,6 +4220,26 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: unbox-primitive "^1.0.2" which-typed-array "^1.1.10" +es-iterator-helpers@^1.0.12: + version "1.0.14" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz#19cd7903697d97e21198f3293b55e8985791c365" + integrity sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.0" + safe-array-concat "^1.0.0" + es-module-lexer@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" @@ -4298,20 +4315,20 @@ eslint-config-airbnb@^19.0.4: object.entries "^1.1.5" eslint-config-prettier@^8.2.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" - integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + is-core-module "^2.13.0" + resolve "^1.22.4" -eslint-module-utils@^2.7.4: +eslint-module-utils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== @@ -4319,25 +4336,27 @@ eslint-module-utils@^2.7.4: debug "^3.2.7" eslint-plugin-import@^2.22.1: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + version "2.28.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" + integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== dependencies: array-includes "^3.1.6" + array.prototype.findlastindex "^1.2.2" array.prototype.flat "^1.3.1" array.prototype.flatmap "^1.3.1" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" + eslint-module-utils "^2.8.0" has "^1.0.3" - is-core-module "^2.11.0" + is-core-module "^2.13.0" is-glob "^4.0.3" minimatch "^3.1.2" + object.fromentries "^2.0.6" + object.groupby "^1.0.0" object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" + semver "^6.3.1" + tsconfig-paths "^3.14.2" eslint-plugin-jest@^26.5.3: version "26.9.0" @@ -4381,14 +4400,15 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.23.2: - version "7.32.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" @@ -4398,7 +4418,7 @@ eslint-plugin-react@^7.23.2: object.values "^1.1.6" prop-types "^15.8.1" resolve "^2.0.0-next.4" - semver "^6.3.0" + semver "^6.3.1" string.prototype.matchall "^4.0.8" eslint-scope@5.1.1, eslint-scope@^5.1.1: @@ -4417,10 +4437,10 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^7.2.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.1.tgz#936821d3462675f25a18ac5fd88a67cc15b393bd" - integrity sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -4442,10 +4462,10 @@ eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^5.0.0: version "5.16.0" @@ -4490,26 +4510,26 @@ eslint@^5.0.0: text-table "^0.2.0" eslint@^8.17.0: - version "8.45.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" - integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== + version "8.48.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155" + integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.1.0" - "@eslint/js" "8.44.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.48.0" "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.6.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -4541,7 +4561,7 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -espree@^9.6.0: +espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== @@ -4779,9 +4799,9 @@ fast-glob@^2.2.6: micromatch "^3.1.10" fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" - integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -4972,11 +4992,12 @@ flat-cache@^2.0.1: write "1.0.3" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== dependencies: - flatted "^3.1.0" + flatted "^3.2.7" + keyv "^4.5.3" rimraf "^3.0.2" flatted@^2.0.0: @@ -4984,7 +5005,7 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -flatted@^3.1.0: +flatted@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== @@ -5070,9 +5091,9 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: version "1.1.1" @@ -5080,21 +5101,21 @@ function-bind@^1.1.1: integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2, functions-have-names@^1.2.3: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -5285,9 +5306,9 @@ globals@^11.1.0, globals@^11.7.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + version "13.21.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== dependencies: type-fest "^0.20.2" @@ -5705,9 +5726,9 @@ immediate@~3.0.5: integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== immutable@^4.0.0, immutable@^4.0.0-rc.12: - version "4.3.1" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.1.tgz#17988b356097ab0719e2f741d56f3ec6c317f9dc" - integrity sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A== + version "4.3.4" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" + integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== import-fresh@^2.0.0: version "2.0.0" @@ -5862,7 +5883,7 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -internal-slot@^1.0.3, internal-slot@^1.0.5: +internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== @@ -5924,6 +5945,13 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -5975,10 +6003,10 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== +is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.9.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -5996,7 +6024,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -6048,6 +6076,13 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -6075,6 +6110,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -6094,6 +6136,11 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -6168,6 +6215,11 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== +is-set@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -6211,6 +6263,11 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -6218,6 +6275,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -6279,12 +6344,12 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: semver "^6.3.0" istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -6297,13 +6362,24 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +iterator.prototype@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.0.tgz#690c88b043d821f783843aaf725d7ac3b62e3b46" + integrity sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw== + dependencies: + define-properties "^1.1.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + has-tostringtag "^1.0.0" + reflect.getprototypeof "^1.0.3" + jake@^10.8.5: version "10.8.7" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" @@ -6798,6 +6874,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -6840,7 +6921,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: +json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -6870,9 +6951,9 @@ jsprim@^1.2.2: verror "1.10.0" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: - version "3.3.4" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz#b896535fed5b867650acce5a9bd4135ffc7b3bf9" - integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: array-includes "^3.1.6" array.prototype.flat "^1.3.1" @@ -6889,6 +6970,13 @@ jszip@^3.6.0: readable-stream "~2.3.6" setimmediate "^1.0.5" +keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -7106,13 +7194,20 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + make-fetch-happen@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" @@ -7756,9 +7851,9 @@ no-case@^3.0.4: tslib "^2.0.3" node-fetch@^2.6.12: - version "2.6.12" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" - integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -7788,7 +7883,7 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.12: +node-releases@^2.0.13: version "2.0.13" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== @@ -7939,30 +8034,40 @@ object.assign@^4.1.2, object.assign@^4.1.4: object-keys "^1.1.1" object.entries@^1.1.5, object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.pick@^1.3.0: version "1.3.0" @@ -7972,13 +8077,13 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -8395,9 +8500,9 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.4.21: - version "8.4.26" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" - integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== + version "8.4.28" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.28.tgz#c6cc681ed00109072816e1557f889ef51cf950a5" + integrity sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -8791,6 +8896,18 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reflect.getprototypeof@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz#2738fd896fcc3477ffbd4190b40c2458026b6928" + integrity sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -8803,15 +8920,20 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.3: +regenerator-runtime@^0.13.3: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" @@ -8823,7 +8945,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: +regexp.prototype.flags@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== @@ -8979,12 +9101,12 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.8.1, resolve@^1.9.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.4, resolve@^1.8.1, resolve@^1.9.0: + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== dependencies: - is-core-module "^2.11.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -9141,9 +9263,9 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.64.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.64.0.tgz#9ca8d0acb1a704b86b7f1197dc310f568fb34638" - integrity sha512-m7YtAGmQta9uANIUJwXesAJMSncqH+3INc8kdVXs6eV6GUC8Qu2IYKQSN8PRLgiQfpca697G94klm2leYMxSHw== + version "1.66.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1" + integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9219,7 +9341,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: +semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -9704,17 +9826,17 @@ string-width@^3.0.0: strip-ansi "^5.1.0" string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + version "4.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz#148779de0f75d36b13b15885fec5cadde994520d" + integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" side-channel "^1.0.4" string.prototype.trim@^1.2.7: @@ -9851,9 +9973,9 @@ style-loader@^3.3.1: integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== style-to-object@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37" - integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== + version "0.4.2" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.2.tgz#a8247057111dea8bd3b8a1a66d2d0c9cf9218a54" + integrity sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA== dependencies: inline-style-parser "0.1.1" @@ -9953,9 +10075,9 @@ terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: - version "5.19.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.1.tgz#dbd7231f224a9e2401d0f0959542ed74d76d340b" - integrity sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q== + version "5.19.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e" + integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10110,7 +10232,7 @@ trough@^2.0.0: dependencies: glob "^7.1.2" -tsconfig-paths@^3.14.1: +tsconfig-paths@^3.14.2: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== @@ -10126,9 +10248,9 @@ tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" - integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsutils@^3.21.0: version "3.21.0" @@ -10740,12 +10862,40 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.10, which-typed-array@^1.1.11: +which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.9: version "1.1.11" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== @@ -10783,9 +10933,9 @@ wildcard@^2.0.0: integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== word-wrap@~1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" - integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== workbox-background-sync@6.6.1: version "6.6.1" From 5024cc1e14fd16c18649fa8456270d8767c8f711 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 5 Sep 2023 07:21:32 +0000 Subject: [PATCH 161/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 539ebd9fba..43e93f2a81 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:04586ee874ce95cc72e1c13e6a1432506013f2e57bddf09475f4fac1a834812d + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f606a7a056209ac7a6487af80e344ca70487ed0456105aa8a6bee043bf033d10 lifecycle: preStop: exec: From af637aaba3b835d417068d89694f601a33cd020f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 6 Sep 2023 18:20:15 +0000 Subject: [PATCH 162/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 43e93f2a81..2a94cf3c6e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f606a7a056209ac7a6487af80e344ca70487ed0456105aa8a6bee043bf033d10 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:98fdec06fb725075c991485f4e8cf8a12597454e3b0aa5a93313e3aae62e9d56 lifecycle: preStop: exec: From 88afbdbc73902e2af72a3b0c8094fbce57c8a652 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 6 Sep 2023 19:05:15 +0000 Subject: [PATCH 163/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 2a94cf3c6e..c453e92bcd 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:98fdec06fb725075c991485f4e8cf8a12597454e3b0aa5a93313e3aae62e9d56 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:60f2d067d758421a17bd3bf049eed8f98874e73adf6b1a86f30565dff0cd32cc lifecycle: preStop: exec: From 79a1b4790422b7322cf5243050c1d70430825c61 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Thu, 7 Sep 2023 16:31:25 +0300 Subject: [PATCH 164/825] Upgrade to Vaadin 24.1.8, 24.0.14, 23.3.22 See gh-1292 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 39529ab611..ed579270c5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -163,11 +163,11 @@ initializr: - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.21 + version: 23.3.22 - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 24.0.13 + version: 24.0.14 - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 24.1.7 + version: 24.1.8 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From 465f11604bf901b1c94f2018551d9a61768085cd Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Thu, 7 Sep 2023 16:32:27 +0300 Subject: [PATCH 165/825] Upgrade to hilla 2.1.8 See gh-1293 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ed579270c5..53f74e6c0e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -57,7 +57,7 @@ initializr: versionProperty: hilla.version mappings: - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 2.1.4 + version: 2.1.8 sentry: groupId: io.sentry artifactId: sentry-bom From f63b199a1e413ca20e47e4fe84b49fac144ce3dc Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 8 Sep 2023 10:25:28 +0000 Subject: [PATCH 166/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index c453e92bcd..61e809adad 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:60f2d067d758421a17bd3bf049eed8f98874e73adf6b1a86f30565dff0cd32cc + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5b706a48427e80ed8f6801e68a96c9fdb485257ce02d176c95157eebb424f6cc lifecycle: preStop: exec: From d9c5de63650171865f9cec69ed22c8282ec46f9e Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Fri, 8 Sep 2023 13:30:59 +0300 Subject: [PATCH 167/825] Use Vaadin 24.1 for Spring Boot 3.0.x as well See gh-1295 --- start-site/src/main/resources/application.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 53f74e6c0e..af908e01dd 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -160,13 +160,9 @@ initializr: artifactId: vaadin-bom versionProperty: vaadin.version mappings: - - compatibilityRange: "[2.6.0,2.7.0-M1)" - version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 23.3.22 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 24.0.14 - - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" + - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" version: 24.1.8 wavefront: groupId: com.wavefront From 8ac331376f9f590f6e34033f5979d6a1ceb653fd Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 8 Sep 2023 15:50:16 +0200 Subject: [PATCH 168/825] Polish "Use Vaadin 24.1 for Spring Boot 3.0.x as well" See gh-1295 --- start-site/src/main/resources/application.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index af908e01dd..c9bf04d8a9 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -160,6 +160,8 @@ initializr: artifactId: vaadin-bom versionProperty: vaadin.version mappings: + - compatibilityRange: "[2.6.0,2.7.0-M1)" + version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 23.3.22 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" From 0cc9cef03a5ffd0fc0339f099b7c0423394995a3 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 8 Sep 2023 14:27:33 +0000 Subject: [PATCH 169/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 61e809adad..314d80664c 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5b706a48427e80ed8f6801e68a96c9fdb485257ce02d176c95157eebb424f6cc + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:cfbf4085a351c8d6515368fa1b383b1bad6920b534ade024d6b77bd01c73d5d6 lifecycle: preStop: exec: From dc174b71b2bb1da1e7f01b0d0dc48f5abecf0853 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 11 Sep 2023 21:39:45 +0000 Subject: [PATCH 170/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 314d80664c..741ea01912 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:cfbf4085a351c8d6515368fa1b383b1bad6920b534ade024d6b77bd01c73d5d6 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4f5de86c86a6d0f83a9cf907535203b0ed27d47fde715c9a28c50478d1503ae6 lifecycle: preStop: exec: From c0f91c9a259c8e63b045f2d04111fa45f7a34c28 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 12 Sep 2023 09:10:56 +0300 Subject: [PATCH 171/825] Upgrade to Hilla 2.1.9 See gh-1297 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c9bf04d8a9..cd3ec0b82f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -57,7 +57,7 @@ initializr: versionProperty: hilla.version mappings: - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" - version: 2.1.8 + version: 2.1.9 sentry: groupId: io.sentry artifactId: sentry-bom From 152d1f948d571497c18d4eaa5a79fe52f59cb287 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 12 Sep 2023 09:11:51 +0300 Subject: [PATCH 172/825] Upgrade to Vaadin 24.1.9 and 23.3.23 See gh-1298 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c9bf04d8a9..015c6203c5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -163,9 +163,9 @@ initializr: - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.22 + version: 23.3.23 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 24.1.8 + version: 24.1.9 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From 048553aff1d876b59e488d7ce1bc01c125745dcc Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 12 Sep 2023 11:09:14 +0000 Subject: [PATCH 173/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 741ea01912..3837159317 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4f5de86c86a6d0f83a9cf907535203b0ed27d47fde715c9a28c50478d1503ae6 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:a739fc635be6f2b99829ec49d2ce1a8ba03f9d4be5ac1323f43ceb20a3397b76 lifecycle: preStop: exec: From c15fff0ef8fcdc8cb04e6ae4e669f61b9bd3f814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 14 Sep 2023 16:20:42 +0200 Subject: [PATCH 174/825] Pin start-site on Initializr 0.20.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 13030873ad..57abd340f8 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 0.0.1-SNAPSHOT false - 0.20.1-SNAPSHOT + 0.20.1 0.0.39 From 07949573227ba4f4704a0fb12ecece03f7650633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 14 Sep 2023 17:19:47 +0200 Subject: [PATCH 175/825] Start building against Spring Initializr 0.21.0 snapshots --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 57abd340f8..694ad4c2db 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 0.0.1-SNAPSHOT false - 0.20.1 + 0.21.0-SNAPSHOT 0.0.39 From bb2579f94934c8da1304dce9f123cf42cd393a48 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 14 Sep 2023 15:45:58 +0000 Subject: [PATCH 176/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 3837159317..49ba4820c6 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:a739fc635be6f2b99829ec49d2ce1a8ba03f9d4be5ac1323f43ceb20a3397b76 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f9bf916374713b1297fbea59689aab5ff127152d0440139281d3eddeea37cfb8 lifecycle: preStop: exec: From e1d85b7db21e43f9a7fa97bf2b78bf9b0e1c9d0f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 14 Sep 2023 20:44:15 +0000 Subject: [PATCH 177/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 49ba4820c6..a0987838d9 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f9bf916374713b1297fbea59689aab5ff127152d0440139281d3eddeea37cfb8 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:e1d5ff1f093949a4553203d26a1b1f92398a3a9370799900681b65f3c40cdc8c lifecycle: preStop: exec: From 85a17e74bd18d273c6c385a4e636eb6c433843e3 Mon Sep 17 00:00:00 2001 From: Chris Bono Date: Thu, 7 Sep 2023 19:55:19 -0500 Subject: [PATCH 178/825] Add optional 'command' to Docker compose service See gh-1294 --- .../start/site/container/DockerService.java | 107 ++++++++++++++++-- .../SimpleDockerServiceResolver.java | 57 +++++++--- .../site/container/DockerServiceTests.java | 77 +++++++++++++ 3 files changed, 216 insertions(+), 25 deletions(-) create mode 100644 start-site/src/test/java/io/spring/start/site/container/DockerServiceTests.java diff --git a/start-site/src/main/java/io/spring/start/site/container/DockerService.java b/start-site/src/main/java/io/spring/start/site/container/DockerService.java index d7ec540b98..cece024c30 100644 --- a/start-site/src/main/java/io/spring/start/site/container/DockerService.java +++ b/start-site/src/main/java/io/spring/start/site/container/DockerService.java @@ -16,16 +16,21 @@ package io.spring.start.site.container; +import java.util.Arrays; +import java.util.Collection; +import java.util.Set; +import java.util.TreeSet; import java.util.function.Consumer; -import io.spring.initializr.generator.container.docker.compose.ComposeService.Builder; +import io.spring.initializr.generator.container.docker.compose.ComposeService; /** * Description of a Docker service. * * @author Stephane Nicoll + * @author Chris Bono */ -public class DockerService implements Consumer { +public final class DockerService implements Consumer { private final String image; @@ -33,13 +38,25 @@ public class DockerService implements Consumer { private final String website; + private final String command; + private final int[] ports; - DockerService(String image, String imageTag, String website, int... ports) { - this.image = image; - this.imageTag = imageTag; - this.website = website; - this.ports = ports; + private DockerService(DockerService.Builder builder) { + this.image = builder.image; + this.imageTag = builder.imageTag; + this.website = builder.website; + this.command = builder.command; + this.ports = builder.ports.stream().mapToInt(Number::intValue).toArray(); + } + + /** + * Return a new builder using the specified image and optional tag. + * @param imageAndTag the image (and optional tag) to use for the service + * @return the new builder instance. + */ + public static DockerService.Builder withImageAndTag(String imageAndTag) { + return new DockerService.Builder(imageAndTag); } /** @@ -67,6 +84,14 @@ public String getWebsite() { return this.website; } + /** + * Return the command to use to override the default command (optional). + * @return the command + */ + public String getCommand() { + return this.command; + } + /** * Return the ports that should be exposed by the service. * @return the ports to expose @@ -76,8 +101,72 @@ public int[] getPorts() { } @Override - public void accept(Builder builder) { - builder.image(this.image).imageTag(this.imageTag).imageWebsite(this.website).ports(this.ports); + public void accept(ComposeService.Builder builder) { + builder.image(this.image) + .imageTag(this.imageTag) + .imageWebsite(this.website) + .command(this.command) + .ports(this.ports); + } + + /** + * Builder for {@link DockerService}. + */ + public static class Builder { + + private String image; + + private String imageTag = "latest"; + + private String website; + + private String command; + + private final Set ports = new TreeSet<>(); + + protected Builder(String imageAndTag) { + String[] split = imageAndTag.split(":", 2); + String tag = (split.length == 1) ? "latest" : split[1]; + image(split[0]).imageTag(tag); + } + + public DockerService.Builder image(String image) { + this.image = image; + return this; + } + + public DockerService.Builder imageTag(String imageTag) { + this.imageTag = imageTag; + return this; + } + + public DockerService.Builder website(String website) { + this.website = website; + return this; + } + + public DockerService.Builder command(String command) { + this.command = command; + return this; + } + + public DockerService.Builder ports(Collection ports) { + this.ports.addAll(ports); + return this; + } + + public DockerService.Builder ports(int... ports) { + return ports(Arrays.stream(ports).boxed().toList()); + } + + /** + * Builds the {@link DockerService} instance. + * @return the built instance + */ + public DockerService build() { + return new DockerService(this); + } + } } diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index f81853f084..7efbf0cdbb 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -25,6 +25,7 @@ * * @author Stephane Nicoll * @author Moritz Halbritter + * @author Chris Bono */ public class SimpleDockerServiceResolver implements DockerServiceResolver { @@ -48,59 +49,83 @@ public SimpleDockerServiceResolver() { } private static DockerService activeMQ() { - return new DockerService("symptoma/activemq", "latest", "https://hub.docker.com/r/symptoma/activemq", 61616); + return DockerService.withImageAndTag("symptoma/activemq") + .website("https://hub.docker.com/r/symptoma/activemq") + .ports(61616) + .build(); } private static DockerService cassandra() { - return new DockerService("cassandra", "latest", "https://hub.docker.com/_/cassandra", 9042); + return DockerService.withImageAndTag("cassandra") + .website("https://hub.docker.com/_/cassandra") + .ports(9042) + .build(); } private static DockerService elasticsearch() { // They don't provide a 'latest' tag - return new DockerService("docker.elastic.co/elasticsearch/elasticsearch", "7.17.10", - "https://www.docker.elastic.co/r/elasticsearch", 9200, 9300); + return DockerService.withImageAndTag("docker.elastic.co/elasticsearch/elasticsearch:7.17.10") + .website("https://www.docker.elastic.co/r/elasticsearch") + .ports(9200, 9300) + .build(); } private static DockerService kafka() { - return new DockerService("confluentinc/cp-kafka", "latest", "https://hub.docker.com/r/confluentinc/cp-kafka", - 9092); + return DockerService.withImageAndTag("confluentinc/cp-kafka") + .website("https://hub.docker.com/r/confluentinc/cp-kafka") + .ports(9092) + .build(); } private static DockerService mariaDb() { - return new DockerService("mariadb", "latest", "https://hub.docker.com/_/mariadb", 3306); + return DockerService.withImageAndTag("mariadb").website("https://hub.docker.com/_/mariadb").ports(3306).build(); } private static DockerService mongoDb() { - return new DockerService("mongo", "latest", "https://hub.docker.com/_/mongo", 27017); + return DockerService.withImageAndTag("mongo").website("https://hub.docker.com/_/mongo").ports(27017).build(); } private static DockerService mysql() { - return new DockerService("mysql", "latest", "https://hub.docker.com/_/mysql", 3306); + return DockerService.withImageAndTag("mysql").website("https://hub.docker.com/_/mysql").ports(3306).build(); } private static DockerService oracle() { - return new DockerService("gvenzl/oracle-xe", "latest", "https://hub.docker.com/r/gvenzl/oracle-xe", 1521); + return DockerService.withImageAndTag("gvenzl/oracle-xe") + .website("https://hub.docker.com/r/gvenzl/oracle-xe") + .ports(1521) + .build(); } private static DockerService postgres() { - return new DockerService("postgres", "latest", "https://hub.docker.com/_/postgres", 5432); + return DockerService.withImageAndTag("postgres") + .website("https://hub.docker.com/_/postgres") + .ports(5432) + .build(); } private static DockerService rabbit() { - return new DockerService("rabbitmq", "latest", "https://hub.docker.com/_/rabbitmq", 5672); + return DockerService.withImageAndTag("rabbitmq") + .website("https://hub.docker.com/_/rabbitmq") + .ports(5672) + .build(); } private static DockerService redis() { - return new DockerService("redis", "latest", "https://hub.docker.com/_/redis", 6379); + return DockerService.withImageAndTag("redis").website("https://hub.docker.com/_/redis").ports(6379).build(); } private static DockerService sqlServer() { - return new DockerService("mcr.microsoft.com/mssql/server", "latest", - "https://mcr.microsoft.com/en-us/product/mssql/server/about/", 1433); + return DockerService.withImageAndTag("mcr.microsoft.com/mssql/server") + .website("https://mcr.microsoft.com/en-us/product/mssql/server/about/") + .ports(1433) + .build(); } private static DockerService zipkin() { - return new DockerService("openzipkin/zipkin", "latest", "https://hub.docker.com/r/openzipkin/zipkin/", 9411); + return DockerService.withImageAndTag("openzipkin/zipkin") + .website("https://hub.docker.com/r/openzipkin/zipkin/") + .ports(9411) + .build(); } @Override diff --git a/start-site/src/test/java/io/spring/start/site/container/DockerServiceTests.java b/start-site/src/test/java/io/spring/start/site/container/DockerServiceTests.java new file mode 100644 index 0000000000..1e961819df --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/container/DockerServiceTests.java @@ -0,0 +1,77 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.container; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DockerService}. + * + * @author Chris Bono + */ +class DockerServiceTests { + + @Test + void builderWithMinimalOptions() { + DockerService service = DockerService.withImageAndTag("acme/toolbox").build(); + assertThat(service.getImage()).isEqualTo("acme/toolbox"); + assertThat(service.getImageTag()).isEqualTo("latest"); + assertThat(service.getWebsite()).isNull(); + assertThat(service.getCommand()).isNull(); + assertThat(service.getPorts()).isEmpty(); + } + + @Test + void builderWithAllOptions() { + DockerService service = DockerService.withImageAndTag("acme/toolbox") + .imageTag("1.0") + .website("acme/toolbox-dot-com") + .command("bin/acme run") + .ports(8007, 8008) + .build(); + assertThat(service.getImage()).isEqualTo("acme/toolbox"); + assertThat(service.getImageTag()).isEqualTo("1.0"); + assertThat(service.getWebsite()).isEqualTo("acme/toolbox-dot-com"); + assertThat(service.getCommand()).isEqualTo("bin/acme run"); + assertThat(service.getPorts()).containsExactly(8007, 8008); + } + + @Test + void builderWithImageAndTagUsesTag() { + DockerService service = DockerService.withImageAndTag("acme/toolbox:1.0").build(); + assertThat(service.getImage()).isEqualTo("acme/toolbox"); + assertThat(service.getImageTag()).isEqualTo("1.0"); + } + + @Test + void builderWithImageAndTagIsOverriddenByImageTag() { + DockerService service = DockerService.withImageAndTag("acme/toolbox:1.0").imageTag("2.0").build(); + assertThat(service.getImage()).isEqualTo("acme/toolbox"); + assertThat(service.getImageTag()).isEqualTo("2.0"); + } + + @Test + void builderWithCollectionOfPorts() { + DockerService service = DockerService.withImageAndTag("acme/toolbox").ports(List.of(8007, 8008)).build(); + assertThat(service.getPorts()).containsExactly(8007, 8008); + } + +} From ed0e1c8b942d8f42ac214b8b438e2b7ce302b42d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 15 Sep 2023 08:52:08 +0200 Subject: [PATCH 179/825] Polish "Add optional 'command' to Docker compose service" See gh-1294 --- .../start/site/container/DockerService.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/container/DockerService.java b/start-site/src/main/java/io/spring/start/site/container/DockerService.java index cece024c30..b730acb366 100644 --- a/start-site/src/main/java/io/spring/start/site/container/DockerService.java +++ b/start-site/src/main/java/io/spring/start/site/container/DockerService.java @@ -42,16 +42,16 @@ public final class DockerService implements Consumer { private final int[] ports; - private DockerService(DockerService.Builder builder) { + private DockerService(Builder builder) { this.image = builder.image; this.imageTag = builder.imageTag; this.website = builder.website; this.command = builder.command; - this.ports = builder.ports.stream().mapToInt(Number::intValue).toArray(); + this.ports = builder.ports.stream().mapToInt(Integer::intValue).toArray(); } /** - * Return a new builder using the specified image and optional tag. + * Create a new builder using the specified image and optional tag. * @param imageAndTag the image (and optional tag) to use for the service * @return the new builder instance. */ @@ -85,7 +85,7 @@ public String getWebsite() { } /** - * Return the command to use to override the default command (optional). + * Return the command to use, if any. * @return the command */ public String getCommand() { @@ -130,38 +130,38 @@ protected Builder(String imageAndTag) { image(split[0]).imageTag(tag); } - public DockerService.Builder image(String image) { + public Builder image(String image) { this.image = image; return this; } - public DockerService.Builder imageTag(String imageTag) { + public Builder imageTag(String imageTag) { this.imageTag = imageTag; return this; } - public DockerService.Builder website(String website) { + public Builder website(String website) { this.website = website; return this; } - public DockerService.Builder command(String command) { + public Builder command(String command) { this.command = command; return this; } - public DockerService.Builder ports(Collection ports) { + public Builder ports(Collection ports) { this.ports.addAll(ports); return this; } - public DockerService.Builder ports(int... ports) { + public Builder ports(int... ports) { return ports(Arrays.stream(ports).boxed().toList()); } /** - * Builds the {@link DockerService} instance. - * @return the built instance + * Build a {@link DockerService} with the current state of this builder. + * @return a {@link DockerService} */ public DockerService build() { return new DockerService(this); From f46e2863f9c6791ffad368fc1e17e81c1c8d8b00 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 15 Sep 2023 07:11:05 +0000 Subject: [PATCH 180/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index a0987838d9..927fa7b93c 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:e1d5ff1f093949a4553203d26a1b1f92398a3a9370799900681b65f3c40cdc8c + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4101dc48088ccff2425a47fcba962bf348025740c915d905dc65784997f0c6c9 lifecycle: preStop: exec: From 720af66c2b50d9057dba88dd03f9b6327bb278c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 15 Sep 2023 10:02:49 +0200 Subject: [PATCH 181/825] Upgrade to Wavefront for Spring Boot 3.0.2 Closes gh-1299 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9ff0ee9065..deb5f27d3e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -176,7 +176,7 @@ initializr: - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 2.3.4 - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 3.0.1 + version: 3.0.2 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From de0dd0025d5c594f9d39aa3906adac03d6d64066 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 15 Sep 2023 09:26:18 +0000 Subject: [PATCH 182/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 927fa7b93c..d0ca67bdbf 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4101dc48088ccff2425a47fcba962bf348025740c915d905dc65784997f0c6c9 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:b66f53a050756b5e499fc90c0f81e59bdb1fbe274cff810f2535c40c0b5ce056 lifecycle: preStop: exec: From 1420a932684576d1ceba040e7e11071331f43b2a Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 19 Sep 2023 08:47:05 +0300 Subject: [PATCH 183/825] Upgrade to Vaadin 24.1.10 See gh-1301 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index deb5f27d3e..5adb2f339c 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -165,7 +165,7 @@ initializr: - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 23.3.23 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 24.1.9 + version: 24.1.10 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From fcdfee101766da5fc0fcea418c91332c7a91e0f2 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 19 Sep 2023 07:26:25 +0000 Subject: [PATCH 184/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index d0ca67bdbf..4eb6b80043 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:b66f53a050756b5e499fc90c0f81e59bdb1fbe274cff810f2535c40c0b5ce056 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:425603e0024801975394e59eafe9fb9960e76bcfbfa9cb270b4a86bf008085a5 lifecycle: preStop: exec: From 5326499187cfdd3c519487388617260203e38a02 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 19 Sep 2023 13:57:01 +0300 Subject: [PATCH 185/825] Upgrade to Vaadin 23.3.24 See gh-1302 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 5adb2f339c..210a3c37a9 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -163,7 +163,7 @@ initializr: - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.23 + version: 23.3.24 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" version: 24.1.10 wavefront: From 43376c130e3a5cfc8656b51326040377d1ea77ce Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 19 Sep 2023 13:03:04 +0000 Subject: [PATCH 186/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 4eb6b80043..1b915b2166 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:425603e0024801975394e59eafe9fb9960e76bcfbfa9cb270b4a86bf008085a5 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c6e93f41c78cf82082df4784d4779b885f612066afc08ca7919602c631911c3c lifecycle: preStop: exec: From 48d5016d7bcbddf962036ad15cdedb5da81bc135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 21 Sep 2023 11:16:00 +0200 Subject: [PATCH 187/825] Add support for Java 21 Closes gh-1304 --- .../JavaVersionProjectDescriptionCustomizer.java | 15 ++++++++++++++- start-site/src/main/resources/application.yml | 2 +- ...aVersionProjectDescriptionCustomizerTests.java | 10 +++++----- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index 2bd2268a03..af5ea10288 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -20,6 +20,7 @@ import java.util.List; import io.spring.initializr.generator.language.Language; +import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; import io.spring.initializr.generator.version.Version; @@ -41,6 +42,8 @@ public class JavaVersionProjectDescriptionCustomizer implements ProjectDescripti private static final VersionRange SPRING_BOOT_2_7_10_OR_LATER = VersionParser.DEFAULT.parseRange("2.7.10"); + private static final VersionRange SPRING_BOOT_2_7_16_OR_LATER = VersionParser.DEFAULT.parseRange("2.7.16"); + private static final VersionRange SPRING_BOOT_3_0_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0-M1"); @Override @@ -73,6 +76,16 @@ public void customize(MutableProjectDescription description) { } } + if (javaGeneration == 21) { + // Java 21 support as of Spring Boot 2.7.16 + if (!SPRING_BOOT_2_7_16_OR_LATER.match(platformVersion)) { + updateTo(description, "17"); + } + // Kotlin does not support Java 21 bytecodes yet + if (description.getLanguage() instanceof KotlinLanguage) { + updateTo(description, "17"); + } + } } private void updateTo(MutableProjectDescription description, String jvmVersion) { @@ -86,7 +99,7 @@ private Integer determineJavaGeneration(String javaVersion) { return 8; } int generation = Integer.parseInt(javaVersion); - return ((generation > 8 && generation <= 20) ? generation : null); + return ((generation > 8 && generation <= 21) ? generation : null); } catch (NumberFormatException ex) { return null; diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 210a3c37a9..1535c828c6 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1512,7 +1512,7 @@ initializr: id: war default: false javaVersions: - - id: 20 + - id: 21 default: false - id: 17 default: true diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index f69fc6449e..77e951e50b 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -82,7 +82,7 @@ static Stream supportedGradleGroovyParameters() { } private static Stream supportedJavaParameters() { - return Stream.of(java("19", "2.6.12"), java("20", "2.7.10")); + return Stream.of(java("19", "2.6.12"), java("20", "2.7.10"), java("21", "2.7.16")); } private static Stream supportedKotlinParameters() { @@ -90,7 +90,7 @@ private static Stream supportedKotlinParameters() { } private static Stream supportedGroovyParameters() { - return Stream.of(groovy("19", "2.6.12"), groovy("20", "2.7.10")); + return Stream.of(groovy("19", "2.6.12"), groovy("20", "2.7.10"), groovy("21", "2.7.16")); } @ParameterizedTest(name = "{0} - Java {1} - Spring Boot {2}") @@ -117,15 +117,15 @@ static Stream unsupportedGradleGroovyParameters() { } private static Stream unsupportedJavaParameters() { - return Stream.of(java("19", "2.6.11"), java("20", "2.7.9")); + return Stream.of(java("19", "2.6.11"), java("20", "2.7.9"), java("21", "2.7.15")); } private static Stream unsupportedKotlinParameters() { - return Stream.of(kotlin("19", "2.6.11"), kotlin("20", "2.7.9")); + return Stream.of(kotlin("19", "2.6.11"), kotlin("20", "2.7.9"), kotlin("21", "2.7.16")); } private static Stream unsupportedGroovyParameters() { - return Stream.of(groovy("19", "2.6.11"), groovy("20", "2.7.9")); + return Stream.of(groovy("19", "2.6.11"), groovy("20", "2.7.9"), groovy("21", "2.7.15")); } private static Arguments java(String javaVersion, String springBootVersion) { From ddaf9e6aa708fff4a9bf6b22d849e33c60f1a0a9 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 21 Sep 2023 14:20:52 +0000 Subject: [PATCH 188/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 1b915b2166..ff7bc21b58 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c6e93f41c78cf82082df4784d4779b885f612066afc08ca7919602c631911c3c + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c145caf99c7b8090c320765072740396125b4270f1900fed6c712f7a000242c6 lifecycle: preStop: exec: From 8d7ae8a9a4370a1abe6f7677bf6c3d0634d62c29 Mon Sep 17 00:00:00 2001 From: Chris Bono Date: Fri, 8 Sep 2023 14:57:44 -0500 Subject: [PATCH 189/825] Enable Spring Pulsar with Spring Boot 3.2.x * Split the Pulsar dependencies into Spring Boot 3.0.x/3.1.x and 3.2.x variants * Add DockerCompose and Testcontainers support * Enhance the tests for Pulsar See gh-1296 --- .../SimpleDockerServiceResolver.java | 10 + ...gPulsarProjectGenerationConfiguration.java | 42 ++- start-site/src/main/resources/application.yml | 28 +- ...pringPulsarBinderBuildCustomizerTests.java | 62 ----- ...arProjectGenerationConfigurationTests.java | 249 ++++++++++++++++++ .../src/test/resources/compose/pulsar.yaml | 7 + 6 files changed, 322 insertions(+), 76 deletions(-) delete mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizerTests.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/resources/compose/pulsar.yaml diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index 7efbf0cdbb..0be1c0f434 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -42,6 +42,7 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("mysql", mysql()); this.dockerServices.put("oracle", oracle()); this.dockerServices.put("postgres", postgres()); + this.dockerServices.put("pulsar", pulsar()); this.dockerServices.put("rabbit", rabbit()); this.dockerServices.put("redis", redis()); this.dockerServices.put("sqlServer", sqlServer()); @@ -103,6 +104,15 @@ private static DockerService postgres() { .build(); } + private static DockerService pulsar() { + // The latest tag they provide is not the 'latest' GA + return DockerService.withImageAndTag("apachepulsar/pulsar:3.1.0") + .website("https://hub.docker.com/r/apachepulsar/pulsar") + .command("bin/pulsar standalone") + .ports(8080, 6650) + .build(); + } + private static DockerService rabbit() { return DockerService.withImageAndTag("rabbitmq") .website("https://hub.docker.com/_/rabbitmq") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java index 38fc039d8b..39a7ef91d7 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java @@ -16,12 +16,21 @@ package io.spring.start.site.extension.dependency.springpulsar; +import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.condition.ProjectGenerationCondition; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections; +import io.spring.start.site.container.ServiceConnectionsCustomizer; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; +import org.springframework.core.type.AnnotatedTypeMetadata; /** * Configuration for generation of projects that depend on Pulsar. @@ -29,14 +38,45 @@ * @author Chris Bono */ @ProjectGenerationConfiguration -@ConditionalOnRequestedDependency("pulsar") +@Conditional(SpringPulsarProjectGenerationConfiguration.OnPulsarRequestedDependencyCondition.class) class SpringPulsarProjectGenerationConfiguration { + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.PulsarContainer"; + + @Bean + @ConditionalOnPlatformVersion("3.2.0-SNAPSHOT") + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer pulsarServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("pulsar", + (service) -> serviceConnections.addServiceConnection(ServiceConnections.ServiceConnection + .ofContainer("pulsar", service, TESTCONTAINERS_CLASS_NAME, false))); + } + @Bean + @ConditionalOnPlatformVersion("3.2.0-SNAPSHOT") + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer pulsarComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("pulsar", + (service) -> composeFile.services().add("pulsar", service)); + } + + @Bean + @ConditionalOnPlatformVersion("[3.0.0,3.2.0-M1)") @ConditionalOnRequestedDependency("cloud-stream") SpringPulsarBinderBuildCustomizer pulsarBinderBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { return new SpringPulsarBinderBuildCustomizer(metadata, description); } + static class OnPulsarRequestedDependencyCondition extends ProjectGenerationCondition { + + @Override + protected boolean matches(ProjectDescription description, ConditionContext context, + AnnotatedTypeMetadata metadata) { + return description.getRequestedDependencies().containsKey("pulsar") + || description.getRequestedDependencies().containsKey("pulsar-reactive"); + } + + } + } diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 1535c828c6..0cc52470bf 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -786,30 +786,32 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.jms.artemis - name: Spring for Apache Pulsar id: pulsar - compatibilityRange: "[3.0.0,3.2.0-M1)" - mappings: - - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 0.2.0 + compatibilityRange: "[3.0.0,3.2.0-SNAPSHOT]" description: Build messaging applications with Apache Pulsar - groupId: org.springframework.pulsar - artifactId: spring-pulsar-spring-boot-starter links: - rel: reference - href: https://docs.spring.io/spring-pulsar/docs/0.2.x/reference/html/ - - name: Spring for Apache Pulsar (Reactive) - id: pulsar-reactive - compatibilityRange: "[3.0.0,3.2.0-M1)" + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.pulsar mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 0.2.0 + groupId: org.springframework.pulsar + artifactId: spring-pulsar-spring-boot-starter + starter: false + - name: Spring for Apache Pulsar (Reactive) + id: pulsar-reactive + compatibilityRange: "[3.0.0,3.2.0-SNAPSHOT]" description: Build reactive messaging applications with Apache Pulsar facets: - reactive - groupId: org.springframework.pulsar - artifactId: spring-pulsar-reactive-spring-boot-starter links: - rel: reference - href: https://docs.spring.io/spring-pulsar/docs/0.2.x/reference/html/#reactive-pulsar + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.pulsar + mappings: + - compatibilityRange: "[3.0.0,3.2.0-M1)" + version: 0.2.0 + groupId: org.springframework.pulsar + artifactId: spring-pulsar-reactive-spring-boot-starter + starter: false - name: WebSocket id: websocket description: Build Servlet-based WebSocket applications with SockJS and STOMP. diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizerTests.java deleted file mode 100644 index 62c7b2ac40..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizerTests.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springpulsar; - -import io.spring.initializr.generator.test.project.ProjectStructure; -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link SpringPulsarBinderBuildCustomizer}. - * - * @author Chris Bono - */ -class SpringPulsarBinderBuildCustomizerTests extends AbstractExtensionTests { - - @Test - void binderNotAddedWhenPulsarNotSelected() { - ProjectStructure project = generateProject(createProjectRequest("cloud-stream")); - assertNoBinder(project); - } - - @Test - void binderNotAddedWhenCloudStreamNotSelected() { - ProjectRequest request = createProjectRequest("pulsar"); - request.setBootVersion("3.0.4"); - ProjectStructure project = generateProject(request); - assertNoBinder(project); - assertThat(project).mavenBuild().hasDependency(getDependency("pulsar")); - } - - @Test - void binderAddedWhenPulsarAndCloudStreamSelected() { - ProjectRequest request = createProjectRequest("pulsar", "cloud-stream"); - request.setBootVersion("3.0.4"); - ProjectStructure project = generateProject(request); - assertThat(project).mavenBuild() - .hasDependency("org.springframework.pulsar", "spring-pulsar-spring-cloud-stream-binder", "0.2.0"); - } - - private void assertNoBinder(ProjectStructure project) { - assertThat(project).mavenBuild() - .doesNotHaveDependency("org.springframework.pulsar", "spring-pulsar-spring-cloud-stream-binder"); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..d3d1513925 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java @@ -0,0 +1,249 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springpulsar; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.project.MutableProjectDescription; +import io.spring.initializr.generator.test.project.ProjectAssetTester; +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections; +import io.spring.start.site.container.ServiceConnectionsCustomizer; +import io.spring.start.site.container.SimpleDockerServiceResolver; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +/** + * Tests for {@link SpringPulsarProjectGenerationConfiguration}. + * + * @author Chris Bono + */ +class SpringPulsarProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Nested + class PulsarDependencyConfigurationTests { + + @ParameterizedTest + @ValueSource(strings = { "3.0.0", "3.1.3" }) + void pulsarLegacyStarterUsedWhenBoot30orBoot31Selected(String bootVersion) { + ProjectRequest request = createProjectRequest("pulsar"); + request.setBootVersion(bootVersion); + ProjectStructure project = generateProject(request); + assertThat(project).mavenBuild() + .hasDependency("org.springframework.pulsar", "spring-pulsar-spring-boot-starter"); + } + + @ParameterizedTest + @ValueSource(strings = { "3.0.0", "3.1.3" }) + void pulsarReactiveLegacyStarterUsedWhenBoot30orBoot31Selected(String bootVersion) { + ProjectRequest request = createProjectRequest("pulsar-reactive"); + request.setBootVersion(bootVersion); + ProjectStructure project = generateProject(request); + assertThat(project).mavenBuild() + .hasDependency("org.springframework.pulsar", "spring-pulsar-reactive-spring-boot-starter"); + } + + @Test + void pulsarBootStarterUsedWhenBoot32Selected() { + ProjectRequest request = createProjectRequest("pulsar"); + request.setBootVersion("3.2.0-SNAPSHOT"); + ProjectStructure project = generateProject(request); + assertThat(project).mavenBuild().hasDependency("org.springframework.boot", "spring-boot-starter-pulsar"); + } + + @Test + void pulsarReactiveBootStarterUsedWhenBoot32Selected() { + ProjectRequest request = createProjectRequest("pulsar-reactive"); + request.setBootVersion("3.2.0-SNAPSHOT"); + ProjectStructure project = generateProject(request); + assertThat(project).mavenBuild() + .hasDependency("org.springframework.boot", "spring-boot-starter-pulsar-reactive"); + } + + } + + @Nested + class DockerComposeConfigurationTests { + + @Test + void serviceNotCreatedWhenDockerComposeNotSelected() { + ProjectRequest request = createProjectRequest("pulsar"); + request.setBootVersion("3.2.0-SNAPSHOT"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @ParameterizedTest + @ValueSource(strings = { "3.1.3", "3.2.0-M2" }) + void serviceNotCreatedWhenIncompatibleBootVersionSelected(String bootVersion) { + ProjectRequest request = createProjectRequest("docker-compose", "pulsar"); + request.setBootVersion(bootVersion); + assertThat(composeFile(request)).doesNotContain("pulsar"); + } + + @ParameterizedTest + @ValueSource(strings = { "pulsar", "pulsar-reactive" }) + void serviceCreatedWhenDockerComposeSelectedWithCompatibleBootVersion(String pulsarDependencyId) { + ProjectRequest request = createProjectRequest("docker-compose", pulsarDependencyId); + request.setBootVersion("3.2.0-SNAPSHOT"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pulsar.yaml")); + } + + } + + @Nested + class ServiceConnectionConfigurationTests { + + private final ProjectAssetTester projectTester = new ProjectAssetTester() + .withConfiguration(SpringPulsarProjectGenerationConfiguration.class) + .withBean(DockerServiceResolver.class, () -> new SimpleDockerServiceResolver()); + + @Test + void connectionNotAddedWhenTestcontainersNotSelected() { + MutableProjectDescription description = new MutableProjectDescription(); + description.setPlatformVersion(Version.parse("3.2.0-SNAPSHOT")); + description.addDependency("pulsar", mock(Dependency.class)); + this.projectTester.configure(description, + (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); + } + + @Test + void connectionNotAddedWhenPulsarNotSelected() { + MutableProjectDescription description = new MutableProjectDescription(); + description.setPlatformVersion(Version.parse("3.2.0-SNAPSHOT")); + description.addDependency("testcontainers", mock(Dependency.class)); + this.projectTester.configure(description, + (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); + } + + @ParameterizedTest + @ValueSource(strings = { "3.0.0", "3.1.3" }) + void connectionNotAddedWhenIncompatibleBootVersionSelected(String bootVersion) { + MutableProjectDescription description = new MutableProjectDescription(); + description.setPlatformVersion(Version.parse(bootVersion)); + description.addDependency("pulsar", mock(Dependency.class)); + description.addDependency("testcontainers", mock(Dependency.class)); + this.projectTester.configure(description, + (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); + } + + @ParameterizedTest + @ValueSource(strings = { "pulsar", "pulsar-reactive" }) + void connectionAddedWhenTestcontainersAndPulsarSelectedWithCompatibleBootVersion(String pulsarDependencyId) { + MutableProjectDescription description = new MutableProjectDescription(); + description.setPlatformVersion(Version.parse("3.2.0-SNAPSHOT")); + description.addDependency("testcontainers", mock(Dependency.class)); + description.addDependency(pulsarDependencyId, mock(Dependency.class)); + this.projectTester.configure(description, + (context) -> assertThat(context) + .getBean("pulsarServiceConnectionsCustomizer", ServiceConnectionsCustomizer.class) + .satisfies((customizer) -> { + ServiceConnections connections = new ServiceConnections(); + customizer.customize(connections); + assertPulsarServiceConnectionAddded(connections); + })); + } + + private void assertPulsarServiceConnectionAddded(ServiceConnections connections) { + assertThat(connections.values()).first().satisfies((connection) -> { + assertThat(connection.id()).isEqualTo("pulsar"); + assertThat(connection.containerClassName()).isEqualTo("org.testcontainers.containers.PulsarContainer"); + assertThat(connection.isGenericContainer()).isFalse(); + assertThat(connection.containerClassNameGeneric()).isFalse(); + assertThat(connection.dockerService()).satisfies((dockerService) -> { + assertThat(dockerService.getImage()).isEqualTo("apachepulsar/pulsar"); + assertThat(dockerService.getImageTag()).isEqualTo("3.1.0"); + assertThat(dockerService.getWebsite()).isEqualTo("https://hub.docker.com/r/apachepulsar/pulsar"); + assertThat(dockerService.getCommand()).isEqualTo("bin/pulsar standalone"); + assertThat(dockerService.getPorts()).containsExactlyInAnyOrder(8080, 6650); + }); + }); + } + + } + + @Nested + class SpringPulsarBinderConfigurationTests { + + @Test + void binderNotAddedWhenCloudStreamNotSelected() { + ProjectRequest request = createProjectRequest("pulsar"); + request.setBootVersion("3.1.3"); + ProjectStructure project = generateProject(request); + assertNoBinder(project); + assertThat(project).mavenBuild() + .hasDependency("org.springframework.pulsar", "spring-pulsar-spring-boot-starter"); + } + + @Test + void binderNotAddedWhenPulsarNotSelected() { + ProjectRequest request = createProjectRequest("cloud-stream"); + request.setBootVersion("3.1.3"); + ProjectStructure project = generateProject(request); + assertNoBinder(project); + } + + @ParameterizedTest + @ValueSource(strings = { "3.2.0-M1", "3.2.0-SNAPSHOT" }) + void binderNotAddedWhenPulsarAndCloudStreamSelectedWithIncompatibleBootVersion(String bootVersion) { + ProjectRequest request = createProjectRequest("pulsar", "cloud-stream"); + request.setBootVersion(bootVersion); + ProjectStructure project = generateProject(request); + assertNoBinder(project); + } + + @ParameterizedTest + @ValueSource(strings = { "3.0.0", "3.1.3", "3.1.4-SNAPSHOT" }) + void binderAddedWhenPulsarAndCloudStreamSelectedWithCompatibleBootVersion(String bootVersion) { + ProjectRequest request = createProjectRequest("pulsar", "cloud-stream"); + request.setBootVersion(bootVersion); + ProjectStructure project = generateProject(request); + assertBinder(project); + } + + @ParameterizedTest + @ValueSource(strings = { "3.0.0", "3.1.3", "3.1.4-SNAPSHOT" }) + void binderAddedWhenPulsarReactiveAndCloudStreamSelectedWithCompatibleBootVersion(String bootVersion) { + ProjectRequest request = createProjectRequest("pulsar-reactive", "cloud-stream"); + request.setBootVersion(bootVersion); + ProjectStructure project = generateProject(request); + assertBinder(project); + } + + private void assertNoBinder(ProjectStructure project) { + assertThat(project).mavenBuild() + .doesNotHaveDependency("org.springframework.pulsar", "spring-pulsar-spring-cloud-stream-binder"); + } + + private void assertBinder(ProjectStructure project) { + assertThat(project).mavenBuild() + .hasDependency("org.springframework.pulsar", "spring-pulsar-spring-cloud-stream-binder", "0.2.0"); + } + + } + +} diff --git a/start-site/src/test/resources/compose/pulsar.yaml b/start-site/src/test/resources/compose/pulsar.yaml new file mode 100644 index 0000000000..1bca13fe25 --- /dev/null +++ b/start-site/src/test/resources/compose/pulsar.yaml @@ -0,0 +1,7 @@ +services: + pulsar: + image: 'apachepulsar/pulsar:3.1.0' + ports: + - '6650' + - '8080' + command: 'bin/pulsar standalone' From a74c15e14a882249167bace384fca0c032099edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 15 Sep 2023 09:57:25 +0200 Subject: [PATCH 190/825] Polish "Enable Spring Pulsar with Spring Boot 3.2.x" See gh-1296 --- ...gPulsarProjectGenerationConfiguration.java | 16 +++++++----- start-site/src/main/resources/application.yml | 8 +++--- ...arProjectGenerationConfigurationTests.java | 26 +++++++++---------- ...rsProjectGenerationConfigurationTests.java | 3 ++- 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java index 39a7ef91d7..2760490fe6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java @@ -16,6 +16,9 @@ package io.spring.start.site.extension.dependency.springpulsar; +import java.util.Map; + +import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.condition.ProjectGenerationCondition; @@ -26,6 +29,7 @@ import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections; import io.spring.start.site.container.ServiceConnectionsCustomizer; +import io.spring.start.site.extension.dependency.springpulsar.SpringPulsarProjectGenerationConfiguration.OnPulsarDependencyCondition; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ConditionContext; @@ -38,13 +42,13 @@ * @author Chris Bono */ @ProjectGenerationConfiguration -@Conditional(SpringPulsarProjectGenerationConfiguration.OnPulsarRequestedDependencyCondition.class) +@Conditional(OnPulsarDependencyCondition.class) class SpringPulsarProjectGenerationConfiguration { private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.PulsarContainer"; @Bean - @ConditionalOnPlatformVersion("3.2.0-SNAPSHOT") + @ConditionalOnPlatformVersion("3.2.0-M3") @ConditionalOnRequestedDependency("testcontainers") ServiceConnectionsCustomizer pulsarServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { return (serviceConnections) -> serviceResolver.doWith("pulsar", @@ -53,7 +57,7 @@ ServiceConnectionsCustomizer pulsarServiceConnectionsCustomizer(DockerServiceRes } @Bean - @ConditionalOnPlatformVersion("3.2.0-SNAPSHOT") + @ConditionalOnPlatformVersion("3.2.0-M3") @ConditionalOnRequestedDependency("docker-compose") ComposeFileCustomizer pulsarComposeFileCustomizer(DockerServiceResolver serviceResolver) { return (composeFile) -> serviceResolver.doWith("pulsar", @@ -68,13 +72,13 @@ SpringPulsarBinderBuildCustomizer pulsarBinderBuildCustomizer(InitializrMetadata return new SpringPulsarBinderBuildCustomizer(metadata, description); } - static class OnPulsarRequestedDependencyCondition extends ProjectGenerationCondition { + static class OnPulsarDependencyCondition extends ProjectGenerationCondition { @Override protected boolean matches(ProjectDescription description, ConditionContext context, AnnotatedTypeMetadata metadata) { - return description.getRequestedDependencies().containsKey("pulsar") - || description.getRequestedDependencies().containsKey("pulsar-reactive"); + Map requestedDependencies = description.getRequestedDependencies(); + return requestedDependencies.containsKey("pulsar") || requestedDependencies.containsKey("pulsar-reactive"); } } diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0cc52470bf..91f7138ad5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -786,20 +786,19 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.jms.artemis - name: Spring for Apache Pulsar id: pulsar - compatibilityRange: "[3.0.0,3.2.0-SNAPSHOT]" + compatibilityRange: "3.0.0" description: Build messaging applications with Apache Pulsar links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.pulsar mappings: - - compatibilityRange: "[3.0.0,3.2.0-M1)" + - compatibilityRange: "[3.0.0,3.2.0-M3)" version: 0.2.0 groupId: org.springframework.pulsar artifactId: spring-pulsar-spring-boot-starter - starter: false - name: Spring for Apache Pulsar (Reactive) id: pulsar-reactive - compatibilityRange: "[3.0.0,3.2.0-SNAPSHOT]" + compatibilityRange: "3.0.0" description: Build reactive messaging applications with Apache Pulsar facets: - reactive @@ -811,7 +810,6 @@ initializr: version: 0.2.0 groupId: org.springframework.pulsar artifactId: spring-pulsar-reactive-spring-boot-starter - starter: false - name: WebSocket id: websocket description: Build Servlet-based WebSocket applications with SockJS and STOMP. diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java index d3d1513925..9a6090f01d 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java @@ -70,7 +70,7 @@ void pulsarReactiveLegacyStarterUsedWhenBoot30orBoot31Selected(String bootVersio @Test void pulsarBootStarterUsedWhenBoot32Selected() { ProjectRequest request = createProjectRequest("pulsar"); - request.setBootVersion("3.2.0-SNAPSHOT"); + request.setBootVersion("3.2.0-M3"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("org.springframework.boot", "spring-boot-starter-pulsar"); } @@ -78,7 +78,7 @@ void pulsarBootStarterUsedWhenBoot32Selected() { @Test void pulsarReactiveBootStarterUsedWhenBoot32Selected() { ProjectRequest request = createProjectRequest("pulsar-reactive"); - request.setBootVersion("3.2.0-SNAPSHOT"); + request.setBootVersion("3.2.0-M3"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasDependency("org.springframework.boot", "spring-boot-starter-pulsar-reactive"); @@ -92,7 +92,7 @@ class DockerComposeConfigurationTests { @Test void serviceNotCreatedWhenDockerComposeNotSelected() { ProjectRequest request = createProjectRequest("pulsar"); - request.setBootVersion("3.2.0-SNAPSHOT"); + request.setBootVersion("3.2.0-M3"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @@ -109,7 +109,7 @@ void serviceNotCreatedWhenIncompatibleBootVersionSelected(String bootVersion) { @ValueSource(strings = { "pulsar", "pulsar-reactive" }) void serviceCreatedWhenDockerComposeSelectedWithCompatibleBootVersion(String pulsarDependencyId) { ProjectRequest request = createProjectRequest("docker-compose", pulsarDependencyId); - request.setBootVersion("3.2.0-SNAPSHOT"); + request.setBootVersion("3.2.0-M3"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pulsar.yaml")); } @@ -120,12 +120,12 @@ class ServiceConnectionConfigurationTests { private final ProjectAssetTester projectTester = new ProjectAssetTester() .withConfiguration(SpringPulsarProjectGenerationConfiguration.class) - .withBean(DockerServiceResolver.class, () -> new SimpleDockerServiceResolver()); + .withBean(DockerServiceResolver.class, SimpleDockerServiceResolver::new); @Test void connectionNotAddedWhenTestcontainersNotSelected() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.2.0-SNAPSHOT")); + description.setPlatformVersion(Version.parse("3.2.0-M3")); description.addDependency("pulsar", mock(Dependency.class)); this.projectTester.configure(description, (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); @@ -134,7 +134,7 @@ void connectionNotAddedWhenTestcontainersNotSelected() { @Test void connectionNotAddedWhenPulsarNotSelected() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.2.0-SNAPSHOT")); + description.setPlatformVersion(Version.parse("3.2.0-M3")); description.addDependency("testcontainers", mock(Dependency.class)); this.projectTester.configure(description, (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); @@ -155,7 +155,7 @@ void connectionNotAddedWhenIncompatibleBootVersionSelected(String bootVersion) { @ValueSource(strings = { "pulsar", "pulsar-reactive" }) void connectionAddedWhenTestcontainersAndPulsarSelectedWithCompatibleBootVersion(String pulsarDependencyId) { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.2.0-SNAPSHOT")); + description.setPlatformVersion(Version.parse("3.2.0-M3")); description.addDependency("testcontainers", mock(Dependency.class)); description.addDependency(pulsarDependencyId, mock(Dependency.class)); this.projectTester.configure(description, @@ -164,11 +164,11 @@ void connectionAddedWhenTestcontainersAndPulsarSelectedWithCompatibleBootVersion .satisfies((customizer) -> { ServiceConnections connections = new ServiceConnections(); customizer.customize(connections); - assertPulsarServiceConnectionAddded(connections); + assertPulsarServiceConnectionAdded(connections); })); } - private void assertPulsarServiceConnectionAddded(ServiceConnections connections) { + private void assertPulsarServiceConnectionAdded(ServiceConnections connections) { assertThat(connections.values()).first().satisfies((connection) -> { assertThat(connection.id()).isEqualTo("pulsar"); assertThat(connection.containerClassName()).isEqualTo("org.testcontainers.containers.PulsarContainer"); @@ -208,7 +208,7 @@ void binderNotAddedWhenPulsarNotSelected() { } @ParameterizedTest - @ValueSource(strings = { "3.2.0-M1", "3.2.0-SNAPSHOT" }) + @ValueSource(strings = { "3.2.0-M1", "3.2.0-M3" }) void binderNotAddedWhenPulsarAndCloudStreamSelectedWithIncompatibleBootVersion(String bootVersion) { ProjectRequest request = createProjectRequest("pulsar", "cloud-stream"); request.setBootVersion(bootVersion); @@ -217,7 +217,7 @@ void binderNotAddedWhenPulsarAndCloudStreamSelectedWithIncompatibleBootVersion(S } @ParameterizedTest - @ValueSource(strings = { "3.0.0", "3.1.3", "3.1.4-SNAPSHOT" }) + @ValueSource(strings = { "3.0.0", "3.1.3" }) void binderAddedWhenPulsarAndCloudStreamSelectedWithCompatibleBootVersion(String bootVersion) { ProjectRequest request = createProjectRequest("pulsar", "cloud-stream"); request.setBootVersion(bootVersion); @@ -226,7 +226,7 @@ void binderAddedWhenPulsarAndCloudStreamSelectedWithCompatibleBootVersion(String } @ParameterizedTest - @ValueSource(strings = { "3.0.0", "3.1.3", "3.1.4-SNAPSHOT" }) + @ValueSource(strings = { "3.0.0", "3.1.3" }) void binderAddedWhenPulsarReactiveAndCloudStreamSelectedWithCompatibleBootVersion(String bootVersion) { ProjectRequest request = createProjectRequest("pulsar-reactive", "cloud-stream"); request.setBootVersion(bootVersion); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index fd87356cb0..cfb811a135 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -20,6 +20,7 @@ import io.spring.initializr.generator.test.io.TextAssert; import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.generator.version.Version; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -51,7 +52,7 @@ void buildWithOnlyTestContainers() { void buildWithSupportedEntries(String springBootDependencyId, String testcontainersArtifactId) { assertThat(generateProject("3.0.0", "testcontainers", springBootDependencyId)).mavenBuild() .hasBom("org.testcontainers", "testcontainers-bom", "${testcontainers.version}") - .hasDependency(getDependency(springBootDependencyId)) + .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.0.0"))) .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") .hasDependency(getDependency("testcontainers")); } From d65ff9e1339f4adde821047225546f9e10c0bbf4 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 21 Sep 2023 15:08:34 +0000 Subject: [PATCH 191/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index ff7bc21b58..013f3ea514 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c145caf99c7b8090c320765072740396125b4270f1900fed6c712f7a000242c6 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4a0d0080f80aa466d276c95f191de852feebd7629f2f44594e9a1d0d19c1cb15 lifecycle: preStop: exec: From 792edad7d9865ef852c4c4df020b45abded0ac58 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 25 Sep 2023 17:12:57 +0200 Subject: [PATCH 192/825] Upgrade to Camel 4.0.1 See gh-1305 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 91f7138ad5..5d196be3d2 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -836,7 +836,7 @@ initializr: - compatibilityRange: "[2.7.0.M1,3.0.0-M1)" version: 3.20.6 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.0.0 + version: 4.0.1 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From 119969df638a715de0248b7bc7af4b55944ca5c1 Mon Sep 17 00:00:00 2001 From: Mridula <66699525+mpeddada1@users.noreply.github.com> Date: Mon, 25 Sep 2023 16:32:27 -0400 Subject: [PATCH 193/825] Upgrade to Spring Cloud GCP 3.7.0 and 4.8.0 See gh-1306 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 5d196be3d2..d09c06419c 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -115,9 +115,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 3.6.3 + version: 3.7.0 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.7.2 + version: 4.8.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From ac2c10ca0e9b6ace988f7ed3f0c93a568fd27af5 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 26 Sep 2023 05:44:27 +0000 Subject: [PATCH 194/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 013f3ea514..427c1cd86c 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4a0d0080f80aa466d276c95f191de852feebd7629f2f44594e9a1d0d19c1cb15 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:23ccc84e5b075b17412fd5cb769d076de8d7616288506ae58fce142e32dd0a67 lifecycle: preStop: exec: From 3db1a3c4590f873513f564912c17797cdf0dbdfe Mon Sep 17 00:00:00 2001 From: Olga MaciaszekSharma Date: Fri, 29 Sep 2023 13:05:31 +0200 Subject: [PATCH 195/825] Upgrade to Spring Cloud 2023.0.0-M2 See gh-1308 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d09c06419c..dfab63f2ca 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -94,7 +94,7 @@ initializr: - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 2022.0.4 - compatibilityRange: "[3.2.0-M1,3.2.x-SNAPSHOT)" - version: 2023.0.0-M1 + version: 2023.0.0-M2 repositories: spring-milestones - compatibilityRange: "3.2.x-SNAPSHOT" version: 2023.0.0-SNAPSHOT From f7d62a10ca7020fc11448fb5af2aaf92eeb041b3 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 29 Sep 2023 14:13:31 +0000 Subject: [PATCH 196/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 427c1cd86c..e9d279241a 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:23ccc84e5b075b17412fd5cb769d076de8d7616288506ae58fce142e32dd0a67 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2f9a3892952f95a2a12e44c1f8235aabd432882d59563658f55a80fa6232ddc3 lifecycle: preStop: exec: From 6c896968adf13bef5a133eddbc71f18b5bb92d89 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 2 Oct 2023 15:10:11 +0300 Subject: [PATCH 197/825] Upgrade to Vaadin 24.1.11 and 23.3.25 See gh-1311 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index dfab63f2ca..2d2de94988 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -163,9 +163,9 @@ initializr: - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.24 + version: 23.3.25 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 24.1.10 + version: 24.1.11 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From 74ba4f51bb25c3839951ee40d27f201bd965a28e Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 2 Oct 2023 12:27:02 +0000 Subject: [PATCH 198/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index e9d279241a..80e203b770 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2f9a3892952f95a2a12e44c1f8235aabd432882d59563658f55a80fa6232ddc3 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4f557227818bc0dbd25cc8018e36642a74267ebee63dcfb810da4f56c85e166a lifecycle: preStop: exec: From 0710c9139d068ac3e09a3cb0cfada8e33e193a97 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Wed, 4 Oct 2023 08:42:43 +0100 Subject: [PATCH 199/825] Upgrade to Spring Shell 3.1.4, 3.0.8, and 2.1.13 See gh-1312 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2d2de94988..91cae24f27 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -142,11 +142,11 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[2.7.0,3.0.0-M1)" - version: 2.1.12 + version: 2.1.13 - compatibilityRange: "[3.0.0,3.1.0-M1)" - version: 3.0.7 + version: 3.0.8 - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 3.1.3 + version: 3.1.4 - compatibilityRange: "3.2.0-M1" version: 3.2.0-M1 repositories: spring-milestones From fd64486032278afa9c18c544fa3959dc9ed50fa9 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 4 Oct 2023 09:38:56 +0000 Subject: [PATCH 200/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 80e203b770..32b911916e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4f557227818bc0dbd25cc8018e36642a74267ebee63dcfb810da4f56c85e166a + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:47558791380fa6db3e5aa612769d0b79ed33e24a4a807f8f75b6e993d2d99142 lifecycle: preStop: exec: From bcd16dc8e9e8fc310c4f5af5a3b7bdc308f9dbad Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Thu, 5 Oct 2023 14:13:54 +0300 Subject: [PATCH 201/825] Upgrade to Vaadin 24.1.12 See gh-1315 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 91cae24f27..066dedcc60 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -165,7 +165,7 @@ initializr: - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 23.3.25 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 24.1.11 + version: 24.1.12 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From 0e7803ffa4917891574f1cd2e35dd3e4e91381b6 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 5 Oct 2023 14:16:50 +0000 Subject: [PATCH 202/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 32b911916e..a4a558abbc 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:47558791380fa6db3e5aa612769d0b79ed33e24a4a807f8f75b6e993d2d99142 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6ba4cdb740b9969e3478807edaddc1b63ad710a5bff0351578b7a917245d0343 lifecycle: preStop: exec: From 8a60107d02ab7c28ce22645a16f48fa69415df23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Tue, 10 Oct 2023 20:50:03 +0200 Subject: [PATCH 203/825] Upgrade to Maven Wrapper 3.9.5 --- .mvn/wrapper/maven-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index 462686e25d..5f0536eb74 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,2 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.3/apache-maven-3.9.3-bin.zip +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar From 863f688b707d56d5eaef1926e3bbc621a365e510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Tue, 10 Oct 2023 20:50:29 +0200 Subject: [PATCH 204/825] Upgrade to Spring Boot 3.1.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 694ad4c2db..7a659927cc 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.3 + 3.1.4 io.spring.start start-parent From 8334653904aaa1957f3d3b4be4f432c71da2a15f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 10 Oct 2023 19:07:25 +0000 Subject: [PATCH 205/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index a4a558abbc..1a9efd13e4 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6ba4cdb740b9969e3478807edaddc1b63ad710a5bff0351578b7a917245d0343 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:14ae95d1999c77f86a1b6f4f213ab3d822f8dd65ffe171bb3d441331edd07ab9 lifecycle: preStop: exec: From 88e3fc2ad43ac757727983401dc8011d5b9c26b4 Mon Sep 17 00:00:00 2001 From: Diego Alonso Marquez Palacios Date: Tue, 10 Oct 2023 22:32:26 -0400 Subject: [PATCH 206/825] Upgrade to Spring Cloud GCP 4.8.1 and 3.7.1 See gh-1317 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 066dedcc60..3c1061d268 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -115,9 +115,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 3.7.0 + version: 3.7.1 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.8.0 + version: 4.8.1 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 6357a02b6c63b0056c0cf033f41b9378843a6602 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 11 Oct 2023 07:16:38 +0000 Subject: [PATCH 207/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 1a9efd13e4..097f001c44 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:14ae95d1999c77f86a1b6f4f213ab3d822f8dd65ffe171bb3d441331edd07ab9 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:001ce89c48088110eb8dd1fb42fa4f273a9816540355caa75f734b85fc56ef0b lifecycle: preStop: exec: From f0f6604a4af04300a0eb412ae124c83387569f31 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 11 Oct 2023 12:46:36 +0200 Subject: [PATCH 208/825] Upgrade to Camel 4.1.0 See gh-1318 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3c1061d268..791cdc70c3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -836,7 +836,7 @@ initializr: - compatibilityRange: "[2.7.0.M1,3.0.0-M1)" version: 3.20.6 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.0.1 + version: 4.1.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From 6093b10cdb26ad2d679d14fae4bf8ddc927dd993 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 12 Oct 2023 06:44:23 +0000 Subject: [PATCH 209/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 097f001c44..acdab9256f 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:001ce89c48088110eb8dd1fb42fa4f273a9816540355caa75f734b85fc56ef0b + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:26916bf4d91ccf4e60aa66fa9497e6a469583503d834087dec2afd0857d1fa29 lifecycle: preStop: exec: From 3765016560fef941a472e8bd6089e75657b49df5 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Fri, 13 Oct 2023 17:09:14 +0100 Subject: [PATCH 210/825] Upgrade to Spring Shell 3.2.0-M2 See gh-1319 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 791cdc70c3..57afc836e8 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -148,7 +148,7 @@ initializr: - compatibilityRange: "[3.1.0,3.2.0-M1)" version: 3.1.4 - compatibilityRange: "3.2.0-M1" - version: 3.2.0-M1 + version: 3.2.0-M2 repositories: spring-milestones testcontainers: groupId: org.testcontainers From 197816b6110cb0409cb0b12f64a1eee3cfbe735f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 13 Oct 2023 16:55:11 +0000 Subject: [PATCH 211/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index acdab9256f..8e8821e8e8 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:26916bf4d91ccf4e60aa66fa9497e6a469583503d834087dec2afd0857d1fa29 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c06334e9ce18f652ba2bf1725514817bea78ae778359c629638182e60bf6047e lifecycle: preStop: exec: From 155e08d25081f81ecbda6cedcaf322f5ede79842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Tue, 17 Oct 2023 17:00:04 +0200 Subject: [PATCH 212/825] Upgrade to Spring Modulith 1.1.0-M1 Closes gh-1321 --- start-site/src/main/resources/application.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 57afc836e8..efac23ac16 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -136,6 +136,9 @@ initializr: mappings: - compatibility-range: "[3.1.0,3.2.0-M1)" version: 1.0.0 + - compatibility-range: "3.2.0-M1" + version: 1.1.0-M1 + repositories: spring-milestones spring-shell: groupId: org.springframework.shell artifactId: spring-shell-dependencies @@ -232,7 +235,7 @@ initializr: - name: Spring Modulith id: modulith bom: spring-modulith - compatibility-range: "[3.1.0,3.2.0-M1)" + compatibility-range: "3.1.0" group-id: org.springframework.modulith artifact-id: spring-modulith-starter-core description: Support for building modular monolithic applications. From 1e420ddda2c7347483a40daea51faf4d0c608d2e Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 17 Oct 2023 18:12:49 +0000 Subject: [PATCH 213/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 8e8821e8e8..c414e2a646 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c06334e9ce18f652ba2bf1725514817bea78ae778359c629638182e60bf6047e + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3fc166b115cc444a7e8369b75b73b1803053788b9518a93c0b8e8737265f95d1 lifecycle: preStop: exec: From 3ab492f6bdb56195c0b4f2013e3493f98d5092e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 20 Oct 2023 08:23:44 +0200 Subject: [PATCH 214/825] Upgrade to Spring Boot 3.1.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7a659927cc..9df9bb4a97 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.4 + 3.1.5 io.spring.start start-parent From 5031617664fdfce5d1dd26b938a652cd1b9b7028 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 20 Oct 2023 06:42:49 +0000 Subject: [PATCH 215/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index c414e2a646..bea2e54ca0 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3fc166b115cc444a7e8369b75b73b1803053788b9518a93c0b8e8737265f95d1 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:b943ff9a372ed2ef817b0f82ba1b05f458a10b5ffb91ad66433795ce1e428302 lifecycle: preStop: exec: From f567e2063e9871b7a457c467bca1f6b248436e44 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Mon, 23 Oct 2023 10:05:19 +0200 Subject: [PATCH 216/825] Upgrade to Spring Modulith 1.1.0-RC1 and 1.0.2 See gh-1324 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index efac23ac16..bcbae483f2 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -135,9 +135,9 @@ initializr: artifactId: spring-modulith-bom mappings: - compatibility-range: "[3.1.0,3.2.0-M1)" - version: 1.0.0 + version: 1.0.2 - compatibility-range: "3.2.0-M1" - version: 1.1.0-M1 + version: 1.1.0-RC1 repositories: spring-milestones spring-shell: groupId: org.springframework.shell From 909191a60a51834913ae251e42e488aed50a2d88 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 23 Oct 2023 08:56:18 +0000 Subject: [PATCH 217/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index bea2e54ca0..04f563ec87 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:b943ff9a372ed2ef817b0f82ba1b05f458a10b5ffb91ad66433795ce1e428302 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7e7ca3a23cf9fb20d7889b516f50e780c3c05eca4cb379b94a0f177fb7ac791e lifecycle: preStop: exec: From 90614db40234fe5d3f2ad5cc0ffb2095c6c5e44c Mon Sep 17 00:00:00 2001 From: wonwoo Date: Thu, 5 Oct 2023 17:47:37 +0900 Subject: [PATCH 218/825] Take R2DBC MySQL driver into account as of Spring Boot 3.1.x See gh-1314 --- .../R2dbcHelpDocumentCustomizer.java | 15 +++++++-- ...ingDataProjectGenerationConfiguration.java | 4 +-- .../R2dbcHelpDocumentCustomizerTests.java | 31 +++++++++++++------ 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java index e81eb4709c..c5454d28e2 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java @@ -22,6 +22,9 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds a section when R2DBC is selected but no @@ -31,17 +34,23 @@ */ public class R2dbcHelpDocumentCustomizer implements HelpDocumentCustomizer { - private static final List DRIVERS = Arrays.asList("h2", "mariadb", "postgresql", "sqlserver", "oracle"); + private static final List DRIVERS = Arrays.asList("h2", "mysql", "mariadb", "postgresql", "sqlserver", + "oracle"); + + private static final VersionRange SPRING_BOOT_3_1_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.1.0"); + + private final boolean mysqlR2dbcIsAsyncerDependency; private final Build build; - public R2dbcHelpDocumentCustomizer(Build build) { + public R2dbcHelpDocumentCustomizer(Build build, Version platformVersion) { this.build = build; + this.mysqlR2dbcIsAsyncerDependency = SPRING_BOOT_3_1_0_OR_LATER.match(platformVersion); } @Override public void customize(HelpDocument document) { - if (this.build.dependencies().ids().noneMatch(DRIVERS::contains)) { + if (this.build.dependencies().ids().noneMatch(DRIVERS::contains) || !this.mysqlR2dbcIsAsyncerDependency) { document.addSection((writer) -> { writer.println("## Missing R2DBC Driver"); writer.println(); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java index 4ba833ac69..756e2bcd50 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java @@ -39,8 +39,8 @@ public R2dbcBuildCustomizer r2dbcBuildCustomizer(ProjectDescription description) @Bean @ConditionalOnRequestedDependency("data-r2dbc") - public R2dbcHelpDocumentCustomizer r2dbcHelpDocumentCustomizer(Build build) { - return new R2dbcHelpDocumentCustomizer(build); + public R2dbcHelpDocumentCustomizer r2dbcHelpDocumentCustomizer(Build build, ProjectDescription description) { + return new R2dbcHelpDocumentCustomizer(build, description.getPlatformVersion()); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java index 486c7808ee..3f8bf2218a 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java @@ -21,6 +21,7 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.version.Version; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -35,53 +36,65 @@ class R2dbcHelpDocumentCustomizerTests { @Test void r2dbcWithNoMatchingDriver() { - HelpDocument helpDocument = createHelpDocument(); + HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0")); assertThat(helpDocument.getSections()).hasSize(1); } @Test void r2dbcWithH2() { - HelpDocument helpDocument = createHelpDocument("h2"); + HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "h2"); assertThat(helpDocument.getSections()).isEmpty(); } @Test void r2dbcWithMariadb() { - HelpDocument helpDocument = createHelpDocument("mariadb"); + HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "mariadb"); assertThat(helpDocument.getSections()).isEmpty(); } @Test void r2dbcWithPostgresql() { - HelpDocument helpDocument = createHelpDocument("postgresql"); + HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "postgresql"); assertThat(helpDocument.getSections()).isEmpty(); } @Test void r2dbcWithSqlServer() { - HelpDocument helpDocument = createHelpDocument("sqlserver"); + HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "sqlserver"); assertThat(helpDocument.getSections()).isEmpty(); } @Test void r2dbcWithOracle() { - HelpDocument helpDocument = createHelpDocument("oracle"); + HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "oracle"); assertThat(helpDocument.getSections()).isEmpty(); } + @Test + void r2dbcWithMysql() { + HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "mysql"); + assertThat(helpDocument.getSections()).isEmpty(); + } + + @Test + void r2dbcWithMysqlBeforeVersion() { + HelpDocument helpDocument = createHelpDocument(Version.parse("2.7.0.M1"), "mysql"); + assertThat(helpDocument.getSections()).hasSize(1); + } + @Test void r2dbcWithSeveralDrivers() { - HelpDocument helpDocument = createHelpDocument("mysql", "h2"); + HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "mysql", "h2"); assertThat(helpDocument.getSections()).isEmpty(); } - private HelpDocument createHelpDocument(String... dependencyIds) { + private HelpDocument createHelpDocument(Version platformVersion, String... dependencyIds) { Build build = new GradleBuild(); for (String dependencyId : dependencyIds) { build.dependencies().add(dependencyId, Dependency.withCoordinates(dependencyId, dependencyId)); } HelpDocument document = new HelpDocument(mock(MustacheTemplateRenderer.class)); - new R2dbcHelpDocumentCustomizer(build).customize(document); + new R2dbcHelpDocumentCustomizer(build, platformVersion).customize(document); return document; } From 4dfcba9c69c9a06db8dbed90133d00f1b58ae295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Mon, 23 Oct 2023 14:43:04 +0200 Subject: [PATCH 219/825] Polish "Take R2DBC MySQL driver into account as of Spring Boot 3.1.x" See gh-1314 --- .../R2dbcHelpDocumentCustomizer.java | 16 ++++++------- .../R2dbcHelpDocumentCustomizerTests.java | 24 +++++++++++-------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java index c5454d28e2..dd4f432597 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java @@ -16,7 +16,7 @@ package io.spring.start.site.extension.dependency.springdata; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; import io.spring.initializr.generator.buildsystem.Build; @@ -34,23 +34,23 @@ */ public class R2dbcHelpDocumentCustomizer implements HelpDocumentCustomizer { - private static final List DRIVERS = Arrays.asList("h2", "mysql", "mariadb", "postgresql", "sqlserver", - "oracle"); - private static final VersionRange SPRING_BOOT_3_1_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.1.0"); - private final boolean mysqlR2dbcIsAsyncerDependency; - private final Build build; + private final List drivers; + public R2dbcHelpDocumentCustomizer(Build build, Version platformVersion) { this.build = build; - this.mysqlR2dbcIsAsyncerDependency = SPRING_BOOT_3_1_0_OR_LATER.match(platformVersion); + this.drivers = new ArrayList<>(List.of("h2", "mariadb", "postgresql", "sqlserver", "oracle")); + if (SPRING_BOOT_3_1_0_OR_LATER.match(platformVersion)) { + this.drivers.add("mysql"); + } } @Override public void customize(HelpDocument document) { - if (this.build.dependencies().ids().noneMatch(DRIVERS::contains) || !this.mysqlR2dbcIsAsyncerDependency) { + if (this.build.dependencies().ids().noneMatch(this.drivers::contains)) { document.addSection((writer) -> { writer.println("## Missing R2DBC Driver"); writer.println(); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java index 3f8bf2218a..a69ad589ae 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java @@ -36,59 +36,63 @@ class R2dbcHelpDocumentCustomizerTests { @Test void r2dbcWithNoMatchingDriver() { - HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0")); + HelpDocument helpDocument = createHelpDocument(); assertThat(helpDocument.getSections()).hasSize(1); } @Test void r2dbcWithH2() { - HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "h2"); + HelpDocument helpDocument = createHelpDocument("h2"); assertThat(helpDocument.getSections()).isEmpty(); } @Test void r2dbcWithMariadb() { - HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "mariadb"); + HelpDocument helpDocument = createHelpDocument("mariadb"); assertThat(helpDocument.getSections()).isEmpty(); } @Test void r2dbcWithPostgresql() { - HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "postgresql"); + HelpDocument helpDocument = createHelpDocument("postgresql"); assertThat(helpDocument.getSections()).isEmpty(); } @Test void r2dbcWithSqlServer() { - HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "sqlserver"); + HelpDocument helpDocument = createHelpDocument("sqlserver"); assertThat(helpDocument.getSections()).isEmpty(); } @Test void r2dbcWithOracle() { - HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "oracle"); + HelpDocument helpDocument = createHelpDocument("oracle"); assertThat(helpDocument.getSections()).isEmpty(); } @Test void r2dbcWithMysql() { - HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "mysql"); + HelpDocument helpDocument = createHelpDocument("mysql"); assertThat(helpDocument.getSections()).isEmpty(); } @Test void r2dbcWithMysqlBeforeVersion() { - HelpDocument helpDocument = createHelpDocument(Version.parse("2.7.0.M1"), "mysql"); + HelpDocument helpDocument = createHelpDocumentForVersion(Version.parse("2.7.0.M1"), "mysql"); assertThat(helpDocument.getSections()).hasSize(1); } @Test void r2dbcWithSeveralDrivers() { - HelpDocument helpDocument = createHelpDocument(Version.parse("3.1.0"), "mysql", "h2"); + HelpDocument helpDocument = createHelpDocumentForVersion(Version.parse("3.1.0"), "mysql", "h2"); assertThat(helpDocument.getSections()).isEmpty(); } - private HelpDocument createHelpDocument(Version platformVersion, String... dependencyIds) { + private HelpDocument createHelpDocument(String... dependencyIds) { + return createHelpDocumentForVersion(Version.parse("3.1.0"), dependencyIds); + } + + private HelpDocument createHelpDocumentForVersion(Version platformVersion, String... dependencyIds) { Build build = new GradleBuild(); for (String dependencyId : dependencyIds) { build.dependencies().add(dependencyId, Dependency.withCoordinates(dependencyId, dependencyId)); From 748148fc59f81cdb3ba5a9166afd0323cb72c2c6 Mon Sep 17 00:00:00 2001 From: Chris Bono Date: Sat, 21 Oct 2023 15:32:16 -0500 Subject: [PATCH 220/825] Add Pulsar Binder to Spring Cloud Stream This commit ensures the Spring Cloud Stream Pulsar binder dependency is automatically added when the user chooses Spring Boot >= 3.2.0-M3 and adds the Pulsar and Cloud Stream dependencies. See gh-1322 --- .../SpringCloudStreamBuildCustomizer.java | 10 +++ ...SpringCloudStreamBuildCustomizerTests.java | 75 ++++++++++++++++--- 2 files changed, 76 insertions(+), 9 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java index 8476da598b..b0dba74597 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java @@ -57,6 +57,11 @@ public void customize(Build build) { .add("cloud-stream-binder-kafka", "org.springframework.cloud", "spring-cloud-stream-binder-kafka", DependencyScope.COMPILE); } + if (isSpringBoot3xWithPulsarSupport() && hasDependency("pulsar", build)) { + build.dependencies() + .add("cloud-stream-binder-pulsar", "org.springframework.cloud", "spring-cloud-stream-binder-pulsar", + DependencyScope.COMPILE); + } } // Spring Cloud Stream specific if (hasDependency("cloud-stream", build)) { @@ -92,4 +97,9 @@ protected boolean isSpringBoot3x() { return platformVersion.compareTo(Version.parse("3.0.0-M1")) > 0; } + protected boolean isSpringBoot3xWithPulsarSupport() { + Version platformVersion = this.description.getPlatformVersion(); + return platformVersion.compareTo(Version.parse("3.2.0-M3")) >= 0; + } + } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java index ad9bced503..65687ffd27 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java @@ -34,6 +34,7 @@ * * @author Stephane Nicoll * @author Brian Clozel + * @author Chris Bono */ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { @@ -43,6 +44,9 @@ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { private static final Dependency KAFKA_STREAMS_BINDER = Dependency.withId("cloud-stream-binder-kafka-streams", "org.springframework.cloud", "spring-cloud-stream-binder-kafka-streams"); + private static final Dependency PULSAR_BINDER = Dependency.withId("cloud-stream-binder-pulsar", + "org.springframework.cloud", "spring-cloud-stream-binder-pulsar"); + private static final Dependency RABBIT_BINDER = Dependency.withId("cloud-stream-binder-rabbit", "org.springframework.cloud", "spring-cloud-stream-binder-rabbit"); @@ -85,6 +89,19 @@ void springCloudStreamWithKafkaStreams(Version springBootVersion, Dependency tes .hasDependenciesSize(5); } + @ParameterizedTest + @MethodSource("springCloudStreamWithPulsarArguments") + void springCloudStreamWithPulsar(Version springBootVersion, Dependency testDependency) { + ProjectRequest request = createProjectRequest("cloud-stream", "pulsar"); + request.setBootVersion(springBootVersion.toString()); + assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) + .hasDependency(getDependency("pulsar")) + .hasDependency(PULSAR_BINDER) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependency(testDependency) + .hasDependenciesSize(5); + } + @ParameterizedTest @MethodSource("springCloudStreamArguments") void springCloudStreamWithAllBinders(Version springBootVersion, Dependency testDependency) { @@ -103,20 +120,27 @@ void springCloudStreamWithAllBinders(Version springBootVersion, Dependency testD } @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudBusWithRabbit(Version springBootVersion, Dependency testDependency) { - ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); + @MethodSource("springCloudStreamWithPulsarArguments") + void springCloudStreamWithAllBindersInBoot32x(Version springBootVersion, Dependency testDependency) { + ProjectRequest request = createProjectRequest("cloud-stream", "amqp", "kafka", "kafka-streams", "pulsar"); request.setBootVersion(springBootVersion.toString()); - assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) + assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) + .hasDependency(getDependency("kafka")) + .hasDependency(getDependency("kafka-streams")) + .hasDependency(getDependency("pulsar")) .hasDependency(RABBIT_BINDER) + .hasDependency(KAFKA_BINDER) + .hasDependency(KAFKA_STREAMS_BINDER) + .hasDependency(PULSAR_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependenciesSize(5); + .hasDependency(testDependency) + .hasDependenciesSize(13); } @ParameterizedTest @MethodSource("springCloudStreamArguments") - void springCloudBusWithKafka(Version springBootVersion, Dependency testDependency) { + void springCloudBusWithRabbit(Version springBootVersion, Dependency ignoredTestDependency) { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) @@ -128,17 +152,43 @@ void springCloudBusWithKafka(Version springBootVersion, Dependency testDependenc @ParameterizedTest @MethodSource("springCloudStreamArguments") - void springCloudBusWithAllBinders(Version springBootVersion, Dependency testDependency) { - ProjectRequest request = createProjectRequest("cloud-bus", "amqp", "kafka", "kafka-streams"); + void springCloudBusWithKafka(Version springBootVersion, Dependency ignoredTestDependency) { + ProjectRequest request = createProjectRequest("cloud-bus", "kafka"); + request.setBootVersion(springBootVersion.toString()); + assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) + .hasDependency(getDependency("kafka")) + .hasDependency(KAFKA_BINDER) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependenciesSize(5); + } + + @ParameterizedTest + @MethodSource("springCloudStreamWithPulsarArguments") + void springCloudBusWithPulsar(Version springBootVersion, Dependency ignoredTestDependency) { + ProjectRequest request = createProjectRequest("cloud-bus", "pulsar"); + request.setBootVersion(springBootVersion.toString()); + assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) + .hasDependency(getDependency("pulsar")) + .hasDependency(PULSAR_BINDER) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependenciesSize(4); + } + + @ParameterizedTest + @MethodSource("springCloudStreamWithPulsarArguments") + void springCloudBusWithAllBindersInBoot32x(Version springBootVersion, Dependency ignoredTestDependency) { + ProjectRequest request = createProjectRequest("cloud-bus", "amqp", "kafka", "kafka-streams", "pulsar"); request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) .hasDependency(getDependency("kafka-streams")) + .hasDependency(getDependency("pulsar")) .hasDependency(RABBIT_BINDER) .hasDependency(KAFKA_BINDER) + .hasDependency(PULSAR_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependenciesSize(9); + .hasDependenciesSize(11); } @Test @@ -159,4 +209,11 @@ private static Stream springCloudStreamArguments() { Arguments.of(Version.parse("3.0.0"), testBinder)); } + private static Stream springCloudStreamWithPulsarArguments() { + Dependency testBinder = Dependency.withId("cloud-stream-test", "org.springframework.cloud", + "spring-cloud-stream-test-binder", null, Dependency.SCOPE_TEST); + return Stream.of(Arguments.of(Version.parse("3.2.0-M3"), testBinder), + Arguments.of(Version.parse("3.2.0-RC1"), testBinder)); + } + } From 412353e2ff9a283eef0a40f367638fef26d49644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Mon, 23 Oct 2023 14:53:41 +0200 Subject: [PATCH 221/825] Polish "Add Pulsar Binder to Spring Cloud Stream" See gh-1322 --- ...SpringCloudStreamBuildCustomizerTests.java | 69 ++++--------------- 1 file changed, 13 insertions(+), 56 deletions(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java index 65687ffd27..3b9df5c97e 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java @@ -89,17 +89,14 @@ void springCloudStreamWithKafkaStreams(Version springBootVersion, Dependency tes .hasDependenciesSize(5); } - @ParameterizedTest - @MethodSource("springCloudStreamWithPulsarArguments") - void springCloudStreamWithPulsar(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudStreamWithPulsar() { ProjectRequest request = createProjectRequest("cloud-stream", "pulsar"); - request.setBootVersion(springBootVersion.toString()); + request.setBootVersion("3.2.0-RC1"); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("pulsar")) .hasDependency(PULSAR_BINDER) - .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependency(testDependency) - .hasDependenciesSize(5); + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)); } @ParameterizedTest @@ -119,28 +116,9 @@ void springCloudStreamWithAllBinders(Version springBootVersion, Dependency testD .hasDependenciesSize(11); } - @ParameterizedTest - @MethodSource("springCloudStreamWithPulsarArguments") - void springCloudStreamWithAllBindersInBoot32x(Version springBootVersion, Dependency testDependency) { - ProjectRequest request = createProjectRequest("cloud-stream", "amqp", "kafka", "kafka-streams", "pulsar"); - request.setBootVersion(springBootVersion.toString()); - assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) - .hasDependency(getDependency("amqp")) - .hasDependency(getDependency("kafka")) - .hasDependency(getDependency("kafka-streams")) - .hasDependency(getDependency("pulsar")) - .hasDependency(RABBIT_BINDER) - .hasDependency(KAFKA_BINDER) - .hasDependency(KAFKA_STREAMS_BINDER) - .hasDependency(PULSAR_BINDER) - .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependency(testDependency) - .hasDependenciesSize(13); - } - @ParameterizedTest @MethodSource("springCloudStreamArguments") - void springCloudBusWithRabbit(Version springBootVersion, Dependency ignoredTestDependency) { + void springCloudBusWithRabbit(Version springBootVersion, Dependency testDependency) { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) @@ -152,43 +130,29 @@ void springCloudBusWithRabbit(Version springBootVersion, Dependency ignoredTestD @ParameterizedTest @MethodSource("springCloudStreamArguments") - void springCloudBusWithKafka(Version springBootVersion, Dependency ignoredTestDependency) { - ProjectRequest request = createProjectRequest("cloud-bus", "kafka"); + void springCloudBusWithKafka(Version springBootVersion, Dependency testDependency) { + ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) - .hasDependency(getDependency("kafka")) - .hasDependency(KAFKA_BINDER) + .hasDependency(getDependency("amqp")) + .hasDependency(RABBIT_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependenciesSize(5); } @ParameterizedTest - @MethodSource("springCloudStreamWithPulsarArguments") - void springCloudBusWithPulsar(Version springBootVersion, Dependency ignoredTestDependency) { - ProjectRequest request = createProjectRequest("cloud-bus", "pulsar"); - request.setBootVersion(springBootVersion.toString()); - assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) - .hasDependency(getDependency("pulsar")) - .hasDependency(PULSAR_BINDER) - .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependenciesSize(4); - } - - @ParameterizedTest - @MethodSource("springCloudStreamWithPulsarArguments") - void springCloudBusWithAllBindersInBoot32x(Version springBootVersion, Dependency ignoredTestDependency) { - ProjectRequest request = createProjectRequest("cloud-bus", "amqp", "kafka", "kafka-streams", "pulsar"); + @MethodSource("springCloudStreamArguments") + void springCloudBusWithAllBinders(Version springBootVersion, Dependency testDependency) { + ProjectRequest request = createProjectRequest("cloud-bus", "amqp", "kafka", "kafka-streams"); request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) .hasDependency(getDependency("kafka-streams")) - .hasDependency(getDependency("pulsar")) .hasDependency(RABBIT_BINDER) .hasDependency(KAFKA_BINDER) - .hasDependency(PULSAR_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependenciesSize(11); + .hasDependenciesSize(9); } @Test @@ -209,11 +173,4 @@ private static Stream springCloudStreamArguments() { Arguments.of(Version.parse("3.0.0"), testBinder)); } - private static Stream springCloudStreamWithPulsarArguments() { - Dependency testBinder = Dependency.withId("cloud-stream-test", "org.springframework.cloud", - "spring-cloud-stream-test-binder", null, Dependency.SCOPE_TEST); - return Stream.of(Arguments.of(Version.parse("3.2.0-M3"), testBinder), - Arguments.of(Version.parse("3.2.0-RC1"), testBinder)); - } - } From 11186a6f7e850dd4ff7af553fad4fd40a2ebd2a6 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 23 Oct 2023 12:59:18 +0000 Subject: [PATCH 222/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 04f563ec87..e3b0cc0e9e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7e7ca3a23cf9fb20d7889b516f50e780c3c05eca4cb379b94a0f177fb7ac791e + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2f6f5dac100222ec9fc6c65c1937c03497cd9c94ba198e32eeb6d84062e19e54 lifecycle: preStop: exec: From 54773e780ca1391c7e0efd1cb7dcb3f4d5a52188 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 23 Oct 2023 13:10:21 +0000 Subject: [PATCH 223/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index e3b0cc0e9e..e9b093e6af 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2f6f5dac100222ec9fc6c65c1937c03497cd9c94ba198e32eeb6d84062e19e54 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2175076ac7e704a1635a429d89917cc5dc422e99efdca9863d441af28d937c37 lifecycle: preStop: exec: From 67fba4c18c56859b8247e4c4e86d75fda19b1c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Mon, 23 Oct 2023 15:18:16 +0200 Subject: [PATCH 224/825] Swap Resilience4J starter to reactive variant if necessary This commit detects the presence of both Spring Cloud Resilience4J and Spring WebFlux to use the dedicated reactive variant of the starter. Closes gh-1300 --- ...ectDescriptionCustomizerConfiguration.java | 8 ++- ...ilience4JProjectDescriptionCustomizer.java | 47 +++++++++++++++ ...ce4JProjectDescriptionCustomizerTests.java | 58 +++++++++++++++++++ 3 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizer.java create mode 100644 start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java b/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java index 0b72707648..28a5b81118 100644 --- a/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; import io.spring.start.site.project.dependency.springcloud.SpringCloudGatewayProjectDescriptionCustomizer; +import io.spring.start.site.project.dependency.springcloud.SpringCloudResilience4JProjectDescriptionCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -35,6 +36,11 @@ public JavaVersionProjectDescriptionCustomizer javaVersionProjectDescriptionCust return new JavaVersionProjectDescriptionCustomizer(); } + @Bean + public SpringCloudResilience4JProjectDescriptionCustomizer springCloudResilience4JProjectDescriptionCustomizer() { + return new SpringCloudResilience4JProjectDescriptionCustomizer(); + } + @Bean public SpringCloudGatewayProjectDescriptionCustomizer springCloudGatewayProjectDescriptionCustomizer() { return new SpringCloudGatewayProjectDescriptionCustomizer(); diff --git a/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizer.java new file mode 100644 index 0000000000..2a485c2bec --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizer.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.project.dependency.springcloud; + +import java.util.Collection; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.project.MutableProjectDescription; +import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; + +/** + * A {@link ProjectDescriptionCustomizer} that checks the web stack that is used with + * Spring Cloud Resilience4j as it has a starter for the servlet stack and another one for + * the reactive stack. + * + * @author Stephane Nicoll + */ +public class SpringCloudResilience4JProjectDescriptionCustomizer implements ProjectDescriptionCustomizer { + + @Override + public void customize(MutableProjectDescription description) { + Collection dependencyIds = description.getRequestedDependencies().keySet(); + if (!dependencyIds.contains("cloud-resilience4j")) { + return; + } + if (dependencyIds.contains("webflux")) { + description.addDependency("cloud-resilience4j", + Dependency.from(description.getRequestedDependencies().get("cloud-resilience4j")) + .artifactId("spring-cloud-starter-circuitbreaker-reactor-resilience4j")); + } + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizerTests.java new file mode 100644 index 0000000000..4a5980142a --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudResilience4JProjectDescriptionCustomizerTests.java @@ -0,0 +1,58 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.project.dependency.springcloud; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.project.MutableProjectDescription; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +/** + * Tests for {@link SpringCloudResilience4JProjectDescriptionCustomizer}. + * + * @author Stephane Nicoll + */ +class SpringCloudResilience4JProjectDescriptionCustomizerTests { + + @Test + void customizeWithSpringCloudResilience4jAndSpringMvcUsesMvcStarter() { + MutableProjectDescription description = new MutableProjectDescription(); + description.addDependency("cloud-resilience4j", Dependency.withCoordinates("org.springframework.cloud", + "spring-cloud-starter-circuitbreaker-resilience4j")); + description.addDependency("web", mock(Dependency.class)); + new SpringCloudResilience4JProjectDescriptionCustomizer().customize(description); + assertThat(description.getRequestedDependencies()).containsOnlyKeys("cloud-resilience4j", "web"); + Dependency cloudResilience4j = description.getRequestedDependencies().get("cloud-resilience4j"); + assertThat(cloudResilience4j.getArtifactId()).isEqualTo("spring-cloud-starter-circuitbreaker-resilience4j"); + } + + @Test + void customizeWithSpringCloudResilience4jAndSpringWebfluxUsesReactiveStarter() { + MutableProjectDescription description = new MutableProjectDescription(); + description.addDependency("cloud-resilience4j", Dependency.withCoordinates("org.springframework.cloud", + "spring-cloud-starter-circuitbreaker-resilience4j")); + description.addDependency("webflux", mock(Dependency.class)); + new SpringCloudResilience4JProjectDescriptionCustomizer().customize(description); + assertThat(description.getRequestedDependencies()).containsOnlyKeys("cloud-resilience4j", "webflux"); + Dependency cloudResilience4j = description.getRequestedDependencies().get("cloud-resilience4j"); + assertThat(cloudResilience4j.getArtifactId()) + .isEqualTo("spring-cloud-starter-circuitbreaker-reactor-resilience4j"); + } + +} From 1887830027ad09265c73b01cefe5cf204caadc70 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 23 Oct 2023 13:38:01 +0000 Subject: [PATCH 225/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index e9b093e6af..142b8e2597 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2175076ac7e704a1635a429d89917cc5dc422e99efdca9863d441af28d937c37 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f695b841805a756fa20157e0f8e4747ed654b44bb4707cd15e74e759b9fc625f lifecycle: preStop: exec: From eccabee420f4b587ec56bae67f606b7dcc9eaf1b Mon Sep 17 00:00:00 2001 From: Deepankar Dixit <90280028+ddixit14@users.noreply.github.com> Date: Mon, 23 Oct 2023 10:25:01 -0400 Subject: [PATCH 226/825] Upgrade to Spring Cloud GCP 4.8.2 and 3.7.2 See gh-1325 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index bcbae483f2..c9310f38bf 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -115,9 +115,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 3.7.1 + version: 3.7.2 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.8.1 + version: 4.8.2 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From e22a7b98fe38442a061d6772171a5755a78a4828 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 23 Oct 2023 14:52:57 +0000 Subject: [PATCH 227/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 142b8e2597..e7a5c8850b 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f695b841805a756fa20157e0f8e4747ed654b44bb4707cd15e74e759b9fc625f + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:53f2dff79d0a99701a37bed203a9318ea5ff3581cc15bcd0736f4fd1f2bcec9e lifecycle: preStop: exec: From f89cbb5dc75045d0f2897380ef2ba0ed905a8297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Tue, 24 Oct 2023 09:24:09 +0200 Subject: [PATCH 228/825] Upgrade to Spring Cloud Azure 4.12.0 Closes gh-1326 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c9310f38bf..d0f77e75c6 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -105,7 +105,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 4.11.0 + version: 4.12.0 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" version: 5.5.0 spring-cloud-gcp: From ee94d765201a9bb6f98c0414e422d6f24184b045 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 24 Oct 2023 07:35:48 +0000 Subject: [PATCH 229/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index e7a5c8850b..7f5a401db1 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:53f2dff79d0a99701a37bed203a9318ea5ff3581cc15bcd0736f4fd1f2bcec9e + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6f9e999c4cff2bced80de9d30f00116faa35533060a1cf4b895ec62addd3ab3b lifecycle: preStop: exec: From ff78d906a6639d81aae59c1bb255461bbe4f6da1 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Wed, 25 Oct 2023 14:18:14 +0200 Subject: [PATCH 230/825] Update dependencies --- start-client/yarn.lock | 1618 +++++++++++++++++++++------------------- 1 file changed, 858 insertions(+), 760 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index cd1a439ccf..c64f5a1c42 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -25,13 +25,13 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.22.10.tgz#25e4bbd8d0a0d8b4b389e1b5e2d7a238bd4c1b75" - integrity sha512-rM9ZMmaII630zGvtMtQ3P4GyHs28CHLYE9apLG7L8TgaSqcfoIGrlLSLsh4Q8kDTdZQQEXZm1M0nQtOvU/2heg== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.23.0.tgz#1d7f37c44d4117c67df46749e0c86e11a58cc64b" + integrity sha512-17E1oSkGk2IwNILM4jtfAvgjt+ohmpfBky8aLerUfYZhiPNg7ca+CRCxZn8QDxwNhV/upsc2VHBCqGFIR+iBfA== dependencies: "@jridgewell/trace-mapping" "^0.3.17" commander "^4.0.1" - convert-source-map "^1.1.0" + convert-source-map "^2.0.0" fs-readdir-recursive "^1.1.0" glob "^7.2.0" make-dir "^2.1.0" @@ -40,7 +40,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -48,47 +48,47 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" + integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" - integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" + integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.11" - "@babel/parser" "^7.22.11" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" - convert-source-map "^1.7.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.11.tgz#cceb8c7989c241a16dd14e12a6cd725618f3f58b" - integrity sha512-YjOYZ3j7TjV8OhLW6NCtyg8G04uStATEUe5eiLuCZaXz2VSDQ3dsAtm2D+TuQyAqNMUK2WacGo0/uma9Pein1w== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz#263f059c476e29ca4972481a17b8b660cb025a34" + integrity sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.22.10", "@babel/generator@^7.7.2": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== +"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -101,32 +101,32 @@ "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" - integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" browserslist "^4.21.9" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.10", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213" - integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -134,18 +134,18 @@ semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" - integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" - integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== +"@babel/helper-define-polyfill-provider@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" + integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -153,18 +153,18 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" @@ -173,30 +173,30 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.23.0" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -210,22 +210,22 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" - integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== +"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.9" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" - integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== +"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.22.5": @@ -254,63 +254,63 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helper-wrap-function@^7.22.5", "@babel/helper-wrap-function@^7.22.9": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" - integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== +"@babel/helper-wrap-function@^7.22.20", "@babel/helper-wrap-function@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.10" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" -"@babel/helpers@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" - integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== +"@babel/helpers@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" "@babel/highlight@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" - integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.11", "@babel/parser@^7.22.5", "@babel/parser@^7.7.0": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.13.tgz#23fb17892b2be7afef94f573031c2f4b42839a2b" - integrity sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.7.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" - integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" - integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" "@babel/plugin-proposal-class-properties@^7.13.0": version "7.18.6" @@ -321,13 +321,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.13.15": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.10.tgz#d6a8c3a9018e1b13e6647f869c5ea56ff2b585d4" - integrity sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz#0b345a5754f48309fa50b7cd99075ef0295b12c8" + integrity sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.10" + "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-replace-supers" "^7.22.20" "@babel/helper-split-export-declaration" "^7.22.6" "@babel/plugin-syntax-decorators" "^7.22.10" @@ -340,9 +340,9 @@ "@babel/plugin-syntax-do-expressions" "^7.22.5" "@babel/plugin-proposal-export-default-from@^7.12.13": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.5.tgz#825924eda1fad382c3de4db6fe1711b6fa03362f" - integrity sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg== + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.17.tgz#91b60cd338f501cccdf549af2308768911ec5fbb" + integrity sha512-cop/3quQBVvdz6X5SJC6AhUv3C9DrVTM06LUEXimEdWAhCSyOJIr9NiZDU9leHZ0/aiG0Sh7Zmvaku5TWYNgbA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-default-from" "^7.22.5" @@ -414,9 +414,9 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-pipeline-operator@^7.12.13": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.22.5.tgz#b8de7272264bec2c8cf9b22e7889bb33af54c4a4" - integrity sha512-nSgHJB3uP+DORxBVhQgjub0qtU/LGj/mBDz2kQEGy1EUDy3f92VWDeB3J3/41ZjVLWmkNWOd6yjdNb4a5wDfZQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.22.15.tgz#02711e858ea4996dd50bbdd8a278b347f6344276" + integrity sha512-tk81rXNA4T/AQc4zFhIIJp9OSmY8rmy46G7LXiPm4+/X8A0A0f9ri6yjEIj3fYqZQYrQnX9uuWXppPGsEesYtg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-pipeline-operator" "^7.22.5" @@ -646,14 +646,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.22.10": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz#dbe3b1ff5a52e2e5edc4b19a60d325a675ed2649" - integrity sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw== +"@babel/plugin-transform-async-generator-functions@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" + integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-transform-async-to-generator@^7.22.5": @@ -672,10 +672,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" - integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== +"@babel/plugin-transform-block-scoping@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" + integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -687,7 +687,7 @@ "@babel/helper-create-class-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-static-block@^7.22.5": +"@babel/plugin-transform-class-static-block@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== @@ -696,18 +696,18 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" - integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" @@ -719,10 +719,10 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" - integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== +"@babel/plugin-transform-destructuring@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" + integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -741,7 +741,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dynamic-import@^7.22.5": +"@babel/plugin-transform-dynamic-import@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== @@ -757,7 +757,7 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-export-namespace-from@^7.22.5": +"@babel/plugin-transform-export-namespace-from@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== @@ -765,10 +765,10 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" - integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -781,7 +781,7 @@ "@babel/helper-function-name" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-json-strings@^7.22.5": +"@babel/plugin-transform-json-strings@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== @@ -796,7 +796,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-logical-assignment-operators@^7.22.5": +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== @@ -811,32 +811,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" - integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== +"@babel/plugin-transform-modules-amd@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" + integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== dependencies: - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.22.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz#d7991d3abad199c03b68ee66a64f216c47ffdfae" - integrity sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g== +"@babel/plugin-transform-modules-commonjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== dependencies: - "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.22.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" - integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== +"@babel/plugin-transform-modules-systemjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" + integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/plugin-transform-modules-umd@^7.22.5": version "7.22.5" @@ -861,7 +861,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== @@ -869,7 +869,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.22.5": +"@babel/plugin-transform-numeric-separator@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== @@ -877,16 +877,16 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.22.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz#dbbb06ce783cd994a8f430d8cefa553e9b42ca62" - integrity sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw== +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.10" + "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-parameters" "^7.22.15" "@babel/plugin-transform-object-super@^7.22.5": version "7.22.5" @@ -896,7 +896,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-replace-supers" "^7.22.5" -"@babel/plugin-transform-optional-catch-binding@^7.22.5": +"@babel/plugin-transform-optional-catch-binding@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== @@ -904,19 +904,19 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.10", "@babel/plugin-transform-optional-chaining@^7.22.5": - version "7.22.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz#d7ebf6a88cd2f4d307b0e000ab630acd8124b333" - integrity sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw== +"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" + integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" - integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -928,7 +928,7 @@ "@babel/helper-create-class-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-property-in-object@^7.22.5": +"@babel/plugin-transform-private-property-in-object@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== @@ -959,16 +959,16 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" - integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== +"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" + integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" "@babel/plugin-transform-react-pure-annotations@^7.22.5": version "7.22.5" @@ -994,15 +994,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.18.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz#89eda6daf1d3af6f36fb368766553054c8d7cd46" - integrity sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz#c956a3f8d1aa50816ff6c30c6288d66635c12990" + integrity sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA== dependencies: - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.22.5": @@ -1073,16 +1073,16 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.10.tgz#3263b9fe2c8823d191d28e61eac60a79f9ce8a0f" - integrity sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059" + integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.10" + "@babel/compat-data" "^7.23.2" + "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" @@ -1103,41 +1103,41 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.10" + "@babel/plugin-transform-async-generator-functions" "^7.23.2" "@babel/plugin-transform-async-to-generator" "^7.22.5" "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.22.10" + "@babel/plugin-transform-block-scoping" "^7.23.0" "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.5" - "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-class-static-block" "^7.22.11" + "@babel/plugin-transform-classes" "^7.22.15" "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.10" + "@babel/plugin-transform-destructuring" "^7.23.0" "@babel/plugin-transform-dotall-regex" "^7.22.5" "@babel/plugin-transform-duplicate-keys" "^7.22.5" - "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.11" "@babel/plugin-transform-exponentiation-operator" "^7.22.5" - "@babel/plugin-transform-export-namespace-from" "^7.22.5" - "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" + "@babel/plugin-transform-for-of" "^7.22.15" "@babel/plugin-transform-function-name" "^7.22.5" - "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.11" "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.5" - "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.23.0" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-modules-systemjs" "^7.23.0" "@babel/plugin-transform-modules-umd" "^7.22.5" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" "@babel/plugin-transform-new-target" "^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" - "@babel/plugin-transform-numeric-separator" "^7.22.5" - "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.15" "@babel/plugin-transform-object-super" "^7.22.5" - "@babel/plugin-transform-optional-catch-binding" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.10" - "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.23.0" + "@babel/plugin-transform-parameters" "^7.22.15" "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" "@babel/plugin-transform-property-literals" "^7.22.5" "@babel/plugin-transform-regenerator" "^7.22.10" "@babel/plugin-transform-reserved-words" "^7.22.5" @@ -1151,10 +1151,10 @@ "@babel/plugin-transform-unicode-regex" "^7.22.5" "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.22.10" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" + "@babel/types" "^7.23.0" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" core-js-compat "^3.31.0" semver "^6.3.1" @@ -1168,14 +1168,14 @@ esutils "^2.0.2" "@babel/preset-react@^7.13.13": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.5.tgz#c4d6058fbf80bccad02dd8c313a9aaa67e3c3dd6" - integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" + integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" "@babel/plugin-transform-react-display-name" "^7.22.5" - "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.15" "@babel/plugin-transform-react-jsx-development" "^7.22.5" "@babel/plugin-transform-react-pure-annotations" "^7.22.5" @@ -1185,44 +1185,44 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" - integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== +"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.22.11", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" - integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.23.2", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" - integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1243,9 +1243,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" - integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" + integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== "@eslint/eslintrc@^2.1.2": version "2.1.2" @@ -1262,22 +1262,22 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.48.0": - version "8.48.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" - integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== +"@eslint/js@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.52.0.tgz#78fe5f117840f69dc4a353adf9b9cd926353378c" + integrity sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA== "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" + "@humanwhocodes/object-schema" "^2.0.1" debug "^4.1.1" minimatch "^3.0.5" @@ -1286,10 +1286,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1846,9 +1846,9 @@ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1921,9 +1921,9 @@ rimraf "^3.0.2" "@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + version "1.0.0-next.23" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.23.tgz#498e41218ab3b6a1419c735e5c6ae2c5ed609b6c" + integrity sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg== "@rollup/plugin-babel@^5.2.0": version "5.3.1" @@ -2002,9 +2002,9 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/babel__core@^7.1.14": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + version "7.20.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.3.tgz#d5625a50b6f18244425a1359a858c73d70340778" + integrity sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -2013,84 +2013,84 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.6" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.6.tgz#676f89f67dc8ddaae923f70ebc5f1fa800c031a8" + integrity sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.3" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.3.tgz#db9ac539a2fe05cfe9e168b24f360701bde41f5f" + integrity sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" - integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + version "7.20.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.3.tgz#a971aa47441b28ef17884ff945d0551265a2d058" + integrity sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw== dependencies: "@babel/types" "^7.20.7" "@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + version "1.19.4" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.4.tgz#78ad68f1f79eb851aa3634db0c7f57f6f601b462" + integrity sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + version "3.5.12" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.12.tgz#49badafb988e6c433ca675a5fd769b93b7649fc8" + integrity sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg== dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" - integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz#acf51e088b3bb6507f7b093bd2b0de20940179cc" + integrity sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + version "3.4.37" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.37.tgz#c66a96689fd3127c8772eb3e9e5c6028ec1a9af5" + integrity sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q== dependencies: "@types/node" "*" "@types/debug@^4.0.0": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" - integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== + version "4.1.10" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.10.tgz#f23148a6eb771a34c466a4fc28379d8101e84494" + integrity sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA== dependencies: "@types/ms" "*" "@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + version "3.7.6" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.6.tgz#585578b368ed170e67de8aae7b93f54a1b2fdc26" + integrity sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" - integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== + version "8.44.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.6.tgz#60e564551966dd255f4c01c459f0b4fb87068603" + integrity sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.3.tgz#2be19e759a3dd18c79f9f436bd7363556c1a73dd" + integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ== "@types/estree@0.0.39": version "0.0.39" @@ -2098,9 +2098,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.36" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz#baa9022119bdc05a4adfe740ffc97b5f9360e545" - integrity sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q== + version "4.17.39" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz#2107afc0a4b035e6cb00accac3bdf2d76ae408c8" + integrity sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2108,9 +2108,9 @@ "@types/send" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + version "4.17.20" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.20.tgz#e7c9b40276d29e38a4e3564d7a3d65911e2aa433" + integrity sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -2126,16 +2126,16 @@ "@types/node" "*" "@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.8.tgz#417e461e4dc79d957dc3107f45fe4973b09c2915" + integrity sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw== dependencies: "@types/node" "*" "@types/hast@^2.0.0": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.5.tgz#08caac88b44d0fdd04dc17a19142355f43bd8a7a" - integrity sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg== + version "2.3.7" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.7.tgz#5e9bd7ab4452d5313aeec9d38fbc193a70f8d810" + integrity sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw== dependencies: "@types/unist" "^2" @@ -2145,40 +2145,40 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-errors@*": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" - integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.3.tgz#c54e61f79b3947d040f150abd58f71efb422ff62" + integrity sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA== "@types/http-proxy@^1.17.8": - version "1.17.11" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" - integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + version "1.17.13" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.13.tgz#dd3a4da550580eb0557d4c7128a2ff1d1a38d465" + integrity sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" + integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz#394798d5f727402eb5ec99eb9618ffcd2b7645a1" + integrity sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz#0313e2608e6d6955d195f55361ddeebd4b74c6e7" + integrity sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg== dependencies: "@types/istanbul-lib-report" "*" "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.14" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" + integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== "@types/json5@^0.0.29": version "0.0.29" @@ -2186,21 +2186,21 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/mdast@^3.0.0": - version "3.0.12" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.12.tgz#beeb511b977c875a5b0cc92eab6fcac2f0895514" - integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== + version "3.0.14" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.14.tgz#0735473a5b35be032b9f2685b7413cbab1b8a639" + integrity sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw== dependencies: "@types/unist" "^2" "@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.3.tgz#886674659ce55fe7c6c06ec5ca7c0eb276a08f91" + integrity sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ== "@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" + integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== "@types/minimatch@*": version "5.1.2" @@ -2208,19 +2208,21 @@ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.4.tgz#81f886786411c45bba3f33e781ab48bd56bfca2e" + integrity sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ== "@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + version "0.7.33" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.33.tgz#80bf1da64b15f21fd8c1dc387c31929317d99ee9" + integrity sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ== "@types/node@*": - version "20.5.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" - integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== + version "20.8.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.8.tgz#adee050b422061ad5255fc38ff71b2bb96ea2a0e" + integrity sha512-YRsdVxq6OaLfmR9Hy816IMp33xOBjfyOgUd77ehqg96CFywxAPbDbXvAsuN2KVg2HOT8Eh6uAfU+l4WffwPVrQ== + dependencies: + undici-types "~5.25.1" "@types/node@16.9.1": version "16.9.1" @@ -2228,9 +2230,9 @@ integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g== "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.3" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" + integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== "@types/prettier@^2.1.5": version "2.7.3" @@ -2238,19 +2240,19 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@^15.0.0": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.9" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.9.tgz#b6f785caa7ea1fe4414d9df42ee0ab67f23d8a6d" + integrity sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g== "@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.9" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" + integrity sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.6.tgz#7cb33992049fd7340d5b10c0098e104184dfcd2a" + integrity sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA== "@types/resolve@1.17.1": version "1.17.1" @@ -2265,79 +2267,79 @@ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/semver@^7.3.12": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" - integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== + version "7.5.4" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff" + integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ== "@types/send@*": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + version "0.17.3" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.3.tgz#81b2ea5a3a18aad357405af2d643ccbe5a09020b" + integrity sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + version "1.9.3" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.3.tgz#af9403916eb6fbf7d6ec6f47b2a4c46eb3222cc9" + integrity sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.2" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" - integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + version "1.15.4" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.4.tgz#44b5895a68ca637f06c229119e1c774ca88f81b2" + integrity sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw== dependencies: "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" "@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + version "0.3.35" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.35.tgz#f4a568c73d2a8071944bd6ffdca0d4e66810cd21" + integrity sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw== dependencies: "@types/node" "*" "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.2.tgz#01284dde9ef4e6d8cef6422798d9a3ad18a66f8b" + integrity sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw== "@types/trusted-types@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" - integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.5.tgz#5cac7e7df3275bb95f79594f192d97da3b4fd5fe" + integrity sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA== "@types/unist@^2", "@types/unist@^2.0.0": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.7.tgz#5b06ad6894b236a1d2bd6b2f07850ca5c59cf4d6" - integrity sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g== + version "2.0.9" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.9.tgz#72e164381659a49557b0a078b28308f2c6a3e1ce" + integrity sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ== "@types/ws@^8.5.5": - version "8.5.5" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" - integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + version "8.5.8" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.8.tgz#13efec7bd439d0bdf2af93030804a94f163b1430" + integrity sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg== dependencies: "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.2" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.2.tgz#7bd04c5da378496ef1695a1008bf8f71847a8b8b" + integrity sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw== "@types/yargs@^15.0.0": - version "15.0.15" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" - integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + version "15.0.17" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.17.tgz#bea870ba551b43831bfaa75de2e4a3849c39322b" + integrity sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + version "17.0.29" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.29.tgz#06aabc72497b798c643c812a8b561537fea760cf" + integrity sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA== dependencies: "@types/yargs-parser" "*" @@ -2389,6 +2391,11 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" @@ -2778,15 +2785,15 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" is-string "^1.0.7" array-union@^1.0.2: @@ -2811,56 +2818,57 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -array.prototype.findlastindex@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz#bc229aef98f6bd0533a2bc61ff95209875526c9b" - integrity sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw== +array.prototype.findlastindex@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.1" -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== +array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.1" -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== dependencies: array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" define-properties "^1.2.0" + es-abstract "^1.22.1" get-intrinsic "^1.2.1" is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" @@ -2945,9 +2953,9 @@ aws4@^1.8.0: integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== axe-core@^4.6.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" - integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== + version "4.8.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" + integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== axobject-query@^3.1.1: version "3.2.1" @@ -3012,29 +3020,29 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" - integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== +babel-plugin-polyfill-corejs2@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" + integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.4.3" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" - integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== +babel-plugin-polyfill-corejs3@^0.8.5: + version "0.8.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf" + integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - core-js-compat "^3.31.0" + "@babel/helper-define-polyfill-provider" "^0.4.3" + core-js-compat "^3.33.1" -babel-plugin-polyfill-regenerator@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" - integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== +babel-plugin-polyfill-regenerator@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" + integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.4.3" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -3193,15 +3201,15 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== +browserslist@^4.14.5, browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + update-browserslist-db "^1.0.13" bser@2.1.1: version "2.1.1" @@ -3282,13 +3290,14 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" call-me-maybe@^1.0.1: version "1.0.2" @@ -3346,10 +3355,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001517: - version "1.0.30001524" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz#1e14bce4f43c41a7deaeb5ebfe86664fe8dadb80" - integrity sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA== +caniuse-lite@^1.0.30001541: + version "1.0.30001554" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz#ba80d88dff9acbc0cd4b7535fc30e0191c5e2e2a" + integrity sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ== caseless@~0.12.0: version "0.12.0" @@ -3419,9 +3428,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: version "1.2.3" @@ -3650,11 +3659,16 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -3689,12 +3703,12 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.31.0: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" - integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== +core-js-compat@^3.31.0, core-js-compat@^3.33.1: + version "3.33.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.1.tgz#debe80464107d75419e00c2ee29f35982118ff84" + integrity sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ== dependencies: - browserslist "^4.21.10" + browserslist "^4.22.1" core-util-is@1.0.2: version "1.0.2" @@ -3873,16 +3887,26 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -4091,10 +4115,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.477: - version "1.4.504" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.504.tgz#975522945676cf2d55910988a169f07b83081488" - integrity sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ== +electron-to-chromium@^1.4.535: + version "1.4.566" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.566.tgz#5c5ba1d2dc895f4887043f0cc7e61798c7e5919a" + integrity sha512-mv+fAy27uOmTVlUULy15U3DVJ+jg+8iyKH1bpwboCRhtDC69GKf1PPTZvEIhCyDr81RFqfxZJYrbgp933a1vtg== emittery@^0.10.2: version "0.10.2" @@ -4175,26 +4199,26 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.20.4, es-abstract@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== dependencies: array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" + arraybuffer.prototype.slice "^1.0.2" available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + call-bind "^1.0.5" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" has-property-descriptors "^1.0.0" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" internal-slot "^1.0.5" is-array-buffer "^3.0.2" is-callable "^1.2.7" @@ -4202,32 +4226,32 @@ es-abstract@^1.20.4, es-abstract@^1.22.1: is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.12" is-weakref "^1.0.2" - object-inspect "^1.12.3" + object-inspect "^1.13.1" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" typed-array-buffer "^1.0.0" typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" + which-typed-array "^1.1.13" es-iterator-helpers@^1.0.12: - version "1.0.14" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz#19cd7903697d97e21198f3293b55e8985791c365" - integrity sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw== + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== dependencies: asynciterator.prototype "^1.0.0" call-bind "^1.0.2" - define-properties "^1.2.0" + define-properties "^1.2.1" es-abstract "^1.22.1" es-set-tostringtag "^2.0.1" function-bind "^1.1.1" @@ -4237,29 +4261,29 @@ es-iterator-helpers@^1.0.12: has-proto "^1.0.1" has-symbols "^1.0.3" internal-slot "^1.0.5" - iterator.prototype "^1.1.0" - safe-array-concat "^1.0.0" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" es-module-lexer@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" - integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" + integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" + get-intrinsic "^1.2.2" has-tostringtag "^1.0.0" + hasown "^2.0.0" es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: - has "^1.0.3" + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -4319,7 +4343,7 @@ eslint-config-prettier@^8.2.0: resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== -eslint-import-resolver-node@^0.3.7: +eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== @@ -4336,25 +4360,25 @@ eslint-module-utils@^2.8.0: debug "^3.2.7" eslint-plugin-import@^2.22.1: - version "2.28.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" - integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== - dependencies: - array-includes "^3.1.6" - array.prototype.findlastindex "^1.2.2" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + version "2.29.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" + integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" + eslint-import-resolver-node "^0.3.9" eslint-module-utils "^2.8.0" - has "^1.0.3" - is-core-module "^2.13.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.6" - object.groupby "^1.0.0" - object.values "^1.1.6" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" semver "^6.3.1" tsconfig-paths "^3.14.2" @@ -4510,17 +4534,18 @@ eslint@^5.0.0: text-table "^0.2.0" eslint@^8.17.0: - version "8.48.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155" - integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== + version "8.52.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.52.0.tgz#d0cd4a1fac06427a61ef9242b9353f36ea7062fc" + integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.48.0" - "@humanwhocodes/config-array" "^0.11.10" + "@eslint/js" "8.52.0" + "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -4992,28 +5017,33 @@ flat-cache@^2.0.1: write "1.0.3" flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== dependencies: - flatted "^3.2.7" + flatted "^3.2.9" keyv "^4.5.3" rimraf "^3.0.2" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -flatted@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== follow-redirects@^1.0.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== for-each@^0.3.3: version "0.3.3" @@ -5076,9 +5106,9 @@ fs-minipass@^2.0.0: minipass "^3.0.0" fs-monkey@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs-readdir-recursive@^1.1.0: version "1.1.0" @@ -5095,12 +5125,12 @@ fsevents@^2.3.2, fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -5171,15 +5201,15 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" @@ -5306,9 +5336,9 @@ globals@^11.1.0, globals@^11.7.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== dependencies: type-fest "^0.20.2" @@ -5433,11 +5463,11 @@ has-flag@^4.0.0: integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== dependencies: - get-intrinsic "^1.1.1" + get-intrinsic "^1.2.2" has-proto@^1.0.1: version "1.0.1" @@ -5493,11 +5523,16 @@ has-values@^1.0.0: kind-of "^4.0.0" has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== dependencies: - function-bind "^1.1.1" + function-bind "^1.1.2" hast-util-whitespace@^2.0.0: version "2.0.1" @@ -5884,12 +5919,12 @@ inquirer@^6.2.2: through "^2.3.6" internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" + get-intrinsic "^1.2.2" + hasown "^2.0.0" side-channel "^1.0.4" interpret@^2.2.0: @@ -6003,12 +6038,12 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== +is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - has "^1.0.3" + hasown "^2.0.0" is-data-descriptor@^0.1.4: version "0.1.4" @@ -6202,6 +6237,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -6251,7 +6291,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== @@ -6369,16 +6409,16 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterator.prototype@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.0.tgz#690c88b043d821f783843aaf725d7ac3b62e3b46" - integrity sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== dependencies: - define-properties "^1.1.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.1" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" - has-tostringtag "^1.0.0" - reflect.getprototypeof "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" jake@^10.8.5: version "10.8.7" @@ -6971,9 +7011,9 @@ jszip@^3.6.0: setimmediate "^1.0.5" keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -7024,12 +7064,12 @@ language-tags@=1.0.5: language-subtag-registry "~0.3.2" launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: picocolors "^1.0.0" - shell-quote "^1.7.3" + shell-quote "^1.8.1" lcid@^2.0.0: version "2.0.0" @@ -7126,16 +7166,36 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== +lodash.invokemap@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz#1748cda5d8b0ef8369c4eb3ec54c21feba1f2d62" + integrity sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.pullall@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.pullall/-/lodash.pullall-4.2.0.tgz#9d98b8518b7c965b0fae4099bd9fb7df8bbf38ba" + integrity sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg== + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -7146,6 +7206,11 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== + lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -7796,9 +7861,9 @@ mute-stream@0.0.7: integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== nan@^2.13.2: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== nanoid@^3.3.6: version "3.3.6" @@ -8006,10 +8071,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-keys@^1.1.1: version "1.1.1" @@ -8042,7 +8107,7 @@ object.entries@^1.1.5, object.entries@^1.1.6: define-properties "^1.2.0" es-abstract "^1.22.1" -object.fromentries@^2.0.6: +object.fromentries@^2.0.6, object.fromentries@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== @@ -8051,7 +8116,7 @@ object.fromentries@^2.0.6: define-properties "^1.2.0" es-abstract "^1.22.1" -object.groupby@^1.0.0: +object.groupby@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== @@ -8076,7 +8141,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.6: +object.values@^1.1.6, object.values@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== @@ -8500,9 +8565,9 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.4.21: - version "8.4.28" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.28.tgz#c6cc681ed00109072816e1557f889ef51cf950a5" - integrity sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw== + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -8624,9 +8689,9 @@ prop-types@^15.0.0, prop-types@^15.5.6, prop-types@^15.6.1, prop-types@^15.6.2, react-is "^16.13.1" property-information@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" - integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" + integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== proxy-addr@~2.0.7: version "2.0.7" @@ -8896,22 +8961,22 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -reflect.getprototypeof@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz#2738fd896fcc3477ffbd4190b40c2458026b6928" - integrity sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw== +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.1" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" globalthis "^1.0.3" which-builtin-type "^1.1.3" regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -8945,14 +9010,14 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - functions-have-names "^1.2.3" + set-function-name "^2.0.0" regexpp@^2.0.1: version "2.0.1" @@ -9102,20 +9167,20 @@ resolve.exports@^1.1.0: integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.4, resolve@^1.8.1, resolve@^1.9.0: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -9204,13 +9269,13 @@ sade@^1.7.3: dependencies: mri "^1.1.0" -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" isarray "^2.0.5" @@ -9263,18 +9328,18 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.66.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1" - integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA== + version "1.69.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.4.tgz#10c735f55e3ea0b7742c6efa940bce30e07fbca2" + integrity sha512-+qEreVhqAy8o++aQfCJwp0sklr2xyEzkm9Pp/Igu9wNPoe7EZEQ8X/MBvvXggI2ql607cxKg/RKOwDj6pp2XDA== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== scheduler@^0.23.0: version "0.23.0" @@ -9409,6 +9474,25 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -9465,7 +9549,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3: +shell-quote@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== @@ -9484,14 +9568,14 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== +sirv@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446" + integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== dependencies: "@polka/url" "^1.0.0-next.20" mrmime "^1.0.0" - totalist "^1.0.0" + totalist "^3.0.0" sisteransi@^1.0.5: version "1.0.5" @@ -9679,9 +9763,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== spdy-transport@^3.0.0: version "3.0.0" @@ -9724,9 +9808,9 @@ sprintf-js@~1.0.2: integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -9826,9 +9910,9 @@ string-width@^3.0.0: strip-ansi "^5.1.0" string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: - version "4.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz#148779de0f75d36b13b15885fec5cadde994520d" - integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" @@ -9837,34 +9921,35 @@ string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: has-symbols "^1.0.3" internal-slot "^1.0.5" regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" side-channel "^1.0.4" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@^1.1.1: version "1.3.0" @@ -9973,9 +10058,9 @@ style-loader@^3.3.1: integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== style-to-object@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.2.tgz#a8247057111dea8bd3b8a1a66d2d0c9cf9218a54" - integrity sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA== + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" @@ -10029,9 +10114,9 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar@^6.0.2, tar@^6.1.2: - version "6.1.15" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" - integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -10075,9 +10160,9 @@ terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: - version "5.19.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e" - integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg== + version "5.22.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.22.0.tgz#4f18103f84c5c9437aafb7a14918273310a8a49d" + integrity sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10185,10 +10270,10 @@ token-types@^4.1.1: "@tokenizer/token" "^0.3.0" ieee754 "^1.2.1" -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== tough-cookie@~2.5.0: version "2.5.0" @@ -10382,6 +10467,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -10515,10 +10605,10 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -10590,13 +10680,13 @@ uvu@^0.5.0: sade "^1.7.3" v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + version "9.1.3" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz#ea456604101cd18005ac2cae3cdd1aa058a6306b" + integrity sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" + convert-source-map "^2.0.0" validate-npm-package-license@^3.0.1: version "3.0.4" @@ -10671,19 +10761,26 @@ webidl-conversions@^4.0.2: integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webpack-bundle-analyzer@^4.4.1: - version "4.9.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz#fc093c4ab174fd3dcbd1c30b763f56d10141209d" - integrity sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw== + version "4.9.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz#d00bbf3f17500c10985084f22f1a2bf45cb2f09d" + integrity sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w== dependencies: "@discoveryjs/json-ext" "0.5.7" acorn "^8.0.4" acorn-walk "^8.0.0" - chalk "^4.1.0" commander "^7.2.0" + escape-string-regexp "^4.0.0" gzip-size "^6.0.0" - lodash "^4.17.20" + is-plain-object "^5.0.0" + lodash.debounce "^4.0.8" + lodash.escape "^4.0.1" + lodash.flatten "^4.4.0" + lodash.invokemap "^4.6.0" + lodash.pullall "^4.2.0" + lodash.uniqby "^4.7.0" opener "^1.5.2" - sirv "^1.0.7" + picocolors "^1.0.0" + sirv "^2.0.3" ws "^7.3.1" webpack-bundle-size-analyzer@^3.1.0: @@ -10761,11 +10858,12 @@ webpack-dev-server@^4.9.2: ws "^8.13.0" webpack-merge@^5.7.3: - version "5.9.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" - integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" webpack-pwa-manifest@^4.3.0: @@ -10791,9 +10889,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.88.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" - integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== + version "5.89.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" + integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -10895,13 +10993,13 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.9: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== +which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== dependencies: available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + call-bind "^1.0.4" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" @@ -11149,9 +11247,9 @@ ws@^7.3.1: integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== xhr@^2.0.1: version "2.6.0" From 1a94f77a0cb6dcc863f0ed15f00a4565ef4d6c9f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 25 Oct 2023 12:31:20 +0000 Subject: [PATCH 231/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 7f5a401db1..5f937fe7c6 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6f9e999c4cff2bced80de9d30f00116faa35533060a1cf4b895ec62addd3ab3b + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:97548186d4eda57879e536360ae97226272d4051ed35fc8c2330d3bfad0573ff lifecycle: preStop: exec: From 4b052fb2be88707157b68e9d0fd044a88700a9be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 26 Oct 2023 09:41:38 +0200 Subject: [PATCH 232/825] Upgrade to Spring Cloud Azure 5.6.0 Closes gh-1327 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d0f77e75c6..9294766014 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -107,7 +107,7 @@ initializr: - compatibilityRange: "[2.6.0,3.0.0-M1)" version: 4.12.0 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 5.5.0 + version: 5.6.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From 28c8e61c8e1c236aa9e11fdeef90fa996296559e Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 26 Oct 2023 07:54:46 +0000 Subject: [PATCH 233/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 5f937fe7c6..abde3db3c2 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:97548186d4eda57879e536360ae97226272d4051ed35fc8c2330d3bfad0573ff + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:74813a24f84f87f70099c5c9eee735378c8546f53a92b587951e9abcd23069ec lifecycle: preStop: exec: From 6c6366dfd722a8e8605b269d378c8f528c71c4d1 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:58:21 +0300 Subject: [PATCH 234/825] Upgrade to Vaadin 24.2.1 and 23.3.26 See gh-1328 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9294766014..4ee20d0aa3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -166,9 +166,9 @@ initializr: - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.25 + version: 23.3.26 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 24.1.12 + version: 24.2.1 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From 348ddd09710816ed8e6a2aa5b3eefe435472aa9f Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 31 Oct 2023 09:51:49 +0000 Subject: [PATCH 235/825] Polish capitalization of Spring Cache Abstraction --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4ee20d0aa3..aebf41d09a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -892,7 +892,7 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.quartz - - name: Spring cache abstraction + - name: Spring Cache Abstraction id: cache description: Provides cache-related operations, such as the ability to update the content of the cache, but does not provide the actual data store. links: From 735a7c59b9182fd7ed084486704adf1993bd99bb Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 31 Oct 2023 10:20:06 +0000 Subject: [PATCH 236/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index abde3db3c2..b95adfb7c9 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:74813a24f84f87f70099c5c9eee735378c8546f53a92b587951e9abcd23069ec + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:accc13b8e82c64136ee4a0c87e073bcb17e44686181e9b047a60a7dc493c4f30 lifecycle: preStop: exec: From df0a8012215c631d3ffb5bf86088dbf462d3008a Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 1 Nov 2023 12:04:36 +0000 Subject: [PATCH 237/825] Remove Twitter icon Closes gh-1332 --- start-client/src/components/common/icons/index.js | 1 - start-client/src/components/common/layout/SideLeft.js | 11 +---------- start-client/src/components/common/layout/Social.js | 7 ------- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/start-client/src/components/common/icons/index.js b/start-client/src/components/common/icons/index.js index bd94fc2a5a..f8010ec116 100644 --- a/start-client/src/components/common/icons/index.js +++ b/start-client/src/components/common/icons/index.js @@ -1,7 +1,6 @@ export { IconTimes } from './Icons' export { IconPlus } from './Icons' export { IconGithub } from './Icons' -export { IconTwitter } from './Icons' export { IconCaretDown } from './Icons' export { IconList } from './Icons' export { IconSearch } from './Icons' diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index eb0d71a125..86201911de 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -5,7 +5,7 @@ import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' import Header from './Header' import { AppContext } from '../../reducer/App' -import { IconGithub, IconTwitter } from '../icons' +import { IconGithub } from '../icons' function SideLeft() { const [isOpen, setIsOpen] = useState(false) @@ -72,15 +72,6 @@ function SideLeft() { - - - - - diff --git a/start-client/src/components/common/layout/Social.js b/start-client/src/components/common/layout/Social.js index b4aa00d803..12b99a7786 100644 --- a/start-client/src/components/common/layout/Social.js +++ b/start-client/src/components/common/layout/Social.js @@ -12,13 +12,6 @@ function Social() { > - - - ) } From fd1ae387b886d86f9e5ce2b1a5050fc1294b7523 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 1 Nov 2023 12:21:52 +0000 Subject: [PATCH 238/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index b95adfb7c9..c814b34b05 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:accc13b8e82c64136ee4a0c87e073bcb17e44686181e9b047a60a7dc493c4f30 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:aab7c2e89dc65114b0b40fec6962265cca1434c54150d1f58872759147e0a97d lifecycle: preStop: exec: From c8f91fb07c6cea63f742d1ef766eafbba5ee713f Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Wed, 1 Nov 2023 13:56:12 +0100 Subject: [PATCH 239/825] Remove twitter link in mobile nav --- start-client/src/components/common/layout/SideLeft.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index 86201911de..c3fbb64c07 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -146,17 +146,6 @@ function SideLeft() { -
  • - - - Twitter - - -
  • From c53cad9fad9fe606932583dbe5e84f306fbb4e47 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 1 Nov 2023 13:10:16 +0000 Subject: [PATCH 240/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index c814b34b05..38fc8d1d7d 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:aab7c2e89dc65114b0b40fec6962265cca1434c54150d1f58872759147e0a97d + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8d328a3dcc50011f268ea880859b538631ea1bd60e55c5ffa5cc84a5792c4220 lifecycle: preStop: exec: From e9b6cb6b4157ceed814ca9e446546b230fca1145 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 31 Oct 2023 10:13:44 +0000 Subject: [PATCH 241/825] Add entry for Timefold Solver Closes gh-1331 --- start-site/src/main/resources/application.yml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index aebf41d09a..c031ba8edb 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -158,6 +158,15 @@ initializr: artifactId: testcontainers-bom version: 1.18.3 versionProperty: testcontainers.version + timefold-solver: + groupId: ai.timefold.solver + artifactId: timefold-solver-bom + versionProperty: timefold-solver.version + mappings: + - compatibilityRange: "[2.7.0,3.0.0-M1)" + version: 0.8.41 + - compatibilityRange: "[3.0.0,3.2.0-M1)" + version: 1.3.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom @@ -922,6 +931,18 @@ initializr: links: - rel: reference href: https://spring.io/projects/spring-shell + - name: Timefold Solver + id: timefold-solver + groupId: ai.timefold.solver + artifactId: timefold-solver-spring-boot-starter + description: AI solver to optimize operations and scheduling + bom: timefold-solver + links: + - rel: reference + href: https://timefold.ai/docs/timefold-solver/latest/quickstart/spring-boot/spring-boot-quickstart#springBootJavaQuickStart + - rel: sample + href: https://github.com/TimefoldAI/timefold-quickstarts/tree/stable/technology/java-spring-boot + description: Timetabling sample. Assign lessons to timeslots and rooms to produce a better schedule for teachers and students - name: Ops content: - name: Spring Boot Actuator From 68d984c99832c63346140f34edccfbbf36464da6 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 1 Nov 2023 17:34:27 +0000 Subject: [PATCH 242/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 38fc8d1d7d..005691d86b 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8d328a3dcc50011f268ea880859b538631ea1bd60e55c5ffa5cc84a5792c4220 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:861e473fb1d59610023b050a6a95dd42bb862e80bb2a89731b0d08b05114355c lifecycle: preStop: exec: From 572eae6c22542b6b82b4fd0ba0d6d75fe9be91ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 1 Nov 2023 19:28:52 +0100 Subject: [PATCH 243/825] Fix compatibility range for Timefold Solver See gh-1331 --- start-site/src/main/resources/application.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c031ba8edb..ba3045ce16 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -933,6 +933,7 @@ initializr: href: https://spring.io/projects/spring-shell - name: Timefold Solver id: timefold-solver + compatibilityRange: "[2.6.0,3.2.0-M1)" groupId: ai.timefold.solver artifactId: timefold-solver-spring-boot-starter description: AI solver to optimize operations and scheduling From c0546ab6177ec8a062726ea3b4e0184b50da532a Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Wed, 1 Nov 2023 14:22:58 -0400 Subject: [PATCH 244/825] Upgrade to Spring Cloud 2023.0.0-RC1 See gh-1334 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c031ba8edb..de16e9b7fd 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -94,7 +94,7 @@ initializr: - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 2022.0.4 - compatibilityRange: "[3.2.0-M1,3.2.x-SNAPSHOT)" - version: 2023.0.0-M2 + version: 2023.0.0-RC1 repositories: spring-milestones - compatibilityRange: "3.2.x-SNAPSHOT" version: 2023.0.0-SNAPSHOT From 776db18ecc791028dadade890d32e1f7aa75e578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 1 Nov 2023 19:32:22 +0100 Subject: [PATCH 245/825] Polish --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d3812a17d1..f1a4d4a7fb 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -936,7 +936,7 @@ initializr: compatibilityRange: "[2.6.0,3.2.0-M1)" groupId: ai.timefold.solver artifactId: timefold-solver-spring-boot-starter - description: AI solver to optimize operations and scheduling + description: AI solver to optimize operations and scheduling. bom: timefold-solver links: - rel: reference From bd304918519eab91a30dabaf0db7e080f470e47f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 1 Nov 2023 18:47:31 +0000 Subject: [PATCH 246/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 005691d86b..7ea28697b4 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:861e473fb1d59610023b050a6a95dd42bb862e80bb2a89731b0d08b05114355c + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4f61baa59cca00818965c768a54445d147550a22c6589e965a584b648b1542c6 lifecycle: preStop: exec: From e35f87dbacdc691f3b700ee8b3fee6b4dc0aa1de Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 1 Nov 2023 19:00:08 +0000 Subject: [PATCH 247/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 7ea28697b4..439cbee992 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4f61baa59cca00818965c768a54445d147550a22c6589e965a584b648b1542c6 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:36cf44eaecd5cb77a541f5102f58e213dc454543b07db7ca630407bc4f6a5000 lifecycle: preStop: exec: From f09bcdc09b8db9207aa06fa378241cfbb23fb78e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 2 Nov 2023 08:33:27 +0100 Subject: [PATCH 248/825] Workaround incorrect metadata in Timefold Solver starter See also https://github.com/TimefoldAI/timefold-solver/issues/393 --- start-site/src/main/resources/application.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f1a4d4a7fb..14b889a255 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -938,6 +938,7 @@ initializr: artifactId: timefold-solver-spring-boot-starter description: AI solver to optimize operations and scheduling. bom: timefold-solver + starter: false links: - rel: reference href: https://timefold.ai/docs/timefold-solver/latest/quickstart/spring-boot/spring-boot-quickstart#springBootJavaQuickStart From 9919f4a58618e0914f647f40768dd7effeebf582 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 2 Nov 2023 08:37:57 +0000 Subject: [PATCH 249/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 439cbee992..e62cda2d28 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:36cf44eaecd5cb77a541f5102f58e213dc454543b07db7ca630407bc4f6a5000 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4aabecca00824c0cf63cde1867e6d19fad33e406e48d352425b0c6b253126d0f lifecycle: preStop: exec: From 9bfcc4cbaa2b4498dcdd7bb29fcd0979fca4825a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 2 Nov 2023 14:19:03 +0100 Subject: [PATCH 250/825] Upgrade CI image to ubuntu:jammy-20231004 --- ci/images/start-site-ci-image/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/images/start-site-ci-image/Dockerfile b/ci/images/start-site-ci-image/Dockerfile index aeef34451a..c293b785b8 100644 --- a/ci/images/start-site-ci-image/Dockerfile +++ b/ci/images/start-site-ci-image/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:jammy-20230624 +FROM ubuntu:jammy-20231004 ADD setup.sh /setup.sh RUN ./setup.sh From dc25838194e96c19171480d7c93ec3b9b15d019f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 2 Nov 2023 14:19:58 +0100 Subject: [PATCH 251/825] Upgrade CI to Java 17.0.9 --- ci/images/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/images/setup.sh b/ci/images/setup.sh index 8926802b00..31b5b2eaff 100755 --- a/ci/images/setup.sh +++ b/ci/images/setup.sh @@ -20,6 +20,6 @@ curl https://raw.githubusercontent.com/spring-io/concourse-java-scripts/v0.0.2/c mkdir -p /opt/openjdk cd /opt/openjdk -curl -L https://github.com/bell-sw/Liberica/releases/download/17.0.8+7/bellsoft-jdk17.0.8+7-linux-amd64.tar.gz | tar zx --strip-components=1 +curl -L https://github.com/bell-sw/Liberica/releases/download/17.0.9+11/bellsoft-jdk17.0.9+11-linux-amd64.tar.gz | tar zx --strip-components=1 test -f /opt/openjdk/bin/java test -f /opt/openjdk/bin/javac From ad427e3ca3f0978e590666648126b81eccfe685f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 2 Nov 2023 13:32:52 +0000 Subject: [PATCH 252/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index e62cda2d28..7592f6b1c9 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4aabecca00824c0cf63cde1867e6d19fad33e406e48d352425b0c6b253126d0f + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:25a3f0a887a74deab02a192b810052eea99858e77b786dc612112bbcef502d52 lifecycle: preStop: exec: From 7e99074608cb24170b861fd9ef4709f0d7c91eca Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 2 Nov 2023 14:36:33 +0000 Subject: [PATCH 253/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 7592f6b1c9..609e602f39 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:25a3f0a887a74deab02a192b810052eea99858e77b786dc612112bbcef502d52 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0b5453847a815341a30729d397fc09af2da82d533aa6e03a4f486a6d18f907a1 lifecycle: preStop: exec: From 71566c1655e20a05d5ccc3efc8b997d59c8e420f Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 2 Nov 2023 11:07:59 -0400 Subject: [PATCH 254/825] Upgrade to Spring Cloud GCP 4.8.3 and 3.7.3 See gh-1335 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 14b889a255..3ff5a64b9f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -115,9 +115,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 3.7.2 + version: 3.7.3 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.8.2 + version: 4.8.3 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From d55e8cc4427b582c423593b41bb01e72e92b0053 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 2 Nov 2023 15:44:44 +0000 Subject: [PATCH 255/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 609e602f39..906b546074 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0b5453847a815341a30729d397fc09af2da82d533aa6e03a4f486a6d18f907a1 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:759c9c39de8071e6831ff85abf30123577de10793106b757f2c9c6b0b51d7601 lifecycle: preStop: exec: From db423d62729e200c83a34c9290d420ef2d0e076a Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Fri, 3 Nov 2023 10:21:56 +0100 Subject: [PATCH 256/825] Upgrade to Spring Modulith 1.1.0-RC2 See gh-1336 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3ff5a64b9f..081f59d8de 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -137,7 +137,7 @@ initializr: - compatibility-range: "[3.1.0,3.2.0-M1)" version: 1.0.2 - compatibility-range: "3.2.0-M1" - version: 1.1.0-RC1 + version: 1.1.0-RC2 repositories: spring-milestones spring-shell: groupId: org.springframework.shell From 80fd62b172dffb3f3f58f1ec7c485a8488bef3bf Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 3 Nov 2023 10:07:03 +0000 Subject: [PATCH 257/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 906b546074..1dfdfb527d 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:759c9c39de8071e6831ff85abf30123577de10793106b757f2c9c6b0b51d7601 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:660f3c7664ee084f5751a09c5737141ab9fbe27f94edd1ee0505cde11dac41e5 lifecycle: preStop: exec: From bb65ae416f84e28a5263388c6a40cb4f301c64e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 3 Nov 2023 15:24:13 +0100 Subject: [PATCH 258/825] Fix link for GraphQL dependency Closes gh-1337 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 081f59d8de..3eb5248df5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -294,7 +294,7 @@ initializr: href: https://spring.io/guides/gs/graphql-server/ description: Building a GraphQL service - rel: reference - href: https://docs.spring.io/spring-boot/docs/${bootVersion}/reference/htmlsingle/index.html#web.graphql + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.graphql - name: Rest Repositories id: data-rest facets: From 917260939cbb898fcac71150c07deda038d6ec2d Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 3 Nov 2023 14:34:48 +0000 Subject: [PATCH 259/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 1dfdfb527d..de139f3eb8 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:660f3c7664ee084f5751a09c5737141ab9fbe27f94edd1ee0505cde11dac41e5 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5d09cb86879dbfa2d8206eb8bfdbd1fa869a6b3a6c0e712eeca322eaae1447e6 lifecycle: preStop: exec: From 11d66c01bfd4fd29be8dfc7044850af419453b66 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 6 Nov 2023 15:46:19 +0200 Subject: [PATCH 260/825] Upgrade to Vaadin 24.2.2 See gh-1339 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3eb5248df5..82eb252ee3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -177,7 +177,7 @@ initializr: - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 23.3.26 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 24.2.1 + version: 24.2.2 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From 6be1b82dd557e919b992329c907dc2d5aabd2c9b Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 6 Nov 2023 14:13:01 +0000 Subject: [PATCH 261/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index de139f3eb8..88d8dcd5b7 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5d09cb86879dbfa2d8206eb8bfdbd1fa869a6b3a6c0e712eeca322eaae1447e6 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7f30ede2a1f278aad218e428207e9f80213c9963cb16197dc49b5438ac56bfe3 lifecycle: preStop: exec: From 8bbffee8b30ebf9ade2608d3f0f31af4b25c6ac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Tue, 7 Nov 2023 13:09:57 +0100 Subject: [PATCH 262/825] Upgrade to Picocli 4.7.5 Closes gh-1340 --- start-site/src/main/resources/application.yml | 6 +++--- .../picocli/PicocliCodegenBuildCustomizerTests.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 82eb252ee3..9a67ab2398 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -914,11 +914,11 @@ initializr: id: picocli groupId: info.picocli artifactId: picocli-spring-boot-starter - compatibilityRange: "[2.6.0,3.1.0-M1)" + compatibilityRange: "[2.6.0,3.2.0-M1)" description: Build command line applications with picocli. mappings: - - compatibilityRange: "[2.6.0,3.1.0-M1)" - version: 4.7.4 + - compatibilityRange: "[2.6.0,3.2.0-M1)" + version: 4.7.5 links: - rel: reference href: https://picocli.info/#_spring_boot_example diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizerTests.java index 0b60f55744..d2aa0c5b37 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizerTests.java @@ -31,7 +31,7 @@ */ class PicocliCodegenBuildCustomizerTests extends AbstractExtensionTests { - private static final Version SPRING_BOOT_3_VERSION = Version.parse("3.0.0"); + private static final Version SPRING_BOOT_3_VERSION = Version.parse("3.1.0"); @Test void picocliCodegenIsAddedAsMavenOptionalDependency() { From f0118bc8e0172c8f93daa2344fece55b23da2e37 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 7 Nov 2023 12:25:27 +0000 Subject: [PATCH 263/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 88d8dcd5b7..775dbce32b 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7f30ede2a1f278aad218e428207e9f80213c9963cb16197dc49b5438ac56bfe3 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2f56c50ba41254e81faed8879cedb7dc3a40dbb881b73d1e8dd5841183c9e895 lifecycle: preStop: exec: From c4e4591049d67185f9b2aad13dfc9b358e55086f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 8 Nov 2023 09:21:13 +0100 Subject: [PATCH 264/825] Upgrade to Spring Cloud Azure 4.13.0 Closes gh-1341 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9a67ab2398..2ae3232049 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -105,7 +105,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 4.12.0 + version: 4.13.0 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" version: 5.6.0 spring-cloud-gcp: From e7af0ed119f45e9b1163ee2dd6a0af9eaeda90c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 8 Nov 2023 09:22:15 +0100 Subject: [PATCH 265/825] Upgrade to Spring Cloud Azure 5.7.0 Closes gh-1342 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2ae3232049..4e5a9d74fc 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -106,8 +106,8 @@ initializr: mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" version: 4.13.0 - - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 5.6.0 + - compatibilityRange: "[3.0.0-M1,3.3.0-M1)" + version: 5.7.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies @@ -1375,7 +1375,7 @@ initializr: href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - name: Microsoft Azure bom: spring-cloud-azure - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.3.0-M1)" content: - name: Azure Support id: azure-support From ffd2e2271ec816e3eed402ffa71013dd69eda901 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 8 Nov 2023 08:38:37 +0000 Subject: [PATCH 266/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 775dbce32b..96619ed559 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2f56c50ba41254e81faed8879cedb7dc3a40dbb881b73d1e8dd5841183c9e895 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2c552c5d067cce84447062beccbb79df3fa0ef38be53f77a3ce5564c0e286526 lifecycle: preStop: exec: From ad429cacca3adcf24b75b1e5abda7794871ab614 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 9 Nov 2023 16:58:36 +0100 Subject: [PATCH 267/825] Upgrade to Spring Shell 2.1.14, 3.0.9, 3.1.5 and 3.2.0-M3 Closes gh-1344 --- start-site/src/main/resources/application.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4e5a9d74fc..f39e9aed15 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -145,13 +145,13 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[2.7.0,3.0.0-M1)" - version: 2.1.13 + version: 2.1.14 - compatibilityRange: "[3.0.0,3.1.0-M1)" - version: 3.0.8 + version: 3.0.9 - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 3.1.4 + version: 3.1.5 - compatibilityRange: "3.2.0-M1" - version: 3.2.0-M2 + version: 3.2.0-M3 repositories: spring-milestones testcontainers: groupId: org.testcontainers From 50e6545e7d653550ab05da302ba88c0fbc1485fc Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 9 Nov 2023 16:11:38 +0000 Subject: [PATCH 268/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 96619ed559..fcb73d834b 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2c552c5d067cce84447062beccbb79df3fa0ef38be53f77a3ce5564c0e286526 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:fcc3ae785903f519ee311e824838d72ffcf102396adee4f12254efed1156553c lifecycle: preStop: exec: From fb463553bd033bff54dfa5cca448ac040bee97f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 10 Nov 2023 10:13:29 +0100 Subject: [PATCH 269/825] Polish --- .../extension/dependency/graalvm/GraalVmBuildCustomizer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmBuildCustomizer.java index 8dddcafd26..70a84e0e21 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,7 +27,7 @@ * * @author Stephane Nicoll */ -class GraalVmBuildCustomizer implements BuildCustomizer, Ordered { +class GraalVmBuildCustomizer implements BuildCustomizer { @Override public void customize(Build build) { From 2af1d25420f45d52094152b59b7c47c34f257761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 10 Nov 2023 10:16:16 +0100 Subject: [PATCH 270/825] Improve support for Gradle Build with Kotlin DSL --- .../site/extension/AbstractExtensionTests.java | 7 +++++++ ...aalVmProjectGenerationConfigurationTests.java | 16 ++++------------ ...gCloudContractGradleBuildCustomizerTests.java | 3 +-- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java b/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java index 31dc1dc318..0124a9d523 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java @@ -19,6 +19,7 @@ import java.util.Arrays; import io.spring.initializr.generator.test.buildsystem.gradle.GroovyDslGradleBuildAssert; +import io.spring.initializr.generator.test.buildsystem.gradle.KotlinDslGradleBuildAssert; import io.spring.initializr.generator.test.buildsystem.maven.MavenBuildAssert; import io.spring.initializr.generator.test.io.TextAssert; import io.spring.initializr.generator.test.project.ProjectStructure; @@ -87,6 +88,12 @@ protected AssertProvider gradleBuild(ProjectRequest return () -> new GroovyDslGradleBuildAssert(content); } + protected AssertProvider gradleKotlinDslBuild(ProjectRequest request) { + request.setType("gradle-project-kotlin"); + String content = new String(getInvoker().invokeBuildGeneration(request)); + return () -> new KotlinDslGradleBuildAssert(content); + } + protected AssertProvider composeFile(ProjectRequest request) { ProjectStructure project = generateProject(request); return () -> new TextAssert(project.getProjectDirectory().resolve("compose.yaml")); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index ce193804ec..28443ecc01 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -109,13 +109,9 @@ void gradleBuildAndGroovyDslWithJpaConfiguresHibernateEnhancePlugin() { @Test void gradleBuildAndKotlinDslWithJpaAndHibernate61ConfiguresHibernateEnhancePlugin() { ProjectRequest request = createNativeProjectRequest("data-jpa"); - request.setType("gradle-project-kotlin"); request.setBootVersion("3.0.0"); - assertThat(generateProject(request)).kotlinDslGradleBuild() - .hasPlugin("org.hibernate.orm") - .lines() - .containsSequence( - // @formatter:off + assertThat(gradleKotlinDslBuild(request)).hasPlugin("org.hibernate.orm").lines().containsSequence( + // @formatter:off "hibernate {", " enhancement {", " enableLazyInitialization.set(true)", @@ -129,13 +125,9 @@ void gradleBuildAndKotlinDslWithJpaAndHibernate61ConfiguresHibernateEnhancePlugi @Test void gradleBuildAndKotlinDslWithJpaConfiguresHibernateEnhancePlugin() { ProjectRequest request = createNativeProjectRequest("data-jpa"); - request.setType("gradle-project-kotlin"); request.setBootVersion("3.1.0"); - assertThat(generateProject(request)).kotlinDslGradleBuild() - .hasPlugin("org.hibernate.orm") - .lines() - .containsSequence( - // @formatter:off + assertThat(gradleKotlinDslBuild(request)).hasPlugin("org.hibernate.orm").lines().containsSequence( + // @formatter:off "hibernate {", " enhancement {", " enableAssociationManagement.set(true)", diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java index 0fc6f2d3d6..a9b7351f90 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java @@ -60,8 +60,7 @@ void springCloudContractVerifierPluginWithGroovyDslAndWithTestModeSetWhenWebFlux @Test void springCloudContractVerifierPluginWithKotlinDslAndTestModeSetWhenWebFluxIsPresent() { ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - projectRequest.setType("gradle-project-kotlin"); - assertThat(generateProject(projectRequest)).textFile("build.gradle.kts") + assertThat(gradleKotlinDslBuild(projectRequest)) .contains("import org.springframework.cloud.contract.verifier.config.TestMode") .containsSubsequence("contracts {", "testMode.set(TestMode.WEBTESTCLIENT)"); } From 32b00c4b1bdb764bd02eead0d45bbea23e659aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 10 Nov 2023 10:18:26 +0100 Subject: [PATCH 271/825] Configure CNB builder if necessary This commit configures an explicit image builder for versions that use an EOL version for backward compatible reason. Closes gh-1343 --- .../PaketoBuilderBuildCustomizer.java | 47 ++++++ ...BuilderGroovyDslGradleBuildCustomizer.java | 33 ++++ ...BuilderKotlinDslGradleBuildCustomizer.java | 33 ++++ .../PaketoBuilderMavenBuildCustomizer.java | 36 ++++ ...ingBootProjectGenerationConfiguration.java | 72 +++++--- ...otProjectGenerationConfigurationTests.java | 155 +++++++++++++----- ...loudContractMavenBuildCustomizerTests.java | 14 +- 7 files changed, 325 insertions(+), 65 deletions(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderGroovyDslGradleBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderKotlinDslGradleBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderMavenBuildCustomizer.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderBuildCustomizer.java new file mode 100644 index 0000000000..b09cd3c636 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderBuildCustomizer.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springboot; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} base implementation for Paketo Builder. + * + * @param the type of build + * @author Stephane Nicoll + */ +abstract class PaketoBuilderBuildCustomizer implements BuildCustomizer { + + static final String BASE_IMAGE_BUILDER = "paketobuildpacks/builder-jammy-base:latest"; + + static final String TINY_IMAGE_BUILDER = "paketobuildpacks/builder-jammy-tiny:latest"; + + @Override + public void customize(B build) { + String builder = (build.dependencies().has("native")) ? TINY_IMAGE_BUILDER : BASE_IMAGE_BUILDER; + customize(build, builder); + } + + /** + * Customize the build with the specified image builder. + * @param build the build to customize + * @param imageBuilder the image builder to use + */ + protected abstract void customize(B build, String imageBuilder); + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderGroovyDslGradleBuildCustomizer.java new file mode 100644 index 0000000000..a5bdb4f796 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderGroovyDslGradleBuildCustomizer.java @@ -0,0 +1,33 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springboot; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; + +/** + * {@link PaketoBuilderBuildCustomizer} for Gradle with the Groovy DSL. + * + * @author Stephane Nicoll + */ +class PaketoBuilderGroovyDslGradleBuildCustomizer extends PaketoBuilderBuildCustomizer { + + @Override + protected void customize(GradleBuild build, String imageBuilder) { + build.tasks().customize("bootBuildImage", (task) -> task.attribute("builder", "'" + imageBuilder + "'")); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderKotlinDslGradleBuildCustomizer.java new file mode 100644 index 0000000000..2291c78b84 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderKotlinDslGradleBuildCustomizer.java @@ -0,0 +1,33 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springboot; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; + +/** + * {@link PaketoBuilderBuildCustomizer} for Gradle with the Kotlin DSL. + * + * @author Stephane Nicoll + */ +class PaketoBuilderKotlinDslGradleBuildCustomizer extends PaketoBuilderBuildCustomizer { + + @Override + protected void customize(GradleBuild build, String imageBuilder) { + build.tasks().customize("bootBuildImage", (task) -> task.invoke("builder.set", "\"" + imageBuilder + "\"")); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderMavenBuildCustomizer.java new file mode 100644 index 0000000000..eb3421652d --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderMavenBuildCustomizer.java @@ -0,0 +1,36 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springboot; + +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; + +/** + * {@link PaketoBuilderBuildCustomizer} for Maven. + * + * @author Stephane Nicoll + */ +class PaketoBuilderMavenBuildCustomizer extends PaketoBuilderBuildCustomizer { + + @Override + protected void customize(MavenBuild build, String imageBuilder) { + build.plugins() + .add("org.springframework.boot", "spring-boot-maven-plugin", + (plugin) -> plugin.configuration((configuration) -> configuration.add("image", + (imageConfiguration) -> imageConfiguration.add("builder", imageBuilder)))); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java index 33b539b08f..5e37b1691f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java @@ -19,12 +19,14 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.gradle.DevelopmentOnlyDependencyGradleBuildCustomizer; import io.spring.initializr.generator.spring.build.maven.OptionalDependencyMavenBuildCustomizer; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; /** * {@link ProjectGenerationConfiguration} for customizations relevant for Spring Boot. @@ -33,38 +35,66 @@ * @author Moritz Halbritter */ @ProjectGenerationConfiguration -public class SpringBootProjectGenerationConfiguration { +class SpringBootProjectGenerationConfiguration { private static final String DEVTOOLS_ID = "devtools"; private static final String DOCKER_COMPOSE_ID = "docker-compose"; - @Bean - @ConditionalOnRequestedDependency(DEVTOOLS_ID) + @Configuration(proxyBeanMethods = false) @ConditionalOnBuildSystem(MavenBuildSystem.ID) - public OptionalDependencyMavenBuildCustomizer devToolsMavenBuildCustomizer() { - return new OptionalDependencyMavenBuildCustomizer(DEVTOOLS_ID); - } + static class MavenConfiguration { - @Bean - @ConditionalOnRequestedDependency(DEVTOOLS_ID) - @ConditionalOnBuildSystem(GradleBuildSystem.ID) - public DevelopmentOnlyDependencyGradleBuildCustomizer devToolsGradleBuildCustomizer() { - return new DevelopmentOnlyDependencyGradleBuildCustomizer(DEVTOOLS_ID); - } + @Bean + @ConditionalOnPlatformVersion("[2.0.0,3.2.0-M1)") + PaketoBuilderMavenBuildCustomizer paketoBuilderMavenBuildCustomizer() { + return new PaketoBuilderMavenBuildCustomizer(); + } + + @Bean + @ConditionalOnRequestedDependency(DEVTOOLS_ID) + OptionalDependencyMavenBuildCustomizer devToolsMavenBuildCustomizer() { + return new OptionalDependencyMavenBuildCustomizer(DEVTOOLS_ID); + } + + @Bean + @ConditionalOnRequestedDependency(DOCKER_COMPOSE_ID) + OptionalDependencyMavenBuildCustomizer dockerComposeMavenBuildCustomizer() { + return new OptionalDependencyMavenBuildCustomizer(DOCKER_COMPOSE_ID); + } - @Bean - @ConditionalOnRequestedDependency(DOCKER_COMPOSE_ID) - @ConditionalOnBuildSystem(MavenBuildSystem.ID) - public OptionalDependencyMavenBuildCustomizer dockerComposeMavenBuildCustomizer() { - return new OptionalDependencyMavenBuildCustomizer(DOCKER_COMPOSE_ID); } - @Bean - @ConditionalOnRequestedDependency(DOCKER_COMPOSE_ID) + @Configuration(proxyBeanMethods = false) @ConditionalOnBuildSystem(GradleBuildSystem.ID) - public DevelopmentOnlyDependencyGradleBuildCustomizer dockerComposeGradleBuildCustomizer() { - return new DevelopmentOnlyDependencyGradleBuildCustomizer(DOCKER_COMPOSE_ID); + static class GradleConfiguration { + + @Bean + @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) + @ConditionalOnPlatformVersion("[2.0.0,3.2.0-M1)") + PaketoBuilderGroovyDslGradleBuildCustomizer paketoBuilderGroovyDslGradleBuildCustomizer() { + return new PaketoBuilderGroovyDslGradleBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) + @ConditionalOnPlatformVersion("[2.0.0,3.2.0-M1)") + PaketoBuilderKotlinDslGradleBuildCustomizer paketoBuilderKotlinDslGradleBuildCustomizer() { + return new PaketoBuilderKotlinDslGradleBuildCustomizer(); + } + + @Bean + @ConditionalOnRequestedDependency(DEVTOOLS_ID) + DevelopmentOnlyDependencyGradleBuildCustomizer devToolsGradleBuildCustomizer() { + return new DevelopmentOnlyDependencyGradleBuildCustomizer(DEVTOOLS_ID); + } + + @Bean + @ConditionalOnRequestedDependency(DOCKER_COMPOSE_ID) + DevelopmentOnlyDependencyGradleBuildCustomizer dockerComposeGradleBuildCustomizer() { + return new DevelopmentOnlyDependencyGradleBuildCustomizer(DOCKER_COMPOSE_ID); + } + } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java index 8692d29f51..313f79a920 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -30,49 +31,129 @@ */ class SpringBootProjectGenerationConfigurationTests extends AbstractExtensionTests { - @Test - void gradleWithDevtoolsConfigureBuild() { - ProjectRequest request = createProjectRequest("devtools"); - assertThat(gradleBuild(request)).lines() - .doesNotContain("configurations {") - .contains("\tdevelopmentOnly 'org.springframework.boot:spring-boot-devtools'"); - } + @Nested + class MavenTests { - @Test - void gradleWithoutDevtoolsDoesNotCreateDevelopmentOnlyConfiguration() { - ProjectRequest request = createProjectRequest("web"); - assertThat(gradleBuild(request)).doesNotContain("developmentOnly"); - } + @Test + void devtoolsIsOptional() { + ProjectRequest request = createProjectRequest("devtools"); + assertThat(mavenPom(request)) + .hasText("/project/dependencies/dependency[2]/artifactId", "spring-boot-devtools") + .hasText("/project/dependencies/dependency[2]/optional", "true"); + } - @Test - void mavenWithDevtoolsIsOptional() { - ProjectRequest request = createProjectRequest("devtools"); - assertThat(mavenPom(request)).hasText("/project/dependencies/dependency[2]/artifactId", "spring-boot-devtools") - .hasText("/project/dependencies/dependency[2]/optional", "true"); - } + @Test + void devtoolsAbsentDoesNotChangeOptional() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("optional"); + } - @Test - void mavenWithoutDevtoolsDoesNotChangeOptional() { - ProjectRequest request = createProjectRequest("web"); - assertThat(mavenPom(request)).doesNotContain("optional"); - } + @Test + void dockerComposeSupportHasOptionalScope() { + ProjectRequest request = createProjectRequest("docker-compose"); + request.setBootVersion("3.1.0-RC1"); + assertThat(mavenPom(request)) + .hasText("/project/dependencies/dependency[2]/artifactId", "spring-boot-docker-compose") + .hasText("/project/dependencies/dependency[2]/scope", "runtime") + .hasText("/project/dependencies/dependency[2]/optional", "true"); + } + + @Test + void springBoot31ConfiguresJammyBaseBuilder() { + ProjectRequest request = createProjectRequest(); + request.setBootVersion("3.1.0"); + assertThat(mavenPom(request)).hasText("/project/build/plugins/plugin[1]/configuration/image/builder", + PaketoBuilderBuildCustomizer.BASE_IMAGE_BUILDER); + } + + @Test + void springBoot31WithNativeConfiguresJammyTinyBuilder() { + ProjectRequest request = createProjectRequest("native"); + request.setBootVersion("3.1.0"); + assertThat(mavenPom(request)).hasText("/project/build/plugins/plugin[2]/configuration/image/builder", + PaketoBuilderBuildCustomizer.TINY_IMAGE_BUILDER); + } + + @Test + void springBoot32DoesNotConfigureJammyBaseBuilder() { + ProjectRequest request = createProjectRequest(); + request.setBootVersion("3.2.0-RC1"); + assertThat(mavenPom(request)).doesNotContain(""); + } - @Test - void gradleWithDockerComposeSupportUsesDevelopmentOnly() { - ProjectRequest request = createProjectRequest("docker-compose"); - request.setBootVersion("3.1.0-RC1"); - assertThat(gradleBuild(request)).lines() - .contains("\tdevelopmentOnly 'org.springframework.boot:spring-boot-docker-compose'"); } - @Test - void mavenWithDockerComposeSupportHasOptionalScope() { - ProjectRequest request = createProjectRequest("docker-compose"); - request.setBootVersion("3.1.0-RC1"); - assertThat(mavenPom(request)) - .hasText("/project/dependencies/dependency[2]/artifactId", "spring-boot-docker-compose") - .hasText("/project/dependencies/dependency[2]/scope", "runtime") - .hasText("/project/dependencies/dependency[2]/optional", "true"); + @Nested + class GradleTests { + + @Test + void gradleWithDevtoolsConfigureBuild() { + ProjectRequest request = createProjectRequest("devtools"); + assertThat(gradleBuild(request)).lines() + .doesNotContain("configurations {") + .contains("\tdevelopmentOnly 'org.springframework.boot:spring-boot-devtools'"); + } + + @Test + void gradleWithoutDevtoolsDoesNotCreateDevelopmentOnlyConfiguration() { + ProjectRequest request = createProjectRequest("web"); + assertThat(gradleBuild(request)).doesNotContain("developmentOnly"); + } + + @Test + void gradleWithDockerComposeSupportUsesDevelopmentOnly() { + ProjectRequest request = createProjectRequest("docker-compose"); + request.setBootVersion("3.1.0-RC1"); + assertThat(gradleBuild(request)).lines() + .contains("\tdevelopmentOnly 'org.springframework.boot:spring-boot-docker-compose'"); + } + + @Test + void springBoot31WithGroovyDslConfiguresJammyBaseBuilder() { + ProjectRequest request = createProjectRequest(); + request.setBootVersion("3.1.0"); + assertThat(gradleBuild(request)) + .contains("builder = '%s'".formatted(PaketoBuilderBuildCustomizer.BASE_IMAGE_BUILDER)); + } + + @Test + void springBoot31WithGroovyDslAndNativeConfiguresJammyTinyBuilder() { + ProjectRequest request = createProjectRequest("native"); + request.setBootVersion("3.1.0"); + assertThat(gradleBuild(request)) + .contains("builder = '%s'".formatted(PaketoBuilderBuildCustomizer.TINY_IMAGE_BUILDER)); + } + + @Test + void springBoot32WithGroovyDslDoesNotConfigureJammyBaseBuilder() { + ProjectRequest request = createProjectRequest(); + request.setBootVersion("3.2.0-RC1"); + assertThat(gradleBuild(request)).doesNotContain("builder = '"); + } + + @Test + void springBoot31WithKotlinDslConfiguresJammyBaseBuilder() { + ProjectRequest request = createProjectRequest(); + request.setBootVersion("3.1.0"); + assertThat(gradleKotlinDslBuild(request)) + .contains("builder.set(\"%s\")".formatted(PaketoBuilderBuildCustomizer.BASE_IMAGE_BUILDER)); + } + + @Test + void springBoot31WithKotlinDslAndNativeConfiguresJammyTinyBuilder() { + ProjectRequest request = createProjectRequest("native"); + request.setBootVersion("3.1.0"); + assertThat(gradleKotlinDslBuild(request)) + .contains("builder.set(\"%s\")".formatted(PaketoBuilderBuildCustomizer.TINY_IMAGE_BUILDER)); + } + + @Test + void springBoot32WithKotlinDslDoesNotConfigureJammyBaseBuilder() { + ProjectRequest request = createProjectRequest(); + request.setBootVersion("3.2.0-RC1"); + assertThat(gradleKotlinDslBuild(request)).doesNotContain("builder.set(\""); + } + } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java index f49f9c9915..2f564f7352 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java @@ -36,9 +36,9 @@ class SpringCloudContractMavenBuildCustomizerTests extends AbstractExtensionTest void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("cloud-contract-verifier")) - .hasText("/project/build/plugins/plugin[1]/groupId", "org.springframework.cloud") - .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") - .hasText("/project/build/plugins/plugin[1]/extensions", Boolean.toString(true)); + .hasText("/project/build/plugins/plugin[2]/groupId", "org.springframework.cloud") + .hasText("/project/build/plugins/plugin[2]/artifactId", "spring-cloud-contract-maven-plugin") + .hasText("/project/build/plugins/plugin[2]/extensions", Boolean.toString(true)); } @Test @@ -52,16 +52,16 @@ void springCloudContractVerifierPluginForSpringBootWithJUnit5ByDefault() { ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); projectRequest.setBootVersion("2.7.0"); assertThat(mavenPom(projectRequest)) - .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") - .hasText("/project/build/plugins/plugin[1]/configuration/testFramework", "JUNIT5"); + .hasText("/project/build/plugins/plugin[2]/artifactId", "spring-cloud-contract-maven-plugin") + .hasText("/project/build/plugins/plugin[2]/configuration/testFramework", "JUNIT5"); } @Test void springCloudContractVerifierPluginWithTestModeSetWhenWebFluxIsPresent() { ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); assertThat(mavenPom(projectRequest)) - .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") - .hasText("/project/build/plugins/plugin[1]/configuration/testMode", "WEBTESTCLIENT"); + .hasText("/project/build/plugins/plugin[2]/artifactId", "spring-cloud-contract-maven-plugin") + .hasText("/project/build/plugins/plugin[2]/configuration/testMode", "WEBTESTCLIENT"); } @Test From 28e77d55ccb4ddd53587bc6c12945dbaa7de194f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 10 Nov 2023 09:34:09 +0000 Subject: [PATCH 272/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index fcb73d834b..64d7a45502 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:fcc3ae785903f519ee311e824838d72ffcf102396adee4f12254efed1156553c + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8cb9cf5b1d9bf1b3dc5734f0161d2a39ceb01b4b17f00f96ee2b362fa09f0a63 lifecycle: preStop: exec: From b71a293efd899a5c67acdc34e027d710ffe9d294 Mon Sep 17 00:00:00 2001 From: Joe Wang <106995533+JoeWang1127@users.noreply.github.com> Date: Fri, 10 Nov 2023 19:16:26 -0500 Subject: [PATCH 273/825] Upgrade to Spring Cloud GCP 4.8.4 and 3.7.4 See gh-1346 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f39e9aed15..e9dc649f10 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -115,9 +115,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 3.7.3 + version: 3.7.4 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.8.3 + version: 4.8.4 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From b1b59782edb3bd57ac3f4ec8eaba87f6520df33a Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Sat, 11 Nov 2023 10:59:32 +0000 Subject: [PATCH 274/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 64d7a45502..0d480d89ae 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8cb9cf5b1d9bf1b3dc5734f0161d2a39ceb01b4b17f00f96ee2b362fa09f0a63 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f422973480ad4b1119a6ba350ac60b21601ff95bd92989a7a7d72294ec7d9c42 lifecycle: preStop: exec: From cf104d03c9136ddb81ca5c900573a190c443c40e Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 10 Nov 2023 14:29:38 +0100 Subject: [PATCH 275/825] Generate help section for Testcontainers This help section contains the docker images and tags used for the Testcontainers. See gh-1345 --- .../TestContainersHelpDocumentCustomizer.java | 64 +++++++++++++++++++ ...tainersProjectGenerationConfiguration.java | 36 ++++++----- .../templates/testcontainers.mustache | 13 ++++ ...rsProjectGenerationConfigurationTests.java | 11 ++++ 4 files changed, 108 insertions(+), 16 deletions(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java create mode 100644 start-site/src/main/resources/templates/testcontainers.mustache diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java new file mode 100644 index 0000000000..91f3422424 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.testcontainers; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; +import io.spring.start.site.container.DockerService; +import io.spring.start.site.container.ServiceConnections; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; + +/** + * A {@link HelpDocumentCustomizer} that provide additional information about the + * Testcontainers that are defined for the project. + * + * @author Moritz Halbritter + */ +class TestContainersHelpDocumentCustomizer implements HelpDocumentCustomizer { + + private final ProjectDescription description; + + private final ServiceConnections serviceConnections; + + TestContainersHelpDocumentCustomizer(ProjectDescription description, ServiceConnections serviceConnections) { + this.description = description; + this.serviceConnections = serviceConnections; + } + + @Override + public void customize(HelpDocument document) { + String referenceDocUrl = "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers" + .formatted(this.description.getPlatformVersion()); + document.gettingStarted().addReferenceDocLink(referenceDocUrl, "Spring Boot Testcontainers support"); + + Map model = new HashMap<>(); + List dockerServices = this.serviceConnections.values() + .map(ServiceConnection::dockerService) + .toList(); + model.put("services", dockerServices); + model.put("testcontainersAtDevelopmentTimeLink", + "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers.at-development-time" + .formatted(this.description.getPlatformVersion())); + document.addSection("testcontainers", model); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java index 701beeb6ea..2ec09f0a02 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java @@ -29,7 +29,6 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.start.site.container.ServiceConnections; import io.spring.start.site.container.ServiceConnectionsCustomizer; import io.spring.start.site.support.implicit.ImplicitDependency; @@ -39,12 +38,14 @@ import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; /** * Configuration for generation of projects that depend on Testcontainers. * * @author Maciej Walkowiak * @author Stephane Nicoll + * @author Moritz Halbritter */ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("testcontainers") @@ -68,6 +69,20 @@ public ImplicitDependencyHelpDocumentCustomizer testcontainersHelpCustomizer(Bui @Configuration(proxyBeanMethods = false) @ConditionalOnPlatformVersion("3.1.0-RC1") + static class ServiceConnectionsConfiguration { + + @Bean + ServiceConnections serviceConnections(ObjectProvider customizers) { + ServiceConnections serviceConnections = new ServiceConnections(); + customizers.orderedStream().forEach((customizer) -> customizer.customize(serviceConnections)); + return serviceConnections; + } + + } + + @Configuration(proxyBeanMethods = false) + @ConditionalOnPlatformVersion("3.1.0-RC1") + @Import(ServiceConnectionsConfiguration.class) static class SpringBootSupportConfiguration { @Bean @@ -80,20 +95,16 @@ BuildCustomizer springBootTestcontainersBuildCustomizer() { } @Bean - HelpDocumentCustomizer springBootTestcontainersHelpDocumentCustomizer(ProjectDescription description) { - return (helpDocument) -> { - String referenceDocUrl = String.format( - "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers", - description.getPlatformVersion()); - helpDocument.gettingStarted() - .addReferenceDocLink(referenceDocUrl, "Spring Boot Testcontainers support"); - }; + TestContainersHelpDocumentCustomizer springBootTestcontainersHelpDocumentCustomizer( + ProjectDescription description, ServiceConnections serviceConnections) { + return new TestContainersHelpDocumentCustomizer(description, serviceConnections); } } @Configuration(proxyBeanMethods = false) @ConditionalOnPlatformVersion("3.1.0-RC1") + @Import(ServiceConnectionsConfiguration.class) static class TestApplicationConfiguration { private final ProjectDescription description; @@ -105,13 +116,6 @@ static class TestApplicationConfiguration { this.indentingWriterFactory = indentingWriterFactory; } - @Bean - ServiceConnections serviceConnections(ObjectProvider customizers) { - ServiceConnections serviceConnections = new ServiceConnections(); - customizers.orderedStream().forEach((customizer) -> customizer.customize(serviceConnections)); - return serviceConnections; - } - @Bean @ConditionalOnLanguage(GroovyLanguage.ID) GroovyTestContainersApplicationCodeProjectContributor groovyTestContainersApplicationCodeProjectContributor( diff --git a/start-site/src/main/resources/templates/testcontainers.mustache b/start-site/src/main/resources/templates/testcontainers.mustache new file mode 100644 index 0000000000..667388cda5 --- /dev/null +++ b/start-site/src/main/resources/templates/testcontainers.mustache @@ -0,0 +1,13 @@ +### Testcontainers support + +This project uses [Testcontainers at development time]({{testcontainersAtDevelopmentTimeLink}}). + +{{#services.size}} +Testcontainers has been configured to use the following Docker images: + +{{#services}} +* [`{{image}}:{{imageTag}}`]({{website}}) +{{/services}} + +Please review the tags of the used images and set them to the same as you're running in production. +{{/services.size}} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index cfb811a135..29426620b6 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -37,6 +37,7 @@ * @author Stephane Nicoll * @author Eddú Meléndez * @author Chris Bono + * @author Moritz Halbritter */ class TestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -344,6 +345,16 @@ fun main(args: Array) { """); } + @Test + void shouldAddHelpSection() { + assertHelpDocument("3.1.5", "testcontainers", "data-mongodb", "postgresql").contains( + "https://docs.spring.io/spring-boot/docs/3.1.5/reference/html/features.html#features.testing.testcontainers") + .contains( + "https://docs.spring.io/spring-boot/docs/3.1.5/reference/html/features.html#features.testing.testcontainers.at-development-time") + .contains("mongo:latest") + .contains("postgres:latest"); + } + private ProjectStructure generateProject(String platformVersion, String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); request.setBootVersion(platformVersion); From abbc0de28de356f2ebf08bf37feb82465d7a6345 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 13 Nov 2023 11:32:01 +0000 Subject: [PATCH 276/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 0d480d89ae..a9224cebcf 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f422973480ad4b1119a6ba350ac60b21601ff95bd92989a7a7d72294ec7d9c42 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:1e62a3cb4840fa3e0e0297e284f05cc73da8a0ccac8671a781858551773f0e81 lifecycle: preStop: exec: From 26a4f9c3445e1d395b1dae6c819c42f82e2e7f83 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 13 Nov 2023 13:39:13 +0100 Subject: [PATCH 277/825] Restructure testcontainers configuration classes See gh-1345 --- ...tainersProjectGenerationConfiguration.java | 108 +++++++++--------- 1 file changed, 52 insertions(+), 56 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java index 2ec09f0a02..4362a230bc 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java @@ -38,7 +38,6 @@ import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; /** * Configuration for generation of projects that depend on Testcontainers. @@ -69,7 +68,7 @@ public ImplicitDependencyHelpDocumentCustomizer testcontainersHelpCustomizer(Bui @Configuration(proxyBeanMethods = false) @ConditionalOnPlatformVersion("3.1.0-RC1") - static class ServiceConnectionsConfiguration { + static class SpringBoot31Configuration { @Bean ServiceConnections serviceConnections(ObjectProvider customizers) { @@ -78,67 +77,64 @@ ServiceConnections serviceConnections(ObjectProvider springBootTestcontainersBuildCustomizer() { + return (build) -> build.dependencies() + .add("spring-boot-testcontainers", + Dependency.withCoordinates("org.springframework.boot", "spring-boot-testcontainers") + .scope(DependencyScope.TEST_COMPILE)); - @Bean - BuildCustomizer springBootTestcontainersBuildCustomizer() { - return (build) -> build.dependencies() - .add("spring-boot-testcontainers", - Dependency.withCoordinates("org.springframework.boot", "spring-boot-testcontainers") - .scope(DependencyScope.TEST_COMPILE)); + } - } + @Bean + TestContainersHelpDocumentCustomizer springBootTestcontainersHelpDocumentCustomizer( + ProjectDescription description, ServiceConnections serviceConnections) { + return new TestContainersHelpDocumentCustomizer(description, serviceConnections); + } - @Bean - TestContainersHelpDocumentCustomizer springBootTestcontainersHelpDocumentCustomizer( - ProjectDescription description, ServiceConnections serviceConnections) { - return new TestContainersHelpDocumentCustomizer(description, serviceConnections); } - } - - @Configuration(proxyBeanMethods = false) - @ConditionalOnPlatformVersion("3.1.0-RC1") - @Import(ServiceConnectionsConfiguration.class) - static class TestApplicationConfiguration { - - private final ProjectDescription description; + @Configuration(proxyBeanMethods = false) + static class TestApplicationConfiguration { + + private final ProjectDescription description; + + private final IndentingWriterFactory indentingWriterFactory; + + TestApplicationConfiguration(ProjectDescription description, + IndentingWriterFactory indentingWriterFactory) { + this.description = description; + this.indentingWriterFactory = indentingWriterFactory; + } + + @Bean + @ConditionalOnLanguage(GroovyLanguage.ID) + GroovyTestContainersApplicationCodeProjectContributor groovyTestContainersApplicationCodeProjectContributor( + ServiceConnections serviceConnections) { + return new GroovyTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, + this.description, serviceConnections); + } + + @Bean + @ConditionalOnLanguage(KotlinLanguage.ID) + @ConditionalOnPlatformVersion("3.1.1-SNAPSHOT") // https://github.com/spring-projects/spring-boot/issues/35756 + KotlinTestContainersApplicationCodeProjectContributor kotlinTestContainersApplicationCodeProjectContributor( + ServiceConnections serviceConnections) { + return new KotlinTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, + this.description, serviceConnections); + } + + @Bean + @ConditionalOnLanguage(JavaLanguage.ID) + JavaTestContainersApplicationCodeProjectContributor javaTestContainersApplicationCodeProjectContributor( + ServiceConnections serviceConnections) { + return new JavaTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, + this.description, serviceConnections); + } - private final IndentingWriterFactory indentingWriterFactory; - - TestApplicationConfiguration(ProjectDescription description, IndentingWriterFactory indentingWriterFactory) { - this.description = description; - this.indentingWriterFactory = indentingWriterFactory; - } - - @Bean - @ConditionalOnLanguage(GroovyLanguage.ID) - GroovyTestContainersApplicationCodeProjectContributor groovyTestContainersApplicationCodeProjectContributor( - ServiceConnections serviceConnections) { - return new GroovyTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, - this.description, serviceConnections); - } - - @Bean - @ConditionalOnLanguage(KotlinLanguage.ID) - @ConditionalOnPlatformVersion("3.1.1-SNAPSHOT") // https://github.com/spring-projects/spring-boot/issues/35756 - KotlinTestContainersApplicationCodeProjectContributor kotlinTestContainersApplicationCodeProjectContributor( - ServiceConnections serviceConnections) { - return new KotlinTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, - this.description, serviceConnections); - } - - @Bean - @ConditionalOnLanguage(JavaLanguage.ID) - JavaTestContainersApplicationCodeProjectContributor javaTestContainersApplicationCodeProjectContributor( - ServiceConnections serviceConnections) { - return new JavaTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, - this.description, serviceConnections); } } From 4add008171ae7a465f478419683bd1111e6b9efd Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 13 Nov 2023 12:53:11 +0000 Subject: [PATCH 278/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index a9224cebcf..c117702556 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:1e62a3cb4840fa3e0e0297e284f05cc73da8a0ccac8671a781858551773f0e81 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0fca2acb745b2c67d0b1545c999d2d2843ebcd3c9afd79e37c1c66a8770d9f25 lifecycle: preStop: exec: From 2ca76c6eb189424d24d248a1be9c94bf6998e72b Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 13 Nov 2023 13:37:34 +0200 Subject: [PATCH 279/825] Upgrade to Vaadin 23.3.27 See gh-1347 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e9dc649f10..2fc292e1f0 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -175,7 +175,7 @@ initializr: - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.26 + version: 23.3.27 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" version: 24.2.2 wavefront: From 4bc14814b1dc95a9d272f0c23f26bdb9d9bedcb8 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 13 Nov 2023 16:11:31 +0000 Subject: [PATCH 280/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index c117702556..8237fc33f8 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0fca2acb745b2c67d0b1545c999d2d2843ebcd3c9afd79e37c1c66a8770d9f25 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5af1e08f037e3f4bc9d00920481efaac142a22dfa0a9a3cdc4331ecde5885a5b lifecycle: preStop: exec: From 9b82b7bcc2f76ed5ad490b61aa47dbd0dabbc72d Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 14 Nov 2023 22:05:10 +0100 Subject: [PATCH 281/825] Upgrade to Apache Camel 4.2.0, 3.20.8, and 3.14.10 See gh-1350 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2fc292e1f0..49664650e5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -844,11 +844,11 @@ initializr: compatibilityRange: "[2.6.0,3.2.0-M1)" mappings: - compatibilityRange: "[2.6.0,2.7.0-M1)" - version: 3.14.9 + version: 3.14.10 - compatibilityRange: "[2.7.0.M1,3.0.0-M1)" - version: 3.20.6 + version: 3.20.8 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 4.1.0 + version: 4.2.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From fa556088b0ef24bca2b2a5a37cb252c63767719f Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 15 Nov 2023 10:00:18 +0200 Subject: [PATCH 282/825] Upgrade to Vaadin 24.2.3 See gh-1351 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2fc292e1f0..1d8164b6e8 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -177,7 +177,7 @@ initializr: - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" version: 23.3.27 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 24.2.2 + version: 24.2.3 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From 4e5ec6e5b7d73f803c4a526faece656cee00dabe Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 15 Nov 2023 09:55:43 +0000 Subject: [PATCH 283/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 8237fc33f8..172ae57dc0 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5af1e08f037e3f4bc9d00920481efaac142a22dfa0a9a3cdc4331ecde5885a5b + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:10740a5d181de6d26dfc30e7e7d139079f7d63c00cfbe68b917df50476cac5bf lifecycle: preStop: exec: From 4be774298331f561abb46c8789b9ecfae009d175 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Tue, 14 Nov 2023 11:49:42 +0100 Subject: [PATCH 284/825] Add Netflix DGS Codegen plugin support This commit adds a new dependency to start.spring.io, the "Netflix Data Graph Service Codegen". This will not add a dependency to generated project, but rather configure a Maven or a Gradle plugin in the build. This Codegen plugin parses GraphQL schema files describing remote GraphQL APIs and generates Java classes to easily create queries and deserialize GraphQL responses. --- .../dgs/DgsCodegenBuildCustomizer.java | 42 ++++++ ...CodegenGroovyDslGradleBuildCustomizer.java | 52 +++++++ .../dgs/DgsCodegenHelpDocumentCustomizer.java | 56 +++++++ ...CodegenKotlinDslGradleBuildCustomizer.java | 52 +++++++ .../dgs/DgsCodegenMavenBuildCustomizer.java | 61 ++++++++ .../dgs/DgsCodegenProjectContributor.java | 39 +++++ ...CodegenProjectGenerationConfiguration.java | 83 +++++++++++ .../dgs/DgsCodegenVersionResolver.java | 44 ++++++ .../dependency/dgs/package-info.java | 20 +++ .../main/resources/META-INF/spring.factories | 1 + start-site/src/main/resources/application.yml | 10 ++ .../resources/templates/dgscodegen.mustache | 9 ++ .../dgs/DgsCodegenBuildCustomizerTests.java | 60 ++++++++ ...DgsCodegenHelpDocumentCustomizerTests.java | 59 ++++++++ .../DgsCodegenProjectContributorTests.java | 47 ++++++ ...enProjectGenerationConfigurationTests.java | 140 ++++++++++++++++++ 16 files changed, 775 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenMavenBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributor.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/package-info.java create mode 100644 start-site/src/main/resources/templates/dgscodegen.mustache create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizerTests.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizerTests.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributorTests.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizer.java new file mode 100644 index 0000000000..1a495c74aa --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizer.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +import org.springframework.core.Ordered; + +/** + * {@link BuildCustomizer} that removes the "dgs-codegen" dependency as this is a build + * plugin only dependency. + * + * @author Brian Clozel + */ +class DgsCodegenBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + build.dependencies().remove("dgs-codegen"); + } + + @Override + public int getOrder() { + return Ordered.LOWEST_PRECEDENCE - 10; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java new file mode 100644 index 0000000000..06f0252df4 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java @@ -0,0 +1,52 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} for Gradle Groovy DSL projects using DGS Codegen. + * + * @author Brian Clozel + */ +class DgsCodegenGroovyDslGradleBuildCustomizer implements BuildCustomizer { + + private final String pluginVersion; + + private final String packageName; + + DgsCodegenGroovyDslGradleBuildCustomizer(String pluginVersion, String packageName) { + this.pluginVersion = pluginVersion; + this.packageName = packageName; + } + + @Override + public void customize(GradleBuild build) { + build.plugins().add("com.netflix.dgs.codegen", (plugin) -> plugin.setVersion(this.pluginVersion)); + build.snippets().add((writer) -> { + writer.println("generateJava {"); + writer.indented(() -> { + writer.println("schemaPaths = [\"${projectDir}/src/main/resources/graphql-client\"]"); + writer.println("packageName = '" + this.packageName + ".codegen'"); + writer.println("generateClient = true"); + }); + writer.println("}"); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizer.java new file mode 100644 index 0000000000..a216c5c915 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizer.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import java.util.HashMap; +import java.util.Map; + +import io.spring.initializr.generator.buildsystem.BuildSystem; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; + +/** + * Provide additional information when DGS Codegen Support is selected. + * + * @author Brian Clozel + */ +class DgsCodegenHelpDocumentCustomizer implements HelpDocumentCustomizer { + + private final BuildSystem buildSystem; + + DgsCodegenHelpDocumentCustomizer(ProjectDescription description) { + this.buildSystem = description.getBuildSystem(); + } + + @Override + public void customize(HelpDocument document) { + Map model = new HashMap<>(); + + if (MavenBuildSystem.ID.equals(this.buildSystem.id())) { + model.put("dsgCodegenOptionsLink", "https://github.com/deweyjose/graphqlcodegen"); + } + else if (GradleBuildSystem.ID.equals(this.buildSystem.id())) { + model.put("dsgCodegenOptionsLink", + "https://netflix.github.io/dgs/generating-code-from-schema/#configuring-code-generation"); + } + document.addSection("dgscodegen", model); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java new file mode 100644 index 0000000000..b64eb82b93 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java @@ -0,0 +1,52 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} for Gradle Kotlin DSL projects using DGS Codegen. + * + * @author Brian Clozel + */ +class DgsCodegenKotlinDslGradleBuildCustomizer implements BuildCustomizer { + + private final String pluginVersion; + + private final String packageName; + + DgsCodegenKotlinDslGradleBuildCustomizer(String pluginVersion, String packageName) { + this.pluginVersion = pluginVersion; + this.packageName = packageName; + } + + @Override + public void customize(GradleBuild build) { + build.plugins().add("com.netflix.dgs.codegen", (plugin) -> plugin.setVersion(this.pluginVersion)); + build.snippets().add((writer) -> { + writer.println("tasks.generateJava {"); + writer.indented(() -> { + writer.println("schemaPaths.add(\"${projectDir}/src/main/resources/graphql-client\")"); + writer.println("packageName = \"" + this.packageName + ".codegen\""); + writer.println("generateClient = true"); + }); + writer.println("}"); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenMavenBuildCustomizer.java new file mode 100644 index 0000000000..ae3378e563 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenMavenBuildCustomizer.java @@ -0,0 +1,61 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} for Maven projects using DGS Codegen (community maintained). + * + * @author Brian Clozel + * @see Maven GraphQL Codegen + * plugin + */ +public class DgsCodegenMavenBuildCustomizer implements BuildCustomizer { + + private final String pluginVersion; + + private final String packageName; + + public DgsCodegenMavenBuildCustomizer(String pluginVersion, String packageName) { + this.pluginVersion = pluginVersion; + this.packageName = packageName; + } + + @Override + public void customize(MavenBuild build) { + build.plugins() + .add("io.github.deweyjose", "graphqlcodegen-maven-plugin", + (plugin) -> plugin.version(this.pluginVersion) + .execution("dgs-codegen", + (execution) -> execution.goal("generate") + .configuration((configuration) -> configuration + .add("schemaPaths", + (schemaPaths) -> schemaPaths.add("param", + "src/main/resources/graphql-client")) + .add("packageName", this.packageName + ".codegen") + .add("addGeneratedAnnotation", "true")))); + build.plugins() + .add("org.codehaus.mojo", "build-helper-maven-plugin", + (plugin) -> plugin.execution("add-dgs-source", (execution) -> execution.goal("add-source") + .phase("generate-sources") + .configuration((configuration) -> configuration.add("sources", + (sources) -> sources.add("source", "${project.build.directory}/generated-sources"))))); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributor.java new file mode 100644 index 0000000000..55ee0c4687 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributor.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import io.spring.initializr.generator.project.contributor.ProjectContributor; + +/** + * A {@link ProjectContributor} that creates the "graphql-client" resources directory when + * the DGS Codegen build plugin is requested. + * + * @author Brian Clozel + */ +class DgsCodegenProjectContributor implements ProjectContributor { + + @Override + public void contribute(Path projectRoot) throws IOException { + Path graphQlDirectory = projectRoot.resolve("src/main/resources/graphql-client"); + Files.createDirectories(graphQlDirectory); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java new file mode 100644 index 0000000000..1ab8a90430 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java @@ -0,0 +1,83 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.metadata.InitializrMetadata; + +import org.springframework.context.annotation.Bean; + +/** + * {@link ProjectGenerationConfiguration} for generation of projects that use the Netflix + * DGS codegen. + * + * @author Brian Clozel + * @see Netflix DGS + * codegen + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("dgs-codegen") +@ConditionalOnPlatformVersion("3.0.0-M1") +class DgsCodegenProjectGenerationConfiguration { + + private final String dgsCodegenPluginVersion; + + DgsCodegenProjectGenerationConfiguration(InitializrMetadata metadata, ProjectDescription description) { + this.dgsCodegenPluginVersion = DgsCodegenVersionResolver.resolve(metadata, description.getPlatformVersion(), + description.getBuildSystem()); + } + + @Bean + DgsCodegenBuildCustomizer dgsCodegenBuildCustomizer() { + return new DgsCodegenBuildCustomizer(); + } + + @Bean + DgsCodegenProjectContributor dgsCodegenProjectContributor() { + return new DgsCodegenProjectContributor(); + } + + @Bean + DgsCodegenHelpDocumentCustomizer dgsCodegenHelpDocumentCustomizer(ProjectDescription description) { + return new DgsCodegenHelpDocumentCustomizer(description); + } + + @Bean + @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) + DgsCodegenGroovyDslGradleBuildCustomizer dgsCodegenGroovyDslGradleBuildCustomizer(ProjectDescription description) { + return new DgsCodegenGroovyDslGradleBuildCustomizer(this.dgsCodegenPluginVersion, description.getPackageName()); + } + + @Bean + @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) + DgsCodegenKotlinDslGradleBuildCustomizer dgsCodegenKotlinDslGradleBuildCustomizer(ProjectDescription description) { + return new DgsCodegenKotlinDslGradleBuildCustomizer(this.dgsCodegenPluginVersion, description.getPackageName()); + } + + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + DgsCodegenMavenBuildCustomizer dgsCodegenMavenBuildCustomizer(ProjectDescription description) { + return new DgsCodegenMavenBuildCustomizer(this.dgsCodegenPluginVersion, description.getPackageName()); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java new file mode 100644 index 0000000000..d126cc9e46 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.BuildSystem; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.metadata.InitializrMetadata; + +/** + * Resolve DGS Codegen plugin version to use based on the platform version and build + * system. + * + * @author Brian Clozel + */ +abstract class DgsCodegenVersionResolver { + + static String resolve(InitializrMetadata metadata, Version platformVersion, BuildSystem build) { + if (GradleBuildSystem.ID.equals(build.id())) { + return metadata.getDependencies().get("dgs-codegen").resolve(platformVersion).getVersion(); + } + else if (MavenBuildSystem.ID.equals(build.id())) { + // https://github.com/deweyjose/graphqlcodegen/releases + return "1.50"; + } + throw new IllegalArgumentException("Could not resolve DGS Codegen version for build system " + build.id()); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/package-info.java new file mode 100644 index 0000000000..ce368058ce --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that use the Netflix Domain Graph Service. + */ +package io.spring.start.site.extension.dependency.dgs; diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 46689d7dcb..0a290ecb12 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -5,6 +5,7 @@ io.spring.start.site.extension.dependency.DependencyProjectGenerationConfigurati io.spring.start.site.extension.dependency.activemq.ActiveMQProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.cassandra.CassandraProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.derby.DerbyProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.dgs.DgsCodegenProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.dockercompose.DockerComposeProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.elasticsearch.ElasticsearchProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.flyway.FlywayProjectGenerationConfiguration,\ diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ec347df504..01a7d4a951 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -203,6 +203,16 @@ initializr: artifactId: spring-boot description: Support for compiling Spring applications to native executables using the GraalVM native-image compiler. starter: false + - name: GraphQL DGS Code Generation + id: dgs-codegen + compatibilityRange: "3.0.0-M1" + groupId: com.netflix.graphql.dgs.codegen + artifactId: graphql-dgs-codegen-gradle + mappings: + - compatibilityRange: "3.0.0-M1" + version: 6.0.3 + description: Generate data types and type-safe APIs for querying GraphQL APIs by parsing schema files. + starter: false - name: Spring Boot DevTools id: devtools groupId: org.springframework.boot diff --git a/start-site/src/main/resources/templates/dgscodegen.mustache b/start-site/src/main/resources/templates/dgscodegen.mustache new file mode 100644 index 0000000000..c8bb3adcd1 --- /dev/null +++ b/start-site/src/main/resources/templates/dgscodegen.mustache @@ -0,0 +1,9 @@ +## GraphQL code generation with DGS + +This project has been configured to use the Netflix DGS Codegen plugin. +This plugin can be used to generate client files for accessing remote GraphQL services. +The default setup assumes that the GraphQL schema file for the remote service is added to the `src/main/resources/graphql-client/` location. + +You can learn more about the [plugin configuration options]({{dsgCodegenOptionsLink}}) and +[how to use the generated types](https://netflix.github.io/dgs/generating-code-from-schema/) to adapt the default setup. + diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizerTests.java new file mode 100644 index 0000000000..0cf80884d6 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenBuildCustomizerTests.java @@ -0,0 +1,60 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.version.VersionReference; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DgsCodegenBuildCustomizer}. + * + * @author Brian Clozel + */ +public class DgsCodegenBuildCustomizerTests { + + @Test + void gradleBuildShouldRemoveCodegenDependency() { + DgsCodegenBuildCustomizer customizer = new DgsCodegenBuildCustomizer(); + GradleBuild build = new GradleBuild(); + build.dependencies() + .add("dgs-codegen", + Dependency.withCoordinates("com.example", "dgs-codegen") + .version(VersionReference.ofProperty("dgs-codegen.version")) + .build()); + customizer.customize(build); + assertThat(build.dependencies().has("dgs-codegen")).isFalse(); + } + + @Test + void mavenBuildShouldRemoveCodegenDependency() { + DgsCodegenBuildCustomizer customizer = new DgsCodegenBuildCustomizer(); + MavenBuild build = new MavenBuild(); + build.dependencies() + .add("dgs-codegen", + Dependency.withCoordinates("com.example", "dgs-codegen") + .version(VersionReference.ofProperty("dgs-codegen.version")) + .build()); + customizer.customize(build); + assertThat(build.dependencies().has("dgs-codegen")).isFalse(); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizerTests.java new file mode 100644 index 0000000000..7714880ad4 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizerTests.java @@ -0,0 +1,59 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; +import io.spring.initializr.generator.test.io.TextAssert; +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Tests for {@link DgsCodegenHelpDocumentCustomizer}. + * + * @author Brian Clozel + */ +class DgsCodegenHelpDocumentCustomizerTests extends AbstractExtensionTests { + + @Autowired + private MustacheTemplateRenderer templateRenderer; + + @Test + void mavenBuildAddsLinkToMavenCodegenPlugin() { + + assertHelpDocument("maven-project", "dgs-codegen").contains("## GraphQL code generation with DGS") + .contains("[plugin configuration options](https://github.com/deweyjose/graphqlcodegen)"); + } + + @Test + void gradleBuildAddsLinkToGradleCodegenPlugin() { + assertHelpDocument("gradle-project", "dgs-codegen").contains("## GraphQL code generation with DGS") + .contains( + "[plugin configuration options](https://netflix.github.io/dgs/generating-code-from-schema/#configuring-code-generation)"); + } + + private TextAssert assertHelpDocument(String type, String... dependencies) { + ProjectRequest request = createProjectRequest(dependencies); + request.setType(type); + ProjectStructure project = generateProject(request); + return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributorTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributorTests.java new file mode 100644 index 0000000000..1366d70426 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectContributorTests.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DgsCodegenProjectContributor}. + * + * @author Brian Clozel + */ +class DgsCodegenProjectContributorTests extends AbstractExtensionTests { + + @Test + void graphqlClientResourceDirectoryIsCreatedWithDgsCodegen() { + ProjectRequest request = createProjectRequest("dgs-codegen"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("src/main/resources/graphql-client")).exists().isDirectory(); + } + + @Test + void graphqlClientResourceDirectoryIsNotCreatedIfDgsCodegenIsNotRequested() { + ProjectRequest request = createProjectRequest("web"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("src/main/resources/graphql-client")).doesNotExist(); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..538c2a573f --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java @@ -0,0 +1,140 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DgsCodegenProjectGenerationConfiguration}. + * + * @author Brian Clozel + */ +class DgsCodegenProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void gradleBuildWithoutDgsCodegenDoesNotConfigureCodegenPlugin() { + ProjectRequest request = createProjectRequest("web"); + assertThat(gradleBuild(request)).doesNotContain("com.netflix.dgs.codegen"); + } + + @Test + void mavenBuildWithoutDgsCodegenDoesNotConfigureCodegenPlugin() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("io.github.deweyjose"); + } + + @Test + void gradleBuildAddsDgsCodegenPlugin() { + ProjectRequest projectRequest = createProjectRequest("dgs-codegen"); + assertThat(gradleBuild(projectRequest)).contains("id 'com.netflix.dgs.codegen' version '"); + } + + @Test + void gradleBuildConfiguresDgsCodegenPlugin() { + ProjectRequest projectRequest = createProjectRequest("dgs-codegen"); + assertThat(gradleBuild(projectRequest)).containsSubsequence( + // @formatter:off + "generateJava {", + " schemaPaths = [\"${projectDir}/src/main/resources/graphql-client\"]", + " packageName = 'com.example.demo.codegen'", + " generateClient = true", + "}" + // @formatter:on + ); + } + + @Test + void gradleKotlinDslBuildAddsDgsCodegenPlugin() { + ProjectRequest projectRequest = createProjectRequest("dgs-codegen"); + assertThat(gradleKotlinDslBuild(projectRequest)).contains("id(\"com.netflix.dgs.codegen\") version "); + } + + @Test + void gradleKotlinDslBuildConfiguresDgsCodegenPlugin() { + ProjectRequest projectRequest = createProjectRequest("dgs-codegen"); + assertThat(gradleKotlinDslBuild(projectRequest)).containsSubsequence( + // @formatter:off + "tasks.generateJava {", + " schemaPaths.add(\"${projectDir}/src/main/resources/graphql-client\")", + " packageName = \"com.example.demo.codegen\"", + " generateClient = true", + "}" + // @formatter:on + ); + } + + @Test + void mavenBuildConfiguresCodegenPlugin() { + ProjectRequest request = createProjectRequest("dgs-codegen"); + assertThat(mavenPom(request)).lines().containsSequence( + // @formatter:off + " ", + " io.github.deweyjose", + " graphqlcodegen-maven-plugin", + " 1.50", + " ", + " ", + " dgs-codegen", + " ", + " generate", + " ", + " ", + " ", + " src/main/resources/graphql-client", + " ", + " com.example.demo.codegen", + " true", + " ", + " ", + " ", + " " + ); + // @formatter:on + } + + @Test + void mavenBuildConfiguresMavenHelperPlugin() { + ProjectRequest request = createProjectRequest("dgs-codegen"); + assertThat(mavenPom(request)).lines().containsSequence( + // @formatter:off + " ", + " org.codehaus.mojo", + " build-helper-maven-plugin", + " ", + " ", + " add-dgs-source", + " generate-sources", + " ", + " add-source", + " ", + " ", + " ", + " ${project.build.directory}/generated-sources", + " ", + " ", + " ", + " ", + " " + ); + // @formatter:on + } + +} From 89952da8890a252d776ce46d4de72e1318fa00c8 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 21 Nov 2023 14:42:47 +0000 Subject: [PATCH 285/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 172ae57dc0..0a51f1cd52 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:10740a5d181de6d26dfc30e7e7d139079f7d63c00cfbe68b917df50476cac5bf + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6fc4b8e1cf0c37da49b950c5066cf694558597868d1b78e99fde12acf819febc lifecycle: preStop: exec: From 59e89ae8a0ffe233cdb91b8ad8ba68d48e43c9ba Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 21 Nov 2023 17:28:06 +0200 Subject: [PATCH 286/825] Upgrade to Vaadin 24.2.4 and 23.3.28 See gh-1355 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 01a7d4a951..0ca49a1b0c 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -175,9 +175,9 @@ initializr: - compatibilityRange: "[2.6.0,2.7.0-M1)" version: 23.2.15 - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.27 + version: 23.3.28 - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" - version: 24.2.3 + version: 24.2.4 wavefront: groupId: com.wavefront artifactId: wavefront-spring-boot-bom From 949352ea7492cf54f808363d08b9698d77d20048 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 21 Nov 2023 15:56:34 +0000 Subject: [PATCH 287/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 0a51f1cd52..229b8694d0 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6fc4b8e1cf0c37da49b950c5066cf694558597868d1b78e99fde12acf819febc + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5be947d73b185cf90a8c9f294fac751ecc72d2f87fb6ca1e57f821bfc1143ece lifecycle: preStop: exec: From f8d957889637346952fab7daf5fef967e57ec465 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Wed, 22 Nov 2023 16:10:19 +0100 Subject: [PATCH 288/825] Update footer broadcom --- start-client/src/components/common/layout/SideLeft.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index c3fbb64c07..3dbcb16bfd 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -149,7 +149,11 @@ function SideLeft() {
    - © 2013-{new Date().getFullYear()} VMware, Inc. + © 2013-{new Date().getFullYear()} Broadcom. All Rights + Reserved. +
    + The term "Broadcom" refers to Broadcom Inc. and/or + its subsidiaries
    start.spring.io is powered by{' '} From c9e404824641a32b12c64410a42e04272395f231 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 22 Nov 2023 15:26:09 +0000 Subject: [PATCH 289/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 229b8694d0..3d10ef00fe 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5be947d73b185cf90a8c9f294fac751ecc72d2f87fb6ca1e57f821bfc1143ece + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0f73a125145c3c99f9eae30ac92e8bf3b6fa9d7b14c443b6758f1245c4d67803 lifecycle: preStop: exec: From 85a310c7866d913fa351baffe05950d17a42dd1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 22 Nov 2023 17:09:33 +0100 Subject: [PATCH 290/825] Add version property for Spring Modulith Closes gh-1356 --- start-site/src/main/resources/application.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0ca49a1b0c..268838269d 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -133,6 +133,7 @@ initializr: spring-modulith: groupId: org.springframework.modulith artifactId: spring-modulith-bom + versionProperty: spring-modulith.version mappings: - compatibility-range: "[3.1.0,3.2.0-M1)" version: 1.0.2 From cafeac8db0a7bd690f5b0918e6fad1b5865ca762 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 22 Nov 2023 16:22:31 +0000 Subject: [PATCH 291/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 3d10ef00fe..4e906516a3 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0f73a125145c3c99f9eae30ac92e8bf3b6fa9d7b14c443b6758f1245c4d67803 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:21d3d2e66a98f81eea83a9a2c26e11a0901b0bab860f65613caae4144f76ff46 lifecycle: preStop: exec: From f1e9fde56a11d9ed374fb217ab818fdae8c31ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 26 Oct 2023 17:25:27 +0200 Subject: [PATCH 292/825] Adapt tests to deprecation of Spring Boot 2.x See gh-1330 --- ...adleBuildSystemHelpDocumentCustomizer.java | 17 +-- ...avenBuildSystemHelpDocumentCustomizer.java | 24 +--- ...endencyProjectGenerationConfiguration.java | 5 +- .../flyway/FlywayBuildCustomizer.java | 17 +-- .../ObservabilityActuatorBuildCustomizer.java | 12 +- ...abilityProjectGenerationConfiguration.java | 22 +--- .../WavefrontHelpDocumentCustomizer.java | 9 +- .../SpringAzureModuleRegistry.java | 20 --- ...ngAzureProjectGenerationConfiguration.java | 13 +- ...ingCloudContractGradleBuildCustomizer.java | 8 +- .../SpringCloudStreamBuildCustomizer.java | 29 +--- .../springdata/R2dbcBuildCustomizer.java | 15 +-- .../thymeleaf/ThymeleafBuildCustomizer.java | 15 +-- .../vaadin/VaadinMavenBuildCustomizer.java | 25 +--- .../VaadinProjectGenerationConfiguration.java | 4 +- ...vaVersionProjectDescriptionCustomizer.java | 42 +----- .../KotlinCoroutinesCustomizerTests.java | 4 +- .../flyway/FlywayBuildCustomizerTests.java | 34 +---- .../GraalVmHelpDocumentCustomizerTests.java | 7 - .../SpringGraphQlBuildCustomizerTests.java | 2 - ...rvabilityActuatorBuildCustomizerTests.java | 17 +-- .../WavefrontHelpDocumentCustomizerTests.java | 18 +-- ...reProjectGenerationConfigurationTests.java | 124 +----------------- ...oudContractGradleBuildCustomizerTests.java | 3 +- ...loudContractMavenBuildCustomizerTests.java | 1 - ...SpringCloudStreamBuildCustomizerTests.java | 77 +++-------- .../springdata/R2dbcBuildCustomizerTests.java | 48 +------ .../ThymeleafBuildCustomizerTests.java | 15 +-- ...inProjectGenerationConfigurationTests.java | 29 +--- ...sionProjectDescriptionCustomizerTests.java | 66 ++-------- ...InitializrMetadataUpdateStrategyTests.java | 13 +- .../metadata/springio/spring-boot.json | 73 +++++++++-- 32 files changed, 182 insertions(+), 626 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java index 525701030d..35052ee14b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java @@ -20,8 +20,6 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds reference links for Gradle. @@ -31,15 +29,10 @@ */ class GradleBuildSystemHelpDocumentCustomizer implements HelpDocumentCustomizer { - private static final VersionRange SPRING_BOOT_2_3_OR_LATER = VersionParser.DEFAULT.parseRange("2.3.0.M1"); - private final Version springBootVersion; - private final boolean buildImageAvailable; - GradleBuildSystemHelpDocumentCustomizer(ProjectDescription description) { this.springBootVersion = description.getPlatformVersion(); - this.buildImageAvailable = SPRING_BOOT_2_3_OR_LATER.match(this.springBootVersion); } @Override @@ -53,12 +46,10 @@ public void customize(HelpDocument document) { String.format("https://docs.spring.io/spring-boot/docs/%s/gradle-plugin/reference/html/", this.springBootVersion), "Spring Boot Gradle Plugin Reference Guide"); - if (this.buildImageAvailable) { - document.gettingStarted() - .addReferenceDocLink(String.format( - "https://docs.spring.io/spring-boot/docs/%s/gradle-plugin/reference/html/#build-image", - this.springBootVersion), "Create an OCI image"); - } + document.gettingStarted() + .addReferenceDocLink(String.format( + "https://docs.spring.io/spring-boot/docs/%s/gradle-plugin/reference/html/#build-image", + this.springBootVersion), "Create an OCI image"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java index f110e77356..3d8ef23487 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java @@ -20,8 +20,6 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds reference links for Apache Maven. @@ -31,20 +29,10 @@ */ class MavenBuildSystemHelpDocumentCustomizer implements HelpDocumentCustomizer { - private static final VersionRange SPRING_BOOT_2_3_OR_LATER = VersionParser.DEFAULT.parseRange("2.3.0.M1"); - - private static final VersionRange NEW_DOC_STRUCTURE = VersionParser.DEFAULT.parseRange("2.3.0.M4"); - private final Version springBootVersion; - private final boolean springBoot23; - - private final boolean newDocStructure; - MavenBuildSystemHelpDocumentCustomizer(ProjectDescription description) { this.springBootVersion = description.getPlatformVersion(); - this.springBoot23 = SPRING_BOOT_2_3_OR_LATER.match(this.springBootVersion); - this.newDocStructure = NEW_DOC_STRUCTURE.match(this.springBootVersion); } @Override @@ -53,18 +41,12 @@ public void customize(HelpDocument document) { .addReferenceDocLink("https://maven.apache.org/guides/index.html", "Official Apache Maven documentation"); String referenceGuideUrl = generateReferenceGuideUrl(); document.gettingStarted().addReferenceDocLink(referenceGuideUrl, "Spring Boot Maven Plugin Reference Guide"); - if (this.springBoot23) { - String buildImageSection = referenceGuideUrl + "#build-image"; - document.gettingStarted().addReferenceDocLink(buildImageSection, "Create an OCI image"); - } + String buildImageSection = referenceGuideUrl + "#build-image"; + document.gettingStarted().addReferenceDocLink(buildImageSection, "Create an OCI image"); } private String generateReferenceGuideUrl() { - String baseUrlFormat = "https://docs.spring.io/spring-boot/docs/%s/maven-plugin/"; - if (this.springBoot23) { - String location = (this.newDocStructure) ? "reference/html/" : "html/"; - baseUrlFormat = baseUrlFormat + location; - } + String baseUrlFormat = "https://docs.spring.io/spring-boot/docs/%s/maven-plugin/reference/html/"; return String.format(baseUrlFormat, this.springBootVersion); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java index d3671ac0f8..b43a3c5e29 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java @@ -20,7 +20,6 @@ import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.gradle.ConditionalOnGradleVersion; import io.spring.initializr.metadata.InitializrMetadata; @@ -94,8 +93,8 @@ public SpringSessionBuildCustomizer springSessionBuildCustomizer() { @Bean @ConditionalOnRequestedDependency("thymeleaf") - public ThymeleafBuildCustomizer thymeleafBuildCustomizer(ProjectDescription description) { - return new ThymeleafBuildCustomizer(description.getPlatformVersion()); + public ThymeleafBuildCustomizer thymeleafBuildCustomizer() { + return new ThymeleafBuildCustomizer(); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java index c0b5e38fcf..a5424c147a 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java @@ -32,29 +32,22 @@ */ class FlywayBuildCustomizer implements BuildCustomizer { - private static final VersionRange SPRING_BOOT_2_7_0_OR_LATER = VersionParser.DEFAULT.parseRange("2.7.0"); - private static final VersionRange SPRING_BOOT_3_2_M1_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0-M1"); - private final boolean isSpringBoot27OrLater; - private final boolean isSpringBoot32OrLater; FlywayBuildCustomizer(ProjectDescription projectDescription) { - this.isSpringBoot27OrLater = SPRING_BOOT_2_7_0_OR_LATER.match(projectDescription.getPlatformVersion()); this.isSpringBoot32OrLater = SPRING_BOOT_3_2_M1_OR_LATER.match(projectDescription.getPlatformVersion()); } @Override public void customize(Build build) { DependencyContainer dependencies = build.dependencies(); - if (this.isSpringBoot27OrLater) { - if ((dependencies.has("mysql") || dependencies.has("mariadb"))) { - dependencies.add("flyway-mysql", "org.flywaydb", "flyway-mysql", DependencyScope.COMPILE); - } - if (dependencies.has("sqlserver")) { - dependencies.add("flyway-sqlserver", "org.flywaydb", "flyway-sqlserver", DependencyScope.COMPILE); - } + if ((dependencies.has("mysql") || dependencies.has("mariadb"))) { + dependencies.add("flyway-mysql", "org.flywaydb", "flyway-mysql", DependencyScope.COMPILE); + } + if (dependencies.has("sqlserver")) { + dependencies.add("flyway-sqlserver", "org.flywaydb", "flyway-sqlserver", DependencyScope.COMPILE); } if (this.isSpringBoot32OrLater) { if (dependencies.has("oracle")) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java index ae673dd736..8f870b3ab9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java @@ -30,14 +30,8 @@ */ class ObservabilityActuatorBuildCustomizer implements BuildCustomizer { - static final List STANDARD_REGISTRY_IDS = Arrays.asList("datadog", "dynatrace", "graphite", "influx", - "new-relic"); - - private final List dependencyIds; - - ObservabilityActuatorBuildCustomizer(List dependencyIds) { - this.dependencyIds = dependencyIds; - } + private static final List STANDARD_REGISTRY_IDS = Arrays.asList("datadog", "distributed-tracing", + "dynatrace", "graphite", "influx", "new-relic", "wavefront", "zipkin"); @Override public void customize(Build build) { @@ -47,7 +41,7 @@ public void customize(Build build) { } protected boolean match(DependencyContainer dependencies) { - return dependencies.ids().anyMatch(this.dependencyIds::contains); + return dependencies.ids().anyMatch(STANDARD_REGISTRY_IDS::contains); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java index 065fdea047..559807afad 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,6 @@ package io.spring.start.site.extension.dependency.observability; -import java.util.ArrayList; -import java.util.List; - import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; @@ -42,9 +39,7 @@ static class ObservabilityConfiguration { @Bean ObservabilityActuatorBuildCustomizer observabilityActuatorBuildCustomizer() { - List dependencyIds = new ArrayList<>(ObservabilityActuatorBuildCustomizer.STANDARD_REGISTRY_IDS); - dependencyIds.addAll(List.of("distributed-tracing", "wavefront", "zipkin")); - return new ObservabilityActuatorBuildCustomizer(dependencyIds); + return new ObservabilityActuatorBuildCustomizer(); } @Bean @@ -61,7 +56,7 @@ ObservabilityHelpDocumentCustomizer observabilityHelpDocumentCustomizer(ProjectD @Bean @ConditionalOnRequestedDependency("wavefront") WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { - return new WavefrontHelpDocumentCustomizer("https://docs.wavefront.com/wavefront_springboot3.html", build); + return new WavefrontHelpDocumentCustomizer(build); } } @@ -70,22 +65,11 @@ WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { @ConditionalOnPlatformVersion("[2.0.0,3.0.0-M1)") static class Observability2xConfiguration { - @Bean - ObservabilityActuatorBuildCustomizer observabilityActuatorBuildCustomizer() { - return new ObservabilityActuatorBuildCustomizer(ObservabilityActuatorBuildCustomizer.STANDARD_REGISTRY_IDS); - } - @Bean Observability2xHelpDocumentCustomizer observabilityHelpDocumentCustomizer(Build build) { return new Observability2xHelpDocumentCustomizer(build); } - @Bean - @ConditionalOnRequestedDependency("wavefront") - WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { - return new WavefrontHelpDocumentCustomizer("https://docs.wavefront.com/wavefront_springboot.html", build); - } - } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java index 290470dd0e..0d6cca3481 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java @@ -31,16 +31,15 @@ class WavefrontHelpDocumentCustomizer implements HelpDocumentCustomizer { private final Build build; - private final String referenceLink; - - WavefrontHelpDocumentCustomizer(String referenceLink, Build build) { - this.referenceLink = referenceLink; + WavefrontHelpDocumentCustomizer(Build build) { this.build = build; } @Override public void customize(HelpDocument document) { - document.gettingStarted().addReferenceDocLink(this.referenceLink, "Wavefront for Spring Boot documentation"); + document.gettingStarted() + .addReferenceDocLink("https://docs.wavefront.com/wavefront_springboot3.html", + "Wavefront for Spring Boot documentation"); StringBuilder sb = new StringBuilder(); sb.append(String.format("## Observability with Wavefront%n%n")); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java index 99b374f904..86f30bb446 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java @@ -54,26 +54,6 @@ static Iterable createSpringBootRegistry() { .addReferenceDocLink("https://aka.ms/spring/msdocs/postgresql", "Azure PostgreSQL support"))); } - static Iterable createSpringBoot2Registry() { - return create( - onDependencies("actuator").customizeBuild(addDependency("spring-cloud-azure-starter-actuator")) - .customizeHelpDocument(addReferenceLink("actuator", "Azure Actuator")), - onDependencies("distributed-tracing").customizeBuild(addDependency("spring-cloud-azure-trace-sleuth")) - .customizeHelpDocument(addReferenceLink("sleuth", "Azure Sleuth")), - onDependencies("integration", "azure-storage") - .customizeBuild(addDependency("spring-cloud-azure-starter-integration-storage-queue")) - .customizeHelpDocument( - addReferenceLink("spring-integration/storage-queue", "Azure Integration Storage Queue")), - onDependencies("mysql", "azure-support") - .customizeBuild(addDependency("spring-cloud-azure-starter-jdbc-mysql")) - .customizeHelpDocument((helpDocument) -> helpDocument.gettingStarted() - .addReferenceDocLink("https://aka.ms/spring/msdocs/mysql", "Azure MySQL support")), - onDependencies("postgresql", "azure-support") - .customizeBuild(addDependency("spring-cloud-azure-starter-jdbc-postgresql")) - .customizeHelpDocument((helpDocument) -> helpDocument.gettingStarted() - .addReferenceDocLink("https://aka.ms/spring/msdocs/postgresql", "Azure PostgreSQL support"))); - } - private static Iterable create(ImplicitDependency.Builder... dependencies) { return Arrays.stream(dependencies).map(Builder::build).collect(Collectors.toList()); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java index 2a3f61ca44..ddf690a22c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,7 @@ package io.spring.start.site.extension.dependency.springazure; import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependencyBuildCustomizer; import io.spring.start.site.support.implicit.ImplicitDependencyHelpDocumentCustomizer; @@ -37,14 +34,10 @@ @ProjectGenerationConfiguration class SpringAzureProjectGenerationConfiguration { - private static final VersionRange SPRING_BOOT_2 = VersionParser.DEFAULT.parseRange("[2.0.0,3.0.0-M1)"); - private final Iterable azureDependencies; - SpringAzureProjectGenerationConfiguration(ProjectDescription description) { - this.azureDependencies = SPRING_BOOT_2.match(description.getPlatformVersion()) - ? SpringAzureModuleRegistry.createSpringBoot2Registry() - : SpringAzureModuleRegistry.createSpringBootRegistry(); + SpringAzureProjectGenerationConfiguration() { + this.azureDependencies = SpringAzureModuleRegistry.createSpringBootRegistry(); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizer.java index 409723441e..a620e363f5 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizer.java @@ -23,8 +23,6 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -39,8 +37,6 @@ abstract class SpringCloudContractGradleBuildCustomizer implements BuildCustomiz private static final Log logger = LogFactory.getLog(SpringCloudContractGradleBuildCustomizer.class); - private static final VersionRange SPRING_CLOUD_CONTRACT_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0.M4"); - private static final MavenRepository SPRING_MILESTONES = MavenRepository .withIdAndUrl("spring-milestones", "https://repo.spring.io/milestone") .name("Spring Milestones") @@ -81,9 +77,7 @@ public void customize(GradleBuild build) { Dependency.withCoordinates("io.rest-assured", "spring-web-test-client") .scope(DependencyScope.TEST_COMPILE)); } - if (SPRING_CLOUD_CONTRACT_3_0_OR_LATER.match(VersionParser.DEFAULT.parse(sccPluginVersion))) { - build.tasks().customize("contractTest", (task) -> task.invoke("useJUnitPlatform")); - } + build.tasks().customize("contractTest", (task) -> task.invoke("useJUnitPlatform")); configurePluginRepositories(build, sccPluginVersion); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java index b0dba74597..432b59d550 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java @@ -19,7 +19,6 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; -import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.version.Version; @@ -57,7 +56,7 @@ public void customize(Build build) { .add("cloud-stream-binder-kafka", "org.springframework.cloud", "spring-cloud-stream-binder-kafka", DependencyScope.COMPILE); } - if (isSpringBoot3xWithPulsarSupport() && hasDependency("pulsar", build)) { + if (hasPulsarSupport() && hasDependency("pulsar", build)) { build.dependencies() .add("cloud-stream-binder-pulsar", "org.springframework.cloud", "spring-cloud-stream-binder-pulsar", DependencyScope.COMPILE); @@ -70,21 +69,10 @@ public void customize(Build build) { .add("cloud-stream-binder-kafka-streams", "org.springframework.cloud", "spring-cloud-stream-binder-kafka-streams", DependencyScope.COMPILE); } - if (isSpringBoot3x()) { - build.dependencies() - .add("cloud-stream-test", - Dependency.withCoordinates("org.springframework.cloud", "spring-cloud-stream-test-binder") - .scope(DependencyScope.TEST_COMPILE)); - } - else if (build instanceof MavenBuild) { - // TODO: https://github.com/spring-io/initializr/issues/1159 - build.dependencies() - .add("cloud-stream-test", - Dependency.withCoordinates("org.springframework.cloud", "spring-cloud-stream") - .classifier("test-binder") - .type("test-jar") - .scope(DependencyScope.TEST_COMPILE)); - } + build.dependencies() + .add("cloud-stream-test", + Dependency.withCoordinates("org.springframework.cloud", "spring-cloud-stream-test-binder") + .scope(DependencyScope.TEST_COMPILE)); } } @@ -92,12 +80,7 @@ protected boolean hasDependency(String id, Build build) { return build.dependencies().has(id); } - protected boolean isSpringBoot3x() { - Version platformVersion = this.description.getPlatformVersion(); - return platformVersion.compareTo(Version.parse("3.0.0-M1")) > 0; - } - - protected boolean isSpringBoot3xWithPulsarSupport() { + protected boolean hasPulsarSupport() { Version platformVersion = this.description.getPlatformVersion(); return platformVersion.compareTo(Version.parse("3.2.0-M3")) >= 0; } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java index 3e0c6051ed..d8fd003301 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java @@ -44,14 +44,10 @@ public class R2dbcBuildCustomizer implements BuildCustomizer { private static final List JDBC_DEPENDENCY_IDS = Arrays.asList("jdbc", "data-jdbc", "data-jpa"); - private static final VersionRange SPRING_BOOT_2_7_0_OR_LATER = VersionParser.DEFAULT.parseRange("2.7.0-M1"); - private static final VersionRange SPRING_BOOT_3_0_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0-M1"); private static final VersionRange SPRING_BOOT_3_1_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.1.0"); - private final boolean borcaOrLater; - private final boolean mariaDbIsUnmanaged; private final boolean sqlServerIsUnmanaged; @@ -59,7 +55,6 @@ public class R2dbcBuildCustomizer implements BuildCustomizer { private final boolean mysqlR2dbcIsAsyncerDependency; public R2dbcBuildCustomizer(Version platformVersion) { - this.borcaOrLater = SPRING_BOOT_2_7_0_OR_LATER.match(platformVersion); this.mariaDbIsUnmanaged = SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion); this.sqlServerIsUnmanaged = SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion); this.mysqlR2dbcIsAsyncerDependency = SPRING_BOOT_3_1_0_OR_LATER.match(platformVersion); @@ -75,22 +70,18 @@ public void customize(Build build) { this.mariaDbIsUnmanaged ? "1.1.3" : null); } if (build.dependencies().has("mysql")) { - if (!this.borcaOrLater) { - addManagedDriver(build.dependencies(), "dev.miku", "r2dbc-mysql"); - } - else if (this.mysqlR2dbcIsAsyncerDependency) { + if (this.mysqlR2dbcIsAsyncerDependency) { addManagedDriver(build.dependencies(), "io.asyncer", "r2dbc-mysql"); } } if (build.dependencies().has("postgresql")) { - String groupId = this.borcaOrLater ? "org.postgresql" : "io.r2dbc"; - addManagedDriver(build.dependencies(), groupId, "r2dbc-postgresql"); + addManagedDriver(build.dependencies(), "org.postgresql", "r2dbc-postgresql"); } if (build.dependencies().has("sqlserver")) { addManagedDriver(build.dependencies(), "io.r2dbc", "r2dbc-mssql", this.sqlServerIsUnmanaged ? "1.0.0.RELEASE" : null); } - if (build.dependencies().has("oracle") && this.borcaOrLater) { + if (build.dependencies().has("oracle")) { addManagedDriver(build.dependencies(), "com.oracle.database.r2dbc", "oracle-r2dbc"); } if (build.dependencies().has("flyway") || build.dependencies().has("liquibase")) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java index 3e740b4a62..47d17d7606 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java @@ -19,9 +19,6 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * A {@link BuildCustomizer} for Thymeleaf. @@ -30,22 +27,12 @@ */ public class ThymeleafBuildCustomizer implements BuildCustomizer { - private static final VersionRange SPRING_BOOT_3_OR_ABOVE = VersionParser.DEFAULT.parseRange("3.0.0-M1"); - - private final boolean springBoot3OrAbove; - - public ThymeleafBuildCustomizer(Version platformVersion) { - this.springBoot3OrAbove = SPRING_BOOT_3_OR_ABOVE.match(platformVersion); - } - @Override public void customize(Build build) { if (build.dependencies().has("security")) { - String artifactId = (this.springBoot3OrAbove) ? "thymeleaf-extras-springsecurity6" - : "thymeleaf-extras-springsecurity5"; build.dependencies() .add("thymeleaf-extras-spring-security", - Dependency.withCoordinates("org.thymeleaf.extras", artifactId)); + Dependency.withCoordinates("org.thymeleaf.extras", "thymeleaf-extras-springsecurity6")); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java index ffa80ad4a0..a1889d1822 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java @@ -18,9 +18,6 @@ import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * A {@link BuildCustomizer} that adds a production profile to enable Vaadin's production @@ -30,30 +27,14 @@ */ class VaadinMavenBuildCustomizer implements BuildCustomizer { - private static final VersionRange SPRING_BOOT_3_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0-M1"); - - private final boolean isVaadin24OrLater; - - VaadinMavenBuildCustomizer(Version platformVersion) { - this.isVaadin24OrLater = SPRING_BOOT_3_OR_LATER.match(platformVersion); - } - @Override public void customize(MavenBuild build) { build.profiles() .id("production") .plugins() - .add("com.vaadin", "vaadin-maven-plugin", - (plugin) -> plugin.version("${vaadin.version}") - .execution("frontend", - (execution) -> execution.goal("prepare-frontend") - .goal("build-frontend") - .phase("compile") - .configuration((configuration) -> { - if (!this.isVaadin24OrLater) { - configuration.add("productionMode", "true"); - } - }))); + .add("com.vaadin", "vaadin-maven-plugin", (plugin) -> plugin.version("${vaadin.version}") + .execution("frontend", + (execution) -> execution.goal("prepare-frontend").goal("build-frontend").phase("compile"))); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java index 186f723929..8c1435fd15 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java @@ -38,8 +38,8 @@ class VaadinProjectGenerationConfiguration { @Bean @ConditionalOnBuildSystem(MavenBuildSystem.ID) - VaadinMavenBuildCustomizer vaadinMavenBuildCustomizer(ProjectDescription description) { - return new VaadinMavenBuildCustomizer(description.getPlatformVersion()); + VaadinMavenBuildCustomizer vaadinMavenBuildCustomizer() { + return new VaadinMavenBuildCustomizer(); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index af5ea10288..8d49b04304 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -24,8 +24,6 @@ import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * Validate that the requested java version is compatible with the chosen Spring Boot @@ -36,51 +34,24 @@ */ public class JavaVersionProjectDescriptionCustomizer implements ProjectDescriptionCustomizer { - private static final List UNSUPPORTED_VERSIONS = Arrays.asList("1.6", "1.7"); - - private static final VersionRange SPRING_BOOT_2_6_12_OR_LATER = VersionParser.DEFAULT.parseRange("2.6.12"); - - private static final VersionRange SPRING_BOOT_2_7_10_OR_LATER = VersionParser.DEFAULT.parseRange("2.7.10"); - - private static final VersionRange SPRING_BOOT_2_7_16_OR_LATER = VersionParser.DEFAULT.parseRange("2.7.16"); - - private static final VersionRange SPRING_BOOT_3_0_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0-M1"); + private static final List UNSUPPORTED_VERSIONS = Arrays.asList("1.6", "1.7", "1.8"); @Override public void customize(MutableProjectDescription description) { String javaVersion = description.getLanguage().jvmVersion(); if (UNSUPPORTED_VERSIONS.contains(javaVersion)) { - updateTo(description, "1.8"); + updateTo(description, "17"); return; } Integer javaGeneration = determineJavaGeneration(javaVersion); if (javaGeneration == null) { return; } - Version platformVersion = description.getPlatformVersion(); - // Spring Boot 3 requires Java 17 - if (javaGeneration < 17 && SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion)) { + if (javaGeneration < 17) { updateTo(description, "17"); - return; - } - if (javaGeneration == 19) { - // Java 19 support as of Spring Boot 2.6.12 - if (!SPRING_BOOT_2_6_12_OR_LATER.match(platformVersion)) { - updateTo(description, "17"); - } - } - if (javaGeneration == 20) { - // Java 20 support as of Spring Boot 2.7.10 - if (!SPRING_BOOT_2_7_10_OR_LATER.match(platformVersion)) { - updateTo(description, "17"); - } - } + Version platformVersion = description.getPlatformVersion(); if (javaGeneration == 21) { - // Java 21 support as of Spring Boot 2.7.16 - if (!SPRING_BOOT_2_7_16_OR_LATER.match(platformVersion)) { - updateTo(description, "17"); - } // Kotlin does not support Java 21 bytecodes yet if (description.getLanguage() instanceof KotlinLanguage) { updateTo(description, "17"); @@ -95,11 +66,8 @@ private void updateTo(MutableProjectDescription description, String jvmVersion) private Integer determineJavaGeneration(String javaVersion) { try { - if ("1.8".equals(javaVersion)) { - return 8; - } int generation = Integer.parseInt(javaVersion); - return ((generation > 8 && generation <= 21) ? generation : null); + return ((generation > 9 && generation <= 21) ? generation : null); } catch (NumberFormatException ex) { return null; diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java index d4ec79a43a..8acf77a728 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java @@ -33,13 +33,13 @@ class KotlinCoroutinesCustomizerTests extends AbstractExtensionTests { @Test void kotlinCoroutinesIsAdded() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("2.7.0"); + request.setBootVersion("3.1.0"); request.setLanguage("kotlin"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("org.jetbrains.kotlinx", "kotlinx-coroutines-reactor"); assertThat(project).textFile("HELP.md") .contains( - "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring/docs/5.3.20/spring-framework-reference/languages.html#coroutines)"); + "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring/docs/6.0.9/spring-framework-reference/languages.html#coroutines)"); } @Test diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java index 774c336785..4cbab3d73c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java @@ -31,21 +31,21 @@ class FlywayBuildCustomizerTests extends AbstractExtensionTests { @Test void mariadbOnly() { - ProjectRequest projectRequest = createProject("2.7.0", "mariadb"); + ProjectRequest projectRequest = createProject("3.1.0", "mariadb"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mariadb")) .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); } @Test void mysqlOnly() { - ProjectRequest projectRequest = createProject("2.7.0", "mysql"); + ProjectRequest projectRequest = createProject("3.1.0", "mysql"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mysql")) .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); } @Test void sqlserverOnly() { - ProjectRequest projectRequest = createProject("2.7.0", "sqlserver"); + ProjectRequest projectRequest = createProject("3.1.0", "sqlserver"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("sqlserver")) .doesNotHaveDependency("org.flywaydb", "flyway-sqlserver"); } @@ -57,27 +57,6 @@ void oracleOnly() { .doesNotHaveDependency("org.flywaydb", "flyway-database-oracle"); } - @Test - void mariadbAndFlywayPreviousTo270() { - ProjectRequest projectRequest = createProject("2.6.0", "mariadb", "flyway"); - assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mariadb")) - .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); - } - - @Test - void mysqlAndFlywayPreviousTo270() { - ProjectRequest projectRequest = createProject("2.6.0", "mysql", "flyway"); - assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mysql")) - .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); - } - - @Test - void sqlserverAndFlywayPreviousTo270() { - ProjectRequest projectRequest = createProject("2.6.0", "sqlserver", "flyway"); - assertThat(mavenPom(projectRequest)).hasDependency(getDependency("sqlserver")) - .doesNotHaveDependency("org.flywaydb", "flyway-sqlserver"); - } - @Test void oracleAndFlywayPreviousTo32M1() { ProjectRequest projectRequest = createProject("3.1.0", "oracle", "flyway"); @@ -87,21 +66,21 @@ void oracleAndFlywayPreviousTo32M1() { @Test void mariadbAndFlyway() { - ProjectRequest projectRequest = createProject("2.7.0", "mariadb", "flyway"); + ProjectRequest projectRequest = createProject("3.1.0", "mariadb", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mariadb")) .hasDependency("org.flywaydb", "flyway-mysql"); } @Test void mysqlAndFlyway() { - ProjectRequest projectRequest = createProject("2.7.0", "mysql", "flyway"); + ProjectRequest projectRequest = createProject("3.1.0", "mysql", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mysql")) .hasDependency("org.flywaydb", "flyway-mysql"); } @Test void sqlserverAndFlyway() { - ProjectRequest projectRequest = createProject("2.7.0", "sqlserver", "flyway"); + ProjectRequest projectRequest = createProject("3.1.0", "sqlserver", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("sqlserver")) .hasDependency("org.flywaydb", "flyway-sqlserver"); } @@ -116,7 +95,6 @@ void oracleAndFlyway() { private ProjectRequest createProject(String springBootVersion, String... styles) { ProjectRequest projectRequest = createProjectRequest(styles); projectRequest.setLanguage("java"); - projectRequest.setJavaVersion("11"); projectRequest.setBootVersion(springBootVersion); return projectRequest; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java index 39da4d89aa..c23537d566 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java @@ -102,13 +102,6 @@ void nativeSectionWithWebExposesPort() { assertHelpDocument(request).contains("$ docker run --rm -p 8080:8080 another-project:2.0.0-SNAPSHOT"); } - @Override - protected ProjectRequest createProjectRequest(String... styles) { - ProjectRequest request = super.createProjectRequest(styles); - request.setBootVersion("3.0.0-M5"); - return request; - } - private TextAssert assertHelpDocument(ProjectRequest request) { ProjectStructure project = generateProject(request); return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizerTests.java index 3703a27db2..5d3bd8828c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizerTests.java @@ -47,7 +47,6 @@ void setup() { @Test void shouldAddTestingDependencyWhenWebFlux() { ProjectRequest request = createProjectRequest("webflux", "graphql"); - request.setBootVersion("2.7.0-SNAPSHOT"); assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("webflux")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(this.graphQlTest) @@ -58,7 +57,6 @@ void shouldAddTestingDependencyWhenWebFlux() { @Test void shouldAddTestingDependencyAndWebFluxWhenWeb() { ProjectRequest request = createProjectRequest("web", "graphql"); - request.setBootVersion("2.7.0-SNAPSHOT"); assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("web")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(this.graphQlTest) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java index 3b6c1dd6cf..0d7030bd39 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java @@ -17,7 +17,6 @@ package io.spring.start.site.extension.dependency.observability; import io.spring.initializr.generator.test.project.ProjectStructure; -import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.params.ParameterizedTest; @@ -32,25 +31,11 @@ */ class ObservabilityActuatorBuildCustomizerTests extends AbstractExtensionTests { - @ParameterizedTest - @ValueSource(strings = { "datadog", "dynatrace", "influx", "graphite", "new-relic" }) - void actuatorIsAddedWith2xMicrometerRegistries(String dependency) { - assertThat(generateProject("2.7.5", dependency)).mavenBuild().hasDependency(getDependency("actuator")); - } - - @ParameterizedTest - @ValueSource(strings = { "distributed-tracing", "zipkin", "wavefront" }) - void actuatorIsNotAddedWith2xStarters(String dependency) { - Dependency actuator = getDependency("actuator"); - assertThat(generateProject("2.7.5", dependency)).mavenBuild() - .doesNotHaveDependency(actuator.getGroupId(), actuator.getArtifactId()); - } - @ParameterizedTest @ValueSource(strings = { "datadog", "dynatrace", "influx", "graphite", "new-relic", "distributed-tracing", "zipkin", "wavefront" }) void actuatorIsAddedWithObservabilityEntries(String dependency) { - assertThat(generateProject("3.0.0", dependency)).mavenBuild().hasDependency(getDependency("actuator")); + assertThat(generateProject("3.1.0", dependency)).mavenBuild().hasDependency(getDependency("actuator")); } private ProjectStructure generateProject(String bootVersion, String... dependencies) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java index ad5a9caf67..258dd92088 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java @@ -33,43 +33,37 @@ class WavefrontHelpDocumentCustomizerTests extends AbstractExtensionTests { @Test void wavefrontAddGeneralSection() { - assertHelpDocument("2.7.5", "wavefront").contains("## Observability with Wavefront", "", + assertHelpDocument("3.0.0", "wavefront").contains("## Observability with Wavefront", "", "If you don't have a Wavefront account, the starter will create a freemium account for you.", "The URL to access the Wavefront Service dashboard is logged on startup."); } @Test void wavefrontWithoutWebApplicationDoesNotAddActuatorSection() { - assertHelpDocument("2.7.5", "wavefront") + assertHelpDocument("3.0.0", "wavefront") .doesNotContain("You can also access your dashboard using the `/actuator/wavefront` endpoint."); } @Test void wavefrontWithWebApplicationAddActuatorSection() { - assertHelpDocument("2.7.5", "wavefront", "web") + assertHelpDocument("3.0.0", "wavefront", "web") .contains("You can also access your dashboard using the `/actuator/wavefront` endpoint."); } @Test void wavefrontWithoutSleuthAddTracingNote() { - assertHelpDocument("2.7.5", "wavefront") + assertHelpDocument("3.0.0", "wavefront") .contains("Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); } @Test void wavefrontWithSleuthDoesNotAddTracingNote() { - assertHelpDocument("2.7.5", "wavefront", "distributed-tracing").doesNotContain( + assertHelpDocument("3.0.0", "wavefront", "distributed-tracing").doesNotContain( "Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); } @Test - void springBoot2xWavefrontReference() { - assertHelpDocument("2.7.5", "wavefront").contains( - "* [Wavefront for Spring Boot documentation](https://docs.wavefront.com/wavefront_springboot.html)"); - } - - @Test - void springBoot3xWavefrontReference() { + void springBootWavefrontReference() { assertHelpDocument("3.0.0", "wavefront").contains( "* [Wavefront for Spring Boot documentation](https://docs.wavefront.com/wavefront_springboot3.html)"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java index d1f26adf1e..9885762aca 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java @@ -37,25 +37,10 @@ */ class SpringAzureProjectGenerationConfigurationTests extends AbstractExtensionTests { - @ParameterizedTest - @MethodSource("springBoot2AzureDependencies") - void springBoot2onlyAzureDependency(String dependencyId) { - ProjectStructure project = generateProject("2.7.5", dependencyId); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency(getDependency(dependencyId)) - .doesNotHaveDependency("com.azure.spring", "spring-cloud-azure-starter-actuator") - .doesNotHaveDependency("com.azure.spring", "spring-cloud-azure-trace-sleuth") - .doesNotHaveDependency("com.azure.spring", "spring-cloud-azure-starter-integration-storage-queue"); - assertThatHelpDocumentOf(project).doesNotContain("https://aka.ms/spring/docs/actuator") - .doesNotContain("https://aka.ms/spring/docs/sleuth") - .doesNotContain("https://aka.ms/spring/docs/spring-integration/storage-queue"); - } - @ParameterizedTest @MethodSource("azureDependencies") void onlyAzureDependency(String dependencyId) { - ProjectStructure project = generateProject("3.0.0", dependencyId); + ProjectStructure project = generateProject("3.1.0", dependencyId); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency(dependencyId)) @@ -65,19 +50,9 @@ void onlyAzureDependency(String dependencyId) { .doesNotContain("https://aka.ms/spring/docs/spring-integration/storage-queue"); } - @Test - void springBoot2onlyActuator() { - ProjectStructure project = generateProject("2.7.5", "actuator"); - assertThat(project).mavenBuild() - .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") - .hasDependenciesSize(2) - .hasDependency("org.springframework.boot", "spring-boot-starter-actuator") - .hasDependency("org.springframework.boot", "spring-boot-starter-test", null, "test"); - } - @Test void onlyActuator() { - ProjectStructure project = generateProject("3.0.0", "actuator"); + ProjectStructure project = generateProject("3.1.0", "actuator"); assertThat(project).mavenBuild() .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") .hasDependenciesSize(2) @@ -85,23 +60,10 @@ void onlyActuator() { .hasDependency("org.springframework.boot", "spring-boot-starter-test", null, "test"); } - @ParameterizedTest - @MethodSource("springBoot2AzureDependencies") - void springBoot2azureDependencyWithActuator(String dependencyId) { - ProjectStructure project = generateProject("2.7.5", dependencyId, "actuator"); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency(getDependency(dependencyId)) - .hasDependency("com.azure.spring", "spring-cloud-azure-starter-actuator"); - assertThatHelpDocumentOf(project).contains("https://aka.ms/spring/docs/actuator") - .doesNotContain("https://aka.ms/spring/docs/sleuth") - .doesNotContain("https://aka.ms/spring/docs/spring-integration/storage-queue"); - } - @ParameterizedTest @MethodSource("azureDependencies") void azureDependencyWithActuator(String dependencyId) { - ProjectStructure project = generateProject("3.0.0", dependencyId, "actuator"); + ProjectStructure project = generateProject("3.1.0", dependencyId, "actuator"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency(dependencyId)) @@ -110,43 +72,9 @@ void azureDependencyWithActuator(String dependencyId) { .doesNotContain("https://aka.ms/spring/docs/spring-integration/storage-queue"); } - @Test - void onlySleuth() { - ProjectStructure project = generateProject("2.7.5", "distributed-tracing"); - assertThat(project).mavenBuild() - .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") - .hasDependenciesSize(3) - .hasDependency("org.springframework.cloud", "spring-cloud-starter-sleuth") - .hasDependency("org.springframework.boot", "spring-boot-starter-test", null, "test"); - } - - @ParameterizedTest - @MethodSource("springBoot2AzureDependencies") - void springBoot2AzureDependencyWithSleuth(String dependencyId) { - ProjectStructure project = generateProject("2.7.5", dependencyId, "distributed-tracing"); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency(getDependency(dependencyId)) - .hasDependency("com.azure.spring", "spring-cloud-azure-trace-sleuth"); - assertThatHelpDocumentOf(project).contains("https://aka.ms/spring/docs/sleuth") - .doesNotContain("https://aka.ms/spring/docs/actuator") - .doesNotContain("https://aka.ms/spring/docs/spring-integration/storage-queue"); - } - - @Test - void springBoot2OnlyIntegration() { - ProjectStructure project = generateProject("2.7.5", "integration"); - assertThat(project).mavenBuild() - .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") - .hasDependenciesSize(3) - .hasDependency("org.springframework.boot", "spring-boot-starter-integration") - .hasDependency("org.springframework.boot", "spring-boot-starter-test", null, "test") - .hasDependency("org.springframework.integration", "spring-integration-test", null, "test"); - } - @Test void onlyIntegration() { - ProjectStructure project = generateProject("3.0.0", "integration"); + ProjectStructure project = generateProject("3.1.0", "integration"); assertThat(project).mavenBuild() .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") .hasDependenciesSize(3) @@ -155,22 +83,9 @@ void onlyIntegration() { .hasDependency("org.springframework.integration", "spring-integration-test", null, "test"); } - @Test - void springBoot2AzureStorageWithIntegration() { - ProjectStructure project = generateProject("2.7.5", "azure-storage", "integration"); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency(getDependency("azure-storage")) - .hasDependency(getDependency("integration")) - .hasDependency("com.azure.spring", "spring-cloud-azure-starter-integration-storage-queue"); - assertThatHelpDocumentOf(project).contains("https://aka.ms/spring/docs/spring-integration/storage-queue") - .doesNotContain("https://aka.ms/spring/docs/actuator") - .doesNotContain("https://aka.ms/spring/docs/sleuth"); - } - @Test void azureStorageWithIntegration() { - ProjectStructure project = generateProject("3.0.0", "azure-storage", "integration"); + ProjectStructure project = generateProject("3.1.0", "azure-storage", "integration"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency("azure-storage")) @@ -180,19 +95,9 @@ void azureStorageWithIntegration() { .doesNotContain("https://aka.ms/spring/docs/actuator"); } - @Test - void springBoot2AzureJdbcWithMysql() { - ProjectStructure project = generateProject("2.7.5", "mysql", "azure-support"); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-mysql"); - assertThatHelpDocumentOf(project).contains("https://aka.ms/spring/msdocs/mysql") - .doesNotContain("https://aka.ms/spring/msdocs/postgresql"); - } - @Test void azureJdbcWithMysql() { - ProjectStructure project = generateProject("3.0.0", "mysql", "azure-support"); + ProjectStructure project = generateProject("3.1.0", "mysql", "azure-support"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-mysql"); @@ -200,19 +105,9 @@ void azureJdbcWithMysql() { .doesNotContain("https://aka.ms/spring/msdocs/postgresql"); } - @Test - void springBoot2AzureJdbcWithPostgresql() { - ProjectStructure project = generateProject("2.7.5", "postgresql", "azure-support"); - assertThat(project).mavenBuild() - .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") - .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-postgresql"); - assertThatHelpDocumentOf(project).contains("https://aka.ms/spring/msdocs/postgresql") - .doesNotContain("https://aka.ms/spring/msdocs/mysql"); - } - @Test void azureJdbcWithPostgresql() { - ProjectStructure project = generateProject("3.0.0", "postgresql", "azure-support"); + ProjectStructure project = generateProject("3.1.0", "postgresql", "azure-support"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-postgresql"); @@ -220,11 +115,6 @@ void azureJdbcWithPostgresql() { .doesNotContain("https://aka.ms/spring/msdocs/mysql"); } - private static Stream springBoot2AzureDependencies() { - return Stream.of(Arguments.of("azure-active-directory"), Arguments.of("azure-cosmos-db"), - Arguments.of("azure-keyvault"), Arguments.of("azure-storage"), Arguments.of("azure-support")); - } - private static Stream azureDependencies() { return Stream.of(Arguments.of("azure-active-directory"), Arguments.of("azure-keyvault"), Arguments.of("azure-storage"), Arguments.of("azure-support")); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java index a9b7351f90..ad6ae59982 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java @@ -44,9 +44,8 @@ void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { } @Test - void springCloudContractVerifierPlugin30ContractTestWithJUnit5ByDefault() { + void springCloudContractVerifierPluginContractTestWithJUnit5ByDefault() { ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - projectRequest.setBootVersion("2.7.5"); assertThat(gradleBuild(projectRequest)).containsSubsequence("tasks.named('contractTest') {", "useJUnitPlatform()"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java index 2f564f7352..64681789f5 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java @@ -50,7 +50,6 @@ void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { @Test void springCloudContractVerifierPluginForSpringBootWithJUnit5ByDefault() { ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - projectRequest.setBootVersion("2.7.0"); assertThat(mavenPom(projectRequest)) .hasText("/project/build/plugins/plugin[2]/artifactId", "spring-cloud-contract-maven-plugin") .hasText("/project/build/plugins/plugin[2]/configuration/testFramework", "JUNIT5"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java index 3b9df5c97e..a7f631cb96 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java @@ -16,16 +16,10 @@ package io.spring.start.site.extension.dependency.springcloud; -import java.util.stream.Stream; - -import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; import static org.assertj.core.api.Assertions.assertThat; @@ -50,42 +44,39 @@ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { private static final Dependency RABBIT_BINDER = Dependency.withId("cloud-stream-binder-rabbit", "org.springframework.cloud", "spring-cloud-stream-binder-rabbit"); - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudStreamWithRabbit(Version springBootVersion, Dependency testDependency) { + private static final Dependency TEST_BINDER = Dependency.withId("cloud-stream-test", "org.springframework.cloud", + "spring-cloud-stream-test-binder", null, Dependency.SCOPE_TEST); + + @Test + void springCloudStreamWithRabbit() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependency(testDependency) + .hasDependency(TEST_BINDER) .hasDependenciesSize(6); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudStreamWithKafka(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudStreamWithKafka() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka")) .hasDependency(KAFKA_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependency(testDependency) + .hasDependency(TEST_BINDER) .hasDependenciesSize(6); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudStreamWithKafkaStreams(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudStreamWithKafkaStreams() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka-streams"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka-streams")) .hasDependency(KAFKA_STREAMS_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependency(testDependency) + .hasDependency(TEST_BINDER) .hasDependenciesSize(5); } @@ -99,11 +90,9 @@ void springCloudStreamWithPulsar() { .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudStreamWithAllBinders(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudStreamWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp", "kafka", "kafka-streams"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) @@ -112,15 +101,13 @@ void springCloudStreamWithAllBinders(Version springBootVersion, Dependency testD .hasDependency(KAFKA_BINDER) .hasDependency(KAFKA_STREAMS_BINDER) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) - .hasDependency(testDependency) + .hasDependency(TEST_BINDER) .hasDependenciesSize(11); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudBusWithRabbit(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudBusWithRabbit() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -128,11 +115,9 @@ void springCloudBusWithRabbit(Version springBootVersion, Dependency testDependen .hasDependenciesSize(5); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudBusWithKafka(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudBusWithKafka() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -140,11 +125,9 @@ void springCloudBusWithKafka(Version springBootVersion, Dependency testDependenc .hasDependenciesSize(5); } - @ParameterizedTest - @MethodSource("springCloudStreamArguments") - void springCloudBusWithAllBinders(Version springBootVersion, Dependency testDependency) { + @Test + void springCloudBusWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp", "kafka", "kafka-streams"); - request.setBootVersion(springBootVersion.toString()); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) @@ -155,22 +138,4 @@ void springCloudBusWithAllBinders(Version springBootVersion, Dependency testDepe .hasDependenciesSize(9); } - @Test - void springCloudStreamWithGradleBuildDoesNotAddTestDependency() { - ProjectRequest request = createProjectRequest("cloud-stream", "amqp"); - request.setBootVersion("2.7.0"); - assertThat(gradleBuild(request)).doesNotContain("test-binder"); - } - - private static Stream springCloudStreamArguments() { - Dependency scsTest = Dependency.withId("cloud-stream-test", "org.springframework.cloud", "spring-cloud-stream", - null, Dependency.SCOPE_TEST); - scsTest.setClassifier("test-binder"); - scsTest.setType("test-jar"); - Dependency testBinder = Dependency.withId("cloud-stream-test", "org.springframework.cloud", - "spring-cloud-stream-test-binder", null, Dependency.SCOPE_TEST); - return Stream.of(Arguments.of(Version.parse("2.7.0"), scsTest), - Arguments.of(Version.parse("3.0.0"), testBinder)); - } - } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java index 638dd1dac1..b4ce555980 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java @@ -47,17 +47,7 @@ void r2dbcWithH2() { } @Test - void r2dbcWithMariadbAndBorca() { - Build build = createBuild(); - build.dependencies().add("data-r2dbc"); - build.dependencies().add("mariadb"); - customize(build, Version.parse("2.7.6")); - assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "mariadb", "r2dbc-mariadb"); - assertThat(build.dependencies().get("r2dbc-mariadb").getVersion()).isNull(); - } - - @Test - void r2dbcWithMariadbAfterBorca() { + void r2dbcWithMariadb() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("mariadb"); @@ -67,21 +57,11 @@ void r2dbcWithMariadbAfterBorca() { } @Test - void r2dbcWithMysql() { - Build build = createBuild(); - build.dependencies().add("data-r2dbc"); - build.dependencies().add("mysql"); - customize(build, Version.parse("2.6.8")); - assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "mysql", "r2dbc-mysql"); - assertThat(build.dependencies().get("r2dbc-mysql").getGroupId()).isEqualTo("dev.miku"); - } - - @Test - void r2dbcWithMysqlAndBorca() { + void r2dbcWithMysqlBeforeSpringBoot31() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("mysql"); - customize(build, Version.parse("2.7.0")); + customize(build, Version.parse("3.0.0")); assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "mysql"); } @@ -97,16 +77,6 @@ void r2dbcWithMysqlAndSpringBoot31() { @Test void r2dbcWithPostgresql() { - Build build = createBuild(); - build.dependencies().add("data-r2dbc"); - build.dependencies().add("postgresql"); - customize(build, Version.parse("2.6.8")); - assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "postgresql", "r2dbc-postgresql"); - assertThat(build.dependencies().get("r2dbc-postgresql").getGroupId()).isEqualTo("io.r2dbc"); - } - - @Test - void r2dbcWithPostgresqlAndBorca() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("postgresql"); @@ -117,16 +87,6 @@ void r2dbcWithPostgresqlAndBorca() { @Test void r2dbcWithSqlserver() { - Build build = createBuild(); - build.dependencies().add("data-r2dbc"); - build.dependencies().add("sqlserver"); - customize(build, Version.parse("2.7.6")); - assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "sqlserver", "r2dbc-mssql"); - assertThat(build.dependencies().get("r2dbc-mssql").getVersion()).isNull(); - } - - @Test - void r2dbcWithSqlserverAfterBorca() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("sqlserver"); @@ -137,7 +97,7 @@ void r2dbcWithSqlserverAfterBorca() { } @Test - void r2dbcWithOracleAfterBorca() { + void r2dbcWithOracle() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("oracle"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java index 8226484dc2..97482ed6c0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java @@ -31,19 +31,8 @@ class ThymeleafBuildCustomizerTests extends AbstractExtensionTests { @Test - void thymeleafWithSpringSecurityAndSpringBoot2AddsExtrasDependency() { + void thymeleafWithSpringSecurityAndSpringBootAddsExtrasDependency() { ProjectRequest projectRequest = createProjectRequest("thymeleaf", "security"); - projectRequest.setBootVersion("2.7.1"); - assertThat(mavenPom(projectRequest)).hasDependency(Dependency.createSpringBootStarter("thymeleaf")) - .hasDependency(Dependency.createSpringBootStarter("security")) - .hasDependency(Dependency.withId("thymeleaf-extras-spring-security", "org.thymeleaf.extras", - "thymeleaf-extras-springsecurity5")); - } - - @Test - void thymeleafWithSpringSecurityAndSpringBoot3AddsExtrasDependency() { - ProjectRequest projectRequest = createProjectRequest("thymeleaf", "security"); - projectRequest.setBootVersion("3.0.0-M1"); assertThat(mavenPom(projectRequest)).hasDependency(Dependency.createSpringBootStarter("thymeleaf")) .hasDependency(Dependency.createSpringBootStarter("security")) .hasDependency(Dependency.withId("thymeleaf-extras-spring-security", "org.thymeleaf.extras", @@ -54,7 +43,7 @@ void thymeleafWithSpringSecurityAndSpringBoot3AddsExtrasDependency() { void thymeleafWithoutSpringSecurityDoesNotAddExtrasDependency() { assertThat(mavenPom(createProjectRequest("thymeleaf", "web"))) .hasDependency(Dependency.createSpringBootStarter("thymeleaf")) - .doesNotHaveDependency("org.thymeleaf.extras", "thymeleaf-extras-springsecurity5"); + .doesNotHaveDependency("org.thymeleaf.extras", "thymeleaf-extras-springsecurity6"); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java index d144179595..8418d1bccb 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java @@ -31,32 +31,9 @@ class VaadinProjectGenerationConfigurationTests extends AbstractExtensionTests { @Test - void mavenBuildWithVaadin23AddProductionProfileWithProductionModeFlag() { + void mavenBuildWithVaadinAddProductionProfileWithoutProductionModeFlag() { ProjectRequest request = createProjectRequest("vaadin", "data-jpa"); - request.setBootVersion("2.7.10"); - assertThat(mavenPom(request)).hasProfile("production") - .lines() - .containsSequence(" ", " production", " ", - " ", " ", - " com.vaadin", - " vaadin-maven-plugin", - " ${vaadin.version}", - " ", " ", - " frontend", - " compile", " ", - " prepare-frontend", - " build-frontend", - " ", " ", - " true", - " ", " ", - " ", " ", " ", - " ", " "); - } - - @Test - void mavenBuildWithVaadin24AddProductionProfileWithoutProductionModeFlag() { - ProjectRequest request = createProjectRequest("vaadin", "data-jpa"); - request.setBootVersion("3.0.0"); + request.setBootVersion("3.1.0"); assertThat(mavenPom(request)).hasProfile("production") .lines() .containsSequence(" ", " production", " ", @@ -111,7 +88,7 @@ void gitIgnoreWithoutVaadinDoesNotIgnoreNodeModules() { @Override protected ProjectRequest createProjectRequest(String... dependencies) { ProjectRequest request = super.createProjectRequest(dependencies); - request.setBootVersion("2.7.13"); + request.setBootVersion("3.1.0"); return request; } diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index 77e951e50b..f5f688cc31 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -36,27 +36,15 @@ class JavaVersionProjectDescriptionCustomizerTests extends AbstractExtensionTest @Test void javaUnknownVersionIsLeftAsIs() { - assertThat(mavenPom(javaProject("9999999", "2.7.13"))).hasProperty("java.version", "9999999"); + assertThat(mavenPom(javaProject("9999999", "3.1.0"))).hasProperty("java.version", "9999999"); } @Test void javaInvalidVersionIsLeftAsIs() { - assertThat(mavenPom(javaProject("${another.version}", "2.7.13"))).hasProperty("java.version", + assertThat(mavenPom(javaProject("${another.version}", "3.1.0"))).hasProperty("java.version", "${another.version}"); } - @Test - void java8IsNotCompatibleWithSpringBoot3() { - ProjectRequest request = javaProject("1.8", "3.0.0"); - assertThat(mavenPom(request)).hasProperty("java.version", "17"); - } - - @Test - void java11IsNotCompatibleWithSpringBoot3() { - ProjectRequest request = javaProject("11", "3.0.0"); - assertThat(mavenPom(request)).hasProperty("java.version", "17"); - } - @ParameterizedTest(name = "{0} - Java {1} - Spring Boot {2}") @MethodSource("supportedMavenParameters") void mavenBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String language, String javaVersion, @@ -72,6 +60,11 @@ void gradleGroovyBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String lan assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasSourceCompatibility(javaVersion); } + @Test + void kotlinIsNotSupportedWithJava21() { + assertThat(mavenPom(kotlinProject("21", "3.1.0"))).hasProperty("java.version", "17"); + } + static Stream supportedMavenParameters() { return Stream.concat(supportedJavaParameters(), Stream.concat(supportedKotlinParameters(), supportedGroovyParameters())); @@ -82,50 +75,15 @@ static Stream supportedGradleGroovyParameters() { } private static Stream supportedJavaParameters() { - return Stream.of(java("19", "2.6.12"), java("20", "2.7.10"), java("21", "2.7.16")); + return Stream.of(java("17", "3.0.0"), java("19", "3.0.0"), java("20", "3.0.11"), java("21", "3.0.11")); } private static Stream supportedKotlinParameters() { - return Stream.of(kotlin("17", "2.6.0"), kotlin("19", "2.6.12"), kotlin("20", "2.7.10")); + return Stream.of(kotlin("17", "3.0.0"), kotlin("19", "3.0.0"), kotlin("20", "3.0.11")); } private static Stream supportedGroovyParameters() { - return Stream.of(groovy("19", "2.6.12"), groovy("20", "2.7.10"), groovy("21", "2.7.16")); - } - - @ParameterizedTest(name = "{0} - Java {1} - Spring Boot {2}") - @MethodSource("unsupportedMavenParameters") - void mavenBuildWithUnsupportedOptionsDowngradesToLts(String language, String javaVersion, - String springBootVersion) { - assertThat(mavenPom(project(language, javaVersion, springBootVersion))).hasProperty("java.version", "17"); - } - - @ParameterizedTest(name = "{0} - Java {1} - Spring Boot {2}") - @MethodSource("unsupportedGradleGroovyParameters") - void gradleGroovyBuildWithUnsupportedOptionsDowngradesToLts(String language, String javaVersion, - String springBootVersion) { - assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasSourceCompatibility("17"); - } - - static Stream unsupportedMavenParameters() { - return Stream.concat(unsupportedJavaParameters(), - Stream.concat(unsupportedKotlinParameters(), unsupportedGroovyParameters())); - } - - static Stream unsupportedGradleGroovyParameters() { - return Stream.concat(unsupportedJavaParameters(), unsupportedGroovyParameters()); - } - - private static Stream unsupportedJavaParameters() { - return Stream.of(java("19", "2.6.11"), java("20", "2.7.9"), java("21", "2.7.15")); - } - - private static Stream unsupportedKotlinParameters() { - return Stream.of(kotlin("19", "2.6.11"), kotlin("20", "2.7.9"), kotlin("21", "2.7.16")); - } - - private static Stream unsupportedGroovyParameters() { - return Stream.of(groovy("19", "2.6.11"), groovy("20", "2.7.9"), groovy("21", "2.7.15")); + return Stream.of(groovy("17", "3.0.0"), groovy("19", "3.0.0"), groovy("20", "3.0.11"), groovy("21", "3.0.11")); } private static Arguments java(String javaVersion, String springBootVersion) { @@ -152,4 +110,8 @@ private ProjectRequest javaProject(String javaVersion, String springBootVersion) return project("java", javaVersion, springBootVersion); } + private ProjectRequest kotlinProject(String javaVersion, String springBootVersion) { + return project("kotlin", javaVersion, springBootVersion); + } + } diff --git a/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java b/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java index 5ca991566d..eb4a160f14 100644 --- a/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java +++ b/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java @@ -70,11 +70,14 @@ void eolVersionsAreRemoved() { InitializrMetadata updatedMetadata = provider.update(metadata); assertThat(updatedMetadata.getBootVersions()).isNotNull(); List updatedBootVersions = updatedMetadata.getBootVersions().getContent(); - assertThat(updatedBootVersions).hasSize(4); - assertBootVersion(updatedBootVersions.get(0), "3.0.2 (SNAPSHOT)", false); - assertBootVersion(updatedBootVersions.get(1), "3.0.1", true); - assertBootVersion(updatedBootVersions.get(2), "2.7.8 (SNAPSHOT)", false); - assertBootVersion(updatedBootVersions.get(3), "2.7.7", false); + assertThat(updatedBootVersions).hasSize(7); + assertBootVersion(updatedBootVersions.get(0), "3.2.0 (SNAPSHOT)", false); + assertBootVersion(updatedBootVersions.get(1), "3.1.6 (SNAPSHOT)", false); + assertBootVersion(updatedBootVersions.get(2), "3.1.5", true); + assertBootVersion(updatedBootVersions.get(3), "3.0.13 (SNAPSHOT)", false); + assertBootVersion(updatedBootVersions.get(4), "3.0.12", false); + assertBootVersion(updatedBootVersions.get(5), "2.7.17 (SNAPSHOT)", false); + assertBootVersion(updatedBootVersions.get(6), "2.7.16", false); } @Test diff --git a/start-site/src/test/resources/metadata/springio/spring-boot.json b/start-site/src/test/resources/metadata/springio/spring-boot.json index 20aa37932a..22574f8a66 100644 --- a/start-site/src/test/resources/metadata/springio/spring-boot.json +++ b/start-site/src/test/resources/metadata/springio/spring-boot.json @@ -2,14 +2,14 @@ "_embedded": { "releases": [ { - "version": "3.0.2-SNAPSHOT", + "version": "3.2.0-SNAPSHOT", "status": "SNAPSHOT", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/3.0.2-SNAPSHOT/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/3.0.2-SNAPSHOT/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/3.2.0-SNAPSHOT/reference/html/", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/3.2.0-SNAPSHOT/api/", "_links": { "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/3.0.2-SNAPSHOT" + "href": "https://spring.io/api/projects/spring-boot/releases/3.2.0-SNAPSHOT" }, "repository": { "href": "https://spring.io/api/repositories/spring-snapshots" @@ -17,14 +17,59 @@ } }, { - "version": "3.0.1", + "version": "3.1.6-SNAPSHOT", + "status": "SNAPSHOT", + "current": false, + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/3.1.6-SNAPSHOT/reference/html/", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/3.1.6-SNAPSHOT/api/", + "_links": { + "self": { + "href": "https://spring.io/api/projects/spring-boot/releases/3.1.6-SNAPSHOT" + }, + "repository": { + "href": "https://spring.io/api/repositories/spring-snapshots" + } + } + }, + { + "version": "3.1.5", "status": "GENERAL_AVAILABILITY", "current": true, "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/current/reference/html/", "apiDocUrl": "https://docs.spring.io/spring-boot/docs/current/api/", "_links": { "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/3.0.1" + "href": "https://spring.io/api/projects/spring-boot/releases/3.1.5" + }, + "repository": { + "href": "https://spring.io/api/repositories/spring-releases" + } + } + }, + { + "version": "3.0.13-SNAPSHOT", + "status": "SNAPSHOT", + "current": false, + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/3.0.13-SNAPSHOT/reference/html/", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/3.0.13-SNAPSHOT/api/", + "_links": { + "self": { + "href": "https://spring.io/api/projects/spring-boot/releases/3.0.13-SNAPSHOT" + }, + "repository": { + "href": "https://spring.io/api/repositories/spring-snapshots" + } + } + }, + { + "version": "3.0.12", + "status": "GENERAL_AVAILABILITY", + "current": false, + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/current/reference/html/", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/current/api/", + "_links": { + "self": { + "href": "https://spring.io/api/projects/spring-boot/releases/3.0.12" }, "repository": { "href": "https://spring.io/api/repositories/spring-releases" @@ -32,14 +77,14 @@ } }, { - "version": "2.7.8-SNAPSHOT", + "version": "2.7.17-SNAPSHOT", "status": "SNAPSHOT", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.8-SNAPSHOT/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.8-SNAPSHOT/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.17-SNAPSHOT/reference/html/", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.17-SNAPSHOT/api/", "_links": { "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/2.7.8-SNAPSHOT" + "href": "https://spring.io/api/projects/spring-boot/releases/2.7.17-SNAPSHOT" }, "repository": { "href": "https://spring.io/api/repositories/spring-snapshots" @@ -47,14 +92,14 @@ } }, { - "version": "2.7.7", + "version": "2.7.16", "status": "GENERAL_AVAILABILITY", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.7/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.7/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.16/reference/html/", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.16/api/", "_links": { "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/2.7.7" + "href": "https://spring.io/api/projects/spring-boot/releases/2.7.16" }, "repository": { "href": "https://spring.io/api/repositories/spring-releases" From 531eb6321fcb52fa3a5a5a234bb23ea23f37d287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Tue, 7 Nov 2023 13:08:21 +0100 Subject: [PATCH 293/825] Adapt tests to deprecation of Spring Boot 3.0.x See gh-1330 --- ...ctiveMQProjectGenerationConfiguration.java | 20 ---- ...GraalVmProjectGenerationConfiguration.java | 2 - ...ePluginGroovyDslGradleBuildCustomizer.java | 12 +- ...ePluginKotlinDslGradleBuildCustomizer.java | 12 +- ...abilityProjectGenerationConfiguration.java | 7 -- .../WavefrontHelpDocumentCustomizer.java | 62 ---------- .../springdata/R2dbcBuildCustomizer.java | 29 +---- .../R2dbcHelpDocumentCustomizer.java | 16 +-- ...ingDataProjectGenerationConfiguration.java | 11 +- ...tainersProjectGenerationConfiguration.java | 106 ++++++++---------- ...vaVersionProjectDescriptionCustomizer.java | 2 - ...uildSystemHelpDocumentCustomizerTests.java | 10 +- ...uildSystemHelpDocumentCustomizerTests.java | 10 +- ...MQProjectGenerationConfigurationTests.java | 34 ------ ...VmProjectGenerationConfigurationTests.java | 43 +------ ...tyProjectGenerationConfigurationTests.java | 9 +- .../WavefrontHelpDocumentCustomizerTests.java | 78 ------------- .../okta/OktaHelpDocumentCustomizerTests.java | 2 +- .../SolaceBinderBuildCustomizerTests.java | 10 +- ...otProjectGenerationConfigurationTests.java | 11 +- .../springdata/R2dbcBuildCustomizerTests.java | 21 +--- .../R2dbcHelpDocumentCustomizerTests.java | 15 +-- ...arProjectGenerationConfigurationTests.java | 30 ++--- ...rsProjectGenerationConfigurationTests.java | 39 +++---- ...JvmVersionHelpDocumentCustomizerTests.java | 4 +- ...sionProjectDescriptionCustomizerTests.java | 6 +- 26 files changed, 128 insertions(+), 473 deletions(-) delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java delete mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java index 78140df2fc..211130656c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java @@ -19,15 +19,12 @@ import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections.ServiceConnection; import io.spring.start.site.container.ServiceConnectionsCustomizer; import org.springframework.context.annotation.Bean; -import org.springframework.core.Ordered; /** * Configuration for generation of projects that depend on ActiveMQ. @@ -54,21 +51,4 @@ ComposeFileCustomizer activeMQComposeFileCustomizer(DockerServiceResolver servic (service) -> composeFile.services().add("activemq", service)); } - @ConditionalOnPlatformVersion("[3.0.0-M1,3.1.0-RC1)") - static class SpringBoot30Configuration { - - @Bean - BuildCustomizer activeMQNotSupportedBuildCustomizer() { - return BuildCustomizer.ordered(Ordered.HIGHEST_PRECEDENCE + 5, - (build) -> build.dependencies().remove("activemq")); - } - - @Bean - HelpDocumentCustomizer activeMQNotSupportedHelpDocumentCustomizer() { - return (helpDocument) -> helpDocument.getWarnings() - .addItem("ActiveMQ is not supported with Spring Boot 3.0"); - } - - } - } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java index 2081f5922e..8711533bf9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java @@ -23,7 +23,6 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.condition.ProjectGenerationCondition; import io.spring.initializr.generator.language.groovy.GroovyLanguage; @@ -48,7 +47,6 @@ */ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("native") -@ConditionalOnPlatformVersion("3.0.0-M1") @Conditional(CompatibleLanguageCondition.class) class GraalVmProjectGenerationConfiguration { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java index d1cff3c514..46427aa5d6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java @@ -40,21 +40,11 @@ public void customize(GradleBuild build) { writer.println("hibernate {"); writer.indented(() -> { writer.println("enhancement {"); - writer.indented(() -> { - if (!isHibernate62Available()) { - writer.println("enableLazyInitialization = true"); - writer.println("enableDirtyTracking = true"); - } - writer.println("enableAssociationManagement = true"); - }); + writer.indented(() -> writer.println("enableAssociationManagement = true")); writer.println("}"); }); writer.println("}"); }); } - private boolean isHibernate62Available() { - return this.hibernateVersion.getMajor() >= 6 && this.hibernateVersion.getMinor() >= 2; - } - } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java index c3a16f08e8..683ec763a5 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java @@ -40,21 +40,11 @@ public void customize(GradleBuild build) { writer.println("hibernate {"); writer.indented(() -> { writer.println("enhancement {"); - writer.indented(() -> { - if (!isHibernate62Available()) { - writer.println("enableLazyInitialization.set(true)"); - writer.println("enableDirtyTracking.set(true)"); - } - writer.println("enableAssociationManagement.set(true)"); - }); + writer.indented(() -> writer.println("enableAssociationManagement.set(true)")); writer.println("}"); }); writer.println("}"); }); } - private boolean isHibernate62Available() { - return this.hibernateVersion.getMajor() >= 6 && this.hibernateVersion.getMinor() >= 2; - } - } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java index 559807afad..1481b543b0 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java @@ -18,7 +18,6 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; -import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; @@ -53,12 +52,6 @@ ObservabilityHelpDocumentCustomizer observabilityHelpDocumentCustomizer(ProjectD return new ObservabilityHelpDocumentCustomizer(description, build); } - @Bean - @ConditionalOnRequestedDependency("wavefront") - WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { - return new WavefrontHelpDocumentCustomizer(build); - } - } @Configuration(proxyBeanMethods = false) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java deleted file mode 100644 index 0d6cca3481..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.observability; - -import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.spring.documentation.HelpDocument; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; - -/** - * A {@link HelpDocumentCustomizer} that provides additional references when Wavefront is - * selected. - * - * @author Stephane Nicoll - * @author Brian Clozel - */ -class WavefrontHelpDocumentCustomizer implements HelpDocumentCustomizer { - - private final Build build; - - WavefrontHelpDocumentCustomizer(Build build) { - this.build = build; - } - - @Override - public void customize(HelpDocument document) { - document.gettingStarted() - .addReferenceDocLink("https://docs.wavefront.com/wavefront_springboot3.html", - "Wavefront for Spring Boot documentation"); - - StringBuilder sb = new StringBuilder(); - sb.append(String.format("## Observability with Wavefront%n%n")); - sb.append(String - .format("If you don't have a Wavefront account, the starter will create a freemium account for you.%n")); - sb.append(String.format("The URL to access the Wavefront Service dashboard is logged on startup.%n")); - - if (this.build.dependencies().has("web") || this.build.dependencies().has("webflux")) { - sb.append( - String.format("%nYou can also access your dashboard using the `/actuator/wavefront` endpoint.%n")); - } - - if (!this.build.dependencies().has("distributed-tracing")) { - sb.append(String.format( - "%nFinally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry.%n")); - } - document.addSection((writer) -> writer.print(sb)); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java index d8fd003301..11c1c5b879 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizer.java @@ -25,9 +25,6 @@ import io.spring.initializr.generator.buildsystem.DependencyContainer; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import io.spring.initializr.generator.version.VersionReference; /** @@ -44,42 +41,22 @@ public class R2dbcBuildCustomizer implements BuildCustomizer { private static final List JDBC_DEPENDENCY_IDS = Arrays.asList("jdbc", "data-jdbc", "data-jpa"); - private static final VersionRange SPRING_BOOT_3_0_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.0.0-M1"); - - private static final VersionRange SPRING_BOOT_3_1_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.1.0"); - - private final boolean mariaDbIsUnmanaged; - - private final boolean sqlServerIsUnmanaged; - - private final boolean mysqlR2dbcIsAsyncerDependency; - - public R2dbcBuildCustomizer(Version platformVersion) { - this.mariaDbIsUnmanaged = SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion); - this.sqlServerIsUnmanaged = SPRING_BOOT_3_0_0_OR_LATER.match(platformVersion); - this.mysqlR2dbcIsAsyncerDependency = SPRING_BOOT_3_1_0_OR_LATER.match(platformVersion); - } - @Override public void customize(Build build) { if (build.dependencies().has("h2")) { addManagedDriver(build.dependencies(), "io.r2dbc", "r2dbc-h2"); } if (build.dependencies().has("mariadb")) { - addManagedDriver(build.dependencies(), "org.mariadb", "r2dbc-mariadb", - this.mariaDbIsUnmanaged ? "1.1.3" : null); + addManagedDriver(build.dependencies(), "org.mariadb", "r2dbc-mariadb", "1.1.3"); } if (build.dependencies().has("mysql")) { - if (this.mysqlR2dbcIsAsyncerDependency) { - addManagedDriver(build.dependencies(), "io.asyncer", "r2dbc-mysql"); - } + addManagedDriver(build.dependencies(), "io.asyncer", "r2dbc-mysql"); } if (build.dependencies().has("postgresql")) { addManagedDriver(build.dependencies(), "org.postgresql", "r2dbc-postgresql"); } if (build.dependencies().has("sqlserver")) { - addManagedDriver(build.dependencies(), "io.r2dbc", "r2dbc-mssql", - this.sqlServerIsUnmanaged ? "1.0.0.RELEASE" : null); + addManagedDriver(build.dependencies(), "io.r2dbc", "r2dbc-mssql", "1.0.0.RELEASE"); } if (build.dependencies().has("oracle")) { addManagedDriver(build.dependencies(), "com.oracle.database.r2dbc", "oracle-r2dbc"); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java index dd4f432597..b3e5bca39d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizer.java @@ -16,15 +16,11 @@ package io.spring.start.site.extension.dependency.springdata; -import java.util.ArrayList; import java.util.List; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds a section when R2DBC is selected but no @@ -34,23 +30,17 @@ */ public class R2dbcHelpDocumentCustomizer implements HelpDocumentCustomizer { - private static final VersionRange SPRING_BOOT_3_1_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.1.0"); + private static final List DRIVERS = List.of("h2", "mariadb", "mysql", "postgresql", "sqlserver", "oracle"); private final Build build; - private final List drivers; - - public R2dbcHelpDocumentCustomizer(Build build, Version platformVersion) { + public R2dbcHelpDocumentCustomizer(Build build) { this.build = build; - this.drivers = new ArrayList<>(List.of("h2", "mariadb", "postgresql", "sqlserver", "oracle")); - if (SPRING_BOOT_3_1_0_OR_LATER.match(platformVersion)) { - this.drivers.add("mysql"); - } } @Override public void customize(HelpDocument document) { - if (this.build.dependencies().ids().noneMatch(this.drivers::contains)) { + if (this.build.dependencies().ids().noneMatch(DRIVERS::contains)) { document.addSection((writer) -> { writer.println("## Missing R2DBC Driver"); writer.println(); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java index 756e2bcd50..3471702f7f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springdata/SpringDataProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import org.springframework.context.annotation.Bean; @@ -33,14 +32,14 @@ public class SpringDataProjectGenerationConfiguration { @Bean @ConditionalOnRequestedDependency("data-r2dbc") - public R2dbcBuildCustomizer r2dbcBuildCustomizer(ProjectDescription description) { - return new R2dbcBuildCustomizer(description.getPlatformVersion()); + public R2dbcBuildCustomizer r2dbcBuildCustomizer() { + return new R2dbcBuildCustomizer(); } @Bean @ConditionalOnRequestedDependency("data-r2dbc") - public R2dbcHelpDocumentCustomizer r2dbcHelpDocumentCustomizer(Build build, ProjectDescription description) { - return new R2dbcHelpDocumentCustomizer(build, description.getPlatformVersion()); + public R2dbcHelpDocumentCustomizer r2dbcHelpDocumentCustomizer(Build build) { + return new R2dbcHelpDocumentCustomizer(build); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java index 4362a230bc..c3fb82a02f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java @@ -66,75 +66,67 @@ public ImplicitDependencyHelpDocumentCustomizer testcontainersHelpCustomizer(Bui return new ImplicitDependencyHelpDocumentCustomizer(this.dependencies, build); } + @Bean + ServiceConnections serviceConnections(ObjectProvider customizers) { + ServiceConnections serviceConnections = new ServiceConnections(); + customizers.orderedStream().forEach((customizer) -> customizer.customize(serviceConnections)); + return serviceConnections; + } + @Configuration(proxyBeanMethods = false) - @ConditionalOnPlatformVersion("3.1.0-RC1") - static class SpringBoot31Configuration { + static class SpringBootSupportConfiguration { @Bean - ServiceConnections serviceConnections(ObjectProvider customizers) { - ServiceConnections serviceConnections = new ServiceConnections(); - customizers.orderedStream().forEach((customizer) -> customizer.customize(serviceConnections)); - return serviceConnections; + BuildCustomizer springBootTestcontainersBuildCustomizer() { + return (build) -> build.dependencies() + .add("spring-boot-testcontainers", + Dependency.withCoordinates("org.springframework.boot", "spring-boot-testcontainers") + .scope(DependencyScope.TEST_COMPILE)); } - @Configuration(proxyBeanMethods = false) - static class SpringBootSupportConfiguration { + @Bean + TestContainersHelpDocumentCustomizer springBootTestcontainersHelpDocumentCustomizer( + ProjectDescription description, ServiceConnections serviceConnections) { + return new TestContainersHelpDocumentCustomizer(description, serviceConnections); + } + + } + + @Configuration(proxyBeanMethods = false) + static class TestApplicationConfiguration { - @Bean - BuildCustomizer springBootTestcontainersBuildCustomizer() { - return (build) -> build.dependencies() - .add("spring-boot-testcontainers", - Dependency.withCoordinates("org.springframework.boot", "spring-boot-testcontainers") - .scope(DependencyScope.TEST_COMPILE)); + private final ProjectDescription description; - } + private final IndentingWriterFactory indentingWriterFactory; - @Bean - TestContainersHelpDocumentCustomizer springBootTestcontainersHelpDocumentCustomizer( - ProjectDescription description, ServiceConnections serviceConnections) { - return new TestContainersHelpDocumentCustomizer(description, serviceConnections); - } + TestApplicationConfiguration(ProjectDescription description, IndentingWriterFactory indentingWriterFactory) { + this.description = description; + this.indentingWriterFactory = indentingWriterFactory; + } + @Bean + @ConditionalOnLanguage(GroovyLanguage.ID) + GroovyTestContainersApplicationCodeProjectContributor groovyTestContainersApplicationCodeProjectContributor( + ServiceConnections serviceConnections) { + return new GroovyTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, + this.description, serviceConnections); } - @Configuration(proxyBeanMethods = false) - static class TestApplicationConfiguration { - - private final ProjectDescription description; - - private final IndentingWriterFactory indentingWriterFactory; - - TestApplicationConfiguration(ProjectDescription description, - IndentingWriterFactory indentingWriterFactory) { - this.description = description; - this.indentingWriterFactory = indentingWriterFactory; - } - - @Bean - @ConditionalOnLanguage(GroovyLanguage.ID) - GroovyTestContainersApplicationCodeProjectContributor groovyTestContainersApplicationCodeProjectContributor( - ServiceConnections serviceConnections) { - return new GroovyTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, - this.description, serviceConnections); - } - - @Bean - @ConditionalOnLanguage(KotlinLanguage.ID) - @ConditionalOnPlatformVersion("3.1.1-SNAPSHOT") // https://github.com/spring-projects/spring-boot/issues/35756 - KotlinTestContainersApplicationCodeProjectContributor kotlinTestContainersApplicationCodeProjectContributor( - ServiceConnections serviceConnections) { - return new KotlinTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, - this.description, serviceConnections); - } - - @Bean - @ConditionalOnLanguage(JavaLanguage.ID) - JavaTestContainersApplicationCodeProjectContributor javaTestContainersApplicationCodeProjectContributor( - ServiceConnections serviceConnections) { - return new JavaTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, - this.description, serviceConnections); - } + @Bean + @ConditionalOnLanguage(KotlinLanguage.ID) + @ConditionalOnPlatformVersion("3.1.1-SNAPSHOT") // https://github.com/spring-projects/spring-boot/issues/35756 + KotlinTestContainersApplicationCodeProjectContributor kotlinTestContainersApplicationCodeProjectContributor( + ServiceConnections serviceConnections) { + return new KotlinTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, + this.description, serviceConnections); + } + @Bean + @ConditionalOnLanguage(JavaLanguage.ID) + JavaTestContainersApplicationCodeProjectContributor javaTestContainersApplicationCodeProjectContributor( + ServiceConnections serviceConnections) { + return new JavaTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, + this.description, serviceConnections); } } diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index 8d49b04304..402dc82d90 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -23,7 +23,6 @@ import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; -import io.spring.initializr.generator.version.Version; /** * Validate that the requested java version is compatible with the chosen Spring Boot @@ -50,7 +49,6 @@ public void customize(MutableProjectDescription description) { if (javaGeneration < 17) { updateTo(description, "17"); } - Version platformVersion = description.getPlatformVersion(); if (javaGeneration == 21) { // Kotlin does not support Java 21 bytecodes yet if (description.getLanguage() instanceof KotlinLanguage) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java index c1cf2954c7..860ae36d26 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java @@ -33,19 +33,19 @@ class GradleBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTest @Test void linksAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", "3.0.0").contains( + assertHelpDocument("gradle-build", "3.1.0").contains( "* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.0.0/gradle-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.0.0/gradle-plugin/reference/html/#build-image)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.1.0/gradle-plugin/reference/html/)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.1.0/gradle-plugin/reference/html/#build-image)"); } @Test void linksNotAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", "3.0.0").doesNotContain( + assertHelpDocument("maven-build", "3.1.0").doesNotContain( "* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.0.0/gradle-plugin/reference/html/)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.1.0/gradle-plugin/reference/html/)"); } private ListAssert assertHelpDocument(String type, String version) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java index b9a806d793..48aba4a766 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java @@ -33,17 +33,17 @@ class MavenBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests @Test void linksAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", "3.0.0").contains( + assertHelpDocument("maven-build", "3.1.0").contains( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.0.0/maven-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.0.0/maven-plugin/reference/html/#build-image)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.1.0/maven-plugin/reference/html/)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.1.0/maven-plugin/reference/html/#build-image)"); } @Test void linksNotAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", "3.0.0").doesNotContain( + assertHelpDocument("gradle-build", "3.1.0").doesNotContain( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.0.0/maven-plugin/)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.1.0/maven-plugin/)"); } private ListAssert assertHelpDocument(String type, String version) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java index 98f04ec3f9..c965a755cc 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java @@ -16,7 +16,6 @@ package io.spring.start.site.extension.dependency.activemq; -import io.spring.initializr.generator.test.io.TextAssert; import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; @@ -33,34 +32,6 @@ */ class ActiveMQProjectGenerationConfigurationTests extends AbstractExtensionTests { - @Test - void activeMQWithSpringBoot30RemovesDependency() { - ProjectRequest request = createProjectRequest("activemq"); - request.setBootVersion("3.0.0"); - assertThat(mavenPom(request)).doesNotHaveDependency("org.springframework.boot", "spring-boot-starter-activemq"); - } - - @Test - void activeMQWithSpringBoot31KeepsDependency() { - ProjectRequest request = createProjectRequest("activemq"); - request.setBootVersion("3.1.0"); - assertThat(mavenPom(request)).hasDependency("org.springframework.boot", "spring-boot-starter-activemq"); - } - - @Test - void activeMQWithSpringBoot30AddsWarning() { - ProjectRequest request = createProjectRequest("activemq"); - request.setBootVersion("3.0.0"); - assertHelpDocument(request).contains("ActiveMQ is not supported with Spring Boot 3.0"); - } - - @Test - void activeMQWithSpringBoot31DoesNotAddWarning() { - ProjectRequest request = createProjectRequest("activemq"); - request.setBootVersion("3.1.0"); - assertHelpDocument(request).doesNotContain("ActiveMQ is not supported with Spring Boot 3.0"); - } - @Test void dockerComposeWhenDockerComposeIsNotSelectedDoesNotCreateService() { ProjectRequest request = createProjectRequest("web", "activemq"); @@ -83,9 +54,4 @@ void dockerComposeCreatesAppropriateService() { assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/activemq.yaml")); } - private TextAssert assertHelpDocument(ProjectRequest request) { - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); - } - } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index 28443ecc01..c340944bca 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -38,21 +38,18 @@ class GraalVmProjectGenerationConfigurationTests extends AbstractExtensionTests @Test void gradleBuildWithoutNativeDoesNotConfigureNativeBuildTools() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("3.0.0"); assertThat(gradleBuild(request)).doesNotContain("org.graalvm.buildtools.native"); } @Test void mavenBuildWithoutNativeDoesNotConfigureNativeBuildTools() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("3.0.0"); assertThat(mavenPom(request)).doesNotContain("native-maven-plugin"); } @Test void mavenBuildConfigureNativeBuildtoolsPlugint() { ProjectRequest request = createNativeProjectRequest(); - request.setBootVersion("3.0.0"); assertThat(mavenPom(request)).lines().containsSequence( // @formatter:off " ", @@ -65,9 +62,9 @@ void mavenBuildConfigureNativeBuildtoolsPlugint() { @Test void gradleBuildConfigureNativeBuildToolsPlugin(@TempDir Path temp) { String nbtVersion = NativeBuildtoolsVersionResolver.resolve(MavenVersionResolver.withCacheLocation(temp), - Version.parse("3.0.0")); + Version.parse("3.1.0")); ProjectRequest request = createNativeProjectRequest(); - request.setBootVersion("3.0.0"); + request.setBootVersion("3.1.0"); assertThat(gradleBuild(request)).hasPlugin("org.graalvm.buildtools.native", nbtVersion); } @@ -76,26 +73,9 @@ void gradleBuildWithoutJpaDoesNotConfigureHibernateEnhancePlugin() { assertThat(gradleBuild(createNativeProjectRequest())).doesNotContain("org.hibernate.orm"); } - @Test - void gradleBuildAndGroovyDslWithJpaAndHibernate61ConfiguresHibernateEnhancePlugin() { - ProjectRequest request = createNativeProjectRequest("data-jpa"); - request.setBootVersion("3.0.0"); - assertThat(gradleBuild(request)).hasPlugin("org.hibernate.orm").lines().containsSequence( - // @formatter:off - "hibernate {", - " enhancement {", - " enableLazyInitialization = true", - " enableDirtyTracking = true", - " enableAssociationManagement = true", - " }", - "}"); - // @formatter:on - } - @Test void gradleBuildAndGroovyDslWithJpaConfiguresHibernateEnhancePlugin() { ProjectRequest request = createNativeProjectRequest("data-jpa"); - request.setBootVersion("3.1.0"); assertThat(gradleBuild(request)).hasPlugin("org.hibernate.orm").lines().containsSequence( // @formatter:off "hibernate {", @@ -106,26 +86,9 @@ void gradleBuildAndGroovyDslWithJpaConfiguresHibernateEnhancePlugin() { // @formatter:on } - @Test - void gradleBuildAndKotlinDslWithJpaAndHibernate61ConfiguresHibernateEnhancePlugin() { - ProjectRequest request = createNativeProjectRequest("data-jpa"); - request.setBootVersion("3.0.0"); - assertThat(gradleKotlinDslBuild(request)).hasPlugin("org.hibernate.orm").lines().containsSequence( - // @formatter:off - "hibernate {", - " enhancement {", - " enableLazyInitialization.set(true)", - " enableDirtyTracking.set(true)", - " enableAssociationManagement.set(true)", - " }", - "}"); - // @formatter:on - } - @Test void gradleBuildAndKotlinDslWithJpaConfiguresHibernateEnhancePlugin() { ProjectRequest request = createNativeProjectRequest("data-jpa"); - request.setBootVersion("3.1.0"); assertThat(gradleKotlinDslBuild(request)).hasPlugin("org.hibernate.orm").lines().containsSequence( // @formatter:off "hibernate {", @@ -176,7 +139,7 @@ void groovyProjectDoesNotConfigureGraalVm() { private ProjectRequest createNativeProjectRequest(String... dependencies) { ProjectRequest projectRequest = createProjectRequest(dependencies); projectRequest.getDependencies().add(0, "native"); - projectRequest.setBootVersion("3.0.0"); + projectRequest.setBootVersion("3.1.0"); return projectRequest; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfigurationTests.java index c29e83f85a..259b656094 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfigurationTests.java @@ -32,26 +32,25 @@ class ObservabilityProjectGenerationConfigurationTests extends AbstractExtension @Test void zipkinAddsDistributedTracingIfNecessary() { - assertThat(generateProject("3.0.0", "zipkin")).mavenBuild() + assertThat(generateProject("zipkin")).mavenBuild() .hasDependency(getDependency("zipkin")) .hasDependency(getDependency("distributed-tracing")); } @Test void wavefrontDoesNotAddDistributedTracingByDefault() { - assertThat(generateProject("3.0.0", "wavefront")).mavenBuild() + assertThat(generateProject("wavefront")).mavenBuild() .doesNotHaveDependency("io.micrometer", "micrometer-tracing-reporter-wavefront"); } @Test void wavefrontWithDistributedTracingConfigureReport() { - assertThat(generateProject("3.0.0", "wavefront", "distributed-tracing")).mavenBuild() + assertThat(generateProject("wavefront", "distributed-tracing")).mavenBuild() .hasDependency("io.micrometer", "micrometer-tracing-reporter-wavefront", null, "runtime"); } - private ProjectStructure generateProject(String bootVersion, String... dependencies) { + private ProjectStructure generateProject(String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(bootVersion); request.setType("maven-build"); return generateProject(request); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java deleted file mode 100644 index 258dd92088..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.observability; - -import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.assertj.core.api.ListAssert; -import org.junit.jupiter.api.Test; - -/** - * Tests for {@link WavefrontHelpDocumentCustomizer}. - * - * @author Stephane Nicoll - * @author Brian Clozel - */ -class WavefrontHelpDocumentCustomizerTests extends AbstractExtensionTests { - - @Test - void wavefrontAddGeneralSection() { - assertHelpDocument("3.0.0", "wavefront").contains("## Observability with Wavefront", "", - "If you don't have a Wavefront account, the starter will create a freemium account for you.", - "The URL to access the Wavefront Service dashboard is logged on startup."); - } - - @Test - void wavefrontWithoutWebApplicationDoesNotAddActuatorSection() { - assertHelpDocument("3.0.0", "wavefront") - .doesNotContain("You can also access your dashboard using the `/actuator/wavefront` endpoint."); - } - - @Test - void wavefrontWithWebApplicationAddActuatorSection() { - assertHelpDocument("3.0.0", "wavefront", "web") - .contains("You can also access your dashboard using the `/actuator/wavefront` endpoint."); - } - - @Test - void wavefrontWithoutSleuthAddTracingNote() { - assertHelpDocument("3.0.0", "wavefront") - .contains("Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); - } - - @Test - void wavefrontWithSleuthDoesNotAddTracingNote() { - assertHelpDocument("3.0.0", "wavefront", "distributed-tracing").doesNotContain( - "Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); - } - - @Test - void springBootWavefrontReference() { - assertHelpDocument("3.0.0", "wavefront").contains( - "* [Wavefront for Spring Boot documentation](https://docs.wavefront.com/wavefront_springboot3.html)"); - } - - private ListAssert assertHelpDocument(String version, String... dependencies) { - ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(version); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java index 49ca7678fb..65cb81abba 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java @@ -41,7 +41,7 @@ void oktaSectionWithoutOktaDependencyIsMissing() { private TextAssert assertHelpDocument(String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion("3.0.0"); + request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java index 88245d53a5..fa1f585ba5 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java @@ -40,7 +40,7 @@ void binderNotAddedWhenSolaceNotSelected() { @Test void binderNotAddedWhenCloudStreamNotSelected() { ProjectRequest request = createProjectRequest("solace"); - request.setBootVersion("3.0.0"); + request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); assertNoBinder(project); assertThat(project).mavenBuild().hasDependency(getDependency("solace")); @@ -49,7 +49,7 @@ void binderNotAddedWhenCloudStreamNotSelected() { @Test void binderAddedWhenSolaceAndCloudStreamSelected() { ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion("3.0.0"); + request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("com.solace.spring.cloud", "spring-cloud-starter-stream-solace"); } @@ -57,7 +57,7 @@ void binderAddedWhenSolaceAndCloudStreamSelected() { @Test void bomAddedWhenSolaceAndCloudStreamSelected() { ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion("3.0.0"); + request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasBom("com.solace.spring.cloud", "solace-spring-cloud-bom", "${solace-spring-cloud.version}"); @@ -65,7 +65,7 @@ void bomAddedWhenSolaceAndCloudStreamSelected() { @Test void bomPropertyAddedWhenSolaceAndCloudStreamSelected() { - String platformVersion = "3.0.0"; + String platformVersion = "3.1.0"; ProjectRequest request = createProjectRequest("solace", "cloud-stream"); request.setBootVersion(platformVersion); ProjectStructure project = generateProject(request); @@ -76,7 +76,7 @@ void bomPropertyAddedWhenSolaceAndCloudStreamSelected() { @Test void solaceStarterRemovedWhenSolaceAndCloudStreamSelected() { ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion("3.0.0"); + request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); Dependency solace = getDependency("solace"); assertThat(project).mavenBuild().doesNotHaveDependency(solace.getGroupId(), solace.getArtifactId()); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java index 313f79a920..cedf203ac6 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java @@ -51,7 +51,6 @@ void devtoolsAbsentDoesNotChangeOptional() { @Test void dockerComposeSupportHasOptionalScope() { ProjectRequest request = createProjectRequest("docker-compose"); - request.setBootVersion("3.1.0-RC1"); assertThat(mavenPom(request)) .hasText("/project/dependencies/dependency[2]/artifactId", "spring-boot-docker-compose") .hasText("/project/dependencies/dependency[2]/scope", "runtime") @@ -103,11 +102,19 @@ void gradleWithoutDevtoolsDoesNotCreateDevelopmentOnlyConfiguration() { @Test void gradleWithDockerComposeSupportUsesDevelopmentOnly() { ProjectRequest request = createProjectRequest("docker-compose"); - request.setBootVersion("3.1.0-RC1"); assertThat(gradleBuild(request)).lines() .contains("\tdevelopmentOnly 'org.springframework.boot:spring-boot-docker-compose'"); } + @Test + void mavenWithDockerComposeSupportHasOptionalScope() { + ProjectRequest request = createProjectRequest("docker-compose"); + assertThat(mavenPom(request)) + .hasText("/project/dependencies/dependency[2]/artifactId", "spring-boot-docker-compose") + .hasText("/project/dependencies/dependency[2]/scope", "runtime") + .hasText("/project/dependencies/dependency[2]/optional", "true"); + } + @Test void springBoot31WithGroovyDslConfiguresJammyBaseBuilder() { ProjectRequest request = createProjectRequest(); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java index b4ce555980..abb43ae8e0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcBuildCustomizerTests.java @@ -57,20 +57,11 @@ void r2dbcWithMariadb() { } @Test - void r2dbcWithMysqlBeforeSpringBoot31() { + void r2dbcWithMysql() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("mysql"); - customize(build, Version.parse("3.0.0")); - assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "mysql"); - } - - @Test - void r2dbcWithMysqlAndSpringBoot31() { - Build build = createBuild(); - build.dependencies().add("data-r2dbc"); - build.dependencies().add("mysql"); - customize(build, Version.parse("3.1.0")); + customize(build); assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "mysql", "r2dbc-mysql"); assertThat(build.dependencies().get("r2dbc-mysql").getGroupId()).isEqualTo("io.asyncer"); } @@ -80,7 +71,7 @@ void r2dbcWithPostgresql() { Build build = createBuild(); build.dependencies().add("data-r2dbc"); build.dependencies().add("postgresql"); - customize(build, Version.parse("3.0.0-M2")); + customize(build); assertThat(build.dependencies().ids()).containsOnly("data-r2dbc", "postgresql", "r2dbc-postgresql"); assertThat(build.dependencies().get("r2dbc-postgresql").getGroupId()).isEqualTo("org.postgresql"); } @@ -151,11 +142,7 @@ private Build createBuild() { } private void customize(Build build) { - customize(build, getDefaultPlatformVersion(getMetadata())); - } - - private void customize(Build build, Version platformVersion) { - new R2dbcBuildCustomizer(platformVersion).customize(build); + new R2dbcBuildCustomizer().customize(build); } private Version getDefaultPlatformVersion(InitializrMetadata metadata) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java index a69ad589ae..9ab9dec385 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springdata/R2dbcHelpDocumentCustomizerTests.java @@ -21,7 +21,6 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; import io.spring.initializr.generator.spring.documentation.HelpDocument; -import io.spring.initializr.generator.version.Version; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -76,29 +75,19 @@ void r2dbcWithMysql() { assertThat(helpDocument.getSections()).isEmpty(); } - @Test - void r2dbcWithMysqlBeforeVersion() { - HelpDocument helpDocument = createHelpDocumentForVersion(Version.parse("2.7.0.M1"), "mysql"); - assertThat(helpDocument.getSections()).hasSize(1); - } - @Test void r2dbcWithSeveralDrivers() { - HelpDocument helpDocument = createHelpDocumentForVersion(Version.parse("3.1.0"), "mysql", "h2"); + HelpDocument helpDocument = createHelpDocument("mysql", "h2"); assertThat(helpDocument.getSections()).isEmpty(); } private HelpDocument createHelpDocument(String... dependencyIds) { - return createHelpDocumentForVersion(Version.parse("3.1.0"), dependencyIds); - } - - private HelpDocument createHelpDocumentForVersion(Version platformVersion, String... dependencyIds) { Build build = new GradleBuild(); for (String dependencyId : dependencyIds) { build.dependencies().add(dependencyId, Dependency.withCoordinates(dependencyId, dependencyId)); } HelpDocument document = new HelpDocument(mock(MustacheTemplateRenderer.class)); - new R2dbcHelpDocumentCustomizer(build, platformVersion).customize(document); + new R2dbcHelpDocumentCustomizer(build).customize(document); return document; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java index 9a6090f01d..c531e66e3b 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java @@ -47,21 +47,17 @@ class SpringPulsarProjectGenerationConfigurationTests extends AbstractExtensionT @Nested class PulsarDependencyConfigurationTests { - @ParameterizedTest - @ValueSource(strings = { "3.0.0", "3.1.3" }) - void pulsarLegacyStarterUsedWhenBoot30orBoot31Selected(String bootVersion) { + @Test + void pulsarLegacyStarterUsedWhenBoot30orBoot31Selected() { ProjectRequest request = createProjectRequest("pulsar"); - request.setBootVersion(bootVersion); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasDependency("org.springframework.pulsar", "spring-pulsar-spring-boot-starter"); } - @ParameterizedTest - @ValueSource(strings = { "3.0.0", "3.1.3" }) - void pulsarReactiveLegacyStarterUsedWhenBoot30orBoot31Selected(String bootVersion) { + @Test + void pulsarReactiveLegacyStarterUsedWhenBoot30orBoot31Selected() { ProjectRequest request = createProjectRequest("pulsar-reactive"); - request.setBootVersion(bootVersion); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasDependency("org.springframework.pulsar", "spring-pulsar-reactive-spring-boot-starter"); @@ -140,11 +136,9 @@ void connectionNotAddedWhenPulsarNotSelected() { (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); } - @ParameterizedTest - @ValueSource(strings = { "3.0.0", "3.1.3" }) - void connectionNotAddedWhenIncompatibleBootVersionSelected(String bootVersion) { + @Test + void connectionNotAddedWhenIncompatibleBootVersionSelected() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse(bootVersion)); description.addDependency("pulsar", mock(Dependency.class)); description.addDependency("testcontainers", mock(Dependency.class)); this.projectTester.configure(description, @@ -216,20 +210,16 @@ void binderNotAddedWhenPulsarAndCloudStreamSelectedWithIncompatibleBootVersion(S assertNoBinder(project); } - @ParameterizedTest - @ValueSource(strings = { "3.0.0", "3.1.3" }) - void binderAddedWhenPulsarAndCloudStreamSelectedWithCompatibleBootVersion(String bootVersion) { + @Test + void binderAddedWhenPulsarAndCloudStreamSelectedWithCompatibleBootVersion() { ProjectRequest request = createProjectRequest("pulsar", "cloud-stream"); - request.setBootVersion(bootVersion); ProjectStructure project = generateProject(request); assertBinder(project); } - @ParameterizedTest - @ValueSource(strings = { "3.0.0", "3.1.3" }) - void binderAddedWhenPulsarReactiveAndCloudStreamSelectedWithCompatibleBootVersion(String bootVersion) { + @Test + void binderAddedWhenPulsarReactiveAndCloudStreamSelectedWithCompatibleBootVersion() { ProjectRequest request = createProjectRequest("pulsar-reactive", "cloud-stream"); - request.setBootVersion(bootVersion); ProjectStructure project = generateProject(request); assertBinder(project); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 29426620b6..bb1ce02150 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -43,17 +43,15 @@ class TestcontainersProjectGenerationConfigurationTests extends AbstractExtensio @Test void buildWithOnlyTestContainers() { - assertThat(generateProject("3.0.0", "testcontainers")).mavenBuild() - .hasBom("org.testcontainers", "testcontainers-bom", "${testcontainers.version}") + assertThat(generateProject("3.1.0", "testcontainers")).mavenBuild() .hasDependency(getDependency("testcontainers")); } @ParameterizedTest @MethodSource("supportedEntriesBuild") void buildWithSupportedEntries(String springBootDependencyId, String testcontainersArtifactId) { - assertThat(generateProject("3.0.0", "testcontainers", springBootDependencyId)).mavenBuild() - .hasBom("org.testcontainers", "testcontainers-bom", "${testcontainers.version}") - .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.0.0"))) + assertThat(generateProject("3.1.0", "testcontainers", springBootDependencyId)).mavenBuild() + .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.1.0"))) .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") .hasDependency(getDependency("testcontainers")); } @@ -78,14 +76,14 @@ static Stream supportedEntriesBuild() { @ParameterizedTest @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsPresentIsAdded(String dependencyId, String docHref) { - assertHelpDocument("3.0.0", "testcontainers", dependencyId) + assertHelpDocument("3.1.0", "testcontainers", dependencyId) .contains("https://java.testcontainers.org/modules/" + docHref); } @ParameterizedTest @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsNotPresentIsNotAdded(String dependencyId, String docHref) { - assertHelpDocument("3.0.0", dependencyId).doesNotContain("https://java.testcontainers.org/modules/" + docHref); + assertHelpDocument("3.1.0", dependencyId).doesNotContain("https://java.testcontainers.org/modules/" + docHref); } static Stream supportedEntriesHelpDocument() { @@ -112,43 +110,32 @@ static Stream supportedEntriesHelpDocument() { @Test void linkToSupportedEntriesWhenTwoMatchesArePresentOnlyAddLinkOnce() { - assertHelpDocument("3.0.0", "testcontainers", "data-mongodb", "data-mongodb-reactive") + assertHelpDocument("3.1.0", "testcontainers", "data-mongodb", "data-mongodb-reactive") .containsOnlyOnce("https://java.testcontainers.org/modules/databases/mongodb/"); } @Test void buildWithSpringBoot31DoesNotIncludeBom() { - assertThat(generateProject("3.1.0-RC1", "testcontainers")).mavenBuild() + assertThat(generateProject("3.1.0", "testcontainers")).mavenBuild() .doesNotHaveBom("org.testcontainers", "testcontainers-bom") .hasDependency(getDependency("testcontainers")); } - @Test - void buildWithSpringBoot30DoesNotIncludeSpringBootTestcontainers() { - assertThat(generateProject("3.0.0", "testcontainers")).mavenBuild() - .doesNotHaveDependency("org.springframework.boot", "spring-boot-testcontainers"); - } - @Test void buildWithSpringBoot31IncludeSpringBootTestcontainers() { - assertThat(generateProject("3.1.0-RC1", "testcontainers")).mavenBuild() + assertThat(generateProject("3.1.0", "testcontainers")).mavenBuild() .hasDependency("org.springframework.boot", "spring-boot-testcontainers", null, "test"); } - @Test - void buildWithSpringBoot30DoesNotIncludeTestcontainersSection() { - assertHelpDocument("3.0.0", "testcontainers").doesNotContain("Spring Boot Testcontainers support"); - } - @Test void buildWithSpringBoot31IncludeTestcontainersSection() { - assertHelpDocument("3.1.0-RC1", "testcontainers").contains("Spring Boot Testcontainers support"); + assertHelpDocument("3.1.0", "testcontainers").contains("Spring Boot Testcontainers support"); } @Test void testApplicationWithGroovyAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); - request.setBootVersion("3.1.0-RC2"); + request.setBootVersion("3.1.0"); request.setLanguage("groovy"); assertThat(generateProject(request)).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") .isEqualTo(""" @@ -181,7 +168,7 @@ static void main(String[] args) { @Test void testApplicationWithJavaAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); - request.setBootVersion("3.1.0-RC2"); + request.setBootVersion("3.1.0"); request.setLanguage("java"); assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") .isEqualTo(""" @@ -248,7 +235,7 @@ fun main(args: Array) { @Test void testApplicationWithGroovyAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); - request.setBootVersion("3.1.0-RC2"); + request.setBootVersion("3.1.0"); request.setLanguage("groovy"); assertThat(generateProject(request)).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") .isEqualTo(""" @@ -281,7 +268,7 @@ static void main(String[] args) { @Test void testApplicationWithJavaAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); - request.setBootVersion("3.1.0-RC2"); + request.setBootVersion("3.1.0"); request.setLanguage("java"); assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") .isEqualTo(""" diff --git a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java index 575e67b346..bf86c9a043 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java @@ -31,14 +31,14 @@ class InvalidJvmVersionHelpDocumentCustomizerTests extends AbstractExtensionTest @Test void warningAddedWithUnsupportedCombination() { - assertHelpDocument("3.0.0", "11").lines() + assertHelpDocument("3.1.0", "11").lines() .containsSubsequence("# Read Me First", "* The JVM level was changed from '11' to '17', review the [JDK Version Range](https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range) on the wiki for more details."); } @Test void warningNotAddedWithCompatibleVersion() { - assertHelpDocument("3.0.0", "17").doesNotContain("# Read Me First"); + assertHelpDocument("3.1.0", "17").doesNotContain("# Read Me First"); } private TextAssert assertHelpDocument(String platformVersion, String jvmVersion) { diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index f5f688cc31..fbb4022ae4 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -75,15 +75,15 @@ static Stream supportedGradleGroovyParameters() { } private static Stream supportedJavaParameters() { - return Stream.of(java("17", "3.0.0"), java("19", "3.0.0"), java("20", "3.0.11"), java("21", "3.0.11")); + return Stream.of(java("17", "3.1.0"), java("19", "3.1.0"), java("20", "3.1.0"), java("21", "3.1.0")); } private static Stream supportedKotlinParameters() { - return Stream.of(kotlin("17", "3.0.0"), kotlin("19", "3.0.0"), kotlin("20", "3.0.11")); + return Stream.of(kotlin("17", "3.1.0"), kotlin("19", "3.1.0"), kotlin("20", "3.1.0")); } private static Stream supportedGroovyParameters() { - return Stream.of(groovy("17", "3.0.0"), groovy("19", "3.0.0"), groovy("20", "3.0.11"), groovy("21", "3.0.11")); + return Stream.of(groovy("17", "3.1.0"), groovy("19", "3.1.0"), groovy("20", "3.1.0"), groovy("21", "3.1.0")); } private static Arguments java(String javaVersion, String springBootVersion) { From 2827dd9ebcad98eddc6a29eef97fed6f0d54714c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Tue, 7 Nov 2023 14:05:21 +0100 Subject: [PATCH 294/825] Only accept request for Spring Boot 3.1.x+ projects See gh-1330 --- .../site/support/StartInitializrMetadataUpdateStrategy.java | 2 +- start-site/src/main/resources/application.yml | 2 +- .../support/StartInitializrMetadataUpdateStrategyTests.java | 6 +----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java index 0bbf45781b..5fa8ffb738 100644 --- a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java +++ b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java @@ -48,7 +48,7 @@ protected List fetchSpringBootVersions(String url) { private boolean isCompatibleVersion(DefaultMetadataElement versionMetadata) { Version version = Version.parse(versionMetadata.getId()); - return (version.getMajor() == 2 && version.getMinor() > 6) || (version.getMajor() >= 3); + return (version.getMajor() >= 3 && version.getMinor() >= 1); } } diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 268838269d..2179a3095f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -193,7 +193,7 @@ initializr: gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: - compatibility-range: "2.6.0" + compatibility-range: "3.1.0" dependencies: - name: Developer Tools content: diff --git a/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java b/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java index eb4a160f14..5b0b8d4624 100644 --- a/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java +++ b/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java @@ -70,14 +70,10 @@ void eolVersionsAreRemoved() { InitializrMetadata updatedMetadata = provider.update(metadata); assertThat(updatedMetadata.getBootVersions()).isNotNull(); List updatedBootVersions = updatedMetadata.getBootVersions().getContent(); - assertThat(updatedBootVersions).hasSize(7); + assertThat(updatedBootVersions).hasSize(3); assertBootVersion(updatedBootVersions.get(0), "3.2.0 (SNAPSHOT)", false); assertBootVersion(updatedBootVersions.get(1), "3.1.6 (SNAPSHOT)", false); assertBootVersion(updatedBootVersions.get(2), "3.1.5", true); - assertBootVersion(updatedBootVersions.get(3), "3.0.13 (SNAPSHOT)", false); - assertBootVersion(updatedBootVersions.get(4), "3.0.12", false); - assertBootVersion(updatedBootVersions.get(5), "2.7.17 (SNAPSHOT)", false); - assertBootVersion(updatedBootVersions.get(6), "2.7.16", false); } @Test From b6c6de2316a63fd39a193d73f2220d7fe0211859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 26 Oct 2023 20:24:27 +0200 Subject: [PATCH 295/825] Simplify compatibility ranges for Spring Boot 3.1.x+ See gh-1330 --- start-site/src/main/resources/application.yml | 167 ++++-------------- 1 file changed, 32 insertions(+), 135 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2179a3095f..0612bda12e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -43,20 +43,14 @@ initializr: artifactId: spring-boot-admin-dependencies versionProperty: spring-boot-admin.version mappings: - - compatibilityRange: "[2.6.0,2.7.0-M1)" - version: 2.6.8 - - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 2.7.4 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 3.0.4 - - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" + - compatibilityRange: "[3.1.0,3.2.0-M1)" version: 3.1.5 hilla: groupId: dev.hilla artifactId: hilla-bom versionProperty: hilla.version mappings: - - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" + - compatibilityRange: "[3.1.0,3.2.0-M1)" version: 2.1.9 sentry: groupId: io.sentry @@ -70,18 +64,14 @@ initializr: artifactId: solace-spring-boot-bom versionProperty: solace-spring-boot.version mappings: - - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 1.2.2 - - compatibilityRange: "3.0.0-M1" + - compatibilityRange: "3.0.0" version: 2.0.0 solace-spring-cloud: groupId: com.solace.spring.cloud artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 2.3.2 - - compatibilityRange: "3.0.0-M1" + - compatibilityRange: "3.0.0" version: 3.0.0 spring-cloud: groupId: org.springframework.cloud @@ -89,8 +79,6 @@ initializr: versionProperty: spring-cloud.version order: 50 mappings: - - compatibilityRange: "[2.6.0,3.0.0)" - version: 2021.0.8 - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 2022.0.4 - compatibilityRange: "[3.2.0-M1,3.2.x-SNAPSHOT)" @@ -104,9 +92,7 @@ initializr: artifactId: spring-cloud-azure-dependencies versionProperty: spring-cloud-azure.version mappings: - - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 4.13.0 - - compatibilityRange: "[3.0.0-M1,3.3.0-M1)" + - compatibilityRange: "[3.0.0,3.3.0-M1)" version: 5.7.0 spring-cloud-gcp: groupId: com.google.cloud @@ -114,9 +100,7 @@ initializr: versionProperty: spring-cloud-gcp.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 3.7.4 - - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" + - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 4.8.4 spring-cloud-services: groupId: io.pivotal.spring.cloud @@ -124,10 +108,6 @@ initializr: versionProperty: spring-cloud-services.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[2.6.0,2.7.0-M1)" - version: 3.4.0 - - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 3.5.0 - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 4.0.3 spring-modulith: @@ -145,27 +125,16 @@ initializr: artifactId: spring-shell-dependencies versionProperty: spring-shell.version mappings: - - compatibilityRange: "[2.7.0,3.0.0-M1)" - version: 2.1.14 - - compatibilityRange: "[3.0.0,3.1.0-M1)" - version: 3.0.9 - compatibilityRange: "[3.1.0,3.2.0-M1)" version: 3.1.5 - compatibilityRange: "3.2.0-M1" version: 3.2.0-M3 repositories: spring-milestones - testcontainers: - groupId: org.testcontainers - artifactId: testcontainers-bom - version: 1.18.3 - versionProperty: testcontainers.version timefold-solver: groupId: ai.timefold.solver artifactId: timefold-solver-bom versionProperty: timefold-solver.version mappings: - - compatibilityRange: "[2.7.0,3.0.0-M1)" - version: 0.8.41 - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 1.3.0 vaadin: @@ -173,23 +142,8 @@ initializr: artifactId: vaadin-bom versionProperty: vaadin.version mappings: - - compatibilityRange: "[2.6.0,2.7.0-M1)" - version: 23.2.15 - - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 23.3.28 - - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" + - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 24.2.4 - wavefront: - groupId: com.wavefront - artifactId: wavefront-spring-boot-bom - versionProperty: wavefront.version - mappings: - - compatibilityRange: "[2.6.0,2.7.0-M1)" - version: 2.2.2 - - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 2.3.4 - - compatibilityRange: "[3.0.0-M1,3.1.0-M1)" - version: 3.0.2 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: @@ -199,7 +153,6 @@ initializr: content: - name: GraalVM Native Support id: native - compatibilityRange: "3.0.0-M1" groupId: org.springframework.boot artifactId: spring-boot description: Support for compiling Spring applications to native executables using the GraalVM native-image compiler. @@ -296,7 +249,6 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.reactive - name: Spring for GraphQL id: graphql - compatibilityRange: "2.7.0-M1" description: Build GraphQL applications with Spring for GraphQL and GraphQL Java. facets: - json @@ -374,7 +326,7 @@ initializr: artifactId: vaadin-spring-boot-starter description: A web framework that allows you to write UI in pure Java without getting bogged down in JS, HTML, and CSS. bom: vaadin - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" links: - rel: guide href: https://spring.io/guides/gs/crud-with-vaadin/ @@ -471,14 +423,12 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap - name: Okta id: okta - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" description: Okta specific configuration for Spring Security/Spring Boot OAuth2 features. Enable your Spring Boot application to work with Okta via OAuth 2.0/OIDC. groupId: com.okta.spring artifactId: okta-spring-boot-starter mappings: - - compatibilityRange: "[2.6.0,3.0.0-M1)" - version: 2.1.6 - - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" + - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 3.0.5 links: - rel: guide @@ -545,7 +495,7 @@ initializr: description: R2DBC Homepage - name: MyBatis Framework id: mybatis - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" description: Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. links: - rel: guide @@ -556,11 +506,7 @@ initializr: groupId: org.mybatis.spring.boot artifactId: mybatis-spring-boot-starter mappings: - - compatibilityRange: "[2.6.0,2.7.0-M1)" - version: 2.2.2 - - compatibilityRange: "[2.7.0-M1,3.0.0-M1)" - version: 2.3.1 - - compatibilityRange: "3.0.0-M1" + - compatibilityRange: "3.0.0" version: 3.0.2 - name: Liquibase Migration id: liquibase @@ -809,7 +755,6 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.jms.artemis - name: Spring for Apache Pulsar id: pulsar - compatibilityRange: "3.0.0" description: Build messaging applications with Apache Pulsar links: - rel: reference @@ -821,7 +766,6 @@ initializr: artifactId: spring-pulsar-spring-boot-starter - name: Spring for Apache Pulsar (Reactive) id: pulsar-reactive - compatibilityRange: "3.0.0" description: Build reactive messaging applications with Apache Pulsar facets: - reactive @@ -852,13 +796,9 @@ initializr: href: https://rsocket.io/ - name: Apache Camel id: camel - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" mappings: - - compatibilityRange: "[2.6.0,2.7.0-M1)" - version: 3.14.10 - - compatibilityRange: "[2.7.0.M1,3.0.0-M1)" - version: 3.20.8 - - compatibilityRange: "[3.0.0-M1,3.2.0-M1)" + - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 4.2.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot @@ -870,7 +810,7 @@ initializr: - name: Solace PubSub+ bom: solace-spring-boot id: solace - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" description: Connect to a Solace PubSub+ Advanced Event Broker to publish, subscribe, request/reply and store/replay messages groupId: com.solace.spring.boot artifactId: solace-spring-boot-starter @@ -925,10 +865,10 @@ initializr: id: picocli groupId: info.picocli artifactId: picocli-spring-boot-starter - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" description: Build command line applications with picocli. mappings: - - compatibilityRange: "[2.6.0,3.2.0-M1)" + - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 4.7.5 links: - rel: reference @@ -972,7 +912,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-client description: Required for your application to register with a Codecentric's Spring Boot Admin Server instance. - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -982,7 +922,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-server description: A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints. - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -991,12 +931,9 @@ initializr: id: sentry bom: sentry description: Application performance monitoring and error tracking that help software teams see clearer, solve quicker, and learn continuously. - compatibilityRange: "[2.7.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" groupId: io.sentry artifactId: sentry-spring-boot-starter-jakarta - mappings: - - compatibilityRange: "[2.7.0,3.0.0-M1)" - artifactId: sentry-spring-boot-starter links: - rel: reference href: https://docs.sentry.io/platforms/java/ @@ -1071,12 +1008,6 @@ initializr: groupId: io.micrometer artifactId: micrometer-tracing-bridge-brave starter: false - mappings: - - compatibility-range: "[2.6.0,3.0.0-M1)" - groupId: org.springframework.cloud - artifactId: spring-cloud-starter-sleuth - bom: spring-cloud - starter: true - name: Wavefront id: wavefront description: Publish metrics and optionally distributed traces to Tanzu Observability by Wavefront, a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and alert over data from across your entire stack. @@ -1084,23 +1015,12 @@ initializr: artifactId: micrometer-registry-wavefront scope: runtime starter: false - mappings: - - compatibility-range: "[2.6.0,3.1.0-M1)" - groupId: com.wavefront - artifactId: wavefront-spring-boot-starter - bom: wavefront - starter: true - name: Zipkin id: zipkin description: Enable and expose span and trace IDs to Zipkin. groupId: io.zipkin.reporter2 artifactId: zipkin-reporter-brave starter: false - mappings: - - compatibilityRange: "[2.6.0,3.0.0-M1)" - groupId: org.springframework.cloud - artifactId: spring-cloud-sleuth-zipkin - bom: spring-cloud - name: Testing content: - name: Spring REST Docs @@ -1120,9 +1040,6 @@ initializr: artifactId: junit-jupiter scope: test starter: false - mappings: - - compatibility-range: "[2.6.0,3.1.0-M2)" - bom: testcontainers links: - rel: reference href: https://java.testcontainers.org/ @@ -1156,17 +1073,6 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap.embedded - - name: Embedded MongoDB Database - id: flapdoodle-mongo - compatibilityRange: "[2.6.0,3.0.0-M1)" - description: Provides a platform neutral way for running MongoDB in unit tests. - groupId: de.flapdoodle.embed - artifactId: de.flapdoodle.embed.mongo - scope: test - starter: false - links: - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.mongodb.embedded - name: Spring Cloud bom: spring-cloud content: @@ -1281,15 +1187,6 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-cloud-zookeeper/docs/current/reference/html/#spring-cloud-zookeeper-discovery - - name: Cloud Foundry Discovery - id: cloud-cloudfoundry-discovery - compatibilityRange: "[2.6.0,3.0.0-M1)" - description: Service discovery with Cloud Foundry. - groupId: org.springframework.cloud - artifactId: spring-cloud-cloudfoundry-discovery - links: - - rel: reference - href: https://docs.spring.io/spring-cloud-cloudfoundry/docs/current/reference/html/ - name: Consul Discovery id: cloud-starter-consul-discovery description: Service discovery with Hashicorp Consul. @@ -1366,7 +1263,7 @@ initializr: href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-introducing - name: VMware Tanzu Application Service bom: spring-cloud-services - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" content: - name: Config Client (TAS) id: scs-config-client @@ -1386,7 +1283,7 @@ initializr: href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - name: Microsoft Azure bom: spring-cloud-azure - compatibilityRange: "[2.6.0,3.3.0-M1)" + compatibilityRange: "[3.0.0,3.3.0-M1)" content: - name: Azure Support id: azure-support @@ -1464,7 +1361,7 @@ initializr: description: Azure Storage Sample - name: Google Cloud Platform bom: spring-cloud-gcp - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0-M1)" content: - name: GCP Support id: cloud-gcp @@ -1569,18 +1466,18 @@ initializr: id: groovy default: false bootVersions: - - name: 3.0.3 (SNAPSHOT) - id: 3.0.3-SNAPSHOT + - name: 3.2.0 (SNAPSHOT) + id: 3.2.0-SNAPSHOT default: false - - name: 3.0.2 - id: 3.0.2 - default: true - - name: 2.7.9 (SNAPSHOT) - id: 2.7.9-SNAPSHOT + - name: 3.2.0 (RC1) + id: 3.2.0-RC1 default: false - - name: 2.7.8 - id: 2.7.8 + - name: 3.1.6 (SNAPSHOT) + id: 3.1.6-SNAPSHOT default: false + - name: 3.1.5 + id: 3.1.5 + default: true --- From 34a0ab691ca6efdb3695489a1e9ce59cd61c6807 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 23 Nov 2023 13:31:25 +0000 Subject: [PATCH 296/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 4e906516a3..958cc4826f 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:21d3d2e66a98f81eea83a9a2c26e11a0901b0bab860f65613caae4144f76ff46 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:18fe56f601f4a31ac28b518be3bb9694edbcb451aec1d8f9e8a55dcb42667737 lifecycle: preStop: exec: From 8244311c88e8128b14d13ed1cc805de15d823a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 23 Nov 2023 14:36:52 +0100 Subject: [PATCH 297/825] Remove support for Java 8 and 11 See gh-1330 --- start-site/src/main/resources/application.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0612bda12e..9133175de5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1450,11 +1450,6 @@ initializr: default: false - id: 17 default: true - - id: 11 - default: false - - id: 1.8 - name: 8 - default: false languages: - name: Java id: java From 13abe131b39634d2b38cb3520ee6b30ff91395ac Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 23 Nov 2023 14:00:07 +0000 Subject: [PATCH 298/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 958cc4826f..8e8c51401f 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:18fe56f601f4a31ac28b518be3bb9694edbcb451aec1d8f9e8a55dcb42667737 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c7eb8a23ba3b1a3172cdff0454c2045e44d448e17da8505c5d6bf9c049bb6939 lifecycle: preStop: exec: From 0867a40196bfbe12f34d07108eae688829e83ae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 23 Nov 2023 16:55:14 +0100 Subject: [PATCH 299/825] Adapt tests now that Spring Boot 3.2.0 is the default --- .../HillaProjectGenerationConfigurationTests.java | 5 +++-- .../mybatis/MyBatisTestBuildCustomizerTests.java | 1 + ...ingCloudContractMavenBuildCustomizerTests.java | 15 +++++++++------ ...PulsarProjectGenerationConfigurationTests.java | 4 ++++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java index 4460c91521..a7b3cf8848 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java @@ -62,8 +62,9 @@ void gradleBuildWithHillaConfigureTask() { @Test void projectWithHillaCustomizesGitIgnore() { - assertThat(generateProject(createProjectRequest("hilla", "data-jpa"))).textFile(".gitignore") - .contains("node_modules/", "frontend/generated/"); + ProjectRequest request = createProjectRequest("hilla", "data-jpa"); + request.setBootVersion("3.1.0"); + assertThat(generateProject(request)).textFile(".gitignore").contains("node_modules/", "frontend/generated/"); } @Test diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java index 7fc8df11d3..41dd93788b 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java @@ -33,6 +33,7 @@ class MyBatisTestBuildCustomizerTests extends AbstractExtensionTests { @Test void mybatisIsAddedWithSecurity() { ProjectRequest request = createProjectRequest("mybatis"); + request.setBootVersion("3.1.0"); assertThat(mavenPom(request)).hasDependency(mybatis()) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(mybatisTest()) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java index 64681789f5..ea86e6abc2 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java @@ -34,8 +34,9 @@ class SpringCloudContractMavenBuildCustomizerTests extends AbstractExtensionTest @Test void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - assertThat(mavenPom(projectRequest)).hasDependency(getDependency("cloud-contract-verifier")) + ProjectRequest request = createProjectRequest("cloud-contract-verifier"); + request.setBootVersion("3.1.0"); + assertThat(mavenPom(request)).hasDependency(getDependency("cloud-contract-verifier")) .hasText("/project/build/plugins/plugin[2]/groupId", "org.springframework.cloud") .hasText("/project/build/plugins/plugin[2]/artifactId", "spring-cloud-contract-maven-plugin") .hasText("/project/build/plugins/plugin[2]/extensions", Boolean.toString(true)); @@ -49,16 +50,18 @@ void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { @Test void springCloudContractVerifierPluginForSpringBootWithJUnit5ByDefault() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - assertThat(mavenPom(projectRequest)) + ProjectRequest request = createProjectRequest("cloud-contract-verifier"); + request.setBootVersion("3.1.0"); + assertThat(mavenPom(request)) .hasText("/project/build/plugins/plugin[2]/artifactId", "spring-cloud-contract-maven-plugin") .hasText("/project/build/plugins/plugin[2]/configuration/testFramework", "JUNIT5"); } @Test void springCloudContractVerifierPluginWithTestModeSetWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - assertThat(mavenPom(projectRequest)) + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + request.setBootVersion("3.1.0"); + assertThat(mavenPom(request)) .hasText("/project/build/plugins/plugin[2]/artifactId", "spring-cloud-contract-maven-plugin") .hasText("/project/build/plugins/plugin[2]/configuration/testMode", "WEBTESTCLIENT"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java index c531e66e3b..0ff94b15ab 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java @@ -50,6 +50,7 @@ class PulsarDependencyConfigurationTests { @Test void pulsarLegacyStarterUsedWhenBoot30orBoot31Selected() { ProjectRequest request = createProjectRequest("pulsar"); + request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasDependency("org.springframework.pulsar", "spring-pulsar-spring-boot-starter"); @@ -58,6 +59,7 @@ void pulsarLegacyStarterUsedWhenBoot30orBoot31Selected() { @Test void pulsarReactiveLegacyStarterUsedWhenBoot30orBoot31Selected() { ProjectRequest request = createProjectRequest("pulsar-reactive"); + request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasDependency("org.springframework.pulsar", "spring-pulsar-reactive-spring-boot-starter"); @@ -213,6 +215,7 @@ void binderNotAddedWhenPulsarAndCloudStreamSelectedWithIncompatibleBootVersion(S @Test void binderAddedWhenPulsarAndCloudStreamSelectedWithCompatibleBootVersion() { ProjectRequest request = createProjectRequest("pulsar", "cloud-stream"); + request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); assertBinder(project); } @@ -220,6 +223,7 @@ void binderAddedWhenPulsarAndCloudStreamSelectedWithCompatibleBootVersion() { @Test void binderAddedWhenPulsarReactiveAndCloudStreamSelectedWithCompatibleBootVersion() { ProjectRequest request = createProjectRequest("pulsar-reactive", "cloud-stream"); + request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); assertBinder(project); } From 80b286991d6ac670b69cd4f186dc5a2b5d1b8d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 23 Nov 2023 16:44:10 +0100 Subject: [PATCH 300/825] Upgrade to Spring Boot 3.2.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9df9bb4a97..b70f12314c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.5 + 3.2.0 io.spring.start start-parent From 44ec4be7fd9c805190c2d2d0939113c4a9c2268d Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 23 Nov 2023 16:15:50 +0000 Subject: [PATCH 301/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 8e8c51401f..c2979f00ff 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c7eb8a23ba3b1a3172cdff0454c2045e44d448e17da8505c5d6bf9c049bb6939 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:31545aac3087bcf6be0781ae7896aa9d4b262a8235d25daff94fefd744574b05 lifecycle: preStop: exec: From 46b964ba06c7bd64e7405382f4ef1b5dc085b8bd Mon Sep 17 00:00:00 2001 From: Gerald Venzl Date: Thu, 16 Nov 2023 21:39:49 -0700 Subject: [PATCH 302/825] Use Oracle Free with Spring Boot 3.2 and later Signed-off-by: Gerald Venzl See gh-1352 --- .../start/site/container/SimpleDockerServiceResolver.java | 4 ++-- .../testcontainers/TestcontainersModuleRegistry.java | 4 ++-- .../TestcontainersProjectGenerationConfigurationTests.java | 4 ++-- start-site/src/test/resources/compose/oracle.yaml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index 0be1c0f434..98dd943ca8 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -91,8 +91,8 @@ private static DockerService mysql() { } private static DockerService oracle() { - return DockerService.withImageAndTag("gvenzl/oracle-xe") - .website("https://hub.docker.com/r/gvenzl/oracle-xe") + return DockerService.withImageAndTag("gvenzl/oracle-free") + .website("https://hub.docker.com/r/gvenzl/oracle-free") .ports(1521) .build(); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 4be1a2b167..1dbebc6ef1 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -67,8 +67,8 @@ static Iterable create() { .customizeHelpDocument(addReferenceLink("MariaDB Module", "databases/mariadb/")), onDependencies("mysql").customizeBuild(addModule("mysql")) .customizeHelpDocument(addReferenceLink("MySQL Module", "databases/mysql/")), - onDependencies("oracle").customizeBuild(addModule("oracle-xe")) - .customizeHelpDocument(addReferenceLink("Oracle-XE Module", "databases/oraclexe/")), + onDependencies("oracle").customizeBuild(addModule("oracle-free")) + .customizeHelpDocument(addReferenceLink("Oracle Free Module", "databases/oraclefree/")), onDependencies("postgresql").customizeBuild(addModule("postgresql")) .customizeHelpDocument(addReferenceLink("Postgres Module", "databases/postgres/")), onDependencies("pulsar", "pulsar-reactive").customizeBuild(addModule("pulsar")) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index bb1ce02150..9b04206f0e 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -68,7 +68,7 @@ static Stream supportedEntriesBuild() { Arguments.arguments("db2", "db2"), Arguments.arguments("kafka", "kafka"), Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mariadb", "mariadb"), Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), - Arguments.arguments("oracle", "oracle-xe"), Arguments.arguments("pulsar", "pulsar"), + Arguments.arguments("oracle", "oracle-free"), Arguments.arguments("pulsar", "pulsar"), Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), Arguments.arguments("sqlserver", "mssqlserver")); } @@ -102,7 +102,7 @@ static Stream supportedEntriesHelpDocument() { Arguments.arguments("data-r2dbc", "databases/r2dbc/"), Arguments.arguments("db2", "databases/db2"), Arguments.arguments("kafka", "kafka/"), Arguments.arguments("kafka-streams", "kafka/"), Arguments.arguments("mariadb", "databases/mariadb/"), Arguments.arguments("mysql", "databases/mysql/"), - Arguments.arguments("oracle", "databases/oraclexe/"), + Arguments.arguments("oracle", "databases/oraclefree/"), Arguments.arguments("postgresql", "databases/postgres/"), Arguments.arguments("pulsar", "pulsar/"), Arguments.arguments("pulsar-reactive", "pulsar/"), Arguments.arguments("solace", "solace/"), Arguments.arguments("sqlserver", "databases/mssqlserver/")); diff --git a/start-site/src/test/resources/compose/oracle.yaml b/start-site/src/test/resources/compose/oracle.yaml index 6fbff0e486..7703a71861 100644 --- a/start-site/src/test/resources/compose/oracle.yaml +++ b/start-site/src/test/resources/compose/oracle.yaml @@ -1,6 +1,6 @@ services: oracle: - image: 'gvenzl/oracle-xe:latest' + image: 'gvenzl/oracle-free:latest' environment: - 'ORACLE_PASSWORD=secret' ports: From caf3dbb64080f1abbb50c40e46728b5ec89c014b Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 22 Nov 2023 15:00:14 +0000 Subject: [PATCH 303/825] Polish "Use Oracle Free with Spring Boot 3.2 and later" See gh-1352 --- .../SimpleDockerServiceResolver.java | 12 ++- .../OracleProjectGenerationConfiguration.java | 44 +++++++-- .../TestcontainersModuleRegistry.java | 96 ++++++++++--------- ...tainersProjectGenerationConfiguration.java | 4 +- ...leProjectGenerationConfigurationTests.java | 34 ++++++- ...rsProjectGenerationConfigurationTests.java | 13 ++- .../compose/{oracle.yaml => oracle-free.yaml} | 0 .../src/test/resources/compose/oracle-xe.yaml | 7 ++ 8 files changed, 150 insertions(+), 60 deletions(-) rename start-site/src/test/resources/compose/{oracle.yaml => oracle-free.yaml} (100%) create mode 100644 start-site/src/test/resources/compose/oracle-xe.yaml diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index 98dd943ca8..81ab516774 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -40,7 +40,8 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("mariaDb", mariaDb()); this.dockerServices.put("mongoDb", mongoDb()); this.dockerServices.put("mysql", mysql()); - this.dockerServices.put("oracle", oracle()); + this.dockerServices.put("oracleFree", oracleFree()); + this.dockerServices.put("oracleXe", oracleXe()); this.dockerServices.put("postgres", postgres()); this.dockerServices.put("pulsar", pulsar()); this.dockerServices.put("rabbit", rabbit()); @@ -90,13 +91,20 @@ private static DockerService mysql() { return DockerService.withImageAndTag("mysql").website("https://hub.docker.com/_/mysql").ports(3306).build(); } - private static DockerService oracle() { + private static DockerService oracleFree() { return DockerService.withImageAndTag("gvenzl/oracle-free") .website("https://hub.docker.com/r/gvenzl/oracle-free") .ports(1521) .build(); } + private static DockerService oracleXe() { + return DockerService.withImageAndTag("gvenzl/oracle-xe") + .website("https://hub.docker.com/r/gvenzl/oracle-xe") + .ports(1521) + .build(); + } + private static DockerService postgres() { return DockerService.withImageAndTag("postgres") .website("https://hub.docker.com/_/postgres") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java index 0eb8346722..ba15e5b1fa 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java @@ -17,6 +17,10 @@ package io.spring.start.site.extension.dependency.oracle; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections.ServiceConnection; @@ -35,20 +39,46 @@ @ConditionalOnRequestedDependency("oracle") class OracleProjectGenerationConfiguration { - private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.OracleContainer"; - @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer oracleServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { - return (serviceConnections) -> serviceResolver.doWith("oracle", (service) -> serviceConnections - .addServiceConnection(ServiceConnection.ofContainer("oracle", service, TESTCONTAINERS_CLASS_NAME, false))); + ServiceConnectionsCustomizer oracleServiceConnectionsCustomizer(DockerServiceResolver serviceResolver, + ProjectDescription projectDescription) { + OracleContainer oracleContainer = OracleContainer.forVersion(projectDescription.getPlatformVersion()); + return (serviceConnections) -> serviceResolver.doWith(oracleContainer.serviceId, + (service) -> serviceConnections.addServiceConnection(ServiceConnection + .ofContainer(oracleContainer.serviceId, service, oracleContainer.testcontainersClassName, false))); } @Bean @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer oracleComposeFileCustomizer(DockerServiceResolver serviceResolver) { - return (composeFile) -> serviceResolver.doWith("oracle", (service) -> composeFile.services() + ComposeFileCustomizer oracleComposeFileCustomizer(DockerServiceResolver serviceResolver, + ProjectDescription projectDescription) { + OracleContainer oracleContainer = OracleContainer.forVersion(projectDescription.getPlatformVersion()); + return (composeFile) -> serviceResolver.doWith(oracleContainer.serviceId, (service) -> composeFile.services() .add("oracle", service.andThen((builder) -> builder.environment("ORACLE_PASSWORD", "secret")))); } + private enum OracleContainer { + + FREE("oracleFree", "org.testcontainers.containers.oracle.OracleContainer"), + + XE("oracleXe", "org.testcontainers.containers.OracleContainer"); + + private static final VersionRange SPRING_BOOT_3_2_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0"); + + private final String serviceId; + + private final String testcontainersClassName; + + OracleContainer(String serviceId, String testcontainersClassName) { + this.serviceId = serviceId; + this.testcontainersClassName = testcontainersClassName; + } + + static OracleContainer forVersion(Version version) { + return SPRING_BOOT_3_2_0_OR_LATER.match(version) ? FREE : XE; + } + + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 1dbebc6ef1..41582d2f96 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -16,7 +16,7 @@ package io.spring.start.site.extension.dependency.testcontainers; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -25,6 +25,9 @@ import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependency.Builder; @@ -37,50 +40,55 @@ */ abstract class TestcontainersModuleRegistry { - static Iterable create() { - return create( - onDependencies("amqp").customizeBuild(addModule("rabbitmq")) - .customizeHelpDocument(addReferenceLink("RabbitMQ Module", "rabbitmq/")), - onDependencies("cloud-gcp", "cloud-gcp-pubsub").customizeBuild(addModule("gcloud")) - .customizeHelpDocument(addReferenceLink("GCloud Module", "gcloud/")), - onDependencies("cloud-starter-consul-config").customizeBuild(addModule("consul")) - .customizeHelpDocument(addReferenceLink("Consul Module", "consul/")), - onDependencies("cloud-starter-vault-config").customizeBuild(addModule("vault")) - .customizeHelpDocument(addReferenceLink("Vault Module", "vault/")), - onDependencies("data-cassandra", "data-cassandra-reactive").customizeBuild(addModule("cassandra")) - .customizeHelpDocument(addReferenceLink("Cassandra Module", "databases/cassandra/")), - onDependencies("data-couchbase", "data-couchbase-reactive").customizeBuild(addModule("couchbase")) - .customizeHelpDocument(addReferenceLink("Couchbase Module", "databases/couchbase/")), - onDependencies("data-elasticsearch").customizeBuild(addModule("elasticsearch")) - .customizeHelpDocument(addReferenceLink("Elasticsearch Container", "elasticsearch/")), - onDependencies("data-mongodb", "data-mongodb-reactive").customizeBuild(addModule("mongodb")) - .customizeHelpDocument(addReferenceLink("MongoDB Module", "databases/mongodb/")), - onDependencies("data-neo4j").customizeBuild(addModule("neo4j")) - .customizeHelpDocument(addReferenceLink("Neo4j Module", "databases/neo4j/")), - onDependencies("data-r2dbc").customizeBuild(addModule("r2dbc")) - .customizeHelpDocument(addReferenceLink("R2DBC support", "databases/r2dbc/")), - onDependencies("db2").customizeBuild(addModule("db2")) - .customizeHelpDocument(addReferenceLink("DB2 Module", "databases/db2/")), - onDependencies("kafka", "kafka-streams").customizeBuild(addModule("kafka")) - .customizeHelpDocument(addReferenceLink("Kafka Modules", "kafka/")), - onDependencies("mariadb").customizeBuild(addModule("mariadb")) - .customizeHelpDocument(addReferenceLink("MariaDB Module", "databases/mariadb/")), - onDependencies("mysql").customizeBuild(addModule("mysql")) - .customizeHelpDocument(addReferenceLink("MySQL Module", "databases/mysql/")), - onDependencies("oracle").customizeBuild(addModule("oracle-free")) - .customizeHelpDocument(addReferenceLink("Oracle Free Module", "databases/oraclefree/")), - onDependencies("postgresql").customizeBuild(addModule("postgresql")) - .customizeHelpDocument(addReferenceLink("Postgres Module", "databases/postgres/")), - onDependencies("pulsar", "pulsar-reactive").customizeBuild(addModule("pulsar")) - .customizeHelpDocument(addReferenceLink("Pulsar Module", "pulsar/")), - onDependencies("solace").customizeBuild(addModule("solace")) - .customizeHelpDocument(addReferenceLink("Solace Module", "solace/")), - onDependencies("sqlserver").customizeBuild(addModule("mssqlserver")) - .customizeHelpDocument(addReferenceLink("MS SQL Server Module", "databases/mssqlserver/"))); - } + private static final VersionRange SPRING_BOOT_3_2_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0"); - private static List create(ImplicitDependency.Builder... dependencies) { - return Arrays.stream(dependencies).map(Builder::build).collect(Collectors.toList()); + static Iterable create(Version platformVersion) { + List builders = new ArrayList<>(); + builders.add(onDependencies("amqp").customizeBuild(addModule("rabbitmq")) + .customizeHelpDocument(addReferenceLink("RabbitMQ Module", "rabbitmq/"))); + builders.add(onDependencies("cloud-gcp", "cloud-gcp-pubsub").customizeBuild(addModule("gcloud")) + .customizeHelpDocument(addReferenceLink("GCloud Module", "gcloud/"))); + builders.add(onDependencies("cloud-starter-consul-config").customizeBuild(addModule("consul")) + .customizeHelpDocument(addReferenceLink("Consul Module", "consul/"))); + builders.add(onDependencies("cloud-starter-vault-config").customizeBuild(addModule("vault")) + .customizeHelpDocument(addReferenceLink("Vault Module", "vault/"))); + builders.add(onDependencies("data-cassandra", "data-cassandra-reactive").customizeBuild(addModule("cassandra")) + .customizeHelpDocument(addReferenceLink("Cassandra Module", "databases/cassandra/"))); + builders.add(onDependencies("data-couchbase", "data-couchbase-reactive").customizeBuild(addModule("couchbase")) + .customizeHelpDocument(addReferenceLink("Couchbase Module", "databases/couchbase/"))); + builders.add(onDependencies("data-elasticsearch").customizeBuild(addModule("elasticsearch")) + .customizeHelpDocument(addReferenceLink("Elasticsearch Container", "elasticsearch/"))); + builders.add(onDependencies("data-mongodb", "data-mongodb-reactive").customizeBuild(addModule("mongodb")) + .customizeHelpDocument(addReferenceLink("MongoDB Module", "databases/mongodb/"))); + builders.add(onDependencies("data-neo4j").customizeBuild(addModule("neo4j")) + .customizeHelpDocument(addReferenceLink("Neo4j Module", "databases/neo4j/"))); + builders.add(onDependencies("data-r2dbc").customizeBuild(addModule("r2dbc")) + .customizeHelpDocument(addReferenceLink("R2DBC support", "databases/r2dbc/"))); + builders.add(onDependencies("db2").customizeBuild(addModule("db2")) + .customizeHelpDocument(addReferenceLink("DB2 Module", "databases/db2/"))); + builders.add(onDependencies("kafka", "kafka-streams").customizeBuild(addModule("kafka")) + .customizeHelpDocument(addReferenceLink("Kafka Modules", "kafka/"))); + builders.add(onDependencies("mariadb").customizeBuild(addModule("mariadb")) + .customizeHelpDocument(addReferenceLink("MariaDB Module", "databases/mariadb/"))); + builders.add(onDependencies("mysql").customizeBuild(addModule("mysql")) + .customizeHelpDocument(addReferenceLink("MySQL Module", "databases/mysql/"))); + if (SPRING_BOOT_3_2_0_OR_LATER.match(platformVersion)) { + builders.add(onDependencies("oracle").customizeBuild(addModule("oracle-free")) + .customizeHelpDocument(addReferenceLink("Oracle-Free Module", "databases/oraclefree/"))); + } + else { + builders.add(onDependencies("oracle").customizeBuild(addModule("oracle-xe")) + .customizeHelpDocument(addReferenceLink("Oracle-XE Module", "databases/oraclexe/"))); + } + builders.add(onDependencies("postgresql").customizeBuild(addModule("postgresql")) + .customizeHelpDocument(addReferenceLink("Postgres Module", "databases/postgres/"))); + builders.add(onDependencies("pulsar", "pulsar-reactive").customizeBuild(addModule("pulsar")) + .customizeHelpDocument(addReferenceLink("Pulsar Module", "pulsar/"))); + builders.add(onDependencies("solace").customizeBuild(addModule("solace")) + .customizeHelpDocument(addReferenceLink("Solace Module", "solace/"))); + builders.add(onDependencies("sqlserver").customizeBuild(addModule("mssqlserver")) + .customizeHelpDocument(addReferenceLink("MS SQL Server Module", "databases/mssqlserver/"))); + return builders.stream().map(Builder::build).collect(Collectors.toList()); } private static ImplicitDependency.Builder onDependencies(String... dependencyIds) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java index c3fb82a02f..b3f59fa575 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java @@ -52,8 +52,8 @@ public class TestcontainersProjectGenerationConfiguration { private final Iterable dependencies; - public TestcontainersProjectGenerationConfiguration() { - this.dependencies = TestcontainersModuleRegistry.create(); + public TestcontainersProjectGenerationConfiguration(ProjectDescription projectDescription) { + this.dependencies = TestcontainersModuleRegistry.create(projectDescription.getPlatformVersion()); } @Bean diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java index 9eae95a332..0879b439fc 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java @@ -33,16 +33,44 @@ class OracleProjectGenerationConfigurationTests extends AbstractExtensionTests { @Test - void doesNothingWithoutDockerCompose() { + void doesNotGenerateComposeYamlWithoutDockerCompose() { ProjectRequest request = createProjectRequest("web", "oracle"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @Test - void createsOracleService() { + void createsOracleXeServiceWithBoot31() { ProjectRequest request = createProjectRequest("docker-compose", "oracle"); - assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle.yaml")); + request.setBootVersion("3.1.0"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle-xe.yaml")); + } + + @Test + void createsOracleFreeServiceWithBoot32() { + ProjectRequest request = createProjectRequest("docker-compose", "oracle"); + request.setBootVersion("3.2.0"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle-free.yaml")); + } + + @Test + void declaresOracleXeContainerBeanWithBoot31() { + ProjectRequest request = createProjectRequest("testcontainers", "oracle"); + request.setBootVersion("3.1.0"); + request.setLanguage("java"); + assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") + .contains("import org.testcontainers.containers.OracleContainer;") + .contains(" return new OracleContainer(DockerImageName.parse(\"gvenzl/oracle-xe:latest\"));"); + } + + @Test + void declaresOracleFreeContainerBeanWithBoot32() { + ProjectRequest request = createProjectRequest("testcontainers", "oracle"); + request.setBootVersion("3.2.0"); + request.setLanguage("java"); + assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") + .contains("import org.testcontainers.containers.oracle.OracleContainer;") + .contains(" return new OracleContainer(DockerImageName.parse(\"gvenzl/oracle-free:latest\"));"); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 9b04206f0e..d9edb8e698 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -56,6 +56,15 @@ void buildWithSupportedEntries(String springBootDependencyId, String testcontain .hasDependency(getDependency("testcontainers")); } + @Test + void buildWithSpringBoot32AndOracleJdbcDriverUsesOracleFree() { + assertThat(generateProject("3.2.0", "testcontainers", "oracle")).mavenBuild() + .doesNotHaveBom("org.testcontainers", "testcontainers-bom") + .hasDependency(getDependency("oracle").resolve(Version.parse("3.2.0"))) + .hasDependency("org.testcontainers", "oracle-free", null, "test") + .hasDependency(getDependency("testcontainers")); + } + static Stream supportedEntriesBuild() { return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.arguments("cloud-gcp", "gcloud"), Arguments.arguments("cloud-gcp-pubsub", "gcloud"), Arguments.arguments("data-cassandra", "cassandra"), @@ -68,7 +77,7 @@ static Stream supportedEntriesBuild() { Arguments.arguments("db2", "db2"), Arguments.arguments("kafka", "kafka"), Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mariadb", "mariadb"), Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), - Arguments.arguments("oracle", "oracle-free"), Arguments.arguments("pulsar", "pulsar"), + Arguments.arguments("oracle", "oracle-xe"), Arguments.arguments("pulsar", "pulsar"), Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), Arguments.arguments("sqlserver", "mssqlserver")); } @@ -102,7 +111,7 @@ static Stream supportedEntriesHelpDocument() { Arguments.arguments("data-r2dbc", "databases/r2dbc/"), Arguments.arguments("db2", "databases/db2"), Arguments.arguments("kafka", "kafka/"), Arguments.arguments("kafka-streams", "kafka/"), Arguments.arguments("mariadb", "databases/mariadb/"), Arguments.arguments("mysql", "databases/mysql/"), - Arguments.arguments("oracle", "databases/oraclefree/"), + Arguments.arguments("oracle", "databases/oraclexe/"), Arguments.arguments("postgresql", "databases/postgres/"), Arguments.arguments("pulsar", "pulsar/"), Arguments.arguments("pulsar-reactive", "pulsar/"), Arguments.arguments("solace", "solace/"), Arguments.arguments("sqlserver", "databases/mssqlserver/")); diff --git a/start-site/src/test/resources/compose/oracle.yaml b/start-site/src/test/resources/compose/oracle-free.yaml similarity index 100% rename from start-site/src/test/resources/compose/oracle.yaml rename to start-site/src/test/resources/compose/oracle-free.yaml diff --git a/start-site/src/test/resources/compose/oracle-xe.yaml b/start-site/src/test/resources/compose/oracle-xe.yaml new file mode 100644 index 0000000000..6fbff0e486 --- /dev/null +++ b/start-site/src/test/resources/compose/oracle-xe.yaml @@ -0,0 +1,7 @@ +services: + oracle: + image: 'gvenzl/oracle-xe:latest' + environment: + - 'ORACLE_PASSWORD=secret' + ports: + - '1521' From 6a1103d9e9a4d2c5deb9c595bd2c305c9af0de80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 24 Nov 2023 10:04:55 +0100 Subject: [PATCH 304/825] Adapt JVM version customization to Kotlin 1.9.20 supporting Java 21 Closes gh-1358 --- ...validJvmVersionHelpDocumentCustomizer.java | 31 ++++++++++++++----- ...vaVersionProjectDescriptionCustomizer.java | 10 ++++-- ...JvmVersionHelpDocumentCustomizerTests.java | 20 ++++++++++-- ...sionProjectDescriptionCustomizerTests.java | 7 +++-- 4 files changed, 54 insertions(+), 14 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizer.java index 9dd6d1af4d..06aaa7f400 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizer.java @@ -17,7 +17,9 @@ package io.spring.start.site.extension.description; import java.util.Objects; +import java.util.function.Consumer; +import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionDiff; import io.spring.initializr.generator.spring.documentation.HelpDocument; @@ -43,15 +45,30 @@ public InvalidJvmVersionHelpDocumentCustomizer(ProjectDescriptionDiff diff, Proj public void customize(HelpDocument document) { this.diff.ifLanguageChanged(this.description, (original, current) -> { String originalJvmVersion = original.jvmVersion(); - String currentJvmVersion = current.jvmVersion(); - if (!Objects.equals(originalJvmVersion, currentJvmVersion)) { - document.getWarnings() - .addItem(String.format( - "The JVM level was changed from '%s' to '%s', review the [JDK Version Range](%s) on the wiki for more details.", - originalJvmVersion, currentJvmVersion, - "https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range")); + String actualJvmVersion = current.jvmVersion(); + if (!Objects.equals(originalJvmVersion, actualJvmVersion)) { + processJvmVersionDiff(originalJvmVersion, actualJvmVersion).accept(document); } }); } + protected Consumer processJvmVersionDiff(String originalJvmVersion, String actualJvmVersion) { + return (document) -> { + if (this.description.getLanguage() instanceof KotlinLanguage) { + document.getWarnings() + .addItem( + "The JVM level was changed from '%s' to '%s' as the Kotlin version does not support Java %s yet." + .formatted(originalJvmVersion, actualJvmVersion, originalJvmVersion)); + } + else { + document.getWarnings() + .addItem( + "The JVM level was changed from '%s' to '%s', review the [JDK Version Range](%s) on the wiki for more details." + .formatted(originalJvmVersion, actualJvmVersion, + "https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range")); + } + }; + + } + } diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index 402dc82d90..966114b4f2 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -23,6 +23,9 @@ import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; /** * Validate that the requested java version is compatible with the chosen Spring Boot @@ -33,10 +36,13 @@ */ public class JavaVersionProjectDescriptionCustomizer implements ProjectDescriptionCustomizer { + private static final VersionRange KOTLIN_1_9_20_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0-RC2"); + private static final List UNSUPPORTED_VERSIONS = Arrays.asList("1.6", "1.7", "1.8"); @Override public void customize(MutableProjectDescription description) { + Version platformVersion = description.getPlatformVersion(); String javaVersion = description.getLanguage().jvmVersion(); if (UNSUPPORTED_VERSIONS.contains(javaVersion)) { updateTo(description, "17"); @@ -50,8 +56,8 @@ public void customize(MutableProjectDescription description) { updateTo(description, "17"); } if (javaGeneration == 21) { - // Kotlin does not support Java 21 bytecodes yet - if (description.getLanguage() instanceof KotlinLanguage) { + // Kotlin 1.9.20 is required + if (description.getLanguage() instanceof KotlinLanguage && !KOTLIN_1_9_20_OR_LATER.match(platformVersion)) { updateTo(description, "17"); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java index bf86c9a043..2ad2b564df 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java @@ -16,6 +16,7 @@ package io.spring.start.site.extension.description; +import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.test.io.TextAssert; import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; @@ -36,18 +37,33 @@ void warningAddedWithUnsupportedCombination() { "* The JVM level was changed from '11' to '17', review the [JDK Version Range](https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range) on the wiki for more details."); } + @Test + void warningAddedWithUnsupportedKotlinVersion() { + ProjectRequest request = createProjectRequest("web"); + request.setBootVersion("3.1.0"); + request.setJavaVersion("21"); + request.setLanguage(KotlinLanguage.ID); + assertHelpDocument(request).lines() + .containsSubsequence("# Read Me First", + "* The JVM level was changed from '21' to '17' as the Kotlin version does not support Java 21 yet."); + } + @Test void warningNotAddedWithCompatibleVersion() { assertHelpDocument("3.1.0", "17").doesNotContain("# Read Me First"); } + private TextAssert assertHelpDocument(ProjectRequest request) { + ProjectStructure project = generateProject(request); + return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + } + private TextAssert assertHelpDocument(String platformVersion, String jvmVersion) { ProjectRequest request = createProjectRequest("web"); request.setType("gradle-project"); request.setBootVersion(platformVersion); request.setJavaVersion(jvmVersion); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertHelpDocument(request); } } diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index fbb4022ae4..12fdeb18af 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -61,8 +61,8 @@ void gradleGroovyBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String lan } @Test - void kotlinIsNotSupportedWithJava21() { - assertThat(mavenPom(kotlinProject("21", "3.1.0"))).hasProperty("java.version", "17"); + void kotlinIsNotSupportedWithJava21AndSpringBoot31() { + assertThat(mavenPom(kotlinProject("21", "3.1.6"))).hasProperty("java.version", "17"); } static Stream supportedMavenParameters() { @@ -79,7 +79,8 @@ private static Stream supportedJavaParameters() { } private static Stream supportedKotlinParameters() { - return Stream.of(kotlin("17", "3.1.0"), kotlin("19", "3.1.0"), kotlin("20", "3.1.0")); + return Stream.of(kotlin("17", "3.1.0"), kotlin("19", "3.1.0"), kotlin("20", "3.1.0"), + kotlin("21", "3.2.0-RC2")); } private static Stream supportedGroovyParameters() { From 0b687d067d72a1218370a9deddc9c81f3e9e8446 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 24 Nov 2023 09:18:41 +0000 Subject: [PATCH 305/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index c2979f00ff..8c77c99789 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:31545aac3087bcf6be0781ae7896aa9d4b262a8235d25daff94fefd744574b05 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9809d9967674ba892ce368e883c40e5da24f8ec40e6cfab81279c0a5fc3f1e33 lifecycle: preStop: exec: From 4092098d8038b11d8debd1e9f48e4306d7aad38a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 24 Nov 2023 20:54:06 +0100 Subject: [PATCH 306/825] Upgrade to Spring Modulith 1.1.0 and 1.0.3 Closes gh-1359 --- start-site/src/main/resources/application.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9133175de5..486b142e3a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -116,10 +116,9 @@ initializr: versionProperty: spring-modulith.version mappings: - compatibility-range: "[3.1.0,3.2.0-M1)" - version: 1.0.2 + version: 1.0.3 - compatibility-range: "3.2.0-M1" - version: 1.1.0-RC2 - repositories: spring-milestones + version: 1.1.0 spring-shell: groupId: org.springframework.shell artifactId: spring-shell-dependencies From 7ef3d1c1c1aaf601a13af30f11f14c5039704faa Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 24 Nov 2023 20:02:34 +0000 Subject: [PATCH 307/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 8c77c99789..b52432ddd1 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9809d9967674ba892ce368e883c40e5da24f8ec40e6cfab81279c0a5fc3f1e33 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5adee6e6dbc5e45afd14adcbefbbdf5ca5892c14e3a8149a624086e024705e3c lifecycle: preStop: exec: From 71715811a51e73c70dbdd3026b7882a6b53f859d Mon Sep 17 00:00:00 2001 From: Kazuki Shimizu Date: Sat, 25 Nov 2023 11:30:29 +0900 Subject: [PATCH 308/825] Upgrade to MyBatis Spring 3.0.3 See gh-1360 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 486b142e3a..6e8b0ee51e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -494,7 +494,7 @@ initializr: description: R2DBC Homepage - name: MyBatis Framework id: mybatis - compatibilityRange: "[3.0.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.3.0-M1)" description: Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. links: - rel: guide @@ -506,7 +506,7 @@ initializr: artifactId: mybatis-spring-boot-starter mappings: - compatibilityRange: "3.0.0" - version: 3.0.2 + version: 3.0.3 - name: Liquibase Migration id: liquibase description: Liquibase database migration and source control library. From 674aed867cefa6375e05a72373a8cd8178ee478c Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Sat, 25 Nov 2023 09:03:20 +0000 Subject: [PATCH 309/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index b52432ddd1..bfc2c166bc 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5adee6e6dbc5e45afd14adcbefbbdf5ca5892c14e3a8149a624086e024705e3c + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:502385cc6473f3a7ad405ed74daf60fed6a044940f8be324c79c86f0cc757ddc lifecycle: preStop: exec: From dfd13e19a860882d2e3ed9a9e9e36a0783fe1775 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 27 Nov 2023 15:24:24 +0000 Subject: [PATCH 310/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index bfc2c166bc..3fcaacae1b 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:502385cc6473f3a7ad405ed74daf60fed6a044940f8be324c79c86f0cc757ddc + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4625fd4c22570921d701a3c41de66bdc25efa12c3c9870b95f465933e5a79448 lifecycle: preStop: exec: From b63ab2100e3f9c24ac795a06a5d78ef4013406ef Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Tue, 28 Nov 2023 09:07:31 +0000 Subject: [PATCH 311/825] Upgrade to Spring Shell 3.1.6 and 3.2.0-RC1 See gh-1362 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 6e8b0ee51e..86a79e80dd 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -125,9 +125,9 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 3.1.5 + version: 3.1.6 - compatibilityRange: "3.2.0-M1" - version: 3.2.0-M3 + version: 3.2.0-RC1 repositories: spring-milestones timefold-solver: groupId: ai.timefold.solver From 7486b7c6246ababa96e422e2f2efcc60a1ebd139 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 28 Nov 2023 10:42:13 +0000 Subject: [PATCH 312/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 3fcaacae1b..26d4cf57e0 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4625fd4c22570921d701a3c41de66bdc25efa12c3c9870b95f465933e5a79448 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7c8e3613f3b7686a93a6205387ff8dacae18092a3c2b7a241071dd57d3f45b74 lifecycle: preStop: exec: From 2659ed44e1c4c0f66f6c8bb520c973155f5325a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Carrasco=20Mo=C3=B1ino?= Date: Tue, 28 Nov 2023 17:27:02 +0100 Subject: [PATCH 313/825] Upgrade to Vaadin 24.2.5 and hilla 2.4.0 See gh-1363 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 86a79e80dd..ed549d48a9 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -51,7 +51,7 @@ initializr: versionProperty: hilla.version mappings: - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 2.1.9 + version: 2.4.0 sentry: groupId: io.sentry artifactId: sentry-bom @@ -142,7 +142,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 24.2.4 + version: 24.2.5 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From c6b804bc48bb518149ff0f2e009a766c80c9a493 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 29 Nov 2023 09:38:52 +0000 Subject: [PATCH 314/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 26d4cf57e0..827323c627 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7c8e3613f3b7686a93a6205387ff8dacae18092a3c2b7a241071dd57d3f45b74 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:215d1ef0950a6eba2b9f4c41ca21491af94fb69d2126805811b62a5480753a0e lifecycle: preStop: exec: From dd49d075b69e95e7c97942575374ec10cd54c5a2 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Thu, 30 Nov 2023 18:33:32 +0100 Subject: [PATCH 315/825] Update footer --- start-client/src/components/common/layout/SideLeft.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index 3dbcb16bfd..29a7de3c2a 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -149,7 +149,7 @@ function SideLeft() {
    - © 2013-{new Date().getFullYear()} Broadcom. All Rights + © 2005-{new Date().getFullYear()} Broadcom. All Rights Reserved.
    The term "Broadcom" refers to Broadcom Inc. and/or From 853f952152fa68ccb099a7edf117956e34672f0d Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 30 Nov 2023 17:42:59 +0000 Subject: [PATCH 316/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 827323c627..2acbf84bfe 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:215d1ef0950a6eba2b9f4c41ca21491af94fb69d2126805811b62a5480753a0e + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:e50232ef12ea1e5450afe3a19891be84e53eae35a482bda6f566f471a73c8a04 lifecycle: preStop: exec: From 7fdf1192500af468f79edf85e253ba50c406803e Mon Sep 17 00:00:00 2001 From: Arvind Krishnakumar <61501885+arvindkrishnakumar-okta@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:44:20 -0600 Subject: [PATCH 317/825] Upgrade to Okta Spring Boot 3.0.6 See gh-1364 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ed549d48a9..f78f1486b1 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -422,13 +422,13 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap - name: Okta id: okta - compatibilityRange: "[3.0.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.2.0)" description: Okta specific configuration for Spring Security/Spring Boot OAuth2 features. Enable your Spring Boot application to work with Okta via OAuth 2.0/OIDC. groupId: com.okta.spring artifactId: okta-spring-boot-starter mappings: - - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 3.0.5 + - compatibilityRange: "[3.0.0,3.2.0)" + version: 3.0.6 links: - rel: guide href: https://github.com/okta/samples-java-spring/tree/master/okta-hosted-login From f96e4d9c39ffbd1bd59ad1eb4e660579d105f120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 1 Dec 2023 09:42:51 +0100 Subject: [PATCH 318/825] Polish "Upgrade to Okta Spring Boot 3.0.6" See gh-1364 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f78f1486b1..09a29fb3b5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -422,12 +422,12 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap - name: Okta id: okta - compatibilityRange: "[3.0.0,3.2.0)" + compatibilityRange: "[3.0.0,3.3.0-M1)" description: Okta specific configuration for Spring Security/Spring Boot OAuth2 features. Enable your Spring Boot application to work with Okta via OAuth 2.0/OIDC. groupId: com.okta.spring artifactId: okta-spring-boot-starter mappings: - - compatibilityRange: "[3.0.0,3.2.0)" + - compatibilityRange: "[3.0.0,3.3.0-M1)" version: 3.0.6 links: - rel: guide From e0a99a0ad9e138c63289cc5db708898fe6835033 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 1 Dec 2023 08:56:56 +0000 Subject: [PATCH 319/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 2acbf84bfe..9302e858db 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:e50232ef12ea1e5450afe3a19891be84e53eae35a482bda6f566f471a73c8a04 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:57a5f44b94fe94b785b6fd8be1c0627e172e71f29d19a009fee7faf61b026aae lifecycle: preStop: exec: From 3762124a7fe9160116d35428fc3b4b17e3361466 Mon Sep 17 00:00:00 2001 From: Anbu Sampath Date: Sun, 3 Dec 2023 02:55:23 +0530 Subject: [PATCH 320/825] Rename "Google Cloud Platform" to "Google Cloud" Google Cloud Platform is now called Google Cloud See gh-1365 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 09a29fb3b5..69e7dba4dc 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1358,7 +1358,7 @@ initializr: - rel: sample href: https://aka.ms/spring/samples/latest/storage description: Azure Storage Sample - - name: Google Cloud Platform + - name: Google Cloud bom: spring-cloud-gcp compatibilityRange: "[3.0.0,3.2.0-M1)" content: From 6f2bd341ff32a09cfb29c43b7e9502e61cb07a4a Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 4 Dec 2023 10:08:09 +0000 Subject: [PATCH 321/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 9302e858db..a100ba9ab0 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:57a5f44b94fe94b785b6fd8be1c0627e172e71f29d19a009fee7faf61b026aae + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d5071c85014dd6420f541af3464d13c64ccb8b02d250dd3856a414002f0f4427 lifecycle: preStop: exec: From 2cde88c786304b9bfb817c9e1f027abb881d63cd Mon Sep 17 00:00:00 2001 From: Lars Uffmann Date: Tue, 5 Dec 2023 09:42:14 +0100 Subject: [PATCH 322/825] Use ojdbc11 instead of ojdbc8 See gh-1366 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 69e7dba4dc..67a446ba9e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -588,7 +588,7 @@ initializr: id: oracle description: A JDBC driver that provides access to Oracle. groupId: com.oracle.database.jdbc - artifactId: ojdbc8 + artifactId: ojdbc11 scope: runtime starter: false - name: PostgreSQL Driver From bebfc2b4f5ccfed76e8c22972fcb8447422f0b49 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 5 Dec 2023 10:24:08 +0000 Subject: [PATCH 323/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index a100ba9ab0..ef3f569ab5 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d5071c85014dd6420f541af3464d13c64ccb8b02d250dd3856a414002f0f4427 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d0d1ce2945d8d86ca607daad9a033f656b24cd3de209754a13ab2c8872ce823f lifecycle: preStop: exec: From 7c343cb0a28e58fbbdff275e0e6ffb4473510ee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 7 Dec 2023 09:43:04 +0100 Subject: [PATCH 324/825] Upgrade to Spring Cloud 2023.0.0 Closes gh-1368 --- start-site/src/main/resources/application.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 67a446ba9e..d0bdabe478 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -81,12 +81,11 @@ initializr: mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 2022.0.4 - - compatibilityRange: "[3.2.0-M1,3.2.x-SNAPSHOT)" + - compatibilityRange: "[3.2.0-M1,3.2.0)" version: 2023.0.0-RC1 repositories: spring-milestones - - compatibilityRange: "3.2.x-SNAPSHOT" - version: 2023.0.0-SNAPSHOT - repositories: spring-snapshots + - compatibilityRange: "3.2.0" + version: 2023.0.0 spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies From 01e1fa9faa1d85e4ff635164f526e1a9c004b525 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 7 Dec 2023 08:57:05 +0000 Subject: [PATCH 325/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index ef3f569ab5..2648651e01 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d0d1ce2945d8d86ca607daad9a033f656b24cd3de209754a13ab2c8872ce823f + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7b8fdcc0842b5d8557899bfdfd83dd89f7bbb224bed14671a6998139e51eab78 lifecycle: preStop: exec: From 05dcb34771efd8bedce4d9b9f7fa6bce301f9299 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 7 Dec 2023 09:59:53 +0000 Subject: [PATCH 326/825] Add reactive facet to Spring Cloud Gateway dependency Closes gh-1367 --- start-site/src/main/resources/application.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d0bdabe478..cae319b6fd 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1201,6 +1201,8 @@ initializr: groupId: org.springframework.cloud artifactId: spring-cloud-starter-gateway description: Provides a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as security, monitoring/metrics, and resiliency. + facets: + - reactive links: - rel: reference href: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ From b2488c2b916a441b99b53e2eb2d70bbd2f8724e1 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 7 Dec 2023 10:32:41 +0000 Subject: [PATCH 327/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 2648651e01..6af756f82e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7b8fdcc0842b5d8557899bfdfd83dd89f7bbb224bed14671a6998139e51eab78 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5844cd1dd1d973b6701955469844dfd6de8bdace51f6db848f5bde6d2a043347 lifecycle: preStop: exec: From 9f189ddd4c3baeeb8487a3b7c517d2e847b6eed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 7 Dec 2023 13:41:52 +0100 Subject: [PATCH 328/825] Upgrade to Spring Cloud Services 4.1.0 Closes gh-1369 --- start-site/src/main/resources/application.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index cae319b6fd..c2f1aa817f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -109,6 +109,8 @@ initializr: mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 4.0.3 + - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" + version: 4.1.0 spring-modulith: groupId: org.springframework.modulith artifactId: spring-modulith-bom @@ -1263,7 +1265,7 @@ initializr: href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-introducing - name: VMware Tanzu Application Service bom: spring-cloud-services - compatibilityRange: "[3.0.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.3.0-M1)" content: - name: Config Client (TAS) id: scs-config-client From b19414ae90a642f0d79ff55ef82d7e5354ba4a7a Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 7 Dec 2023 12:56:23 +0000 Subject: [PATCH 329/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 6af756f82e..498696fbdc 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5844cd1dd1d973b6701955469844dfd6de8bdace51f6db848f5bde6d2a043347 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:03c4040f87b09c2043b05e4dd5e02a7a59bd9a21ea3ef12ef3000f3c7cf26e7b lifecycle: preStop: exec: From 4852b6995f2c8c7240332468c86be1e318703306 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 7 Dec 2023 13:39:07 +0000 Subject: [PATCH 330/825] Revert "Add reactive facet to Spring Cloud Gateway dependency" This reverts commit 05dcb34771efd8bedce4d9b9f7fa6bce301f9299. --- start-site/src/main/resources/application.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c2f1aa817f..25c31953d5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1203,8 +1203,6 @@ initializr: groupId: org.springframework.cloud artifactId: spring-cloud-starter-gateway description: Provides a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as security, monitoring/metrics, and resiliency. - facets: - - reactive links: - rel: reference href: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ From 422991802691d6dd93f696c250cc0ab447c61cfe Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 7 Dec 2023 13:50:25 +0000 Subject: [PATCH 331/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 498696fbdc..19f41e7688 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:03c4040f87b09c2043b05e4dd5e02a7a59bd9a21ea3ef12ef3000f3c7cf26e7b + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c2d14b9295b013767f1dc9e9e864e899d61c6e04a94211e1721e8f1fa459997f lifecycle: preStop: exec: From 33af654c22755b78795ab2f68b65df5120aa9071 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 7 Dec 2023 14:00:56 +0000 Subject: [PATCH 332/825] Separate Gateway into reactive and servlet-based entries Closes gh-1367 --- ...ingCloudGatewayHelpDocumentCustomizer.java | 50 ---------- ...ngCloudProjectGenerationConfiguration.java | 10 -- ...ectDescriptionCustomizerConfiguration.java | 6 -- ...udGatewayProjectDescriptionCustomizer.java | 65 ------------- start-site/src/main/resources/application.yml | 13 ++- ...oudGatewayHelpDocumentCustomizerTests.java | 70 -------------- ...ewayProjectDescriptionCustomizerTests.java | 92 ------------------- 7 files changed, 12 insertions(+), 294 deletions(-) delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizer.java delete mode 100644 start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizer.java delete mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizerTests.java delete mode 100644 start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizer.java deleted file mode 100644 index 6e51ed7a8b..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizer.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springcloud; - -import java.util.Map; - -import io.spring.initializr.generator.buildsystem.Dependency; -import io.spring.initializr.generator.project.ProjectDescriptionDiff; -import io.spring.initializr.generator.spring.documentation.HelpDocument; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; - -/** - * A {@link HelpDocumentCustomizer} that adds a warning if Spring Cloud Gateway is used - * with Spring MVC. - * - * @author Stephane Nicoll - */ -public class SpringCloudGatewayHelpDocumentCustomizer implements HelpDocumentCustomizer { - - private final ProjectDescriptionDiff diff; - - public SpringCloudGatewayHelpDocumentCustomizer(ProjectDescriptionDiff diff) { - this.diff = diff; - } - - @Override - public void customize(HelpDocument document) { - Map originalDependencies = this.diff.getOriginal().getRequestedDependencies(); - if (originalDependencies.containsKey("cloud-gateway") && originalDependencies.containsKey("web")) { - document.getWarnings() - .addItem( - "Spring Cloud Gateway requires Spring WebFlux, your choice of Spring Web has been replaced accordingly."); - } - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java index 69fd7f548d..841f05104e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java @@ -24,11 +24,9 @@ import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; import io.spring.initializr.generator.project.ProjectDescription; -import io.spring.initializr.generator.project.ProjectDescriptionDiff; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.project.contributor.ProjectContributor; import io.spring.initializr.metadata.InitializrMetadata; @@ -82,14 +80,6 @@ public SpringCloudCircuitBreakerBuildCustomizer springCloudCircuitBreakerBuildCu return new SpringCloudCircuitBreakerBuildCustomizer(this.metadata, this.description); } - @Bean - @ConditionalOnRequestedDependency("cloud-gateway") - @ConditionalOnPlatformVersion("[2.6.0,3.2.0-M1)") - public SpringCloudGatewayHelpDocumentCustomizer springCloudGatewayHelpDocumentCustomizer( - ProjectDescriptionDiff diff) { - return new SpringCloudGatewayHelpDocumentCustomizer(diff); - } - @Configuration(proxyBeanMethods = false) @ConditionalOnRequestedDependency("cloud-contract-verifier") static class SpringCloudContractConfiguration { diff --git a/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java b/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java index 28a5b81118..7640cadfa5 100644 --- a/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/project/ProjectDescriptionCustomizerConfiguration.java @@ -17,7 +17,6 @@ package io.spring.start.site.project; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; -import io.spring.start.site.project.dependency.springcloud.SpringCloudGatewayProjectDescriptionCustomizer; import io.spring.start.site.project.dependency.springcloud.SpringCloudResilience4JProjectDescriptionCustomizer; import org.springframework.context.annotation.Bean; @@ -41,9 +40,4 @@ public SpringCloudResilience4JProjectDescriptionCustomizer springCloudResilience return new SpringCloudResilience4JProjectDescriptionCustomizer(); } - @Bean - public SpringCloudGatewayProjectDescriptionCustomizer springCloudGatewayProjectDescriptionCustomizer() { - return new SpringCloudGatewayProjectDescriptionCustomizer(); - } - } diff --git a/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizer.java deleted file mode 100644 index ad49eddd55..0000000000 --- a/start-site/src/main/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizer.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.project.dependency.springcloud; - -import java.util.Collection; - -import io.spring.initializr.generator.buildsystem.Dependency; -import io.spring.initializr.generator.project.MutableProjectDescription; -import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; - -/** - * A {@link ProjectDescriptionCustomizer} that checks the web stack that is used with - * Spring Cloud Gateway as it requires a dedicated starter. Before Spring Boot 3.2, MVC - * was not supported. - * - * @author Stephane Nicoll - */ -public class SpringCloudGatewayProjectDescriptionCustomizer implements ProjectDescriptionCustomizer { - - private static final VersionRange SPRING_BOOT_3_2_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0-M1"); - - @Override - public void customize(MutableProjectDescription description) { - Collection dependencyIds = description.getRequestedDependencies().keySet(); - if (!dependencyIds.contains("cloud-gateway")) { - return; - } - if (SPRING_BOOT_3_2_0_OR_LATER.match(description.getPlatformVersion())) { - swapStarterIfNecessary(description, dependencyIds); - } - else if (dependencyIds.contains("web")) { - description.removeDependency("web"); - if (!description.getRequestedDependencies().containsKey("webflux")) { - description.addDependency("webflux", - Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter-webflux")); - } - } - } - - private void swapStarterIfNecessary(MutableProjectDescription description, Collection dependencyIds) { - if (dependencyIds.contains("web")) { - description.addDependency("cloud-gateway", - Dependency.from(description.getRequestedDependencies().get("cloud-gateway")) - .artifactId("spring-cloud-starter-gateway-mvc")); - } - - } - -} diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 25c31953d5..ed4fc1b6d4 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1201,8 +1201,19 @@ initializr: - name: Gateway id: cloud-gateway groupId: org.springframework.cloud + artifactId: spring-cloud-starter-gateway-mvc + compatibilityRange: "3.2.0-M1" + description: Provides a simple, yet effective way to route to APIs in Servlet-based applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. + links: + - rel: reference + href: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ + - name: Reactive Gateway + id: cloud-gateway-reactive + groupId: org.springframework.cloud artifactId: spring-cloud-starter-gateway - description: Provides a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as security, monitoring/metrics, and resiliency. + description: Provides a simple, yet effective way to route to APIs in reactive applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. + facets: + - reactive links: - rel: reference href: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizerTests.java deleted file mode 100644 index 84dcd2fbc6..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudGatewayHelpDocumentCustomizerTests.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2012-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springcloud; - -import io.spring.initializr.generator.buildsystem.Dependency; -import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; -import io.spring.initializr.generator.project.MutableProjectDescription; -import io.spring.initializr.generator.project.ProjectDescriptionDiff; -import io.spring.initializr.generator.spring.documentation.HelpDocument; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -/** - * Tests for {@link SpringCloudGatewayHelpDocumentCustomizer}. - * - * @author Stephane Nicoll - */ -class SpringCloudGatewayHelpDocumentCustomizerTests { - - @Test - void originalWithSpringCloudGatewayAndSpringWebAddsWarning() { - HelpDocument document = customizeEmptyDocument(createDiff("web", "cloud-gateway")); - assertThat(document.getWarnings().getItems()).hasSize(1); - assertThat(document.getWarnings().getItems().get(0)).isEqualTo( - "Spring Cloud Gateway requires Spring WebFlux, your choice of Spring Web has been replaced accordingly."); - } - - @Test - void originalWithSpringCloudGatewayDoesNotAddWarning() { - HelpDocument document = customizeEmptyDocument(createDiff("cloud-gateway")); - assertThat(document.getWarnings().getItems()).isEmpty(); - } - - @Test - void originalWithSpringWebOnlyDoesNotAddWarning() { - HelpDocument document = customizeEmptyDocument(createDiff("web")); - assertThat(document.getWarnings().getItems()).isEmpty(); - } - - private HelpDocument customizeEmptyDocument(ProjectDescriptionDiff diff) { - HelpDocument document = new HelpDocument(mock(MustacheTemplateRenderer.class)); - new SpringCloudGatewayHelpDocumentCustomizer(diff).customize(document); - return document; - } - - private ProjectDescriptionDiff createDiff(String... dependencies) { - MutableProjectDescription description = new MutableProjectDescription(); - for (String dependency : dependencies) { - description.addDependency(dependency, mock(Dependency.class)); - } - return new ProjectDescriptionDiff(description); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizerTests.java deleted file mode 100644 index e5e8196f07..0000000000 --- a/start-site/src/test/java/io/spring/start/site/project/dependency/springcloud/SpringCloudGatewayProjectDescriptionCustomizerTests.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.project.dependency.springcloud; - -import java.util.Arrays; -import java.util.function.Function; -import java.util.stream.Collectors; - -import io.spring.initializr.generator.buildsystem.Dependency; -import io.spring.initializr.generator.project.MutableProjectDescription; -import io.spring.initializr.generator.version.Version; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -/** - * Tests for {@link SpringCloudGatewayProjectDescriptionCustomizer}. - * - * @author Stephane Nicoll - */ -class SpringCloudGatewayProjectDescriptionCustomizerTests { - - @Test - void customizeWithSpringCloudGatewayAndSpringMvcPre32MigratesToSpringWebFlux() { - MutableProjectDescription description = new MutableProjectDescription(); - description.addDependency("cloud-gateway", mock(Dependency.class)); - description.addDependency("web", mock(Dependency.class)); - description.setPlatformVersion(Version.parse("3.1.0")); - new SpringCloudGatewayProjectDescriptionCustomizer().customize(description); - assertThat(description.getRequestedDependencies()).containsOnlyKeys("cloud-gateway", "webflux"); - Dependency webflux = description.getRequestedDependencies().get("webflux"); - assertThat(webflux.getGroupId()).isEqualTo("org.springframework.boot"); - assertThat(webflux.getArtifactId()).isEqualTo("spring-boot-starter-webflux"); - } - - @Test - void customizeWithSpringCloudGatewayAndSpringMvcAs32UsesMvcStarter() { - MutableProjectDescription description = new MutableProjectDescription(); - description.addDependency("cloud-gateway", - Dependency.withCoordinates("org.springframework.cloud", "spring-cloud-starter-gateway")); - description.addDependency("web", mock(Dependency.class)); - description.setPlatformVersion(Version.parse("3.2.0-M1")); - new SpringCloudGatewayProjectDescriptionCustomizer().customize(description); - assertThat(description.getRequestedDependencies()).containsOnlyKeys("cloud-gateway", "web"); - Dependency cloudGateway = description.getRequestedDependencies().get("cloud-gateway"); - assertThat(cloudGateway.getArtifactId()).isEqualTo("spring-cloud-starter-gateway-mvc"); - } - - @Test - void customizeWithSpringCloudGatewayDoesNotAddSpringWebFlux() { - MutableProjectDescription description = mockProjectDescription("3.1.0", "cloud-gateway"); - new SpringCloudGatewayProjectDescriptionCustomizer().customize(description); - verify(description).getRequestedDependencies(); - verify(description).getPlatformVersion(); - verifyNoMoreInteractions(description); - } - - @Test - void customizeWithoutSpringCloudGatewayDoesNotRemoveSpringMvc() { - MutableProjectDescription description = mockProjectDescription("3.1.0", "web"); - new SpringCloudGatewayProjectDescriptionCustomizer().customize(description); - verify(description).getRequestedDependencies(); - verifyNoMoreInteractions(description); - } - - MutableProjectDescription mockProjectDescription(String platformVersion, String... dependencies) { - MutableProjectDescription description = mock(MutableProjectDescription.class); - given(description.getPlatformVersion()).willReturn(Version.parse(platformVersion)); - given(description.getRequestedDependencies()).willReturn(Arrays.stream(dependencies) - .collect(Collectors.toMap(Function.identity(), (t) -> mock(Dependency.class)))); - return description; - } - -} From 16b510f23384538957cdb5ba3bb25b2d967e2624 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 7 Dec 2023 17:04:23 +0000 Subject: [PATCH 333/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 19f41e7688..a2e0f0c5c4 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c2d14b9295b013767f1dc9e9e864e899d61c6e04a94211e1721e8f1fa459997f + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7081173352a6ab020f907baf9166f89db8894478e928cc12033ee14d5605cf77 lifecycle: preStop: exec: From 7f5ef19781cecbbfe2b897a8994467fc4d6ebe50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Sat, 9 Dec 2023 16:53:33 +0100 Subject: [PATCH 334/825] Upgrade to Solace Spring Cloud 3.1.0 This also enables Solace with Spring Boot 3.2.x Closes gh-1370 --- start-site/src/main/resources/application.yml | 6 ++++-- .../dependency/solace/SolaceBinderBuildCustomizerTests.java | 6 +----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ed4fc1b6d4..a9ba67179d 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -71,8 +71,10 @@ initializr: artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "3.0.0" + - compatibilityRange: "[3.0.0,3.1.0-M1)" version: 3.0.0 + - compatibilityRange: "[3.1.0-M1, 3.3.0-M1)" + version: 3.1.0 spring-cloud: groupId: org.springframework.cloud artifactId: spring-cloud-dependencies @@ -810,7 +812,7 @@ initializr: - name: Solace PubSub+ bom: solace-spring-boot id: solace - compatibilityRange: "[3.0.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.3.0-M1)" description: Connect to a Solace PubSub+ Advanced Event Broker to publish, subscribe, request/reply and store/replay messages groupId: com.solace.spring.boot artifactId: solace-spring-boot-starter diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java index fa1f585ba5..4f94242023 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java @@ -40,7 +40,6 @@ void binderNotAddedWhenSolaceNotSelected() { @Test void binderNotAddedWhenCloudStreamNotSelected() { ProjectRequest request = createProjectRequest("solace"); - request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); assertNoBinder(project); assertThat(project).mavenBuild().hasDependency(getDependency("solace")); @@ -49,7 +48,6 @@ void binderNotAddedWhenCloudStreamNotSelected() { @Test void binderAddedWhenSolaceAndCloudStreamSelected() { ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("com.solace.spring.cloud", "spring-cloud-starter-stream-solace"); } @@ -57,7 +55,6 @@ void binderAddedWhenSolaceAndCloudStreamSelected() { @Test void bomAddedWhenSolaceAndCloudStreamSelected() { ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasBom("com.solace.spring.cloud", "solace-spring-cloud-bom", "${solace-spring-cloud.version}"); @@ -65,7 +62,7 @@ void bomAddedWhenSolaceAndCloudStreamSelected() { @Test void bomPropertyAddedWhenSolaceAndCloudStreamSelected() { - String platformVersion = "3.1.0"; + String platformVersion = "3.2.0"; ProjectRequest request = createProjectRequest("solace", "cloud-stream"); request.setBootVersion(platformVersion); ProjectStructure project = generateProject(request); @@ -76,7 +73,6 @@ void bomPropertyAddedWhenSolaceAndCloudStreamSelected() { @Test void solaceStarterRemovedWhenSolaceAndCloudStreamSelected() { ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion("3.1.0"); ProjectStructure project = generateProject(request); Dependency solace = getDependency("solace"); assertThat(project).mavenBuild().doesNotHaveDependency(solace.getGroupId(), solace.getArtifactId()); From 0e1fff8d62a51ecfc34d2490797cae56078bb43c Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Sat, 9 Dec 2023 16:14:37 +0000 Subject: [PATCH 335/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index a2e0f0c5c4..695f87d53d 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7081173352a6ab020f907baf9166f89db8894478e928cc12033ee14d5605cf77 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:22f8ed360f0724be0e4d6eabde98600ba0ec09c5602d9b5ad0f746437fe13778 lifecycle: preStop: exec: From 3c06517b6de475dd6e0c4f38d373f50004b39f95 Mon Sep 17 00:00:00 2001 From: Anbu Sampath Date: Mon, 11 Dec 2023 10:47:21 +0530 Subject: [PATCH 336/825] Rename GCP to Google Cloud See gh-1371 --- start-site/src/main/resources/application.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index a9ba67179d..0426e5977e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1376,9 +1376,9 @@ initializr: bom: spring-cloud-gcp compatibilityRange: "[3.0.0,3.2.0-M1)" content: - - name: GCP Support + - name: Google Cloud Support id: cloud-gcp - description: Contains auto-configuration support for every Spring Cloud GCP integration. Most of the auto-configuration code is only enabled if other dependencies are added to the classpath. + description: Contains auto-configuration support for every Google Cloud integration. Most of the auto-configuration code is only enabled if other dependencies are added to the classpath. groupId: com.google.cloud artifactId: spring-cloud-gcp-starter links: @@ -1386,10 +1386,10 @@ initializr: href: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html - rel: guide href: https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples - description: GCP Samples - - name: GCP Messaging + description: Google Cloud Samples + - name: Google Cloud Messaging id: cloud-gcp-pubsub - description: Adds the GCP Support entry and all the required dependencies so that the Google Cloud Pub/Sub integration work out of the box. + description: Adds the Google Cloud Support entry and all the required dependencies so that the Google Cloud Pub/Sub integration work out of the box. groupId: com.google.cloud artifactId: spring-cloud-gcp-starter-pubsub links: @@ -1397,10 +1397,10 @@ initializr: href: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html#cloud-pubsub - rel: guide href: https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-pubsub-sample - description: GCP Pub/Sub Sample - - name: GCP Storage + description: Google Cloud Pub/Sub Sample + - name: Google Cloud Storage id: cloud-gcp-storage - description: Adds the GCP Support entry and all the required dependencies so that the Google Cloud Storage integration work out of the box. + description: Adds the Google Cloud Support entry and all the required dependencies so that the Google Cloud Storage integration work out of the box. groupId: com.google.cloud artifactId: spring-cloud-gcp-starter-storage links: From 5ae29791ff463700441a98be2a5b7266a1e6b199 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 11 Dec 2023 15:57:04 +0000 Subject: [PATCH 337/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 695f87d53d..2dda9ea0eb 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:22f8ed360f0724be0e4d6eabde98600ba0ec09c5602d9b5ad0f746437fe13778 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:65d36e463c1c17622968c280d00652830cbb363834ab8ef20e7cfa5bc52ab4db lifecycle: preStop: exec: From b8fa613ffb66f4fc8497c75457a409a2b36bacac Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 12 Dec 2023 17:40:24 +0200 Subject: [PATCH 338/825] Upgrade to Vaadin 24.3.0 See gh-1372 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0426e5977e..178fb0805d 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -144,8 +144,8 @@ initializr: artifactId: vaadin-bom versionProperty: vaadin.version mappings: - - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 24.2.5 + - compatibilityRange: "[3.0.0,3.3.0-M1)" + version: 24.3.0 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 0501bba5375ab1c8bb94600b1d9bc94750ee36f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 13 Dec 2023 07:57:28 +0100 Subject: [PATCH 339/825] Polish "Upgrade to Vaadin 24.3.0" See gh-1372 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 178fb0805d..b7ac95b9de 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -145,7 +145,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.0 + version: 24.3.0 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: @@ -328,7 +328,7 @@ initializr: artifactId: vaadin-spring-boot-starter description: A web framework that allows you to write UI in pure Java without getting bogged down in JS, HTML, and CSS. bom: vaadin - compatibilityRange: "[3.0.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.3.0-M1)" links: - rel: guide href: https://spring.io/guides/gs/crud-with-vaadin/ From 8c71160f3ee412f7e3d218a4e11a416d07a10a62 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 13 Dec 2023 07:43:39 +0000 Subject: [PATCH 340/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 2dda9ea0eb..2da3000936 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:65d36e463c1c17622968c280d00652830cbb363834ab8ef20e7cfa5bc52ab4db + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5b08421c111ff07d43f78e4a3483e76b9a2332220378b78a06b115c00467baf3 lifecycle: preStop: exec: From 1082d92772b3ef37f72c4218a96564c9d92fa3ab Mon Sep 17 00:00:00 2001 From: Mridula <66699525+mpeddada1@users.noreply.github.com> Date: Tue, 12 Dec 2023 21:22:13 -0500 Subject: [PATCH 341/825] Upgrade to Spring Cloud GCP 4.9.0 See gh-1373 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b7ac95b9de..ee3ef0b3f6 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -102,7 +102,7 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 4.8.4 + version: 4.9.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 1f890f341bc82903de9628d10af5385c72065d98 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 13 Dec 2023 19:54:36 +0000 Subject: [PATCH 342/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 2da3000936..85d812e85e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:5b08421c111ff07d43f78e4a3483e76b9a2332220378b78a06b115c00467baf3 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:07e740222c296dc0af3577d2f422ff39208ea463480604a063facdd0b344cddb lifecycle: preStop: exec: From f31530a711aff42c3349f4548882c533d55c31d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 14 Dec 2023 10:20:42 +0100 Subject: [PATCH 343/825] Upgrade to Spring Cloud Azure 5.8.0 Closes gh-1375 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ee3ef0b3f6..ae5e962654 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -94,7 +94,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 5.7.0 + version: 5.8.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From e0dc2d347ad50256778b34f7b38c8f48c2a0cc56 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 14 Dec 2023 09:30:36 +0000 Subject: [PATCH 344/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 85d812e85e..96b294e569 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:07e740222c296dc0af3577d2f422ff39208ea463480604a063facdd0b344cddb + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f8fc5b359be2a53a416e6877e508342ab974a377aa55f6bfe22d880a501cd14d lifecycle: preStop: exec: From 7ee8f9d3380eff5fe41dc4090e5001eab9c12ab3 Mon Sep 17 00:00:00 2001 From: Mike Eltsufin Date: Thu, 14 Dec 2023 19:36:46 -0500 Subject: [PATCH 345/825] Upgrade to Spring Cloud GCP 5.0.0 See gh-1378 --- start-site/src/main/resources/application.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ae5e962654..70bf1450d8 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -103,6 +103,8 @@ initializr: mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 4.9.0 + - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" + version: 5.0.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies @@ -1374,7 +1376,7 @@ initializr: description: Azure Storage Sample - name: Google Cloud bom: spring-cloud-gcp - compatibilityRange: "[3.0.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.3.0-M1)" content: - name: Google Cloud Support id: cloud-gcp From 7342695f1defb8362df4c5e9491c069fe16fbc09 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 15 Dec 2023 05:57:11 +0000 Subject: [PATCH 346/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 96b294e569..140e86bc18 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f8fc5b359be2a53a416e6877e508342ab974a377aa55f6bfe22d880a501cd14d + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:04b327c2714a9b09480f468197743eb71888d583003896e2edd473be6da85756 lifecycle: preStop: exec: From 2723265373417f27c31aeb8d6bbc65963b2160d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 15 Dec 2023 07:20:59 +0100 Subject: [PATCH 347/825] Fix bean name of Zipkin Service Connections support This commit fixes a copy/paste that leads to a BeanOverrideException if both Oracle and Zipkin are selected with Testcontainers support. To catch the issue upfront, an integration test has been added to generate the project with all available dependencies. Closes gh-1377 --- .../ZipkinProjectGenerationConfiguration.java | 2 +- .../extension/ExtensionIntegrationTests.java | 56 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 start-site/src/test/java/io/spring/start/site/extension/ExtensionIntegrationTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/zipkin/ZipkinProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/zipkin/ZipkinProjectGenerationConfiguration.java index 700c3bea4e..a5ad0dc5e2 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/zipkin/ZipkinProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/zipkin/ZipkinProjectGenerationConfiguration.java @@ -37,7 +37,7 @@ class ZipkinProjectGenerationConfiguration { @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer oracleServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + ServiceConnectionsCustomizer zipkinServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { return (serviceConnections) -> serviceResolver.doWith("zipkin", (service) -> serviceConnections .addServiceConnection(ServiceConnection.ofGenericContainer("zipkin", service, "openzipkin/zipkin"))); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/ExtensionIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/extension/ExtensionIntegrationTests.java new file mode 100644 index 0000000000..644aff6f3d --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/ExtensionIntegrationTests.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension; + +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.initializr.web.project.ProjectRequest; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatCode; + +/** + * Tests with combined extensions. + * + * @author Stephane Nicoll + */ +public class ExtensionIntegrationTests extends AbstractExtensionTests { + + @ParameterizedTest + @ValueSource(strings = { "maven-project", "gradle-project", "gradle-project-kotlin" }) + void projectWithAllDependenciesCanBeGenerated(String type) { + InitializrMetadata metadata = getMetadata(); + String platformVersion = metadata.getBootVersions().getDefault().getId(); + String[] dependencies = allDependencies(metadata, platformVersion); + ProjectRequest request = createProjectRequest(dependencies); + request.setType(type); + assertThatCode(() -> generateProject(request)).doesNotThrowAnyException(); + } + + private static String[] allDependencies(InitializrMetadata metadata, String platformVersion) { + Version targetVersion = Version.parse(platformVersion); + return metadata.getDependencies() + .getAll() + .stream() + .filter((candidate) -> candidate.match(targetVersion)) + .map(Dependency::getId) + .toArray(String[]::new); + } + +} From 54db5915183a47e82fc8c74cb5ad9dd6efeb6883 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 15 Dec 2023 06:50:31 +0000 Subject: [PATCH 348/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 140e86bc18..03f328ed04 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:04b327c2714a9b09480f468197743eb71888d583003896e2edd473be6da85756 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:42dbfb2cd8cffffd6394c2e71a34b9666a398b5b03eb70a5eca99f45e77b8cbd lifecycle: preStop: exec: From 42dfa46f73a519cf412fb751274c118f86d8be15 Mon Sep 17 00:00:00 2001 From: Andrii Hrytsiuk Date: Fri, 15 Dec 2023 13:30:51 +0100 Subject: [PATCH 349/825] Fix package name for the "Oracle Free" Testcontainers module See gh-1379 --- .../dependency/oracle/OracleProjectGenerationConfiguration.java | 2 +- .../oracle/OracleProjectGenerationConfigurationTests.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java index ba15e5b1fa..a5cf961df6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java @@ -60,7 +60,7 @@ ComposeFileCustomizer oracleComposeFileCustomizer(DockerServiceResolver serviceR private enum OracleContainer { - FREE("oracleFree", "org.testcontainers.containers.oracle.OracleContainer"), + FREE("oracleFree", "org.testcontainers.oracle.OracleContainer"), XE("oracleXe", "org.testcontainers.containers.OracleContainer"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java index 0879b439fc..ec5b119195 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java @@ -69,7 +69,7 @@ void declaresOracleFreeContainerBeanWithBoot32() { request.setBootVersion("3.2.0"); request.setLanguage("java"); assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") - .contains("import org.testcontainers.containers.oracle.OracleContainer;") + .contains("import org.testcontainers.oracle.OracleContainer;") .contains(" return new OracleContainer(DockerImageName.parse(\"gvenzl/oracle-free:latest\"));"); } From a9c05d4e0943ad89d1ea0dd4fc321c94b129b110 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 15 Dec 2023 14:15:00 +0000 Subject: [PATCH 350/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 03f328ed04..e387895618 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:42dbfb2cd8cffffd6394c2e71a34b9666a398b5b03eb70a5eca99f45e77b8cbd + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6438f905eea814dbc72daf877513a3bd47c0e692dde0f5227471c688a89901ff lifecycle: preStop: exec: From 6dfd6d6cecb805e09925ba03d64fc0ffd14a4834 Mon Sep 17 00:00:00 2001 From: Chris Bono Date: Thu, 14 Dec 2023 10:46:26 -0600 Subject: [PATCH 351/825] Move Pulsar container to use 'latest' tag See gh-1376 --- .../start/site/container/SimpleDockerServiceResolver.java | 3 +-- .../SpringPulsarProjectGenerationConfigurationTests.java | 2 +- start-site/src/test/resources/compose/pulsar.yaml | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index 81ab516774..bb5ec99a7c 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -113,8 +113,7 @@ private static DockerService postgres() { } private static DockerService pulsar() { - // The latest tag they provide is not the 'latest' GA - return DockerService.withImageAndTag("apachepulsar/pulsar:3.1.0") + return DockerService.withImageAndTag("apachepulsar/pulsar") .website("https://hub.docker.com/r/apachepulsar/pulsar") .command("bin/pulsar standalone") .ports(8080, 6650) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java index 0ff94b15ab..381ec33732 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java @@ -172,7 +172,7 @@ private void assertPulsarServiceConnectionAdded(ServiceConnections connections) assertThat(connection.containerClassNameGeneric()).isFalse(); assertThat(connection.dockerService()).satisfies((dockerService) -> { assertThat(dockerService.getImage()).isEqualTo("apachepulsar/pulsar"); - assertThat(dockerService.getImageTag()).isEqualTo("3.1.0"); + assertThat(dockerService.getImageTag()).isEqualTo("latest"); assertThat(dockerService.getWebsite()).isEqualTo("https://hub.docker.com/r/apachepulsar/pulsar"); assertThat(dockerService.getCommand()).isEqualTo("bin/pulsar standalone"); assertThat(dockerService.getPorts()).containsExactlyInAnyOrder(8080, 6650); diff --git a/start-site/src/test/resources/compose/pulsar.yaml b/start-site/src/test/resources/compose/pulsar.yaml index 1bca13fe25..cbd95ab404 100644 --- a/start-site/src/test/resources/compose/pulsar.yaml +++ b/start-site/src/test/resources/compose/pulsar.yaml @@ -1,6 +1,6 @@ services: pulsar: - image: 'apachepulsar/pulsar:3.1.0' + image: 'apachepulsar/pulsar:latest' ports: - '6650' - '8080' From bf8f6c45073f16517bd53d2f215aef5fcb2cfa34 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 18 Dec 2023 12:41:36 +0200 Subject: [PATCH 352/825] Upgrade to Vaadin 24.3.1 See gh-1380 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 70bf1450d8..0a7f0e00fa 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -147,7 +147,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.0 + version: 24.3.1 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From f19e40a946943e454c02d4af98dcea17676cb714 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 18 Dec 2023 13:03:56 +0000 Subject: [PATCH 353/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index e387895618..781085852f 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6438f905eea814dbc72daf877513a3bd47c0e692dde0f5227471c688a89901ff + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:e82f324e25102e8a3591c4fafe0fe84a9d5c51ab747a46e615f0126339f4fe33 lifecycle: preStop: exec: From 35584dce92b2b5a6f860b2a20046c9150627cdae Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 18 Dec 2023 23:12:39 +0000 Subject: [PATCH 354/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 781085852f..04e198ca4f 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:e82f324e25102e8a3591c4fafe0fe84a9d5c51ab747a46e615f0126339f4fe33 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f9f692f528952ebc6d7ec0293ad233dbfdab943bf50aa0b108c501afb2be3207 lifecycle: preStop: exec: From b614c3b70af0d838890e94506998116fbf3429f6 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Dec 2023 21:27:35 +0100 Subject: [PATCH 355/825] Upgrade to Camel 4.3.0 See gh-1382 --- start-site/src/main/resources/application.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0a7f0e00fa..d7b4c8dd41 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -800,10 +800,12 @@ initializr: href: https://rsocket.io/ - name: Apache Camel id: camel - compatibilityRange: "[3.0.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.3.0-M1)" mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 4.2.0 + - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" + version: 4.3.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From 05df5627c133145830f219cdf18c9c94e987b8d6 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 20 Dec 2023 08:25:00 +0000 Subject: [PATCH 356/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 04e198ca4f..eb6fe669b1 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f9f692f528952ebc6d7ec0293ad233dbfdab943bf50aa0b108c501afb2be3207 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2615069627b57ba0ea7b126a3da9e2333a74fb8be5ed3d675f87c8b8f292bc8d lifecycle: preStop: exec: From 95f61ba429df7ea2974933e8c390424d6542224f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 21 Dec 2023 15:46:55 +0100 Subject: [PATCH 357/825] Upgrade to Timefold 1.5.0 Closes gh-1383 --- start-site/src/main/resources/application.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d7b4c8dd41..417426e974 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -139,8 +139,8 @@ initializr: artifactId: timefold-solver-bom versionProperty: timefold-solver.version mappings: - - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 1.3.0 + - compatibilityRange: "[3.0.0,3.3.0-M1)" + version: 1.5.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom @@ -890,12 +890,11 @@ initializr: href: https://spring.io/projects/spring-shell - name: Timefold Solver id: timefold-solver - compatibilityRange: "[2.6.0,3.2.0-M1)" + compatibilityRange: "[2.6.0,3.3.0-M1)" groupId: ai.timefold.solver artifactId: timefold-solver-spring-boot-starter description: AI solver to optimize operations and scheduling. bom: timefold-solver - starter: false links: - rel: reference href: https://timefold.ai/docs/timefold-solver/latest/quickstart/spring-boot/spring-boot-quickstart#springBootJavaQuickStart From 3b676b5e7e1ee08e3b8d2d96fe26794822a75a44 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 21 Dec 2023 15:05:12 +0000 Subject: [PATCH 358/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index eb6fe669b1..abd8d4c897 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2615069627b57ba0ea7b126a3da9e2333a74fb8be5ed3d675f87c8b8f292bc8d + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:035615aa30ec0ef716a474ac16eeb6c42e51012b26523decb42f6f3347285cd0 lifecycle: preStop: exec: From 6aea92cfd2f316b78265bdd43da095579a5d742b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 21 Dec 2023 20:01:32 +0100 Subject: [PATCH 359/825] Upgrade to Spring Boot 3.2.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b70f12314c..a1e24afcff 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.0 + 3.2.1 io.spring.start start-parent From 88fe7d0b529574cac3bb56bea4354cf1b8b063cd Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 21 Dec 2023 19:11:41 +0000 Subject: [PATCH 360/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index abd8d4c897..dac39a1606 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:035615aa30ec0ef716a474ac16eeb6c42e51012b26523decb42f6f3347285cd0 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:bc5952fc7804f715c74e33877cb722ed6ef46e9af61c04badff0cbac26621c25 lifecycle: preStop: exec: From 4f5edbdb90cfe6932c9e8b3634167881bd40ca93 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Fri, 22 Dec 2023 16:20:48 +0200 Subject: [PATCH 361/825] Upgrade to Vaadin 24.3.2 See gh-1384 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 417426e974..9dcf804bd3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -147,7 +147,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.1 + version: 24.3.2 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 0ca0ae00b70376a09a6209e6dca3bca9fe6a610c Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 22 Dec 2023 14:39:05 +0000 Subject: [PATCH 362/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index dac39a1606..9eac7b9e0c 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:bc5952fc7804f715c74e33877cb722ed6ef46e9af61c04badff0cbac26621c25 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4e506de703c6f460721dcb5b18284bd8340c42c9671fbe8ddd0d6588d03bce3b lifecycle: preStop: exec: From 23b55486c6ed7aa5aedb6f7303ebbb89897f6573 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 27 Dec 2023 09:40:29 +0200 Subject: [PATCH 363/825] Upgrade to Hilla 2.5.5 See gh-1386 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9dcf804bd3..9baf881ac9 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -50,8 +50,8 @@ initializr: artifactId: hilla-bom versionProperty: hilla.version mappings: - - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 2.4.0 + - compatibilityRange: "[3.1.0,3.3.0-M1)" + version: 2.5.5 sentry: groupId: io.sentry artifactId: sentry-bom @@ -340,7 +340,7 @@ initializr: - name: Hilla id: hilla bom: hilla - compatibilityRange: "[3.1.0-M1,3.2.0-M1)" + compatibilityRange: "[3.1.0-M1,3.3.0-M1)" facets: - web groupId: dev.hilla From 5feda09dbef5dd1f7665ca27077babc5d25f86c0 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 27 Dec 2023 07:54:08 +0000 Subject: [PATCH 364/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 9eac7b9e0c..17b43ea080 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4e506de703c6f460721dcb5b18284bd8340c42c9671fbe8ddd0d6588d03bce3b + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:fa2bf3339a88904b666c77d8a160a230a78527d801de8e73796521e90b1b1575 lifecycle: preStop: exec: From 676fe35276656ddd8f99d65cc9b221d51e80f4bb Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Wed, 3 Jan 2024 10:52:42 +0000 Subject: [PATCH 365/825] Upgrade to Spring Shell 3.1.7 and 3.2.0 See gh-1387 --- start-site/src/main/resources/application.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9baf881ac9..e3f4fb6db5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -130,10 +130,9 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 3.1.6 - - compatibilityRange: "3.2.0-M1" - version: 3.2.0-RC1 - repositories: spring-milestones + version: 3.1.7 + - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" + version: 3.2.0 timefold-solver: groupId: ai.timefold.solver artifactId: timefold-solver-bom From 0584ae5b00c695d4113aaecd63dc1316e7f98ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 3 Jan 2024 11:58:16 +0100 Subject: [PATCH 366/825] Polish "Upgrade to Spring Shell 3.1.7 and 3.2.0" See gh-1387 --- start-site/src/main/resources/application.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e3f4fb6db5..96de016d5a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -882,6 +882,7 @@ initializr: id: spring-shell groupId: org.springframework.shell artifactId: spring-shell-starter + compatibilityRange: "[3.1.0,3.3.0-M1)" description: Build command line applications with spring. bom: spring-shell links: From a537fcffe4af92a72ba1b2aa13db5ab1178751fb Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 3 Jan 2024 11:06:25 +0000 Subject: [PATCH 367/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 17b43ea080..ede76162d3 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:fa2bf3339a88904b666c77d8a160a230a78527d801de8e73796521e90b1b1575 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3a267046fc3c553c4dcbc54a490f8f5658ca1aee11a4be4fdba4a00d93947116 lifecycle: preStop: exec: From c871d371a6cfd6789e8f724960fbceae3fd917ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 5 Jan 2024 09:47:57 +0100 Subject: [PATCH 368/825] Upgrade CI to Ubuntu Jammy 20231211.1 --- ci/images/start-site-ci-image/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/images/start-site-ci-image/Dockerfile b/ci/images/start-site-ci-image/Dockerfile index c293b785b8..91460dfcf6 100644 --- a/ci/images/start-site-ci-image/Dockerfile +++ b/ci/images/start-site-ci-image/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:jammy-20231004 +FROM ubuntu:jammy-20231211.1 ADD setup.sh /setup.sh RUN ./setup.sh From cd1f465e82acd080ecd2e4b6e08e342eb68a367a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 5 Jan 2024 09:53:20 +0100 Subject: [PATCH 369/825] Upgrade to Spring Javaformat 0.0.40 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a1e24afcff..6dff763dd2 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ 0.0.1-SNAPSHOT false 0.21.0-SNAPSHOT - 0.0.39 + 0.0.40 From 71fec04ae0814692eb60cdfbcff8713b5ba72b67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 5 Jan 2024 09:54:16 +0100 Subject: [PATCH 370/825] Upgrade to Maven Checkstyle Plugin 3.3.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6dff763dd2..3a99ef9034 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 3.3.0 + 3.3.1 checkstyle-validation From 8fe0930231b97adde6753f9dc0e8c9f37efa38ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 5 Jan 2024 09:55:05 +0100 Subject: [PATCH 371/825] Upgrade to Maven Surefire Plugin 3.2.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3a99ef9034..c4fb3c4389 100644 --- a/pom.xml +++ b/pom.xml @@ -134,7 +134,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.1.2 + 3.2.3 From ec5eb9627a2029c80e35e229384fb23039667fb5 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 5 Jan 2024 09:15:54 +0000 Subject: [PATCH 372/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index ede76162d3..5a07c7ed9e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3a267046fc3c553c4dcbc54a490f8f5658ca1aee11a4be4fdba4a00d93947116 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:eb9c1832e967020166d0aac96fb1df5883373e8fb0339d7e1b79f171660e4d9e lifecycle: preStop: exec: From f18baad6cc7fc95013006036e0a0e62b5b5fe428 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 9 Jan 2024 05:47:05 +0000 Subject: [PATCH 373/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 5a07c7ed9e..c65b2aa405 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:eb9c1832e967020166d0aac96fb1df5883373e8fb0339d7e1b79f171660e4d9e + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f36c7227937c4d2f5fe326c54c76023918b153c1aa17d57dde35c41e85b198fa lifecycle: preStop: exec: From 778f14b2d2a048d4bbe002b176b96b715c5a701e Mon Sep 17 00:00:00 2001 From: Slawomir Messner Date: Fri, 5 Jan 2024 21:32:27 +0100 Subject: [PATCH 374/825] Upgrade to Maven Wrapper 3.9.6 See gh-1388 --- .mvn/wrapper/maven-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index 5f0536eb74..e70e7bc8d6 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,2 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar From 5376310002366e594dedb5f0e4eb7c0915960de2 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 9 Jan 2024 08:58:03 +0000 Subject: [PATCH 375/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index c65b2aa405..1603b73d6e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:f36c7227937c4d2f5fe326c54c76023918b153c1aa17d57dde35c41e85b198fa + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2387ec25053ac7bcf3b43e56408d4eac25ff5cfa6555d428d199f40cff38b1cf lifecycle: preStop: exec: From 60b47ccb5a235222a6d2122f3e541019ea1e1dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Wed, 10 Jan 2024 17:07:36 +0100 Subject: [PATCH 376/825] Upgrade to Timefold Solver 1.6.0 See gh-1390 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 96de016d5a..8b24ac26e3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -139,7 +139,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 1.5.0 + version: 1.6.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From 03b21cf7d126fba95b217d535520fe10aae787e8 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 11 Jan 2024 10:25:35 +0000 Subject: [PATCH 377/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 1603b73d6e..4b7d15b2e0 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2387ec25053ac7bcf3b43e56408d4eac25ff5cfa6555d428d199f40cff38b1cf + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:883ab98f3f6ac069c51e67ddf00bb7c545bdd13963a0153d51f75e5a6253da59 lifecycle: preStop: exec: From f963ab4810948cf702d14449c893e9712fa212a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 12 Jan 2024 17:34:44 +0100 Subject: [PATCH 378/825] Upgrade to Spring Javaformat 0.0.41 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c4fb3c4389..79d5f1d329 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ 0.0.1-SNAPSHOT false 0.21.0-SNAPSHOT - 0.0.40 + 0.0.41 From 3e61b8ce01c16ec530fa7d6aea964850418187dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 12 Jan 2024 17:38:06 +0100 Subject: [PATCH 379/825] Upgrade to Checkstyle 10.12.7 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 79d5f1d329..791066fddb 100644 --- a/pom.xml +++ b/pom.xml @@ -112,7 +112,7 @@ com.puppycrawl.tools checkstyle - 9.3 + 10.12.7 io.spring.javaformat From 42fd09b7edf405f4d3986702cf4aa95c13d8779a Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 12 Jan 2024 16:46:58 +0000 Subject: [PATCH 380/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 4b7d15b2e0..261ae9b262 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:883ab98f3f6ac069c51e67ddf00bb7c545bdd13963a0153d51f75e5a6253da59 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:ea20b96462969632adeb40f98b987a36ba2287d742f364660a78b8b461056ebf lifecycle: preStop: exec: From aa614bc243db8b5577158580e08ef14623c7a4f6 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 12 Jan 2024 17:05:02 +0000 Subject: [PATCH 381/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 261ae9b262..2730ed95c4 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:ea20b96462969632adeb40f98b987a36ba2287d742f364660a78b8b461056ebf + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6e26ec268669c6817c9b3c8cb419bc745c3814ab4cfb0cfac04b7c72f7ea798c lifecycle: preStop: exec: From 33cb35fade4db2a807b9cac659eca088bbdbaf36 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:24:29 +0200 Subject: [PATCH 382/825] Upgrade to Vaadin 24.3.3 See gh-1391 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8b24ac26e3..44ebcd1e0a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -146,7 +146,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.2 + version: 24.3.3 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From cf520a9b2f4b4857f2b62cde81284a67fdfd5ccd Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Tue, 16 Jan 2024 15:09:31 +0100 Subject: [PATCH 383/825] Update dependencies --- start-client/yarn.lock | 1911 ++++++++++++++++++++-------------------- 1 file changed, 932 insertions(+), 979 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index c64f5a1c42..34f6ac569e 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -25,9 +25,9 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.23.0.tgz#1d7f37c44d4117c67df46749e0c86e11a58cc64b" - integrity sha512-17E1oSkGk2IwNILM4jtfAvgjt+ohmpfBky8aLerUfYZhiPNg7ca+CRCxZn8QDxwNhV/upsc2VHBCqGFIR+iBfA== + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.23.4.tgz#f5cc90487278065fa0c3b1267cf0c1d44ddf85a7" + integrity sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw== dependencies: "@jridgewell/trace-mapping" "^0.3.17" commander "^4.0.1" @@ -40,34 +40,34 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: - "@babel/highlight" "^7.22.13" + "@babel/highlight" "^7.23.4" chalk "^2.4.2" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" - integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" + integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.7" + "@babel/parser" "^7.23.6" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -75,20 +75,20 @@ semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz#263f059c476e29ca4972481a17b8b660cb025a34" - integrity sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz#7bf0db1c53b54da0c8a12627373554a0828479ca" + integrity sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@^7.23.6", "@babel/generator@^7.7.2": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.23.6" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -100,40 +100,40 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" - integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz#b2e6826e0e20d337143655198b79d58fdc9bd43d" + integrity sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-replace-supers" "^7.22.20" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== @@ -142,10 +142,10 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" - integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== +"@babel/helper-define-polyfill-provider@^0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088" + integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -153,7 +153,7 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": +"@babel/helper-environment-visitor@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== @@ -173,24 +173,24 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.15": +"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: "@babel/types" "^7.23.0" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -210,7 +210,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": +"@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== @@ -219,7 +219,7 @@ "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-wrap-function" "^7.22.20" -"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": +"@babel/helper-replace-supers@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== @@ -249,22 +249,22 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helper-wrap-function@^7.22.20", "@babel/helper-wrap-function@^7.22.5": +"@babel/helper-wrap-function@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== @@ -273,44 +273,52 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== +"@babel/helpers@^7.23.7": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.8.tgz#fc6b2d65b16847fd50adddbd4232c76378959e34" + integrity sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== dependencies: "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.7.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.6", "@babel/parser@^7.7.0": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" - integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" + integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" - integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" + integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-optional-chaining" "^7.23.3" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b" + integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-proposal-class-properties@^7.13.0": version "7.18.6" @@ -321,31 +329,29 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.13.15": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz#0b345a5754f48309fa50b7cd99075ef0295b12c8" - integrity sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg== + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.7.tgz#1d827902cbd3d9054e54fb2f2056cdd1eaa0e368" + integrity sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-create-class-features-plugin" "^7.23.7" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/plugin-syntax-decorators" "^7.22.10" + "@babel/plugin-syntax-decorators" "^7.23.3" "@babel/plugin-proposal-do-expressions@^7.12.13": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.22.5.tgz#7a48d7b33d19ab3e676c67659f55319f655a3f55" - integrity sha512-Qh6Sbkt6xCRbHykDc709db/EQB4RJlmaW3ENuvzzi7G6GKeDNQHx81P0OdI9oEXhhHEJvLRzIr08m8HNCJWS8g== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.23.3.tgz#f80a81b171402facedd4e57f946c2d0f47d2ef0f" + integrity sha512-j0vN+mg0UvdtkH+rPK9jrCS8qsJ5EXjAyVa6TfHzqertV4INpNykn9hatI/2xpJ6FzQlX5dM9gprslbSEDjPWQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-do-expressions" "^7.22.5" + "@babel/plugin-syntax-do-expressions" "^7.23.3" "@babel/plugin-proposal-export-default-from@^7.12.13": - version "7.22.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.17.tgz#91b60cd338f501cccdf549af2308768911ec5fbb" - integrity sha512-cop/3quQBVvdz6X5SJC6AhUv3C9DrVTM06LUEXimEdWAhCSyOJIr9NiZDU9leHZ0/aiG0Sh7Zmvaku5TWYNgbA== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.23.3.tgz#6f511a676c540ccc8d17a8553dbba9230b0ddac0" + integrity sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-default-from" "^7.22.5" + "@babel/plugin-syntax-export-default-from" "^7.23.3" "@babel/plugin-proposal-export-namespace-from@^7.12.13": version "7.18.9" @@ -356,21 +362,21 @@ "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-function-bind@^7.12.13": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.22.5.tgz#4d3bcee613b123b20bf3106b2a3ad047afe26a1a" - integrity sha512-ckAugfDtdcrXKP49z7K7JI7QkA8SRidmsKxLizH8mg0UWOvcmvEd9/VDLzFcWlZqchvLDPUYpwuXNGAYjsscrw== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.23.3.tgz#f3275bd7ec6b0132332244e835e48a3d24ec8f84" + integrity sha512-LlDuU9NIXn1JJugzvqWeEY4m/K/vJpIp93L2fA9tHqDVsIxezsit/sHrqJWbswWkzSIrKuuI8nF65Ewtka3k2g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-function-bind" "^7.22.5" + "@babel/plugin-syntax-function-bind" "^7.23.3" "@babel/plugin-proposal-function-sent@^7.12.13": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.22.5.tgz#51a9354c83a629becd50f00b4eb0f1c686c8b4b6" - integrity sha512-YFEE5KDhaNCCD0I1j9vqPp5bpPuoDAPD+4Adk0QXdrL9TbmZluCuznuYvmlYqr14zfXCBGAZivfiLb6WI4GhSw== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.23.3.tgz#6b81145902030945edfd94aa263a9601b862f06f" + integrity sha512-dSbjzbWBPvVumoT6gokV3kYBNz+KFgQMMpd2JeN6BhO34LH3AicqdOc5r4qIeakSqNFZXqMVdRNI7J7xMwqpXA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.5" - "@babel/plugin-syntax-function-sent" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.20" + "@babel/plugin-syntax-function-sent" "^7.23.3" "@babel/plugin-proposal-json-strings@^7.13.8": version "7.18.6" @@ -414,12 +420,12 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-pipeline-operator@^7.12.13": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.22.15.tgz#02711e858ea4996dd50bbdd8a278b347f6344276" - integrity sha512-tk81rXNA4T/AQc4zFhIIJp9OSmY8rmy46G7LXiPm4+/X8A0A0f9ri6yjEIj3fYqZQYrQnX9uuWXppPGsEesYtg== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.23.3.tgz#98048c0c1700801f41a89455b79dc54727be1dac" + integrity sha512-8TDc1vEx+YRaGiF8J8w/XcADaBuqc0RnokaMRrHdX7Vx74WhmxPU8wtM/OHSXvgw45P9tlHS/l0YDpNXwLghmQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-pipeline-operator" "^7.22.5" + "@babel/plugin-syntax-pipeline-operator" "^7.23.3" "@babel/plugin-proposal-private-methods@^7.13.0": version "7.18.6" @@ -435,12 +441,12 @@ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-proposal-throw-expressions@^7.12.13": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.22.5.tgz#2c0613f208214051bed7bff6302216aa9697e1c0" - integrity sha512-34kY5YjNKDhjXbj2oNDkxl0xNl2+yQTEsWu8Ia6kCTb6wz76bBCd4DzmeZokfr6g68yneu3eg8qAyYgKbyesFg== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.23.3.tgz#acb23c5ffc0cae31d5a52b26e678d1b9a69dbc5b" + integrity sha512-aAQebpCm3+qUMJ3ug9B5G26Z5VsaE955lGWrZMhAIPFhK/Cv7bL9GbWgdEXmel/jlHTRvwcYRnfzJS2prsPdVg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-throw-expressions" "^7.22.5" + "@babel/plugin-syntax-throw-expressions" "^7.23.3" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -470,17 +476,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz#7d83ea04d893c442b78ebf4c3cbac59a7211deff" - integrity sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ== +"@babel/plugin-syntax-decorators@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz#a1d351d6c25bfdcf2e16f99b039101bc0ffcb0ca" + integrity sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-do-expressions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.22.5.tgz#49e3af8e2d1254a47d545d4b52d2ef0dc5bcbd51" - integrity sha512-60pOTgQGY00/Kiozrtu286Aqg50IxDy/jIHhlMzXjYTs1Q8lbeOgqC9NLidtqfBNwdX6bZCT6FJ2i5xzt+JKzw== +"@babel/plugin-syntax-do-expressions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.23.3.tgz#5be02150983fe3ce3af6a016583e1eb8200c99d4" + integrity sha512-GBmwXqthSDjlXzwF19qZjFBeHtigX9/0g670FSv8gKEjbD4k+BuRBPlpDQdr/+ts0UlimhJUd/oPilMFqyHq+w== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -491,10 +497,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz#ac3a24b362a04415a017ab96b9b4483d0e2a6e44" - integrity sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ== +"@babel/plugin-syntax-export-default-from@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.23.3.tgz#7e6d4bf595d5724230200fb2b7401d4734b15335" + integrity sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -505,31 +511,31 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-function-bind@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.22.5.tgz#4a01aa675dac0431b47eb440900ed0d4efd54d50" - integrity sha512-Sjy7XIhHF9L++0Mk/3Y4H4439cjI//wc/jE8Ly3+qGPkTUYYEhe4rzMv/JnyZpekfOBL22X6DAq42I7GM/3KzA== +"@babel/plugin-syntax-function-bind@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.23.3.tgz#1bf08e34ac9e5473a57cbc28e569b738d7d3b092" + integrity sha512-BVBglNxpv45awQYCln57SX2EJge4YK0liwH1Clzk/Nnx/bdLmZRhP0vt1koJqDLAEG8MngIPbIMNNNOXPcnXYQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-function-sent@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.22.5.tgz#9bb1d4d8e835c30e0eb1c45bd3883658ccc0ff94" - integrity sha512-tKOWGUAVv+JGJ1tcOIFdCqxUX97lgAUnmLpWt/9JtEkgk9WQ5OolN+y9rWj6mtLM+d0kAzTGLu/kRQqr5/PEsA== +"@babel/plugin-syntax-function-sent@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.23.3.tgz#71571a17ad31d20bb64685c090b933db975206d3" + integrity sha512-wd4AHIGg0VtmX3kxFOYI5R5+vwy6+9xRnkBekTTkUCRBT9A1oZ7LnQN0GYLVl/3DThqTJGaumrvKRLqodjc1vw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-assertions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" - integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== +"@babel/plugin-syntax-import-assertions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-attributes@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" - integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== +"@babel/plugin-syntax-import-attributes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" + integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -547,10 +553,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== +"@babel/plugin-syntax-jsx@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -596,10 +602,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-pipeline-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.22.5.tgz#181fd9276aa72e75a408e07b929b457b732c16db" - integrity sha512-7yuGXd+h8gpR14FnPDTTCd5TfC/1B9njNZJT29GJ7UFF/WVbzkZy7728DynrENqgImqj5xyPTQAo8si9n3QVJQ== +"@babel/plugin-syntax-pipeline-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.23.3.tgz#04fb797ccaac27622f491d0babced1b5793a5ba7" + integrity sha512-xypNE8ptJ5buVtgAAOZzN3gIV6McZfMA27GMhy70a8auQIxbLW9g/uKsaoWqUHdPJgpsXYjVD+5oDyS6pRvraA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -610,10 +616,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-throw-expressions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.22.5.tgz#9ab803c17e25bbfedf8375acbbb0aa9f51c55496" - integrity sha512-oCyfA7rDVcQIydA7ZOmnHCQTzz5JvG9arY++Z+ASL/q5q+mJLblaRNHoK6ggV54X2c14wCK/lQi7z1DujmEmZA== +"@babel/plugin-syntax-throw-expressions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.23.3.tgz#46077241577243b00ddd465f627242c492bf935c" + integrity sha512-P7zUpjwebv09kxTCG0Gp0TMa8luPG4t2Q5gylayLeRHHwfUR4jgjYgx/X9DYPF81/W5aYpYOzX2kQnChAFFp8Q== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -625,9 +631,9 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -639,211 +645,211 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== +"@babel/plugin-transform-arrow-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" - integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== +"@babel/plugin-transform-async-generator-functions@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz#3aa0b4f2fa3788b5226ef9346cf6d16ec61f99cd" + integrity sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== +"@babel/plugin-transform-async-to-generator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" + integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== dependencies: - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" -"@babel/plugin-transform-block-scoped-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" - integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== +"@babel/plugin-transform-block-scoped-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" - integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== +"@babel/plugin-transform-block-scoping@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" + integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" - integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== +"@babel/plugin-transform-class-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" + integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-static-block@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" - integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== +"@babel/plugin-transform-class-static-block@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" + integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" - integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== +"@babel/plugin-transform-classes@^7.23.8": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" + integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-replace-supers" "^7.22.20" "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== +"@babel/plugin-transform-computed-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" + "@babel/template" "^7.22.15" -"@babel/plugin-transform-destructuring@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" - integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== +"@babel/plugin-transform-destructuring@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" - integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== +"@babel/plugin-transform-dotall-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" + integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" - integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== +"@babel/plugin-transform-duplicate-keys@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" + integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dynamic-import@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" - integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== +"@babel/plugin-transform-dynamic-import@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" + integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" - integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== +"@babel/plugin-transform-exponentiation-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" + integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-export-namespace-from@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" - integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== +"@babel/plugin-transform-export-namespace-from@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" + integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" - integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== +"@babel/plugin-transform-for-of@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" + integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== +"@babel/plugin-transform-function-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-json-strings@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" - integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== +"@babel/plugin-transform-json-strings@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" + integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== +"@babel/plugin-transform-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-logical-assignment-operators@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" - integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== +"@babel/plugin-transform-logical-assignment-operators@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" + integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" - integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== +"@babel/plugin-transform-member-expression-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" - integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== +"@babel/plugin-transform-modules-amd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" + integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== dependencies: - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" - integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== +"@babel/plugin-transform-modules-commonjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== dependencies: - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" - integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== +"@babel/plugin-transform-modules-systemjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" + integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-modules-umd@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" - integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== +"@babel/plugin-transform-modules-umd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" + integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== dependencies: - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": @@ -854,101 +860,101 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" - integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== +"@babel/plugin-transform-new-target@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" + integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" - integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== +"@babel/plugin-transform-nullish-coalescing-operator@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" + integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" - integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== +"@babel/plugin-transform-numeric-separator@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" + integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" - integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== +"@babel/plugin-transform-object-rest-spread@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" + integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== dependencies: - "@babel/compat-data" "^7.22.9" + "@babel/compat-data" "^7.23.3" "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-parameters" "^7.23.3" -"@babel/plugin-transform-object-super@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" - integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== +"@babel/plugin-transform-object-super@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" -"@babel/plugin-transform-optional-catch-binding@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" - integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== +"@babel/plugin-transform-optional-catch-binding@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" + integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" - integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== +"@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" + integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" - integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== +"@babel/plugin-transform-parameters@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-methods@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" - integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== +"@babel/plugin-transform-private-methods@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" + integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-property-in-object@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" - integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== +"@babel/plugin-transform-private-property-in-object@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" + integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" - integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== +"@babel/plugin-transform-property-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-display-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== +"@babel/plugin-transform-react-display-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" + integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -960,137 +966,138 @@ "@babel/plugin-transform-react-jsx" "^7.22.5" "@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" - integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" -"@babel/plugin-transform-react-pure-annotations@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" - integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== +"@babel/plugin-transform-react-pure-annotations@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c" + integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" - integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== +"@babel/plugin-transform-regenerator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" + integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" - integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== +"@babel/plugin-transform-reserved-words@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" + integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.18.5": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz#c956a3f8d1aa50816ff6c30c6288d66635c12990" - integrity sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA== + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz#52bbd20054855beb9deae3bee9ceb05289c343e6" + integrity sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw== dependencies: "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.6" - babel-plugin-polyfill-corejs3 "^0.8.5" - babel-plugin-polyfill-regenerator "^0.5.3" + babel-plugin-polyfill-corejs2 "^0.4.7" + babel-plugin-polyfill-corejs3 "^0.8.7" + babel-plugin-polyfill-regenerator "^0.5.4" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== +"@babel/plugin-transform-shorthand-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== +"@babel/plugin-transform-spread@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" - integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== +"@babel/plugin-transform-sticky-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" + integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" - integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== +"@babel/plugin-transform-template-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" - integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== +"@babel/plugin-transform-typeof-symbol@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" + integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" - integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== +"@babel/plugin-transform-unicode-escapes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" + integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-property-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" - integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== +"@babel/plugin-transform-unicode-property-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" + integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" - integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== +"@babel/plugin-transform-unicode-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" + integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-sets-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" - integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== +"@babel/plugin-transform-unicode-sets-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" + integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059" - integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ== + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.8.tgz#7d6f8171ea7c221ecd28059e65ad37c20e441e3e" + integrity sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA== dependencies: - "@babel/compat-data" "^7.23.2" - "@babel/helper-compilation-targets" "^7.22.15" + "@babel/compat-data" "^7.23.5" + "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.22.5" - "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-assertions" "^7.23.3" + "@babel/plugin-syntax-import-attributes" "^7.23.3" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1102,59 +1109,58 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.23.2" - "@babel/plugin-transform-async-to-generator" "^7.22.5" - "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.23.0" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.11" - "@babel/plugin-transform-classes" "^7.22.15" - "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.23.0" - "@babel/plugin-transform-dotall-regex" "^7.22.5" - "@babel/plugin-transform-duplicate-keys" "^7.22.5" - "@babel/plugin-transform-dynamic-import" "^7.22.11" - "@babel/plugin-transform-exponentiation-operator" "^7.22.5" - "@babel/plugin-transform-export-namespace-from" "^7.22.11" - "@babel/plugin-transform-for-of" "^7.22.15" - "@babel/plugin-transform-function-name" "^7.22.5" - "@babel/plugin-transform-json-strings" "^7.22.11" - "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" - "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.23.0" - "@babel/plugin-transform-modules-commonjs" "^7.23.0" - "@babel/plugin-transform-modules-systemjs" "^7.23.0" - "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-arrow-functions" "^7.23.3" + "@babel/plugin-transform-async-generator-functions" "^7.23.7" + "@babel/plugin-transform-async-to-generator" "^7.23.3" + "@babel/plugin-transform-block-scoped-functions" "^7.23.3" + "@babel/plugin-transform-block-scoping" "^7.23.4" + "@babel/plugin-transform-class-properties" "^7.23.3" + "@babel/plugin-transform-class-static-block" "^7.23.4" + "@babel/plugin-transform-classes" "^7.23.8" + "@babel/plugin-transform-computed-properties" "^7.23.3" + "@babel/plugin-transform-destructuring" "^7.23.3" + "@babel/plugin-transform-dotall-regex" "^7.23.3" + "@babel/plugin-transform-duplicate-keys" "^7.23.3" + "@babel/plugin-transform-dynamic-import" "^7.23.4" + "@babel/plugin-transform-exponentiation-operator" "^7.23.3" + "@babel/plugin-transform-export-namespace-from" "^7.23.4" + "@babel/plugin-transform-for-of" "^7.23.6" + "@babel/plugin-transform-function-name" "^7.23.3" + "@babel/plugin-transform-json-strings" "^7.23.4" + "@babel/plugin-transform-literals" "^7.23.3" + "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" + "@babel/plugin-transform-member-expression-literals" "^7.23.3" + "@babel/plugin-transform-modules-amd" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-umd" "^7.23.3" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" - "@babel/plugin-transform-numeric-separator" "^7.22.11" - "@babel/plugin-transform-object-rest-spread" "^7.22.15" - "@babel/plugin-transform-object-super" "^7.22.5" - "@babel/plugin-transform-optional-catch-binding" "^7.22.11" - "@babel/plugin-transform-optional-chaining" "^7.23.0" - "@babel/plugin-transform-parameters" "^7.22.15" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.11" - "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.10" - "@babel/plugin-transform-reserved-words" "^7.22.5" - "@babel/plugin-transform-shorthand-properties" "^7.22.5" - "@babel/plugin-transform-spread" "^7.22.5" - "@babel/plugin-transform-sticky-regex" "^7.22.5" - "@babel/plugin-transform-template-literals" "^7.22.5" - "@babel/plugin-transform-typeof-symbol" "^7.22.5" - "@babel/plugin-transform-unicode-escapes" "^7.22.10" - "@babel/plugin-transform-unicode-property-regex" "^7.22.5" - "@babel/plugin-transform-unicode-regex" "^7.22.5" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" + "@babel/plugin-transform-numeric-separator" "^7.23.4" + "@babel/plugin-transform-object-rest-spread" "^7.23.4" + "@babel/plugin-transform-object-super" "^7.23.3" + "@babel/plugin-transform-optional-catch-binding" "^7.23.4" + "@babel/plugin-transform-optional-chaining" "^7.23.4" + "@babel/plugin-transform-parameters" "^7.23.3" + "@babel/plugin-transform-private-methods" "^7.23.3" + "@babel/plugin-transform-private-property-in-object" "^7.23.4" + "@babel/plugin-transform-property-literals" "^7.23.3" + "@babel/plugin-transform-regenerator" "^7.23.3" + "@babel/plugin-transform-reserved-words" "^7.23.3" + "@babel/plugin-transform-shorthand-properties" "^7.23.3" + "@babel/plugin-transform-spread" "^7.23.3" + "@babel/plugin-transform-sticky-regex" "^7.23.3" + "@babel/plugin-transform-template-literals" "^7.23.3" + "@babel/plugin-transform-typeof-symbol" "^7.23.3" + "@babel/plugin-transform-unicode-escapes" "^7.23.3" + "@babel/plugin-transform-unicode-property-regex" "^7.23.3" + "@babel/plugin-transform-unicode-regex" "^7.23.3" + "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.23.0" - babel-plugin-polyfill-corejs2 "^0.4.6" - babel-plugin-polyfill-corejs3 "^0.8.5" - babel-plugin-polyfill-regenerator "^0.5.3" + babel-plugin-polyfill-corejs2 "^0.4.7" + babel-plugin-polyfill-corejs3 "^0.8.7" + babel-plugin-polyfill-regenerator "^0.5.4" core-js-compat "^3.31.0" semver "^6.3.1" @@ -1168,30 +1174,30 @@ esutils "^2.0.2" "@babel/preset-react@^7.13.13": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" - integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709" + integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-display-name" "^7.23.3" "@babel/plugin-transform-react-jsx" "^7.22.15" "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.23.3" "@babel/regjsgen@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" - integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== +"@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650" + integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": +"@babel/template@^7.22.15", "@babel/template@^7.3.3": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== @@ -1200,28 +1206,28 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.23.2", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.23.7", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" + integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" + "@babel/parser" "^7.23.6" + "@babel/types" "^7.23.6" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== dependencies: - "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" @@ -1243,14 +1249,14 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" - integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@eslint/eslintrc@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1262,10 +1268,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.52.0": - version "8.52.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.52.0.tgz#78fe5f117840f69dc4a353adf9b9cd926353378c" - integrity sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA== +"@eslint/js@8.56.0": + version "8.56.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" + integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== "@gar/promisify@^1.0.1": version "1.1.3" @@ -1273,12 +1279,12 @@ integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== "@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -1286,10 +1292,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1845,10 +1851,10 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.21" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz#5dc1df7b3dc4a6209e503a924e1ca56097a2bb15" + integrity sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1920,10 +1926,10 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.23" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.23.tgz#498e41218ab3b6a1419c735e5c6ae2c5ed609b6c" - integrity sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg== +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.24" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.24.tgz#58601079e11784d20f82d0585865bb42305c4df3" + integrity sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ== "@rollup/plugin-babel@^5.2.0": version "5.3.1" @@ -2002,9 +2008,9 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/babel__core@^7.1.14": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.3.tgz#d5625a50b6f18244425a1359a858c73d70340778" - integrity sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -2013,84 +2019,84 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.6" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.6.tgz#676f89f67dc8ddaae923f70ebc5f1fa800c031a8" - integrity sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w== + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.3.tgz#db9ac539a2fe05cfe9e168b24f360701bde41f5f" - integrity sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.3.tgz#a971aa47441b28ef17884ff945d0551265a2d058" - integrity sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== dependencies: "@babel/types" "^7.20.7" "@types/body-parser@*": - version "1.19.4" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.4.tgz#78ad68f1f79eb851aa3634db0c7f57f6f601b462" - integrity sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA== + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.12" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.12.tgz#49badafb988e6c433ca675a5fd769b93b7649fc8" - integrity sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg== + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz#acf51e088b3bb6507f7b093bd2b0de20940179cc" - integrity sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q== + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.37" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.37.tgz#c66a96689fd3127c8772eb3e9e5c6028ec1a9af5" - integrity sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q== + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/debug@^4.0.0": - version "4.1.10" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.10.tgz#f23148a6eb771a34c466a4fc28379d8101e84494" - integrity sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA== + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" "@types/eslint-scope@^3.7.3": - version "3.7.6" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.6.tgz#585578b368ed170e67de8aae7b93f54a1b2fdc26" - integrity sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ== + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.6" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.6.tgz#60e564551966dd255f4c01c459f0b4fb87068603" - integrity sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw== + version "8.56.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.2.tgz#1c72a9b794aa26a8b94ad26d5b9aa51c8a6384bb" + integrity sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.3.tgz#2be19e759a3dd18c79f9f436bd7363556c1a73dd" - integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/estree@0.0.39": version "0.0.39" @@ -2098,9 +2104,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.39" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz#2107afc0a4b035e6cb00accac3bdf2d76ae408c8" - integrity sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ== + version "4.17.41" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" + integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2108,9 +2114,9 @@ "@types/send" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.20" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.20.tgz#e7c9b40276d29e38a4e3564d7a3d65911e2aa433" - integrity sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw== + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -2126,16 +2132,16 @@ "@types/node" "*" "@types/graceful-fs@^4.1.3": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.8.tgz#417e461e4dc79d957dc3107f45fe4973b09c2915" - integrity sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/hast@^2.0.0": - version "2.3.7" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.7.tgz#5e9bd7ab4452d5313aeec9d38fbc193a70f8d810" - integrity sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw== + version "2.3.9" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.9.tgz#a9a1b5bbce46e8a1312e977364bacabc8e93d2cf" + integrity sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw== dependencies: "@types/unist" "^2" @@ -2145,40 +2151,40 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-errors@*": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.3.tgz#c54e61f79b3947d040f150abd58f71efb422ff62" - integrity sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.8": - version "1.17.13" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.13.tgz#dd3a4da550580eb0557d4c7128a2ff1d1a38d465" - integrity sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw== + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" - integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz#394798d5f727402eb5ec99eb9618ffcd2b7645a1" - integrity sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz#0313e2608e6d6955d195f55361ddeebd4b74c6e7" - integrity sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.14" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" - integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" @@ -2186,21 +2192,21 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/mdast@^3.0.0": - version "3.0.14" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.14.tgz#0735473a5b35be032b9f2685b7413cbab1b8a639" - integrity sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw== + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== dependencies: "@types/unist" "^2" "@types/mime@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.3.tgz#886674659ce55fe7c6c06ec5ca7c0eb276a08f91" - integrity sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" + integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== "@types/mime@^1": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" - integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/minimatch@*": version "5.1.2" @@ -2208,21 +2214,28 @@ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.0": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.4.tgz#81f886786411c45bba3f33e781ab48bd56bfca2e" - integrity sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/ms@*": - version "0.7.33" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.33.tgz#80bf1da64b15f21fd8c1dc387c31929317d99ee9" - integrity sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ== + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" "@types/node@*": - version "20.8.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.8.tgz#adee050b422061ad5255fc38ff71b2bb96ea2a0e" - integrity sha512-YRsdVxq6OaLfmR9Hy816IMp33xOBjfyOgUd77ehqg96CFywxAPbDbXvAsuN2KVg2HOT8Eh6uAfU+l4WffwPVrQ== + version "20.11.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.4.tgz#c724a5d6723182af758b91b994209336f4439cb7" + integrity sha512-6I0fMH8Aoy2lOejL3s4LhyIYX34DPwY8bl5xlNjBvUEk8OHrcuzsFt+Ied4LvJihbtXPM+8zUqdydfIti86v9g== dependencies: - undici-types "~5.25.1" + undici-types "~5.26.4" "@types/node@16.9.1": version "16.9.1" @@ -2230,9 +2243,9 @@ integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g== "@types/normalize-package-data@^2.4.0": - version "2.4.3" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" - integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/prettier@^2.1.5": version "2.7.3" @@ -2240,19 +2253,19 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@^15.0.0": - version "15.7.9" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.9.tgz#b6f785caa7ea1fe4414d9df42ee0ab67f23d8a6d" - integrity sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g== + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== "@types/qs@*": - version "6.9.9" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" - integrity sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg== + version "6.9.11" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" + integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== "@types/range-parser@*": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.6.tgz#7cb33992049fd7340d5b10c0098e104184dfcd2a" - integrity sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA== + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/resolve@1.17.1": version "1.17.1" @@ -2267,79 +2280,79 @@ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/semver@^7.3.12": - version "7.5.4" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff" - integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ== + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== "@types/send@*": - version "0.17.3" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.3.tgz#81b2ea5a3a18aad357405af2d643ccbe5a09020b" - integrity sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug== + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.3.tgz#af9403916eb6fbf7d6ec6f47b2a4c46eb3222cc9" - integrity sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg== + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.4" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.4.tgz#44b5895a68ca637f06c229119e1c774ca88f81b2" - integrity sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw== + version "1.15.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== dependencies: "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" "@types/sockjs@^0.3.33": - version "0.3.35" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.35.tgz#f4a568c73d2a8071944bd6ffdca0d4e66810cd21" - integrity sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw== + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: "@types/node" "*" "@types/stack-utils@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.2.tgz#01284dde9ef4e6d8cef6422798d9a3ad18a66f8b" - integrity sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/trusted-types@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.5.tgz#5cac7e7df3275bb95f79594f192d97da3b4fd5fe" - integrity sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA== + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== "@types/unist@^2", "@types/unist@^2.0.0": - version "2.0.9" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.9.tgz#72e164381659a49557b0a078b28308f2c6a3e1ce" - integrity sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ== + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== "@types/ws@^8.5.5": - version "8.5.8" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.8.tgz#13efec7bd439d0bdf2af93030804a94f163b1430" - integrity sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg== + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== dependencies: "@types/node" "*" "@types/yargs-parser@*": - version "21.0.2" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.2.tgz#7bd04c5da378496ef1695a1008bf8f71847a8b8b" - integrity sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^15.0.0": - version "15.0.17" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.17.tgz#bea870ba551b43831bfaa75de2e4a3849c39322b" - integrity sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA== + version "15.0.19" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" + integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.29" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.29.tgz#06aabc72497b798c643c812a8b561537fea760cf" - integrity sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA== + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== dependencies: "@types/yargs-parser" "*" @@ -2568,9 +2581,9 @@ acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== acorn@^6.0.7: version "6.4.2" @@ -2578,9 +2591,9 @@ acorn@^6.0.7: integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -2745,7 +2758,7 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.1.3: +aria-query@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== @@ -2780,11 +2793,6 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - array-includes@^3.1.6, array-includes@^3.1.7: version "3.1.7" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" @@ -2895,10 +2903,10 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== astral-regex@^1.0.0: version "1.0.0" @@ -2911,9 +2919,9 @@ async-foreach@^0.1.3: integrity sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA== async@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== asynciterator.prototype@^1.0.0: version "1.0.0" @@ -2952,12 +2960,12 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axe-core@^4.6.2: - version "4.8.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" - integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== +axe-core@=4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== -axobject-query@^3.1.1: +axobject-query@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== @@ -3020,29 +3028,29 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" - integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== +babel-plugin-polyfill-corejs2@^0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz#679d1b94bf3360f7682e11f2cb2708828a24fe8c" + integrity sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.3" + "@babel/helper-define-polyfill-provider" "^0.4.4" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.5: - version "0.8.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf" - integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ== +babel-plugin-polyfill-corejs3@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" + integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.3" + "@babel/helper-define-polyfill-provider" "^0.4.4" core-js-compat "^3.33.1" -babel-plugin-polyfill-regenerator@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" - integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== +babel-plugin-polyfill-regenerator@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz#c6fc8eab610d3a11eb475391e52584bacfc020f4" + integrity sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.3" + "@babel/helper-define-polyfill-provider" "^0.4.4" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -3149,12 +3157,10 @@ body-scroll-lock@^3.1.5: integrity sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg== bonjour-service@^1.0.11: - version "1.1.1" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" - integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" + integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" @@ -3201,14 +3207,14 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.9, browserslist@^4.22.1: - version "4.22.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== +browserslist@^4.14.5, browserslist@^4.22.2: + version "4.22.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" + integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" - node-releases "^2.0.13" + caniuse-lite "^1.0.30001565" + electron-to-chromium "^1.4.601" + node-releases "^2.0.14" update-browserslist-db "^1.0.13" bser@2.1.1: @@ -3355,10 +3361,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001541: - version "1.0.30001554" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz#ba80d88dff9acbc0cd4b7535fc30e0191c5e2e2a" - integrity sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ== +caniuse-lite@^1.0.30001565: + version "1.0.30001577" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001577.tgz#a24991eb4ad67324ba8b96716340d53151f2f6f8" + integrity sha512-rs2ZygrG1PNXMfmncM0B5H1hndY5ZCC9b5TkFaVNfZ+AUlyqcMyVIQtc3fsezi0NUCk5XZfDf9WS6WxMxnfdrg== caseless@~0.12.0: version "0.12.0" @@ -3448,9 +3454,9 @@ class-utils@^0.3.5: static-extend "^0.1.1" clean-css@^5.2.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== dependencies: source-map "~0.6.0" @@ -3603,9 +3609,9 @@ commondir@^1.0.1: integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== compressible@~2.0.16: version "2.0.18" @@ -3704,11 +3710,11 @@ copy-webpack-plugin@^11.0.0: serialize-javascript "^6.0.0" core-js-compat@^3.31.0, core-js-compat@^3.33.1: - version "3.33.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.1.tgz#debe80464107d75419e00c2ee29f35982118ff84" - integrity sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ== + version "3.35.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.0.tgz#c149a3d1ab51e743bc1da61e39cb51f461a41873" + integrity sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw== dependencies: - browserslist "^4.22.1" + browserslist "^4.22.2" core-util-is@1.0.2: version "1.0.2" @@ -3768,18 +3774,18 @@ css-color-names@1.0.1: integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== css-loader@^6.7.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" - integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + version "6.9.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.9.0.tgz#0cc2f14df94ed97c526c5ae42b6b13916d1d8d0e" + integrity sha512-3I5Nu4ytWlHvOP6zItjiHlefBNtrH+oehq8tnQa2kO305qpVyx9XNIT1CXIj5bgCJs7qICBCkgCYxQLKPANoLA== dependencies: icss-utils "^5.1.0" - postcss "^8.4.21" + postcss "^8.4.31" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.0.0" + postcss-modules-scope "^3.1.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.8" + semver "^7.5.4" css-select@^4.1.3: version "4.3.0" @@ -3803,9 +3809,9 @@ cssesc@^3.0.0: integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== damerau-levenshtein@^1.0.8: version "1.0.8" @@ -3819,6 +3825,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3826,7 +3837,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3901,7 +3912,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -4006,11 +4017,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - dns-packet@^5.2.2: version "5.6.1" resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" @@ -4115,10 +4121,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.535: - version "1.4.566" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.566.tgz#5c5ba1d2dc895f4887043f0cc7e61798c7e5919a" - integrity sha512-mv+fAy27uOmTVlUULy15U3DVJ+jg+8iyKH1bpwboCRhtDC69GKf1PPTZvEIhCyDr81RFqfxZJYrbgp933a1vtg== +electron-to-chromium@^1.4.601: + version "1.4.632" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.632.tgz#df6253483b802eb83eee2fdc0e5067bd46f36f11" + integrity sha512-JGmudTwg7yxMYvR/gWbalqqQiyu7WTFv2Xu3vw4cJHXPFxNgAk0oy8UHaer8nLF4lZJa+rNoj6GsrKIVJTV6Tw== emittery@^0.10.2: version "0.10.2" @@ -4183,9 +4189,9 @@ env-paths@^2.2.0: integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: - version "7.10.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" - integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + version "7.11.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.0.tgz#c3793f44284a55ff8c82faf1ffd91bc6478ea01f" + integrity sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg== err-code@^2.0.2: version "2.0.3" @@ -4244,7 +4250,7 @@ es-abstract@^1.22.1: unbox-primitive "^1.0.2" which-typed-array "^1.1.13" -es-iterator-helpers@^1.0.12: +es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15: version "1.0.15" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== @@ -4265,9 +4271,9 @@ es-iterator-helpers@^1.0.12: safe-array-concat "^1.0.1" es-module-lexer@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" - integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== + version "1.4.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" + integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== es-set-tostringtag@^2.0.1: version "2.0.2" @@ -4360,9 +4366,9 @@ eslint-module-utils@^2.8.0: debug "^3.2.7" eslint-plugin-import@^2.22.1: - version "2.29.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" - integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: array-includes "^3.1.7" array.prototype.findlastindex "^1.2.3" @@ -4380,7 +4386,7 @@ eslint-plugin-import@^2.22.1: object.groupby "^1.0.1" object.values "^1.1.7" semver "^6.3.1" - tsconfig-paths "^3.14.2" + tsconfig-paths "^3.15.0" eslint-plugin-jest@^26.5.3: version "26.9.0" @@ -4390,26 +4396,26 @@ eslint-plugin-jest@^26.5.3: "@typescript-eslint/utils" "^5.10.0" eslint-plugin-jsx-a11y@^6.4.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" - integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== dependencies: - "@babel/runtime" "^7.20.7" - aria-query "^5.1.3" - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - ast-types-flow "^0.0.7" - axe-core "^4.6.2" - axobject-query "^3.1.1" + "@babel/runtime" "^7.23.2" + aria-query "^5.3.0" + array-includes "^3.1.7" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "=4.7.0" + axobject-query "^3.2.1" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.3" - language-tags "=1.0.5" + es-iterator-helpers "^1.0.15" + hasown "^2.0.0" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - semver "^6.3.0" + object.entries "^1.1.7" + object.fromentries "^2.0.7" eslint-plugin-prettier@^4.0.0: version "4.2.1" @@ -4534,14 +4540,14 @@ eslint@^5.0.0: text-table "^0.2.0" eslint@^8.17.0: - version "8.52.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.52.0.tgz#d0cd4a1fac06427a61ef9242b9353f36ea7062fc" - integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg== + version "8.56.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" + integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.52.0" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.56.0" "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -4824,9 +4830,9 @@ fast-glob@^2.2.6: micromatch "^3.1.10" fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -4850,9 +4856,9 @@ fastest-levenshtein@^1.0.12: integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.16.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" + integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== dependencies: reusify "^1.0.4" @@ -5017,9 +5023,9 @@ flat-cache@^2.0.1: write "1.0.3" flat-cache@^3.0.4: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" - integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" keyv "^4.5.3" @@ -5041,9 +5047,9 @@ flatted@^3.2.9: integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== follow-redirects@^1.0.0: - version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== for-each@^0.3.3: version "0.3.3" @@ -5336,9 +5342,9 @@ globals@^11.1.0, globals@^11.7.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.23.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" - integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" @@ -5462,7 +5468,7 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== @@ -5522,11 +5528,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - hasown@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" @@ -5571,7 +5572,7 @@ html-entities@^2.3.2: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== -html-escaper@^2.0.0: +html-escaper@^2.0.0, html-escaper@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== @@ -5590,9 +5591,9 @@ html-minifier-terser@^6.0.2: terser "^5.10.0" html-webpack-plugin@^5.3.1: - version "5.5.3" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" - integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== + version "5.6.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" + integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -5744,9 +5745,9 @@ ignore@^4.0.3, ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== image-q@^4.0.0: version "4.0.0" @@ -5952,19 +5953,12 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== +is-accessor-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" + integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== dependencies: - kind-of "^6.0.0" + hasown "^2.0.0" is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" @@ -6045,19 +6039,12 @@ is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0: dependencies: hasown "^2.0.0" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== +is-data-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" + integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== dependencies: - kind-of "^6.0.0" + hasown "^2.0.0" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" @@ -6067,22 +6054,20 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: has-tostringtag "^1.0.0" is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" + integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" + integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" is-directory@^0.3.1: version "0.3.1" @@ -6368,9 +6353,9 @@ isstream@~0.1.2: integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: version "5.2.1" @@ -6990,7 +6975,7 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== @@ -7031,12 +7016,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -7051,17 +7031,17 @@ kleur@^4.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -language-subtag-registry@~0.3.2: +language-subtag-registry@^0.3.20: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== -language-tags@=1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: - language-subtag-registry "~0.3.2" + language-subtag-registry "^0.3.20" launch-editor@^2.6.0: version "2.6.1" @@ -7166,36 +7146,16 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.escape@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" - integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== -lodash.invokemap@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz#1748cda5d8b0ef8369c4eb3ec54c21feba1f2d62" - integrity sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.pullall@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.pullall/-/lodash.pullall-4.2.0.tgz#9d98b8518b7c965b0fae4099bd9fb7df8bbf38ba" - integrity sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg== - lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -7206,11 +7166,6 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== -lodash.uniqby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" - integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== - lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -7827,10 +7782,10 @@ mri@^1.1.0: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== ms@2.0.0: version "2.0.0" @@ -7865,10 +7820,10 @@ nan@^2.13.2: resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== nanomatch@^1.2.9: version "1.2.13" @@ -7948,10 +7903,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== node-sass@^7.0.1: version "7.0.3" @@ -8089,16 +8044,16 @@ object-visit@^1.0.0: isobject "^3.0.0" object.assign@^4.1.2, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5, object.entries@^1.1.6: +object.entries@^1.1.5, object.entries@^1.1.6, object.entries@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== @@ -8537,10 +8492,10 @@ postcss-modules-local-by-default@^4.0.3: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== +postcss-modules-scope@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz#fbfddfda93a31f310f1d152c2bb4d3f3c5592ee0" + integrity sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg== dependencies: postcss-selector-parser "^6.0.4" @@ -8552,9 +8507,9 @@ postcss-modules-values@^4.0.0: icss-utils "^5.0.0" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + version "6.0.15" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -8564,12 +8519,12 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.21: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== +postcss@^8.4.31: + version "8.4.33" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== dependencies: - nanoid "^3.3.6" + nanoid "^3.3.7" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -8689,9 +8644,9 @@ prop-types@^15.0.0, prop-types@^15.5.6, prop-types@^15.6.1, prop-types@^15.6.2, react-is "^16.13.1" property-information@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" - integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== + version "6.4.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" + integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== proxy-addr@~2.0.7: version "2.0.7" @@ -8715,9 +8670,9 @@ pump@^3.0.0: once "^1.3.1" punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@6.11.0: version "6.11.0" @@ -8991,9 +8946,9 @@ regenerator-runtime@^0.13.3: integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.2: version "0.15.2" @@ -9270,12 +9225,12 @@ sade@^1.7.3: mri "^1.1.0" safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" + integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.5" + get-intrinsic "^1.2.2" has-symbols "^1.0.3" isarray "^2.0.5" @@ -9290,12 +9245,12 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.2.tgz#3ba32bdb3ea35f940ee87e5087c60ee786c3f6c5" + integrity sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.5" + get-intrinsic "^1.2.2" is-regex "^1.1.4" safe-regex@^1.1.0: @@ -9321,16 +9276,16 @@ sass-graph@^4.0.1: yargs "^17.2.1" sass-loader@^13.0.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.2.tgz#460022de27aec772480f03de17f5ba88fa7e18c6" - integrity sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg== + version "13.3.3" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.3.tgz#60df5e858788cffb1a3215e5b92e9cba61e7e133" + integrity sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA== dependencies: neo-async "^2.6.2" sass@^1.52.3: - version "1.69.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.4.tgz#10c735f55e3ea0b7742c6efa940bce30e07fbca2" - integrity sha512-+qEreVhqAy8o++aQfCJwp0sklr2xyEzkm9Pp/Igu9wNPoe7EZEQ8X/MBvvXggI2ql607cxKg/RKOwDj6pp2XDA== + version "1.69.7" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.7.tgz#6e7e1c8f51e8162faec3e9619babc7da780af3b7" + integrity sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9390,10 +9345,11 @@ select-hose@^2.0.0: integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: + "@types/node-forge" "^1.3.0" node-forge "^1" "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: @@ -9406,7 +9362,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: +semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -9440,9 +9396,9 @@ serialize-javascript@^4.0.0: randombytes "^2.1.0" serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" @@ -9475,14 +9431,15 @@ set-blocking@^2.0.0: integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + version "1.2.0" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" + integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== dependencies: define-data-property "^1.1.1" - get-intrinsic "^1.2.1" + function-bind "^1.1.2" + get-intrinsic "^1.2.2" gopd "^1.0.1" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.1" set-function-name@^2.0.0, set-function-name@^2.0.1: version "2.0.1" @@ -9569,12 +9526,12 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sirv@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446" - integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" totalist "^3.0.0" sisteransi@^1.0.5: @@ -10053,9 +10010,9 @@ strtok3@^6.2.4: peek-readable "^4.1.0" style-loader@^3.3.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" - integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== + version "3.3.4" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" + integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== style-to-object@^0.4.0: version "0.4.4" @@ -10149,20 +10106,20 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser-webpack-plugin@^5.3.7: - version "5.3.9" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" - integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== dependencies: - "@jridgewell/trace-mapping" "^0.3.17" + "@jridgewell/trace-mapping" "^0.3.20" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.16.8" + terser "^5.26.0" -terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: - version "5.22.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.22.0.tgz#4f18103f84c5c9437aafb7a14918273310a8a49d" - integrity sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw== +terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: + version "5.26.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.26.0.tgz#ee9f05d929f4189a9c28a0feb889d96d50126fe1" + integrity sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10317,10 +10274,10 @@ trough@^2.0.0: dependencies: glob "^7.1.2" -tsconfig-paths@^3.14.2: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.2" @@ -10467,10 +10424,10 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici-types@~5.25.1: - version "5.25.3" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" - integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" @@ -10583,9 +10540,9 @@ unist-util-visit@^4.0.0: unist-util-visit-parents "^5.1.1" universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -10680,9 +10637,9 @@ uvu@^0.5.0: sade "^1.7.3" v8-to-istanbul@^9.0.1: - version "9.1.3" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz#ea456604101cd18005ac2cae3cdd1aa058a6306b" - integrity sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg== + version "9.2.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -10761,23 +10718,19 @@ webidl-conversions@^4.0.2: integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webpack-bundle-analyzer@^4.4.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz#d00bbf3f17500c10985084f22f1a2bf45cb2f09d" - integrity sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w== + version "4.10.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" + integrity sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== dependencies: "@discoveryjs/json-ext" "0.5.7" acorn "^8.0.4" acorn-walk "^8.0.0" commander "^7.2.0" + debounce "^1.2.1" escape-string-regexp "^4.0.0" gzip-size "^6.0.0" + html-escaper "^2.0.2" is-plain-object "^5.0.0" - lodash.debounce "^4.0.8" - lodash.escape "^4.0.1" - lodash.flatten "^4.4.0" - lodash.invokemap "^4.6.0" - lodash.pullall "^4.2.0" - lodash.uniqby "^4.7.0" opener "^1.5.2" picocolors "^1.0.0" sirv "^2.0.3" @@ -11247,9 +11200,9 @@ ws@^7.3.1: integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.13.0: - version "8.14.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" - integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== xhr@^2.0.1: version "2.6.0" From dcaea0bb6f31f24a937c4db637725d4e45c3c01f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 16 Jan 2024 14:26:30 +0000 Subject: [PATCH 384/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 2730ed95c4..e0ce428d9d 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6e26ec268669c6817c9b3c8cb419bc745c3814ab4cfb0cfac04b7c72f7ea798c + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9bed689438e4d6ee3d27a11dd4064f7d1a9c9215deca65af1b291a67271b9196 lifecycle: preStop: exec: From 68912f944007d18315746281d33465fabf3106b9 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 16 Jan 2024 14:33:31 +0000 Subject: [PATCH 385/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index e0ce428d9d..dff55971a5 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:9bed689438e4d6ee3d27a11dd4064f7d1a9c9215deca65af1b291a67271b9196 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3fa13e48438f80180f09316e3739614866aca75b92a9067752c20fb125360e0e lifecycle: preStop: exec: From a2d0b3af1f09abac917d9a22e862ccc89c8d961b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Ko=CC=88ninger?= Date: Tue, 16 Jan 2024 13:34:00 +0100 Subject: [PATCH 386/825] Upgrade to Spring Boot Admin 3.2.1 See gh-1392 --- start-site/src/main/resources/application.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 44ebcd1e0a..0993785620 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -43,8 +43,8 @@ initializr: artifactId: spring-boot-admin-dependencies versionProperty: spring-boot-admin.version mappings: - - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 3.1.5 + - compatibilityRange: "[3.1.0,3.3.0-M1)" + version: 3.2.1 hilla: groupId: dev.hilla artifactId: hilla-bom @@ -917,7 +917,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-client description: Required for your application to register with a Codecentric's Spring Boot Admin Server instance. - compatibilityRange: "[3.0.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.3.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -927,7 +927,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-server description: A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints. - compatibilityRange: "[3.0.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.3.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference From ae6fcc790ef1e732f2c5b94d2d8dd58ee7e1be71 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 16 Jan 2024 14:42:28 +0000 Subject: [PATCH 387/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index dff55971a5..96f0c75d48 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3fa13e48438f80180f09316e3739614866aca75b92a9067752c20fb125360e0e + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:875874af111453d47fdd29a9dc685c1da2eca1aaa8d71cbe1c4fafe81600cb06 lifecycle: preStop: exec: From 6b565847ff9fe6cf09ba548f36a8815c927cf8cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 18 Jan 2024 16:21:45 +0100 Subject: [PATCH 388/825] Upgrade CI image to Ubuntu Jammy 20240111 --- ci/images/start-site-ci-image/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/images/start-site-ci-image/Dockerfile b/ci/images/start-site-ci-image/Dockerfile index 91460dfcf6..d067ea2b9a 100644 --- a/ci/images/start-site-ci-image/Dockerfile +++ b/ci/images/start-site-ci-image/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:jammy-20231211.1 +FROM ubuntu:jammy-20240111 ADD setup.sh /setup.sh RUN ./setup.sh From 42228a2047045827caba60a2cd94ae188c77936e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 18 Jan 2024 16:42:07 +0100 Subject: [PATCH 389/825] Upgrade CI to Java 17.0.10 --- ci/images/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/images/setup.sh b/ci/images/setup.sh index 31b5b2eaff..f786b2ca58 100755 --- a/ci/images/setup.sh +++ b/ci/images/setup.sh @@ -20,6 +20,6 @@ curl https://raw.githubusercontent.com/spring-io/concourse-java-scripts/v0.0.2/c mkdir -p /opt/openjdk cd /opt/openjdk -curl -L https://github.com/bell-sw/Liberica/releases/download/17.0.9+11/bellsoft-jdk17.0.9+11-linux-amd64.tar.gz | tar zx --strip-components=1 +curl -L https://github.com/bell-sw/Liberica/releases/download/17.0.10%2B13/bellsoft-jdk17.0.10+13-linux-amd64.tar.gz | tar zx --strip-components=1 test -f /opt/openjdk/bin/java test -f /opt/openjdk/bin/javac From 31a1e2502b09f51f3fc95cd99ef88a3571cea4f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Mon, 22 Jan 2024 09:07:41 +0100 Subject: [PATCH 390/825] Upgrade to Spring Boot 3.2.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 791066fddb..ee6bba1fe0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.1 + 3.2.2 io.spring.start start-parent From 9464691f987ed47b1612699ab5cdeafcb6d39deb Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 23 Jan 2024 08:53:19 +0000 Subject: [PATCH 391/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 96f0c75d48..946a1cd612 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:875874af111453d47fdd29a9dc685c1da2eca1aaa8d71cbe1c4fafe81600cb06 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:52db428ef94de4128795e32d1c2c485ea06d2315c44e7d2f8f6c2258caa40f97 lifecycle: preStop: exec: From b76df7a7490e87e1329a714ef16711e23a82d4ae Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Wed, 24 Jan 2024 14:51:11 +0100 Subject: [PATCH 392/825] Upgrade to latest Spring Modulith releases. --- start-site/src/main/resources/application.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0993785620..67a3f92820 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -121,9 +121,12 @@ initializr: versionProperty: spring-modulith.version mappings: - compatibility-range: "[3.1.0,3.2.0-M1)" - version: 1.0.3 - - compatibility-range: "3.2.0-M1" - version: 1.1.0 + version: 1.0.5 + - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + version: 1.1.2 + - compatibility-range: "3.3.0-M1" + version: 1.2.0-M1 + repositories: spring-milestones spring-shell: groupId: org.springframework.shell artifactId: spring-shell-dependencies From ac7dd2cf5d446adf85b46bc52060707ff9929792 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 24 Jan 2024 15:24:31 +0000 Subject: [PATCH 393/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 946a1cd612..b5d300b5a9 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:52db428ef94de4128795e32d1c2c485ea06d2315c44e7d2f8f6c2258caa40f97 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0fc3a80cf8d21f30fc96ad4870a82d466c295b6d777754cb04d8b80bd003c6a2 lifecycle: preStop: exec: From 7c5ff0c4360610b3cdf263b8758babe07b557ac9 Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Fri, 26 Jan 2024 16:19:08 -0500 Subject: [PATCH 394/825] Upgrade to Spring Cloud 2022.0.5 See gh-1396 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 67a3f92820..3710713d72 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -82,7 +82,7 @@ initializr: order: 50 mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 2022.0.4 + version: 2022.0.5 - compatibilityRange: "[3.2.0-M1,3.2.0)" version: 2023.0.0-RC1 repositories: spring-milestones From ed0d7e629d5e420901cae1853ad91c4b08d0e674 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Sat, 27 Jan 2024 11:27:17 +0000 Subject: [PATCH 395/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index b5d300b5a9..bc39a12cd5 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:0fc3a80cf8d21f30fc96ad4870a82d466c295b6d777754cb04d8b80bd003c6a2 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4efeed6824860c2187c647666bfd86fa88a92a73e51ed2209140210b80b62182 lifecycle: preStop: exec: From d26927a6f91cb7b706e862b8e0ca6f27331cdc2e Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Mon, 29 Jan 2024 15:02:55 +0100 Subject: [PATCH 396/825] Update dependencies --- start-client/yarn.lock | 328 ++++++++++++++++++++--------------------- 1 file changed, 164 insertions(+), 164 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 34f6ac569e..f505aab2a2 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -25,9 +25,9 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.23.4.tgz#f5cc90487278065fa0c3b1267cf0c1d44ddf85a7" - integrity sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw== + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.23.9.tgz#06b3e76376ee53f14ac8ac422c884950c69e1b9e" + integrity sha512-vB1UXmGDNEhcf1jNAHKT9IlYk1R+hehVTLFlCLHBi8gfuHQGP6uRjgXVYU0EVlI/qwAWpstqkBdf2aez3/z/5Q== dependencies: "@jridgewell/trace-mapping" "^0.3.17" commander "^4.0.1" @@ -40,7 +40,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== @@ -54,20 +54,20 @@ integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" - integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.7" - "@babel/parser" "^7.23.6" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" - "@babel/types" "^7.23.6" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -75,9 +75,9 @@ semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz#7bf0db1c53b54da0c8a12627373554a0828479ca" - integrity sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw== + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.9.tgz#052c13b39144e21fdd1e03fc9b67e98976a1ebfc" + integrity sha512-xPndlO7qxiJbn0ATvfXQBjCS7qApc9xmKHArgI/FTEFxXas5dnjC/VqM37lfZun9dclRYcn+YQAr6uDFy0bB2g== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" @@ -118,10 +118,10 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz#b2e6826e0e20d337143655198b79d58fdc9bd43d" - integrity sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz#fddfdf51fca28f23d16b9e3935a4732690acfad6" + integrity sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" @@ -142,10 +142,10 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.4": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088" - integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA== +"@babel/helper-define-polyfill-provider@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b" + integrity sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -273,14 +273,14 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.23.7": - version "7.23.8" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.8.tgz#fc6b2d65b16847fd50adddbd4232c76378959e34" - integrity sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ== +"@babel/helpers@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" - "@babel/types" "^7.23.6" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" "@babel/highlight@^7.23.4": version "7.23.4" @@ -291,10 +291,10 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.6", "@babel/parser@^7.7.0": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" - integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.7.0": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": version "7.23.3" @@ -329,11 +329,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.13.15": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.7.tgz#1d827902cbd3d9054e54fb2f2056cdd1eaa0e368" - integrity sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng== + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.9.tgz#126d947d62ee72022ec46813983c6dd861456fa3" + integrity sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.23.7" + "@babel/helper-create-class-features-plugin" "^7.23.9" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-decorators" "^7.23.3" @@ -652,10 +652,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz#3aa0b4f2fa3788b5226ef9346cf6d16ec61f99cd" - integrity sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA== +"@babel/plugin-transform-async-generator-functions@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz#9adaeb66fc9634a586c5df139c6240d41ed801ce" + integrity sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" @@ -834,10 +834,10 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" - integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== +"@babel/plugin-transform-modules-systemjs@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz#105d3ed46e4a21d257f83a2f9e2ee4203ceda6be" + integrity sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw== dependencies: "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-module-transforms" "^7.23.3" @@ -1000,15 +1000,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.18.5": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz#52bbd20054855beb9deae3bee9ceb05289c343e6" - integrity sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw== + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz#2c64d0680fc8e09e1dfe8fd5c646fe72abd82004" + integrity sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ== dependencies: "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.7" - babel-plugin-polyfill-corejs3 "^0.8.7" - babel-plugin-polyfill-regenerator "^0.5.4" + babel-plugin-polyfill-corejs2 "^0.4.8" + babel-plugin-polyfill-corejs3 "^0.9.0" + babel-plugin-polyfill-regenerator "^0.5.5" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.23.3": @@ -1079,9 +1079,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.23.8" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.8.tgz#7d6f8171ea7c221ecd28059e65ad37c20e441e3e" - integrity sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA== + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.9.tgz#beace3b7994560ed6bf78e4ae2073dff45387669" + integrity sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A== dependencies: "@babel/compat-data" "^7.23.5" "@babel/helper-compilation-targets" "^7.23.6" @@ -1110,7 +1110,7 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.23.3" - "@babel/plugin-transform-async-generator-functions" "^7.23.7" + "@babel/plugin-transform-async-generator-functions" "^7.23.9" "@babel/plugin-transform-async-to-generator" "^7.23.3" "@babel/plugin-transform-block-scoped-functions" "^7.23.3" "@babel/plugin-transform-block-scoping" "^7.23.4" @@ -1132,7 +1132,7 @@ "@babel/plugin-transform-member-expression-literals" "^7.23.3" "@babel/plugin-transform-modules-amd" "^7.23.3" "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.9" "@babel/plugin-transform-modules-umd" "^7.23.3" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" "@babel/plugin-transform-new-target" "^7.23.3" @@ -1158,9 +1158,9 @@ "@babel/plugin-transform-unicode-regex" "^7.23.3" "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.7" - babel-plugin-polyfill-corejs3 "^0.8.7" - babel-plugin-polyfill-regenerator "^0.5.4" + babel-plugin-polyfill-corejs2 "^0.4.8" + babel-plugin-polyfill-corejs3 "^0.9.0" + babel-plugin-polyfill-regenerator "^0.5.5" core-js-compat "^3.31.0" semver "^6.3.1" @@ -1191,25 +1191,25 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.23.8" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650" - integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw== + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.3.3": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== +"@babel/template@^7.22.15", "@babel/template@^7.23.9", "@babel/template@^7.3.3": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.23.7", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" - integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.23.9", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== dependencies: "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" @@ -1217,15 +1217,15 @@ "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.6" - "@babel/types" "^7.23.6" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" - integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" @@ -1852,9 +1852,9 @@ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.21" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz#5dc1df7b3dc4a6209e503a924e1ca56097a2bb15" - integrity sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g== + version "0.3.22" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -2093,7 +2093,7 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^1.0.0": +"@types/estree@*", "@types/estree@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -2104,9 +2104,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.41" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" - integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== + version "4.17.42" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.42.tgz#2a276952acc73d1b8dc63fd4210647abbc553a71" + integrity sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2231,9 +2231,9 @@ "@types/node" "*" "@types/node@*": - version "20.11.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.4.tgz#c724a5d6723182af758b91b994209336f4439cb7" - integrity sha512-6I0fMH8Aoy2lOejL3s4LhyIYX34DPwY8bl5xlNjBvUEk8OHrcuzsFt+Ied4LvJihbtXPM+8zUqdydfIti86v9g== + version "20.11.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.10.tgz#6c3de8974d65c362f82ee29db6b5adf4205462f9" + integrity sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg== dependencies: undici-types "~5.26.4" @@ -3028,29 +3028,29 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz#679d1b94bf3360f7682e11f2cb2708828a24fe8c" - integrity sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ== +babel-plugin-polyfill-corejs2@^0.4.8: + version "0.4.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" + integrity sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.4" + "@babel/helper-define-polyfill-provider" "^0.5.0" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.7: - version "0.8.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" - integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== +babel-plugin-polyfill-corejs3@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz#9eea32349d94556c2ad3ab9b82ebb27d4bf04a81" + integrity sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.4" - core-js-compat "^3.33.1" + "@babel/helper-define-polyfill-provider" "^0.5.0" + core-js-compat "^3.34.0" -babel-plugin-polyfill-regenerator@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz#c6fc8eab610d3a11eb475391e52584bacfc020f4" - integrity sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg== +babel-plugin-polyfill-regenerator@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a" + integrity sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.4" + "@babel/helper-define-polyfill-provider" "^0.5.0" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -3207,13 +3207,13 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.22.2: - version "4.22.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" - integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== +browserslist@^4.21.10, browserslist@^4.22.2: + version "4.22.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" + integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== dependencies: - caniuse-lite "^1.0.30001565" - electron-to-chromium "^1.4.601" + caniuse-lite "^1.0.30001580" + electron-to-chromium "^1.4.648" node-releases "^2.0.14" update-browserslist-db "^1.0.13" @@ -3361,10 +3361,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001565: - version "1.0.30001577" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001577.tgz#a24991eb4ad67324ba8b96716340d53151f2f6f8" - integrity sha512-rs2ZygrG1PNXMfmncM0B5H1hndY5ZCC9b5TkFaVNfZ+AUlyqcMyVIQtc3fsezi0NUCk5XZfDf9WS6WxMxnfdrg== +caniuse-lite@^1.0.30001580: + version "1.0.30001581" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz#0dfd4db9e94edbdca67d57348ebc070dece279f4" + integrity sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ== caseless@~0.12.0: version "0.12.0" @@ -3709,10 +3709,10 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.31.0, core-js-compat@^3.33.1: - version "3.35.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.0.tgz#c149a3d1ab51e743bc1da61e39cb51f461a41873" - integrity sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw== +core-js-compat@^3.31.0, core-js-compat@^3.34.0: + version "3.35.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.1.tgz#215247d7edb9e830efa4218ff719beb2803555e2" + integrity sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw== dependencies: browserslist "^4.22.2" @@ -3774,15 +3774,15 @@ css-color-names@1.0.1: integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== css-loader@^6.7.1: - version "6.9.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.9.0.tgz#0cc2f14df94ed97c526c5ae42b6b13916d1d8d0e" - integrity sha512-3I5Nu4ytWlHvOP6zItjiHlefBNtrH+oehq8tnQa2kO305qpVyx9XNIT1CXIj5bgCJs7qICBCkgCYxQLKPANoLA== + version "6.9.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.9.1.tgz#9ec9a434368f2bdfeffbf8f6901a1ce773586c6b" + integrity sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ== dependencies: icss-utils "^5.1.0" - postcss "^8.4.31" + postcss "^8.4.33" postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.1.0" + postcss-modules-local-by-default "^4.0.4" + postcss-modules-scope "^3.1.1" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" semver "^7.5.4" @@ -4121,10 +4121,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.601: - version "1.4.632" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.632.tgz#df6253483b802eb83eee2fdc0e5067bd46f36f11" - integrity sha512-JGmudTwg7yxMYvR/gWbalqqQiyu7WTFv2Xu3vw4cJHXPFxNgAk0oy8UHaer8nLF4lZJa+rNoj6GsrKIVJTV6Tw== +electron-to-chromium@^1.4.648: + version "1.4.648" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.648.tgz#c7b46c9010752c37bb4322739d6d2dd82354fbe4" + integrity sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg== emittery@^0.10.2: version "0.10.2" @@ -4856,9 +4856,9 @@ fastest-levenshtein@^1.0.12: integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" - integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== + version "1.17.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.0.tgz#ca5e1a90b5e68f97fc8b61330d5819b82f5fab03" + integrity sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w== dependencies: reusify "^1.0.4" @@ -5762,9 +5762,9 @@ immediate@~3.0.5: integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== immutable@^4.0.0, immutable@^4.0.0-rc.12: - version "4.3.4" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" - integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== + version "4.3.5" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" + integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== import-fresh@^2.0.0: version "2.0.0" @@ -8483,19 +8483,19 @@ postcss-modules-extract-imports@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== +postcss-modules-local-by-default@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" + integrity sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz#fbfddfda93a31f310f1d152c2bb4d3f3c5592ee0" - integrity sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg== +postcss-modules-scope@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" + integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA== dependencies: postcss-selector-parser "^6.0.4" @@ -8519,7 +8519,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.31: +postcss@^8.4.33: version "8.4.33" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== @@ -8644,9 +8644,9 @@ prop-types@^15.0.0, prop-types@^15.5.6, prop-types@^15.6.1, prop-types@^15.6.2, react-is "^16.13.1" property-information@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" - integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== + version "6.4.1" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.1.tgz#de8b79a7415fd2107dfbe65758bb2cc9dfcf60ac" + integrity sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w== proxy-addr@~2.0.7: version "2.0.7" @@ -9283,9 +9283,9 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.69.7" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.7.tgz#6e7e1c8f51e8162faec3e9619babc7da780af3b7" - integrity sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ== + version "1.70.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.70.0.tgz#761197419d97b5358cb25f9dd38c176a8a270a75" + integrity sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9707,9 +9707,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.4.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz#c07a4ede25b16e4f78e6707bbd84b15a45c19c1b" + integrity sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -10105,7 +10105,7 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@^5.3.7: +terser-webpack-plugin@^5.3.10: version "5.3.10" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== @@ -10117,9 +10117,9 @@ terser-webpack-plugin@^5.3.7: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.26.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.26.0.tgz#ee9f05d929f4189a9c28a0feb889d96d50126fe1" - integrity sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ== + version "5.27.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.27.0.tgz#70108689d9ab25fef61c4e93e808e9fd092bf20c" + integrity sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10842,18 +10842,18 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.89.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" - integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== + version "5.90.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.90.0.tgz#313bfe16080d8b2fee6e29b6c986c0714ad4290e" + integrity sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" + "@types/estree" "^1.0.5" "@webassemblyjs/ast" "^1.11.5" "@webassemblyjs/wasm-edit" "^1.11.5" "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" acorn-import-assertions "^1.9.0" - browserslist "^4.14.5" + browserslist "^4.21.10" chrome-trace-event "^1.0.2" enhanced-resolve "^5.15.0" es-module-lexer "^1.2.1" @@ -10867,7 +10867,7 @@ webpack@^5.73.0: neo-async "^2.6.2" schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" + terser-webpack-plugin "^5.3.10" watchpack "^2.4.0" webpack-sources "^3.2.3" From b18f824a7d2048ce6d76abe1d616337badbfcb4f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 29 Jan 2024 14:15:15 +0000 Subject: [PATCH 397/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index bc39a12cd5..d945348dcd 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4efeed6824860c2187c647666bfd86fa88a92a73e51ed2209140210b80b62182 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:923dddc46e6af507fd7b9efc72272aa1b170bd83ce66b84fdd8b3f2181c01445 lifecycle: preStop: exec: From f389a6cf441e6dff1961e205cc862627874b3dce Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Wed, 31 Jan 2024 17:16:32 +0100 Subject: [PATCH 398/825] Update lodash dependency Resolves security issue #51 --- start-client/package.json | 5 +- start-client/src/components/Application.js | 2 +- .../src/components/common/builder/Fields.js | 2 +- .../src/components/common/builder/Warnings.js | 2 +- .../common/dependency/Dependency.js | 2 +- .../components/common/dependency/Dialog.js | 2 +- .../src/components/common/dependency/Item.js | 2 +- .../src/components/common/dependency/List.js | 2 +- .../src/components/common/explore/Code.js | 2 +- .../src/components/common/explore/Explore.js | 2 +- .../src/components/common/explore/Select.js | 2 +- .../src/components/common/explore/Tree.js | 2 +- .../src/components/common/layout/SideLeft.js | 2 +- .../src/components/common/share/Popover.js | 2 +- start-client/src/components/reducer/App.js | 4 +- .../src/components/reducer/Initializr.js | 4 +- .../src/components/reducer/__tests__/App.js | 2 +- .../reducer/__tests__/Initializr.js | 2 +- start-client/src/components/utils/ApiUtils.js | 4 +- start-client/src/components/utils/Zip.js | 2 +- .../components/utils/__tests__/ApiUtils.js | 2 +- .../src/components/utils/__tests__/Version.js | 2 +- .../src/components/utils/__tests__/Zip.js | 2 +- start-client/webpack.common.js | 3 + start-client/webpack.prod.js | 14 ++-- start-client/yarn.lock | 75 +++++++++++-------- 26 files changed, 84 insertions(+), 63 deletions(-) diff --git a/start-client/package.json b/start-client/package.json index 61f0529c97..5fe0092f8b 100644 --- a/start-client/package.json +++ b/start-client/package.json @@ -45,6 +45,7 @@ "babel-eslint": "^10.0.3", "babel-jest": "^28.1.1", "babel-loader": "^8.2.2", + "babel-plugin-lodash": "^3.3.4", "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.7.1", "eslint": "^8.17.0", @@ -65,6 +66,7 @@ "jest-cli": "^28.1.1", "jest-fetch-mock": "^3.0.3", "jest-standard-reporter": "^2.0.0", + "lodash-webpack-plugin": "^0.11.6", "node-sass": "^7.0.1", "prettier": "^2.7.1", "react-test-renderer": "^18.2.0", @@ -89,8 +91,7 @@ "immutable": "^4.0.0-rc.12", "js-search": "^2.0.0", "jszip": "^3.6.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", + "lodash": "^4.17.21", "prism-react-renderer": "^1.2.0", "prismjs": "^1.24.0", "prop-types": "^15.7.2", diff --git a/start-client/src/components/Application.js b/start-client/src/components/Application.js index c54e4b410b..9640520567 100644 --- a/start-client/src/components/Application.js +++ b/start-client/src/components/Application.js @@ -1,6 +1,6 @@ import BodyClassName from 'react-body-classname' import FileSaver from 'file-saver' -import get from 'lodash.get' +import get from 'lodash/get' import React, { Suspense, lazy, diff --git a/start-client/src/components/common/builder/Fields.js b/start-client/src/components/common/builder/Fields.js index fad4070b66..9b94940eca 100644 --- a/start-client/src/components/common/builder/Fields.js +++ b/start-client/src/components/common/builder/Fields.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext } from 'react' import Actions from './Actions' diff --git a/start-client/src/components/common/builder/Warnings.js b/start-client/src/components/common/builder/Warnings.js index cf15f2f2bc..ee13a07c09 100644 --- a/start-client/src/components/common/builder/Warnings.js +++ b/start-client/src/components/common/builder/Warnings.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext } from 'react' import { IconTimes } from '../icons' diff --git a/start-client/src/components/common/dependency/Dependency.js b/start-client/src/components/common/dependency/Dependency.js index 92c4cf8e25..bff727ed42 100644 --- a/start-client/src/components/common/dependency/Dependency.js +++ b/start-client/src/components/common/dependency/Dependency.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext } from 'react' import List from './List' diff --git a/start-client/src/components/common/dependency/Dialog.js b/start-client/src/components/common/dependency/Dialog.js index 8bd7c12daa..8fbc16b8c9 100644 --- a/start-client/src/components/common/dependency/Dialog.js +++ b/start-client/src/components/common/dependency/Dialog.js @@ -1,6 +1,6 @@ import * as JsSearch from 'js-search' import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext, useEffect, useRef, useState } from 'react' import { CSSTransition, TransitionGroup } from 'react-transition-group' import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' diff --git a/start-client/src/components/common/dependency/Item.js b/start-client/src/components/common/dependency/Item.js index ea8f23015b..3cd31fc37c 100644 --- a/start-client/src/components/common/dependency/Item.js +++ b/start-client/src/components/common/dependency/Item.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext } from 'react' import { IconEnter } from '../icons' diff --git a/start-client/src/components/common/dependency/List.js b/start-client/src/components/common/dependency/List.js index 6e91f75dee..7ff92f52ca 100644 --- a/start-client/src/components/common/dependency/List.js +++ b/start-client/src/components/common/dependency/List.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext } from 'react' import { CSSTransition, TransitionGroup } from 'react-transition-group' diff --git a/start-client/src/components/common/explore/Code.js b/start-client/src/components/common/explore/Code.js index dba139f105..07e0425776 100644 --- a/start-client/src/components/common/explore/Code.js +++ b/start-client/src/components/common/explore/Code.js @@ -2,7 +2,7 @@ import Highlight from 'prism-react-renderer' import Prism from 'prism-react-renderer/prism' import PropTypes from 'prop-types' import React from 'react' -import get from 'lodash.get' +import get from 'lodash/get' import ReactMarkdown from 'react-markdown' if (typeof global !== 'undefined') { diff --git a/start-client/src/components/common/explore/Explore.js b/start-client/src/components/common/explore/Explore.js index a22b289e41..06cef0da5f 100644 --- a/start-client/src/components/common/explore/Explore.js +++ b/start-client/src/components/common/explore/Explore.js @@ -3,7 +3,7 @@ import '../../../styles/explore.scss' import FileSaver from 'file-saver' import JSZip from 'jszip' import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext, useEffect, useRef, useState } from 'react' import { CSSTransition, TransitionGroup } from 'react-transition-group' import { CopyToClipboard } from 'react-copy-to-clipboard' diff --git a/start-client/src/components/common/explore/Select.js b/start-client/src/components/common/explore/Select.js index 6ad561c432..6680c0390e 100644 --- a/start-client/src/components/common/explore/Select.js +++ b/start-client/src/components/common/explore/Select.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useEffect, useState } from 'react' function Select({ tree, selected, onClickItem }) { diff --git a/start-client/src/components/common/explore/Tree.js b/start-client/src/components/common/explore/Tree.js index bc44ce0e09..0ad09c913c 100644 --- a/start-client/src/components/common/explore/Tree.js +++ b/start-client/src/components/common/explore/Tree.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useEffect, useState } from 'react' import { IconCaretDown, IconFile, IconFolder } from '../icons' diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index 29a7de3c2a..4ddc042177 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import React, { useContext, useEffect, useRef, useState } from 'react' import { CSSTransition, TransitionGroup } from 'react-transition-group' import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' diff --git a/start-client/src/components/common/share/Popover.js b/start-client/src/components/common/share/Popover.js index 4f44ed8f04..e795074fb3 100644 --- a/start-client/src/components/common/share/Popover.js +++ b/start-client/src/components/common/share/Popover.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' +import get from 'lodash/get' import React, { useEffect, useRef, useState } from 'react' import { CSSTransition, TransitionGroup } from 'react-transition-group' import { CopyToClipboard } from 'react-copy-to-clipboard' diff --git a/start-client/src/components/reducer/App.js b/start-client/src/components/reducer/App.js index 9a8d1ca9c5..a4f1b2435a 100644 --- a/start-client/src/components/reducer/App.js +++ b/start-client/src/components/reducer/App.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' -import set from 'lodash.set' +import get from 'lodash/get' +import set from 'lodash/set' import React, { useReducer } from 'react' import useTheme from '../utils/Theme' diff --git a/start-client/src/components/reducer/Initializr.js b/start-client/src/components/reducer/Initializr.js index 69d36d6dcf..7114d9cfd1 100644 --- a/start-client/src/components/reducer/Initializr.js +++ b/start-client/src/components/reducer/Initializr.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types' -import get from 'lodash.get' -import set from 'lodash.set' +import get from 'lodash/get' +import set from 'lodash/set' import React, { useReducer } from 'react' import { getShareUrl, parseParams } from '../utils/ApiUtils' diff --git a/start-client/src/components/reducer/__tests__/App.js b/start-client/src/components/reducer/__tests__/App.js index 373b55cde4..d7995b3ffc 100644 --- a/start-client/src/components/reducer/__tests__/App.js +++ b/start-client/src/components/reducer/__tests__/App.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import { reducer } from '../App' diff --git a/start-client/src/components/reducer/__tests__/Initializr.js b/start-client/src/components/reducer/__tests__/Initializr.js index fe090c1ce9..20ef2bdd15 100644 --- a/start-client/src/components/reducer/__tests__/Initializr.js +++ b/start-client/src/components/reducer/__tests__/Initializr.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import MockClient from '../../../../dev/api.mock.json' import { getDefaultValues, getLists } from '../../utils/ApiUtils' diff --git a/start-client/src/components/utils/ApiUtils.js b/start-client/src/components/utils/ApiUtils.js index d5ceb8a8e0..7de37d1ae8 100644 --- a/start-client/src/components/utils/ApiUtils.js +++ b/start-client/src/components/utils/ApiUtils.js @@ -1,6 +1,6 @@ -import get from 'lodash.get' +import get from 'lodash/get' import querystring from 'querystring' -import set from 'lodash.set' +import set from 'lodash/set' import Extend from '../../Extend.json' import { isInRange, parseReleases, parseVersion } from './Version' diff --git a/start-client/src/components/utils/Zip.js b/start-client/src/components/utils/Zip.js index 9335b417b1..461a88f730 100644 --- a/start-client/src/components/utils/Zip.js +++ b/start-client/src/components/utils/Zip.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' const FILE_EXTENSION = { js: 'javascript', diff --git a/start-client/src/components/utils/__tests__/ApiUtils.js b/start-client/src/components/utils/__tests__/ApiUtils.js index a0202c3035..5f28091dfc 100644 --- a/start-client/src/components/utils/__tests__/ApiUtils.js +++ b/start-client/src/components/utils/__tests__/ApiUtils.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import MockClient from '../../../../dev/api.mock.json' import { diff --git a/start-client/src/components/utils/__tests__/Version.js b/start-client/src/components/utils/__tests__/Version.js index 7d36a2219d..26b4f8ce7c 100644 --- a/start-client/src/components/utils/__tests__/Version.js +++ b/start-client/src/components/utils/__tests__/Version.js @@ -1,4 +1,4 @@ -import get from 'lodash.get' +import get from 'lodash/get' import { compare, diff --git a/start-client/src/components/utils/__tests__/Zip.js b/start-client/src/components/utils/__tests__/Zip.js index 72726b1b39..36fdbc0914 100644 --- a/start-client/src/components/utils/__tests__/Zip.js +++ b/start-client/src/components/utils/__tests__/Zip.js @@ -1,6 +1,6 @@ import JSZip from 'jszip' import fs from 'fs' -import get from 'lodash.get' +import get from 'lodash/get' import path from 'path' import { createTree, findRoot, getLanguage } from '../Zip' diff --git a/start-client/webpack.common.js b/start-client/webpack.common.js index f7cfdac0c5..aed7ad0ac7 100644 --- a/start-client/webpack.common.js +++ b/start-client/webpack.common.js @@ -44,6 +44,9 @@ const config = { test: /.(js|jsx)$/, exclude: [path.resolve(__dirname, 'node_modules')], loader: 'babel-loader', + options: { + plugins: ['lodash'], + }, }, { test: /\.s[ac]ss$/i, diff --git a/start-client/webpack.prod.js b/start-client/webpack.prod.js index 2181409310..e255d8e928 100644 --- a/start-client/webpack.prod.js +++ b/start-client/webpack.prod.js @@ -3,11 +3,12 @@ const webpack = require('webpack') const { merge } = require('webpack-merge') const common = require('./webpack.common.js') -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') - .BundleAnalyzerPlugin -const WebpackBundleSizeAnalyzerPlugin = require('webpack-bundle-size-analyzer') - .WebpackBundleSizeAnalyzerPlugin +const BundleAnalyzerPlugin = + require('webpack-bundle-analyzer').BundleAnalyzerPlugin +const WebpackBundleSizeAnalyzerPlugin = + require('webpack-bundle-size-analyzer').WebpackBundleSizeAnalyzerPlugin const path = require('path') +var LodashWebpackPlugin = require('lodash-webpack-plugin') const config = { mode: 'production', @@ -24,11 +25,14 @@ const config = { plugins: [ new BundleAnalyzerPlugin({ analyzerMode: 'static', - openAnalyzer: false, + openAnalyzer: true, generateStatsFile: true, statsFilename: '../analysis/stats.json', reportFilename: '../analysis/bundle-analyzer.html', }), + new LodashWebpackPlugin({ + paths: true, + }), new WebpackBundleSizeAnalyzerPlugin('../analysis/bundle-size-analyzer.log'), ], } diff --git a/start-client/yarn.lock b/start-client/yarn.lock index f505aab2a2..0c3fd5995c 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -75,9 +75,9 @@ semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.9.tgz#052c13b39144e21fdd1e03fc9b67e98976a1ebfc" - integrity sha512-xPndlO7qxiJbn0ATvfXQBjCS7qApc9xmKHArgI/FTEFxXas5dnjC/VqM37lfZun9dclRYcn+YQAr6uDFy0bB2g== + version "7.23.10" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz#2d4164842d6db798873b40e0c4238827084667a2" + integrity sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" @@ -119,9 +119,9 @@ semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz#fddfdf51fca28f23d16b9e3935a4732690acfad6" - integrity sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw== + version "7.23.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz#25d55fafbaea31fd0e723820bb6cc3df72edf7ea" + integrity sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" @@ -180,7 +180,7 @@ dependencies: "@babel/types" "^7.23.0" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15": +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== @@ -1222,7 +1222,7 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.23.9" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== @@ -2139,9 +2139,9 @@ "@types/node" "*" "@types/hast@^2.0.0": - version "2.3.9" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.9.tgz#a9a1b5bbce46e8a1312e977364bacabc8e93d2cf" - integrity sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw== + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: "@types/unist" "^2" @@ -2231,9 +2231,9 @@ "@types/node" "*" "@types/node@*": - version "20.11.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.10.tgz#6c3de8974d65c362f82ee29db6b5adf4205462f9" - integrity sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg== + version "20.11.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.13.tgz#188263ee2c8d590e181d3f5bfa7e485a932957cb" + integrity sha512-5G4zQwdiQBSWYTDAH1ctw2eidqdhMJaNsiIDKHFr55ihz5Trl2qqR8fdrT732yPBho5gkNxXm67OxWFBqX9aPg== dependencies: undici-types "~5.26.4" @@ -3028,6 +3028,17 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" +babel-plugin-lodash@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz#4f6844358a1340baed182adbeffa8df9967bc196" + integrity sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg== + dependencies: + "@babel/helper-module-imports" "^7.0.0-beta.49" + "@babel/types" "^7.0.0-beta.49" + glob "^7.1.1" + lodash "^4.17.10" + require-package-name "^2.0.1" + babel-plugin-polyfill-corejs2@^0.4.8: version "0.4.8" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" @@ -3774,9 +3785,9 @@ css-color-names@1.0.1: integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== css-loader@^6.7.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.9.1.tgz#9ec9a434368f2bdfeffbf8f6901a1ce773586c6b" - integrity sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ== + version "6.10.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.10.0.tgz#7c172b270ec7b833951b52c348861206b184a4b7" + integrity sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw== dependencies: icss-utils "^5.1.0" postcss "^8.4.33" @@ -4122,9 +4133,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.4.648: - version "1.4.648" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.648.tgz#c7b46c9010752c37bb4322739d6d2dd82354fbe4" - integrity sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg== + version "1.4.651" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.651.tgz#ef1e822233c6fc953df3caf943f78c21b254a080" + integrity sha512-jjks7Xx+4I7dslwsbaFocSwqBbGHQmuXBJUK9QBZTIrzPq3pzn6Uf2szFSP728FtLYE3ldiccmlkOM/zhGKCpA== emittery@^0.10.2: version "0.10.2" @@ -5304,7 +5315,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -7141,26 +7152,23 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-webpack-plugin@^0.11.6: + version "0.11.6" + resolved "https://registry.yarnpkg.com/lodash-webpack-plugin/-/lodash-webpack-plugin-0.11.6.tgz#8204c6b78beb62ce5211217dfe783c21557ecd33" + integrity sha512-nsHN/+IxZK/C425vGC8pAxkKJ8KQH2+NJnhDul14zYNWr6HJcA95w+oRR7Cp0oZpOdMplDZXmjVROp8prPk7ig== + dependencies: + lodash "^4.17.20" + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -9084,6 +9092,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== +require-package-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" + integrity sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" From 10f52f0c5177de01f6458e223ab42d34372fba18 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 31 Jan 2024 16:28:39 +0000 Subject: [PATCH 399/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index d945348dcd..6a039cd8c3 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:923dddc46e6af507fd7b9efc72272aa1b170bd83ce66b84fdd8b3f2181c01445 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:078b8ef637cc21e1d5c05301038813ecb39634d6475a672ee8bb6bab8880c701 lifecycle: preStop: exec: From 9c3a5d7a80708ae3da8c034b2c28b5d1ba1179d6 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 30 Jan 2024 16:42:08 +0100 Subject: [PATCH 400/825] Bump Sentry to 7.3.0 See gh-1398 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3710713d72..19d1755253 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -57,8 +57,8 @@ initializr: artifactId: sentry-bom versionProperty: sentry.version mappings: - - compatibilityRange: "[2.7.0,3.2.0-M1)" - version: 6.28.0 + - compatibilityRange: "[2.7.0,3.3.0-M1)" + version: 7.3.0 solace-spring-boot: groupId: com.solace.spring.boot artifactId: solace-spring-boot-bom @@ -939,7 +939,7 @@ initializr: id: sentry bom: sentry description: Application performance monitoring and error tracking that help software teams see clearer, solve quicker, and learn continuously. - compatibilityRange: "[3.0.0,3.2.0-M1)" + compatibilityRange: "[3.0.0,3.3.0-M1)" groupId: io.sentry artifactId: sentry-spring-boot-starter-jakarta links: From 4419ad24f8b7572f4252f28ba5f784b2550929f6 Mon Sep 17 00:00:00 2001 From: Deepankar Dixit <90280028+ddixit14@users.noreply.github.com> Date: Tue, 30 Jan 2024 11:52:30 -0500 Subject: [PATCH 401/825] Update spring-cloud-gcp to 4.9.1 and 5.0.1 See gh-1399 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 19d1755253..461d7f2e97 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -102,9 +102,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 4.9.0 + version: 4.9.1 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 5.0.0 + version: 5.0.1 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From e3ab25bc6c4f87810a9b65de094bad46858e7b70 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 1 Feb 2024 12:24:41 +0000 Subject: [PATCH 402/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 6a039cd8c3..2e2fe49e4a 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:078b8ef637cc21e1d5c05301038813ecb39634d6475a672ee8bb6bab8880c701 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:74a4c5427d3676d6c8a5b111345a418ecfcbead9d535413e50f1feccebc7a02b lifecycle: preStop: exec: From 8c1e16baac05487c3c6d097a9c11624a9cb854a5 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Thu, 1 Feb 2024 12:26:11 +0000 Subject: [PATCH 403/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 2e2fe49e4a..e2c92ce07e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:74a4c5427d3676d6c8a5b111345a418ecfcbead9d535413e50f1feccebc7a02b + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:777ee94555bab1f0a62c40ce4a95a447597b077411c0e9868a611e4e43c5e948 lifecycle: preStop: exec: From 929e5f8388a30e1a0ed2f33102a4a950aa869227 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 1 Feb 2024 15:49:21 +0100 Subject: [PATCH 404/825] Fix the location of the maven version resolver cache for tests This speeds up the tests and saves bandwidth, because the Maven files are reused. --- .../spring/start/site/StartApplication.java | 19 +++++-- .../site/StartConfigurationProperties.java | 56 +++++++++++++++++++ .../ProjectGenerationIntegrationTests.java | 4 +- .../StartApplicationIntegrationTests.java | 4 +- .../extension/AbstractExtensionTests.java | 4 +- ...yManagementPluginVersionResolverTests.java | 19 +++---- ...ependenciesKotlinVersionResolverTests.java | 12 ++-- ...VmProjectGenerationConfigurationTests.java | 12 ++-- .../NativeBuildtoolsVersionResolverTests.java | 18 ++---- ...udProjectGenerationConfigurationTests.java | 4 +- .../CacheableMavenVersionResolverTests.java | 4 +- .../site/test/TestMavenVersionResolver.java | 50 +++++++++++++++++ .../src/test/resources/application-test.yml | 3 + 13 files changed, 162 insertions(+), 47 deletions(-) create mode 100644 start-site/src/main/java/io/spring/start/site/StartConfigurationProperties.java create mode 100644 start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java create mode 100644 start-site/src/test/resources/application-test.yml diff --git a/start-site/src/main/java/io/spring/start/site/StartApplication.java b/start-site/src/main/java/io/spring/start/site/StartApplication.java index 04380a3719..2a8fb9a18e 100644 --- a/start-site/src/main/java/io/spring/start/site/StartApplication.java +++ b/start-site/src/main/java/io/spring/start/site/StartApplication.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import com.fasterxml.jackson.databind.ObjectMapper; import io.spring.initializr.versionresolver.MavenVersionResolver; @@ -30,11 +31,13 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.util.StringUtils; /** * Initializr website application. @@ -46,6 +49,7 @@ @Import(ProjectDescriptionCustomizerConfiguration.class) @EnableCaching @EnableAsync +@EnableConfigurationProperties(StartConfigurationProperties.class) public class StartApplication { public static void main(String[] args) { @@ -64,9 +68,16 @@ public StartInitializrMetadataUpdateStrategy initializrMetadataUpdateStrategy( } @Bean - public CacheableMavenVersionResolver mavenVersionResolver() throws IOException { - return new CacheableMavenVersionResolver( - MavenVersionResolver.withCacheLocation(Files.createTempDirectory("version-resolver-cache-"))); + public CacheableMavenVersionResolver mavenVersionResolver(StartConfigurationProperties properties) + throws IOException { + Path location; + if (StringUtils.hasText(properties.getMavenVersionResolver().getCacheDirectory())) { + location = Path.of(properties.getMavenVersionResolver().getCacheDirectory()); + } + else { + location = Files.createTempDirectory("version-resolver-cache-"); + } + return new CacheableMavenVersionResolver(MavenVersionResolver.withCacheLocation(location)); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/StartConfigurationProperties.java b/start-site/src/main/java/io/spring/start/site/StartConfigurationProperties.java new file mode 100644 index 0000000000..0ab293cfa2 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/StartConfigurationProperties.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Configuration properties for the application. + * + * @author Moritz Halbritter + */ +@ConfigurationProperties(prefix = "application") +public class StartConfigurationProperties { + + /** + * Configuration for the Maven version resolver. + */ + private final MavenVersionResolver mavenVersionResolver = new MavenVersionResolver(); + + public MavenVersionResolver getMavenVersionResolver() { + return this.mavenVersionResolver; + } + + public static class MavenVersionResolver { + + /** + * Directory to use for the cache. If not set, a newly created temporary directory + * will be used. + */ + private String cacheDirectory; + + public String getCacheDirectory() { + return this.cacheDirectory; + } + + public void setCacheDirectory(String cacheDirectory) { + this.cacheDirectory = cacheDirectory; + } + + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java index 78431f2f5a..ccd50e36e6 100644 --- a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -57,6 +57,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ActiveProfiles; import org.springframework.util.FileSystemUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -68,6 +69,7 @@ * @author Stephane Nicoll */ @SpringBootTest +@ActiveProfiles("test") @TestInstance(Lifecycle.PER_CLASS) @Execution(ExecutionMode.CONCURRENT) class ProjectGenerationIntegrationTests { diff --git a/start-site/src/test/java/io/spring/start/site/StartApplicationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/StartApplicationIntegrationTests.java index bccb8dbe5a..25211beebc 100755 --- a/start-site/src/test/java/io/spring/start/site/StartApplicationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/StartApplicationIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import org.springframework.http.MediaType; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; @@ -45,6 +46,7 @@ * @author Stephane Nicoll */ @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@ActiveProfiles("test") @AutoConfigureCache class StartApplicationIntegrationTests { diff --git a/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java b/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java index 0124a9d523..8a8fcbe327 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,6 +38,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ActiveProfiles; /** * Base test class for extensions. @@ -45,6 +46,7 @@ * @author Stephane Nicoll */ @SpringBootTest +@ActiveProfiles("test") public abstract class AbstractExtensionTests { @Autowired diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java index dcec7bb8cb..3f89013a71 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/ManagedDependenciesDependencyManagementPluginVersionResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,16 +16,14 @@ package io.spring.start.site.extension.build.gradle; -import java.nio.file.Path; import java.util.function.Function; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.version.Version; import io.spring.initializr.versionresolver.MavenVersionResolver; -import org.junit.jupiter.api.BeforeAll; +import io.spring.start.site.test.TestMavenVersionResolver; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; @@ -40,12 +38,7 @@ */ class ManagedDependenciesDependencyManagementPluginVersionResolverTests { - private static MavenVersionResolver versionResolver; - - @BeforeAll - static void setup(@TempDir Path cacheLocation) { - versionResolver = MavenVersionResolver.withCacheLocation(cacheLocation); - } + private final MavenVersionResolver versionResolver = TestMavenVersionResolver.get(); @Test @SuppressWarnings("unchecked") @@ -53,7 +46,8 @@ void dependencyManagementPluginVersionCanBeResolved() { MutableProjectDescription description = new MutableProjectDescription(); description.setPlatformVersion(Version.parse("2.1.8.RELEASE")); Function fallback = mock(Function.class); - String version = new ManagedDependenciesDependencyManagementPluginVersionResolver(versionResolver, fallback) + String version = new ManagedDependenciesDependencyManagementPluginVersionResolver(this.versionResolver, + fallback) .resolveDependencyManagementPluginVersion(description); assertThat(version).isEqualTo("1.0.8.RELEASE"); verifyNoInteractions(fallback); @@ -66,7 +60,8 @@ void dependencyManagementPluginVersionUsesFallbackIfNecessary() { description.setPlatformVersion(Version.parse("2.1.7.RELEASE")); Function fallback = mock(Function.class); given(fallback.apply(description)).willReturn("1.0.0.RELEASE"); - String version = new ManagedDependenciesDependencyManagementPluginVersionResolver(versionResolver, fallback) + String version = new ManagedDependenciesDependencyManagementPluginVersionResolver(this.versionResolver, + fallback) .resolveDependencyManagementPluginVersion(description); assertThat(version).isEqualTo("1.0.0.RELEASE"); verify(fallback).apply(description); diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java index 18851312ad..e3ce05d445 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/ManagedDependenciesKotlinVersionResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +16,14 @@ package io.spring.start.site.extension.code.kotlin; -import java.nio.file.Path; import java.util.function.Function; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.version.Version; import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.site.test.TestMavenVersionResolver; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -37,14 +36,15 @@ */ class ManagedDependenciesKotlinVersionResolverTests { + private final MavenVersionResolver mavenVersionResolver = TestMavenVersionResolver.get(); + @Test @SuppressWarnings("unchecked") - void kotlinVersionCanBeResolved(@TempDir Path temp) { + void kotlinVersionCanBeResolved() { MutableProjectDescription description = new MutableProjectDescription(); description.setPlatformVersion(Version.parse("2.5.0")); Function fallback = mock(Function.class); - String version = new ManagedDependenciesKotlinVersionResolver(MavenVersionResolver.withCacheLocation(temp), - fallback) + String version = new ManagedDependenciesKotlinVersionResolver(this.mavenVersionResolver, fallback) .resolveKotlinVersion(description); assertThat(version).isEqualTo("1.5.0"); verifyNoInteractions(fallback); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index c340944bca..c6d6568af2 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +16,14 @@ package io.spring.start.site.extension.dependency.graalvm; -import java.nio.file.Path; - import io.spring.initializr.generator.language.groovy.GroovyLanguage; import io.spring.initializr.generator.version.Version; import io.spring.initializr.versionresolver.MavenVersionResolver; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; + +import org.springframework.beans.factory.annotation.Autowired; import static org.assertj.core.api.Assertions.assertThat; @@ -60,9 +59,8 @@ void mavenBuildConfigureNativeBuildtoolsPlugint() { } @Test - void gradleBuildConfigureNativeBuildToolsPlugin(@TempDir Path temp) { - String nbtVersion = NativeBuildtoolsVersionResolver.resolve(MavenVersionResolver.withCacheLocation(temp), - Version.parse("3.1.0")); + void gradleBuildConfigureNativeBuildToolsPlugin(@Autowired MavenVersionResolver mavenVersionResolver) { + String nbtVersion = NativeBuildtoolsVersionResolver.resolve(mavenVersionResolver, Version.parse("3.1.0")); ProjectRequest request = createNativeProjectRequest(); request.setBootVersion("3.1.0"); assertThat(gradleBuild(request)).hasPlugin("org.graalvm.buildtools.native", nbtVersion); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java index 2aa3486b43..ca4f9ca046 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/NativeBuildtoolsVersionResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package io.spring.start.site.extension.dependency.graalvm; -import java.nio.file.Path; import java.util.stream.Stream; import io.spring.initializr.generator.version.Version; @@ -24,14 +23,14 @@ import io.spring.initializr.metadata.MetadataElement; import io.spring.initializr.versionresolver.MavenVersionResolver; import io.spring.start.site.extension.AbstractExtensionTests; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; -import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.beans.factory.annotation.Autowired; + import static org.assertj.core.api.Assertions.assertThat; /** @@ -42,17 +41,10 @@ @TestInstance(Lifecycle.PER_CLASS) class NativeBuildtoolsVersionResolverTests extends AbstractExtensionTests { - private MavenVersionResolver versionResolver; - - @BeforeEach - void createVersionResolver(@TempDir Path temp) { - this.versionResolver = MavenVersionResolver.withCacheLocation(temp); - } - @ParameterizedTest @MethodSource("platformVersions") - void resolveNativeBuildToolsVersion(Version platformVersion) { - assertThat(NativeBuildtoolsVersionResolver.resolve(this.versionResolver, platformVersion)).isNotNull(); + void resolveNativeBuildToolsVersion(Version platformVersion, @Autowired MavenVersionResolver versionResolver) { + assertThat(NativeBuildtoolsVersionResolver.resolve(versionResolver, platformVersion)).isNotNull(); } private Stream platformVersions() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfigurationTests.java index 112f8379a3..477535adb9 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -40,6 +41,7 @@ * @author Stephane Nicoll */ @SpringBootTest +@ActiveProfiles("test") class SpringCloudProjectGenerationConfigurationTests { @Autowired diff --git a/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java index a1a4b7f01d..d15c5b74d3 100644 --- a/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ import org.springframework.cache.Cache; import org.springframework.cache.Cache.ValueWrapper; import org.springframework.cache.CacheManager; +import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; @@ -39,6 +40,7 @@ * @author Stephane Nicoll */ @SpringBootTest +@ActiveProfiles("test") @AutoConfigureCache(cacheProvider = CacheType.SIMPLE) class CacheableMavenVersionResolverTests { diff --git a/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java b/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java new file mode 100644 index 0000000000..bf27e56c7a --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java @@ -0,0 +1,50 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.test; + +import java.nio.file.Path; +import java.util.Map; + +import io.spring.initializr.versionresolver.MavenVersionResolver; + +/** + * A {@link MavenVersionResolver} for tests, which uses a fixed directory for the cache. + * + * @author Moritz Halbritter + */ +public class TestMavenVersionResolver implements MavenVersionResolver { + + private static final TestMavenVersionResolver INSTANCE = new TestMavenVersionResolver(); + + private final MavenVersionResolver delegate = MavenVersionResolver + .withCacheLocation(Path.of(System.getProperty("java.io.tmpdir")).resolve("maven-version-resolver-cache")); + + @Override + public Map resolveDependencies(String groupId, String artifactId, String version) { + return this.delegate.resolveDependencies(groupId, artifactId, version); + } + + @Override + public Map resolvePlugins(String groupId, String artifactId, String version) { + return this.delegate.resolvePlugins(groupId, artifactId, version); + } + + public static TestMavenVersionResolver get() { + return INSTANCE; + } + +} diff --git a/start-site/src/test/resources/application-test.yml b/start-site/src/test/resources/application-test.yml new file mode 100644 index 0000000000..53df269549 --- /dev/null +++ b/start-site/src/test/resources/application-test.yml @@ -0,0 +1,3 @@ +application: + maven-version-resolver: + cache-directory: "${java.io.tmpdir}/maven-version-resolver-cache" From cf7403417fd5903fc36ecc6e040daaf0d2914bdd Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 1 Feb 2024 16:54:46 +0100 Subject: [PATCH 405/825] Speed up the ProjectGenerationIntegrationTests This also limits the maximum parallelism of that test to 4, as executing this test on a machine with 32 cores will start 32 mavens / gradles all downloading a fresh copy of the repository. The Maven / Gradle homes are now created on demand and reused. Additionally, they have predictable names in the temp folder and can be reused for consecutive test runs. --- .../ProjectGenerationIntegrationTests.java | 150 ++++++++++-------- .../test/JunitMaxParallelismStrategy.java | 85 ++++++++++ .../test/resources/junit-platform.properties | 18 +++ 3 files changed, 190 insertions(+), 63 deletions(-) create mode 100644 start-site/src/test/java/io/spring/start/site/test/JunitMaxParallelismStrategy.java diff --git a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java index ccd50e36e6..b8fa297531 100644 --- a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java @@ -17,13 +17,17 @@ package io.spring.start.site; import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Queue; import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; import io.spring.initializr.generator.buildsystem.BuildSystem; @@ -44,7 +48,6 @@ import io.spring.initializr.web.project.ProjectGenerationInvoker; import io.spring.initializr.web.project.ProjectRequest; import io.spring.initializr.web.project.WebProjectRequest; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.io.TempDir; @@ -58,7 +61,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; import org.springframework.test.context.ActiveProfiles; -import org.springframework.util.FileSystemUtils; +import org.springframework.util.Assert; import static org.assertj.core.api.Assertions.assertThat; @@ -67,6 +70,7 @@ * * @author Andy Wilkinson * @author Stephane Nicoll + * @author Moritz Halbritter */ @SpringBootTest @ActiveProfiles("test") @@ -74,31 +78,9 @@ @Execution(ExecutionMode.CONCURRENT) class ProjectGenerationIntegrationTests { - private static final Set mavenHomes = new CopyOnWriteArraySet<>(); + private static final Homes mavenHomes = new Homes("maven-home"); - private static final Set gradleHomes = new CopyOnWriteArraySet<>(); - - private final ThreadLocal mavenHome = ThreadLocal.withInitial(() -> { - try { - Path mavenHome = Files.createTempDirectory("maven-home"); - ProjectGenerationIntegrationTests.mavenHomes.add(mavenHome); - return mavenHome; - } - catch (IOException ex) { - throw new RuntimeException(ex); - } - }); - - private final ThreadLocal gradleHome = ThreadLocal.withInitial(() -> { - try { - Path gradleHome = Files.createTempDirectory("gradle-home"); - ProjectGenerationIntegrationTests.gradleHomes.add(gradleHome); - return gradleHome; - } - catch (IOException ex) { - throw new RuntimeException(ex); - } - }); + private static final Homes gradleHomes = new Homes("gradle-home"); private final ProjectGenerationInvoker invoker; @@ -111,26 +93,6 @@ class ProjectGenerationIntegrationTests { this.metadata = metadataProvider.get(); } - @AfterAll - static void deleteMavenAndGradleHomes() { - for (Path mavenHome : mavenHomes) { - try { - FileSystemUtils.deleteRecursively(mavenHome); - } - catch (IOException ex) { - // Continue - } - } - for (Path gradleHome : gradleHomes) { - try { - FileSystemUtils.deleteRecursively(gradleHome); - } - catch (IOException ex) { - // Continue - } - } - } - Stream parameters() { List bootVersions = this.metadata.getBootVersions() .getContent() @@ -177,30 +139,92 @@ void projectBuilds(Version bootVersion, Packaging packaging, Language language, request.setApplicationName("DemoApplication"); request.setDependencies(Arrays.asList("devtools", "configuration-processor")); Path project = this.invoker.invokeProjectStructureGeneration(request).getRootDirectory(); - ProcessBuilder processBuilder = createProcessBuilder(buildSystem); - processBuilder.directory(project.toFile()); - Path output = Files.createTempFile(directory, "output-", ".log"); - processBuilder.redirectError(output.toFile()); - processBuilder.redirectOutput(output.toFile()); - assertThat(processBuilder.start().waitFor()).describedAs(String.join("\n", Files.readAllLines(output))) - .isEqualTo(0); + Path home = acquireHome(buildSystem); + try { + ProcessBuilder processBuilder = createProcessBuilder(buildSystem, home); + processBuilder.directory(project.toFile()); + Path output = Files.createTempFile(directory, "output-", ".log"); + processBuilder.redirectError(output.toFile()); + processBuilder.redirectOutput(output.toFile()); + assertThat(processBuilder.start().waitFor()).describedAs(String.join("\n", Files.readAllLines(output))) + .isEqualTo(0); + } + finally { + releaseHome(buildSystem, home); + } + } + + private Path acquireHome(BuildSystem buildSystem) { + return switch (buildSystem.id()) { + case MavenBuildSystem.ID -> mavenHomes.acquire(); + case GradleBuildSystem.ID -> gradleHomes.acquire(); + default -> throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); + }; + } + + private void releaseHome(BuildSystem buildSystem, Path home) { + switch (buildSystem.id()) { + case MavenBuildSystem.ID -> mavenHomes.release(home); + case GradleBuildSystem.ID -> gradleHomes.release(home); + default -> throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); + } } - private ProcessBuilder createProcessBuilder(BuildSystem buildSystem) { - if (buildSystem.id().equals(new MavenBuildSystem().id())) { - Path mavenHome = this.mavenHome.get(); + private ProcessBuilder createProcessBuilder(BuildSystem buildSystem, Path home) { + if (buildSystem.id().equals(MavenBuildSystem.ID)) { ProcessBuilder processBuilder = new ProcessBuilder("./mvnw", - "-Dmaven.repo.local=" + mavenHome.resolve("repository").toFile(), "package"); - processBuilder.environment().put("MAVEN_USER_HOME", mavenHome.toFile().getAbsolutePath()); + "-Dmaven.repo.local=" + home.resolve("repository").toFile(), "package"); + processBuilder.environment().put("MAVEN_USER_HOME", home.toFile().getAbsolutePath()); return processBuilder; } - if (buildSystem.id().equals(new GradleBuildSystem().id())) { - Path gradleHome = this.gradleHome.get(); + if (buildSystem.id().equals(GradleBuildSystem.ID)) { ProcessBuilder processBuilder = new ProcessBuilder("./gradlew", "--no-daemon", "build"); - processBuilder.environment().put("GRADLE_USER_HOME", gradleHome.toFile().getAbsolutePath()); + processBuilder.environment().put("GRADLE_USER_HOME", home.toFile().getAbsolutePath()); return processBuilder; } - throw new IllegalStateException(); + throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); + } + + private static final class Homes { + + private final Set homes = ConcurrentHashMap.newKeySet(); + + private final Queue freeHomes = new ConcurrentLinkedQueue<>(); + + private final AtomicInteger counter = new AtomicInteger(); + + private final String prefix; + + private Homes(String prefix) { + this.prefix = prefix; + } + + Path acquire() { + Path home = this.freeHomes.poll(); + if (home == null) { + home = createTempDirectory(); + this.homes.add(home); + } + return home; + } + + void release(Path home) { + Assert.state(this.homes.contains(home), "Invalid home '%s'".formatted(home)); + this.freeHomes.add(home); + } + + private Path createTempDirectory() { + try { + Path path = Path.of(System.getProperty("java.io.tmpdir")) + .resolve(this.prefix + "-" + this.counter.getAndIncrement()); + Files.createDirectories(path); + return path; + } + catch (IOException ex) { + throw new UncheckedIOException("Failed to create temp directory", ex); + } + } + } } diff --git a/start-site/src/test/java/io/spring/start/site/test/JunitMaxParallelismStrategy.java b/start-site/src/test/java/io/spring/start/site/test/JunitMaxParallelismStrategy.java new file mode 100644 index 0000000000..97d3c63bbf --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/test/JunitMaxParallelismStrategy.java @@ -0,0 +1,85 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.test; + +import java.util.concurrent.ForkJoinPool; +import java.util.function.Predicate; + +import org.junit.platform.engine.ConfigurationParameters; +import org.junit.platform.engine.support.hierarchical.ParallelExecutionConfiguration; +import org.junit.platform.engine.support.hierarchical.ParallelExecutionConfigurationStrategy; + +/** + * A parallel execution strategy for JUnit, which limits the maximum number of + * parallelism. + * + * @author Moritz Halbritter + */ +public class JunitMaxParallelismStrategy implements ParallelExecutionConfigurationStrategy { + + private static final int MAX_PARALLELISM = 4; + + @Override + public ParallelExecutionConfiguration createConfiguration(ConfigurationParameters configurationParameters) { + int parallelism = Runtime.getRuntime().availableProcessors(); + if (parallelism > MAX_PARALLELISM) { + parallelism = MAX_PARALLELISM; + } + return new FixedParallelExecutionConfiguration(parallelism); + } + + private static final class FixedParallelExecutionConfiguration implements ParallelExecutionConfiguration { + + private final int processors; + + FixedParallelExecutionConfiguration(int processors) { + this.processors = processors; + } + + @Override + public int getParallelism() { + return this.processors; + } + + @Override + public int getMinimumRunnable() { + return getParallelism(); + } + + @Override + public int getMaxPoolSize() { + return getParallelism(); + } + + @Override + public int getCorePoolSize() { + return getParallelism(); + } + + @Override + public int getKeepAliveSeconds() { + return 30; + } + + @Override + public Predicate getSaturatePredicate() { + return (ignore) -> true; + } + + } + +} diff --git a/start-site/src/test/resources/junit-platform.properties b/start-site/src/test/resources/junit-platform.properties index 1d27b78fbb..308777dedb 100644 --- a/start-site/src/test/resources/junit-platform.properties +++ b/start-site/src/test/resources/junit-platform.properties @@ -1 +1,19 @@ +# +# Copyright 2012-2024 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + junit.jupiter.execution.parallel.enabled=true +junit.jupiter.execution.parallel.config.strategy=custom +junit.jupiter.execution.parallel.config.custom.class=io.spring.start.site.test.JunitMaxParallelismStrategy From 5049e384e6a0eea3d1edcf3bb53361384c3497af Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 2 Feb 2024 07:56:05 +0000 Subject: [PATCH 406/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index e2c92ce07e..ebf94a97d5 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:777ee94555bab1f0a62c40ce4a95a447597b077411c0e9868a611e4e43c5e948 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:33b3eec67c092f1c933b803da2fbd480798319f5954e0ffdefbe2059f1f26bfa lifecycle: preStop: exec: From 8dc56d1196dd318fcdb3849de8175fe7fdf3c5c1 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 5 Feb 2024 11:05:30 +0100 Subject: [PATCH 407/825] Add GitHub Actions build See gh-1401 --- .github/build-and-deploy.yml | 38 ++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/build-and-deploy.yml diff --git a/.github/build-and-deploy.yml b/.github/build-and-deploy.yml new file mode 100644 index 0000000000..5d7f609451 --- /dev/null +++ b/.github/build-and-deploy.yml @@ -0,0 +1,38 @@ +name: Build and deploy +on: + push: + branches: + - main +jobs: + build: + name: Build and deploy + runs-on: ubuntu-latest + steps: + - name: Check out + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'liberica' + cache: 'maven' + + - name: Run the Maven verify phase + run: ./mvnw --batch-mode --update-snapshots verify + + - name: Set up Azure + uses: azure/login@cb79c773a3cfa27f31f25eb3f677781210c9ce3d + with: + creds: ${{ secrets.AZURE_CREDENTIALS_SPRING_IO }} + + - name: Set up Azure Spring Extension + run: az extension add --name spring + + - name: Deploy + run: | + az spring app deploy \ + --name start-spring-io \ + --service spring-io \ + --resource-group spring-io \ + --artifact-path start-site/target/start-site-exec.jar From 175ecba1b8dad2787813d9422cc9ba6fffc2a35e Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 5 Feb 2024 11:06:42 +0100 Subject: [PATCH 408/825] Fix workflow location See gh-1401 --- .github/{ => workflows}/build-and-deploy.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{ => workflows}/build-and-deploy.yml (100%) diff --git a/.github/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml similarity index 100% rename from .github/build-and-deploy.yml rename to .github/workflows/build-and-deploy.yml From d2288f066504df4f859ad3a9e0716908f5e6e6a1 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 5 Feb 2024 10:24:03 +0000 Subject: [PATCH 409/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index ebf94a97d5..4390bbe4cb 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:33b3eec67c092f1c933b803da2fbd480798319f5954e0ffdefbe2059f1f26bfa + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6704b48512824eeb370c8ec207ac2ad17cddd7ed8341d90021164a2f544ec345 lifecycle: preStop: exec: From 0d8484570247270749645ea7510f61fc77ff1d82 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 5 Feb 2024 11:37:48 +0100 Subject: [PATCH 410/825] Add elastic URI to config from Azure Keyvault See gh-1401 --- pom.xml | 23 +++++++++++++++++++ start-site/pom.xml | 22 ++++++++++++++++++ start-site/src/main/resources/application.yml | 3 +++ 3 files changed, 48 insertions(+) diff --git a/pom.xml b/pom.xml index ee6bba1fe0..4b67eab1e2 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,20 @@ + + @@ -63,6 +79,13 @@ start-site ${revision} + + com.azure.spring + spring-cloud-azure-dependencies + 5.8.0 + pom + import + diff --git a/start-site/pom.xml b/start-site/pom.xml index e75d6d8959..322e5e48e2 100644 --- a/start-site/pom.xml +++ b/start-site/pom.xml @@ -1,4 +1,20 @@ + + @@ -54,6 +70,12 @@ jakarta + + com.azure.spring + spring-cloud-azure-starter-keyvault-secrets + runtime + + org.springframework.boot spring-boot-devtools diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 461d7f2e97..2a99258555 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -36,6 +36,9 @@ spring: use-last-modified: false initializr: + stats: + elastic: + uri: ${elastic-uri:} env: boms: codecentric-spring-boot-admin: From ef4bade28b572b1bdbd2790801cf882364af24e5 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 5 Feb 2024 10:53:13 +0000 Subject: [PATCH 411/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 4390bbe4cb..bf5dd2ce62 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:6704b48512824eeb370c8ec207ac2ad17cddd7ed8341d90021164a2f544ec345 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7a4b636ed270f41cff9fcc3d08fe5782ec19490f6a8c33b7daf748e24e08b91c lifecycle: preStop: exec: From a62f855dd8cbfb99ec8b0d237b8bc17ec425afed Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 5 Feb 2024 11:52:41 +0100 Subject: [PATCH 412/825] Cache Maven resolver cache and Maven/Gradle homes --- .github/workflows/build-and-deploy.yml | 10 +++++++++- .../start/site/ProjectGenerationIntegrationTests.java | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 5d7f609451..2ef75b2894 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -18,7 +18,15 @@ jobs: distribution: 'liberica' cache: 'maven' - - name: Run the Maven verify phase + - name: Cache Maven/Gradle repositories for tests + uses: actions/cache@v4 + with: + path: | + /tmp/maven-version-resolver-cache + /tmp/homes + key: ${{ runner.os }}-test-repositories + + - name: Build with Maven run: ./mvnw --batch-mode --update-snapshots verify - name: Set up Azure diff --git a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java index b8fa297531..3d85246c9a 100644 --- a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java @@ -216,6 +216,7 @@ void release(Path home) { private Path createTempDirectory() { try { Path path = Path.of(System.getProperty("java.io.tmpdir")) + .resolve("homes") .resolve(this.prefix + "-" + this.counter.getAndIncrement()); Files.createDirectories(path); return path; From 3831e19bd8b5cf49e0b2eb2543a42f3196af6d70 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 5 Feb 2024 13:15:11 +0100 Subject: [PATCH 413/825] Update GitHub Actions cache See gh-1401 --- .github/workflows/build-and-deploy.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 2ef75b2894..140474c67a 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -24,7 +24,10 @@ jobs: path: | /tmp/maven-version-resolver-cache /tmp/homes - key: ${{ runner.os }}-test-repositories + # See https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache + key: test-repositories-${{ runner.os }}-${{ github.run_id }} + restore-keys: | + test-repositories-${{ runner.os }} - name: Build with Maven run: ./mvnw --batch-mode --update-snapshots verify From 93bd11fed46ef3aba3d8c2878c1c28c3877b11eb Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 5 Feb 2024 13:17:05 +0100 Subject: [PATCH 414/825] Cancel builds when a new one is scheduled See gh-1401 --- .github/workflows/build-and-deploy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 140474c67a..29a200a12f 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -3,6 +3,9 @@ on: push: branches: - main +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: build: name: Build and deploy From 3c5951aed383a621ff349bbb9c02d70c9f2eebde Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 5 Feb 2024 12:29:54 +0000 Subject: [PATCH 415/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index bf5dd2ce62..feaa0ac000 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:7a4b636ed270f41cff9fcc3d08fe5782ec19490f6a8c33b7daf748e24e08b91c + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2923010a06aac199e3cfb0b2e33e536d09f91ec52ed7fa6a1877798031e90db9 lifecycle: preStop: exec: From e902f83d83d98c7c64174507b871efea793f44b8 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 5 Feb 2024 12:32:23 +0000 Subject: [PATCH 416/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index feaa0ac000..aff52b4a5e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2923010a06aac199e3cfb0b2e33e536d09f91ec52ed7fa6a1877798031e90db9 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c71d32696a96c2069cee6735236adf5a077e5f36c1a5aa15d1c66150da3b36a1 lifecycle: preStop: exec: From ca5c0af6676bd7915388cf4ea6abdbc0d12d7df0 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 5 Feb 2024 12:33:43 +0000 Subject: [PATCH 417/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index aff52b4a5e..1bb228c38a 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:c71d32696a96c2069cee6735236adf5a077e5f36c1a5aa15d1c66150da3b36a1 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:da2b3b646ffae5d72fd30c7211639c12ad9839550b12c332cb31937821cba31a lifecycle: preStop: exec: From c95d067a694421a73fe1a63d54c63af58892de3d Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 5 Feb 2024 13:37:47 +0100 Subject: [PATCH 418/825] Mirror main workflow to pull request workflow See gh-1401 --- .github/workflows/build-pull-request.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 9d7fd2aab5..0cff25ba98 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -10,14 +10,18 @@ jobs: runs-on: ubuntu-latest if: ${{ github.repository == 'spring-io/start.spring.io' }} steps: + - name: Check out + uses: actions/checkout@v4 + - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'liberica' - - name: Check out code - uses: actions/checkout@v3 - - name: Build - run: ./mvnw clean verify + cache: 'maven' + + - name: Build with Maven + run: ./mvnw --batch-mode --update-snapshots verify + - name: Run metadata verification tests - run: ./mvnw -Pverification verify + run: ./mvnw --batch-mode --update-snapshots -Pverification verify From d1a7e619f17d941794a7131cde4b7c5c9fee3c1f Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 5 Feb 2024 12:54:34 +0000 Subject: [PATCH 419/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 1bb228c38a..b18ded3e71 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:da2b3b646ffae5d72fd30c7211639c12ad9839550b12c332cb31937821cba31a + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3cbc828c10dbda30b8b38ec025ea6a7a63fa26fdda590776c5e76a840ac64c0e lifecycle: preStop: exec: From 6135748697e82aee25c38059adab19304ab41edd Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 6 Feb 2024 09:15:09 +0100 Subject: [PATCH 420/825] Allow manual trigger of workflow --- .github/workflows/build-and-deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 29a200a12f..b4f730a30c 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -3,6 +3,7 @@ on: push: branches: - main + workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true From 9a78c8a14bc6ebd74e9e959689b4e8984801472a Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Tue, 6 Feb 2024 08:30:58 +0000 Subject: [PATCH 421/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index b18ded3e71..1d3d2dc70b 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3cbc828c10dbda30b8b38ec025ea6a7a63fa26fdda590776c5e76a840ac64c0e + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:819fbdc32f1398031abdc3bed2289d78594cfff509d911d79a9a1b9fb1318673 lifecycle: preStop: exec: From eeda961aaf5a03ebbbdf63ae5312b98798ad00a1 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 7 Feb 2024 01:51:47 +0000 Subject: [PATCH 422/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 1d3d2dc70b..f1ae20e32e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:819fbdc32f1398031abdc3bed2289d78594cfff509d911d79a9a1b9fb1318673 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2c7d5cdd7a58232ea8a5800877d1b7ea28dfeaac89fdae19b1c9d6b4fa8b09c0 lifecycle: preStop: exec: From cc4c4eb471ec68394eed4c4f8d58e09c1e6f5337 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 7 Feb 2024 18:17:02 +0000 Subject: [PATCH 423/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index f1ae20e32e..602766af8b 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:2c7d5cdd7a58232ea8a5800877d1b7ea28dfeaac89fdae19b1c9d6b4fa8b09c0 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:fef32dac44dc5385585e16afb4a1c170a3436732c4c47ed2a89b65174de59d78 lifecycle: preStop: exec: From fdc41983fcf2e56523a3acbcf1616cf18c8daf7b Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 1 Feb 2024 11:32:06 +0100 Subject: [PATCH 424/825] Add wavefront starter for Boot >= 3.2.0 Closes gh-1381 --- start-site/src/main/resources/application.yml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2a99258555..ccb49aca6e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1022,10 +1022,20 @@ initializr: - name: Wavefront id: wavefront description: Publish metrics and optionally distributed traces to Tanzu Observability by Wavefront, a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and alert over data from across your entire stack. - groupId: io.micrometer - artifactId: micrometer-registry-wavefront - scope: runtime - starter: false + mappings: + - compatibility-range: "[3.1.0,3.2.0)" + groupId: io.micrometer + artifactId: micrometer-registry-wavefront + starter: false + - compatibility-range: "3.3.0-M1" + groupId: io.micrometer + artifactId: micrometer-registry-wavefront + starter: false + - compatibility-range: "[3.2.0, 3.3.0-M1)" + groupId: com.wavefront + artifactId: wavefront-spring-boot-starter + version: 3.2.0 + starter: true - name: Zipkin id: zipkin description: Enable and expose span and trace IDs to Zipkin. From 5f406d9c19b74586468f9992a99deb12eff4fef5 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 9 Feb 2024 08:42:50 +0100 Subject: [PATCH 425/825] Update spring-cloud-azure-dependencies to 5.9.1 Closes gh-1405 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ccb49aca6e..b8b3576752 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -97,7 +97,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 5.8.0 + version: 5.9.1 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From 453c8532924cff09a45661810a702d5e7ce7ca18 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 9 Feb 2024 07:57:50 +0000 Subject: [PATCH 426/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 602766af8b..1e5aa36039 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:fef32dac44dc5385585e16afb4a1c170a3436732c4c47ed2a89b65174de59d78 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:94aea9b8ac189ce4d7a9dc4dcbb9301b1caae6fa99c76dd3037f1b62b76bb5e7 lifecycle: preStop: exec: From f7f09958e5b248c515d089f490f53594c069165e Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 9 Feb 2024 09:01:28 +0100 Subject: [PATCH 427/825] Restore Wavefront HELP.md entries See gh-1381 --- ...abilityProjectGenerationConfiguration.java | 10 ++- .../WavefrontHelpDocumentCustomizer.java | 63 +++++++++++++++ .../WavefrontHelpDocumentCustomizerTests.java | 78 +++++++++++++++++++ 3 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java index 1481b543b0..a676b465bd 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; @@ -52,6 +53,13 @@ ObservabilityHelpDocumentCustomizer observabilityHelpDocumentCustomizer(ProjectD return new ObservabilityHelpDocumentCustomizer(description, build); } + @Bean + @ConditionalOnRequestedDependency("wavefront") + @ConditionalOnPlatformVersion("[3.2.0, 3.3.0-M1)") + WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { + return new WavefrontHelpDocumentCustomizer("https://docs.wavefront.com/wavefront_springboot3.html", build); + } + } @Configuration(proxyBeanMethods = false) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java new file mode 100644 index 0000000000..94d7533466 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java @@ -0,0 +1,63 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.observability; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; + +/** + * A {@link HelpDocumentCustomizer} that provides additional references when Wavefront is + * selected. + * + * @author Stephane Nicoll + * @author Brian Clozel + */ +class WavefrontHelpDocumentCustomizer implements HelpDocumentCustomizer { + + private final Build build; + + private final String referenceLink; + + WavefrontHelpDocumentCustomizer(String referenceLink, Build build) { + this.referenceLink = referenceLink; + this.build = build; + } + + @Override + public void customize(HelpDocument document) { + document.gettingStarted().addReferenceDocLink(this.referenceLink, "Wavefront for Spring Boot documentation"); + + StringBuilder sb = new StringBuilder(); + sb.append(String.format("## Observability with Wavefront%n%n")); + sb.append(String + .format("If you don't have a Wavefront account, the starter will create a freemium account for you.%n")); + sb.append(String.format("The URL to access the Wavefront Service dashboard is logged on startup.%n")); + + if (this.build.dependencies().has("web") || this.build.dependencies().has("webflux")) { + sb.append( + String.format("%nYou can also access your dashboard using the `/actuator/wavefront` endpoint.%n")); + } + + if (!this.build.dependencies().has("distributed-tracing")) { + sb.append(String.format( + "%nFinally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry.%n")); + } + document.addSection((writer) -> writer.print(sb)); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java new file mode 100644 index 0000000000..e272182566 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java @@ -0,0 +1,78 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.observability; + +import io.spring.initializr.generator.test.io.TextAssert; +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.assertj.core.api.ListAssert; +import org.junit.jupiter.api.Test; + +/** + * Tests for {@link WavefrontHelpDocumentCustomizer}. + * + * @author Stephane Nicoll + * @author Brian Clozel + */ +class WavefrontHelpDocumentCustomizerTests extends AbstractExtensionTests { + + @Test + void wavefrontAddGeneralSection() { + assertHelpDocument("3.2.0", "wavefront").contains("## Observability with Wavefront", "", + "If you don't have a Wavefront account, the starter will create a freemium account for you.", + "The URL to access the Wavefront Service dashboard is logged on startup."); + } + + @Test + void wavefrontWithoutWebApplicationDoesNotAddActuatorSection() { + assertHelpDocument("3.2.0", "wavefront") + .doesNotContain("You can also access your dashboard using the `/actuator/wavefront` endpoint."); + } + + @Test + void wavefrontWithWebApplicationAddActuatorSection() { + assertHelpDocument("3.2.0", "wavefront", "web") + .contains("You can also access your dashboard using the `/actuator/wavefront` endpoint."); + } + + @Test + void wavefrontWithoutDistributedTracingAddTracingNote() { + assertHelpDocument("3.2.0", "wavefront") + .contains("Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); + } + + @Test + void wavefrontWithDistributedTracingDoesNotAddTracingNote() { + assertHelpDocument("3.2.0", "wavefront", "distributed-tracing").doesNotContain( + "Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); + } + + @Test + void springBoot3xWavefrontReference() { + assertHelpDocument("3.2.0", "wavefront").contains( + "* [Wavefront for Spring Boot documentation](https://docs.wavefront.com/wavefront_springboot3.html)"); + } + + private ListAssert assertHelpDocument(String version, String... dependencies) { + ProjectRequest request = createProjectRequest(dependencies); + request.setBootVersion(version); + ProjectStructure project = generateProject(request); + return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); + } + +} From 40fac77eabea1b405c2c3a4dc26859e66b5e8555 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 9 Feb 2024 08:18:14 +0000 Subject: [PATCH 428/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 1e5aa36039..10053cedf4 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:94aea9b8ac189ce4d7a9dc4dcbb9301b1caae6fa99c76dd3037f1b62b76bb5e7 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d6696269d8f1228044bb7cf59346f3d87e023e819667e6e8aa1989bf95d6ccb9 lifecycle: preStop: exec: From 258c126c20140957412036eb042621cc437e5b29 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 7 Feb 2024 10:31:39 -0500 Subject: [PATCH 429/825] Update spring-cloud-gcp to 4.9.2 and 5.0.2 See gh-1404 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b8b3576752..d051fb0412 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -105,9 +105,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 4.9.1 + version: 4.9.2 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 5.0.1 + version: 5.0.2 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From c3d09e30c9bab9fc0310ed6ad552711468871b23 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Mon, 12 Feb 2024 07:57:54 +0000 Subject: [PATCH 430/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 10053cedf4..c4638a2298 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d6696269d8f1228044bb7cf59346f3d87e023e819667e6e8aa1989bf95d6ccb9 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8638b9869cf2b507fb7b3b516efc283f80b5eeb59f590e22bd5f0bfc081ad8d9 lifecycle: preStop: exec: From dd067ccb5e85b8804b73b71b2c9b5ab979866fbd Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 14 Feb 2024 08:27:49 +0100 Subject: [PATCH 431/825] Fix documentation link for Spring REST docs Closes gh-1407 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d051fb0412..d19204eead 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1053,7 +1053,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-restdocs/docs/current/reference/html5/ + href: https://docs.spring.io/spring-restdocs/docs/current/reference/htmlsingle/ - name: Testcontainers id: testcontainers description: Provide lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container. From cf54c069af62d1044e745b145751e7b5071938d4 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 14 Feb 2024 08:30:32 +0100 Subject: [PATCH 432/825] Revert "Fix documentation link for Spring REST docs" This reverts commit dd067ccb5e85b8804b73b71b2c9b5ab979866fbd. --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d19204eead..d051fb0412 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1053,7 +1053,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-restdocs/docs/current/reference/htmlsingle/ + href: https://docs.spring.io/spring-restdocs/docs/current/reference/html5/ - name: Testcontainers id: testcontainers description: Provide lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container. From d789f393ba582596a35b7d5cd3c0e55267bf7527 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 12 Feb 2024 14:48:27 +0200 Subject: [PATCH 433/825] Upgrade to vaadin 24.3.5 See gh-1406 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d051fb0412..f6f1b0ec78 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -152,7 +152,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.3 + version: 24.3.5 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 249b573e895f159bd5d7630102daf02e429c3dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Tue, 13 Feb 2024 12:52:31 +0100 Subject: [PATCH 434/825] Upgrade Timefold Solver to 1.7.0 See gh-1408 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f6f1b0ec78..5fbc99a3af 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -145,7 +145,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 1.6.0 + version: 1.7.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From d426731a49d7bf17e1c1175b3ca1d82c19cb2c72 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 14 Feb 2024 07:45:09 +0000 Subject: [PATCH 435/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index c4638a2298..2f313f424e 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:8638b9869cf2b507fb7b3b516efc283f80b5eeb59f590e22bd5f0bfc081ad8d9 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d2c89c69adbcecd791676c7aff1ccdf84b69cc9cda9a399a14df06cd33887540 lifecycle: preStop: exec: From ce7efdafca439ad4baaf79627295c74bfe885640 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 14 Feb 2024 07:46:39 +0000 Subject: [PATCH 436/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 2f313f424e..a8939484ce 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:d2c89c69adbcecd791676c7aff1ccdf84b69cc9cda9a399a14df06cd33887540 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3c053e6879fcfdb9774da3c7765a6d0d2ddb379096453a3fde9ff12d0336f81b lifecycle: preStop: exec: From 88e0527a08738b78e7be001502d77301e59d24ff Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 14 Feb 2024 07:52:05 +0000 Subject: [PATCH 437/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index a8939484ce..4c33d8cf7f 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3c053e6879fcfdb9774da3c7765a6d0d2ddb379096453a3fde9ff12d0336f81b + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3ef685d649c8a8ad01a04f87fe9efd4e5c9d588f3f07e9c28abecdd255652755 lifecycle: preStop: exec: From 62d0497016e4e626252829318da42922d31238bc Mon Sep 17 00:00:00 2001 From: luizy Date: Wed, 14 Feb 2024 19:32:04 +0900 Subject: [PATCH 438/825] Fix documentation link for Spring REST docs See gh-1409 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 5fbc99a3af..4cdacab2fa 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1053,7 +1053,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-restdocs/docs/current/reference/html5/ + href: https://docs.spring.io/spring-restdocs/docs/current/reference/htmlsingle/ - name: Testcontainers id: testcontainers description: Provide lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container. From a436c8cf58be1c7a870962833f0c206926492026 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Wed, 14 Feb 2024 10:56:50 +0000 Subject: [PATCH 439/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 4c33d8cf7f..0dd39b6bee 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:3ef685d649c8a8ad01a04f87fe9efd4e5c9d588f3f07e9c28abecdd255652755 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4d36893a63fa9079d06e8bf4d527d54f77207c187728cfc21de6836b77531b38 lifecycle: preStop: exec: From 970c379d74697363a3b319b61d804b8432cf719d Mon Sep 17 00:00:00 2001 From: Joe Wang <106995533+JoeWang1127@users.noreply.github.com> Date: Thu, 15 Feb 2024 19:18:15 -0500 Subject: [PATCH 440/825] Update spring-cloud-gcp to 4.9.3 and 5.0.3 See gh-1410 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4cdacab2fa..a753fb804d 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -105,9 +105,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 4.9.2 + version: 4.9.3 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 5.0.2 + version: 5.0.3 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From edfcef9638acc5e17d4e0139581de932d18ae455 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 16 Feb 2024 07:51:34 +0000 Subject: [PATCH 441/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 0dd39b6bee..0a2b42246c 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:4d36893a63fa9079d06e8bf4d527d54f77207c187728cfc21de6836b77531b38 + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:56eb6f9097275bfb1f94b5a5b9991ba28ff0c5b6e6bae89808d112ff48f2b0cc lifecycle: preStop: exec: From d58021263883cca55a2ed213cbe37c3d34c163a4 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 16 Feb 2024 08:52:50 +0100 Subject: [PATCH 442/825] Add Azure Spring Apps to the powered by section Closes gh-1411 --- .../src/components/common/layout/SideLeft.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index 4ddc042177..c8ca6aa0ca 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -164,8 +164,8 @@ function SideLeft() { > Spring Initializr - {' '} - and{' '} + + ,{' '} Cloud Native Buildpacks + {' '} + and{' '} + + + Azure Spring Apps +
    From 038f77150236777a99d0b74b83cacff883ed7e99 Mon Sep 17 00:00:00 2001 From: Spring Builds Date: Fri, 16 Feb 2024 08:10:27 +0000 Subject: [PATCH 443/825] Update image digest in deployment.yml --- ci/config/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml index 0a2b42246c..80c7b4a99d 100644 --- a/ci/config/deployment.yml +++ b/ci/config/deployment.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:56eb6f9097275bfb1f94b5a5b9991ba28ff0c5b6e6bae89808d112ff48f2b0cc + image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:73f8ab1d0167a5dd4f1d8a69241c0d2196adbd0da9d8ef70c999d9188c92717a lifecycle: preStop: exec: From d08683235bfa28fe155be9fcbbc4b172edaa7840 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 19 Feb 2024 13:41:29 +0100 Subject: [PATCH 444/825] Enable dependabot for Github Actions --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..5ace4600a1 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" From aa976beb5a4dfd9fc5a5e0cfe26a75978e36383a Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 19 Feb 2024 14:39:00 +0100 Subject: [PATCH 445/825] Improve caching of repositories in tests --- .github/workflows/build-and-deploy.yml | 9 +-- .../ProjectGenerationIntegrationTests.java | 11 +-- .../start/site/test/TemporaryFiles.java | 79 +++++++++++++++++++ .../site/test/TestMavenVersionResolver.java | 3 +- .../src/test/resources/application-test.yml | 2 +- 5 files changed, 91 insertions(+), 13 deletions(-) create mode 100644 start-site/src/test/java/io/spring/start/site/test/TemporaryFiles.java diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index b4f730a30c..aeee05e6b0 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -25,15 +25,14 @@ jobs: - name: Cache Maven/Gradle repositories for tests uses: actions/cache@v4 with: - path: | - /tmp/maven-version-resolver-cache - /tmp/homes + path: ~/start-spring-io-cache # See https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache key: test-repositories-${{ runner.os }}-${{ github.run_id }} - restore-keys: | - test-repositories-${{ runner.os }} + restore-keys: test-repositories-${{ runner.os }}- - name: Build with Maven + env: + START_SPRING_IO_TMPDIR: ~/start-spring-io-cache run: ./mvnw --batch-mode --update-snapshots verify - name: Set up Azure diff --git a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java index 3d85246c9a..e4c3d219f1 100644 --- a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java @@ -48,9 +48,9 @@ import io.spring.initializr.web.project.ProjectGenerationInvoker; import io.spring.initializr.web.project.ProjectRequest; import io.spring.initializr.web.project.WebProjectRequest; +import io.spring.start.site.test.TemporaryFiles; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; -import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; @@ -127,8 +127,8 @@ Stream parameters() { @ParameterizedTest(name = "{0} - {1} - {2} - {3}") @MethodSource("parameters") - void projectBuilds(Version bootVersion, Packaging packaging, Language language, BuildSystem buildSystem, - @TempDir Path directory) throws IOException, InterruptedException { + void projectBuilds(Version bootVersion, Packaging packaging, Language language, BuildSystem buildSystem) + throws IOException, InterruptedException { WebProjectRequest request = new WebProjectRequest(); request.setBootVersion(bootVersion.toString()); request.setLanguage(language.id()); @@ -143,7 +143,8 @@ void projectBuilds(Version bootVersion, Packaging packaging, Language language, try { ProcessBuilder processBuilder = createProcessBuilder(buildSystem, home); processBuilder.directory(project.toFile()); - Path output = Files.createTempFile(directory, "output-", ".log"); + Path output = TemporaryFiles.newTemporaryDirectory("ProjectGenerationIntegrationTests-projectBuilds") + .resolve("output.log"); processBuilder.redirectError(output.toFile()); processBuilder.redirectOutput(output.toFile()); assertThat(processBuilder.start().waitFor()).describedAs(String.join("\n", Files.readAllLines(output))) @@ -215,7 +216,7 @@ void release(Path home) { private Path createTempDirectory() { try { - Path path = Path.of(System.getProperty("java.io.tmpdir")) + Path path = TemporaryFiles.getTempDir() .resolve("homes") .resolve(this.prefix + "-" + this.counter.getAndIncrement()); Files.createDirectories(path); diff --git a/start-site/src/test/java/io/spring/start/site/test/TemporaryFiles.java b/start-site/src/test/java/io/spring/start/site/test/TemporaryFiles.java new file mode 100644 index 0000000000..70151d6053 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/test/TemporaryFiles.java @@ -0,0 +1,79 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.test; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.springframework.util.FileSystemUtils; + +/** + * Utility to work with temporary files. + * + * @author Moritz Halbritter + */ +public final class TemporaryFiles { + + private static final AtomicBoolean CLEANUP_REGISTERED = new AtomicBoolean(); + + private static final Set CLEANUP_PATHS = ConcurrentHashMap.newKeySet(); + + private TemporaryFiles() { + } + + public static Path newTemporaryDirectory(String prefix) throws IOException { + String name = prefix + System.nanoTime(); + Path path = getTempDir().resolve(name); + Files.createDirectories(path); + registerCleanup(); + CLEANUP_PATHS.add(path); + return path; + } + + private static void registerCleanup() { + if (CLEANUP_REGISTERED.compareAndSet(false, true)) { + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + for (Path cleanupPath : CLEANUP_PATHS) { + try { + FileSystemUtils.deleteRecursively(cleanupPath); + } + catch (IOException ex) { + // Ignore + } + } + })); + } + } + + public static Path getTempDir() { + String property = System.getenv("START_SPRING_IO_TMPDIR"); + if (property != null) { + return Path.of(property); + } + property = System.getProperty("java.io.tmpdir"); + if (property != null) { + return Path.of(property); + } + throw new IllegalStateException( + "Unable to find temporary directory. Please set either the env variable START_SPRING_IO_TMPDIR, or the system property java.io.tmpdir"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java b/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java index bf27e56c7a..3c6fedb07f 100644 --- a/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java +++ b/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java @@ -16,7 +16,6 @@ package io.spring.start.site.test; -import java.nio.file.Path; import java.util.Map; import io.spring.initializr.versionresolver.MavenVersionResolver; @@ -31,7 +30,7 @@ public class TestMavenVersionResolver implements MavenVersionResolver { private static final TestMavenVersionResolver INSTANCE = new TestMavenVersionResolver(); private final MavenVersionResolver delegate = MavenVersionResolver - .withCacheLocation(Path.of(System.getProperty("java.io.tmpdir")).resolve("maven-version-resolver-cache")); + .withCacheLocation(TemporaryFiles.getTempDir().resolve("maven-version-resolver-cache")); @Override public Map resolveDependencies(String groupId, String artifactId, String version) { diff --git a/start-site/src/test/resources/application-test.yml b/start-site/src/test/resources/application-test.yml index 53df269549..604ee888f6 100644 --- a/start-site/src/test/resources/application-test.yml +++ b/start-site/src/test/resources/application-test.yml @@ -1,3 +1,3 @@ application: maven-version-resolver: - cache-directory: "${java.io.tmpdir}/maven-version-resolver-cache" + cache-directory: "${START_SPRING_IO_TMPDIR:${java.io.tmpdir}}/maven-version-resolver-cache" From fd6e0d433fd45e4234e75e4ef685a94b635eac48 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 19 Feb 2024 15:01:14 +0100 Subject: [PATCH 446/825] Fix cache path --- .github/workflows/build-and-deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index aeee05e6b0..97df52e3ff 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -25,14 +25,14 @@ jobs: - name: Cache Maven/Gradle repositories for tests uses: actions/cache@v4 with: - path: ~/start-spring-io-cache + path: /tmp/start-spring-io-cache # See https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache key: test-repositories-${{ runner.os }}-${{ github.run_id }} restore-keys: test-repositories-${{ runner.os }}- - name: Build with Maven env: - START_SPRING_IO_TMPDIR: ~/start-spring-io-cache + START_SPRING_IO_TMPDIR: /tmp/start-spring-io-cache run: ./mvnw --batch-mode --update-snapshots verify - name: Set up Azure From f9aa3d44dd5d5da676e38828dd8eab17a350c036 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 19 Feb 2024 16:25:23 +0100 Subject: [PATCH 447/825] Fix RESTdocs build when using Gradle with the Kotlin DSL Closes gh-581 --- ...ctSpringRestDocsGradleBuildCustomizer.java | 39 ++++++++++++ ...gRestDocsGradleGroovyBuildCustomizer.java} | 12 ++-- ...ngRestDocsGradleKotlinBuildCustomizer.java | 39 ++++++++++++ ...estDocsProjectGenerationConfiguration.java | 19 ++++-- ...DocsGradleGroovyBuildCustomizerTests.java} | 8 +-- ...tDocsGradleKotlinBuildCustomizerTests.java | 63 +++++++++++++++++++ ...csProjectGenerationConfigurationTests.java | 22 +++++-- 7 files changed, 181 insertions(+), 21 deletions(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/AbstractSpringRestDocsGradleBuildCustomizer.java rename start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/{SpringRestDocsGradleBuildCustomizer.java => SpringRestDocsGradleGroovyBuildCustomizer.java} (68%) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizer.java rename start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/{SpringRestDocsGradleBuildCustomizerTests.java => SpringRestDocsGradleGroovyBuildCustomizerTests.java} (89%) create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/AbstractSpringRestDocsGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/AbstractSpringRestDocsGradleBuildCustomizer.java new file mode 100644 index 0000000000..17980026c6 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/AbstractSpringRestDocsGradleBuildCustomizer.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springrestdocs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * Abstract {@link BuildCustomizer Customizer} for a {@link GradleBuild} when the + * generated project * depends on Spring REST Docs. + * + * @author Moritz Halbritter + */ +abstract class AbstractSpringRestDocsGradleBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(GradleBuild build) { + build.plugins().add("org.asciidoctor.jvm.convert", (plugin) -> plugin.setVersion("3.3.2")); + build.properties().property("snippetsDir", "file(\"build/generated-snippets\")"); + customizeForDialect(build); + } + + abstract void customizeForDialect(GradleBuild build); + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizer.java similarity index 68% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizer.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizer.java index 903b69993e..5bc9ed0306 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,17 +20,15 @@ import io.spring.initializr.generator.spring.build.BuildCustomizer; /** - * {@link BuildCustomizer Customizer} for a {@link GradleBuild} when the generated project - * depends on Spring REST Docs. + * {@link BuildCustomizer Customizer} for a Groovy {@link GradleBuild} when the generated + * project depends on Spring REST Docs. * * @author Andy Wilkinson */ -class SpringRestDocsGradleBuildCustomizer implements BuildCustomizer { +class SpringRestDocsGradleGroovyBuildCustomizer extends AbstractSpringRestDocsGradleBuildCustomizer { @Override - public void customize(GradleBuild build) { - build.plugins().add("org.asciidoctor.jvm.convert", (plugin) -> plugin.setVersion("3.3.2")); - build.properties().property("snippetsDir", "file(\"build/generated-snippets\")"); + void customizeForDialect(GradleBuild build) { build.tasks().customize("test", (task) -> task.invoke("outputs.dir", "snippetsDir")); build.tasks().customize("asciidoctor", (task) -> { task.invoke("inputs.dir", "snippetsDir"); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizer.java new file mode 100644 index 0000000000..4e04126c44 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizer.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springrestdocs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer Customizer} for a Kotlin {@link GradleBuild} when the generated + * project depends on Spring REST Docs. + * + * @author Moritz Halbritter + */ +class SpringRestDocsGradleKotlinBuildCustomizer extends AbstractSpringRestDocsGradleBuildCustomizer { + + @Override + void customizeForDialect(GradleBuild build) { + build.tasks().customize("test", (task) -> task.invoke("outputs.dir", "project.extra[\"snippetsDir\"]!!")); + build.tasks().customize("asciidoctor", (task) -> { + task.invoke("inputs.dir", "project.extra[\"snippetsDir\"]!!"); + task.invoke("dependsOn", "tasks.test"); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfiguration.java index e33d30d1f7..3f38b2b1f0 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,25 +29,32 @@ * REST Docs. * * @author Andy Wilkinson + * @author Moritz Halbritter */ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("restdocs") public class SpringRestDocsProjectGenerationConfiguration { @Bean - public SpringRestDocsBuildCustomizer springRestDocsBuildCustomizer() { + SpringRestDocsBuildCustomizer springRestDocsBuildCustomizer() { return new SpringRestDocsBuildCustomizer(); } @Bean - @ConditionalOnBuildSystem(GradleBuildSystem.ID) - public SpringRestDocsGradleBuildCustomizer restDocsGradleBuildCustomizer() { - return new SpringRestDocsGradleBuildCustomizer(); + @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) + SpringRestDocsGradleGroovyBuildCustomizer restDocsGradleGroovyBuildCustomizer() { + return new SpringRestDocsGradleGroovyBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) + SpringRestDocsGradleKotlinBuildCustomizer restDocsGradleKotlinBuildCustomizer() { + return new SpringRestDocsGradleKotlinBuildCustomizer(); } @Bean @ConditionalOnBuildSystem(MavenBuildSystem.ID) - public SpringRestDocsMavenBuildCustomizer restDocsMavenBuildCustomizer() { + SpringRestDocsMavenBuildCustomizer restDocsMavenBuildCustomizer() { return new SpringRestDocsMavenBuildCustomizer(); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java similarity index 89% rename from start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizerTests.java rename to start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java index 725daf3cf2..56263f84d2 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,13 +26,13 @@ import static org.assertj.core.api.Assertions.entry; /** - * Tests for {@link SpringRestDocsGradleBuildCustomizer}. + * Tests for {@link SpringRestDocsGradleGroovyBuildCustomizer}. * * @author Andy Wilkinson */ -class SpringRestDocsGradleBuildCustomizerTests { +class SpringRestDocsGradleGroovyBuildCustomizerTests { - private final SpringRestDocsGradleBuildCustomizer customizer = new SpringRestDocsGradleBuildCustomizer(); + private final SpringRestDocsGradleGroovyBuildCustomizer customizer = new SpringRestDocsGradleGroovyBuildCustomizer(); @Test void customizesGradleBuild() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java new file mode 100644 index 0000000000..743c07652b --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java @@ -0,0 +1,63 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springrestdocs; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.gradle.GradleTask; +import io.spring.initializr.generator.buildsystem.gradle.GradleTask.Invocation; +import io.spring.initializr.generator.buildsystem.gradle.StandardGradlePlugin; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; + +/** + * Tests for {@link SpringRestDocsGradleKotlinBuildCustomizer}. + * + * @author Moritz Halbritter + */ +class SpringRestDocsGradleKotlinBuildCustomizerTests { + + private final SpringRestDocsGradleKotlinBuildCustomizer customizer = new SpringRestDocsGradleKotlinBuildCustomizer(); + + @Test + void customizesGradleBuild() { + GradleBuild build = new GradleBuild(); + this.customizer.customize(build); + assertThat(build.plugins().values()).singleElement().satisfies((plugin) -> { + assertThat(plugin.getId()).isEqualTo("org.asciidoctor.jvm.convert"); + assertThat(((StandardGradlePlugin) plugin).getVersion()).isEqualTo("3.3.2"); + }); + assertThat(build.properties().values()).contains(entry("snippetsDir", "file(\"build/generated-snippets\")")); + GradleTask testTask = build.tasks().get("test"); + assertThat(testTask).isNotNull(); + assertThat(testTask.getInvocations()).hasSize(1); + Invocation invocation = testTask.getInvocations().get(0); + assertThat(invocation.getTarget()).isEqualTo("outputs.dir"); + assertThat(invocation.getArguments()).containsExactly("project.extra[\"snippetsDir\"]!!"); + GradleTask asciidoctorTask = build.tasks().get("asciidoctor"); + assertThat(asciidoctorTask).isNotNull(); + assertThat(asciidoctorTask.getInvocations()).hasSize(2); + Invocation inputsDir = asciidoctorTask.getInvocations().get(0); + assertThat(inputsDir.getTarget()).isEqualTo("inputs.dir"); + assertThat(inputsDir.getArguments()).containsExactly("project.extra[\"snippetsDir\"]!!"); + Invocation dependsOn = asciidoctorTask.getInvocations().get(1); + assertThat(dependsOn.getTarget()).isEqualTo("dependsOn"); + assertThat(dependsOn.getArguments()).containsExactly("tasks.test"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfigurationTests.java index c74518a515..c7fd51bd19 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ * Tests for {@link SpringRestDocsProjectGenerationConfiguration}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class SpringRestDocsProjectGenerationConfigurationTests { @@ -49,13 +50,26 @@ void springRestDocsCustomizerMaven() { } @Test - void springRestDocsCustomizerGradle() { + void springRestDocsCustomizerGradleGroovy() { MutableProjectDescription description = new MutableProjectDescription(); - description.setBuildSystem(new GradleBuildSystem()); + description.setBuildSystem(new GradleBuildSystem(GradleBuildSystem.DIALECT_GROOVY)); + description.addDependency("restdocs", mock(Dependency.class)); + this.projectTester.configure(description, + (context) -> assertThat(context).getBeans(BuildCustomizer.class) + .containsKeys("restDocsGradleGroovyBuildCustomizer") + .doesNotContainKeys("restDocsGradleKotlinBuildCustomizer") + .doesNotContainKeys("restDocsMavenBuildCustomizer")); + } + + @Test + void springRestDocsCustomizerGradleKotlin() { + MutableProjectDescription description = new MutableProjectDescription(); + description.setBuildSystem(new GradleBuildSystem(GradleBuildSystem.DIALECT_KOTLIN)); description.addDependency("restdocs", mock(Dependency.class)); this.projectTester.configure(description, (context) -> assertThat(context).getBeans(BuildCustomizer.class) - .containsKeys("restDocsGradleBuildCustomizer") + .containsKeys("restDocsGradleKotlinBuildCustomizer") + .doesNotContainKeys("restDocsGradleGroovyBuildCustomizer") .doesNotContainKeys("restDocsMavenBuildCustomizer")); } From 4b7d370778aa946ef1b7c648e16f654d62d1dbed Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 20 Feb 2024 09:09:56 +0100 Subject: [PATCH 448/825] Add Google Chat notifications See gh-1401 --- .github/workflows/build-and-deploy.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 97df52e3ff..f9336e04c0 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -50,3 +50,11 @@ jobs: --service spring-io \ --resource-group spring-io \ --artifact-path start-site/target/start-site-exec.jar + + - name: Google Chat Notification + uses: Co-qn/google-chat-notification@3691ccf4763537d6e544bc6cdcccc1965799d056 + with: + name: Build and Deploy + url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }} + status: ${{ job.status }} + if: always() From c5a345ae60643e3c9cee3c24dad25b4dc0ec8a65 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 20 Feb 2024 12:41:49 +0100 Subject: [PATCH 449/825] Upgrade to Apache Camel 4.4.0 https://camel.apache.org/blog/2024/02/RELEASE-4.4.0/ See gh-1412 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index a753fb804d..d10fdba838 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -810,7 +810,7 @@ initializr: - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 4.2.0 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 4.3.0 + version: 4.4.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From f80a8280fdeeaad2a8a30abf49a5cfb003fcd32a Mon Sep 17 00:00:00 2001 From: Maciej Walkowiak Date: Sun, 25 Feb 2024 09:58:58 +0100 Subject: [PATCH 450/825] Fix link to Spring Modulith reference See gh-1417 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d10fdba838..033f3adbe7 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -223,7 +223,7 @@ initializr: description: Support for building modular monolithic applications. links: - rel: reference - href: https://docs.spring.io/spring-modulith/docs/current/reference/html/ + href: https://docs.spring.io/spring-modulith/reference/ - name: Web content: - name: Spring Web From d15e208d7b8b7278c40fbe251594f8b13730263c Mon Sep 17 00:00:00 2001 From: Alice Li Date: Fri, 23 Feb 2024 20:09:42 -0500 Subject: [PATCH 451/825] Update spring-cloud-gcp to 4.9.4 and 5.0.4 See gh-1416 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 033f3adbe7..04251ece64 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -105,9 +105,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 4.9.3 + version: 4.9.4 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 5.0.3 + version: 5.0.4 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 31d62a9ffe3e16cacac7c745e723405cd21b2a9e Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 27 Feb 2024 09:32:40 +0100 Subject: [PATCH 452/825] Add RabbitMQ streams Closes gh-1418 --- .../SpringIntegrationModuleRegistry.java | 4 +- .../TestcontainersModuleRegistry.java | 4 +- start-site/src/main/resources/application.yml | 9 +++++ ...onProjectGenerationConfigurationTests.java | 40 ++++++++++--------- ...rsProjectGenerationConfigurationTests.java | 11 ++--- 5 files changed, 40 insertions(+), 28 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java index cee0e7aa03..9dedd005a9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,7 +39,7 @@ static Iterable create() { return create( onDependencies("activemq", "artemis").customizeBuild(addDependency("jms")) .customizeHelpDocument(addReferenceLink("JMS Module", "jms")), - onDependencies("amqp").customizeBuild(addDependency("amqp")) + onDependencies("amqp", "amqp-streams").customizeBuild(addDependency("amqp")) .customizeHelpDocument(addReferenceLink("AMQP Module", "amqp")), onDependencies("data-jdbc", "jdbc").customizeBuild(addDependency("jdbc")) .customizeHelpDocument(addReferenceLink("JDBC Module", "jdbc")), diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 41582d2f96..8e7b7edc9b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,7 +44,7 @@ abstract class TestcontainersModuleRegistry { static Iterable create(Version platformVersion) { List builders = new ArrayList<>(); - builders.add(onDependencies("amqp").customizeBuild(addModule("rabbitmq")) + builders.add(onDependencies("amqp", "amqp-streams").customizeBuild(addModule("rabbitmq")) .customizeHelpDocument(addReferenceLink("RabbitMQ Module", "rabbitmq/"))); builders.add(onDependencies("cloud-gcp", "cloud-gcp-pubsub").customizeBuild(addModule("gcloud")) .customizeHelpDocument(addReferenceLink("GCloud Module", "gcloud/"))); diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 04251ece64..45244a2602 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -719,6 +719,15 @@ initializr: description: Messaging with RabbitMQ - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.amqp + - name: Spring for RabbitMQ Streams + id: amqp-streams + description: Building stream processing applications with RabbitMQ. + groupId: org.springframework.amqp + artifactId: spring-rabbit-stream + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-amqp/reference/stream.html - name: Spring for Apache Kafka id: kafka description: Publish, subscribe, store, and process streams of records. diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java index 08fcd72808..0cecbd417f 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -60,15 +60,16 @@ void buildWithSupportedEntries(String springBootDependencyId, String integration static Stream supportedEntries() { return Stream.of(Arguments.arguments("artemis", "jms"), Arguments.arguments("amqp", "amqp"), - Arguments.arguments("data-jdbc", "jdbc"), Arguments.arguments("jdbc", "jdbc"), - Arguments.arguments("data-jpa", "jpa"), Arguments.arguments("data-mongodb", "mongodb"), - Arguments.arguments("data-mongodb-reactive", "mongodb"), Arguments.arguments("data-r2dbc", "r2dbc"), - Arguments.arguments("data-redis", "redis"), Arguments.arguments("data-redis-reactive", "redis"), - Arguments.arguments("kafka", "kafka"), Arguments.arguments("kafka-streams", "kafka"), - Arguments.arguments("mail", "mail"), Arguments.arguments("rsocket", "rsocket"), - Arguments.arguments("security", "security"), Arguments.arguments("web", "http"), - Arguments.arguments("webflux", "webflux"), Arguments.arguments("websocket", "websocket"), - Arguments.arguments("websocket", "stomp"), Arguments.arguments("web-services", "ws")); + Arguments.arguments("amqp-streams", "amqp"), Arguments.arguments("data-jdbc", "jdbc"), + Arguments.arguments("jdbc", "jdbc"), Arguments.arguments("data-jpa", "jpa"), + Arguments.arguments("data-mongodb", "mongodb"), Arguments.arguments("data-mongodb-reactive", "mongodb"), + Arguments.arguments("data-r2dbc", "r2dbc"), Arguments.arguments("data-redis", "redis"), + Arguments.arguments("data-redis-reactive", "redis"), Arguments.arguments("kafka", "kafka"), + Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mail", "mail"), + Arguments.arguments("rsocket", "rsocket"), Arguments.arguments("security", "security"), + Arguments.arguments("web", "http"), Arguments.arguments("webflux", "webflux"), + Arguments.arguments("websocket", "websocket"), Arguments.arguments("websocket", "stomp"), + Arguments.arguments("web-services", "ws")); } @ParameterizedTest @@ -87,15 +88,16 @@ void linkToSupportedEntriesWhenSpringIntegrationIsNotPresentIsNotAdded(String de static Stream referenceLinks() { return Stream.of(Arguments.arguments("artemis", "jms"), Arguments.arguments("amqp", "amqp"), - Arguments.arguments("data-jdbc", "jdbc"), Arguments.arguments("jdbc", "jdbc"), - Arguments.arguments("data-jpa", "jpa"), Arguments.arguments("data-mongodb", "mongodb"), - Arguments.arguments("data-mongodb-reactive", "mongodb"), Arguments.arguments("data-r2dbc", "r2dbc"), - Arguments.arguments("data-redis", "redis"), Arguments.arguments("data-redis-reactive", "redis"), - Arguments.arguments("kafka", "kafka"), Arguments.arguments("kafka-streams", "kafka"), - Arguments.arguments("mail", "mail"), Arguments.arguments("rsocket", "rsocket"), - Arguments.arguments("security", "security"), Arguments.arguments("web", "http"), - Arguments.arguments("webflux", "webflux"), Arguments.arguments("websocket", "web-sockets"), - Arguments.arguments("websocket", "stomp"), Arguments.arguments("web-services", "ws")); + Arguments.arguments("amqp-streams", "amqp"), Arguments.arguments("data-jdbc", "jdbc"), + Arguments.arguments("jdbc", "jdbc"), Arguments.arguments("data-jpa", "jpa"), + Arguments.arguments("data-mongodb", "mongodb"), Arguments.arguments("data-mongodb-reactive", "mongodb"), + Arguments.arguments("data-r2dbc", "r2dbc"), Arguments.arguments("data-redis", "redis"), + Arguments.arguments("data-redis-reactive", "redis"), Arguments.arguments("kafka", "kafka"), + Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mail", "mail"), + Arguments.arguments("rsocket", "rsocket"), Arguments.arguments("security", "security"), + Arguments.arguments("web", "http"), Arguments.arguments("webflux", "webflux"), + Arguments.arguments("websocket", "web-sockets"), Arguments.arguments("websocket", "stomp"), + Arguments.arguments("web-services", "ws")); } @Test diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index d9edb8e698..929ff8a9b7 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -66,8 +66,9 @@ void buildWithSpringBoot32AndOracleJdbcDriverUsesOracleFree() { } static Stream supportedEntriesBuild() { - return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.arguments("cloud-gcp", "gcloud"), - Arguments.arguments("cloud-gcp-pubsub", "gcloud"), Arguments.arguments("data-cassandra", "cassandra"), + return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.of("amqp-streams", "rabbitmq"), + Arguments.arguments("cloud-gcp", "gcloud"), Arguments.arguments("cloud-gcp-pubsub", "gcloud"), + Arguments.arguments("data-cassandra", "cassandra"), Arguments.arguments("data-cassandra-reactive", "cassandra"), Arguments.arguments("data-couchbase", "couchbase"), Arguments.arguments("data-couchbase-reactive", "couchbase"), @@ -96,8 +97,8 @@ void linkToSupportedEntriesWhenTestContainerIsNotPresentIsNotAdded(String depend } static Stream supportedEntriesHelpDocument() { - return Stream.of(Arguments.arguments("amqp", "rabbitmq/"), Arguments.arguments("cloud-gcp", "gcloud/"), - Arguments.arguments("cloud-gcp-pubsub", "gcloud/"), + return Stream.of(Arguments.arguments("amqp", "rabbitmq/"), Arguments.arguments("amqp-streams", "rabbitmq/"), + Arguments.arguments("cloud-gcp", "gcloud/"), Arguments.arguments("cloud-gcp-pubsub", "gcloud/"), Arguments.arguments("cloud-starter-consul-config", "consul/"), Arguments.arguments("cloud-starter-vault-config", "vault/"), Arguments.arguments("data-cassandra", "databases/cassandra/"), From a600c7894d9acf86c6c85de7b2f46ed952f06af5 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 21 Feb 2024 15:38:10 +0100 Subject: [PATCH 453/825] Add Spring AI Closes gh-1413 --- start-site/src/main/resources/application.yml | 212 ++++++++++++++++-- 1 file changed, 199 insertions(+), 13 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 45244a2602..33a3748036 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -78,6 +78,14 @@ initializr: version: 3.0.0 - compatibilityRange: "[3.1.0-M1, 3.3.0-M1)" version: 3.1.0 + spring-ai: + groupId: org.springframework.ai + artifactId: spring-ai-bom + versionProperty: spring-ai.version + mappings: + - compatibilityRange: "[3.0.0,3.3.0-M1)" + version: 0.8.0 + repositories: spring-milestones spring-cloud: groupId: org.springframework.cloud artifactId: spring-cloud-dependencies @@ -903,19 +911,6 @@ initializr: links: - rel: reference href: https://spring.io/projects/spring-shell - - name: Timefold Solver - id: timefold-solver - compatibilityRange: "[2.6.0,3.3.0-M1)" - groupId: ai.timefold.solver - artifactId: timefold-solver-spring-boot-starter - description: AI solver to optimize operations and scheduling. - bom: timefold-solver - links: - - rel: reference - href: https://timefold.ai/docs/timefold-solver/latest/quickstart/spring-boot/spring-boot-quickstart#springBootJavaQuickStart - - rel: sample - href: https://github.com/TimefoldAI/timefold-quickstarts/tree/stable/technology/java-spring-boot - description: Timetabling sample. Assign lessons to timeslots and rooms to produce a better schedule for teachers and students - name: Ops content: - name: Spring Boot Actuator @@ -1436,6 +1431,197 @@ initializr: href: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html#cloud-storage - rel: guide href: https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample + - name: AI + content: + - name: Azure OpenAI + id: spring-ai-azure-openai + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-azure-openai-spring-boot-starter + description: Spring AI support for Azure’s OpenAI offering, powered by ChatGPT. It extends beyond traditional OpenAI capabilities, delivering AI-driven text generation with enhanced functionality. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/clients/azure-openai-chat.html + - name: Azure AI Search + id: spring-ai-vectordb-azure + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-azure-vector-store-spring-boot-starter + description: Spring AI vector database support for Azure AI Search. It is an AI-powered information retrieval platform and part of Microsoft’s larger AI platform. Among other features, it allows users to query information using vector-based storage and retrieval. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/azure.html + - name: Amazon Bedrock + id: spring-ai-bedrock + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-bedrock-ai-spring-boot-starter + description: Spring AI support for Amazon Bedrock. It is a managed service that provides foundation models from various AI providers, available through a unified API. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/bedrock-chat.html + - name: Chroma Vector Database + id: spring-ai-vectordb-chroma + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-chroma-store-spring-boot-starter + description: Spring AI vector database support for Chroma. It is an open-source embedding database and gives you the tools to store document embeddings, content, and metadata. It also allows to search through those embeddings, including metadata filtering. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/chroma.html + - name: Milvus Vector Database + id: spring-ai-vectordb-milvus + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-milvus-store-spring-boot-starter + description: Spring AI vector database support for Milvus. It is an open-source vector database that has garnered significant attention in the fields of data science and machine learning. One of its standout features lies in its robust support for vector indexing and querying. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/milvus.html + - name: Neo4J Vector Database + id: spring-ai-vectordb-neo4j + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-neo4j-store-spring-boot-starter + description: Spring AI vector database support for Neo4j's Vector Search. It allows users to query vector embeddings from large datasets. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/neo4j.html + - name: Ollama + id: spring-ai-ollama + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-ollama-spring-boot-starter + description: Spring AI support for Ollama. It allows you to run various Large Language Models (LLMs) locally and generate text from them. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/clients/ollama-chat.html + - name: OpenAI + id: spring-ai-openai + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-openai-spring-boot-starter + description: Spring AI support for ChatGPT, the AI language model and DALL-E, the Image generation model from OpenAI. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/clients/openai-chat.html + - name: PGvector Vector Database + id: spring-ai-vectordb-pgvector + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-pgvector-store-spring-boot-starter + description: Spring AI vector database support for PGvector. It is an open-source extension for PostgreSQL that enables storing and searching over machine learning-generated embeddings. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pgvector.html + - name: Pinecone Vector Database + id: spring-ai-vectordb-pinecone + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-pinecone-store-spring-boot-starter + description: Spring AI vector database support for Pinecone. It is a popular cloud-based vector database and allows you to store and search vectors efficiently. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pinecone.html + - name: PostgresML + id: spring-ai-postgresml + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-postgresml-spring-boot-starter + description: Spring AI support for the PostgresML text embeddings models. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/embeddings/postgresml-embeddings.html + - name: Redis Search and Query Vector Database + id: spring-ai-vectordb-redis + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-redis-spring-boot-starter + description: Spring AI vector database support for Redis Search and Query.It extends the core features of Redis OSS and allows you to use Redis as a vector database. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/redis.html + - name: Stability AI + id: spring-ai-stabilityai + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-stability-ai-spring-boot-starter + description: Spring AI support for Stability AI's text to image generation model. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/clients/image/stabilityai-image.html + - name: Transformers (ONNX) Embeddings + id: spring-ai-transformers + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-transformers-spring-boot-starter + description: Spring AI support for pre-trained transformer models, serialized into the Open Neural Network Exchange (ONNX) format. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html + - name: Vertex AI + id: spring-ai-vertexai + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-vertex-ai-spring-boot-starter + description: Spring AI support for Google Vertex PaLM chat and embedding models. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-chat.html + - name: Weaviate Vector Database + id: spring-ai-vectordb-weaviate + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-weaviate-store-spring-boot-starter + description: Spring AI vector database support for Weaviate, an open-source vector database. It allows you to store data objects and vector embeddings from your favorite ML-models and scale seamlessly into billions of data objects. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/weaviate.html + - name: Timefold Solver + id: timefold-solver + compatibilityRange: "[2.6.0,3.3.0-M1)" + groupId: ai.timefold.solver + artifactId: timefold-solver-spring-boot-starter + description: AI solver to optimize operations and scheduling. + bom: timefold-solver + links: + - rel: reference + href: https://timefold.ai/docs/timefold-solver/latest/quickstart/spring-boot/spring-boot-quickstart#springBootJavaQuickStart + - rel: sample + href: https://github.com/TimefoldAI/timefold-quickstarts/tree/stable/technology/java-spring-boot + description: Timetabling sample. Assign lessons to timeslots and rooms to produce a better schedule for teachers and students types: - name: Gradle - Groovy id: gradle-project From db46c0aa02df03265278b5a977186982a57ed369 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 28 Feb 2024 13:55:11 +0100 Subject: [PATCH 454/825] Add verification job See gh-1401 --- .github/workflows/verification.yml | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/verification.yml diff --git a/.github/workflows/verification.yml b/.github/workflows/verification.yml new file mode 100644 index 0000000000..bbf700426b --- /dev/null +++ b/.github/workflows/verification.yml @@ -0,0 +1,41 @@ +name: Verification +on: + schedule: + - '@daily' + workflow_dispatch: + +jobs: + build: + name: Build and deploy + runs-on: ubuntu-latest + steps: + - name: Check out + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'liberica' + cache: 'maven' + + - name: Cache Maven/Gradle repositories for tests + uses: actions/cache@v4 + with: + path: /tmp/start-spring-io-cache + # See https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache + key: test-repositories-${{ runner.os }}-${{ github.run_id }} + restore-keys: test-repositories-${{ runner.os }}- + + - name: Build with Maven + env: + START_SPRING_IO_TMPDIR: /tmp/start-spring-io-cache + run: ./mvnw --batch-mode --update-snapshots --activate-profiles verification verify + + - name: Google Chat Notification + uses: Co-qn/google-chat-notification@3691ccf4763537d6e544bc6cdcccc1965799d056 + with: + name: Verification + url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }} + status: ${{ job.status }} + if: always() From 78ed771d07ce61c53fba7f2166cbf810df943d5e Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 28 Feb 2024 14:08:30 +0100 Subject: [PATCH 455/825] Fix verification job --- .github/workflows/verification.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/verification.yml b/.github/workflows/verification.yml index bbf700426b..f7ad9e300d 100644 --- a/.github/workflows/verification.yml +++ b/.github/workflows/verification.yml @@ -1,7 +1,7 @@ name: Verification on: schedule: - - '@daily' + - cron: '15 3 * * *' workflow_dispatch: jobs: From 637250fae7ba8fe12348fcefb304f4fbafebc079 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 28 Feb 2024 14:09:23 +0100 Subject: [PATCH 456/825] Fix job name --- .github/workflows/verification.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/verification.yml b/.github/workflows/verification.yml index f7ad9e300d..43c0e2ed4c 100644 --- a/.github/workflows/verification.yml +++ b/.github/workflows/verification.yml @@ -5,8 +5,8 @@ on: workflow_dispatch: jobs: - build: - name: Build and deploy + verification: + name: Verification runs-on: ubuntu-latest steps: - name: Check out From b7abb917ec539eb39828c3d7ecfc3a77bd53a38d Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 28 Feb 2024 14:10:58 +0100 Subject: [PATCH 457/825] Remove Concourse build See gh-1401 --- ci/README.adoc | 18 -- ci/config/deployment.yml | 45 ---- ci/config/elastic.yml | 3 - ci/config/kubeconfig.yml | 9 - ci/config/secret.yml | 7 - ci/images/README.adoc | 21 -- ci/images/setup.sh | 25 --- ci/images/start-site-ci-image/Dockerfile | 21 -- ci/parameters.yml | 22 -- ci/pipeline.yml | 274 ----------------------- ci/scripts/build-service.sh | 9 - ci/scripts/common.sh | 4 - ci/scripts/deploy.sh | 10 - ci/scripts/get-blob-url.sh | 12 - ci/scripts/update-deployment.sh | 17 -- ci/scripts/verify-service.sh | 8 - ci/tasks/build-service.yml | 12 - ci/tasks/deploy.yml | 9 - ci/tasks/get-blob-url.yml | 19 -- ci/tasks/update-deployment.yml | 9 - ci/tasks/verify-service.yml | 8 - 21 files changed, 562 deletions(-) delete mode 100644 ci/README.adoc delete mode 100644 ci/config/deployment.yml delete mode 100644 ci/config/elastic.yml delete mode 100644 ci/config/kubeconfig.yml delete mode 100644 ci/config/secret.yml delete mode 100644 ci/images/README.adoc delete mode 100755 ci/images/setup.sh delete mode 100644 ci/images/start-site-ci-image/Dockerfile delete mode 100644 ci/parameters.yml delete mode 100644 ci/pipeline.yml delete mode 100755 ci/scripts/build-service.sh delete mode 100644 ci/scripts/common.sh delete mode 100755 ci/scripts/deploy.sh delete mode 100755 ci/scripts/get-blob-url.sh delete mode 100755 ci/scripts/update-deployment.sh delete mode 100755 ci/scripts/verify-service.sh delete mode 100644 ci/tasks/build-service.yml delete mode 100644 ci/tasks/deploy.yml delete mode 100644 ci/tasks/get-blob-url.yml delete mode 100644 ci/tasks/update-deployment.yml delete mode 100644 ci/tasks/verify-service.yml diff --git a/ci/README.adoc b/ci/README.adoc deleted file mode 100644 index 6c49f3ed54..0000000000 --- a/ci/README.adoc +++ /dev/null @@ -1,18 +0,0 @@ -== Concourse pipeline - -Ensure that you've setup the target and can login - -[source] ----- -$ fly -t initializr login -n initializr -c https://ci.spring.io ----- - -The pipeline can be deployed using the following command: - -[source] ----- -$ fly -t initializr set-pipeline -p start-site -c ci/pipeline.yml -l ci/parameters.yml ----- - -NOTE: This assumes that you have credhub integration configured with the appropriate -secrets. diff --git a/ci/config/deployment.yml b/ci/config/deployment.yml deleted file mode 100644 index 80c7b4a99d..0000000000 --- a/ci/config/deployment.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - namespace: default - name: start-deployment -spec: - replicas: 2 - selector: - matchLabels: - app: start - template: - metadata: - labels: - app: start - spec: - containers: - - name: start-app - image: gcr.io/cf-spring-boot/initializr-k8s-image@sha256:73f8ab1d0167a5dd4f1d8a69241c0d2196adbd0da9d8ef70c999d9188c92717a - lifecycle: - preStop: - exec: - command: ["sh", "-c", "sleep 10"] - livenessProbe: - httpGet: - path: /actuator/health/liveness - port: 8080 - initialDelaySeconds: 5 - readinessProbe: - httpGet: - path: /actuator/health/readiness - port: 8080 - volumeMounts: - - name: elastic - mountPath: "/etc/config/initializr/stats/elastic" - readOnly: true - env: - - name: SERVER_SHUTDOWN - value: graceful - - name: SPRING_CONFIG_IMPORT - value: configtree:/etc/config/ - volumes: - - name: elastic - secret: - secretName: elastic \ No newline at end of file diff --git a/ci/config/elastic.yml b/ci/config/elastic.yml deleted file mode 100644 index c7d0ab4a69..0000000000 --- a/ci/config/elastic.yml +++ /dev/null @@ -1,3 +0,0 @@ -#@data/values ---- -uri: "" \ No newline at end of file diff --git a/ci/config/kubeconfig.yml b/ci/config/kubeconfig.yml deleted file mode 100644 index 431f2e79a2..0000000000 --- a/ci/config/kubeconfig.yml +++ /dev/null @@ -1,9 +0,0 @@ -kind: Config -current-context: spring-initializr -contexts: [{name: spring-initializr, context: {cluster: spring-initializr, user: user-1}}] -users: [{name: user-1, user: {auth-provider: {name: gcp}}}] -clusters: - - name: spring-initializr - cluster: - server: "https://35.245.127.30" - certificate-authority-data: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURERENDQWZTZ0F3SUJBZ0lSQUxhZ2Q0MzlIdTlBQnFmUEhiZ041aVF3RFFZSktvWklodmNOQVFFTEJRQXcKTHpFdE1Dc0dBMVVFQXhNa09UTmlPVE0yTW1RdFpXSm1aaTAwWVRGa0xXSXpOVGt0TUdKbVpHVXlOVFkxWXpJMgpNQjRYRFRJd01EWXdNakUzTkRFeE9Wb1hEVEkxTURZd01URTROREV4T1Zvd0x6RXRNQ3NHQTFVRUF4TWtPVE5pCk9UTTJNbVF0WldKbVppMDBZVEZrTFdJek5Ua3RNR0ptWkdVeU5UWTFZekkyTUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeFYzQjY2VnZVZE9mRDdOYndlYmdtY3g2K1o1dWo3algwektWTHEzMQpUR2lqUXRvQkQxbmJsMDlrRnlpUHRzVWFOamNTTGNBcFJHb1ZnQmlCbUE2MkpwbW1aRkdyOUVLbGZnU25jZkNGCkUvTnE3RFJmZkFvR2MvbTFsbVROUlFTUGR2UWNGYkVMUnFUaHRsQUNiWmlVS3IyK09vbHdjVDNIVWdHRmVKcTgKNVFzZWZNbUdVV3U3ZzczTVlEN2VPc2lDYUNaUDdVVFIrNVlmUHVRd0lSbC9kNFRmK3krS2xqKzRUL0FnNGhWTwpZZHluZjlhSllrLzF1VWdheUdYVlllendZcUtjVzRBTWdHc1d6bDhDd2xCQTJqUFdvZVQzbis3d0NQOVUxT09TClRYZVFOblFNZlJ4Um9yYVJUSWo0SUpUWWdwRmZDMWkzb0VnZFlGRi80bVI4MFFJREFRQUJveU13SVRBT0JnTlYKSFE4QkFmOEVCQU1DQWdRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQQpUWGhOTytiZ3Rhc2YraHpoS2xyZHhoQXRWYjRTV3IxN1A1dEkyM3pPSXgwelhOK1ltVFV5NXVmbmtiZ2c4UExOCjM2RnJpOFJMT09jaTY5SmhIVzhaL3RVb09ZS3ZqMm5jSmlLNlp3Y0txaXBsUytUNDdoRjRPdGU0WG1ZLzZVNnEKak8xUk5TaFBqdzJvYi9WZTE0cHpXWTh0SUxoTFlhd2w1Z1ZKbGgxaHhmZkJFamNoTW8vbnZqVHZrQjFxVUt5YwoxRmkyRHZCejZDREZtckJUVmR1SXJKM2dYYkZ5VWNsMGk4YXo5RkNpMGJBa2hoL0gwbUpEUUZ4aWFlZjlGdzdZCkNLbGdnZGEzTHppTmw3YUlKaEhRbGpLTXMybFFzNktlYXMwaHgzbitNaFg0S0FGdFVjQXduWVBZZjZHRVN2VTMKTm1sVVlUUGlJL1RhWldSWmoxOFJUQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K" \ No newline at end of file diff --git a/ci/config/secret.yml b/ci/config/secret.yml deleted file mode 100644 index e5eb54f9c5..0000000000 --- a/ci/config/secret.yml +++ /dev/null @@ -1,7 +0,0 @@ -#@ load("@ytt:data", "data") -apiVersion: v1 -kind: Secret -metadata: - name: elastic -data: - uri: #@ data.values.uri diff --git a/ci/images/README.adoc b/ci/images/README.adoc deleted file mode 100644 index 92fa3c2ec5..0000000000 --- a/ci/images/README.adoc +++ /dev/null @@ -1,21 +0,0 @@ -== CI Images - -These images are used by CI to run the actual builds. - -To build the image locally run the following from this directory: - ----- -$ docker build --no-cache -f /Dockerfile . ----- - -For example - ----- -$ docker build --no-cache -f ci-image/Dockerfile . ----- - -To test run: - ----- -$ docker run -it --entrypoint /bin/bash ----- diff --git a/ci/images/setup.sh b/ci/images/setup.sh deleted file mode 100755 index f786b2ca58..0000000000 --- a/ci/images/setup.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -set -ex - -########################################################### -# UTILS -########################################################### - -export DEBIAN_FRONTEND=noninteractive -apt-get update -apt-get install --no-install-recommends -y tzdata ca-certificates curl git -ln -fs /usr/share/zoneinfo/UTC /etc/localtime -dpkg-reconfigure --frontend noninteractive tzdata - -curl https://raw.githubusercontent.com/spring-io/concourse-java-scripts/v0.0.2/concourse-java.sh > /opt/concourse-java.sh - - -########################################################### -# JAVA -########################################################### - -mkdir -p /opt/openjdk -cd /opt/openjdk -curl -L https://github.com/bell-sw/Liberica/releases/download/17.0.10%2B13/bellsoft-jdk17.0.10+13-linux-amd64.tar.gz | tar zx --strip-components=1 -test -f /opt/openjdk/bin/java -test -f /opt/openjdk/bin/javac diff --git a/ci/images/start-site-ci-image/Dockerfile b/ci/images/start-site-ci-image/Dockerfile deleted file mode 100644 index d067ea2b9a..0000000000 --- a/ci/images/start-site-ci-image/Dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM ubuntu:jammy-20240111 - -ADD setup.sh /setup.sh -RUN ./setup.sh - -ENV JAVA_HOME /opt/openjdk -ENV PATH $JAVA_HOME/bin:$PATH - -RUN apt-get update && \ - apt-get install -y wget && \ - wget https://github.com/k14s/ytt/releases/download/v0.27.2/ytt-linux-amd64 && \ - mv ytt-linux-amd64 /usr/local/bin/ytt && \ - chmod +x /usr/local/bin/ytt - -RUN apt-get update && \ - apt-get install -y apt-transport-https gnupg2 && \ - curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \ - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list.d/kubernetes.list && \ - apt-get update && \ - apt-get install -y kubectl=1.25.10-00 - diff --git a/ci/parameters.yml b/ci/parameters.yml deleted file mode 100644 index a59414cf6d..0000000000 --- a/ci/parameters.yml +++ /dev/null @@ -1,22 +0,0 @@ -github-repo: "https://github.com/spring-io/start.spring.io.git" -github-repo-name: "spring-io/start.spring.io" -branch: main -artifactory-server: "https://repo.spring.io" -artifactory-repo: "initializr-ci-local" -docker-hub-organization: "springci" -build-name: "start-site" -pipeline-name: "start-site" -concourse-url: "https://ci.spring.io" -task-timeout: 1h00m -shipyard-kubeconfig: | - apiVersion: v1 - kind: Config - current-context: my-cluster - contexts: [{name: my-cluster, context: {cluster: cluster-1, user: user-1}}] - users: [{name: user-1, user: {auth-provider: {name: gcp}}}] - clusters: - - name: cluster-1 - cluster: - server: "https://34.71.146.206" - certificate-authority-data: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLekNDQWhPZ0F3SUJBZ0lSQU8vWktkbC92aS93OHoyMFIrSFM0OWN3RFFZSktvWklodmNOQVFFTEJRQXcKTHpFdE1Dc0dBMVVFQXhNa05UTmpPVGhsWlRFdE16WXhPUzAwWXpJMUxUbGhNRGd0TXpVM01qRmtOR00xTWpJdwpNQjRYRFRJd01Ea3dNakUwTkRjek9Wb1hEVEkxTURrd01URTFORGN6T1Zvd0x6RXRNQ3NHQTFVRUF4TWtOVE5qCk9UaGxaVEV0TXpZeE9TMDBZekkxTFRsaE1EZ3RNelUzTWpGa05HTTFNakl3TUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBOHQyVHFvYllJMlhTRjhvZGQ3dElhUzlXT2lPRVJmWE9wQU9oZ3hyWApabWc1Vk04amZiUTZ0YWxKVFZTZ3ZDOHExcjZ0MzlQSGJld3BvTVFBUzB0OFRkeHdONFVxWFJ4b0dURVRDRkJZCk9oZUdEelAySHlnS0hZTG4rdDFRTHUyMm5EY2V0Zk8vKzBGK2VIZ0RaaXoyMFFKUm0yeUkvZURtZHJDRkRaOGEKTFlsMmJINHZnRkdxQ0c3V2pvUlpXbEdaMUpUQXEvRG5nbVJFaGlIdmJhM1VLWktHem5JL0dtN1ZzdXlyKzh2Rwpwa0JIYTFCWDFyZHV4ZnFFYlRLclFSbnAxazQ2Y2VqdWN4ZktMd04zclE1cjNGT2dRd1UyTG96RmYvNHdEdGtBCm5ENGJkT0VyR2l3UDNSZXJoMG1kOFNBblpLWXFsWTV3dXNKdEduLzdYeWQwR3dJREFRQUJvMEl3UURBT0JnTlYKSFE4QkFmOEVCQU1DQWdRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTdIa3IyOGdkbnQ1ZAozaGZVVFEvMlNWRm9zL0l3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQU1Wdjh4clBFMXZRa1ZrUVh0YUovNUV2CkZ0RFY0MzdBUzBUdWhIdnM3UllpMlBrTTM3OFhyYkxleXlpNHFlNi9zT0VGMDBHaFJzb204cU1JYld2Nlk2MmgKRFJpSjF4NnNucTFaQ0tHbHZDc1ZnRU5pamNiYWYwZjMrRzd1OTNPSldEdWl4Nlhmb3RpaFM0dS9VNWJMK3pwWQpnN2RSYXM0SnZvcC9FZWdNZG9kZWcyckczOHhlOHVjRGZaNFZNM3RORURPSVZZalQxblNsSmlRZFVON0dYS0hXCkczL0doQ1ZQbU9xU1N6YzRQNFVJTm91aHJMZU1ncXBnSVp0d2hleFFHZGFyVnBlSmUvMjRxemhTSlFSRENjdjkKeEVWVUZTSDU4eU8zY3FlanVtU09ScHRkajZicHNxaWhTT3lUM20rcXVsZ1REZUkxakRsNnZRL0RGMzhvaGFzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==" -google-tagmanager-id: "GTM-KZM7GF6" \ No newline at end of file diff --git a/ci/pipeline.yml b/ci/pipeline.yml deleted file mode 100644 index 85c5c097ac..0000000000 --- a/ci/pipeline.yml +++ /dev/null @@ -1,274 +0,0 @@ -anchors: - docker-resource-source: &docker-resource-source - username: ((docker-hub-username)) - password: ((docker-hub-password)) - -resource_types: -- name: artifactory-resource - type: registry-image - source: - <<: *docker-resource-source - repository: springio/artifactory-resource - tag: 0.0.17 - -- name: github-status-resource - type: registry-image - source: - <<: *docker-resource-source - repository: dpb587/github-status-resource - tag: master - -- name: kpack-image - type: registry-image - source: - repository: gcr.io/cf-build-service-public/concourse-kpack-resource - tag: "1.0" - username: - password: - -- name: slack-notification - type: registry-image - source: - <<: *docker-resource-source - repository: cfcommunity/slack-notification-resource - tag: latest - - -resources: -- name: artifactory-repo - type: artifactory-resource - icon: package-variant - source: - uri: ((artifactory-server)) - username: ((artifactory-username)) - password: ((artifactory-password)) - build_name: ((build-name)) - -- name: build-source - type: git - icon: github-circle - source: - uri: ((github-repo)) - branch: ((branch)) - ignore_paths: - - ci/config/deployment.yml - -- name: build-status - type: github-status-resource - icon: check - source: - repository: spring-io/start.spring.io - access_token: ((github-ci-status-token)) - branch: ((branch)) - context: build - -- name: ci-images - type: git - icon: github-circle - source: - uri: ((github-repo)) - branch: ((branch)) - paths: - - ci/images/* - -- name: daily - type: time - icon: clock-outline - source: - interval: 24h - -- name: deploy-source - type: git - icon: github-circle - source: - uri: ((github-repo)) - branch: ((branch)) - paths: - - ci/config/deployment.yml - -- name: kpack - type: kpack-image - icon: docker - source: - image: initializr-k8s-image - namespace: spring-initializr - gke: - json_key: ((kpack-resource-account-key)) - kubeconfig: ((shipyard-kubeconfig)) - -- name: script-source - type: git - icon: github-circle - source: - uri: ((github-repo)) - username: ((github-username)) - password: ((github-ci-release-token)) - branch: ((branch)) - -- name: slack-alert - type: slack-notification - icon: slack - source: - url: ((slack-webhook-url)) - -- name: start-site-ci-image - type: docker-image - icon: docker - source: - repository: springci/start-site-ci-image - username: ((docker-hub-username)) - password: ((docker-hub-password)) - tag: ((branch)) - - -groups: -- name: site - jobs: - - build - - deploy - - update-deployment - - update-image - - verify -- name: ci-images - jobs: - - build-start-site-ci-image - - -jobs: -- name: build - plan: - - in_parallel: - - get: git-repo - resource: build-source - trigger: true - - get: start-site-ci-image - - put: build-status - params: - commit: git-repo - state: pending - - task: build - image: start-site-ci-image - file: git-repo/ci/tasks/build-service.yml - timeout: ((task-timeout)) - params: - GOOGLE_TAGMANAGER_ID: ((google-tagmanager-id)) - on_success: - put: build-status - params: - commit: git-repo - state: success - on_failure: - in_parallel: - - put: build-status - params: - commit: git-repo - state: failure - - put: slack-alert - params: - text: ":concourse-failed: " - silent: true - icon_emoji: ":concourse:" - username: concourse-ci - - put: artifactory-repo - params: - repo: ((artifactory-repo)) - folder: distribution-repository - build_uri: "https://ci.spring.io/teams/${BUILD_TEAM_NAME}/pipelines/${BUILD_PIPELINE_NAME}/jobs/${BUILD_JOB_NAME}/builds/${BUILD_NAME}" - build_number: "${BUILD_PIPELINE_NAME}-${BUILD_JOB_NAME}-${BUILD_NAME}" - disable_checksum_uploads: true - -- name: deploy - plan: - - in_parallel: - - get: deploy-git-repo - resource: deploy-source - trigger: true - - get: git-repo - resource: script-source - - get: start-site-ci-image - - task: deploy - image: start-site-ci-image - file: git-repo/ci/tasks/deploy.yml - params: - KEY: ((developer-account-key)) - ELASTIC_uri: ((elastic-uri)) - - put: slack-alert - params: - text: ":concourse-succeeded: " - silent: true - icon_emoji: ":concourse:" - username: concourse-ci - -- name: build-start-site-ci-image - plan: - - get: source - resource: ci-images - trigger: true - - put: start-site-ci-image - params: - build: source/ci/images - dockerfile: source/ci/images/start-site-ci-image/Dockerfile - -- name: update-deployment - plan: - - in_parallel: - - get: git-repo - resource: script-source - - get: kpack - trigger: true - - get: start-site-ci-image - - task: update-deployment - image: start-site-ci-image - file: git-repo/ci/tasks/update-deployment.yml - - put: git-repo - resource: script-source - params: - repository: updated-git-repo - -- name: update-image - plan: - - in_parallel: - - get: git-repo - resource: script-source - - get: artifactory-repo - trigger: true - - get: start-site-ci-image - - task: get-blob-url - image: start-site-ci-image - file: git-repo/ci/tasks/get-blob-url.yml - params: - <<: *docker-resource-source - ARTIFACTORY_SERVER: ((artifactory-server)) - ARTIFACTORY_REPO: ((artifactory-repo)) - - put: kpack - params: - blob_url_file: blob-url/url - -- name: verify - serial: true - public: true - plan: - - in_parallel: - - get: daily - trigger: true - - get: git-repo - resource: script-source - trigger: true - - get: start-site-ci-image - - task: verify-service.yml - image: start-site-ci-image - file: git-repo/ci/tasks/verify-service.yml - on_success: - put: slack-alert - params: - text: ":concourse-succeeded: " - silent: true - icon_emoji: ":concourse:" - username: concourse-ci - on_failure: - put: slack-alert - params: - text: ":concourse-failed: " - silent: true - icon_emoji: ":concourse:" - username: concourse-ci diff --git a/ci/scripts/build-service.sh b/ci/scripts/build-service.sh deleted file mode 100755 index aef181ef28..0000000000 --- a/ci/scripts/build-service.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -e - -source $(dirname $0)/common.sh - -repository=$(pwd)/distribution-repository -pushd git-repo -./mvnw clean deploy -U -DaltDeploymentRepository=distribution::default::file://${repository} -popd diff --git a/ci/scripts/common.sh b/ci/scripts/common.sh deleted file mode 100644 index d5811adbf5..0000000000 --- a/ci/scripts/common.sh +++ /dev/null @@ -1,4 +0,0 @@ -source /opt/concourse-java.sh - -setup_symlinks -cleanup_maven_repo "io.spring.start" diff --git a/ci/scripts/deploy.sh b/ci/scripts/deploy.sh deleted file mode 100755 index 2fb15c3d0a..0000000000 --- a/ci/scripts/deploy.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -set -e - -CONFIG_DIR=git-repo/ci/config -echo $KEY > key.json -export GOOGLE_APPLICATION_CREDENTIALS=key.json -export KUBECONFIG=${CONFIG_DIR}/kubeconfig.yml -export ENCODED_uri=$(echo -n $ELASTIC_uri | base64) -ytt -f ${CONFIG_DIR}/secret.yml -f ${CONFIG_DIR}/elastic.yml --data-values-env ENCODED | kubectl apply -f- -kubectl apply -f ${CONFIG_DIR}/deployment.yml diff --git a/ci/scripts/get-blob-url.sh b/ci/scripts/get-blob-url.sh deleted file mode 100755 index 883eabebb1..0000000000 --- a/ci/scripts/get-blob-url.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -e - -pushd git-repo -snapshotVersion=0.0.1-SNAPSHOT -popd -pushd artifactory-repo/io/spring/start/start-site/$snapshotVersion -path=$( find . -type f -iname "*-exec.jar" ) -name=${path#"./"} -popd -echo $name -echo "${ARTIFACTORY_SERVER}/${ARTIFACTORY_REPO}/io/spring/start/start-site/${snapshotVersion}/$name" > blob-url/url \ No newline at end of file diff --git a/ci/scripts/update-deployment.sh b/ci/scripts/update-deployment.sh deleted file mode 100755 index 996006668f..0000000000 --- a/ci/scripts/update-deployment.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -set -e - -IMAGE=$( cat kpack/image ) - -git clone git-repo updated-git-repo > /dev/null - -pushd updated-git-repo > /dev/null -CONFIG_DIR=ci/config -sed -i -e "s|image: .*|image: ${IMAGE}|" ${CONFIG_DIR}/deployment.yml - -git config user.name "Spring Builds" > /dev/null -git config user.email "spring-builds@users.noreply.github.com" > /dev/null -git add ${CONFIG_DIR}/deployment.yml > /dev/null -git commit -m"Update image digest in deployment.yml" > /dev/null - -popd > /dev/null \ No newline at end of file diff --git a/ci/scripts/verify-service.sh b/ci/scripts/verify-service.sh deleted file mode 100755 index f7a37bfb39..0000000000 --- a/ci/scripts/verify-service.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -set -e - -source $(dirname $0)/common.sh - -pushd git-repo > /dev/null -./mvnw -Pverification -U -f pom.xml clean verify -popd > /dev/null diff --git a/ci/tasks/build-service.yml b/ci/tasks/build-service.yml deleted file mode 100644 index b4d6949160..0000000000 --- a/ci/tasks/build-service.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -platform: linux -inputs: - - name: git-repo -outputs: - - name: distribution-repository -caches: - - path: maven -params: - GOOGLE_TAGMANAGER_ID: -run: - path: git-repo/ci/scripts/build-service.sh \ No newline at end of file diff --git a/ci/tasks/deploy.yml b/ci/tasks/deploy.yml deleted file mode 100644 index e6a743e0eb..0000000000 --- a/ci/tasks/deploy.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -platform: linux -inputs: - - name: git-repo -params: - KEY: - ELASTIC_uri: -run: - path: git-repo/ci/scripts/deploy.sh \ No newline at end of file diff --git a/ci/tasks/get-blob-url.yml b/ci/tasks/get-blob-url.yml deleted file mode 100644 index 5b73151f2f..0000000000 --- a/ci/tasks/get-blob-url.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -platform: linux -image_resource: - type: registry-image - source: - repository: springci/start-site-ci-image - tag: main - username: ((docker-hub-username)) - password: ((docker-hub-password)) -inputs: - - name: artifactory-repo - - name: git-repo -outputs: - - name: blob-url -params: - ARTIFACTORY_SERVER: - ARTIFACTORY_REPO: -run: - path: git-repo/ci/scripts/get-blob-url.sh \ No newline at end of file diff --git a/ci/tasks/update-deployment.yml b/ci/tasks/update-deployment.yml deleted file mode 100644 index e5944eb662..0000000000 --- a/ci/tasks/update-deployment.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -platform: linux -inputs: - - name: git-repo - - name: kpack -outputs: - - name: updated-git-repo -run: - path: git-repo/ci/scripts/update-deployment.sh \ No newline at end of file diff --git a/ci/tasks/verify-service.yml b/ci/tasks/verify-service.yml deleted file mode 100644 index 19ae598549..0000000000 --- a/ci/tasks/verify-service.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -platform: linux -inputs: -- name: git-repo -caches: -- path: maven -run: - path: git-repo/ci/scripts/verify-service.sh From 8f261db525399fa8780b5a4f5268bcb23381bb6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 28 Feb 2024 12:09:56 -0600 Subject: [PATCH 458/825] Fix typo See gh-1421 --- ...ava => PostgresqlProjectGenerationConfigurationTests.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/{postgresqlProjectGenerationConfigurationTests.java => PostgresqlProjectGenerationConfigurationTests.java} (93%) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/postgresqlProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfigurationTests.java similarity index 93% rename from start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/postgresqlProjectGenerationConfigurationTests.java rename to start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfigurationTests.java index 7eff334aac..5e4dd3807c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/postgresqlProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ * * @author Moritz Halbritter */ -class postgresqlProjectGenerationConfigurationTests extends AbstractExtensionTests { +class PostgresqlProjectGenerationConfigurationTests extends AbstractExtensionTests { @Test void doesNothingWithoutDockerCompose() { From 1c2c5db456061845eb7ecf46c5ccdaa01b4741f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 28 Feb 2024 10:17:58 -0600 Subject: [PATCH 459/825] Generate test application when Compose or testcontainers are selected for neo4j It covers data-neo4j and spring-ai-vectordb-neo4j. See gh-1419 --- .../SimpleDockerServiceResolver.java | 8 ++- .../Neo4jProjectGenerationConfiguration.java | 65 +++++++++++++++++++ .../dependency/neo4j/package-info.java | 20 ++++++ .../TestcontainersModuleRegistry.java | 2 +- .../main/resources/META-INF/spring.factories | 1 + ...4jProjectGenerationConfigurationTests.java | 48 ++++++++++++++ ...rsProjectGenerationConfigurationTests.java | 14 ++-- .../src/test/resources/compose/neo4j.yaml | 7 ++ 8 files changed, 156 insertions(+), 9 deletions(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/package-info.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/resources/compose/neo4j.yaml diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index bb5ec99a7c..8af4830589 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ * @author Stephane Nicoll * @author Moritz Halbritter * @author Chris Bono + * @author Eddú Meléndez */ public class SimpleDockerServiceResolver implements DockerServiceResolver { @@ -40,6 +41,7 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("mariaDb", mariaDb()); this.dockerServices.put("mongoDb", mongoDb()); this.dockerServices.put("mysql", mysql()); + this.dockerServices.put("neo4j", neo4j()); this.dockerServices.put("oracleFree", oracleFree()); this.dockerServices.put("oracleXe", oracleXe()); this.dockerServices.put("postgres", postgres()); @@ -91,6 +93,10 @@ private static DockerService mysql() { return DockerService.withImageAndTag("mysql").website("https://hub.docker.com/_/mysql").ports(3306).build(); } + private static DockerService neo4j() { + return DockerService.withImageAndTag("neo4j").website("https://hub.docker.com/_/neo4j").ports(7687).build(); + } + private static DockerService oracleFree() { return DockerService.withImageAndTag("gvenzl/oracle-free") .website("https://hub.docker.com/r/gvenzl/oracle-free") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfiguration.java new file mode 100644 index 0000000000..aeefff2bd5 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfiguration.java @@ -0,0 +1,65 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.neo4j; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configuration for generation of projects that depend on Neo4j. + * + * @author Eddú Meléndez + */ +@Configuration(proxyBeanMethods = false) +public class Neo4jProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.Neo4jContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer neo4jServiceConnectionsCustomizer(Build build, DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (isNeo4jEnabled(build)) { + serviceResolver.doWith("neo4j", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("neo4j", service, TESTCONTAINERS_CLASS_NAME))); + } + }; + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer neo4jComposeFileCustomizer(Build build, DockerServiceResolver serviceResolver) { + return (composeFile) -> { + if (isNeo4jEnabled(build)) { + serviceResolver.doWith("neo4j", (service) -> composeFile.services() + .add("neo4j", service.andThen((builder) -> builder.environment("NEO4J_AUTH", "neo4j/secret")))); + } + }; + } + + private boolean isNeo4jEnabled(Build build) { + return build.dependencies().has("data-neo4j") || build.dependencies().has("spring-ai-vectordb-neo4j"); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/package-info.java new file mode 100644 index 0000000000..65f1fa66e2 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on Neo4j. + */ +package io.spring.start.site.extension.dependency.neo4j; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 8e7b7edc9b..303334c844 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -60,7 +60,7 @@ static Iterable create(Version platformVersion) { .customizeHelpDocument(addReferenceLink("Elasticsearch Container", "elasticsearch/"))); builders.add(onDependencies("data-mongodb", "data-mongodb-reactive").customizeBuild(addModule("mongodb")) .customizeHelpDocument(addReferenceLink("MongoDB Module", "databases/mongodb/"))); - builders.add(onDependencies("data-neo4j").customizeBuild(addModule("neo4j")) + builders.add(onDependencies("data-neo4j", "spring-ai-vectordb-neo4j").customizeBuild(addModule("neo4j")) .customizeHelpDocument(addReferenceLink("Neo4j Module", "databases/neo4j/"))); builders.add(onDependencies("data-r2dbc").customizeBuild(addModule("r2dbc")) .customizeHelpDocument(addReferenceLink("R2DBC support", "databases/r2dbc/"))); diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 0a290ecb12..0dc90b938f 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -15,6 +15,7 @@ io.spring.start.site.extension.dependency.hilla.HillaProjectGenerationConfigurat io.spring.start.site.extension.dependency.mariadb.MariaDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mongodb.MongoDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mysql.MysqlProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.neo4j.Neo4jProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.observability.ObservabilityProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.oracle.OracleProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.picocli.PicocliProjectGenerationConfiguration,\ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..33b1bbb945 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.neo4j; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link Neo4jProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class Neo4jProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("web", "data-neo4j"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsNeo4jService() { + ProjectRequest request = createProjectRequest("docker-compose", "data-neo4j"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/neo4j.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 929ff8a9b7..8d713c72ac 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -74,13 +74,13 @@ static Stream supportedEntriesBuild() { Arguments.arguments("data-couchbase-reactive", "couchbase"), Arguments.arguments("data-elasticsearch", "elasticsearch"), Arguments.arguments("data-mongodb", "mongodb"), Arguments.arguments("data-mongodb-reactive", "mongodb"), - Arguments.arguments("data-neo4j", "neo4j"), Arguments.arguments("data-r2dbc", "r2dbc"), - Arguments.arguments("db2", "db2"), Arguments.arguments("kafka", "kafka"), - Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mariadb", "mariadb"), - Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), - Arguments.arguments("oracle", "oracle-xe"), Arguments.arguments("pulsar", "pulsar"), - Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), - Arguments.arguments("sqlserver", "mssqlserver")); + Arguments.arguments("data-neo4j", "neo4j"), Arguments.arguments("spring-ai-vectordb-neo4j", "neo4j"), + Arguments.arguments("data-r2dbc", "r2dbc"), Arguments.arguments("db2", "db2"), + Arguments.arguments("kafka", "kafka"), Arguments.arguments("kafka-streams", "kafka"), + Arguments.arguments("mariadb", "mariadb"), Arguments.arguments("mysql", "mysql"), + Arguments.arguments("postgresql", "postgresql"), Arguments.arguments("oracle", "oracle-xe"), + Arguments.arguments("pulsar", "pulsar"), Arguments.arguments("pulsar-reactive", "pulsar"), + Arguments.arguments("solace", "solace"), Arguments.arguments("sqlserver", "mssqlserver")); } @ParameterizedTest diff --git a/start-site/src/test/resources/compose/neo4j.yaml b/start-site/src/test/resources/compose/neo4j.yaml new file mode 100644 index 0000000000..a909ca1f0d --- /dev/null +++ b/start-site/src/test/resources/compose/neo4j.yaml @@ -0,0 +1,7 @@ +services: + neo4j: + image: 'neo4j:latest' + environment: + - 'NEO4J_AUTH=neo4j/secret' + ports: + - '7687' From d9266eec0214fbc5eeff37321ab3acecea6d8260 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 29 Feb 2024 11:21:12 +0100 Subject: [PATCH 460/825] Polish "Generate test application when Compose or testcontainers are selected for neo4j" See gh-1419 --- .../dependency/neo4j/Neo4jProjectGenerationConfiguration.java | 3 ++- start-site/src/test/resources/compose/neo4j.yaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfiguration.java index aeefff2bd5..78037d1c7d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfiguration.java @@ -53,7 +53,8 @@ ComposeFileCustomizer neo4jComposeFileCustomizer(Build build, DockerServiceResol return (composeFile) -> { if (isNeo4jEnabled(build)) { serviceResolver.doWith("neo4j", (service) -> composeFile.services() - .add("neo4j", service.andThen((builder) -> builder.environment("NEO4J_AUTH", "neo4j/secret")))); + .add("neo4j", + service.andThen((builder) -> builder.environment("NEO4J_AUTH", "neo4j/notverysecret")))); } }; } diff --git a/start-site/src/test/resources/compose/neo4j.yaml b/start-site/src/test/resources/compose/neo4j.yaml index a909ca1f0d..f295c847bf 100644 --- a/start-site/src/test/resources/compose/neo4j.yaml +++ b/start-site/src/test/resources/compose/neo4j.yaml @@ -2,6 +2,6 @@ services: neo4j: image: 'neo4j:latest' environment: - - 'NEO4J_AUTH=neo4j/secret' + - 'NEO4J_AUTH=neo4j/notverysecret' ports: - '7687' From 3d43100bece40669d34164e798d4282f650cb460 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 1 Mar 2024 08:37:08 +0100 Subject: [PATCH 461/825] Add ActiveMQ module when ActiveMQ/Artemis and Testcontainers are selected See gh-1415 --- .../SimpleDockerServiceResolver.java | 16 ++++++ ...ctiveMQProjectGenerationConfiguration.java | 25 +++++++- ...ArtemisProjectGenerationConfiguration.java | 56 ++++++++++++++++++ .../TestcontainersModuleRegistry.java | 8 +++ .../main/resources/META-INF/spring.factories | 1 + ...MQProjectGenerationConfigurationTests.java | 10 +++- ...isProjectGenerationConfigurationTests.java | 57 +++++++++++++++++++ ...rsProjectGenerationConfigurationTests.java | 15 +++++ .../resources/compose/activemq-classic.yaml | 5 ++ .../src/test/resources/compose/artemis.yaml | 5 ++ 10 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfiguration.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/resources/compose/activemq-classic.yaml create mode 100644 start-site/src/test/resources/compose/artemis.yaml diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index 8af4830589..1cf7b764b6 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -35,6 +35,8 @@ public class SimpleDockerServiceResolver implements DockerServiceResolver { public SimpleDockerServiceResolver() { this.dockerServices = new HashMap<>(); this.dockerServices.put("activeMQ", activeMQ()); + this.dockerServices.put("activeMQClassic", activeMQClassic()); + this.dockerServices.put("artemis", artemis()); this.dockerServices.put("cassandra", cassandra()); this.dockerServices.put("elasticsearch", elasticsearch()); this.dockerServices.put("kafka", kafka()); @@ -59,6 +61,20 @@ private static DockerService activeMQ() { .build(); } + private static DockerService activeMQClassic() { + return DockerService.withImageAndTag("apache/activemq-classic") + .website("https://hub.docker.com/r/apache/activemq-classic") + .ports(61616) + .build(); + } + + private static DockerService artemis() { + return DockerService.withImageAndTag("apache/activemq-artemis") + .website("https://hub.docker.com/r/apache/activemq-artemis") + .ports(61616) + .build(); + } + private static DockerService cassandra() { return DockerService.withImageAndTag("cassandra") .website("https://hub.docker.com/_/cassandra") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java index 211130656c..aa349cbbb3 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,8 +35,10 @@ @ConditionalOnRequestedDependency("activemq") public class ActiveMQProjectGenerationConfiguration { + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.activemq.ActiveMQContainer"; + @Bean - @ConditionalOnPlatformVersion("3.2.0-M1") + @ConditionalOnPlatformVersion("[3.2.0-M1,3.3.0-M2)") @ConditionalOnRequestedDependency("testcontainers") ServiceConnectionsCustomizer activeMQServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { return (serviceConnections) -> serviceResolver.doWith("activeMQ", (service) -> serviceConnections @@ -44,11 +46,28 @@ ServiceConnectionsCustomizer activeMQServiceConnectionsCustomizer(DockerServiceR } @Bean - @ConditionalOnPlatformVersion("3.2.0-M1") + @ConditionalOnPlatformVersion("3.3.0-M2") + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer activeMQClassicServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("activeMQClassic", + (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("activemq", service, TESTCONTAINERS_CLASS_NAME, false))); + } + + @Bean + @ConditionalOnPlatformVersion("[3.2.0-M1,3.3.0-M2)") @ConditionalOnRequestedDependency("docker-compose") ComposeFileCustomizer activeMQComposeFileCustomizer(DockerServiceResolver serviceResolver) { return (composeFile) -> serviceResolver.doWith("activeMQ", (service) -> composeFile.services().add("activemq", service)); } + @Bean + @ConditionalOnPlatformVersion("3.3.0-M2") + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer activeMQClassicComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("activeMQClassic", + (service) -> composeFile.services().add("activemq", service)); + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfiguration.java new file mode 100644 index 0000000000..d3e21c771d --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfiguration.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.activemq; + +import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on ActiveMQ Artemis. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("artemis") +public class ArtemisProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.activemq.ArtemisContainer"; + + @Bean + @ConditionalOnPlatformVersion("3.3.0-M2") + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer artemisServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("artemis", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("artemis", service, TESTCONTAINERS_CLASS_NAME, false))); + } + + @Bean + @ConditionalOnPlatformVersion("3.3.0-M2") + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer artemisComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("artemis", + (service) -> composeFile.services().add("artemis", service)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 303334c844..fc15fc822b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -42,8 +42,16 @@ abstract class TestcontainersModuleRegistry { private static final VersionRange SPRING_BOOT_3_2_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0"); + private static final VersionRange SPRING_BOOT_3_3_0_M2_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0-M2"); + static Iterable create(Version platformVersion) { List builders = new ArrayList<>(); + if (SPRING_BOOT_3_3_0_M2_OR_LATER.match(platformVersion)) { + builders.add(onDependencies("activemq").customizeBuild(addModule("activemq")) + .customizeHelpDocument(addReferenceLink("ActiveMQ Module", "activemq/"))); + builders.add(onDependencies("artemis").customizeBuild(addModule("activemq")) + .customizeHelpDocument(addReferenceLink("ActiveMQ Module", "activemq/"))); + } builders.add(onDependencies("amqp", "amqp-streams").customizeBuild(addModule("rabbitmq")) .customizeHelpDocument(addReferenceLink("RabbitMQ Module", "rabbitmq/"))); builders.add(onDependencies("cloud-gcp", "cloud-gcp-pubsub").customizeBuild(addModule("gcloud")) diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 0dc90b938f..ea3eda17f5 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -3,6 +3,7 @@ io.spring.start.site.extension.build.gradle.GradleProjectGenerationConfiguration io.spring.start.site.extension.build.maven.MavenProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.DependencyProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.activemq.ActiveMQProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.activemq.ArtemisProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.cassandra.CassandraProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.derby.DerbyProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.dgs.DgsCodegenProjectGenerationConfiguration,\ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java index c965a755cc..1ec6dc0a95 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ * Tests for {@link ActiveMQProjectGenerationConfiguration}. * * @author Stephane Nicoll + * @author Eddú Meléndez */ class ActiveMQProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -54,4 +55,11 @@ void dockerComposeCreatesAppropriateService() { assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/activemq.yaml")); } + @Test + void dockerComposeCreatesAppropriateServiceWithVersion33() { + ProjectRequest request = createProjectRequest("docker-compose", "activemq"); + request.setBootVersion("3.3.0-M2"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/activemq-classic.yaml")); + } + } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..2d31059658 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.activemq; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link ArtemisProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class ArtemisProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void dockerComposeWhenDockerComposeIsNotSelectedDoesNotCreateService() { + ProjectRequest request = createProjectRequest("web", "artemis"); + request.setBootVersion("3.3.0-M2"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void dockerComposeWhenIncompatibleSpringBootVersionDoesNotCreateService() { + ProjectRequest request = createProjectRequest("docker-compose", "artemis"); + request.setBootVersion("3.1.1"); + assertThat(composeFile(request)).doesNotContain("artemis"); + } + + @Test + void dockerComposeCreatesAppropriateService() { + ProjectRequest request = createProjectRequest("docker-compose", "artemis"); + request.setBootVersion("3.3.0-M2"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/artemis.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 8d713c72ac..815071fca4 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -65,6 +65,17 @@ void buildWithSpringBoot32AndOracleJdbcDriverUsesOracleFree() { .hasDependency(getDependency("testcontainers")); } + @ParameterizedTest + @MethodSource("supportedTestcontainersActiveMQEntriesBuild") + void buildWithSpringBoot33AndTestcontainersActiveMQModule(String springBootDependencyId, + String testcontainersArtifactId) { + assertThat(generateProject("3.3.0", "testcontainers", springBootDependencyId)).mavenBuild() + .doesNotHaveBom("org.testcontainers", "testcontainers-bom") + .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.3.0"))) + .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") + .hasDependency(getDependency("testcontainers")); + } + static Stream supportedEntriesBuild() { return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.of("amqp-streams", "rabbitmq"), Arguments.arguments("cloud-gcp", "gcloud"), Arguments.arguments("cloud-gcp-pubsub", "gcloud"), @@ -83,6 +94,10 @@ static Stream supportedEntriesBuild() { Arguments.arguments("solace", "solace"), Arguments.arguments("sqlserver", "mssqlserver")); } + static Stream supportedTestcontainersActiveMQEntriesBuild() { + return Stream.of(Arguments.arguments("activemq", "activemq"), Arguments.arguments("artemis", "activemq")); + } + @ParameterizedTest @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsPresentIsAdded(String dependencyId, String docHref) { diff --git a/start-site/src/test/resources/compose/activemq-classic.yaml b/start-site/src/test/resources/compose/activemq-classic.yaml new file mode 100644 index 0000000000..269d4e2a2c --- /dev/null +++ b/start-site/src/test/resources/compose/activemq-classic.yaml @@ -0,0 +1,5 @@ +services: + activemq: + image: 'apache/activemq-classic:latest' + ports: + - '61616' diff --git a/start-site/src/test/resources/compose/artemis.yaml b/start-site/src/test/resources/compose/artemis.yaml new file mode 100644 index 0000000000..1aa745eb00 --- /dev/null +++ b/start-site/src/test/resources/compose/artemis.yaml @@ -0,0 +1,5 @@ +services: + artemis: + image: 'apache/activemq-artemis:latest' + ports: + - '61616' From b020cbd2b15b1230ba27a022e56c04ac0ef7aab2 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Fri, 1 Mar 2024 07:37:51 +0000 Subject: [PATCH 462/825] Upgrade to Spring Shell 3.1.9 and 3.2.2 See gh-1423 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 33a3748036..f2a572c74c 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -144,9 +144,9 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 3.1.7 + version: 3.1.9 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 3.2.0 + version: 3.2.2 timefold-solver: groupId: ai.timefold.solver artifactId: timefold-solver-bom From 0bca83cfce246864902868be9f1e6a88e3dbd9dc Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 4 Mar 2024 08:55:17 +0100 Subject: [PATCH 463/825] Upgrade Spring Cloud Azure to 5.10.0 Closes gh-1424 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f2a572c74c..42e2ad66f2 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -105,7 +105,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 5.9.1 + version: 5.10.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From d4a74b3955ab8ad43833458ddaa8df530dd6d7fd Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 4 Mar 2024 11:32:58 +0200 Subject: [PATCH 464/825] Upgrade to Vaadin 24.3.6 See gh-1425 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 42e2ad66f2..d0e391b831 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -160,7 +160,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.5 + version: 24.3.6 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 492422249125094cc80b9cf2aadb89edc45fce65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 02:26:46 +0000 Subject: [PATCH 465/825] Bump azure/login from 1.6.1 to 2.0.0 Bumps [azure/login](https://github.com/azure/login) from 1.6.1 to 2.0.0. - [Release notes](https://github.com/azure/login/releases) - [Commits](https://github.com/azure/login/compare/cb79c773a3cfa27f31f25eb3f677781210c9ce3d...8c334a195cbb38e46038007b304988d888bf676a) --- updated-dependencies: - dependency-name: azure/login dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] See gh-1426 --- .github/workflows/build-and-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index f9336e04c0..43c18c9034 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -36,7 +36,7 @@ jobs: run: ./mvnw --batch-mode --update-snapshots verify - name: Set up Azure - uses: azure/login@cb79c773a3cfa27f31f25eb3f677781210c9ce3d + uses: azure/login@8c334a195cbb38e46038007b304988d888bf676a with: creds: ${{ secrets.AZURE_CREDENTIALS_SPRING_IO }} From d3e96c1b1bf3c89a59aa07f9c2939168830f66a5 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 11 Mar 2024 09:55:13 +0100 Subject: [PATCH 466/825] Add spring.application.name to application.properties Closes gh-1427 --- ...pertiesProjectGenerationConfiguration.java | 39 ++++++++++++++++ ...efaultApplicationPropertiesCustomizer.java | 46 +++++++++++++++++++ .../extension/properties/package-info.java | 20 ++++++++ .../main/resources/META-INF/spring.factories | 3 +- ...tApplicationPropertiesCustomizerTests.java | 46 +++++++++++++++++++ 5 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/properties/ApplicationPropertiesProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/properties/package-info.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/properties/ApplicationPropertiesProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/properties/ApplicationPropertiesProjectGenerationConfiguration.java new file mode 100644 index 0000000000..aa3a9c6ea8 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/properties/ApplicationPropertiesProjectGenerationConfiguration.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.properties; + +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; + +import org.springframework.context.annotation.Bean; + +/** + * {@link ProjectGenerationConfiguration} for customizations relevant to the application + * properties. + * + * @author Moritz Halbritter + */ +@ProjectGenerationConfiguration +class ApplicationPropertiesProjectGenerationConfiguration { + + @Bean + DefaultApplicationPropertiesCustomizer defaultApplicationPropertiesContributorCustomizer( + ProjectDescription projectDescription) { + return new DefaultApplicationPropertiesCustomizer(projectDescription); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizer.java new file mode 100644 index 0000000000..19bde0a708 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizer.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.properties; + +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.properties.ApplicationProperties; +import io.spring.initializr.generator.spring.properties.ApplicationPropertiesCustomizer; + +import org.springframework.util.StringUtils; + +/** + * {@link ApplicationPropertiesCustomizer} to add default application properties. + * + * @author Moritz Halbritter + */ +class DefaultApplicationPropertiesCustomizer implements ApplicationPropertiesCustomizer { + + private final ProjectDescription projectDescription; + + DefaultApplicationPropertiesCustomizer(ProjectDescription projectDescription) { + this.projectDescription = projectDescription; + } + + @Override + public void customize(ApplicationProperties properties) { + String name = this.projectDescription.getName(); + if (StringUtils.hasLength(name)) { + properties.add("spring.application.name", name); + } + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/properties/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/properties/package-info.java new file mode 100644 index 0000000000..14565bf735 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/properties/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for customization of the application properties. + */ +package io.spring.start.site.extension.properties; diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index ea3eda17f5..2d7dc6a490 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -1,6 +1,7 @@ io.spring.initializr.generator.project.ProjectGenerationConfiguration=\ io.spring.start.site.extension.build.gradle.GradleProjectGenerationConfiguration,\ io.spring.start.site.extension.build.maven.MavenProjectGenerationConfiguration,\ +io.spring.start.site.extension.code.kotlin.KotlinProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.DependencyProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.activemq.ActiveMQProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.activemq.ArtemisProjectGenerationConfiguration,\ @@ -38,4 +39,4 @@ io.spring.start.site.extension.dependency.testcontainers.TestcontainersProjectGe io.spring.start.site.extension.dependency.vaadin.VaadinProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.zipkin.ZipkinProjectGenerationConfiguration,\ io.spring.start.site.extension.description.DescriptionProjectGenerationConfiguration,\ -io.spring.start.site.extension.code.kotlin.KotlinProjectGenerationConfiguration +io.spring.start.site.extension.properties.ApplicationPropertiesProjectGenerationConfiguration diff --git a/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java new file mode 100644 index 0000000000..8dd78c6751 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.properties; + +import io.spring.initializr.generator.test.io.TextAssert; +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +/** + * Tests for {@link DefaultApplicationPropertiesCustomizer}. + * + * @author Moritz Halbritter + */ +class DefaultApplicationPropertiesCustomizerTests extends AbstractExtensionTests { + + @Test + void shouldAddSpringApplicationName() { + ProjectRequest request = createProjectRequest("web"); + request.setBootVersion("3.1.0"); + request.setJavaVersion("21"); + request.setName("test"); + assertApplicationProperties(request).lines().contains("spring.application.name=test"); + } + + private TextAssert assertApplicationProperties(ProjectRequest request) { + ProjectStructure project = generateProject(request); + return new TextAssert(project.getProjectDirectory().resolve("src/main/resources/application.properties")); + } + +} From 18473f0e4be50519dc0dee31b6a682ce0438bbff Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 12 Mar 2024 13:35:21 +0100 Subject: [PATCH 467/825] Improve Chat notifications --- .github/actions/send-notification/action.yml | 30 ++++++++++++++++++++ .github/workflows/build-and-deploy.yml | 10 +++---- 2 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 .github/actions/send-notification/action.yml diff --git a/.github/actions/send-notification/action.yml b/.github/actions/send-notification/action.yml new file mode 100644 index 0000000000..0d28e65613 --- /dev/null +++ b/.github/actions/send-notification/action.yml @@ -0,0 +1,30 @@ +name: Send notification +description: Sends a Google Chat message as a notification of the job's outcome +inputs: + webhook-url: + description: 'Google Chat Webhook URL' + required: true + status: + description: 'Status of the job' + required: true + run-name: + description: 'Name of the run to include in the notification' + default: ${{ format('{0} {1}', github.ref_name, github.job) }} +runs: + using: composite + steps: + - shell: bash + run: | + echo "RUN_URL=${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> "$GITHUB_ENV" + - shell: bash + if: ${{ inputs.status == 'success' }} + run: | + curl -X POST '${{ inputs.webhook-url }}' -H 'Content-Type: application/json' -d '{ text: "<${{ env.RUN_URL }}|${{ inputs.run-name }}> was successful"}' || true + - shell: bash + if: ${{ inputs.status == 'failure' }} + run: | + curl -X POST '${{ inputs.webhook-url }}' -H 'Content-Type: application/json' -d '{ text: " *<${{ env.RUN_URL }}|${{ inputs.run-name }}> failed* "}' || true + - shell: bash + if: ${{ inputs.status == 'cancelled' }} + run: | + curl -X POST '${{ inputs.webhook-url }}' -H 'Content-Type: application/json' -d '{ text: "<${{ env.RUN_URL }}|${{ inputs.run-name }}> was cancelled"}' || true diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 43c18c9034..fe33703e6d 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -51,10 +51,10 @@ jobs: --resource-group spring-io \ --artifact-path start-site/target/start-site-exec.jar - - name: Google Chat Notification - uses: Co-qn/google-chat-notification@3691ccf4763537d6e544bc6cdcccc1965799d056 + - name: Send notification + uses: ./.github/actions/send-notification + if: always() with: - name: Build and Deploy - url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }} + webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }} status: ${{ job.status }} - if: always() + run-name: ${{ format('start.spring.io | {0}', github.ref_name) }} From 5b208d130f22bedd0ee5a4e53225528f8980e3b1 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 12 Mar 2024 13:56:04 +0100 Subject: [PATCH 468/825] Use micrometer-registry-prometheus-simpleclient when using Boot 3.3 .0-SNAPSHOT Closes gh-1429 --- start-site/src/main/resources/application.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d0e391b831..4fd60c1aa6 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1009,14 +1009,20 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.newrelic - name: Prometheus id: prometheus - groupId: io.micrometer - artifactId: micrometer-registry-prometheus - scope: runtime - starter: false description: Expose Micrometer metrics in Prometheus format, an in-memory dimensional time series database with a simple built-in UI, a custom query language, and math operations. + scope: runtime links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.prometheus + mappings: + - compatibility-range: "[3.1.0,3.3.0-M3)" + groupId: io.micrometer + artifactId: micrometer-registry-prometheus + starter: false + - compatibility-range: "3.3.0-M3" + groupId: io.micrometer + artifactId: micrometer-registry-prometheus-simpleclient + starter: false - name: Distributed Tracing id: distributed-tracing description: Enable span and trace IDs in logs. From da632212883c4d3a42f89b5555edacf76847df8d Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 13 Mar 2024 08:31:15 +0100 Subject: [PATCH 469/825] Update notification for verification job --- .github/workflows/verification.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/verification.yml b/.github/workflows/verification.yml index 43c0e2ed4c..4f4f1c601c 100644 --- a/.github/workflows/verification.yml +++ b/.github/workflows/verification.yml @@ -32,10 +32,10 @@ jobs: START_SPRING_IO_TMPDIR: /tmp/start-spring-io-cache run: ./mvnw --batch-mode --update-snapshots --activate-profiles verification verify - - name: Google Chat Notification - uses: Co-qn/google-chat-notification@3691ccf4763537d6e544bc6cdcccc1965799d056 + - name: Send notification + uses: ./.github/actions/send-notification + if: always() with: - name: Verification - url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }} + webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }} status: ${{ job.status }} - if: always() + run-name: ${{ format('start.spring.io (Verification) | {0}', github.ref_name) }} From a809946aba3932d34c759f6bdfb6b59723f20b25 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 13 Mar 2024 08:32:03 +0100 Subject: [PATCH 470/825] Fix cache in verification job --- .github/workflows/verification.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/verification.yml b/.github/workflows/verification.yml index 4f4f1c601c..bd450497f9 100644 --- a/.github/workflows/verification.yml +++ b/.github/workflows/verification.yml @@ -24,8 +24,8 @@ jobs: with: path: /tmp/start-spring-io-cache # See https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache - key: test-repositories-${{ runner.os }}-${{ github.run_id }} - restore-keys: test-repositories-${{ runner.os }}- + key: test-repositories-ubuntu-latest-${{ github.run_id }} + restore-keys: test-repositories-ubuntu-latest - name: Build with Maven env: From a3968ef36333da2f7442e0ca164a888aadb58d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Tue, 12 Mar 2024 10:16:34 +0100 Subject: [PATCH 471/825] Update Timefold Solver to 1.8.0 See gh-1428 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4fd60c1aa6..20fc34fd90 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -153,7 +153,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 1.7.0 + version: 1.8.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From 0346e1eee91e000cb3a39da5ffbd11b0c2c2a48b Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 13 Mar 2024 14:22:20 +0200 Subject: [PATCH 472/825] Upgrade to Vaadin 24.3.7 See gh-1430 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 20fc34fd90..36b10acb1a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -160,7 +160,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.6 + version: 24.3.7 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From af71c92cd5c01706f514e04c334f6f3c70be5125 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 14 Mar 2024 10:35:06 +0100 Subject: [PATCH 473/825] Add Spring AI 0.8.1 starters Closes gh-1432 --- start-site/src/main/resources/application.yml | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 36b10acb1a..0debf34e66 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -84,7 +84,7 @@ initializr: versionProperty: spring-ai.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 0.8.0 + version: 0.8.1 repositories: spring-milestones spring-cloud: groupId: org.springframework.cloud @@ -1494,6 +1494,17 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/vectordbs/milvus.html + - name: Mistral AI + id: spring-ai-mistral + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-mistral-ai-spring-boot-starter + description: Spring AI support for Mistral AI, the open and portable generative AI for devs and businesses. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/clients/mistralai-chat.html - name: Neo4J Vector Database id: spring-ai-vectordb-neo4j compatibility-range: "[3.1.0,3.3.0-M1)" @@ -1593,17 +1604,39 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html - - name: Vertex AI - id: spring-ai-vertexai + - name: Vertex AI PaLM2 + id: spring-ai-vertexai-palm2 + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-vertex-ai-palm2-spring-boot-starter + description: Spring AI support for Google Vertex PaLM2 chat and embedding models. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-palm2-chat.html + - name: Vertex AI Gemini + id: spring-ai-vertexai-gemini + compatibility-range: "[3.1.0,3.3.0-M1)" + group-id: org.springframework.ai + artifact-id: spring-ai-vertex-ai-gemini-spring-boot-starter + description: Spring AI support for Google Vertex Gemini chat. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-gemini-chat.html + - name: Qdrant Vector Database + id: spring-ai-vectordb-qdrant compatibility-range: "[3.1.0,3.3.0-M1)" group-id: org.springframework.ai - artifact-id: spring-ai-vertex-ai-spring-boot-starter - description: Spring AI support for Google Vertex PaLM chat and embedding models. + artifact-id: spring-ai-qdrant-store-spring-boot-starter + description: Spring AI vector database support for Qdrant. It is an open-source, high-performance vector search engine/database. bom: spring-ai starter: true links: - rel: reference - href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-chat.html + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/qdrant.html - name: Weaviate Vector Database id: spring-ai-vectordb-weaviate compatibility-range: "[3.1.0,3.3.0-M1)" From 797949b841a4515475e699243b141d8ba33e2e10 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Wed, 13 Mar 2024 16:04:33 -0400 Subject: [PATCH 474/825] Update spring-cloud-gcp to 4.10.0 and 5.1.0 See gh-1431 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0debf34e66..e99e703496 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -113,9 +113,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 4.9.4 + version: 4.10.0 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 5.0.4 + version: 5.1.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 1850560b72884da1334701cff755fb520247d8f0 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 21:06:59 +0100 Subject: [PATCH 475/825] Update to Camel 4.4.1 https://camel.apache.org/releases/release-4.4.1/ See gh-1433 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e99e703496..cdc6014d73 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -827,7 +827,7 @@ initializr: - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 4.2.0 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 4.4.0 + version: 4.4.1 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From 789c712e0019082250c315c1452665cdc24770ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abishek=20=E2=98=80=EF=B8=8F?= Date: Tue, 19 Mar 2024 13:00:27 -0700 Subject: [PATCH 476/825] Upgrade to latest Spring Modulith releases See gh-1436 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index cdc6014d73..b6b2974388 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -134,9 +134,9 @@ initializr: - compatibility-range: "[3.1.0,3.2.0-M1)" version: 1.0.5 - compatibility-range: "[3.2.0-M1,3.3.0-M1)" - version: 1.1.2 + version: 1.1.3 - compatibility-range: "3.3.0-M1" - version: 1.2.0-M1 + version: 1.2.0-M2 repositories: spring-milestones spring-shell: groupId: org.springframework.shell From 2cfd36e30fe4f80ecb81d3b0485283819711e7ec Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 20 Mar 2024 14:05:46 +0100 Subject: [PATCH 477/825] Automatically add flyway-database-* dependencies Closes gh-1434 --- .../flyway/FlywayBuildCustomizer.java | 25 +++++++++++- .../flyway/FlywayBuildCustomizerTests.java | 38 ++++++++++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java index a5424c147a..6bb60c8a34 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,15 +29,21 @@ * * @author Eddú Meléndez * @author Stephane Nicoll + * @author Moritz Halbritter */ class FlywayBuildCustomizer implements BuildCustomizer { private static final VersionRange SPRING_BOOT_3_2_M1_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0-M1"); + private static final VersionRange SPRING_BOOT_3_3_M3_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0-M3"); + private final boolean isSpringBoot32OrLater; + private final boolean isSpringBoot33OrLater; + FlywayBuildCustomizer(ProjectDescription projectDescription) { this.isSpringBoot32OrLater = SPRING_BOOT_3_2_M1_OR_LATER.match(projectDescription.getPlatformVersion()); + this.isSpringBoot33OrLater = SPRING_BOOT_3_3_M3_OR_LATER.match(projectDescription.getPlatformVersion()); } @Override @@ -54,6 +60,23 @@ public void customize(Build build) { dependencies.add("flyway-oracle", "org.flywaydb", "flyway-database-oracle", DependencyScope.COMPILE); } } + if (this.isSpringBoot33OrLater) { + if (dependencies.has("db2")) { + dependencies.add("flyway-database-db2", "org.flywaydb", "flyway-database-db2", DependencyScope.COMPILE); + } + if (dependencies.has("derby")) { + dependencies.add("flyway-database-derby", "org.flywaydb", "flyway-database-derby", + DependencyScope.COMPILE); + } + if (dependencies.has("hsql")) { + dependencies.add("flyway-database-hsqldb", "org.flywaydb", "flyway-database-hsqldb", + DependencyScope.COMPILE); + } + if (dependencies.has("postgresql")) { + dependencies.add("flyway-database-postgresql", "org.flywaydb", "flyway-database-postgresql", + DependencyScope.COMPILE); + } + } } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java index 4cbab3d73c..3f1e6266c0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ * Tests for {@link FlywayBuildCustomizer}. * * @author Eddú Meléndez + * @author Moritz Halbritter */ class FlywayBuildCustomizerTests extends AbstractExtensionTests { @@ -92,6 +93,41 @@ void oracleAndFlyway() { .hasDependency("org.flywaydb", "flyway-database-oracle"); } + @Test + void db2AndFlywayOnSpringBoot32() { + ProjectRequest projectRequest = createProject("3.2.0", "db2", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("db2")) + .doesNotHaveDependency("org.flywaydb", "flyway-database-db2"); + } + + @Test + void db2AndFlyway() { + ProjectRequest projectRequest = createProject("3.3.0-SNAPSHOT", "db2", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("db2")) + .hasDependency("org.flywaydb", "flyway-database-db2"); + } + + @Test + void derbyAndFlyway() { + ProjectRequest projectRequest = createProject("3.3.0-SNAPSHOT", "derby", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("derby")) + .hasDependency("org.flywaydb", "flyway-database-derby"); + } + + @Test + void hsqlAndFlyway() { + ProjectRequest projectRequest = createProject("3.3.0-SNAPSHOT", "hsql", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("hsql")) + .hasDependency("org.flywaydb", "flyway-database-hsqldb"); + } + + @Test + void hsqlAndPostgres() { + ProjectRequest projectRequest = createProject("3.3.0-SNAPSHOT", "postgresql", "flyway"); + assertThat(mavenPom(projectRequest)).hasDependency(getDependency("postgresql")) + .hasDependency("org.flywaydb", "flyway-database-postgresql"); + } + private ProjectRequest createProject(String springBootVersion, String... styles) { ProjectRequest projectRequest = createProjectRequest(styles); projectRequest.setLanguage("java"); From 0af235631abd48fe83774825093fa7ce7d5e8360 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 20 Mar 2024 14:11:17 +0100 Subject: [PATCH 478/825] Remove superfluous condition --- .../flyway/FlywayProjectGenerationConfiguration.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java index 343f31f458..0b4a59d389 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,6 @@ FlywayProjectContributor flywayProjectContributor() { } @Bean - @ConditionalOnRequestedDependency("flyway") FlywayBuildCustomizer flywayBuildCustomizer(ProjectDescription projectDescription) { return new FlywayBuildCustomizer(projectDescription); } From 8040b0a6e0e3d9f7e44f379381e5722ca5af0fd0 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Thu, 21 Mar 2024 13:10:42 +0100 Subject: [PATCH 479/825] Update dependencies --- start-client/yarn.lock | 2470 +++++++++++++++++++++------------------- 1 file changed, 1317 insertions(+), 1153 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 0c3fd5995c..1e1a393bd8 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -8,12 +8,12 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@apideck/better-ajv-errors@^0.3.1": version "0.3.6" @@ -25,11 +25,11 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.23.9.tgz#06b3e76376ee53f14ac8ac422c884950c69e1b9e" - integrity sha512-vB1UXmGDNEhcf1jNAHKT9IlYk1R+hehVTLFlCLHBi8gfuHQGP6uRjgXVYU0EVlI/qwAWpstqkBdf2aez3/z/5Q== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.1.tgz#2e11e071e32fe82850b4fe514f56b9c9e1c44911" + integrity sha512-HbmrtxyFUr34LwAlV9jS+sSIjUp4FpdtIMGwgufY3AsxrIfsh/HxlMTywsONAZsU0RMYbZtbZFpUCrSGs7o0EA== dependencies: - "@jridgewell/trace-mapping" "^0.3.17" + "@jridgewell/trace-mapping" "^0.3.25" commander "^4.0.1" convert-source-map "^2.0.0" fs-readdir-recursive "^1.1.0" @@ -40,34 +40,34 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" + integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" + integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.1" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/helpers" "^7.24.1" + "@babel/parser" "^7.24.1" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -75,22 +75,22 @@ semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.23.10" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz#2d4164842d6db798873b40e0c4238827084667a2" - integrity sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz#e27eee93ed1d271637165ef3a86e2b9332395c32" + integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.23.6", "@babel/generator@^7.7.2": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" - integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== +"@babel/generator@^7.24.1", "@babel/generator@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" + integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.22.5": @@ -107,7 +107,7 @@ dependencies: "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== @@ -118,17 +118,17 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.9": - version "7.23.10" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz#25d55fafbaea31fd0e723820bb6cc3df72edf7ea" - integrity sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz#db58bf57137b623b916e24874ab7188d93d7f68f" + integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" @@ -142,10 +142,10 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b" - integrity sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q== +"@babel/helper-define-polyfill-provider@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd" + integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -173,19 +173,19 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": +"@babel/helper-member-expression-to-functions@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: "@babel/types" "^7.23.0" -"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.24.0" "@babel/helper-module-transforms@^7.23.3": version "7.23.3" @@ -205,10 +205,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" @@ -219,13 +219,13 @@ "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-wrap-function" "^7.22.20" -"@babel/helper-replace-supers@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" - integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== +"@babel/helper-replace-supers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" + integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.22.5": @@ -250,16 +250,16 @@ "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": +"@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== @@ -273,52 +273,53 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" - integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== +"@babel/helpers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" + integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== dependencies: - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== dependencies: "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.7.0": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" - integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.7.0": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" + integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" - integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" + integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" - integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" + integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.23.3" + "@babel/plugin-transform-optional-chaining" "^7.24.1" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b" - integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" + integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-proposal-class-properties@^7.13.0": version "7.18.6" @@ -329,29 +330,29 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.13.15": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.9.tgz#126d947d62ee72022ec46813983c6dd861456fa3" - integrity sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz#bab2b9e174a2680f0a80f341f3ec70f809f8bb4b" + integrity sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.23.9" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-decorators" "^7.23.3" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-decorators" "^7.24.1" "@babel/plugin-proposal-do-expressions@^7.12.13": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.23.3.tgz#f80a81b171402facedd4e57f946c2d0f47d2ef0f" - integrity sha512-j0vN+mg0UvdtkH+rPK9jrCS8qsJ5EXjAyVa6TfHzqertV4INpNykn9hatI/2xpJ6FzQlX5dM9gprslbSEDjPWQ== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.24.1.tgz#580e97ffb93d537933df3b8d2e6bef67d0beaa0e" + integrity sha512-tVYbJAE3Duz/T0lV5P27aAgpg2vTfUuV0dXN4NNbnoRk7G989IcgjYIA+1pMHUMMLij7Gun42CC15UN5jWm4LA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-do-expressions" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-do-expressions" "^7.24.1" "@babel/plugin-proposal-export-default-from@^7.12.13": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.23.3.tgz#6f511a676c540ccc8d17a8553dbba9230b0ddac0" - integrity sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz#d242019488277c9a5a8035e5b70de54402644b89" + integrity sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-default-from" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-export-default-from" "^7.24.1" "@babel/plugin-proposal-export-namespace-from@^7.12.13": version "7.18.9" @@ -362,21 +363,21 @@ "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-function-bind@^7.12.13": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.23.3.tgz#f3275bd7ec6b0132332244e835e48a3d24ec8f84" - integrity sha512-LlDuU9NIXn1JJugzvqWeEY4m/K/vJpIp93L2fA9tHqDVsIxezsit/sHrqJWbswWkzSIrKuuI8nF65Ewtka3k2g== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.24.1.tgz#e3e265ec2f1324dbe29b249c35fab58b5c15a684" + integrity sha512-GDz3lXY623E+SMhloR0HDKYfFjLnqYEHjxIHo3SvpJTV3SV89974Y3mADXSYnO1N+UP7bioAFKqpOmsD9aOnuw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-function-bind" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-function-bind" "^7.24.1" "@babel/plugin-proposal-function-sent@^7.12.13": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.23.3.tgz#6b81145902030945edfd94aa263a9601b862f06f" - integrity sha512-dSbjzbWBPvVumoT6gokV3kYBNz+KFgQMMpd2JeN6BhO34LH3AicqdOc5r4qIeakSqNFZXqMVdRNI7J7xMwqpXA== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.24.1.tgz#228c85798b62fc1c1a84c8ab512d46c41885f4bd" + integrity sha512-GxHpB7jATDZWYEuYkR5jv5aiHbwkmbvk3fJP5G2Dvl7va+kewfbYxpnU1BadIHd3kXlLPQj4CKbLKoWxX4nTtA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-wrap-function" "^7.22.20" - "@babel/plugin-syntax-function-sent" "^7.23.3" + "@babel/plugin-syntax-function-sent" "^7.24.1" "@babel/plugin-proposal-json-strings@^7.13.8": version "7.18.6" @@ -420,12 +421,12 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-pipeline-operator@^7.12.13": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.23.3.tgz#98048c0c1700801f41a89455b79dc54727be1dac" - integrity sha512-8TDc1vEx+YRaGiF8J8w/XcADaBuqc0RnokaMRrHdX7Vx74WhmxPU8wtM/OHSXvgw45P9tlHS/l0YDpNXwLghmQ== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.24.1.tgz#a8ea2b281b68cdb676270298f32d46da61c22a6b" + integrity sha512-JFqo+VsSosYxzo1PPfrbeoIi0IcAJnjGpDXeVABNl5bH6/Zvn84Kd8utGEA1eT3gLsynyt1+TfQ/opGXtb0Y/A== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-pipeline-operator" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-pipeline-operator" "^7.24.1" "@babel/plugin-proposal-private-methods@^7.13.0": version "7.18.6" @@ -441,12 +442,12 @@ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-proposal-throw-expressions@^7.12.13": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.23.3.tgz#acb23c5ffc0cae31d5a52b26e678d1b9a69dbc5b" - integrity sha512-aAQebpCm3+qUMJ3ug9B5G26Z5VsaE955lGWrZMhAIPFhK/Cv7bL9GbWgdEXmel/jlHTRvwcYRnfzJS2prsPdVg== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.24.1.tgz#7f08e07de51463fd302860e7928cccdcb4fa1d48" + integrity sha512-wiae/VkKNX1WuM+wXIeAZY1cvbVKJJIf92eA23s2ufpp4w+vOlp+/4T3yfxN6nzN+hIwT15AsdwujAelIqNW+w== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-throw-expressions" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-throw-expressions" "^7.24.1" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -476,19 +477,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz#a1d351d6c25bfdcf2e16f99b039101bc0ffcb0ca" - integrity sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA== +"@babel/plugin-syntax-decorators@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa" + integrity sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-do-expressions@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.23.3.tgz#5be02150983fe3ce3af6a016583e1eb8200c99d4" - integrity sha512-GBmwXqthSDjlXzwF19qZjFBeHtigX9/0g670FSv8gKEjbD4k+BuRBPlpDQdr/+ts0UlimhJUd/oPilMFqyHq+w== +"@babel/plugin-syntax-do-expressions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.24.1.tgz#8e423c79355797e2dbdac26e03c248be27391795" + integrity sha512-l5ZJA2DB2s/pM3SQzwf1ykWOiBaqN6Eb07EoZ/mH8dUR5RnaWlmPLoav6y4OT8A9Pkl615osBMZOedFbErdOOA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -497,12 +498,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.23.3.tgz#7e6d4bf595d5724230200fb2b7401d4734b15335" - integrity sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw== +"@babel/plugin-syntax-export-default-from@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz#a92852e694910ae4295e6e51e87b83507ed5e6e8" + integrity sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -511,33 +512,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-function-bind@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.23.3.tgz#1bf08e34ac9e5473a57cbc28e569b738d7d3b092" - integrity sha512-BVBglNxpv45awQYCln57SX2EJge4YK0liwH1Clzk/Nnx/bdLmZRhP0vt1koJqDLAEG8MngIPbIMNNNOXPcnXYQ== +"@babel/plugin-syntax-function-bind@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.24.1.tgz#5a3ba1b9ab91286822373fb1dc34b468d8510ea2" + integrity sha512-7K+uzNJ5ZuL6g4Ud/UhbIxghwN2FAj8NBrzEO+eM0g9YddjOv+BD81ar/N7Es5sH+G8z9tnTYcfCu6EaPrkSDw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-function-sent@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.23.3.tgz#71571a17ad31d20bb64685c090b933db975206d3" - integrity sha512-wd4AHIGg0VtmX3kxFOYI5R5+vwy6+9xRnkBekTTkUCRBT9A1oZ7LnQN0GYLVl/3DThqTJGaumrvKRLqodjc1vw== +"@babel/plugin-syntax-function-sent@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.24.1.tgz#cd3fd5fa9fce0f53d6dcb78999dd7201561c2304" + integrity sha512-aVwkxqagsGCI8vtuyMI+LnZ2SWtGP4+v9T/T88j2MwKRsGYzc9FAaEzsNMu1Htu6SsHPcfwQ7uZ7pYPGrVmG+g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-import-assertions@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" - integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== +"@babel/plugin-syntax-import-assertions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" + integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-import-attributes@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" - integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== +"@babel/plugin-syntax-import-attributes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" + integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -554,11 +555,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" - integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -602,12 +603,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-pipeline-operator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.23.3.tgz#04fb797ccaac27622f491d0babced1b5793a5ba7" - integrity sha512-xypNE8ptJ5buVtgAAOZzN3gIV6McZfMA27GMhy70a8auQIxbLW9g/uKsaoWqUHdPJgpsXYjVD+5oDyS6pRvraA== +"@babel/plugin-syntax-pipeline-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.24.1.tgz#149bacade7594288dd9ad373bcbfe2927ea750cc" + integrity sha512-UU7uLj95zh6oMQiREvkTmXAvWy9pJI9p76SFkNsXTesDwQ67YM1UU1Bkx576djA6ZDcPSbzM/MqTJNcYeQ0G2g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" @@ -616,12 +617,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-throw-expressions@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.23.3.tgz#46077241577243b00ddd465f627242c492bf935c" - integrity sha512-P7zUpjwebv09kxTCG0Gp0TMa8luPG4t2Q5gylayLeRHHwfUR4jgjYgx/X9DYPF81/W5aYpYOzX2kQnChAFFp8Q== +"@babel/plugin-syntax-throw-expressions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.24.1.tgz#f8b18a0126cb2991e4f093c6fdab662ef46d7eee" + integrity sha512-o4dN/9/hUAC6RuX1QZDlauBG2nmSmUMk0K7/IOIFxjM8V16FS1JTHHiBWqGkkIjK4myeHucJbBHurqjtWFAdsw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" @@ -631,11 +632,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" - integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -645,212 +646,212 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" - integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== +"@babel/plugin-transform-arrow-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" + integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-async-generator-functions@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz#9adaeb66fc9634a586c5df139c6240d41ed801ce" - integrity sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ== +"@babel/plugin-transform-async-generator-functions@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" + integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== dependencies: "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" - integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== +"@babel/plugin-transform-async-to-generator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" + integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== dependencies: - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-imports" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-remap-async-to-generator" "^7.22.20" -"@babel/plugin-transform-block-scoped-functions@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" - integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== +"@babel/plugin-transform-block-scoped-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" + integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-block-scoping@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" - integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== +"@babel/plugin-transform-block-scoping@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz#27af183d7f6dad890531256c7a45019df768ac1f" + integrity sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-class-properties@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" - integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== +"@babel/plugin-transform-class-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" + integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-class-static-block@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" - integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== +"@babel/plugin-transform-class-static-block@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz#4e37efcca1d9f2fcb908d1bae8b56b4b6e9e1cb6" + integrity sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.23.8": - version "7.23.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" - integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg== +"@babel/plugin-transform-classes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" + integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" - integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== +"@babel/plugin-transform-computed-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" + integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/template" "^7.24.0" -"@babel/plugin-transform-destructuring@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" - integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== +"@babel/plugin-transform-destructuring@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" + integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-dotall-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" - integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== +"@babel/plugin-transform-dotall-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" + integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-duplicate-keys@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" - integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== +"@babel/plugin-transform-duplicate-keys@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" + integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-dynamic-import@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" - integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== +"@babel/plugin-transform-dynamic-import@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" + integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" - integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== +"@babel/plugin-transform-exponentiation-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" + integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-export-namespace-from@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" - integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== +"@babel/plugin-transform-export-namespace-from@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" + integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" - integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== +"@babel/plugin-transform-for-of@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" + integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-function-name@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" - integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== +"@babel/plugin-transform-function-name@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" + integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== dependencies: - "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-json-strings@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" - integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== +"@babel/plugin-transform-json-strings@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" + integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" - integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== +"@babel/plugin-transform-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" + integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-logical-assignment-operators@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" - integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== +"@babel/plugin-transform-logical-assignment-operators@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" + integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" - integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== +"@babel/plugin-transform-member-expression-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" + integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-amd@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" - integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== +"@babel/plugin-transform-modules-amd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" + integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== dependencies: "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-commonjs@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" - integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== +"@babel/plugin-transform-modules-commonjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" + integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== dependencies: "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz#105d3ed46e4a21d257f83a2f9e2ee4203ceda6be" - integrity sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw== +"@babel/plugin-transform-modules-systemjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" + integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== dependencies: "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-modules-umd@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" - integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== +"@babel/plugin-transform-modules-umd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" + integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== dependencies: "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": version "7.22.5" @@ -860,103 +861,102 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" - integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== +"@babel/plugin-transform-new-target@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" + integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-nullish-coalescing-operator@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" - integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" + integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" - integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== +"@babel/plugin-transform-numeric-separator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" + integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" - integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== +"@babel/plugin-transform-object-rest-spread@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff" + integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== dependencies: - "@babel/compat-data" "^7.23.3" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.23.3" + "@babel/plugin-transform-parameters" "^7.24.1" -"@babel/plugin-transform-object-super@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" - integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== +"@babel/plugin-transform-object-super@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" + integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" -"@babel/plugin-transform-optional-catch-binding@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" - integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== +"@babel/plugin-transform-optional-catch-binding@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" + integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" - integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== +"@babel/plugin-transform-optional-chaining@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" + integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" - integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== +"@babel/plugin-transform-parameters@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" + integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-private-methods@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" - integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== +"@babel/plugin-transform-private-methods@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" + integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-private-property-in-object@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" - integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== +"@babel/plugin-transform-private-property-in-object@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a" + integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" - integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== +"@babel/plugin-transform-property-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" + integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-react-display-name@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" - integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== +"@babel/plugin-transform-react-display-name@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" + integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-react-jsx-development@^7.22.5": version "7.22.5" @@ -965,7 +965,7 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": +"@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== @@ -976,128 +976,128 @@ "@babel/plugin-syntax-jsx" "^7.23.3" "@babel/types" "^7.23.4" -"@babel/plugin-transform-react-pure-annotations@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c" - integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ== +"@babel/plugin-transform-react-pure-annotations@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" + integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-regenerator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" - integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== +"@babel/plugin-transform-regenerator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" + integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" - integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== +"@babel/plugin-transform-reserved-words@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" + integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-runtime@^7.18.5": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz#2c64d0680fc8e09e1dfe8fd5c646fe72abd82004" - integrity sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ== - dependencies: - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.8" - babel-plugin-polyfill-corejs3 "^0.9.0" - babel-plugin-polyfill-regenerator "^0.5.5" + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f" + integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ== + dependencies: + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-plugin-utils" "^7.24.0" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.1" + babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" - integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== +"@babel/plugin-transform-shorthand-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" + integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-spread@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" - integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== +"@babel/plugin-transform-spread@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" + integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" - integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== +"@babel/plugin-transform-sticky-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" + integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-template-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" - integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== +"@babel/plugin-transform-template-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" + integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-typeof-symbol@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" - integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== +"@babel/plugin-transform-typeof-symbol@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" + integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-escapes@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" - integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== +"@babel/plugin-transform-unicode-escapes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" + integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-property-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" - integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== +"@babel/plugin-transform-unicode-property-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" + integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" - integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== +"@babel/plugin-transform-unicode-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" + integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-sets-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" - integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== +"@babel/plugin-transform-unicode-sets-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" + integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.9.tgz#beace3b7994560ed6bf78e4ae2073dff45387669" - integrity sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A== + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.3.tgz#f3f138c844ffeeac372597b29c51b5259e8323a3" + integrity sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA== dependencies: - "@babel/compat-data" "^7.23.5" + "@babel/compat-data" "^7.24.1" "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.23.3" - "@babel/plugin-syntax-import-attributes" "^7.23.3" + "@babel/plugin-syntax-import-assertions" "^7.24.1" + "@babel/plugin-syntax-import-attributes" "^7.24.1" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1109,58 +1109,58 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.23.3" - "@babel/plugin-transform-async-generator-functions" "^7.23.9" - "@babel/plugin-transform-async-to-generator" "^7.23.3" - "@babel/plugin-transform-block-scoped-functions" "^7.23.3" - "@babel/plugin-transform-block-scoping" "^7.23.4" - "@babel/plugin-transform-class-properties" "^7.23.3" - "@babel/plugin-transform-class-static-block" "^7.23.4" - "@babel/plugin-transform-classes" "^7.23.8" - "@babel/plugin-transform-computed-properties" "^7.23.3" - "@babel/plugin-transform-destructuring" "^7.23.3" - "@babel/plugin-transform-dotall-regex" "^7.23.3" - "@babel/plugin-transform-duplicate-keys" "^7.23.3" - "@babel/plugin-transform-dynamic-import" "^7.23.4" - "@babel/plugin-transform-exponentiation-operator" "^7.23.3" - "@babel/plugin-transform-export-namespace-from" "^7.23.4" - "@babel/plugin-transform-for-of" "^7.23.6" - "@babel/plugin-transform-function-name" "^7.23.3" - "@babel/plugin-transform-json-strings" "^7.23.4" - "@babel/plugin-transform-literals" "^7.23.3" - "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" - "@babel/plugin-transform-member-expression-literals" "^7.23.3" - "@babel/plugin-transform-modules-amd" "^7.23.3" - "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-modules-systemjs" "^7.23.9" - "@babel/plugin-transform-modules-umd" "^7.23.3" + "@babel/plugin-transform-arrow-functions" "^7.24.1" + "@babel/plugin-transform-async-generator-functions" "^7.24.3" + "@babel/plugin-transform-async-to-generator" "^7.24.1" + "@babel/plugin-transform-block-scoped-functions" "^7.24.1" + "@babel/plugin-transform-block-scoping" "^7.24.1" + "@babel/plugin-transform-class-properties" "^7.24.1" + "@babel/plugin-transform-class-static-block" "^7.24.1" + "@babel/plugin-transform-classes" "^7.24.1" + "@babel/plugin-transform-computed-properties" "^7.24.1" + "@babel/plugin-transform-destructuring" "^7.24.1" + "@babel/plugin-transform-dotall-regex" "^7.24.1" + "@babel/plugin-transform-duplicate-keys" "^7.24.1" + "@babel/plugin-transform-dynamic-import" "^7.24.1" + "@babel/plugin-transform-exponentiation-operator" "^7.24.1" + "@babel/plugin-transform-export-namespace-from" "^7.24.1" + "@babel/plugin-transform-for-of" "^7.24.1" + "@babel/plugin-transform-function-name" "^7.24.1" + "@babel/plugin-transform-json-strings" "^7.24.1" + "@babel/plugin-transform-literals" "^7.24.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" + "@babel/plugin-transform-member-expression-literals" "^7.24.1" + "@babel/plugin-transform-modules-amd" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-modules-systemjs" "^7.24.1" + "@babel/plugin-transform-modules-umd" "^7.24.1" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.23.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" - "@babel/plugin-transform-numeric-separator" "^7.23.4" - "@babel/plugin-transform-object-rest-spread" "^7.23.4" - "@babel/plugin-transform-object-super" "^7.23.3" - "@babel/plugin-transform-optional-catch-binding" "^7.23.4" - "@babel/plugin-transform-optional-chaining" "^7.23.4" - "@babel/plugin-transform-parameters" "^7.23.3" - "@babel/plugin-transform-private-methods" "^7.23.3" - "@babel/plugin-transform-private-property-in-object" "^7.23.4" - "@babel/plugin-transform-property-literals" "^7.23.3" - "@babel/plugin-transform-regenerator" "^7.23.3" - "@babel/plugin-transform-reserved-words" "^7.23.3" - "@babel/plugin-transform-shorthand-properties" "^7.23.3" - "@babel/plugin-transform-spread" "^7.23.3" - "@babel/plugin-transform-sticky-regex" "^7.23.3" - "@babel/plugin-transform-template-literals" "^7.23.3" - "@babel/plugin-transform-typeof-symbol" "^7.23.3" - "@babel/plugin-transform-unicode-escapes" "^7.23.3" - "@babel/plugin-transform-unicode-property-regex" "^7.23.3" - "@babel/plugin-transform-unicode-regex" "^7.23.3" - "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" + "@babel/plugin-transform-new-target" "^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" + "@babel/plugin-transform-numeric-separator" "^7.24.1" + "@babel/plugin-transform-object-rest-spread" "^7.24.1" + "@babel/plugin-transform-object-super" "^7.24.1" + "@babel/plugin-transform-optional-catch-binding" "^7.24.1" + "@babel/plugin-transform-optional-chaining" "^7.24.1" + "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-private-methods" "^7.24.1" + "@babel/plugin-transform-private-property-in-object" "^7.24.1" + "@babel/plugin-transform-property-literals" "^7.24.1" + "@babel/plugin-transform-regenerator" "^7.24.1" + "@babel/plugin-transform-reserved-words" "^7.24.1" + "@babel/plugin-transform-shorthand-properties" "^7.24.1" + "@babel/plugin-transform-spread" "^7.24.1" + "@babel/plugin-transform-sticky-regex" "^7.24.1" + "@babel/plugin-transform-template-literals" "^7.24.1" + "@babel/plugin-transform-typeof-symbol" "^7.24.1" + "@babel/plugin-transform-unicode-escapes" "^7.24.1" + "@babel/plugin-transform-unicode-property-regex" "^7.24.1" + "@babel/plugin-transform-unicode-regex" "^7.24.1" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.8" - babel-plugin-polyfill-corejs3 "^0.9.0" - babel-plugin-polyfill-regenerator "^0.5.5" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-regenerator "^0.6.1" core-js-compat "^3.31.0" semver "^6.3.1" @@ -1174,16 +1174,16 @@ esutils "^2.0.2" "@babel/preset-react@^7.13.13": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709" - integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" + integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-transform-react-display-name" "^7.23.3" - "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-transform-react-display-name" "^7.24.1" + "@babel/plugin-transform-react-jsx" "^7.23.4" "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.23.3" + "@babel/plugin-transform-react-pure-annotations" "^7.24.1" "@babel/regjsgen@^0.8.0": version "0.8.0" @@ -1191,41 +1191,41 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" - integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" + integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.23.9", "@babel/template@^7.3.3": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" - integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== +"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.23.9", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" - integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.24.1", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.1" + "@babel/types" "^7.24.0" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" - integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" @@ -1268,17 +1268,17 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.56.0": - version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" - integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.11.13": +"@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== @@ -1819,42 +1819,42 @@ "@babel/runtime" "^7.7.2" regenerator-runtime "^0.13.3" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.22" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" - integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1927,9 +1927,9 @@ rimraf "^3.0.2" "@polka/url@^1.0.0-next.24": - version "1.0.0-next.24" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.24.tgz#58601079e11784d20f82d0585865bb42305c4df3" - integrity sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ== + version "1.0.0-next.25" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" + integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== "@rollup/plugin-babel@^5.2.0": version "5.3.1" @@ -2086,9 +2086,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.56.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.2.tgz#1c72a9b794aa26a8b94ad26d5b9aa51c8a6384bb" - integrity sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw== + version "8.56.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.6.tgz#d5dc16cac025d313ee101108ba5714ea10eb3ed0" + integrity sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2104,9 +2104,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.42" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.42.tgz#2a276952acc73d1b8dc63fd4210647abbc553a71" - integrity sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ== + version "4.17.43" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" + integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2231,9 +2231,9 @@ "@types/node" "*" "@types/node@*": - version "20.11.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.13.tgz#188263ee2c8d590e181d3f5bfa7e485a932957cb" - integrity sha512-5G4zQwdiQBSWYTDAH1ctw2eidqdhMJaNsiIDKHFr55ihz5Trl2qqR8fdrT732yPBho5gkNxXm67OxWFBqX9aPg== + version "20.11.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" + integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== dependencies: undici-types "~5.26.4" @@ -2258,9 +2258,9 @@ integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== "@types/qs@*": - version "6.9.11" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" - integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== + version "6.9.14" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.14.tgz#169e142bfe493895287bee382af6039795e9b75b" + integrity sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA== "@types/range-parser@*": version "1.2.7" @@ -2280,9 +2280,9 @@ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/semver@^7.3.12": - version "7.5.6" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" - integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/send@*": version "0.17.4" @@ -2409,10 +2409,10 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" @@ -2427,10 +2427,10 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" @@ -2446,15 +2446,15 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/ieee754@1.11.6": version "1.11.6" @@ -2475,59 +2475,59 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-api-error" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.2.0": @@ -2780,13 +2780,13 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-flatten@1.1.1: version "1.1.1" @@ -2794,14 +2794,15 @@ array-flatten@1.1.1: integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-union@^1.0.2: @@ -2826,16 +2827,29 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + array.prototype.findlastindex@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" - integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: version "1.3.2" @@ -2847,7 +2861,7 @@ array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: +array.prototype.flatmap@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== @@ -2857,28 +2871,39 @@ array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.tosorted@^1.1.1: +array.prototype.toreversed@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" - integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" arrify@^1.0.1: @@ -2923,13 +2948,6 @@ async@^3.2.3: resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== -asynciterator.prototype@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" - integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== - dependencies: - has-symbols "^1.0.3" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2945,10 +2963,12 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" aws-sign2@~0.7.0: version "0.7.0" @@ -3039,29 +3059,29 @@ babel-plugin-lodash@^3.3.4: lodash "^4.17.10" require-package-name "^2.0.1" -babel-plugin-polyfill-corejs2@^0.4.8: - version "0.4.8" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" - integrity sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg== +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.10" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" + integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.5.0" + "@babel/helper-define-polyfill-provider" "^0.6.1" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz#9eea32349d94556c2ad3ab9b82ebb27d4bf04a81" - integrity sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg== +babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" + integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.5.0" - core-js-compat "^3.34.0" + "@babel/helper-define-polyfill-provider" "^0.6.1" + core-js-compat "^3.36.1" -babel-plugin-polyfill-regenerator@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a" - integrity sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg== +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" + integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== dependencies: - "@babel/helper-define-polyfill-provider" "^0.5.0" + "@babel/helper-define-polyfill-provider" "^0.6.1" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -3135,22 +3155,22 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bmp-js@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw== -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: bytes "3.1.2" - content-type "~1.0.4" + content-type "~1.0.5" debug "2.6.9" depd "2.0.0" destroy "1.2.0" @@ -3158,7 +3178,7 @@ body-parser@1.20.1: iconv-lite "0.4.24" on-finished "2.4.1" qs "6.11.0" - raw-body "2.5.1" + raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -3218,13 +3238,13 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.10, browserslist@^4.22.2: - version "4.22.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" - integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== +browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001580" - electron-to-chromium "^1.4.648" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" node-releases "^2.0.14" update-browserslist-db "^1.0.13" @@ -3307,14 +3327,16 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" call-me-maybe@^1.0.1: version "1.0.2" @@ -3372,10 +3394,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001580: - version "1.0.30001581" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz#0dfd4db9e94edbdca67d57348ebc070dece279f4" - integrity sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ== +caniuse-lite@^1.0.30001587: + version "1.0.30001599" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz#571cf4f3f1506df9bf41fcbb6d10d5d017817bce" + integrity sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA== caseless@~0.12.0: version "0.12.0" @@ -3415,9 +3437,9 @@ chardet@^0.7.0: integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== "chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -3671,7 +3693,7 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: +content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== @@ -3691,10 +3713,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== copy-descriptor@^0.1.0: version "0.1.1" @@ -3720,12 +3742,12 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.31.0, core-js-compat@^3.34.0: - version "3.35.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.1.tgz#215247d7edb9e830efa4218ff719beb2803555e2" - integrity sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw== +core-js-compat@^3.31.0, core-js-compat@^3.36.1: + version "3.36.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8" + integrity sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA== dependencies: - browserslist "^4.22.2" + browserslist "^4.23.0" core-util-is@1.0.2: version "1.0.2" @@ -3836,6 +3858,33 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + debounce@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" @@ -3909,14 +3958,14 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - get-intrinsic "^1.2.1" + es-define-property "^1.0.0" + es-errors "^1.3.0" gopd "^1.0.1" - has-property-descriptors "^1.0.0" define-lazy-prop@^2.0.0: version "2.0.0" @@ -4010,9 +4059,9 @@ diff@^4.0.1: integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== dir-glob@^2.2.2: version "2.2.2" @@ -4132,10 +4181,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.648: - version "1.4.651" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.651.tgz#ef1e822233c6fc953df3caf943f78c21b254a080" - integrity sha512-jjks7Xx+4I7dslwsbaFocSwqBbGHQmuXBJUK9QBZTIrzPq3pzn6Uf2szFSP728FtLYE3ldiccmlkOM/zhGKCpA== +electron-to-chromium@^1.4.668: + version "1.4.713" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.713.tgz#7cd8e4083c948f8d0cc686fcfdde97d97fd76556" + integrity sha512-vDarADhwntXiULEdmWd77g2dV6FrNGa8ecAC29MZ4TwPut2fvosD0/5sJd1qWNNe8HcJFAC+F5Lf9jW1NPtWmw== emittery@^0.10.2: version "0.10.2" @@ -4181,10 +4230,10 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.15.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== +enhanced-resolve@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4200,9 +4249,9 @@ env-paths@^2.2.0: integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: - version "7.11.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.0.tgz#c3793f44284a55ff8c82faf1ffd91bc6478ea01f" - integrity sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg== + version "7.11.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.1.tgz#2ffef77591057081b0129a8fd8cf6118da1b94e1" + integrity sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg== err-code@^2.0.2: version "2.0.3" @@ -4216,86 +4265,159 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1: - version "1.22.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" - integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.5" - es-set-tostringtag "^2.0.1" +es-abstract@^1.22.1, es-abstract@^1.22.3: + version "1.22.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.5.tgz#1417df4e97cc55f09bf7e58d1e614bc61cb8df46" + integrity sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" function.prototype.name "^1.1.6" - get-intrinsic "^1.2.2" - get-symbol-description "^1.0.0" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" globalthis "^1.0.3" gopd "^1.0.1" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - hasown "^2.0.0" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" + hasown "^2.0.1" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" - is-typed-array "^1.1.12" + is-typed-array "^1.1.13" is-weakref "^1.0.2" object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.0" + safe-regex-test "^1.0.3" string.prototype.trim "^1.2.8" string.prototype.trimend "^1.0.7" string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.5" unbox-primitive "^1.0.2" - which-typed-array "^1.1.13" + which-typed-array "^1.1.14" + +es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: + version "1.23.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0" + integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.5" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" -es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" - integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: - asynciterator.prototype "^1.0.0" - call-bind "^1.0.2" + get-intrinsic "^1.2.4" + +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: + version "1.0.18" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" + integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + dependencies: + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.1" - es-set-tostringtag "^2.0.1" - function-bind "^1.1.1" - get-intrinsic "^1.2.1" + es-abstract "^1.23.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" globalthis "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - internal-slot "^1.0.5" + internal-slot "^1.0.7" iterator.prototype "^1.1.2" - safe-array-concat "^1.0.1" + safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" - integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== + version "1.4.2" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.2.tgz#ba1a62255ff9b41023aaf9bd08c016a5f1a3fef3" + integrity sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw== -es-set-tostringtag@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" - integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: - get-intrinsic "^1.2.2" - has-tostringtag "^1.0.0" - hasown "^2.0.0" + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" -es-shim-unscopables@^1.0.0: +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== @@ -4312,9 +4434,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-html@~1.0.3: version "1.0.3" @@ -4370,9 +4492,9 @@ eslint-import-resolver-node@^0.3.9: resolve "^1.22.4" eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== dependencies: debug "^3.2.7" @@ -4441,26 +4563,28 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.23.2: - version "7.33.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" - integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" doctrine "^2.1.0" - es-iterator-helpers "^1.0.12" + es-iterator-helpers "^1.0.17" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" prop-types "^15.8.1" - resolve "^2.0.0-next.4" + resolve "^2.0.0-next.5" semver "^6.3.1" - string.prototype.matchall "^4.0.8" + string.prototype.matchall "^4.0.10" eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" @@ -4551,15 +4675,15 @@ eslint@^5.0.0: text-table "^0.2.0" eslint@^8.17.0: - version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" - integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.56.0" - "@humanwhocodes/config-array" "^0.11.13" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -4729,16 +4853,16 @@ expect@^28.1.3: jest-util "^28.1.3" express@^4.17.3: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + version "4.19.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.1.tgz#4700635795e911600a45596138cf5b0320e78256" + integrity sha512-K4w1/Bp7y8iSiVObmCrtq8Cs79XjJc/RU2YYkZQ7wpUu5ZyZ7MtPHkqoMz4pf+mgXfNvo2qft8D9OnrH2ABk9w== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.20.2" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" @@ -4867,9 +4991,9 @@ fastest-levenshtein@^1.0.12: integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.0.tgz#ca5e1a90b5e68f97fc8b61330d5819b82f5fab03" - integrity sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -5053,14 +5177,14 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== follow-redirects@^1.0.0: - version "1.15.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" - integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== for-each@^0.3.3: version "0.3.3" @@ -5142,7 +5266,7 @@ fsevents@^2.3.2, fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1, function-bind@^1.1.2: +function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== @@ -5218,11 +5342,12 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: + es-errors "^1.3.0" function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" @@ -5255,13 +5380,14 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" @@ -5419,7 +5545,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -5479,29 +5605,29 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.2.2" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" has-unicode@^2.0.1: version "2.0.1" @@ -5539,10 +5665,10 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" @@ -5579,9 +5705,9 @@ hpack.js@^2.1.6: wbuf "^1.1.0" html-entities@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" - integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== html-escaper@^2.0.0, html-escaper@^2.0.2: version "2.0.2" @@ -5756,9 +5882,9 @@ ignore@^4.0.3, ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.2.0, ignore@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" - integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== image-q@^4.0.0: version "4.0.0" @@ -5930,12 +6056,12 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -internal-slot@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" - integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.2" + es-errors "^1.3.0" hasown "^2.0.0" side-channel "^1.0.4" @@ -5949,10 +6075,13 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" ipaddr.js@1.9.1: version "1.9.1" @@ -5971,14 +6100,13 @@ is-accessor-descriptor@^1.0.1: dependencies: hasown "^2.0.0" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" @@ -6057,6 +6185,13 @@ is-data-descriptor@^1.0.1: dependencies: hasown "^2.0.0" +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -6167,20 +6302,20 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" @@ -6251,17 +6386,17 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-set@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-stream@^1.1.0: version "1.1.0" @@ -6287,22 +6422,22 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.14" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: version "1.0.2" @@ -6311,13 +6446,13 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" is-windows@^1.0.2: version "1.0.2" @@ -6398,9 +6533,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" - integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -6895,6 +7030,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -7824,9 +7964,9 @@ mute-stream@0.0.7: integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== nan@^2.13.2: - version "2.18.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" - integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== + version "2.19.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0" + integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw== nanoid@^3.3.7: version "3.3.7" @@ -8034,7 +8174,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.13.1, object-inspect@^1.9.0: +object-inspect@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== @@ -8051,7 +8191,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.2, object.assign@^4.1.4: +object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== @@ -8061,35 +8201,35 @@ object.assign@^4.1.2, object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5, object.entries@^1.1.6, object.entries@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" - integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== +object.entries@^1.1.5, object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.fromentries@^2.0.6, object.fromentries@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" object.groupby@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" - integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" -object.hasown@^1.1.2: +object.hasown@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== @@ -8105,13 +8245,13 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.6, object.values@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -8309,12 +8449,12 @@ parse-bmfont-binary@^1.0.5: integrity sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA== parse-bmfont-xml@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" - integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== + version "1.1.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz#016b655da7aebe6da38c906aca16bf0415773767" + integrity sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA== dependencies: xml-parse-from-string "^1.0.0" - xml2js "^0.4.5" + xml2js "^0.5.0" parse-headers@^2.0.0: version "2.0.5" @@ -8486,6 +8626,11 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" @@ -8515,9 +8660,9 @@ postcss-modules-values@^4.0.0: icss-utils "^5.0.0" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.15" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" - integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -8528,13 +8673,13 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.4.33: - version "8.4.33" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" - integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" - source-map-js "^1.0.2" + source-map-js "^1.2.0" prelude-ls@^1.2.1: version "1.2.1" @@ -8731,10 +8876,10 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" @@ -8925,14 +9070,15 @@ redent@^3.0.0: strip-indent "^3.0.0" reflect.getprototypeof@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" - integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" globalthis "^1.0.3" which-builtin-type "^1.1.3" @@ -8973,14 +9119,15 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" regexpp@^2.0.1: version "2.0.1" @@ -9143,7 +9290,7 @@ resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.2 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.4: +resolve@^2.0.0-next.5: version "2.0.0-next.5" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== @@ -9237,13 +9384,13 @@ sade@^1.7.3: dependencies: mri "^1.1.0" -safe-array-concat@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" - integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== +safe-array-concat@^1.1.0, safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: - call-bind "^1.0.5" - get-intrinsic "^1.2.2" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" has-symbols "^1.0.3" isarray "^2.0.5" @@ -9257,13 +9404,13 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.2.tgz#3ba32bdb3ea35f940ee87e5087c60ee786c3f6c5" - integrity sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.5" - get-intrinsic "^1.2.2" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" safe-regex@^1.1.0: @@ -9296,9 +9443,9 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.70.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.70.0.tgz#761197419d97b5358cb25f9dd38c176a8a270a75" - integrity sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ== + version "1.72.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.72.0.tgz#5b9978943fcfb32b25a6a5acb102fc9dabbbf41c" + integrity sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9376,9 +9523,9 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" @@ -9443,25 +9590,27 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" - integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property "^1.1.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.2" + get-intrinsic "^1.2.4" gopd "^1.0.1" - has-property-descriptors "^1.0.1" + has-property-descriptors "^1.0.2" -set-function-name@^2.0.0, set-function-name@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - define-data-property "^1.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" @@ -9524,14 +9673,15 @@ shell-quote@^1.8.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" @@ -9630,11 +9780,11 @@ socks-proxy-agent@^6.0.0: socks "^2.6.2" socks@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + version "2.8.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.1.tgz#22c7d9dd7882649043cba0eafb49ae144e3457af" + integrity sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ== dependencies: - ip "^2.0.0" + ip-address "^9.0.5" smart-buffer "^4.2.0" source-list-map@^2.0.0: @@ -9642,10 +9792,10 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map-resolve@^0.5.0: version "0.5.3" @@ -9720,9 +9870,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz#c07a4ede25b16e4f78e6707bbd84b15a45c19c1b" - integrity sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -9733,9 +9883,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.16" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" - integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + version "3.0.17" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" + integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== spdy-transport@^3.0.0: version "3.0.0" @@ -9772,6 +9922,11 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -9879,38 +10034,42 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: - version "4.0.10" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" - integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== +string.prototype.matchall@^4.0.10, string.prototype.matchall@^4.0.6: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.5" - regexp.prototype.flags "^1.5.0" - set-function-name "^2.0.0" - side-channel "^1.0.4" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== +string.prototype.trim@^1.2.8, string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== +string.prototype.trimend@^1.0.7, string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string.prototype.trimstart@^1.0.7: version "1.0.7" @@ -10130,9 +10289,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.27.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.27.0.tgz#70108689d9ab25fef61c4e93e808e9fd092bf20c" - integrity sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A== + version "5.29.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.29.2.tgz#c17d573ce1da1b30f21a877bffd5655dd86fdb35" + integrity sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10276,9 +10435,9 @@ trim-newlines@^3.0.0: integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== trough@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== "true-case-path@^1.0.2": version "1.0.3" @@ -10383,44 +10542,49 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-length@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.5.tgz#57d44da160296d8663fd63180a1802ebf25905d5" + integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typescript@^4.7.3: version "4.9.5" @@ -10705,10 +10869,10 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -10776,10 +10940,10 @@ webpack-cli@^4.10.0: rechoir "^0.7.0" webpack-merge "^5.7.3" -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== +webpack-dev-middleware@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== dependencies: colorette "^2.0.10" memfs "^3.4.3" @@ -10788,9 +10952,9 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.9.2: - version "4.15.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" - integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== + version "4.15.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" + integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -10820,7 +10984,7 @@ webpack-dev-server@^4.9.2: serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" + webpack-dev-middleware "^5.3.4" ws "^8.13.0" webpack-merge@^5.7.3: @@ -10855,25 +11019,25 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.90.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.90.0.tgz#313bfe16080d8b2fee6e29b6c986c0714ad4290e" - integrity sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w== + version "5.91.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" + integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" acorn-import-assertions "^1.9.0" browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" + enhanced-resolve "^5.16.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" @@ -10881,7 +11045,7 @@ webpack@^5.73.0: schema-utils "^3.2.0" tapable "^2.1.1" terser-webpack-plugin "^5.3.10" - watchpack "^2.4.0" + watchpack "^2.4.1" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: @@ -10945,30 +11109,30 @@ which-builtin-type@^1.1.3: which-typed-array "^1.1.9" which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: - version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" + has-tostringtag "^1.0.2" which@^1.2.9: version "1.3.1" @@ -11232,10 +11396,10 @@ xml-parse-from-string@^1.0.0: resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" integrity sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g== -xml2js@^0.4.5: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== +xml2js@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" + integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== dependencies: sax ">=0.6.0" xmlbuilder "~11.0.0" From 2dd54880591aa650230ff76ecbc99238d40daf70 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 20 Mar 2024 14:55:38 +0100 Subject: [PATCH 480/825] Add support for Java 22 Closes gh-1435 --- ...avaVersionProjectDescriptionCustomizer.java | 13 +++++++++++-- start-site/src/main/resources/application.yml | 2 ++ ...rsionProjectDescriptionCustomizerTests.java | 18 +++++++++++++----- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index 966114b4f2..872621b40d 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,11 +33,14 @@ * * @author Stephane Nicoll * @author Madhura Bhave + * @author Moritz Halbritter */ public class JavaVersionProjectDescriptionCustomizer implements ProjectDescriptionCustomizer { private static final VersionRange KOTLIN_1_9_20_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0-RC2"); + private static final VersionRange SPRING_BOOT_3_2_4_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.4"); + private static final List UNSUPPORTED_VERSIONS = Arrays.asList("1.6", "1.7", "1.8"); @Override @@ -61,6 +64,12 @@ public void customize(MutableProjectDescription description) { updateTo(description, "17"); } } + if (javaGeneration == 22) { + // Java 21 support as of Spring Boot 3.2.4 + if (!SPRING_BOOT_3_2_4_OR_LATER.match(platformVersion)) { + updateTo(description, "21"); + } + } } private void updateTo(MutableProjectDescription description, String jvmVersion) { @@ -71,7 +80,7 @@ private void updateTo(MutableProjectDescription description, String jvmVersion) private Integer determineJavaGeneration(String javaVersion) { try { int generation = Integer.parseInt(javaVersion); - return ((generation > 9 && generation <= 21) ? generation : null); + return ((generation > 9 && generation <= 22) ? generation : null); } catch (NumberFormatException ex) { return null; diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b6b2974388..d8e8b3f487 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1712,6 +1712,8 @@ initializr: id: war default: false javaVersions: + - id: 22 + default: false - id: 21 default: false - id: 17 diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index 12fdeb18af..d0cd5b19fa 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ * Tests for {@link JavaVersionProjectDescriptionCustomizer}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class JavaVersionProjectDescriptionCustomizerTests extends AbstractExtensionTests { @@ -65,6 +66,11 @@ void kotlinIsNotSupportedWithJava21AndSpringBoot31() { assertThat(mavenPom(kotlinProject("21", "3.1.6"))).hasProperty("java.version", "17"); } + @Test + void java22IsNotSupportedWithBoot323() { + assertThat(mavenPom(javaProject("22", "3.2.3"))).hasProperty("java.version", "21"); + } + static Stream supportedMavenParameters() { return Stream.concat(supportedJavaParameters(), Stream.concat(supportedKotlinParameters(), supportedGroovyParameters())); @@ -75,16 +81,18 @@ static Stream supportedGradleGroovyParameters() { } private static Stream supportedJavaParameters() { - return Stream.of(java("17", "3.1.0"), java("19", "3.1.0"), java("20", "3.1.0"), java("21", "3.1.0")); + return Stream.of(java("17", "3.1.0"), java("21", "3.1.0"), java("21", "3.2.0"), java("22", "3.2.4"), + java("21", "3.3.0-M2"), java("22", "3.3.0-M3")); } private static Stream supportedKotlinParameters() { - return Stream.of(kotlin("17", "3.1.0"), kotlin("19", "3.1.0"), kotlin("20", "3.1.0"), - kotlin("21", "3.2.0-RC2")); + return Stream.of(kotlin("17", "3.1.0"), kotlin("21", "3.2.0-RC2"), kotlin("22", "3.2.4"), + kotlin("21", "3.3.0-M2"), kotlin("22", "3.3.0-M3")); } private static Stream supportedGroovyParameters() { - return Stream.of(groovy("17", "3.1.0"), groovy("19", "3.1.0"), groovy("20", "3.1.0"), groovy("21", "3.1.0")); + return Stream.of(groovy("17", "3.1.0"), groovy("21", "3.1.0"), groovy("21", "3.2.0"), groovy("22", "3.2.4"), + groovy("21", "3.3.0-M2"), groovy("22", "3.3.0-M3")); } private static Arguments java(String javaVersion, String springBootVersion) { From 4d77a9b600f80e1d25f3d3d310547f31d1d771c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Ko=CC=88ninger?= Date: Fri, 22 Mar 2024 17:54:53 +0100 Subject: [PATCH 481/825] Upgrade to Spring Boot Admin 3.2.3 See gh-1438 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d8e8b3f487..40e3618040 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -47,7 +47,7 @@ initializr: versionProperty: spring-boot-admin.version mappings: - compatibilityRange: "[3.1.0,3.3.0-M1)" - version: 3.2.1 + version: 3.2.3 hilla: groupId: dev.hilla artifactId: hilla-bom From 6e075734996893ba071f354f975019f90bad330e Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Fri, 22 Mar 2024 13:27:08 +0000 Subject: [PATCH 482/825] Upgrade to Spring Shell 3.1.10 and 3.2.3 See gh-1437 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 40e3618040..c9e80d4dec 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -144,9 +144,9 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 3.1.9 + version: 3.1.10 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 3.2.2 + version: 3.2.3 timefold-solver: groupId: ai.timefold.solver artifactId: timefold-solver-bom From 852ffbdbdfe382b53bf68c536c843ca36843295d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 28 Feb 2024 12:05:13 -0600 Subject: [PATCH 483/825] Generate test application with pgvector and spring-ai if pgvector is selected See gh-1420 --- .../SimpleDockerServiceResolver.java | 8 ++ ...gVectorProjectGenerationConfiguration.java | 84 +++++++++++++++++++ .../TestcontainersModuleRegistry.java | 2 +- .../main/resources/META-INF/spring.factories | 1 + ...orProjectGenerationConfigurationTests.java | 48 +++++++++++ ...rsProjectGenerationConfigurationTests.java | 16 ++-- .../src/test/resources/compose/pgvector.yaml | 11 +++ 7 files changed, 162 insertions(+), 8 deletions(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/resources/compose/pgvector.yaml diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index 1cf7b764b6..268de1f56e 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -46,6 +46,7 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("neo4j", neo4j()); this.dockerServices.put("oracleFree", oracleFree()); this.dockerServices.put("oracleXe", oracleXe()); + this.dockerServices.put("pgvector", pgvector()); this.dockerServices.put("postgres", postgres()); this.dockerServices.put("pulsar", pulsar()); this.dockerServices.put("rabbit", rabbit()); @@ -127,6 +128,13 @@ private static DockerService oracleXe() { .build(); } + private static DockerService pgvector() { + return DockerService.withImageAndTag("pgvector/pgvector:pg16") + .website("https://hub.docker.com/r/pgvector/pgvector") + .ports(5432) + .build(); + } + private static DockerService postgres() { return DockerService.withImageAndTag("postgres") .website("https://hub.docker.com/_/postgres") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java new file mode 100644 index 0000000000..765c130f5b --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java @@ -0,0 +1,84 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.postgresql; + +import java.util.Map; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; +import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configuration for generation of projects that depend on PgVector. + * + * @author Eddú Meléndez + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnRequestedDependency("spring-ai-vectordb-pgvector") +class PgVectorProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.PostgreSQLContainer"; + + private static final VersionRange TESTCONTAINERS_1_19_7_OR_LATER = VersionParser.DEFAULT.parseRange("1.19.7"); + + private final MavenVersionResolver versionResolver; + + private final ProjectDescription description; + + PgVectorProjectGenerationConfiguration(MavenVersionResolver versionResolver, ProjectDescription description) { + this.versionResolver = versionResolver; + this.description = description; + } + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer pgvectorServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + Map resolve = this.versionResolver.resolveDependencies("org.springframework.boot", + "spring-boot-dependencies", this.description.getPlatformVersion().toString()); + String testcontainersVersion = resolve.get("org.testcontainers:testcontainers"); + + return (serviceConnections) -> { + if (TESTCONTAINERS_1_19_7_OR_LATER.match(Version.parse(testcontainersVersion))) { + serviceResolver.doWith("pgvector", (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("pgvector", service, TESTCONTAINERS_CLASS_NAME))); + } + }; + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer pgvectorComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("pgvector", + (service) -> composeFile.services() + .add("pgvector", + service.andThen((builder) -> builder.environment("POSTGRES_USER", "myuser") + .environment("POSTGRES_DB", "mydatabase") + .environment("POSTGRES_PASSWORD", "secret") + .label("org.springframework.boot.service-connection", "postgres")))); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index fc15fc822b..61ee1705d5 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -88,7 +88,7 @@ static Iterable create(Version platformVersion) { builders.add(onDependencies("oracle").customizeBuild(addModule("oracle-xe")) .customizeHelpDocument(addReferenceLink("Oracle-XE Module", "databases/oraclexe/"))); } - builders.add(onDependencies("postgresql").customizeBuild(addModule("postgresql")) + builders.add(onDependencies("postgresql", "spring-ai-vectordb-pgvector").customizeBuild(addModule("postgresql")) .customizeHelpDocument(addReferenceLink("Postgres Module", "databases/postgres/"))); builders.add(onDependencies("pulsar", "pulsar-reactive").customizeBuild(addModule("pulsar")) .customizeHelpDocument(addReferenceLink("Pulsar Module", "pulsar/"))); diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 2d7dc6a490..b02845bcb6 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -21,6 +21,7 @@ io.spring.start.site.extension.dependency.neo4j.Neo4jProjectGenerationConfigurat io.spring.start.site.extension.dependency.observability.ObservabilityProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.oracle.OracleProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.picocli.PicocliProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.postgresql.PgVectorProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.postgresql.PostgresqlProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.redis.RedisProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.solace.SolaceProjectGenerationConfiguration,\ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..24a596c62e --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.postgresql; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link PgVectorProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class PgVectorProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("web", "spring-ai-vectordb-pgvector"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsPostgresService() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-pgvector"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pgvector.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 815071fca4..42be1e3862 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -85,13 +85,15 @@ static Stream supportedEntriesBuild() { Arguments.arguments("data-couchbase-reactive", "couchbase"), Arguments.arguments("data-elasticsearch", "elasticsearch"), Arguments.arguments("data-mongodb", "mongodb"), Arguments.arguments("data-mongodb-reactive", "mongodb"), - Arguments.arguments("data-neo4j", "neo4j"), Arguments.arguments("spring-ai-vectordb-neo4j", "neo4j"), - Arguments.arguments("data-r2dbc", "r2dbc"), Arguments.arguments("db2", "db2"), - Arguments.arguments("kafka", "kafka"), Arguments.arguments("kafka-streams", "kafka"), - Arguments.arguments("mariadb", "mariadb"), Arguments.arguments("mysql", "mysql"), - Arguments.arguments("postgresql", "postgresql"), Arguments.arguments("oracle", "oracle-xe"), - Arguments.arguments("pulsar", "pulsar"), Arguments.arguments("pulsar-reactive", "pulsar"), - Arguments.arguments("solace", "solace"), Arguments.arguments("sqlserver", "mssqlserver")); + Arguments.arguments("data-neo4j", "neo4j"), Arguments.arguments("data-r2dbc", "r2dbc"), + Arguments.arguments("db2", "db2"), Arguments.arguments("kafka", "kafka"), + Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mariadb", "mariadb"), + Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), + Arguments.arguments("oracle", "oracle-xe"), Arguments.arguments("pulsar", "pulsar"), + Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), + Arguments.arguments("spring-ai-vectordb-neo4j", "neo4j"), + Arguments.arguments("spring-ai-vectordb-pgvector", "postgresql"), + Arguments.arguments("sqlserver", "mssqlserver")); } static Stream supportedTestcontainersActiveMQEntriesBuild() { diff --git a/start-site/src/test/resources/compose/pgvector.yaml b/start-site/src/test/resources/compose/pgvector.yaml new file mode 100644 index 0000000000..36565c03d6 --- /dev/null +++ b/start-site/src/test/resources/compose/pgvector.yaml @@ -0,0 +1,11 @@ +services: + pgvector: + image: 'pgvector/pgvector:pg16' + environment: + - 'POSTGRES_DB=mydatabase' + - 'POSTGRES_PASSWORD=secret' + - 'POSTGRES_USER=myuser' + labels: + - "org.springframework.boot.service-connection=postgres" + ports: + - '5432' From bd640c3e24a656b242e71f68ff3bd7518a48ef2a Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 25 Mar 2024 09:21:24 +0100 Subject: [PATCH 484/825] Polish "Generate test application with pgvector and spring-ai if pgvector is selected" See gh-1420 --- .../postgresql/PgVectorProjectGenerationConfiguration.java | 1 - 1 file changed, 1 deletion(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java index 765c130f5b..b99b269811 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java @@ -60,7 +60,6 @@ ServiceConnectionsCustomizer pgvectorServiceConnectionsCustomizer(DockerServiceR Map resolve = this.versionResolver.resolveDependencies("org.springframework.boot", "spring-boot-dependencies", this.description.getPlatformVersion().toString()); String testcontainersVersion = resolve.get("org.testcontainers:testcontainers"); - return (serviceConnections) -> { if (TESTCONTAINERS_1_19_7_OR_LATER.match(Version.parse(testcontainersVersion))) { serviceResolver.doWith("pgvector", (service) -> serviceConnections.addServiceConnection( From 529124959caf3ea5e8349365ff221a59a64668b1 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 25 Mar 2024 14:34:26 +0200 Subject: [PATCH 485/825] Upgrade to Vaadin 24.3.8 See gh-1440 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c9e80d4dec..427ab73a85 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -160,7 +160,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.7 + version: 24.3.8 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 9ddbe67660f503b7ed7c0438dac3676661662cb6 Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:36:07 -0400 Subject: [PATCH 486/825] Upgrade to Spring Cloud 2023.0.1 See gh-1441 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 427ab73a85..191833b8fe 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -98,7 +98,7 @@ initializr: version: 2023.0.0-RC1 repositories: spring-milestones - compatibilityRange: "3.2.0" - version: 2023.0.0 + version: 2023.0.1 spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies From d89eeaba8c5ef105eddd1ed3a7a14d3c82f0d19f Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 3 Apr 2024 10:03:47 +0300 Subject: [PATCH 487/825] Upgrade to Vaadin 24.3.9 See gh-1444 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 191833b8fe..d264427ec6 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -160,7 +160,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.8 + version: 24.3.9 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 0904251e514fcd333d19461e89ad0e57e78ed76e Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 28 Mar 2024 14:43:53 +0100 Subject: [PATCH 488/825] Update to Camel 4.5.0 https://camel.apache.org/blog/2024/03/RELEASE-4.5.0/ See gh-1442 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d264427ec6..9f866d0896 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -827,7 +827,7 @@ initializr: - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 4.2.0 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 4.4.1 + version: 4.5.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From 9d6567310c31ac182566dbcfd5b2ed9d126bbf34 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 4 Apr 2024 09:36:26 +0200 Subject: [PATCH 489/825] Upgrade Spring Cloud Azure to 5.11.0 Closes gh-1443 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9f866d0896..4464c54776 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -105,7 +105,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 5.10.0 + version: 5.11.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From 1b62b926537763453249267253bb3d0a485bcbc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 4 Apr 2024 18:45:16 +0200 Subject: [PATCH 490/825] Upgrade to Spring Boot 3.2.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4b67eab1e2..6547bc131b 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.2 + 3.2.4 io.spring.start start-parent From 2f3fdd96c110ae6078ad75514fd315f48e34a1da Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Mon, 8 Apr 2024 12:52:46 +0200 Subject: [PATCH 491/825] Update dependencies --- start-client/yarn.lock | 334 ++++++++++++++++++----------------------- 1 file changed, 146 insertions(+), 188 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 1e1a393bd8..66809b60a2 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -48,23 +48,23 @@ "@babel/highlight" "^7.24.2" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" - integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" + integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" - integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" + integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.1" + "@babel/generator" "^7.24.4" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.1" - "@babel/parser" "^7.24.1" + "@babel/helpers" "^7.24.4" + "@babel/parser" "^7.24.4" "@babel/template" "^7.24.0" "@babel/traverse" "^7.24.1" "@babel/types" "^7.24.0" @@ -83,10 +83,10 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.24.1", "@babel/generator@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" - integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== +"@babel/generator@^7.24.1", "@babel/generator@^7.24.4", "@babel/generator@^7.7.2": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" + integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== dependencies: "@babel/types" "^7.24.0" "@jridgewell/gen-mapping" "^0.3.5" @@ -118,10 +118,10 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz#db58bf57137b623b916e24874ab7188d93d7f68f" - integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3" + integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" @@ -273,10 +273,10 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" - integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== +"@babel/helpers@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6" + integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== dependencies: "@babel/template" "^7.24.0" "@babel/traverse" "^7.24.1" @@ -292,10 +292,18 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.7.0": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" - integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4", "@babel/parser@^7.7.0": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" + integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1" + integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": version "7.24.1" @@ -679,10 +687,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-block-scoping@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz#27af183d7f6dad890531256c7a45019df768ac1f" - integrity sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw== +"@babel/plugin-transform-block-scoping@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012" + integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g== dependencies: "@babel/helper-plugin-utils" "^7.24.0" @@ -694,12 +702,12 @@ "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-class-static-block@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz#4e37efcca1d9f2fcb908d1bae8b56b4b6e9e1cb6" - integrity sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA== +"@babel/plugin-transform-class-static-block@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" + integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-create-class-features-plugin" "^7.24.4" "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -1079,14 +1087,15 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.3.tgz#f3f138c844ffeeac372597b29c51b5259e8323a3" - integrity sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA== + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b" + integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A== dependencies: - "@babel/compat-data" "^7.24.1" + "@babel/compat-data" "^7.24.4" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" @@ -1113,9 +1122,9 @@ "@babel/plugin-transform-async-generator-functions" "^7.24.3" "@babel/plugin-transform-async-to-generator" "^7.24.1" "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.1" + "@babel/plugin-transform-block-scoping" "^7.24.4" "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.1" + "@babel/plugin-transform-class-static-block" "^7.24.4" "@babel/plugin-transform-classes" "^7.24.1" "@babel/plugin-transform-computed-properties" "^7.24.1" "@babel/plugin-transform-destructuring" "^7.24.1" @@ -1191,9 +1200,9 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" - integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== dependencies: regenerator-runtime "^0.14.0" @@ -1293,9 +1302,9 @@ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" - integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1860,9 +1869,9 @@ "@jridgewell/sourcemap-codec" "^1.4.14" "@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -2086,9 +2095,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.56.6" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.6.tgz#d5dc16cac025d313ee101108ba5714ea10eb3ed0" - integrity sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A== + version "8.56.7" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.7.tgz#c33b5b5a9cfb66881beb7b5be6c34aa3e81d3366" + integrity sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2104,9 +2113,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.43" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" - integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== + version "4.19.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz#3ae8ab3767d98d0b682cda063c3339e1e86ccfaa" + integrity sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2198,11 +2207,6 @@ dependencies: "@types/unist" "^2" -"@types/mime@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" - integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== - "@types/mime@^1": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" @@ -2231,9 +2235,9 @@ "@types/node" "*" "@types/node@*": - version "20.11.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" - integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== + version "20.12.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.5.tgz#74c4f31ab17955d0b5808cdc8fd2839526ad00b3" + integrity sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw== dependencies: undici-types "~5.26.4" @@ -2253,9 +2257,9 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@^15.0.0": - version "15.7.11" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" - integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== "@types/qs@*": version "6.9.14" @@ -2300,13 +2304,13 @@ "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.5" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" - integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: "@types/http-errors" "*" - "@types/mime" "*" "@types/node" "*" + "@types/send" "*" "@types/sockjs@^0.3.33": version "0.3.36" @@ -3395,9 +3399,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001587: - version "1.0.30001599" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz#571cf4f3f1506df9bf41fcbb6d10d5d017817bce" - integrity sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA== + version "1.0.30001607" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001607.tgz#b91e8e033f6bca4e13d3d45388d87fa88931d9a5" + integrity sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w== caseless@~0.12.0: version "0.12.0" @@ -3807,15 +3811,15 @@ css-color-names@1.0.1: integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== css-loader@^6.7.1: - version "6.10.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.10.0.tgz#7c172b270ec7b833951b52c348861206b184a4b7" - integrity sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw== + version "6.11.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" + integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== dependencies: icss-utils "^5.1.0" postcss "^8.4.33" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.4" - postcss-modules-scope "^3.1.1" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" semver "^7.5.4" @@ -4182,9 +4186,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.4.668: - version "1.4.713" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.713.tgz#7cd8e4083c948f8d0cc686fcfdde97d97fd76556" - integrity sha512-vDarADhwntXiULEdmWd77g2dV6FrNGa8ecAC29MZ4TwPut2fvosD0/5sJd1qWNNe8HcJFAC+F5Lf9jW1NPtWmw== + version "1.4.729" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz#8477d21e2a50993781950885b2731d92ad532c00" + integrity sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA== emittery@^0.10.2: version "0.10.2" @@ -4249,9 +4253,9 @@ env-paths@^2.2.0: integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: - version "7.11.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.1.tgz#2ffef77591057081b0129a8fd8cf6118da1b94e1" - integrity sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg== + version "7.12.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.12.0.tgz#b56723b39c2053d67ea5714f026d05d4f5cc7acd" + integrity sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg== err-code@^2.0.2: version "2.0.3" @@ -4265,57 +4269,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3: - version "1.22.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.5.tgz#1417df4e97cc55f09bf7e58d1e614bc61cb8df46" - integrity sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.1" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.0" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.5" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.14" - -es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: - version "1.23.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0" - integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w== +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== dependencies: array-buffer-byte-length "^1.0.1" arraybuffer.prototype.slice "^1.0.3" @@ -4356,11 +4313,11 @@ es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: safe-regex-test "^1.0.3" string.prototype.trim "^1.2.9" string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.7" + string.prototype.trimstart "^1.0.8" typed-array-buffer "^1.0.2" typed-array-byte-length "^1.0.1" typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.5" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" which-typed-array "^1.1.15" @@ -4397,9 +4354,9 @@ es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.2.tgz#ba1a62255ff9b41023aaf9bd08c016a5f1a3fef3" - integrity sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw== + version "1.5.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.0.tgz#4878fee3789ad99e065f975fdd3c645529ff0236" + integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw== es-object-atoms@^1.0.0: version "1.0.0" @@ -4853,9 +4810,9 @@ expect@^28.1.3: jest-util "^28.1.3" express@^4.17.3: - version "4.19.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.1.tgz#4700635795e911600a45596138cf5b0320e78256" - integrity sha512-K4w1/Bp7y8iSiVObmCrtq8Cs79XjJc/RU2YYkZQ7wpUu5ZyZ7MtPHkqoMz4pf+mgXfNvo2qft8D9OnrH2ABk9w== + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" @@ -8230,12 +8187,13 @@ object.groupby@^1.0.1: es-abstract "^1.23.2" object.hasown@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" - integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== dependencies: - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" object.pick@^1.3.0: version "1.3.0" @@ -8631,24 +8589,24 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== -postcss-modules-local-by-default@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" - integrity sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q== +postcss-modules-local-by-default@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" + integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" - integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA== +postcss-modules-scope@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" + integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== dependencies: postcss-selector-parser "^6.0.4" @@ -8797,9 +8755,9 @@ prop-types@^15.0.0, prop-types@^15.5.6, prop-types@^15.6.1, prop-types@^15.6.2, react-is "^16.13.1" property-information@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.1.tgz#de8b79a7415fd2107dfbe65758bb2cc9dfcf60ac" - integrity sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w== + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== proxy-addr@~2.0.7: version "2.0.7" @@ -9384,7 +9342,7 @@ sade@^1.7.3: dependencies: mri "^1.1.0" -safe-array-concat@^1.1.0, safe-array-concat@^1.1.2: +safe-array-concat@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== @@ -9443,9 +9401,9 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.72.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.72.0.tgz#5b9978943fcfb32b25a6a5acb102fc9dabbbf41c" - integrity sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA== + version "1.74.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.74.1.tgz#686fc227d3707dd25cb2925e1db8e4562be29319" + integrity sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -10052,7 +10010,7 @@ string.prototype.matchall@^4.0.10, string.prototype.matchall@^4.0.6: set-function-name "^2.0.2" side-channel "^1.0.6" -string.prototype.trim@^1.2.8, string.prototype.trim@^1.2.9: +string.prototype.trim@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== @@ -10062,7 +10020,7 @@ string.prototype.trim@^1.2.8, string.prototype.trim@^1.2.9: es-abstract "^1.23.0" es-object-atoms "^1.0.0" -string.prototype.trimend@^1.0.7, string.prototype.trimend@^1.0.8: +string.prototype.trimend@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== @@ -10071,14 +10029,14 @@ string.prototype.trimend@^1.0.7, string.prototype.trimend@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@^1.1.1: version "1.3.0" @@ -10243,9 +10201,9 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar@^6.0.2, tar@^6.1.2: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -10289,9 +10247,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.29.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.29.2.tgz#c17d573ce1da1b30f21a877bffd5655dd86fdb35" - integrity sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw== + version "5.30.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.3.tgz#f1bb68ded42408c316b548e3ec2526d7dd03f4d2" + integrity sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10574,10 +10532,10 @@ typed-array-byte-offset@^1.0.2: has-proto "^1.0.3" is-typed-array "^1.1.13" -typed-array-length@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.5.tgz#57d44da160296d8663fd63180a1802ebf25905d5" - integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: call-bind "^1.0.7" for-each "^0.3.3" From 71c77182be0567edfb5a452511e2105c9003249a Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 15 Apr 2024 10:37:57 +0200 Subject: [PATCH 492/825] Upgrade to Solace Spring Cloud 4.0.0 Closes gh-1446 --- start-site/src/main/resources/application.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4464c54776..7427d299f5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -76,8 +76,10 @@ initializr: mappings: - compatibilityRange: "[3.0.0,3.1.0-M1)" version: 3.0.0 - - compatibilityRange: "[3.1.0-M1, 3.3.0-M1)" + - compatibilityRange: "[3.1.0-M1, 3.2.0-M1)" version: 3.1.0 + - compatibilityRange: "[3.2.0-M1, 3.3.0-M1)" + version: 4.0.0 spring-ai: groupId: org.springframework.ai artifactId: spring-ai-bom From 852c953c328cf9fc74b44c1f87785812ec60151f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Tue, 9 Apr 2024 13:27:18 +0200 Subject: [PATCH 493/825] Update Timefold Solver to 1.9.0 See gh-1447 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 7427d299f5..3ab380e529 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -155,7 +155,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 1.8.0 + version: 1.9.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From 539e3cf0096de9c49d4167ddcc862e1f11a66af6 Mon Sep 17 00:00:00 2001 From: Diego Marquez Date: Tue, 9 Apr 2024 10:45:04 -0400 Subject: [PATCH 494/825] Update spring-cloud-gcp to 5.1.2 and 4.10.1 See gh-1448 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3ab380e529..2587752e7f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -115,9 +115,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 4.10.0 + version: 4.10.1 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 5.1.0 + version: 5.1.2 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 1fc22780f8fff89f03bb5561ee13c0f605daeadc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 02:22:17 +0000 Subject: [PATCH 495/825] Bump azure/login from 2.0.0 to 2.1.0 Bumps [azure/login](https://github.com/azure/login) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/azure/login/releases) - [Commits](https://github.com/azure/login/compare/8c334a195cbb38e46038007b304988d888bf676a...6b2456866fc08b011acb422a92a4aa20e2c4de32) --- updated-dependencies: - dependency-name: azure/login dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] See gh-1450 --- .github/workflows/build-and-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index fe33703e6d..53ec709e66 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -36,7 +36,7 @@ jobs: run: ./mvnw --batch-mode --update-snapshots verify - name: Set up Azure - uses: azure/login@8c334a195cbb38e46038007b304988d888bf676a + uses: azure/login@6b2456866fc08b011acb422a92a4aa20e2c4de32 with: creds: ${{ secrets.AZURE_CREDENTIALS_SPRING_IO }} From ca4d08888fa245e39e516dffcc4e0d7671b0735b Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Fri, 19 Apr 2024 19:39:46 +0200 Subject: [PATCH 496/825] Upgrade to Spring Modulith 1.2 RC1 See gh-1449 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2587752e7f..5704170623 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -138,7 +138,7 @@ initializr: - compatibility-range: "[3.2.0-M1,3.3.0-M1)" version: 1.1.3 - compatibility-range: "3.3.0-M1" - version: 1.2.0-M2 + version: 1.2.0-RC1 repositories: spring-milestones spring-shell: groupId: org.springframework.shell From cc480eea6f24ba2bf8cf68a863784824b84a1c3e Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 22 Apr 2024 11:20:26 +0200 Subject: [PATCH 497/825] Instruct dependabot to put a "type: task" label on the PRs --- .github/dependabot.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5ace4600a1..187fe1cd72 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,3 +4,5 @@ updates: directory: "/" schedule: interval: "weekly" + labels: + - "type: task" From 6dc1f9613537ac37e049da9841610e3c5f3b7e3c Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Tue, 23 Apr 2024 09:24:38 +0100 Subject: [PATCH 498/825] Upgrade to Spring Shell 3.1.11, 3.2.4 and 3.3.0-M1 See gh-1451 --- start-site/src/main/resources/application.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 5704170623..4db2ee4d94 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -146,9 +146,12 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 3.1.10 + version: 3.1.11 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 3.2.3 + version: 3.2.4 + - compatibility-range: "3.3.0-M1" + version: 3.3.0-M1 + repositories: spring-milestones timefold-solver: groupId: ai.timefold.solver artifactId: timefold-solver-bom @@ -907,7 +910,7 @@ initializr: id: spring-shell groupId: org.springframework.shell artifactId: spring-shell-starter - compatibilityRange: "[3.1.0,3.3.0-M1)" + compatibilityRange: "[3.1.0,3.4.0-M1)" description: Build command line applications with spring. bom: spring-shell links: From 94d426846006ecaeb6c64a25722ef35df6c4bfde Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:09:49 +0300 Subject: [PATCH 499/825] Upgrade to Vaadin 24.3.10 See gh-1452 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4db2ee4d94..2ae2a65053 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -165,7 +165,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.9 + version: 24.3.10 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 582ea4eb318be32ff4d7c8c9b731ca042cc95b08 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 29 Apr 2024 14:14:17 +0200 Subject: [PATCH 500/825] Revert "Use micrometer-registry-prometheus-simpleclient when using Boot 3.3" This reverts commit 5b208d130f22bedd0ee5a4e53225528f8980e3b1. Closes gh-1456 --- start-site/src/main/resources/application.yml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2ae2a65053..68786d3b95 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1014,20 +1014,14 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.newrelic - name: Prometheus id: prometheus - description: Expose Micrometer metrics in Prometheus format, an in-memory dimensional time series database with a simple built-in UI, a custom query language, and math operations. + groupId: io.micrometer + artifactId: micrometer-registry-prometheus scope: runtime + starter: false + description: Expose Micrometer metrics in Prometheus format, an in-memory dimensional time series database with a simple built-in UI, a custom query language, and math operations. links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.prometheus - mappings: - - compatibility-range: "[3.1.0,3.3.0-M3)" - groupId: io.micrometer - artifactId: micrometer-registry-prometheus - starter: false - - compatibility-range: "3.3.0-M3" - groupId: io.micrometer - artifactId: micrometer-registry-prometheus-simpleclient - starter: false - name: Distributed Tracing id: distributed-tracing description: Enable span and trace IDs in logs. From 4feb7f83d0b220731b9f28d98fc13381be789564 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Mon, 29 Apr 2024 14:20:12 +0200 Subject: [PATCH 501/825] Upgrade to latest Spring Modulith service releases See gh-1457 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 68786d3b95..eb34bd47bb 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -134,9 +134,9 @@ initializr: versionProperty: spring-modulith.version mappings: - compatibility-range: "[3.1.0,3.2.0-M1)" - version: 1.0.5 + version: 1.0.7 - compatibility-range: "[3.2.0-M1,3.3.0-M1)" - version: 1.1.3 + version: 1.1.4 - compatibility-range: "3.3.0-M1" version: 1.2.0-RC1 repositories: spring-milestones From 977b165435f7cd1b3d268398a05974d925df56cb Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 2 May 2024 14:30:06 +0200 Subject: [PATCH 502/825] Don't duplicate Postgres databases PgVector is an extension for Postgres. Before this commit, we would add a pgvector and a postgres Docker Compose service. The resulting app doesn't start up, as there are now two JdbcConnectionDetails in the context. After that commit, we only add the pgvector Docker Compose service if both Postgres and PgVector is selected. Closes gh-1458 --- ...PgVectorProjectGenerationConfiguration.java | 17 ++++++++++------- ...stgresqlProjectGenerationConfiguration.java | 18 +++++++++++------- ...torProjectGenerationConfigurationTests.java | 7 +++++++ 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java index b99b269811..a8efc0a4a6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java @@ -36,6 +36,7 @@ * Configuration for generation of projects that depend on PgVector. * * @author Eddú Meléndez + * @author Moritz Halbritter */ @Configuration(proxyBeanMethods = false) @ConditionalOnRequestedDependency("spring-ai-vectordb-pgvector") @@ -71,13 +72,15 @@ ServiceConnectionsCustomizer pgvectorServiceConnectionsCustomizer(DockerServiceR @Bean @ConditionalOnRequestedDependency("docker-compose") ComposeFileCustomizer pgvectorComposeFileCustomizer(DockerServiceResolver serviceResolver) { - return (composeFile) -> serviceResolver.doWith("pgvector", - (service) -> composeFile.services() - .add("pgvector", - service.andThen((builder) -> builder.environment("POSTGRES_USER", "myuser") - .environment("POSTGRES_DB", "mydatabase") - .environment("POSTGRES_PASSWORD", "secret") - .label("org.springframework.boot.service-connection", "postgres")))); + return (composeFile) -> serviceResolver.doWith("pgvector", (service) -> { + composeFile.services().remove("postgres"); + composeFile.services() + .add("pgvector", + service.andThen((builder) -> builder.environment("POSTGRES_USER", "myuser") + .environment("POSTGRES_DB", "mydatabase") + .environment("POSTGRES_PASSWORD", "secret") + .label("org.springframework.boot.service-connection", "postgres"))); + }); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfiguration.java index db471c5ae8..53aa1f075d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PostgresqlProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,12 +47,16 @@ ServiceConnectionsCustomizer postgresqlServiceConnectionsCustomizer(DockerServic @Bean @ConditionalOnRequestedDependency("docker-compose") ComposeFileCustomizer postgresqlComposeFileCustomizer(DockerServiceResolver serviceResolver) { - return (composeFile) -> serviceResolver.doWith("postgres", - (service) -> composeFile.services() - .add("postgres", - service.andThen((builder) -> builder.environment("POSTGRES_USER", "myuser") - .environment("POSTGRES_DB", "mydatabase") - .environment("POSTGRES_PASSWORD", "secret")))); + return (composeFile) -> serviceResolver.doWith("postgres", (service) -> { + if (composeFile.services().has("pgvector")) { + return; + } + composeFile.services() + .add("postgres", + service.andThen((builder) -> builder.environment("POSTGRES_USER", "myuser") + .environment("POSTGRES_DB", "mydatabase") + .environment("POSTGRES_PASSWORD", "secret"))); + }); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java index 24a596c62e..35db1c1fb4 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java @@ -29,6 +29,7 @@ * Tests for {@link PgVectorProjectGenerationConfiguration}. * * @author Eddú Meléndez + * @author Moritz Halbritter */ class PgVectorProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -45,4 +46,10 @@ void createsPostgresService() { assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pgvector.yaml")); } + @Test + void shouldOnlyHavePgVectorIfPostgresAndPgVectorIsSelected() { + ProjectRequest request = createProjectRequest("docker-compose", "postgresql", "spring-ai-vectordb-pgvector"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pgvector.yaml")); + } + } From 604dd1c454114820d82bb0a3078a7f9f9e127cb4 Mon Sep 17 00:00:00 2001 From: dashaun Date: Sat, 27 Apr 2024 22:28:25 -0500 Subject: [PATCH 503/825] Add spring-shell-starter-test if Spring Shell is selected See gh-1455 --- ...endencyProjectGenerationConfiguration.java | 7 +++ .../SpringShellTestBuildCustomizer.java | 40 ++++++++++++ .../dependency/springshell/package-info.java | 20 ++++++ .../SpringShellTestBuildCustomizerTests.java | 62 +++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/package-info.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java index b43a3c5e29..4a42b1a1b7 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java @@ -32,6 +32,7 @@ import io.spring.start.site.extension.dependency.springsecurity.SpringSecurityRSocketBuildCustomizer; import io.spring.start.site.extension.dependency.springsecurity.SpringSecurityTestBuildCustomizer; import io.spring.start.site.extension.dependency.springsession.SpringSessionBuildCustomizer; +import io.spring.start.site.extension.dependency.springshell.SpringShellTestBuildCustomizer; import io.spring.start.site.extension.dependency.thymeleaf.ThymeleafBuildCustomizer; import org.springframework.context.annotation.Bean; @@ -115,4 +116,10 @@ public MyBatisTestBuildCustomizer mybatisTestBuildCustomizer() { return new MyBatisTestBuildCustomizer(); } + @Bean + @ConditionalOnRequestedDependency("spring-shell") + public SpringShellTestBuildCustomizer springShellTestBuildCustomizer() { + return new SpringShellTestBuildCustomizer(); + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizer.java new file mode 100644 index 0000000000..f404a8824d --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizer.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springshell; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * A {@link BuildCustomizer} that automatically adds {@code spring-shell-test} when Spring + * Shell is selected. + * + * @author DaShaun Carter + */ +public class SpringShellTestBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + build.dependencies() + .add("spring-shell-starter-test", + Dependency.withCoordinates("org.springframework.shell", "spring-shell-starter-test") + .scope(DependencyScope.TEST_COMPILE)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/package-info.java new file mode 100644 index 0000000000..a5ccdfc497 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springshell/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on Spring Shell. + */ +package io.spring.start.site.extension.dependency.springshell; diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java new file mode 100644 index 0000000000..d0e935cca7 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java @@ -0,0 +1,62 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springshell; + +import io.spring.initializr.metadata.BillOfMaterials; +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringShellTestBuildCustomizer}. + * + * @author DaShaun Carter + */ +class SpringShellTestBuildCustomizerTests extends AbstractExtensionTests { + + @Test + void shellTestIsAddedWithSpringShell() { + ProjectRequest request = createProjectRequest("spring-shell"); + BillOfMaterials bom = getBom("spring-shell", request.getBootVersion()); + assertThat(mavenPom(request)).hasDependency(getDependency("spring-shell")) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependency(springShellStarterTest()) + .hasDependenciesSize(3) + .hasBom("org.springframework.shell", "spring-shell-dependencies", "${spring-shell.version}") + .hasBomsSize(1) + .hasProperty("spring-shell.version", bom.getVersion()); + } + + @Test + void shellTestIsNotAddedWithoutSpringShell() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("web")) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependenciesSize(2); + } + + private static Dependency springShellStarterTest() { + Dependency dependency = Dependency.withId("spring-shell-starter-test", "org.springframework.shell", + "spring-shell-starter-test"); + dependency.setScope(Dependency.SCOPE_TEST); + return dependency; + } + +} From 2e1296cbee6d635800e8876a16a98a6a17d18fc9 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 6 May 2024 15:00:46 +0300 Subject: [PATCH 504/825] Upgrade to Vaadin 24.3.11 See gh-1461 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index eb34bd47bb..e6bcb8d05f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -165,7 +165,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.10 + version: 24.3.11 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 021b473b0bb31391d895682388c6b56f34155e52 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 6 May 2024 17:46:32 +0200 Subject: [PATCH 505/825] Allow Spring AI only for Spring Boot 3.2.x Closes gh-1460 --- start-site/src/main/resources/application.yml | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e6bcb8d05f..30c60d88e2 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -85,7 +85,7 @@ initializr: artifactId: spring-ai-bom versionProperty: spring-ai.version mappings: - - compatibilityRange: "[3.0.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" version: 0.8.1 repositories: spring-milestones spring-cloud: @@ -1440,7 +1440,7 @@ initializr: content: - name: Azure OpenAI id: spring-ai-azure-openai - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-azure-openai-spring-boot-starter description: Spring AI support for Azure’s OpenAI offering, powered by ChatGPT. It extends beyond traditional OpenAI capabilities, delivering AI-driven text generation with enhanced functionality. @@ -1451,7 +1451,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/azure-openai-chat.html - name: Azure AI Search id: spring-ai-vectordb-azure - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-azure-vector-store-spring-boot-starter description: Spring AI vector database support for Azure AI Search. It is an AI-powered information retrieval platform and part of Microsoft’s larger AI platform. Among other features, it allows users to query information using vector-based storage and retrieval. @@ -1462,7 +1462,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/azure.html - name: Amazon Bedrock id: spring-ai-bedrock - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-bedrock-ai-spring-boot-starter description: Spring AI support for Amazon Bedrock. It is a managed service that provides foundation models from various AI providers, available through a unified API. @@ -1473,7 +1473,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/bedrock-chat.html - name: Chroma Vector Database id: spring-ai-vectordb-chroma - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-chroma-store-spring-boot-starter description: Spring AI vector database support for Chroma. It is an open-source embedding database and gives you the tools to store document embeddings, content, and metadata. It also allows to search through those embeddings, including metadata filtering. @@ -1484,7 +1484,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/chroma.html - name: Milvus Vector Database id: spring-ai-vectordb-milvus - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-milvus-store-spring-boot-starter description: Spring AI vector database support for Milvus. It is an open-source vector database that has garnered significant attention in the fields of data science and machine learning. One of its standout features lies in its robust support for vector indexing and querying. @@ -1495,7 +1495,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/milvus.html - name: Mistral AI id: spring-ai-mistral - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-mistral-ai-spring-boot-starter description: Spring AI support for Mistral AI, the open and portable generative AI for devs and businesses. @@ -1506,7 +1506,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/mistralai-chat.html - name: Neo4J Vector Database id: spring-ai-vectordb-neo4j - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-neo4j-store-spring-boot-starter description: Spring AI vector database support for Neo4j's Vector Search. It allows users to query vector embeddings from large datasets. @@ -1517,7 +1517,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/neo4j.html - name: Ollama id: spring-ai-ollama - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-ollama-spring-boot-starter description: Spring AI support for Ollama. It allows you to run various Large Language Models (LLMs) locally and generate text from them. @@ -1528,7 +1528,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/ollama-chat.html - name: OpenAI id: spring-ai-openai - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-openai-spring-boot-starter description: Spring AI support for ChatGPT, the AI language model and DALL-E, the Image generation model from OpenAI. @@ -1539,7 +1539,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/openai-chat.html - name: PGvector Vector Database id: spring-ai-vectordb-pgvector - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-pgvector-store-spring-boot-starter description: Spring AI vector database support for PGvector. It is an open-source extension for PostgreSQL that enables storing and searching over machine learning-generated embeddings. @@ -1550,7 +1550,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pgvector.html - name: Pinecone Vector Database id: spring-ai-vectordb-pinecone - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-pinecone-store-spring-boot-starter description: Spring AI vector database support for Pinecone. It is a popular cloud-based vector database and allows you to store and search vectors efficiently. @@ -1561,7 +1561,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pinecone.html - name: PostgresML id: spring-ai-postgresml - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-postgresml-spring-boot-starter description: Spring AI support for the PostgresML text embeddings models. @@ -1572,7 +1572,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/embeddings/postgresml-embeddings.html - name: Redis Search and Query Vector Database id: spring-ai-vectordb-redis - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-redis-spring-boot-starter description: Spring AI vector database support for Redis Search and Query.It extends the core features of Redis OSS and allows you to use Redis as a vector database. @@ -1583,7 +1583,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/redis.html - name: Stability AI id: spring-ai-stabilityai - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-stability-ai-spring-boot-starter description: Spring AI support for Stability AI's text to image generation model. @@ -1594,7 +1594,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/image/stabilityai-image.html - name: Transformers (ONNX) Embeddings id: spring-ai-transformers - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-transformers-spring-boot-starter description: Spring AI support for pre-trained transformer models, serialized into the Open Neural Network Exchange (ONNX) format. @@ -1605,7 +1605,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html - name: Vertex AI PaLM2 id: spring-ai-vertexai-palm2 - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-vertex-ai-palm2-spring-boot-starter description: Spring AI support for Google Vertex PaLM2 chat and embedding models. @@ -1616,7 +1616,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-palm2-chat.html - name: Vertex AI Gemini id: spring-ai-vertexai-gemini - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-vertex-ai-gemini-spring-boot-starter description: Spring AI support for Google Vertex Gemini chat. @@ -1627,7 +1627,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-gemini-chat.html - name: Qdrant Vector Database id: spring-ai-vectordb-qdrant - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-qdrant-store-spring-boot-starter description: Spring AI vector database support for Qdrant. It is an open-source, high-performance vector search engine/database. @@ -1638,7 +1638,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/qdrant.html - name: Weaviate Vector Database id: spring-ai-vectordb-weaviate - compatibility-range: "[3.1.0,3.3.0-M1)" + compatibility-range: "[3.2.0-M1,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-weaviate-store-spring-boot-starter description: Spring AI vector database support for Weaviate, an open-source vector database. It allows you to store data objects and vector embeddings from your favorite ML-models and scale seamlessly into billions of data objects. From eeb89b89eb67b55a53a5e51fb0da48cf58f19d19 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 6 May 2024 17:52:37 +0200 Subject: [PATCH 506/825] Fix tests --- ...rsProjectGenerationConfigurationTests.java | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 42be1e3862..43cd68a105 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -48,20 +48,20 @@ void buildWithOnlyTestContainers() { } @ParameterizedTest - @MethodSource("supportedEntriesBuild") - void buildWithSupportedEntries(String springBootDependencyId, String testcontainersArtifactId) { + @MethodSource("supportedEntriesBuild310") + void buildWithSupportedEntriesForSpringBoot31(String springBootDependencyId, String testcontainersArtifactId) { assertThat(generateProject("3.1.0", "testcontainers", springBootDependencyId)).mavenBuild() .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.1.0"))) .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") .hasDependency(getDependency("testcontainers")); } - @Test - void buildWithSpringBoot32AndOracleJdbcDriverUsesOracleFree() { - assertThat(generateProject("3.2.0", "testcontainers", "oracle")).mavenBuild() - .doesNotHaveBom("org.testcontainers", "testcontainers-bom") - .hasDependency(getDependency("oracle").resolve(Version.parse("3.2.0"))) - .hasDependency("org.testcontainers", "oracle-free", null, "test") + @ParameterizedTest + @MethodSource("supportedEntriesBuild320") + void buildWithSupportedEntriesForSpringBoot32(String springBootDependencyId, String testcontainersArtifactId) { + assertThat(generateProject("3.2.0", "testcontainers", springBootDependencyId)).mavenBuild() + .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.2.0"))) + .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") .hasDependency(getDependency("testcontainers")); } @@ -76,7 +76,7 @@ void buildWithSpringBoot33AndTestcontainersActiveMQModule(String springBootDepen .hasDependency(getDependency("testcontainers")); } - static Stream supportedEntriesBuild() { + static Stream supportedEntriesBuild310() { return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.of("amqp-streams", "rabbitmq"), Arguments.arguments("cloud-gcp", "gcloud"), Arguments.arguments("cloud-gcp-pubsub", "gcloud"), Arguments.arguments("data-cassandra", "cassandra"), @@ -91,6 +91,24 @@ static Stream supportedEntriesBuild() { Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), Arguments.arguments("oracle", "oracle-xe"), Arguments.arguments("pulsar", "pulsar"), Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), + Arguments.arguments("sqlserver", "mssqlserver")); + } + + static Stream supportedEntriesBuild320() { + return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.of("amqp-streams", "rabbitmq"), + Arguments.arguments("cloud-gcp", "gcloud"), Arguments.arguments("cloud-gcp-pubsub", "gcloud"), + Arguments.arguments("data-cassandra", "cassandra"), + Arguments.arguments("data-cassandra-reactive", "cassandra"), + Arguments.arguments("data-couchbase", "couchbase"), + Arguments.arguments("data-couchbase-reactive", "couchbase"), + Arguments.arguments("data-elasticsearch", "elasticsearch"), + Arguments.arguments("data-mongodb", "mongodb"), Arguments.arguments("data-mongodb-reactive", "mongodb"), + Arguments.arguments("data-neo4j", "neo4j"), Arguments.arguments("data-r2dbc", "r2dbc"), + Arguments.arguments("db2", "db2"), Arguments.arguments("kafka", "kafka"), + Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mariadb", "mariadb"), + Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), + Arguments.arguments("oracle", "oracle-free"), Arguments.arguments("pulsar", "pulsar"), + Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), Arguments.arguments("spring-ai-vectordb-neo4j", "neo4j"), Arguments.arguments("spring-ai-vectordb-pgvector", "postgresql"), Arguments.arguments("sqlserver", "mssqlserver")); From 8d44c721d7d02cae4d22f51b491777a2d0d92edc Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Mon, 6 May 2024 16:32:33 +0200 Subject: [PATCH 507/825] Use local storage to remember user choices See gh-1462 --- .../src/components/reducer/Initializr.js | 69 +++++++++++++++++-- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/start-client/src/components/reducer/Initializr.js b/start-client/src/components/reducer/Initializr.js index 7114d9cfd1..0f77f7c455 100644 --- a/start-client/src/components/reducer/Initializr.js +++ b/start-client/src/components/reducer/Initializr.js @@ -26,17 +26,73 @@ export const defaultInitializrContext = { warnings: {}, } +const localStorage = + typeof window !== 'undefined' + ? window.localStorage + : { + getItem: () => {}, + setItem: () => {}, + } + +const getPersistedOrDefault = json => { + const values = { + project: + localStorage.getItem('project') || get(json, 'defaultValues').project, + language: + localStorage.getItem('language') || get(json, 'defaultValues').language, + boot: localStorage.getItem('boot') || get(json, 'defaultValues').boot, + meta: { + name: get(json, 'defaultValues.meta').name, + group: get(json, 'defaultValues.meta').group, + artifact: get(json, 'defaultValues.meta').artifact, + description: get(json, 'defaultValues.meta').description, + packageName: get(json, 'defaultValues.meta').packageName, + packaging: + localStorage.getItem('packaging') || + get(json, 'defaultValues.meta.packaging'), + java: + localStorage.getItem('java') || get(json, 'defaultValues.meta.java'), + }, + dependencies: [], + } + const checks = ['project', 'language', 'boot', 'meta.java', 'meta.packaging'] + checks.forEach(key => { + const item = get(json, `lists.${key}`)?.find( + it => it.key === get(values, key) + ) + if (!item) { + set(values, key, get(json, `defaultValues.${key}`)) + } + }) + return values +} + +const persist = changes => { + if (get(changes, 'project')) { + localStorage.setItem('project', get(changes, 'project')) + } + if (get(changes, 'language')) { + localStorage.setItem('language', get(changes, 'language')) + } + if (get(changes, 'boot')) { + localStorage.setItem('boot', get(changes, 'boot')) + } + if (get(changes, 'meta.packaging')) { + localStorage.setItem('packaging', get(changes, 'meta.packaging')) + } + if (get(changes, 'meta.java')) { + localStorage.setItem('java', get(changes, 'meta.java')) + } +} + export function reducer(state, action) { switch (action.type) { case 'COMPLETE': { const json = get(action, 'payload') - const defaultValues = { - ...get(json, 'defaultValues'), - meta: get(json, 'defaultValues.meta'), - } + const values = getPersistedOrDefault(json) return { - values: defaultValues, - share: getShareUrl(defaultValues), + values, + share: getShareUrl(values), errors: {}, warnings: {}, } @@ -67,6 +123,7 @@ export function reducer(state, action) { ) set(meta, 'name', `${get(meta, 'artifact')}`) } + persist(changes) const values = { ...get(state, 'values'), ...changes, From cc7c652a00c226fe40f5d870f0880a4d7825b464 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 7 May 2024 09:13:54 +0200 Subject: [PATCH 508/825] Polish "Use local storage to remember user choices" - Remove local storage of boot version See gh-1462 --- start-client/src/components/reducer/Initializr.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/start-client/src/components/reducer/Initializr.js b/start-client/src/components/reducer/Initializr.js index 0f77f7c455..90cf8b7345 100644 --- a/start-client/src/components/reducer/Initializr.js +++ b/start-client/src/components/reducer/Initializr.js @@ -40,7 +40,7 @@ const getPersistedOrDefault = json => { localStorage.getItem('project') || get(json, 'defaultValues').project, language: localStorage.getItem('language') || get(json, 'defaultValues').language, - boot: localStorage.getItem('boot') || get(json, 'defaultValues').boot, + boot: get(json, 'defaultValues').boot, meta: { name: get(json, 'defaultValues.meta').name, group: get(json, 'defaultValues.meta').group, @@ -49,13 +49,13 @@ const getPersistedOrDefault = json => { packageName: get(json, 'defaultValues.meta').packageName, packaging: localStorage.getItem('packaging') || - get(json, 'defaultValues.meta.packaging'), + get(json, 'defaultValues.meta').packaging, java: - localStorage.getItem('java') || get(json, 'defaultValues.meta.java'), + localStorage.getItem('java') || get(json, 'defaultValues.meta').java, }, dependencies: [], } - const checks = ['project', 'language', 'boot', 'meta.java', 'meta.packaging'] + const checks = ['project', 'language', 'meta.java', 'meta.packaging'] checks.forEach(key => { const item = get(json, `lists.${key}`)?.find( it => it.key === get(values, key) @@ -74,9 +74,6 @@ const persist = changes => { if (get(changes, 'language')) { localStorage.setItem('language', get(changes, 'language')) } - if (get(changes, 'boot')) { - localStorage.setItem('boot', get(changes, 'boot')) - } if (get(changes, 'meta.packaging')) { localStorage.setItem('packaging', get(changes, 'meta.packaging')) } From 5596a716811f19176c5b5b93604733cbec766ea4 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Tue, 7 May 2024 10:07:03 +0200 Subject: [PATCH 509/825] Update dependencies --- start-client/yarn.lock | 560 ++++++++++++++++++++--------------------- 1 file changed, 275 insertions(+), 285 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 66809b60a2..d8dd9ba088 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -2,11 +2,6 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - "@ampproject/remapping@^2.2.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" @@ -25,9 +20,9 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.1.tgz#2e11e071e32fe82850b4fe514f56b9c9e1c44911" - integrity sha512-HbmrtxyFUr34LwAlV9jS+sSIjUp4FpdtIMGwgufY3AsxrIfsh/HxlMTywsONAZsU0RMYbZtbZFpUCrSGs7o0EA== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.5.tgz#9eba21699f289c32e63a28aedf82f888dc134b30" + integrity sha512-2qg1mYtJRsOOWF6IUwLP5jI42P8Cc0hQ5TmnjLrik/4DKouO8dFJN80HEz81VmVeUs97yuuf3vQ/9j7Elrcjlg== dependencies: "@jridgewell/trace-mapping" "^0.3.25" commander "^4.0.1" @@ -40,7 +35,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== @@ -54,20 +49,20 @@ integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" - integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" + integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.4" + "@babel/generator" "^7.24.5" "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.4" - "@babel/parser" "^7.24.4" + "@babel/helper-module-transforms" "^7.24.5" + "@babel/helpers" "^7.24.5" + "@babel/parser" "^7.24.5" "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -75,20 +70,20 @@ semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz#e27eee93ed1d271637165ef3a86e2b9332395c32" - integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" + integrity sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.24.1", "@babel/generator@^7.24.4", "@babel/generator@^7.7.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" - integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== +"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== dependencies: - "@babel/types" "^7.24.0" + "@babel/types" "^7.24.5" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" @@ -118,19 +113,19 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3" - integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" + integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.24.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-split-export-declaration" "^7.24.5" semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": @@ -142,10 +137,10 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd" - integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== +"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -158,7 +153,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": +"@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== @@ -173,12 +168,12 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" - integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== +"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" + integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.24.5" "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": version "7.24.3" @@ -187,16 +182,16 @@ dependencies: "@babel/types" "^7.24.0" -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== +"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" + integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== dependencies: "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-simple-access" "^7.24.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.5" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -205,10 +200,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" - integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" + integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" @@ -228,12 +223,12 @@ "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== +"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" + integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.5" "@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" @@ -242,22 +237,22 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== +"@babel/helper-split-export-declaration@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.5" -"@babel/helper-string-parser@^7.23.4": +"@babel/helper-string-parser@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== "@babel/helper-validator-option@^7.23.5": version "7.23.5" @@ -265,45 +260,45 @@ integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== "@babel/helper-wrap-function@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" - integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" + integrity sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw== dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/types" "^7.22.19" + "@babel/helper-function-name" "^7.23.0" + "@babel/template" "^7.24.0" + "@babel/types" "^7.24.5" -"@babel/helpers@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6" - integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== +"@babel/helpers@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" + integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== dependencies: "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" "@babel/highlight@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" - integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== dependencies: - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-validator-identifier" "^7.24.5" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4", "@babel/parser@^7.7.0": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" - integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5", "@babel/parser@^7.7.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1" - integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" + integrity sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": version "7.24.1" @@ -687,12 +682,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-block-scoping@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012" - integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g== +"@babel/plugin-transform-block-scoping@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz#89574191397f85661d6f748d4b89ee4d9ee69a2a" + integrity sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-class-properties@^7.24.1": version "7.24.1" @@ -711,18 +706,18 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" - integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== +"@babel/plugin-transform-classes@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz#05e04a09df49a46348299a0e24bfd7e901129339" + integrity sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-split-export-declaration" "^7.24.5" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.24.1": @@ -733,12 +728,12 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/template" "^7.24.0" -"@babel/plugin-transform-destructuring@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" - integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== +"@babel/plugin-transform-destructuring@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz#80843ee6a520f7362686d1a97a7b53544ede453c" + integrity sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-dotall-regex@^7.24.1": version "7.24.1" @@ -892,15 +887,15 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff" - integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== +"@babel/plugin-transform-object-rest-spread@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz#f91bbcb092ff957c54b4091c86bda8372f0b10ef" + integrity sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA== dependencies: "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-parameters" "^7.24.5" "@babel/plugin-transform-object-super@^7.24.1": version "7.24.1" @@ -918,21 +913,21 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" - integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== +"@babel/plugin-transform-optional-chaining@^7.24.1", "@babel/plugin-transform-optional-chaining@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f" + integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" - integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== +"@babel/plugin-transform-parameters@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" + integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-private-methods@^7.24.1": version "7.24.1" @@ -942,14 +937,14 @@ "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-private-property-in-object@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a" - integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== +"@babel/plugin-transform-private-property-in-object@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz#f5d1fcad36e30c960134cb479f1ca98a5b06eda5" + integrity sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-transform-property-literals@^7.24.1": @@ -1048,12 +1043,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-typeof-symbol@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" - integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== +"@babel/plugin-transform-typeof-symbol@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz#703cace5ef74155fb5eecab63cbfc39bdd25fe12" + integrity sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-unicode-escapes@^7.24.1": version "7.24.1" @@ -1087,15 +1082,15 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b" - integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.5.tgz#6a9ac90bd5a5a9dae502af60dfc58c190551bbcd" + integrity sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ== dependencies: "@babel/compat-data" "^7.24.4" "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" @@ -1122,12 +1117,12 @@ "@babel/plugin-transform-async-generator-functions" "^7.24.3" "@babel/plugin-transform-async-to-generator" "^7.24.1" "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.4" + "@babel/plugin-transform-block-scoping" "^7.24.5" "@babel/plugin-transform-class-properties" "^7.24.1" "@babel/plugin-transform-class-static-block" "^7.24.4" - "@babel/plugin-transform-classes" "^7.24.1" + "@babel/plugin-transform-classes" "^7.24.5" "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.1" + "@babel/plugin-transform-destructuring" "^7.24.5" "@babel/plugin-transform-dotall-regex" "^7.24.1" "@babel/plugin-transform-duplicate-keys" "^7.24.1" "@babel/plugin-transform-dynamic-import" "^7.24.1" @@ -1147,13 +1142,13 @@ "@babel/plugin-transform-new-target" "^7.24.1" "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.1" + "@babel/plugin-transform-object-rest-spread" "^7.24.5" "@babel/plugin-transform-object-super" "^7.24.1" "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.1" - "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-optional-chaining" "^7.24.5" + "@babel/plugin-transform-parameters" "^7.24.5" "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.1" + "@babel/plugin-transform-private-property-in-object" "^7.24.5" "@babel/plugin-transform-property-literals" "^7.24.1" "@babel/plugin-transform-regenerator" "^7.24.1" "@babel/plugin-transform-reserved-words" "^7.24.1" @@ -1161,7 +1156,7 @@ "@babel/plugin-transform-spread" "^7.24.1" "@babel/plugin-transform-sticky-regex" "^7.24.1" "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.1" + "@babel/plugin-transform-typeof-symbol" "^7.24.5" "@babel/plugin-transform-unicode-escapes" "^7.24.1" "@babel/plugin-transform-unicode-property-regex" "^7.24.1" "@babel/plugin-transform-unicode-regex" "^7.24.1" @@ -1200,9 +1195,9 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" + integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== dependencies: regenerator-runtime "^0.14.0" @@ -1215,29 +1210,29 @@ "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.24.1", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" - integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.24.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" + integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== dependencies: - "@babel/code-frame" "^7.24.1" - "@babel/generator" "^7.24.1" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/types" "^7.24.5" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" - integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -2095,9 +2090,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.56.7" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.7.tgz#c33b5b5a9cfb66881beb7b5be6c34aa3e81d3366" - integrity sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA== + version "8.56.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" + integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2235,9 +2230,9 @@ "@types/node" "*" "@types/node@*": - version "20.12.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.5.tgz#74c4f31ab17955d0b5808cdc8fd2839526ad00b3" - integrity sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw== + version "20.12.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.10.tgz#8f0c3f12b0f075eee1fe20c1afb417e9765bef76" + integrity sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw== dependencies: undici-types "~5.26.4" @@ -2262,9 +2257,9 @@ integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== "@types/qs@*": - version "6.9.14" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.14.tgz#169e142bfe493895287bee382af6039795e9b75b" - integrity sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA== + version "6.9.15" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" + integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== "@types/range-parser@*": version "1.2.7" @@ -2651,14 +2646,14 @@ ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + version "8.13.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" + integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" + uri-js "^4.4.1" ansi-escapes@^3.2.0: version "3.2.0" @@ -3064,12 +3059,12 @@ babel-plugin-lodash@^3.3.4: require-package-name "^2.0.1" babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.10" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" - integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: @@ -3081,11 +3076,11 @@ babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: core-js-compat "^3.36.1" babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" - integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -3399,9 +3394,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001587: - version "1.0.30001607" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001607.tgz#b91e8e033f6bca4e13d3d45388d87fa88931d9a5" - integrity sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w== + version "1.0.30001616" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz#4342712750d35f71ebba9fcac65e2cf8870013c3" + integrity sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw== caseless@~0.12.0: version "0.12.0" @@ -3476,9 +3471,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + version "1.3.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" + integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== class-utils@^0.3.5: version "0.3.6" @@ -3747,9 +3742,9 @@ copy-webpack-plugin@^11.0.0: serialize-javascript "^6.0.0" core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.36.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8" - integrity sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA== + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" + integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== dependencies: browserslist "^4.23.0" @@ -3976,7 +3971,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -4179,16 +4174,16 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== ejs@^3.1.6: - version "3.1.9" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" - integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== dependencies: jake "^10.8.5" electron-to-chromium@^1.4.668: - version "1.4.729" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz#8477d21e2a50993781950885b2731d92ad532c00" - integrity sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA== + version "1.4.757" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz#45f7c9341b538f8c4b9ca8af9692e0ed1a776a44" + integrity sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw== emittery@^0.10.2: version "0.10.2" @@ -4253,9 +4248,9 @@ env-paths@^2.2.0: integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: - version "7.12.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.12.0.tgz#b56723b39c2053d67ea5714f026d05d4f5cc7acd" - integrity sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg== + version "7.13.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31" + integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q== err-code@^2.0.2: version "2.0.3" @@ -4269,7 +4264,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== @@ -4334,13 +4329,13 @@ es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: - version "1.0.18" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" - integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.23.0" + es-abstract "^1.23.3" es-errors "^1.3.0" es-set-tostringtag "^2.0.3" function-bind "^1.1.2" @@ -4354,9 +4349,9 @@ es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.0.tgz#4878fee3789ad99e065f975fdd3c645529ff0236" - integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw== + version "1.5.2" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.2.tgz#00b423304f2500ac59359cc9b6844951f372d497" + integrity sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA== es-object-atoms@^1.0.0: version "1.0.0" @@ -4390,7 +4385,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.1.1: +escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== @@ -4515,9 +4510,9 @@ eslint-plugin-prettier@^4.0.0: prettier-linter-helpers "^1.0.0" eslint-plugin-react-hooks@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.23.2: version "7.34.1" @@ -5204,9 +5199,9 @@ fs-minipass@^2.0.0: minipass "^3.0.0" fs-monkey@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" - integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== + version "1.0.6" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" + integrity sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg== fs-readdir-recursive@^1.1.0: version "1.1.0" @@ -5443,11 +5438,12 @@ globals@^13.19.0: type-fest "^0.20.2" globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@^11.1.0: version "11.1.0" @@ -6046,9 +6042,9 @@ ipaddr.js@1.9.1: integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== is-accessor-descriptor@^1.0.1: version "1.0.1" @@ -6325,11 +6321,6 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -6509,9 +6500,9 @@ iterator.prototype@^1.1.2: set-function-name "^2.0.1" jake@^10.8.5: - version "10.8.7" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" - integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + version "10.9.1" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.1.tgz#8dc96b7fcc41cb19aa502af506da4e1d56f5e62b" + integrity sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w== dependencies: async "^3.2.3" chalk "^4.0.2" @@ -8281,16 +8272,16 @@ optionator@^0.8.2: word-wrap "~1.2.3" optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" os-locale@^3.0.0: version "3.1.0" @@ -8861,12 +8852,12 @@ react-copy-to-clipboard@^5.0.3: prop-types "^15.8.1" react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" react-hotkeys@^2.0.0: version "2.0.0" @@ -8875,10 +8866,10 @@ react-hotkeys@^2.0.0: dependencies: prop-types "^15.6.1" -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-is@^16.13.1: version "16.13.1" @@ -8925,13 +8916,13 @@ react-shallow-renderer@^16.15.0: integrity sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw== react-test-renderer@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.2.0.tgz#1dd912bd908ff26da5b9fca4fd1c489b9523d37e" - integrity sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.3.1.tgz#e693608a1f96283400d4a3afead6893f958b80b4" + integrity sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA== dependencies: - react-is "^18.2.0" + react-is "^18.3.1" react-shallow-renderer "^16.15.0" - scheduler "^0.23.0" + scheduler "^0.23.2" react-toastify@^9.0.4: version "9.1.3" @@ -8951,9 +8942,9 @@ react-transition-group@^4.4.1: prop-types "^15.6.2" react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" @@ -9401,9 +9392,9 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.74.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.74.1.tgz#686fc227d3707dd25cb2925e1db8e4562be29319" - integrity sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA== + version "1.77.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.0.tgz#e736c69aff9fae4a4e6dae60a979eee9c942f321" + integrity sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9414,10 +9405,10 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" @@ -9738,9 +9729,9 @@ socks-proxy-agent@^6.0.0: socks "^2.6.2" socks@^2.6.2: - version "2.8.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.1.tgz#22c7d9dd7882649043cba0eafb49ae144e3457af" - integrity sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ== + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== dependencies: ip-address "^9.0.5" smart-buffer "^4.2.0" @@ -10247,9 +10238,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.30.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.3.tgz#f1bb68ded42408c316b548e3ec2526d7dd03f4d2" - integrity sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA== + version "5.31.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1" + integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10698,14 +10689,14 @@ upath@^1.2.0: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + version "1.0.15" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz#60ed9f8cba4a728b7ecf7356f641a31e3a691d97" + integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== dependencies: - escalade "^3.1.1" + escalade "^3.1.2" picocolors "^1.0.0" -uri-js@^4.2.2: +uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== @@ -10853,9 +10844,9 @@ webidl-conversions@^4.0.2: integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webpack-bundle-analyzer@^4.4.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" - integrity sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== + version "4.10.2" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" + integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== dependencies: "@discoveryjs/json-ext" "0.5.7" acorn "^8.0.4" @@ -10865,7 +10856,6 @@ webpack-bundle-analyzer@^4.4.1: escape-string-regexp "^4.0.0" gzip-size "^6.0.0" html-escaper "^2.0.2" - is-plain-object "^5.0.0" opener "^1.5.2" picocolors "^1.0.0" sirv "^2.0.3" @@ -11118,7 +11108,7 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -word-wrap@~1.2.3: +word-wrap@^1.2.5, word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== @@ -11335,9 +11325,9 @@ ws@^7.3.1: integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.13.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== xhr@^2.0.1: version "2.6.0" From c10ab29ba3c0c45f158cc585de8baef658056979 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Fri, 10 May 2024 11:32:34 +0200 Subject: [PATCH 510/825] Update to Camel 4.6.0 https://camel.apache.org/blog/2024/05/RELEASE-4.6.0/ See gh-1465 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 30c60d88e2..3b8d72d8dd 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -832,7 +832,7 @@ initializr: - compatibilityRange: "[3.0.0,3.2.0-M1)" version: 4.2.0 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" - version: 4.5.0 + version: 4.6.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From 7888dac5502dbc6f16bc5d6bc3a25a24c08be4d4 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 13 May 2024 08:49:03 +0200 Subject: [PATCH 511/825] Update to Spring Cloud Azure 5.12.0 Closes gh-1464 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3b8d72d8dd..41430d47a9 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -107,7 +107,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 5.11.0 + version: 5.12.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From a2ced1fc5d5d124af6e544d30383020974416542 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 13 May 2024 15:59:14 +0300 Subject: [PATCH 512/825] Upgrade to Vaadin 24.3.12 See gh-1466 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 41430d47a9..57767d4baf 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -165,7 +165,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 24.3.11 + version: 24.3.12 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From f1caea33fd0d1919d1c8b8d9a368f542f4942592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Tue, 14 May 2024 12:27:22 +0200 Subject: [PATCH 513/825] Upgrade Timefold Solver to 1.10.0 See gh-1467 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 57767d4baf..94298f9998 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -158,7 +158,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.0.0,3.3.0-M1)" - version: 1.9.0 + version: 1.10.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From 5bfce474d6bb806b2f29616ca1b6dae72557437f Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 21 May 2024 10:20:06 +0200 Subject: [PATCH 514/825] Update to Maven Wrapper 3.3.1 Closes gh-1472 --- .mvn/wrapper/maven-wrapper.jar | Bin 62547 -> 0 bytes .mvn/wrapper/maven-wrapper.properties | 18 +- mvnw | 411 +++++++++++--------------- mvnw.cmd | 300 ++++++++----------- 4 files changed, 308 insertions(+), 421 deletions(-) delete mode 100644 .mvn/wrapper/maven-wrapper.jar diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index cb28b0e37c7d206feb564310fdeec0927af4123a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62547 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 A?*IS* diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index e70e7bc8d6..a017f34111 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.1/maven-wrapper-3.3.1.jar diff --git a/mvnw b/mvnw index 66df285428..633bbb7498 100755 --- a/mvnw +++ b/mvnw @@ -8,7 +8,7 @@ # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # -# https://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an @@ -21,288 +21,219 @@ # ---------------------------------------------------------------------------- # Apache Maven Wrapper startup batch script, version 3.2.0 # -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# # Optional ENV vars # ----------------- -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /usr/local/etc/mavenrc ] ; then - . /usr/local/etc/mavenrc - fi - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false +# OS specific support. +native_path() { printf %s\\n "$1"; } case "$(uname)" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME - else - JAVA_HOME="/Library/Java/Home"; export JAVA_HOME - fi - fi - ;; +(CYGWIN*|MINGW*) [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } ;; esac -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=$(java-config --jre-home) - fi -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --unix "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --unix "$CLASSPATH") -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && - JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="$(which javac)" - if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=$(which readlink) - if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then - if $darwin ; then - javaHome="$(dirname "\"$javaExecutable\"")" - javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" - else - javaExecutable="$(readlink -f "\"$javaExecutable\"")" - fi - javaHome="$(dirname "\"$javaExecutable\"")" - javaHome=$(expr "$javaHome" : '\(.*\)/bin') - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" else JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ] ; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi fi else - JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi + JAVACMD="$('set' +e; 'unset' -f command 2>/dev/null; 'command' -v java)" || : + JAVACCMD="$('set' +e; 'unset' -f command 2>/dev/null; 'command' -v javac)" || : -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ] ; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi fi +} - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=$(cd "$wdir/.." || exit 1; pwd) - fi - # end of workaround +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + h=$(( ( h * 31 + $(LC_CTYPE=C printf %d "'$str") ) % 4294967296 )) + str="${str#?}" done - printf '%s' "$(cd "$basedir" || exit 1; pwd)" + printf %x\\n $h } -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - # Remove \r in case we run on Windows within Git Bash - # and check out the repository with auto CRLF management - # enabled. Otherwise, we may read lines that are delimited with - # \r\n and produce $'-Xarg\r' rather than -Xarg due to word - # splitting rules. - tr -s '\r\n' ' ' < "$1" - fi +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 } -log() { - if [ "$MVNW_VERBOSE" = true ]; then - printf '%s\n' "$1" - fi +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl="${value-}" ;; + distributionSha256Sum) distributionSha256Sum="${value-}" ;; + esac +done < "${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + + +case "${distributionUrl##*/}" in +(maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + (*AMD64:CYGWIN*|*AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + (:Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + (:Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + (:Linux*x86_64*) distributionPlatform=linux-amd64 ;; + (*) echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +(maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +(*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_HOME="$HOME/.m2/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" } -BASE_DIR=$(find_maven_basedir "$(dirname "$0")") -if [ -z "$BASE_DIR" ]; then - exit 1; +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" fi -MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR -log "$MAVEN_PROJECTBASEDIR" +case "${distributionUrl-}" in +(*?-bin.zip|*?maven-mvnd-?*-?*.zip) ;; +(*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" -if [ -r "$wrapperJarPath" ]; then - log "Found $wrapperJarPath" +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT else - log "Couldn't find $wrapperJarPath, downloading it ..." + die "cannot create temp dir" +fi - if [ -n "$MVNW_REPOURL" ]; then - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - else - wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - fi - while IFS="=" read -r key value; do - # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) - safeValue=$(echo "$value" | tr -d '\r') - case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; - esac - done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" - log "Downloading from: $wrapperUrl" +mkdir -p -- "${MAVEN_HOME%/*}" - if $cygwin; then - wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") - fi +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" - if command -v wget > /dev/null; then - log "Found wget ... using wget" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - else - wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - log "Found curl ... using curl" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - else - curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - fi - else - log "Falling back to using Java to download" - javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" - javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaSource=$(cygpath --path --windows "$javaSource") - javaClass=$(cygpath --path --windows "$javaClass") - fi - if [ -e "$javaSource" ]; then - if [ ! -e "$javaClass" ]; then - log " - Compiling MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/javac" "$javaSource") - fi - if [ -e "$javaClass" ]; then - log " - Running MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" - fi - fi - fi +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" fi -########################################################################################## -# End of extension -########################################################################################## -# If specified, validate the SHA-256 sum of the Maven wrapper jar file -wrapperSha256Sum="" -while IFS="=" read -r key value; do - case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; - esac -done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" -if [ -n "$wrapperSha256Sum" ]; then - wrapperSha256Result=false - if command -v sha256sum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then - wrapperSha256Result=true +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget > /dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl > /dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat > "$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( new java.net.URL( args[0] ).openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum > /dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c > /dev/null 2>&1; then + distributionSha256Result=true fi elif command -v shasum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then - wrapperSha256Result=true + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c > /dev/null 2>&1; then + distributionSha256Result=true fi else - echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." - echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 exit 1 fi - if [ $wrapperSha256Result = false ]; then - echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 - echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 - echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 exit 1 fi fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --windows "$CLASSPATH") - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +# unzip and move +if command -v unzip > /dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" fi +printf %s\\n "$distributionUrl" > "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -# shellcheck disable=SC2086 # safe args -exec "$JAVACMD" \ - $MAVEN_OPTS \ - $MAVEN_DEBUG_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd index 95ba6f54ac..97aaed6f41 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -1,3 +1,4 @@ +<# : batch portion @REM ---------------------------------------------------------------------------- @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @@ -7,7 +8,7 @@ @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM -@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @@ -20,186 +21,125 @@ @REM ---------------------------------------------------------------------------- @REM Apache Maven Wrapper startup batch script, version 3.2.0 @REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM @REM Optional ENV vars -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output @REM ---------------------------------------------------------------------------- -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* -if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %WRAPPER_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file -SET WRAPPER_SHA_256_SUM="" -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) ) -IF NOT %WRAPPER_SHA_256_SUM%=="" ( - powershell -Command "&{"^ - "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ - "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ - " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ - " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ - " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ - " exit 1;"^ - "}"^ - "}" - if ERRORLEVEL 1 goto error -) - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% ^ - %JVM_CONFIG_MAVEN_PROPS% ^ - %MAVEN_OPTS% ^ - %MAVEN_DEBUG_OPTS% ^ - -classpath %WRAPPER_JAR% ^ - "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ - %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" -if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%"=="on" pause - -if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% - -cmd /C exit /B %ERROR_CODE% +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" From 514c9a9dac9853189aaeb35be52976a5ff921071 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 21 May 2024 14:28:08 +0200 Subject: [PATCH 515/825] Fix Maven Wrapper See gh-1472 --- .mvn/wrapper/maven-wrapper.properties | 2 +- mvnw | 95 +++++++++++++++------------ mvnw.cmd | 3 +- 3 files changed, 56 insertions(+), 44 deletions(-) diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index a017f34111..fe378a151d 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -14,5 +14,5 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +wrapperVersion=3.3.1 distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.1/maven-wrapper-3.3.1.jar diff --git a/mvnw b/mvnw index 633bbb7498..ac8e247e1c 100755 --- a/mvnw +++ b/mvnw @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.2.0 +# Apache Maven Wrapper startup batch script, version 3.3.1 # # Optional ENV vars # ----------------- @@ -35,15 +35,17 @@ set -euf # OS specific support. native_path() { printf %s\\n "$1"; } case "$(uname)" in -(CYGWIN*|MINGW*) [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" - native_path() { cygpath --path --windows "$1"; } ;; +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; esac # set JAVACMD and JAVACCMD set_java_home() { # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched - if [ -n "${JAVA_HOME-}" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" JAVACCMD="$JAVA_HOME/jre/sh/javac" @@ -51,17 +53,25 @@ set_java_home() { JAVACMD="$JAVA_HOME/bin/java" JAVACCMD="$JAVA_HOME/bin/javac" - if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ] ; then + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 return 1 fi fi else - JAVACMD="$('set' +e; 'unset' -f command 2>/dev/null; 'command' -v java)" || : - JAVACCMD="$('set' +e; 'unset' -f command 2>/dev/null; 'command' -v javac)" || : - - if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ] ; then + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 return 1 fi @@ -72,7 +82,8 @@ set_java_home() { hash_string() { str="${1:-}" h=0 while [ -n "$str" ]; do - h=$(( ( h * 31 + $(LC_CTYPE=C printf %d "'$str") ) % 4294967296 )) + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) str="${str#?}" done printf %x\\n $h @@ -89,29 +100,29 @@ die() { # parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties while IFS="=" read -r key value; do case "${key-}" in - distributionUrl) distributionUrl="${value-}" ;; - distributionSha256Sum) distributionSha256Sum="${value-}" ;; + distributionUrl) distributionUrl="${value-}" ;; + distributionSha256Sum) distributionSha256Sum="${value-}" ;; esac -done < "${0%/*}/.mvn/wrapper/maven-wrapper.properties" +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" [ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" - case "${distributionUrl##*/}" in -(maven-mvnd-*bin.*) +maven-mvnd-*bin.*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in - (*AMD64:CYGWIN*|*AMD64:MINGW*) distributionPlatform=windows-amd64 ;; - (:Darwin*x86_64) distributionPlatform=darwin-amd64 ;; - (:Darwin*arm64) distributionPlatform=darwin-aarch64 ;; - (:Linux*x86_64*) distributionPlatform=linux-amd64 ;; - (*) echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 - distributionPlatform=linux-amd64 - ;; + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; esac distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" ;; -(maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; -(*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; esac # apply MVNW_REPOURL and calculate MAVEN_HOME @@ -133,8 +144,8 @@ if [ -d "$MAVEN_HOME" ]; then fi case "${distributionUrl-}" in -(*?-bin.zip|*?maven-mvnd-?*-?*.zip) ;; -(*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; esac # prepare tmp dir @@ -168,17 +179,17 @@ case "${MVNW_PASSWORD:+has-password}" in has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; esac -if [ -z "${MVNW_USERNAME-}" ] && command -v wget > /dev/null; then +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then verbose "Found wget ... using wget" - wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" -elif [ -z "${MVNW_USERNAME-}" ] && command -v curl > /dev/null; then + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then verbose "Found curl ... using curl" - curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" elif set_java_home; then verbose "Falling back to use Java to download" javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" - cat > "$javaSource" <<-END + cat >"$javaSource" <<-END public class Downloader extends java.net.Authenticator { protected java.net.PasswordAuthentication getPasswordAuthentication() @@ -188,13 +199,13 @@ elif set_java_home; then public static void main( String[] args ) throws Exception { setDefault( new Downloader() ); - java.nio.file.Files.copy( new java.net.URL( args[0] ).openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); } } END # For Cygwin/MinGW, switch paths to Windows format before running javac and java verbose " - Compiling Downloader.java ..." - "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" verbose " - Running Downloader.java ..." "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" fi @@ -206,12 +217,12 @@ if [ -n "${distributionSha256Sum-}" ]; then echo "Checksum validation is not supported for maven-mvnd." >&2 echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 exit 1 - elif command -v sha256sum > /dev/null; then - if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c > /dev/null 2>&1; then + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then distributionSha256Result=true fi - elif command -v shasum > /dev/null; then - if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c > /dev/null 2>&1; then + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then distributionSha256Result=true fi else @@ -227,12 +238,12 @@ if [ -n "${distributionSha256Sum-}" ]; then fi # unzip and move -if command -v unzip > /dev/null; then - unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" else - tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" fi -printf %s\\n "$distributionUrl" > "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" clean || : diff --git a/mvnw.cmd b/mvnw.cmd index 97aaed6f41..7b0c0943b2 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -19,7 +19,7 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM Apache Maven Wrapper startup batch script, version 3.3.1 @REM @REM Optional ENV vars @REM MVNW_REPOURL - repo url base for downloading maven distribution @@ -123,6 +123,7 @@ if ($distributionSha256Sum) { if ($USE_MVND) { Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." } From 324a96ac5c681d722a1aa96ccea727b1faeabae2 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 22 May 2024 09:40:27 +0200 Subject: [PATCH 516/825] Set Java to 21 when using Kotlin Closes gh-1473 --- .../JavaVersionProjectDescriptionCustomizer.java | 15 ++++++++++++++- ...aVersionProjectDescriptionCustomizerTests.java | 12 ++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index 872621b40d..2b102eefc6 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -60,7 +60,7 @@ public void customize(MutableProjectDescription description) { } if (javaGeneration == 21) { // Kotlin 1.9.20 is required - if (description.getLanguage() instanceof KotlinLanguage && !KOTLIN_1_9_20_OR_LATER.match(platformVersion)) { + if (isKotlin(description) && !KOTLIN_1_9_20_OR_LATER.match(platformVersion)) { updateTo(description, "17"); } } @@ -69,9 +69,22 @@ public void customize(MutableProjectDescription description) { if (!SPRING_BOOT_3_2_4_OR_LATER.match(platformVersion)) { updateTo(description, "21"); } + if (isKotlin(description)) { + if (KOTLIN_1_9_20_OR_LATER.match(platformVersion)) { + // Kotlin 1.9.x doesn't support Java 22 + updateTo(description, "21"); + } + else { + updateTo(description, "17"); + } + } } } + private boolean isKotlin(MutableProjectDescription description) { + return description.getLanguage() instanceof KotlinLanguage; + } + private void updateTo(MutableProjectDescription description, String jvmVersion) { Language language = Language.forId(description.getLanguage().id(), jvmVersion); description.setLanguage(language); diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index d0cd5b19fa..c350e8c9a8 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -71,6 +71,11 @@ void java22IsNotSupportedWithBoot323() { assertThat(mavenPom(javaProject("22", "3.2.3"))).hasProperty("java.version", "21"); } + @Test + void java22IsNotSupportedWithKotlin() { + assertThat(mavenPom(kotlinProject("22", "3.2.5"))).hasProperty("java.version", "21"); + } + static Stream supportedMavenParameters() { return Stream.concat(supportedJavaParameters(), Stream.concat(supportedKotlinParameters(), supportedGroovyParameters())); @@ -81,13 +86,12 @@ static Stream supportedGradleGroovyParameters() { } private static Stream supportedJavaParameters() { - return Stream.of(java("17", "3.1.0"), java("21", "3.1.0"), java("21", "3.2.0"), java("22", "3.2.4"), - java("21", "3.3.0-M2"), java("22", "3.3.0-M3")); + return Stream.of(java("17", "3.1.0"), java("21", "3.1.0"), java("17", "3.2.0"), java("21", "3.2.0"), + java("22", "3.2.4"), java("17", "3.3.0-RC1"), java("21", "3.3.0-RC1"), java("22", "3.3.0-RC1")); } private static Stream supportedKotlinParameters() { - return Stream.of(kotlin("17", "3.1.0"), kotlin("21", "3.2.0-RC2"), kotlin("22", "3.2.4"), - kotlin("21", "3.3.0-M2"), kotlin("22", "3.3.0-M3")); + return Stream.of(kotlin("17", "3.1.0"), kotlin("21", "3.2.0"), kotlin("21", "3.3.0-M2")); } private static Stream supportedGroovyParameters() { From 0eed512b22737ecf8a1881ea6705ab20fdf06eff Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 23 May 2024 08:37:20 +0200 Subject: [PATCH 517/825] Prepare for the removal of Spring Boot 3.1.x See gh-1474 --- .../site/support/StartInitializrMetadataUpdateStrategy.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java index 5fa8ffb738..05ff13c904 100644 --- a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java +++ b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java @@ -32,9 +32,12 @@ * versions available on spring.io. * * @author Stephane Nicoll + * @author Moritz Halbritter */ public class StartInitializrMetadataUpdateStrategy extends SpringIoInitializrMetadataUpdateStrategy { + private static final Version MINIMUM_BOOT_VERSION = Version.parse("3.1.0"); + public StartInitializrMetadataUpdateStrategy(RestTemplate restTemplate, ObjectMapper objectMapper) { super(restTemplate, objectMapper); } @@ -48,7 +51,7 @@ protected List fetchSpringBootVersions(String url) { private boolean isCompatibleVersion(DefaultMetadataElement versionMetadata) { Version version = Version.parse(versionMetadata.getId()); - return (version.getMajor() >= 3 && version.getMinor() >= 1); + return version.compareTo(MINIMUM_BOOT_VERSION) >= 0; } } From 412e1f8f08edf363a91e167edf7ef19f00c9a4ec Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 23 May 2024 08:44:05 +0200 Subject: [PATCH 518/825] Adapt to initializr package name cleanup changes See https://github.com/spring-io/initializr/issues/1339 --- .../InvalidPackageNameHelpDocumentCustomizerTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java index b81679ec08..3b62ae1923 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java @@ -33,7 +33,7 @@ class InvalidPackageNameHelpDocumentCustomizerTests extends AbstractExtensionTes void warningAddedWithInvalidPackageName() { assertHelpDocument("com.my-invalid-package").lines() .containsSubsequence("# Read Me First", - "* The original package name 'com.my-invalid-package' is invalid and this project uses 'com.myinvalidpackage' instead."); + "* The original package name 'com.my-invalid-package' is invalid and this project uses 'com.my_invalid_package' instead."); } @Test From a4df578809a8cb53e822581686e100e88352d462 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Thu, 23 May 2024 15:59:57 +0200 Subject: [PATCH 519/825] Add Netflix DGS starter Closes gh-720 --- start-site/src/main/resources/application.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 94298f9998..5946a8bd30 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -48,6 +48,13 @@ initializr: mappings: - compatibilityRange: "[3.1.0,3.3.0-M1)" version: 3.2.3 + netflix-dgs: + groupId: com.netflix.graphql.dgs + artifactId: graphql-dgs-platform-dependencies + versionProperty: netflix-dgs.version + mappings: + - compatibilityRange: "[3.1.0,3.3.0-M1)" + version: 8.6.1 hilla: groupId: dev.hilla artifactId: hilla-bom @@ -370,6 +377,16 @@ initializr: description: Next Steps with Hilla - rel: reference href: https://hilla.dev/ + - name: Netflix DGS + id: netflix-dgs + groupId: com.netflix.graphql.dgs + artifactId: graphql-dgs-spring-graphql-starter + description: Build GraphQL applications with Netflix DGS and Spring for GraphQL. + compatibilityRange: "[3.0.0,3.3.0-M1)" + bom: netflix-dgs + links: + - rel: reference + href: https://netflix.github.io/dgs/ - name: Template Engines content: - name: Thymeleaf From e12b267aedad9ccf0d7a978aee9ebd3a766c886d Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Thu, 23 May 2024 16:02:14 +0200 Subject: [PATCH 520/825] Upgrade to DGS codegen 6.2.1 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 5946a8bd30..f861044251 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -193,7 +193,7 @@ initializr: artifactId: graphql-dgs-codegen-gradle mappings: - compatibilityRange: "3.0.0-M1" - version: 6.0.3 + version: 6.2.1 description: Generate data types and type-safe APIs for querying GraphQL APIs by parsing schema files. starter: false - name: Spring Boot DevTools From ddb9dc282a7e04f191eeabaae56f185c22897373 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 23 May 2024 16:20:12 +0200 Subject: [PATCH 521/825] Set minimum Spring Boot version to 3.2.0 See gh-1474 --- ...StartInitializrMetadataUpdateStrategy.java | 2 +- ...InitializrMetadataUpdateStrategyTests.java | 9 +- .../metadata/springio/spring-boot.json | 129 ++++++++---------- 3 files changed, 63 insertions(+), 77 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java index 05ff13c904..b3c9019eb4 100644 --- a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java +++ b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java @@ -36,7 +36,7 @@ */ public class StartInitializrMetadataUpdateStrategy extends SpringIoInitializrMetadataUpdateStrategy { - private static final Version MINIMUM_BOOT_VERSION = Version.parse("3.1.0"); + private static final Version MINIMUM_BOOT_VERSION = Version.parse("3.2.0"); public StartInitializrMetadataUpdateStrategy(RestTemplate restTemplate, ObjectMapper objectMapper) { super(restTemplate, objectMapper); diff --git a/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java b/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java index 5b0b8d4624..de8b309fc8 100644 --- a/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java +++ b/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java @@ -70,10 +70,11 @@ void eolVersionsAreRemoved() { InitializrMetadata updatedMetadata = provider.update(metadata); assertThat(updatedMetadata.getBootVersions()).isNotNull(); List updatedBootVersions = updatedMetadata.getBootVersions().getContent(); - assertThat(updatedBootVersions).hasSize(3); - assertBootVersion(updatedBootVersions.get(0), "3.2.0 (SNAPSHOT)", false); - assertBootVersion(updatedBootVersions.get(1), "3.1.6 (SNAPSHOT)", false); - assertBootVersion(updatedBootVersions.get(2), "3.1.5", true); + assertThat(updatedBootVersions).hasSize(4); + assertBootVersion(updatedBootVersions.get(0), "3.3.0 (SNAPSHOT)", false); + assertBootVersion(updatedBootVersions.get(1), "3.3.0 (RC1)", false); + assertBootVersion(updatedBootVersions.get(2), "3.2.7 (SNAPSHOT)", false); + assertBootVersion(updatedBootVersions.get(3), "3.2.6", true); } @Test diff --git a/start-site/src/test/resources/metadata/springio/spring-boot.json b/start-site/src/test/resources/metadata/springio/spring-boot.json index 22574f8a66..8d3dbcd206 100644 --- a/start-site/src/test/resources/metadata/springio/spring-boot.json +++ b/start-site/src/test/resources/metadata/springio/spring-boot.json @@ -2,133 +2,118 @@ "_embedded": { "releases": [ { - "version": "3.2.0-SNAPSHOT", - "status": "SNAPSHOT", + "version": "3.1.12", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/reference/html/", + "status": "GENERAL_AVAILABILITY", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/3.2.0-SNAPSHOT/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/3.2.0-SNAPSHOT/api/", "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/3.2.0-SNAPSHOT" - }, "repository": { - "href": "https://spring.io/api/repositories/spring-snapshots" + "href": "https://api.spring.io/repositories/spring-releases" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.1.12" } } }, { - "version": "3.1.6-SNAPSHOT", - "status": "SNAPSHOT", + "version": "3.0.13", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/reference/html/", + "status": "GENERAL_AVAILABILITY", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/3.1.6-SNAPSHOT/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/3.1.6-SNAPSHOT/api/", "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/3.1.6-SNAPSHOT" - }, "repository": { - "href": "https://spring.io/api/repositories/spring-snapshots" + "href": "https://api.spring.io/repositories/spring-releases" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.0.13" } } }, { - "version": "3.1.5", + "version": "2.7.18", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/reference/html/", "status": "GENERAL_AVAILABILITY", - "current": true, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/current/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/current/api/", + "current": false, "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/3.1.5" - }, "repository": { - "href": "https://spring.io/api/repositories/spring-releases" + "href": "https://api.spring.io/repositories/spring-releases" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/2.7.18" } } }, { - "version": "3.0.13-SNAPSHOT", + "version": "3.3.0-SNAPSHOT", + "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java", + "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}", "status": "SNAPSHOT", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/3.0.13-SNAPSHOT/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/3.0.13-SNAPSHOT/api/", "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/3.0.13-SNAPSHOT" - }, "repository": { - "href": "https://spring.io/api/repositories/spring-snapshots" + "href": "https://api.spring.io/repositories/spring-snapshots" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.3.0-SNAPSHOT" } } }, { - "version": "3.0.12", - "status": "GENERAL_AVAILABILITY", + "version": "3.3.0-RC1", + "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java", + "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}", + "status": "PRERELEASE", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/current/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/current/api/", "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/3.0.12" - }, "repository": { - "href": "https://spring.io/api/repositories/spring-releases" + "href": "https://api.spring.io/repositories/spring-milestones" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.3.0-RC1" } } }, { - "version": "2.7.17-SNAPSHOT", + "version": "3.2.7-SNAPSHOT", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/reference/html/", "status": "SNAPSHOT", "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.17-SNAPSHOT/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.17-SNAPSHOT/api/", "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/2.7.17-SNAPSHOT" - }, "repository": { - "href": "https://spring.io/api/repositories/spring-snapshots" - } - } - }, - { - "version": "2.7.16", - "status": "GENERAL_AVAILABILITY", - "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.16/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/2.7.16/api/", - "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/2.7.16" + "href": "https://api.spring.io/repositories/spring-snapshots" }, - "repository": { - "href": "https://spring.io/api/repositories/spring-releases" + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.2.7-SNAPSHOT" } } }, { - "version": "2.6.14", + "version": "3.2.6", + "apiDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/api/", + "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/reference/html/", "status": "GENERAL_AVAILABILITY", - "current": false, - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/2.6.14/reference/html/", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/2.6.14/api/", + "current": true, "_links": { - "self": { - "href": "https://spring.io/api/projects/spring-boot/releases/2.6.14" - }, "repository": { - "href": "https://spring.io/api/repositories/spring-releases" + "href": "https://api.spring.io/repositories/spring-releases" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.2.6" } } } ] }, "_links": { - "current": { - "href": "https://spring.io/api/projects/spring-boot/releases/current" - }, "project": { - "href": "https://spring.io/api/projects/spring-boot" + "href": "https://api.spring.io/projects/spring-boot" + }, + "current": { + "href": "https://api.spring.io/projects/spring-boot/releases/current" } } } From 45fc5f7b3bb0efba76fb6d784c58e35537cd3504 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 24 May 2024 09:21:04 +0200 Subject: [PATCH 522/825] Fix tests by pinning Spring Boot version Those tests have been broken by the Spring Boot 3.3.0 release. --- .../PgVectorProjectGenerationConfigurationTests.java | 5 +++++ .../dependency/solace/SolaceBinderBuildCustomizerTests.java | 6 ++++++ .../SpringCloudFunctionHelpDocumentCustomizerTests.java | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java index 35db1c1fb4..a8f8be1041 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java @@ -33,9 +33,12 @@ */ class PgVectorProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final String BOOT_VERSION = "3.2.6"; + @Test void doesNothingWithoutDockerCompose() { ProjectRequest request = createProjectRequest("web", "spring-ai-vectordb-pgvector"); + request.setBootVersion(BOOT_VERSION); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @@ -43,12 +46,14 @@ void doesNothingWithoutDockerCompose() { @Test void createsPostgresService() { ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-pgvector"); + request.setBootVersion(BOOT_VERSION); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pgvector.yaml")); } @Test void shouldOnlyHavePgVectorIfPostgresAndPgVectorIsSelected() { ProjectRequest request = createProjectRequest("docker-compose", "postgresql", "spring-ai-vectordb-pgvector"); + request.setBootVersion(BOOT_VERSION); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pgvector.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java index 4f94242023..decdbcb3c8 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java @@ -31,6 +31,8 @@ */ class SolaceBinderBuildCustomizerTests extends AbstractExtensionTests { + private static final String BOOT_VERSION = "3.2.6"; + @Test void binderNotAddedWhenSolaceNotSelected() { ProjectStructure project = generateProject(createProjectRequest("cloud-stream")); @@ -40,6 +42,7 @@ void binderNotAddedWhenSolaceNotSelected() { @Test void binderNotAddedWhenCloudStreamNotSelected() { ProjectRequest request = createProjectRequest("solace"); + request.setBootVersion(BOOT_VERSION); ProjectStructure project = generateProject(request); assertNoBinder(project); assertThat(project).mavenBuild().hasDependency(getDependency("solace")); @@ -48,6 +51,7 @@ void binderNotAddedWhenCloudStreamNotSelected() { @Test void binderAddedWhenSolaceAndCloudStreamSelected() { ProjectRequest request = createProjectRequest("solace", "cloud-stream"); + request.setBootVersion(BOOT_VERSION); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("com.solace.spring.cloud", "spring-cloud-starter-stream-solace"); } @@ -55,6 +59,7 @@ void binderAddedWhenSolaceAndCloudStreamSelected() { @Test void bomAddedWhenSolaceAndCloudStreamSelected() { ProjectRequest request = createProjectRequest("solace", "cloud-stream"); + request.setBootVersion(BOOT_VERSION); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasBom("com.solace.spring.cloud", "solace-spring-cloud-bom", "${solace-spring-cloud.version}"); @@ -73,6 +78,7 @@ void bomPropertyAddedWhenSolaceAndCloudStreamSelected() { @Test void solaceStarterRemovedWhenSolaceAndCloudStreamSelected() { ProjectRequest request = createProjectRequest("solace", "cloud-stream"); + request.setBootVersion(BOOT_VERSION); ProjectStructure project = generateProject(request); Dependency solace = getDependency("solace"); assertThat(project).mavenBuild().doesNotHaveDependency(solace.getGroupId(), solace.getArtifactId()); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java index 56f24e45b3..305a26645e 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java @@ -33,9 +33,12 @@ class SpringCloudFunctionHelpDocumentCustomizerTests extends AbstractExtensionTe private static final String AZURE_SECTION_TITLE = "## Running Spring Cloud Function applications on Microsoft Azure"; + private static final String BOOT_VERSION = "3.2.6"; + @Test void functionBuildSetupInfoSectionAddedForMaven() { ProjectRequest request = createProjectRequest(); + request.setBootVersion(BOOT_VERSION); request.setType("maven-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); @@ -44,6 +47,7 @@ void functionBuildSetupInfoSectionAddedForMaven() { @Test void functionBuildSetupInfoSectionAddedForGradle() { ProjectRequest request = createProjectRequest(); + request.setBootVersion(BOOT_VERSION); request.setType("gradle-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); From 7b8ac806da721816d1415bb7c86c5d8dfb0150ea Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 24 May 2024 09:56:53 +0200 Subject: [PATCH 523/825] Clean up application configuration and code See gh-1474 --- .../PaketoBuilderBuildCustomizer.java | 47 ------- ...BuilderGroovyDslGradleBuildCustomizer.java | 33 ----- ...BuilderKotlinDslGradleBuildCustomizer.java | 33 ----- .../PaketoBuilderMavenBuildCustomizer.java | 36 ------ ...ingBootProjectGenerationConfiguration.java | 21 ---- .../SpringPulsarBinderBuildCustomizer.java | 52 -------- ...gPulsarProjectGenerationConfiguration.java | 9 -- start-site/src/main/resources/application.yml | 43 +------ ...otProjectGenerationConfigurationTests.java | 48 ------- ...loudContractMavenBuildCustomizerTests.java | 22 ++-- ...SpringCloudStreamBuildCustomizerTests.java | 2 +- ...arProjectGenerationConfigurationTests.java | 100 ++------------- ...rsProjectGenerationConfigurationTests.java | 118 ++++++++---------- 13 files changed, 79 insertions(+), 485 deletions(-) delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderBuildCustomizer.java delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderGroovyDslGradleBuildCustomizer.java delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderKotlinDslGradleBuildCustomizer.java delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderMavenBuildCustomizer.java delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizer.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderBuildCustomizer.java deleted file mode 100644 index b09cd3c636..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderBuildCustomizer.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springboot; - -import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.spring.build.BuildCustomizer; - -/** - * {@link BuildCustomizer} base implementation for Paketo Builder. - * - * @param the type of build - * @author Stephane Nicoll - */ -abstract class PaketoBuilderBuildCustomizer implements BuildCustomizer { - - static final String BASE_IMAGE_BUILDER = "paketobuildpacks/builder-jammy-base:latest"; - - static final String TINY_IMAGE_BUILDER = "paketobuildpacks/builder-jammy-tiny:latest"; - - @Override - public void customize(B build) { - String builder = (build.dependencies().has("native")) ? TINY_IMAGE_BUILDER : BASE_IMAGE_BUILDER; - customize(build, builder); - } - - /** - * Customize the build with the specified image builder. - * @param build the build to customize - * @param imageBuilder the image builder to use - */ - protected abstract void customize(B build, String imageBuilder); - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderGroovyDslGradleBuildCustomizer.java deleted file mode 100644 index a5bdb4f796..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderGroovyDslGradleBuildCustomizer.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springboot; - -import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; - -/** - * {@link PaketoBuilderBuildCustomizer} for Gradle with the Groovy DSL. - * - * @author Stephane Nicoll - */ -class PaketoBuilderGroovyDslGradleBuildCustomizer extends PaketoBuilderBuildCustomizer { - - @Override - protected void customize(GradleBuild build, String imageBuilder) { - build.tasks().customize("bootBuildImage", (task) -> task.attribute("builder", "'" + imageBuilder + "'")); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderKotlinDslGradleBuildCustomizer.java deleted file mode 100644 index 2291c78b84..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderKotlinDslGradleBuildCustomizer.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springboot; - -import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; - -/** - * {@link PaketoBuilderBuildCustomizer} for Gradle with the Kotlin DSL. - * - * @author Stephane Nicoll - */ -class PaketoBuilderKotlinDslGradleBuildCustomizer extends PaketoBuilderBuildCustomizer { - - @Override - protected void customize(GradleBuild build, String imageBuilder) { - build.tasks().customize("bootBuildImage", (task) -> task.invoke("builder.set", "\"" + imageBuilder + "\"")); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderMavenBuildCustomizer.java deleted file mode 100644 index eb3421652d..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/PaketoBuilderMavenBuildCustomizer.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springboot; - -import io.spring.initializr.generator.buildsystem.maven.MavenBuild; - -/** - * {@link PaketoBuilderBuildCustomizer} for Maven. - * - * @author Stephane Nicoll - */ -class PaketoBuilderMavenBuildCustomizer extends PaketoBuilderBuildCustomizer { - - @Override - protected void customize(MavenBuild build, String imageBuilder) { - build.plugins() - .add("org.springframework.boot", "spring-boot-maven-plugin", - (plugin) -> plugin.configuration((configuration) -> configuration.add("image", - (imageConfiguration) -> imageConfiguration.add("builder", imageBuilder)))); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java index 5e37b1691f..6d24a1a40c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java @@ -19,7 +19,6 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.gradle.DevelopmentOnlyDependencyGradleBuildCustomizer; @@ -45,12 +44,6 @@ class SpringBootProjectGenerationConfiguration { @ConditionalOnBuildSystem(MavenBuildSystem.ID) static class MavenConfiguration { - @Bean - @ConditionalOnPlatformVersion("[2.0.0,3.2.0-M1)") - PaketoBuilderMavenBuildCustomizer paketoBuilderMavenBuildCustomizer() { - return new PaketoBuilderMavenBuildCustomizer(); - } - @Bean @ConditionalOnRequestedDependency(DEVTOOLS_ID) OptionalDependencyMavenBuildCustomizer devToolsMavenBuildCustomizer() { @@ -69,20 +62,6 @@ OptionalDependencyMavenBuildCustomizer dockerComposeMavenBuildCustomizer() { @ConditionalOnBuildSystem(GradleBuildSystem.ID) static class GradleConfiguration { - @Bean - @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) - @ConditionalOnPlatformVersion("[2.0.0,3.2.0-M1)") - PaketoBuilderGroovyDslGradleBuildCustomizer paketoBuilderGroovyDslGradleBuildCustomizer() { - return new PaketoBuilderGroovyDslGradleBuildCustomizer(); - } - - @Bean - @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) - @ConditionalOnPlatformVersion("[2.0.0,3.2.0-M1)") - PaketoBuilderKotlinDslGradleBuildCustomizer paketoBuilderKotlinDslGradleBuildCustomizer() { - return new PaketoBuilderKotlinDslGradleBuildCustomizer(); - } - @Bean @ConditionalOnRequestedDependency(DEVTOOLS_ID) DevelopmentOnlyDependencyGradleBuildCustomizer devToolsGradleBuildCustomizer() { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizer.java deleted file mode 100644 index 01694502ae..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarBinderBuildCustomizer.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springpulsar; - -import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.buildsystem.Dependency; -import io.spring.initializr.generator.project.ProjectDescription; -import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.VersionReference; -import io.spring.initializr.metadata.InitializrMetadata; - -/** - * A {@link BuildCustomizer} that automatically adds - * {@code spring-pulsar-spring-cloud-stream-binder} when Pulsar and Spring Cloud Stream - * are both selected. - * - * @author Chris Bono - */ -class SpringPulsarBinderBuildCustomizer implements BuildCustomizer { - - private final String pulsarVersion; - - SpringPulsarBinderBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { - this.pulsarVersion = metadata.getDependencies() - .get("pulsar") - .resolve(description.getPlatformVersion()) - .getVersion(); - } - - @Override - public void customize(Build build) { - build.dependencies() - .add("pulsar-binder", - Dependency.withCoordinates("org.springframework.pulsar", "spring-pulsar-spring-cloud-stream-binder") - .version(VersionReference.ofValue(this.pulsarVersion))); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java index 2760490fe6..0fc74e4119 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java @@ -24,7 +24,6 @@ import io.spring.initializr.generator.condition.ProjectGenerationCondition; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.metadata.InitializrMetadata; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections; @@ -64,14 +63,6 @@ ComposeFileCustomizer pulsarComposeFileCustomizer(DockerServiceResolver serviceR (service) -> composeFile.services().add("pulsar", service)); } - @Bean - @ConditionalOnPlatformVersion("[3.0.0,3.2.0-M1)") - @ConditionalOnRequestedDependency("cloud-stream") - SpringPulsarBinderBuildCustomizer pulsarBinderBuildCustomizer(InitializrMetadata metadata, - ProjectDescription description) { - return new SpringPulsarBinderBuildCustomizer(metadata, description); - } - static class OnPulsarDependencyCondition extends ProjectGenerationCondition { @Override diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f861044251..28aee36ea3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -74,17 +74,13 @@ initializr: artifactId: solace-spring-boot-bom versionProperty: solace-spring-boot.version mappings: - - compatibilityRange: "3.0.0" + - compatibilityRange: "[3.0.0,3.3.0-M1)" version: 2.0.0 solace-spring-cloud: groupId: com.solace.spring.cloud artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "[3.0.0,3.1.0-M1)" - version: 3.0.0 - - compatibilityRange: "[3.1.0-M1, 3.2.0-M1)" - version: 3.1.0 - compatibilityRange: "[3.2.0-M1, 3.3.0-M1)" version: 4.0.0 spring-ai: @@ -101,11 +97,6 @@ initializr: versionProperty: spring-cloud.version order: 50 mappings: - - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 2022.0.5 - - compatibilityRange: "[3.2.0-M1,3.2.0)" - version: 2023.0.0-RC1 - repositories: spring-milestones - compatibilityRange: "3.2.0" version: 2023.0.1 spring-cloud-azure: @@ -121,8 +112,6 @@ initializr: versionProperty: spring-cloud-gcp.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 4.10.1 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" version: 5.1.2 spring-cloud-services: @@ -131,8 +120,6 @@ initializr: versionProperty: spring-cloud-services.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 4.0.3 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" version: 4.1.0 spring-modulith: @@ -140,8 +127,6 @@ initializr: artifactId: spring-modulith-bom versionProperty: spring-modulith.version mappings: - - compatibility-range: "[3.1.0,3.2.0-M1)" - version: 1.0.7 - compatibility-range: "[3.2.0-M1,3.3.0-M1)" version: 1.1.4 - compatibility-range: "3.3.0-M1" @@ -152,8 +137,6 @@ initializr: artifactId: spring-shell-dependencies versionProperty: spring-shell.version mappings: - - compatibilityRange: "[3.1.0,3.2.0-M1)" - version: 3.1.11 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" version: 3.2.4 - compatibility-range: "3.3.0-M1" @@ -807,11 +790,6 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.pulsar - mappings: - - compatibilityRange: "[3.0.0,3.2.0-M3)" - version: 0.2.0 - groupId: org.springframework.pulsar - artifactId: spring-pulsar-spring-boot-starter - name: Spring for Apache Pulsar (Reactive) id: pulsar-reactive description: Build reactive messaging applications with Apache Pulsar @@ -820,11 +798,6 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.pulsar - mappings: - - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 0.2.0 - groupId: org.springframework.pulsar - artifactId: spring-pulsar-reactive-spring-boot-starter - name: WebSocket id: websocket description: Build Servlet-based WebSocket applications with SockJS and STOMP. @@ -846,8 +819,6 @@ initializr: id: camel compatibilityRange: "[3.0.0,3.3.0-M1)" mappings: - - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 4.2.0 - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" version: 4.6.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. @@ -1049,19 +1020,15 @@ initializr: id: wavefront description: Publish metrics and optionally distributed traces to Tanzu Observability by Wavefront, a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and alert over data from across your entire stack. mappings: - - compatibility-range: "[3.1.0,3.2.0)" - groupId: io.micrometer - artifactId: micrometer-registry-wavefront - starter: false - - compatibility-range: "3.3.0-M1" - groupId: io.micrometer - artifactId: micrometer-registry-wavefront - starter: false - compatibility-range: "[3.2.0, 3.3.0-M1)" groupId: com.wavefront artifactId: wavefront-spring-boot-starter version: 3.2.0 starter: true + - compatibility-range: "3.3.0-M1" + groupId: io.micrometer + artifactId: micrometer-registry-wavefront + starter: false - name: Zipkin id: zipkin description: Enable and expose span and trace IDs to Zipkin. diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java index cedf203ac6..34a4930e0b 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java @@ -57,22 +57,6 @@ void dockerComposeSupportHasOptionalScope() { .hasText("/project/dependencies/dependency[2]/optional", "true"); } - @Test - void springBoot31ConfiguresJammyBaseBuilder() { - ProjectRequest request = createProjectRequest(); - request.setBootVersion("3.1.0"); - assertThat(mavenPom(request)).hasText("/project/build/plugins/plugin[1]/configuration/image/builder", - PaketoBuilderBuildCustomizer.BASE_IMAGE_BUILDER); - } - - @Test - void springBoot31WithNativeConfiguresJammyTinyBuilder() { - ProjectRequest request = createProjectRequest("native"); - request.setBootVersion("3.1.0"); - assertThat(mavenPom(request)).hasText("/project/build/plugins/plugin[2]/configuration/image/builder", - PaketoBuilderBuildCustomizer.TINY_IMAGE_BUILDER); - } - @Test void springBoot32DoesNotConfigureJammyBaseBuilder() { ProjectRequest request = createProjectRequest(); @@ -115,22 +99,6 @@ void mavenWithDockerComposeSupportHasOptionalScope() { .hasText("/project/dependencies/dependency[2]/optional", "true"); } - @Test - void springBoot31WithGroovyDslConfiguresJammyBaseBuilder() { - ProjectRequest request = createProjectRequest(); - request.setBootVersion("3.1.0"); - assertThat(gradleBuild(request)) - .contains("builder = '%s'".formatted(PaketoBuilderBuildCustomizer.BASE_IMAGE_BUILDER)); - } - - @Test - void springBoot31WithGroovyDslAndNativeConfiguresJammyTinyBuilder() { - ProjectRequest request = createProjectRequest("native"); - request.setBootVersion("3.1.0"); - assertThat(gradleBuild(request)) - .contains("builder = '%s'".formatted(PaketoBuilderBuildCustomizer.TINY_IMAGE_BUILDER)); - } - @Test void springBoot32WithGroovyDslDoesNotConfigureJammyBaseBuilder() { ProjectRequest request = createProjectRequest(); @@ -138,22 +106,6 @@ void springBoot32WithGroovyDslDoesNotConfigureJammyBaseBuilder() { assertThat(gradleBuild(request)).doesNotContain("builder = '"); } - @Test - void springBoot31WithKotlinDslConfiguresJammyBaseBuilder() { - ProjectRequest request = createProjectRequest(); - request.setBootVersion("3.1.0"); - assertThat(gradleKotlinDslBuild(request)) - .contains("builder.set(\"%s\")".formatted(PaketoBuilderBuildCustomizer.BASE_IMAGE_BUILDER)); - } - - @Test - void springBoot31WithKotlinDslAndNativeConfiguresJammyTinyBuilder() { - ProjectRequest request = createProjectRequest("native"); - request.setBootVersion("3.1.0"); - assertThat(gradleKotlinDslBuild(request)) - .contains("builder.set(\"%s\")".formatted(PaketoBuilderBuildCustomizer.TINY_IMAGE_BUILDER)); - } - @Test void springBoot32WithKotlinDslDoesNotConfigureJammyBaseBuilder() { ProjectRequest request = createProjectRequest(); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java index ea86e6abc2..c847cc03d1 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java @@ -32,14 +32,16 @@ */ class SpringCloudContractMavenBuildCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.2.0"; + @Test void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-contract-verifier")) - .hasText("/project/build/plugins/plugin[2]/groupId", "org.springframework.cloud") - .hasText("/project/build/plugins/plugin[2]/artifactId", "spring-cloud-contract-maven-plugin") - .hasText("/project/build/plugins/plugin[2]/extensions", Boolean.toString(true)); + .hasText("/project/build/plugins/plugin[1]/groupId", "org.springframework.cloud") + .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") + .hasText("/project/build/plugins/plugin[1]/extensions", Boolean.toString(true)); } @Test @@ -51,19 +53,19 @@ void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { @Test void springCloudContractVerifierPluginForSpringBootWithJUnit5ByDefault() { ProjectRequest request = createProjectRequest("cloud-contract-verifier"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)) - .hasText("/project/build/plugins/plugin[2]/artifactId", "spring-cloud-contract-maven-plugin") - .hasText("/project/build/plugins/plugin[2]/configuration/testFramework", "JUNIT5"); + .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") + .hasText("/project/build/plugins/plugin[1]/configuration/testFramework", "JUNIT5"); } @Test void springCloudContractVerifierPluginWithTestModeSetWhenWebFluxIsPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)) - .hasText("/project/build/plugins/plugin[2]/artifactId", "spring-cloud-contract-maven-plugin") - .hasText("/project/build/plugins/plugin[2]/configuration/testMode", "WEBTESTCLIENT"); + .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") + .hasText("/project/build/plugins/plugin[1]/configuration/testMode", "WEBTESTCLIENT"); } @Test diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java index a7f631cb96..65af47a818 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java @@ -83,7 +83,7 @@ void springCloudStreamWithKafkaStreams() { @Test void springCloudStreamWithPulsar() { ProjectRequest request = createProjectRequest("cloud-stream", "pulsar"); - request.setBootVersion("3.2.0-RC1"); + request.setBootVersion("3.2.0"); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("pulsar")) .hasDependency(PULSAR_BINDER) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java index 381ec33732..093715c49f 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java @@ -44,31 +44,15 @@ */ class SpringPulsarProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.2.0"; + @Nested class PulsarDependencyConfigurationTests { - @Test - void pulsarLegacyStarterUsedWhenBoot30orBoot31Selected() { - ProjectRequest request = createProjectRequest("pulsar"); - request.setBootVersion("3.1.0"); - ProjectStructure project = generateProject(request); - assertThat(project).mavenBuild() - .hasDependency("org.springframework.pulsar", "spring-pulsar-spring-boot-starter"); - } - - @Test - void pulsarReactiveLegacyStarterUsedWhenBoot30orBoot31Selected() { - ProjectRequest request = createProjectRequest("pulsar-reactive"); - request.setBootVersion("3.1.0"); - ProjectStructure project = generateProject(request); - assertThat(project).mavenBuild() - .hasDependency("org.springframework.pulsar", "spring-pulsar-reactive-spring-boot-starter"); - } - @Test void pulsarBootStarterUsedWhenBoot32Selected() { ProjectRequest request = createProjectRequest("pulsar"); - request.setBootVersion("3.2.0-M3"); + request.setBootVersion(SPRING_BOOT_VERSION); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("org.springframework.boot", "spring-boot-starter-pulsar"); } @@ -76,7 +60,7 @@ void pulsarBootStarterUsedWhenBoot32Selected() { @Test void pulsarReactiveBootStarterUsedWhenBoot32Selected() { ProjectRequest request = createProjectRequest("pulsar-reactive"); - request.setBootVersion("3.2.0-M3"); + request.setBootVersion(SPRING_BOOT_VERSION); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasDependency("org.springframework.boot", "spring-boot-starter-pulsar-reactive"); @@ -90,24 +74,16 @@ class DockerComposeConfigurationTests { @Test void serviceNotCreatedWhenDockerComposeNotSelected() { ProjectRequest request = createProjectRequest("pulsar"); - request.setBootVersion("3.2.0-M3"); + request.setBootVersion(SPRING_BOOT_VERSION); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } - @ParameterizedTest - @ValueSource(strings = { "3.1.3", "3.2.0-M2" }) - void serviceNotCreatedWhenIncompatibleBootVersionSelected(String bootVersion) { - ProjectRequest request = createProjectRequest("docker-compose", "pulsar"); - request.setBootVersion(bootVersion); - assertThat(composeFile(request)).doesNotContain("pulsar"); - } - @ParameterizedTest @ValueSource(strings = { "pulsar", "pulsar-reactive" }) void serviceCreatedWhenDockerComposeSelectedWithCompatibleBootVersion(String pulsarDependencyId) { ProjectRequest request = createProjectRequest("docker-compose", pulsarDependencyId); - request.setBootVersion("3.2.0-M3"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pulsar.yaml")); } @@ -123,7 +99,7 @@ class ServiceConnectionConfigurationTests { @Test void connectionNotAddedWhenTestcontainersNotSelected() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.2.0-M3")); + description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); description.addDependency("pulsar", mock(Dependency.class)); this.projectTester.configure(description, (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); @@ -132,7 +108,7 @@ void connectionNotAddedWhenTestcontainersNotSelected() { @Test void connectionNotAddedWhenPulsarNotSelected() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.2.0-M3")); + description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); description.addDependency("testcontainers", mock(Dependency.class)); this.projectTester.configure(description, (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); @@ -151,7 +127,7 @@ void connectionNotAddedWhenIncompatibleBootVersionSelected() { @ValueSource(strings = { "pulsar", "pulsar-reactive" }) void connectionAddedWhenTestcontainersAndPulsarSelectedWithCompatibleBootVersion(String pulsarDependencyId) { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.2.0-M3")); + description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); description.addDependency("testcontainers", mock(Dependency.class)); description.addDependency(pulsarDependencyId, mock(Dependency.class)); this.projectTester.configure(description, @@ -182,62 +158,4 @@ private void assertPulsarServiceConnectionAdded(ServiceConnections connections) } - @Nested - class SpringPulsarBinderConfigurationTests { - - @Test - void binderNotAddedWhenCloudStreamNotSelected() { - ProjectRequest request = createProjectRequest("pulsar"); - request.setBootVersion("3.1.3"); - ProjectStructure project = generateProject(request); - assertNoBinder(project); - assertThat(project).mavenBuild() - .hasDependency("org.springframework.pulsar", "spring-pulsar-spring-boot-starter"); - } - - @Test - void binderNotAddedWhenPulsarNotSelected() { - ProjectRequest request = createProjectRequest("cloud-stream"); - request.setBootVersion("3.1.3"); - ProjectStructure project = generateProject(request); - assertNoBinder(project); - } - - @ParameterizedTest - @ValueSource(strings = { "3.2.0-M1", "3.2.0-M3" }) - void binderNotAddedWhenPulsarAndCloudStreamSelectedWithIncompatibleBootVersion(String bootVersion) { - ProjectRequest request = createProjectRequest("pulsar", "cloud-stream"); - request.setBootVersion(bootVersion); - ProjectStructure project = generateProject(request); - assertNoBinder(project); - } - - @Test - void binderAddedWhenPulsarAndCloudStreamSelectedWithCompatibleBootVersion() { - ProjectRequest request = createProjectRequest("pulsar", "cloud-stream"); - request.setBootVersion("3.1.0"); - ProjectStructure project = generateProject(request); - assertBinder(project); - } - - @Test - void binderAddedWhenPulsarReactiveAndCloudStreamSelectedWithCompatibleBootVersion() { - ProjectRequest request = createProjectRequest("pulsar-reactive", "cloud-stream"); - request.setBootVersion("3.1.0"); - ProjectStructure project = generateProject(request); - assertBinder(project); - } - - private void assertNoBinder(ProjectStructure project) { - assertThat(project).mavenBuild() - .doesNotHaveDependency("org.springframework.pulsar", "spring-pulsar-spring-cloud-stream-binder"); - } - - private void assertBinder(ProjectStructure project) { - assertThat(project).mavenBuild() - .hasDependency("org.springframework.pulsar", "spring-pulsar-spring-cloud-stream-binder", "0.2.0"); - } - - } - } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 43cd68a105..118839c380 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -41,26 +41,21 @@ */ class TestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION_3_3 = "3.3.0"; + + private static final String SPRING_BOOT_VERSION_3_2 = "3.2.0"; + @Test void buildWithOnlyTestContainers() { - assertThat(generateProject("3.1.0", "testcontainers")).mavenBuild() - .hasDependency(getDependency("testcontainers")); - } - - @ParameterizedTest - @MethodSource("supportedEntriesBuild310") - void buildWithSupportedEntriesForSpringBoot31(String springBootDependencyId, String testcontainersArtifactId) { - assertThat(generateProject("3.1.0", "testcontainers", springBootDependencyId)).mavenBuild() - .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.1.0"))) - .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") + assertThat(generateProject(SPRING_BOOT_VERSION_3_3, "testcontainers")).mavenBuild() .hasDependency(getDependency("testcontainers")); } @ParameterizedTest @MethodSource("supportedEntriesBuild320") void buildWithSupportedEntriesForSpringBoot32(String springBootDependencyId, String testcontainersArtifactId) { - assertThat(generateProject("3.2.0", "testcontainers", springBootDependencyId)).mavenBuild() - .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.2.0"))) + assertThat(generateProject(SPRING_BOOT_VERSION_3_2, "testcontainers", springBootDependencyId)).mavenBuild() + .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse(SPRING_BOOT_VERSION_3_2))) .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") .hasDependency(getDependency("testcontainers")); } @@ -69,31 +64,13 @@ void buildWithSupportedEntriesForSpringBoot32(String springBootDependencyId, Str @MethodSource("supportedTestcontainersActiveMQEntriesBuild") void buildWithSpringBoot33AndTestcontainersActiveMQModule(String springBootDependencyId, String testcontainersArtifactId) { - assertThat(generateProject("3.3.0", "testcontainers", springBootDependencyId)).mavenBuild() + assertThat(generateProject(SPRING_BOOT_VERSION_3_3, "testcontainers", springBootDependencyId)).mavenBuild() .doesNotHaveBom("org.testcontainers", "testcontainers-bom") .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.3.0"))) .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") .hasDependency(getDependency("testcontainers")); } - static Stream supportedEntriesBuild310() { - return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.of("amqp-streams", "rabbitmq"), - Arguments.arguments("cloud-gcp", "gcloud"), Arguments.arguments("cloud-gcp-pubsub", "gcloud"), - Arguments.arguments("data-cassandra", "cassandra"), - Arguments.arguments("data-cassandra-reactive", "cassandra"), - Arguments.arguments("data-couchbase", "couchbase"), - Arguments.arguments("data-couchbase-reactive", "couchbase"), - Arguments.arguments("data-elasticsearch", "elasticsearch"), - Arguments.arguments("data-mongodb", "mongodb"), Arguments.arguments("data-mongodb-reactive", "mongodb"), - Arguments.arguments("data-neo4j", "neo4j"), Arguments.arguments("data-r2dbc", "r2dbc"), - Arguments.arguments("db2", "db2"), Arguments.arguments("kafka", "kafka"), - Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mariadb", "mariadb"), - Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), - Arguments.arguments("oracle", "oracle-xe"), Arguments.arguments("pulsar", "pulsar"), - Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), - Arguments.arguments("sqlserver", "mssqlserver")); - } - static Stream supportedEntriesBuild320() { return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.of("amqp-streams", "rabbitmq"), Arguments.arguments("cloud-gcp", "gcloud"), Arguments.arguments("cloud-gcp-pubsub", "gcloud"), @@ -121,66 +98,75 @@ static Stream supportedTestcontainersActiveMQEntriesBuild() { @ParameterizedTest @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsPresentIsAdded(String dependencyId, String docHref) { - assertHelpDocument("3.1.0", "testcontainers", dependencyId) - .contains("https://java.testcontainers.org/modules/" + docHref); + assertHelpDocument(SPRING_BOOT_VERSION_3_2, "testcontainers", dependencyId).contains(docHref); } @ParameterizedTest @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsNotPresentIsNotAdded(String dependencyId, String docHref) { - assertHelpDocument("3.1.0", dependencyId).doesNotContain("https://java.testcontainers.org/modules/" + docHref); + assertHelpDocument(SPRING_BOOT_VERSION_3_2, dependencyId).doesNotContain(docHref); } static Stream supportedEntriesHelpDocument() { - return Stream.of(Arguments.arguments("amqp", "rabbitmq/"), Arguments.arguments("amqp-streams", "rabbitmq/"), - Arguments.arguments("cloud-gcp", "gcloud/"), Arguments.arguments("cloud-gcp-pubsub", "gcloud/"), - Arguments.arguments("cloud-starter-consul-config", "consul/"), - Arguments.arguments("cloud-starter-vault-config", "vault/"), - Arguments.arguments("data-cassandra", "databases/cassandra/"), - Arguments.arguments("data-cassandra-reactive", "databases/cassandra/"), - Arguments.arguments("data-couchbase", "databases/couchbase/"), - Arguments.arguments("data-couchbase-reactive", "databases/couchbase/"), - Arguments.arguments("data-elasticsearch", "elasticsearch/"), - Arguments.arguments("data-mongodb", "databases/mongodb/"), - Arguments.arguments("data-mongodb-reactive", "databases/mongodb/"), - Arguments.arguments("data-neo4j", "databases/neo4j/"), - Arguments.arguments("data-r2dbc", "databases/r2dbc/"), Arguments.arguments("db2", "databases/db2"), - Arguments.arguments("kafka", "kafka/"), Arguments.arguments("kafka-streams", "kafka/"), - Arguments.arguments("mariadb", "databases/mariadb/"), Arguments.arguments("mysql", "databases/mysql/"), - Arguments.arguments("oracle", "databases/oraclexe/"), - Arguments.arguments("postgresql", "databases/postgres/"), Arguments.arguments("pulsar", "pulsar/"), - Arguments.arguments("pulsar-reactive", "pulsar/"), Arguments.arguments("solace", "solace/"), - Arguments.arguments("sqlserver", "databases/mssqlserver/")); + return Stream.of(Arguments.arguments("amqp", "https://java.testcontainers.org/modules/rabbitmq/"), + Arguments.arguments("amqp-streams", "https://java.testcontainers.org/modules/rabbitmq/"), + Arguments.arguments("cloud-gcp", "https://java.testcontainers.org/modules/gcloud/"), + Arguments.arguments("cloud-gcp-pubsub", "https://java.testcontainers.org/modules/gcloud/"), + Arguments.arguments("cloud-starter-consul-config", "https://java.testcontainers.org/modules/consul/"), + Arguments.arguments("cloud-starter-vault-config", "https://java.testcontainers.org/modules/vault/"), + Arguments.arguments("data-cassandra", "https://java.testcontainers.org/modules/databases/cassandra/"), + Arguments.arguments("data-cassandra-reactive", + "https://java.testcontainers.org/modules/databases/cassandra/"), + Arguments.arguments("data-couchbase", "https://java.testcontainers.org/modules/databases/couchbase/"), + Arguments.arguments("data-couchbase-reactive", + "https://java.testcontainers.org/modules/databases/couchbase/"), + Arguments.arguments("data-elasticsearch", "https://java.testcontainers.org/modules/elasticsearch/"), + Arguments.arguments("data-mongodb", "https://java.testcontainers.org/modules/databases/mongodb/"), + Arguments.arguments("data-mongodb-reactive", + "https://java.testcontainers.org/modules/databases/mongodb/"), + Arguments.arguments("data-neo4j", "https://java.testcontainers.org/modules/databases/neo4j/"), + Arguments.arguments("data-r2dbc", "https://java.testcontainers.org/modules/databases/r2dbc/"), + Arguments.arguments("db2", "https://java.testcontainers.org/modules/databases/db2"), + Arguments.arguments("kafka", "https://java.testcontainers.org/modules/kafka/"), + Arguments.arguments("kafka-streams", "https://java.testcontainers.org/modules/kafka/"), + Arguments.arguments("mariadb", "https://java.testcontainers.org/modules/databases/mariadb/"), + Arguments.arguments("mysql", "https://java.testcontainers.org/modules/databases/mysql/"), + Arguments.arguments("oracle", "https://hub.docker.com/r/gvenzl/oracle-free"), + Arguments.arguments("postgresql", "https://java.testcontainers.org/modules/databases/postgres/"), + Arguments.arguments("pulsar", "https://java.testcontainers.org/modules/pulsar/"), + Arguments.arguments("pulsar-reactive", "https://java.testcontainers.org/modules/pulsar/"), + Arguments.arguments("solace", "https://java.testcontainers.org/modules/solace/"), + Arguments.arguments("sqlserver", "https://java.testcontainers.org/modules/databases/mssqlserver/")); } @Test void linkToSupportedEntriesWhenTwoMatchesArePresentOnlyAddLinkOnce() { - assertHelpDocument("3.1.0", "testcontainers", "data-mongodb", "data-mongodb-reactive") + assertHelpDocument(SPRING_BOOT_VERSION_3_3, "testcontainers", "data-mongodb", "data-mongodb-reactive") .containsOnlyOnce("https://java.testcontainers.org/modules/databases/mongodb/"); } @Test void buildWithSpringBoot31DoesNotIncludeBom() { - assertThat(generateProject("3.1.0", "testcontainers")).mavenBuild() + assertThat(generateProject(SPRING_BOOT_VERSION_3_3, "testcontainers")).mavenBuild() .doesNotHaveBom("org.testcontainers", "testcontainers-bom") .hasDependency(getDependency("testcontainers")); } @Test void buildWithSpringBoot31IncludeSpringBootTestcontainers() { - assertThat(generateProject("3.1.0", "testcontainers")).mavenBuild() + assertThat(generateProject(SPRING_BOOT_VERSION_3_3, "testcontainers")).mavenBuild() .hasDependency("org.springframework.boot", "spring-boot-testcontainers", null, "test"); } @Test void buildWithSpringBoot31IncludeTestcontainersSection() { - assertHelpDocument("3.1.0", "testcontainers").contains("Spring Boot Testcontainers support"); + assertHelpDocument(SPRING_BOOT_VERSION_3_3, "testcontainers").contains("Spring Boot Testcontainers support"); } @Test void testApplicationWithGroovyAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("groovy"); assertThat(generateProject(request)).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") .isEqualTo(""" @@ -213,7 +199,7 @@ static void main(String[] args) { @Test void testApplicationWithJavaAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("java"); assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") .isEqualTo(""" @@ -246,7 +232,7 @@ public static void main(String[] args) { @Test void testApplicationWithKotlinAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); - request.setBootVersion("3.1.1"); + request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("kotlin"); assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt") .isEqualTo(""" @@ -280,7 +266,7 @@ fun main(args: Array) { @Test void testApplicationWithGroovyAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("groovy"); assertThat(generateProject(request)).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") .isEqualTo(""" @@ -313,7 +299,7 @@ static void main(String[] args) { @Test void testApplicationWithJavaAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("java"); assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") .isEqualTo(""" @@ -346,7 +332,7 @@ public static void main(String[] args) { @Test void testApplicationWithKotlinAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); - request.setBootVersion("3.1.1"); + request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("kotlin"); assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt") .isEqualTo(""" @@ -379,10 +365,10 @@ fun main(args: Array) { @Test void shouldAddHelpSection() { - assertHelpDocument("3.1.5", "testcontainers", "data-mongodb", "postgresql").contains( - "https://docs.spring.io/spring-boot/docs/3.1.5/reference/html/features.html#features.testing.testcontainers") + assertHelpDocument(SPRING_BOOT_VERSION_3_3, "testcontainers", "data-mongodb", "postgresql").contains( + "https://docs.spring.io/spring-boot/docs/3.3.0/reference/html/features.html#features.testing.testcontainers") .contains( - "https://docs.spring.io/spring-boot/docs/3.1.5/reference/html/features.html#features.testing.testcontainers.at-development-time") + "https://docs.spring.io/spring-boot/docs/3.3.0/reference/html/features.html#features.testing.testcontainers.at-development-time") .contains("mongo:latest") .contains("postgres:latest"); } From eb210571a7395527fcfb14fec2412f7995964732 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 24 May 2024 11:53:40 +0200 Subject: [PATCH 524/825] Remove Picocli Closes gh-1477 --- .../PicocliCodegenBuildCustomizer.java | 48 ------------ ...PicocliProjectGenerationConfiguration.java | 40 ---------- .../dependency/picocli/package-info.java | 20 ----- .../main/resources/META-INF/spring.factories | 1 - start-site/src/main/resources/application.yml | 12 --- .../PicocliCodegenBuildCustomizerTests.java | 77 ------------------- 6 files changed, 198 deletions(-) delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizer.java delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliProjectGenerationConfiguration.java delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/package-info.java delete mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizer.java deleted file mode 100644 index 9054e13ba6..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizer.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.picocli; - -import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.buildsystem.Dependency; -import io.spring.initializr.generator.buildsystem.DependencyScope; -import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.VersionReference; - -/** - * A {@link BuildCustomizer} that automatically adds "picocli-codegen" when the - * {@code native} dependency is selected in addition to {@code picocli}. - *

    - * This annotation processor is required by Picocli to generate the reachability metadata - * for native applications. - * - * @author Brian Clozel - */ -class PicocliCodegenBuildCustomizer implements BuildCustomizer { - - @Override - public void customize(Build build) { - if (build.dependencies().has("native")) { - VersionReference picocliVersion = build.dependencies().get("picocli").getVersion(); - Dependency picocliCodegen = Dependency.withCoordinates("info.picocli", "picocli-codegen") - .scope(DependencyScope.ANNOTATION_PROCESSOR) - .version(picocliVersion) - .build(); - build.dependencies().add("picocli-codegen", picocliCodegen); - } - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliProjectGenerationConfiguration.java deleted file mode 100644 index 20a66a86d8..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/PicocliProjectGenerationConfiguration.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2012-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.picocli; - -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; -import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectGenerationConfiguration; - -import org.springframework.context.annotation.Bean; - -/** - * Configuration for generation of projects that use observability. - * - * @author Brian Clozel - */ -@ProjectGenerationConfiguration -@ConditionalOnRequestedDependency("picocli") -@ConditionalOnPlatformVersion("3.0.0-M1") -public class PicocliProjectGenerationConfiguration { - - @Bean - PicocliCodegenBuildCustomizer picocliCodegenBuildCustomizer() { - return new PicocliCodegenBuildCustomizer(); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/package-info.java deleted file mode 100644 index eb88fcb9a9..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/picocli/package-info.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Extensions for generation of projects that depend on Picocli. - */ -package io.spring.start.site.extension.dependency.picocli; diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index b02845bcb6..181db41f02 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -20,7 +20,6 @@ io.spring.start.site.extension.dependency.mysql.MysqlProjectGenerationConfigurat io.spring.start.site.extension.dependency.neo4j.Neo4jProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.observability.ObservabilityProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.oracle.OracleProjectGenerationConfiguration,\ -io.spring.start.site.extension.dependency.picocli.PicocliProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.postgresql.PgVectorProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.postgresql.PostgresqlProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.redis.RedisProjectGenerationConfiguration,\ diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 28aee36ea3..0de6deebaf 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -882,18 +882,6 @@ initializr: description: Caching Data with Spring - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.caching - - name: Picocli - id: picocli - groupId: info.picocli - artifactId: picocli-spring-boot-starter - compatibilityRange: "[3.0.0,3.2.0-M1)" - description: Build command line applications with picocli. - mappings: - - compatibilityRange: "[3.0.0,3.2.0-M1)" - version: 4.7.5 - links: - - rel: reference - href: https://picocli.info/#_spring_boot_example - name: Spring Shell id: spring-shell groupId: org.springframework.shell diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizerTests.java deleted file mode 100644 index d2aa0c5b37..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/picocli/PicocliCodegenBuildCustomizerTests.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.picocli; - -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.metadata.Dependency; -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link PicocliCodegenBuildCustomizer}. - * - * @author Brian Clozel - */ -class PicocliCodegenBuildCustomizerTests extends AbstractExtensionTests { - - private static final Version SPRING_BOOT_3_VERSION = Version.parse("3.1.0"); - - @Test - void picocliCodegenIsAddedAsMavenOptionalDependency() { - ProjectRequest request = createProjectRequest("picocli", "native"); - request.setBootVersion(SPRING_BOOT_3_VERSION.toString()); - assertThat(mavenPom(request)).hasDependency(getPicocli(SPRING_BOOT_3_VERSION)) - .hasDependency(getPicocliCodegen(SPRING_BOOT_3_VERSION)) - .hasText("/project/dependencies/dependency[2]/optional", "true"); - } - - @Test - void picocliCodegenIsNotAddedAsMavenDependencyIfNativeNotSelected() { - ProjectRequest request = createProjectRequest("picocli"); - request.setBootVersion(SPRING_BOOT_3_VERSION.toString()); - assertThat(mavenPom(request)).hasDependency(getDependency("picocli")) - .doesNotHaveDependency("info.picocli", "picocli-codegen"); - } - - @Test - void picocliCodegenIsAddedAsGradleAnnotationProcessor() { - ProjectRequest request = createProjectRequest("picocli", "native"); - request.setBootVersion(SPRING_BOOT_3_VERSION.toString()); - assertThat(gradleBuild(request)).contains("annotationProcessor 'info.picocli:picocli-codegen:" - + getPicocli(SPRING_BOOT_3_VERSION).getVersion() + "'"); - } - - @Test - void picocliCodegenIsNotAddedAsGradleAnnotationProcessorIfNativeNotSelected() { - ProjectRequest request = createProjectRequest("picocli"); - request.setBootVersion(SPRING_BOOT_3_VERSION.toString()); - assertThat(gradleBuild(request)).doesNotContain("info.picocli:picocli-codegen"); - } - - private Dependency getPicocli(Version springBootVersion) { - return getDependency("picocli").resolve(springBootVersion); - } - - private Dependency getPicocliCodegen(Version springBootVersion) { - return Dependency.create("info.picocli", "picocli-codegen", getPicocli(springBootVersion).getVersion(), - Dependency.SCOPE_COMPILE); - } - -} From 9063e20741b4d0c523fde3f7c5ed404efccb2e29 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Fri, 24 May 2024 12:29:34 +0300 Subject: [PATCH 525/825] Upgrade compatibility range for Vaadin See gh-1476 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0de6deebaf..b414b87be7 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -154,7 +154,7 @@ initializr: artifactId: vaadin-bom versionProperty: vaadin.version mappings: - - compatibilityRange: "[3.0.0,3.3.0-M1)" + - compatibilityRange: "[3.0.0,3.4.0-M1)" version: 24.3.12 gradle: dependency-management-plugin-version: 1.0.14.RELEASE @@ -338,7 +338,7 @@ initializr: artifactId: vaadin-spring-boot-starter description: A web framework that allows you to write UI in pure Java without getting bogged down in JS, HTML, and CSS. bom: vaadin - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.0.0,3.4.0-M1)" links: - rel: guide href: https://spring.io/guides/gs/crud-with-vaadin/ From 6966cb5424d52cd3de04434bae4669437bd7a50a Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 24 May 2024 13:42:37 +0200 Subject: [PATCH 526/825] Set platform compatibility range to 3.2.0 Closes gh-1474 --- ...ctiveMQProjectGenerationConfiguration.java | 4 +- ...CodegenProjectGenerationConfiguration.java | 2 +- .../flyway/FlywayBuildCustomizer.java | 11 +- ...Observability2xHelpDocumentCustomizer.java | 46 ------ ...abilityProjectGenerationConfiguration.java | 13 +- .../OracleProjectGenerationConfiguration.java | 43 +----- ...ngCloudProjectGenerationConfiguration.java | 2 +- .../SpringCloudStreamBuildCustomizer.java | 15 +- ...gPulsarProjectGenerationConfiguration.java | 3 - .../TestcontainersModuleRegistry.java | 12 +- ...vaVersionProjectDescriptionCustomizer.java | 17 +-- start-site/src/main/resources/application.yml | 134 +++++++++--------- ...uildSystemHelpDocumentCustomizerTests.java | 12 +- ...uildSystemHelpDocumentCustomizerTests.java | 12 +- .../KotlinCoroutinesCustomizerTests.java | 4 +- ...MQProjectGenerationConfigurationTests.java | 12 +- ...isProjectGenerationConfigurationTests.java | 8 +- .../flyway/FlywayBuildCustomizerTests.java | 37 +++-- .../GraalVmHelpDocumentCustomizerTests.java | 8 +- ...VmProjectGenerationConfigurationTests.java | 9 +- ...laProjectGenerationConfigurationTests.java | 12 +- .../MyBatisTestBuildCustomizerTests.java | 4 +- ...rvabilityActuatorBuildCustomizerTests.java | 5 +- .../okta/OktaHelpDocumentCustomizerTests.java | 4 +- ...leProjectGenerationConfigurationTests.java | 23 +-- ...reProjectGenerationConfigurationTests.java | 16 ++- ...otProjectGenerationConfigurationTests.java | 6 +- ...arProjectGenerationConfigurationTests.java | 9 -- ...inProjectGenerationConfigurationTests.java | 6 +- ...JvmVersionHelpDocumentCustomizerTests.java | 12 +- ...tApplicationPropertiesCustomizerTests.java | 1 - ...sionProjectDescriptionCustomizerTests.java | 19 +-- .../CacheableMavenVersionResolverTests.java | 8 +- 33 files changed, 190 insertions(+), 339 deletions(-) delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/observability/Observability2xHelpDocumentCustomizer.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java index aa349cbbb3..ac72684c88 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java @@ -38,7 +38,7 @@ public class ActiveMQProjectGenerationConfiguration { private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.activemq.ActiveMQContainer"; @Bean - @ConditionalOnPlatformVersion("[3.2.0-M1,3.3.0-M2)") + @ConditionalOnPlatformVersion("[3.2.0,3.3.0-M2)") @ConditionalOnRequestedDependency("testcontainers") ServiceConnectionsCustomizer activeMQServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { return (serviceConnections) -> serviceResolver.doWith("activeMQ", (service) -> serviceConnections @@ -55,7 +55,7 @@ ServiceConnectionsCustomizer activeMQClassicServiceConnectionsCustomizer(DockerS } @Bean - @ConditionalOnPlatformVersion("[3.2.0-M1,3.3.0-M2)") + @ConditionalOnPlatformVersion("[3.2.0,3.3.0-M2)") @ConditionalOnRequestedDependency("docker-compose") ComposeFileCustomizer activeMQComposeFileCustomizer(DockerServiceResolver serviceResolver) { return (composeFile) -> serviceResolver.doWith("activeMQ", diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java index 1ab8a90430..fb6df253ff 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java @@ -37,7 +37,7 @@ */ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("dgs-codegen") -@ConditionalOnPlatformVersion("3.0.0-M1") +@ConditionalOnPlatformVersion("3.2.0") class DgsCodegenProjectGenerationConfiguration { private final String dgsCodegenPluginVersion; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java index 6bb60c8a34..cd6a14f26c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java @@ -33,16 +33,11 @@ */ class FlywayBuildCustomizer implements BuildCustomizer { - private static final VersionRange SPRING_BOOT_3_2_M1_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0-M1"); - private static final VersionRange SPRING_BOOT_3_3_M3_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0-M3"); - private final boolean isSpringBoot32OrLater; - private final boolean isSpringBoot33OrLater; FlywayBuildCustomizer(ProjectDescription projectDescription) { - this.isSpringBoot32OrLater = SPRING_BOOT_3_2_M1_OR_LATER.match(projectDescription.getPlatformVersion()); this.isSpringBoot33OrLater = SPRING_BOOT_3_3_M3_OR_LATER.match(projectDescription.getPlatformVersion()); } @@ -55,10 +50,8 @@ public void customize(Build build) { if (dependencies.has("sqlserver")) { dependencies.add("flyway-sqlserver", "org.flywaydb", "flyway-sqlserver", DependencyScope.COMPILE); } - if (this.isSpringBoot32OrLater) { - if (dependencies.has("oracle")) { - dependencies.add("flyway-oracle", "org.flywaydb", "flyway-database-oracle", DependencyScope.COMPILE); - } + if (dependencies.has("oracle")) { + dependencies.add("flyway-oracle", "org.flywaydb", "flyway-database-oracle", DependencyScope.COMPILE); } if (this.isSpringBoot33OrLater) { if (dependencies.has("db2")) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/Observability2xHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/Observability2xHelpDocumentCustomizer.java deleted file mode 100644 index 046950be52..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/Observability2xHelpDocumentCustomizer.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.observability; - -import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.spring.documentation.HelpDocument; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; - -/** - * {@link HelpDocumentCustomizer} implementation for Observability with Spring Boot 2.x. - * - * @author Stephane Nicoll - */ -public class Observability2xHelpDocumentCustomizer implements HelpDocumentCustomizer { - - private final Build build; - - public Observability2xHelpDocumentCustomizer(Build build) { - this.build = build; - } - - @Override - public void customize(HelpDocument document) { - if (this.build.dependencies().has("distributed-tracing")) { - document.gettingStarted() - .addReferenceDocLink( - "https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/htmlsingle/spring-cloud-sleuth.html", - "Spring Cloud Sleuth Reference Guide"); - } - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java index a676b465bd..0fdf01de9d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java @@ -34,7 +34,7 @@ class ObservabilityProjectGenerationConfiguration { @Configuration(proxyBeanMethods = false) - @ConditionalOnPlatformVersion("3.0.0-M1") + @ConditionalOnPlatformVersion("3.2.0") static class ObservabilityConfiguration { @Bean @@ -62,15 +62,4 @@ WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { } - @Configuration(proxyBeanMethods = false) - @ConditionalOnPlatformVersion("[2.0.0,3.0.0-M1)") - static class Observability2xConfiguration { - - @Bean - Observability2xHelpDocumentCustomizer observabilityHelpDocumentCustomizer(Build build) { - return new Observability2xHelpDocumentCustomizer(build); - } - - } - } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java index a5cf961df6..db1f568ff4 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java @@ -17,10 +17,6 @@ package io.spring.start.site.extension.dependency.oracle; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections.ServiceConnection; @@ -41,44 +37,17 @@ class OracleProjectGenerationConfiguration { @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer oracleServiceConnectionsCustomizer(DockerServiceResolver serviceResolver, - ProjectDescription projectDescription) { - OracleContainer oracleContainer = OracleContainer.forVersion(projectDescription.getPlatformVersion()); - return (serviceConnections) -> serviceResolver.doWith(oracleContainer.serviceId, - (service) -> serviceConnections.addServiceConnection(ServiceConnection - .ofContainer(oracleContainer.serviceId, service, oracleContainer.testcontainersClassName, false))); + ServiceConnectionsCustomizer oracleServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("oracleFree", + (service) -> serviceConnections.addServiceConnection(ServiceConnection.ofContainer("oracleFree", + service, "org.testcontainers.oracle.OracleContainer", false))); } @Bean @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer oracleComposeFileCustomizer(DockerServiceResolver serviceResolver, - ProjectDescription projectDescription) { - OracleContainer oracleContainer = OracleContainer.forVersion(projectDescription.getPlatformVersion()); - return (composeFile) -> serviceResolver.doWith(oracleContainer.serviceId, (service) -> composeFile.services() + ComposeFileCustomizer oracleComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("oracleFree", (service) -> composeFile.services() .add("oracle", service.andThen((builder) -> builder.environment("ORACLE_PASSWORD", "secret")))); } - private enum OracleContainer { - - FREE("oracleFree", "org.testcontainers.oracle.OracleContainer"), - - XE("oracleXe", "org.testcontainers.containers.OracleContainer"); - - private static final VersionRange SPRING_BOOT_3_2_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0"); - - private final String serviceId; - - private final String testcontainersClassName; - - OracleContainer(String serviceId, String testcontainersClassName) { - this.serviceId = serviceId; - this.testcontainersClassName = testcontainersClassName; - } - - static OracleContainer forVersion(Version version) { - return SPRING_BOOT_3_2_0_OR_LATER.match(version) ? FREE : XE; - } - - } - } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java index 841f05104e..27415f50b8 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java @@ -60,7 +60,7 @@ public SpringCloudFunctionBuildCustomizer springCloudFunctionBuildCustomizer() { @Bean public SpringCloudStreamBuildCustomizer springCloudStreamBuildCustomizer() { - return new SpringCloudStreamBuildCustomizer(this.description); + return new SpringCloudStreamBuildCustomizer(); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java index 432b59d550..54cef29212 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizer.java @@ -19,9 +19,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; /** * Determine the appropriate Spring Cloud stream dependency to use based on the selected @@ -37,12 +35,6 @@ */ class SpringCloudStreamBuildCustomizer implements BuildCustomizer { - private final ProjectDescription description; - - SpringCloudStreamBuildCustomizer(ProjectDescription description) { - this.description = description; - } - @Override public void customize(Build build) { if (hasDependency("cloud-stream", build) || hasDependency("cloud-bus", build)) { @@ -56,7 +48,7 @@ public void customize(Build build) { .add("cloud-stream-binder-kafka", "org.springframework.cloud", "spring-cloud-stream-binder-kafka", DependencyScope.COMPILE); } - if (hasPulsarSupport() && hasDependency("pulsar", build)) { + if (hasDependency("pulsar", build)) { build.dependencies() .add("cloud-stream-binder-pulsar", "org.springframework.cloud", "spring-cloud-stream-binder-pulsar", DependencyScope.COMPILE); @@ -80,9 +72,4 @@ protected boolean hasDependency(String id, Build build) { return build.dependencies().has(id); } - protected boolean hasPulsarSupport() { - Version platformVersion = this.description.getPlatformVersion(); - return platformVersion.compareTo(Version.parse("3.2.0-M3")) >= 0; - } - } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java index 0fc74e4119..0b1f90462f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfiguration.java @@ -19,7 +19,6 @@ import java.util.Map; import io.spring.initializr.generator.buildsystem.Dependency; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.condition.ProjectGenerationCondition; import io.spring.initializr.generator.project.ProjectDescription; @@ -47,7 +46,6 @@ class SpringPulsarProjectGenerationConfiguration { private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.PulsarContainer"; @Bean - @ConditionalOnPlatformVersion("3.2.0-M3") @ConditionalOnRequestedDependency("testcontainers") ServiceConnectionsCustomizer pulsarServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { return (serviceConnections) -> serviceResolver.doWith("pulsar", @@ -56,7 +54,6 @@ ServiceConnectionsCustomizer pulsarServiceConnectionsCustomizer(DockerServiceRes } @Bean - @ConditionalOnPlatformVersion("3.2.0-M3") @ConditionalOnRequestedDependency("docker-compose") ComposeFileCustomizer pulsarComposeFileCustomizer(DockerServiceResolver serviceResolver) { return (composeFile) -> serviceResolver.doWith("pulsar", diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 61ee1705d5..7917ecd839 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -40,8 +40,6 @@ */ abstract class TestcontainersModuleRegistry { - private static final VersionRange SPRING_BOOT_3_2_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0"); - private static final VersionRange SPRING_BOOT_3_3_0_M2_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0-M2"); static Iterable create(Version platformVersion) { @@ -80,14 +78,8 @@ static Iterable create(Version platformVersion) { .customizeHelpDocument(addReferenceLink("MariaDB Module", "databases/mariadb/"))); builders.add(onDependencies("mysql").customizeBuild(addModule("mysql")) .customizeHelpDocument(addReferenceLink("MySQL Module", "databases/mysql/"))); - if (SPRING_BOOT_3_2_0_OR_LATER.match(platformVersion)) { - builders.add(onDependencies("oracle").customizeBuild(addModule("oracle-free")) - .customizeHelpDocument(addReferenceLink("Oracle-Free Module", "databases/oraclefree/"))); - } - else { - builders.add(onDependencies("oracle").customizeBuild(addModule("oracle-xe")) - .customizeHelpDocument(addReferenceLink("Oracle-XE Module", "databases/oraclexe/"))); - } + builders.add(onDependencies("oracle").customizeBuild(addModule("oracle-free")) + .customizeHelpDocument(addReferenceLink("Oracle-Free Module", "databases/oraclefree/"))); builders.add(onDependencies("postgresql", "spring-ai-vectordb-pgvector").customizeBuild(addModule("postgresql")) .customizeHelpDocument(addReferenceLink("Postgres Module", "databases/postgres/"))); builders.add(onDependencies("pulsar", "pulsar-reactive").customizeBuild(addModule("pulsar")) diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index 2b102eefc6..d46d939f85 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -37,8 +37,6 @@ */ public class JavaVersionProjectDescriptionCustomizer implements ProjectDescriptionCustomizer { - private static final VersionRange KOTLIN_1_9_20_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.0-RC2"); - private static final VersionRange SPRING_BOOT_3_2_4_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.4"); private static final List UNSUPPORTED_VERSIONS = Arrays.asList("1.6", "1.7", "1.8"); @@ -58,25 +56,14 @@ public void customize(MutableProjectDescription description) { if (javaGeneration < 17) { updateTo(description, "17"); } - if (javaGeneration == 21) { - // Kotlin 1.9.20 is required - if (isKotlin(description) && !KOTLIN_1_9_20_OR_LATER.match(platformVersion)) { - updateTo(description, "17"); - } - } if (javaGeneration == 22) { // Java 21 support as of Spring Boot 3.2.4 if (!SPRING_BOOT_3_2_4_OR_LATER.match(platformVersion)) { updateTo(description, "21"); } if (isKotlin(description)) { - if (KOTLIN_1_9_20_OR_LATER.match(platformVersion)) { - // Kotlin 1.9.x doesn't support Java 22 - updateTo(description, "21"); - } - else { - updateTo(description, "17"); - } + // Kotlin 1.9.x doesn't support Java 22 + updateTo(description, "21"); } } } diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b414b87be7..72379c64cb 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -46,49 +46,49 @@ initializr: artifactId: spring-boot-admin-dependencies versionProperty: spring-boot-admin.version mappings: - - compatibilityRange: "[3.1.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 3.2.3 netflix-dgs: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-platform-dependencies versionProperty: netflix-dgs.version mappings: - - compatibilityRange: "[3.1.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 8.6.1 hilla: groupId: dev.hilla artifactId: hilla-bom versionProperty: hilla.version mappings: - - compatibilityRange: "[3.1.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 2.5.5 sentry: groupId: io.sentry artifactId: sentry-bom versionProperty: sentry.version mappings: - - compatibilityRange: "[2.7.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 7.3.0 solace-spring-boot: groupId: com.solace.spring.boot artifactId: solace-spring-boot-bom versionProperty: solace-spring-boot.version mappings: - - compatibilityRange: "[3.0.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 2.0.0 solace-spring-cloud: groupId: com.solace.spring.cloud artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "[3.2.0-M1, 3.3.0-M1)" + - compatibilityRange: "[3.2.0, 3.3.0-M1)" version: 4.0.0 spring-ai: groupId: org.springframework.ai artifactId: spring-ai-bom versionProperty: spring-ai.version mappings: - - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 0.8.1 repositories: spring-milestones spring-cloud: @@ -104,7 +104,7 @@ initializr: artifactId: spring-cloud-azure-dependencies versionProperty: spring-cloud-azure.version mappings: - - compatibilityRange: "[3.0.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 5.12.0 spring-cloud-gcp: groupId: com.google.cloud @@ -112,7 +112,7 @@ initializr: versionProperty: spring-cloud-gcp.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 5.1.2 spring-cloud-services: groupId: io.pivotal.spring.cloud @@ -120,14 +120,14 @@ initializr: versionProperty: spring-cloud-services.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 4.1.0 spring-modulith: groupId: org.springframework.modulith artifactId: spring-modulith-bom versionProperty: spring-modulith.version mappings: - - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + - compatibility-range: "[3.2.0,3.3.0-M1)" version: 1.1.4 - compatibility-range: "3.3.0-M1" version: 1.2.0-RC1 @@ -137,7 +137,7 @@ initializr: artifactId: spring-shell-dependencies versionProperty: spring-shell.version mappings: - - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 3.2.4 - compatibility-range: "3.3.0-M1" version: 3.3.0-M1 @@ -147,19 +147,19 @@ initializr: artifactId: timefold-solver-bom versionProperty: timefold-solver.version mappings: - - compatibilityRange: "[3.0.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 1.10.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom versionProperty: vaadin.version mappings: - - compatibilityRange: "[3.0.0,3.4.0-M1)" + - compatibilityRange: "[3.2.0,3.4.0-M1)" version: 24.3.12 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: - compatibility-range: "3.1.0" + compatibility-range: "3.2.0" dependencies: - name: Developer Tools content: @@ -171,11 +171,11 @@ initializr: starter: false - name: GraphQL DGS Code Generation id: dgs-codegen - compatibilityRange: "3.0.0-M1" + compatibilityRange: "3.2.0" groupId: com.netflix.graphql.dgs.codegen artifactId: graphql-dgs-codegen-gradle mappings: - - compatibilityRange: "3.0.0-M1" + - compatibilityRange: "3.2.0" version: 6.2.1 description: Generate data types and type-safe APIs for querying GraphQL APIs by parsing schema files. starter: false @@ -208,7 +208,7 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#appendix.configuration-metadata.annotation-processor - name: Docker Compose Support id: docker-compose - compatibilityRange: "3.1.0-M1" + compatibilityRange: "3.2.0" groupId: org.springframework.boot artifactId: spring-boot-docker-compose scope: runtime @@ -220,7 +220,7 @@ initializr: - name: Spring Modulith id: modulith bom: spring-modulith - compatibility-range: "3.1.0" + compatibility-range: "3.2.0" group-id: org.springframework.modulith artifact-id: spring-modulith-starter-core description: Support for building modular monolithic applications. @@ -338,7 +338,7 @@ initializr: artifactId: vaadin-spring-boot-starter description: A web framework that allows you to write UI in pure Java without getting bogged down in JS, HTML, and CSS. bom: vaadin - compatibilityRange: "[3.0.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" links: - rel: guide href: https://spring.io/guides/gs/crud-with-vaadin/ @@ -348,7 +348,7 @@ initializr: - name: Hilla id: hilla bom: hilla - compatibilityRange: "[3.1.0-M1,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" facets: - web groupId: dev.hilla @@ -365,7 +365,7 @@ initializr: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-spring-graphql-starter description: Build GraphQL applications with Netflix DGS and Spring for GraphQL. - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" bom: netflix-dgs links: - rel: reference @@ -427,7 +427,7 @@ initializr: - name: OAuth2 Authorization Server id: oauth2-authorization-server description: Spring Boot integration for Spring Authorization Server. - compatibilityRange: "3.1.0-RC1" + compatibilityRange: "3.2.0-RC1" links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.security.oauth2.authorization-server @@ -445,12 +445,12 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap - name: Okta id: okta - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" description: Okta specific configuration for Spring Security/Spring Boot OAuth2 features. Enable your Spring Boot application to work with Okta via OAuth 2.0/OIDC. groupId: com.okta.spring artifactId: okta-spring-boot-starter mappings: - - compatibilityRange: "[3.0.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 3.0.6 links: - rel: guide @@ -517,7 +517,7 @@ initializr: description: R2DBC Homepage - name: MyBatis Framework id: mybatis - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" description: Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. links: - rel: guide @@ -528,7 +528,7 @@ initializr: groupId: org.mybatis.spring.boot artifactId: mybatis-spring-boot-starter mappings: - - compatibilityRange: "3.0.0" + - compatibilityRange: "3.2.0" version: 3.0.3 - name: Liquibase Migration id: liquibase @@ -817,9 +817,9 @@ initializr: href: https://rsocket.io/ - name: Apache Camel id: camel - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" mappings: - - compatibilityRange: "[3.2.0-M1,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 4.6.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot @@ -831,7 +831,7 @@ initializr: - name: Solace PubSub+ bom: solace-spring-boot id: solace - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" description: Connect to a Solace PubSub+ Advanced Event Broker to publish, subscribe, request/reply and store/replay messages groupId: com.solace.spring.boot artifactId: solace-spring-boot-starter @@ -886,7 +886,7 @@ initializr: id: spring-shell groupId: org.springframework.shell artifactId: spring-shell-starter - compatibilityRange: "[3.1.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" description: Build command line applications with spring. bom: spring-shell links: @@ -908,7 +908,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-client description: Required for your application to register with a Codecentric's Spring Boot Admin Server instance. - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -918,7 +918,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-server description: A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints. - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -927,7 +927,7 @@ initializr: id: sentry bom: sentry description: Application performance monitoring and error tracking that help software teams see clearer, solve quicker, and learn continuously. - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" groupId: io.sentry artifactId: sentry-spring-boot-starter-jakarta links: @@ -1204,7 +1204,7 @@ initializr: id: cloud-gateway groupId: org.springframework.cloud artifactId: spring-cloud-starter-gateway-mvc - compatibilityRange: "3.2.0-M1" + compatibilityRange: "3.2.0" description: Provides a simple, yet effective way to route to APIs in Servlet-based applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. links: - rel: reference @@ -1276,7 +1276,7 @@ initializr: href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-introducing - name: VMware Tanzu Application Service bom: spring-cloud-services - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" content: - name: Config Client (TAS) id: scs-config-client @@ -1296,7 +1296,7 @@ initializr: href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - name: Microsoft Azure bom: spring-cloud-azure - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" content: - name: Azure Support id: azure-support @@ -1374,7 +1374,7 @@ initializr: description: Azure Storage Sample - name: Google Cloud bom: spring-cloud-gcp - compatibilityRange: "[3.0.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" content: - name: Google Cloud Support id: cloud-gcp @@ -1412,7 +1412,7 @@ initializr: content: - name: Azure OpenAI id: spring-ai-azure-openai - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-azure-openai-spring-boot-starter description: Spring AI support for Azure’s OpenAI offering, powered by ChatGPT. It extends beyond traditional OpenAI capabilities, delivering AI-driven text generation with enhanced functionality. @@ -1423,7 +1423,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/azure-openai-chat.html - name: Azure AI Search id: spring-ai-vectordb-azure - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-azure-vector-store-spring-boot-starter description: Spring AI vector database support for Azure AI Search. It is an AI-powered information retrieval platform and part of Microsoft’s larger AI platform. Among other features, it allows users to query information using vector-based storage and retrieval. @@ -1434,7 +1434,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/azure.html - name: Amazon Bedrock id: spring-ai-bedrock - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-bedrock-ai-spring-boot-starter description: Spring AI support for Amazon Bedrock. It is a managed service that provides foundation models from various AI providers, available through a unified API. @@ -1445,7 +1445,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/bedrock-chat.html - name: Chroma Vector Database id: spring-ai-vectordb-chroma - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-chroma-store-spring-boot-starter description: Spring AI vector database support for Chroma. It is an open-source embedding database and gives you the tools to store document embeddings, content, and metadata. It also allows to search through those embeddings, including metadata filtering. @@ -1456,7 +1456,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/chroma.html - name: Milvus Vector Database id: spring-ai-vectordb-milvus - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-milvus-store-spring-boot-starter description: Spring AI vector database support for Milvus. It is an open-source vector database that has garnered significant attention in the fields of data science and machine learning. One of its standout features lies in its robust support for vector indexing and querying. @@ -1467,7 +1467,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/milvus.html - name: Mistral AI id: spring-ai-mistral - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-mistral-ai-spring-boot-starter description: Spring AI support for Mistral AI, the open and portable generative AI for devs and businesses. @@ -1478,7 +1478,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/mistralai-chat.html - name: Neo4J Vector Database id: spring-ai-vectordb-neo4j - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-neo4j-store-spring-boot-starter description: Spring AI vector database support for Neo4j's Vector Search. It allows users to query vector embeddings from large datasets. @@ -1489,7 +1489,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/neo4j.html - name: Ollama id: spring-ai-ollama - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-ollama-spring-boot-starter description: Spring AI support for Ollama. It allows you to run various Large Language Models (LLMs) locally and generate text from them. @@ -1500,7 +1500,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/ollama-chat.html - name: OpenAI id: spring-ai-openai - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-openai-spring-boot-starter description: Spring AI support for ChatGPT, the AI language model and DALL-E, the Image generation model from OpenAI. @@ -1511,7 +1511,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/openai-chat.html - name: PGvector Vector Database id: spring-ai-vectordb-pgvector - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-pgvector-store-spring-boot-starter description: Spring AI vector database support for PGvector. It is an open-source extension for PostgreSQL that enables storing and searching over machine learning-generated embeddings. @@ -1522,7 +1522,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pgvector.html - name: Pinecone Vector Database id: spring-ai-vectordb-pinecone - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-pinecone-store-spring-boot-starter description: Spring AI vector database support for Pinecone. It is a popular cloud-based vector database and allows you to store and search vectors efficiently. @@ -1533,7 +1533,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pinecone.html - name: PostgresML id: spring-ai-postgresml - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-postgresml-spring-boot-starter description: Spring AI support for the PostgresML text embeddings models. @@ -1544,7 +1544,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/embeddings/postgresml-embeddings.html - name: Redis Search and Query Vector Database id: spring-ai-vectordb-redis - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-redis-spring-boot-starter description: Spring AI vector database support for Redis Search and Query.It extends the core features of Redis OSS and allows you to use Redis as a vector database. @@ -1555,7 +1555,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/redis.html - name: Stability AI id: spring-ai-stabilityai - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-stability-ai-spring-boot-starter description: Spring AI support for Stability AI's text to image generation model. @@ -1566,7 +1566,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/image/stabilityai-image.html - name: Transformers (ONNX) Embeddings id: spring-ai-transformers - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-transformers-spring-boot-starter description: Spring AI support for pre-trained transformer models, serialized into the Open Neural Network Exchange (ONNX) format. @@ -1577,7 +1577,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html - name: Vertex AI PaLM2 id: spring-ai-vertexai-palm2 - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-vertex-ai-palm2-spring-boot-starter description: Spring AI support for Google Vertex PaLM2 chat and embedding models. @@ -1588,7 +1588,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-palm2-chat.html - name: Vertex AI Gemini id: spring-ai-vertexai-gemini - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-vertex-ai-gemini-spring-boot-starter description: Spring AI support for Google Vertex Gemini chat. @@ -1599,7 +1599,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-gemini-chat.html - name: Qdrant Vector Database id: spring-ai-vectordb-qdrant - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-qdrant-store-spring-boot-starter description: Spring AI vector database support for Qdrant. It is an open-source, high-performance vector search engine/database. @@ -1610,7 +1610,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/qdrant.html - name: Weaviate Vector Database id: spring-ai-vectordb-weaviate - compatibility-range: "[3.2.0-M1,3.3.0-M1)" + compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-weaviate-store-spring-boot-starter description: Spring AI vector database support for Weaviate, an open-source vector database. It allows you to store data objects and vector embeddings from your favorite ML-models and scale seamlessly into billions of data objects. @@ -1621,7 +1621,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/weaviate.html - name: Timefold Solver id: timefold-solver - compatibilityRange: "[2.6.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0-M1)" groupId: ai.timefold.solver artifactId: timefold-solver-spring-boot-starter description: AI solver to optimize operations and scheduling. @@ -1700,18 +1700,18 @@ initializr: id: groovy default: false bootVersions: - - name: 3.2.0 (SNAPSHOT) - id: 3.2.0-SNAPSHOT + - name: 3.3.1 (SNAPSHOT) + id: 3.3.1-SNAPSHOT default: false - - name: 3.2.0 (RC1) - id: 3.2.0-RC1 + - name: 3.3.0 + id: 3.3.0 + default: true + - name: 3.2.7 (SNAPSHOT) + id: 3.2.7-SNAPSHOT default: false - - name: 3.1.6 (SNAPSHOT) - id: 3.1.6-SNAPSHOT + - name: 3.2.6 + id: 3.2.6 default: false - - name: 3.1.5 - id: 3.1.5 - default: true --- diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java index 860ae36d26..cefd302996 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java @@ -31,21 +31,23 @@ */ class GradleBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + @Test void linksAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", "3.1.0").contains( + assertHelpDocument("gradle-build", SPRING_BOOT_VERSION).contains( "* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.1.0/gradle-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.1.0/gradle-plugin/reference/html/#build-image)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/gradle-plugin/reference/html/)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.3.0/gradle-plugin/reference/html/#build-image)"); } @Test void linksNotAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", "3.1.0").doesNotContain( + assertHelpDocument("maven-build", SPRING_BOOT_VERSION).doesNotContain( "* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.1.0/gradle-plugin/reference/html/)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/gradle-plugin/reference/html/)"); } private ListAssert assertHelpDocument(String type, String version) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java index 48aba4a766..56a17532e5 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java @@ -31,19 +31,21 @@ */ class MavenBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + @Test void linksAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", "3.1.0").contains( + assertHelpDocument("maven-build", SPRING_BOOT_VERSION).contains( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.1.0/maven-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.1.0/maven-plugin/reference/html/#build-image)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/maven-plugin/reference/html/)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.3.0/maven-plugin/reference/html/#build-image)"); } @Test void linksNotAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", "3.1.0").doesNotContain( + assertHelpDocument("gradle-build", SPRING_BOOT_VERSION).doesNotContain( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.1.0/maven-plugin/)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/maven-plugin/)"); } private ListAssert assertHelpDocument(String type, String version) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java index 8acf77a728..c2b3ff2ab0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java @@ -33,13 +33,13 @@ class KotlinCoroutinesCustomizerTests extends AbstractExtensionTests { @Test void kotlinCoroutinesIsAdded() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("3.1.0"); + request.setBootVersion("3.3.0"); request.setLanguage("kotlin"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("org.jetbrains.kotlinx", "kotlinx-coroutines-reactor"); assertThat(project).textFile("HELP.md") .contains( - "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring/docs/6.0.9/spring-framework-reference/languages.html#coroutines)"); + "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring/docs/6.1.8/spring-framework-reference/languages.html#coroutines)"); } @Test diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java index 1ec6dc0a95..8297c5168f 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java @@ -36,29 +36,21 @@ class ActiveMQProjectGenerationConfigurationTests extends AbstractExtensionTests @Test void dockerComposeWhenDockerComposeIsNotSelectedDoesNotCreateService() { ProjectRequest request = createProjectRequest("web", "activemq"); - request.setBootVersion("3.2.0-M1"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } - @Test - void dockerComposeWhenIncompatibleSpringBootVersionDoesNotCreateService() { - ProjectRequest request = createProjectRequest("docker-compose", "activemq"); - request.setBootVersion("3.1.1"); - assertThat(composeFile(request)).doesNotContain("activemq"); - } - @Test void dockerComposeCreatesAppropriateService() { ProjectRequest request = createProjectRequest("docker-compose", "activemq"); - request.setBootVersion("3.2.0-M1"); + request.setBootVersion("3.2.0"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/activemq.yaml")); } @Test void dockerComposeCreatesAppropriateServiceWithVersion33() { ProjectRequest request = createProjectRequest("docker-compose", "activemq"); - request.setBootVersion("3.3.0-M2"); + request.setBootVersion("3.3.0"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/activemq-classic.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java index 2d31059658..008255cedc 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java @@ -32,10 +32,12 @@ */ class ArtemisProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + @Test void dockerComposeWhenDockerComposeIsNotSelectedDoesNotCreateService() { ProjectRequest request = createProjectRequest("web", "artemis"); - request.setBootVersion("3.3.0-M2"); + request.setBootVersion(SPRING_BOOT_VERSION); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @@ -43,14 +45,14 @@ void dockerComposeWhenDockerComposeIsNotSelectedDoesNotCreateService() { @Test void dockerComposeWhenIncompatibleSpringBootVersionDoesNotCreateService() { ProjectRequest request = createProjectRequest("docker-compose", "artemis"); - request.setBootVersion("3.1.1"); + request.setBootVersion("3.2.0"); assertThat(composeFile(request)).doesNotContain("artemis"); } @Test void dockerComposeCreatesAppropriateService() { ProjectRequest request = createProjectRequest("docker-compose", "artemis"); - request.setBootVersion("3.3.0-M2"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/artemis.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java index 3f1e6266c0..4fe4f80050 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java @@ -30,100 +30,97 @@ */ class FlywayBuildCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION_3_2 = "3.2.0"; + + private static final String SPRING_BOOT_VERSION_3_3 = "3.3.0"; + @Test void mariadbOnly() { - ProjectRequest projectRequest = createProject("3.1.0", "mariadb"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "mariadb"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mariadb")) .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); } @Test void mysqlOnly() { - ProjectRequest projectRequest = createProject("3.1.0", "mysql"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "mysql"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mysql")) .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); } @Test void sqlserverOnly() { - ProjectRequest projectRequest = createProject("3.1.0", "sqlserver"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "sqlserver"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("sqlserver")) .doesNotHaveDependency("org.flywaydb", "flyway-sqlserver"); } @Test void oracleOnly() { - ProjectRequest projectRequest = createProject("3.2.0-M1", "oracle"); - assertThat(mavenPom(projectRequest)).hasDependency(getDependency("oracle")) - .doesNotHaveDependency("org.flywaydb", "flyway-database-oracle"); - } - - @Test - void oracleAndFlywayPreviousTo32M1() { - ProjectRequest projectRequest = createProject("3.1.0", "oracle", "flyway"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "oracle"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("oracle")) .doesNotHaveDependency("org.flywaydb", "flyway-database-oracle"); } @Test void mariadbAndFlyway() { - ProjectRequest projectRequest = createProject("3.1.0", "mariadb", "flyway"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "mariadb", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mariadb")) .hasDependency("org.flywaydb", "flyway-mysql"); } @Test void mysqlAndFlyway() { - ProjectRequest projectRequest = createProject("3.1.0", "mysql", "flyway"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "mysql", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mysql")) .hasDependency("org.flywaydb", "flyway-mysql"); } @Test void sqlserverAndFlyway() { - ProjectRequest projectRequest = createProject("3.1.0", "sqlserver", "flyway"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "sqlserver", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("sqlserver")) .hasDependency("org.flywaydb", "flyway-sqlserver"); } @Test void oracleAndFlyway() { - ProjectRequest projectRequest = createProject("3.2.0-M1", "oracle", "flyway"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "oracle", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("oracle")) .hasDependency("org.flywaydb", "flyway-database-oracle"); } @Test void db2AndFlywayOnSpringBoot32() { - ProjectRequest projectRequest = createProject("3.2.0", "db2", "flyway"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "db2", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("db2")) .doesNotHaveDependency("org.flywaydb", "flyway-database-db2"); } @Test void db2AndFlyway() { - ProjectRequest projectRequest = createProject("3.3.0-SNAPSHOT", "db2", "flyway"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_3, "db2", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("db2")) .hasDependency("org.flywaydb", "flyway-database-db2"); } @Test void derbyAndFlyway() { - ProjectRequest projectRequest = createProject("3.3.0-SNAPSHOT", "derby", "flyway"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_3, "derby", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("derby")) .hasDependency("org.flywaydb", "flyway-database-derby"); } @Test void hsqlAndFlyway() { - ProjectRequest projectRequest = createProject("3.3.0-SNAPSHOT", "hsql", "flyway"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_3, "hsql", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("hsql")) .hasDependency("org.flywaydb", "flyway-database-hsqldb"); } @Test void hsqlAndPostgres() { - ProjectRequest projectRequest = createProject("3.3.0-SNAPSHOT", "postgresql", "flyway"); + ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_3, "postgresql", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("postgresql")) .hasDependency("org.flywaydb", "flyway-database-postgresql"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java index c23537d566..ceaad5ab42 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java @@ -47,24 +47,24 @@ class GraalVmHelpDocumentCustomizerTests extends AbstractExtensionTests { @Test void mavenBuildAddLinkToMavenAotPlugin() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.0.0-RC1")); + description.setPlatformVersion(Version.parse("3.2.0")); HelpDocument document = customize(description, new MavenBuild()); assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); assertThat(link.getHref()) - .isEqualTo("https://docs.spring.io/spring-boot/docs/3.0.0-RC1/maven-plugin/reference/htmlsingle/#aot"); + .isEqualTo("https://docs.spring.io/spring-boot/docs/3.2.0/maven-plugin/reference/htmlsingle/#aot"); }); } @Test void gradleBuildAddLinkToGradleAotPlugin() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.0.0-RC1")); + description.setPlatformVersion(Version.parse("3.2.0")); HelpDocument document = customize(description, new GradleBuild()); assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); assertThat(link.getHref()) - .isEqualTo("https://docs.spring.io/spring-boot/docs/3.0.0-RC1/gradle-plugin/reference/htmlsingle/#aot"); + .isEqualTo("https://docs.spring.io/spring-boot/docs/3.2.0/gradle-plugin/reference/htmlsingle/#aot"); }); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index c6d6568af2..f404440595 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -34,6 +34,8 @@ */ class GraalVmProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + @Test void gradleBuildWithoutNativeDoesNotConfigureNativeBuildTools() { ProjectRequest request = createProjectRequest("web"); @@ -60,9 +62,10 @@ void mavenBuildConfigureNativeBuildtoolsPlugint() { @Test void gradleBuildConfigureNativeBuildToolsPlugin(@Autowired MavenVersionResolver mavenVersionResolver) { - String nbtVersion = NativeBuildtoolsVersionResolver.resolve(mavenVersionResolver, Version.parse("3.1.0")); + String nbtVersion = NativeBuildtoolsVersionResolver.resolve(mavenVersionResolver, + Version.parse(SPRING_BOOT_VERSION)); ProjectRequest request = createNativeProjectRequest(); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).hasPlugin("org.graalvm.buildtools.native", nbtVersion); } @@ -137,7 +140,7 @@ void groovyProjectDoesNotConfigureGraalVm() { private ProjectRequest createNativeProjectRequest(String... dependencies) { ProjectRequest projectRequest = createProjectRequest(dependencies); projectRequest.getDependencies().add(0, "native"); - projectRequest.setBootVersion("3.1.0"); + projectRequest.setBootVersion(SPRING_BOOT_VERSION); return projectRequest; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java index a7b3cf8848..e28c24445b 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java @@ -31,10 +31,12 @@ */ class HillaProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.2.0"; + @Test void mavenBuildWithHillaAddProductionProfile() { ProjectRequest request = createProjectRequest("hilla", "data-jpa"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasProfile("production") .contains(new ClassPathResource("dependency/hilla/hilla-maven-profile.xml")); } @@ -42,28 +44,28 @@ void mavenBuildWithHillaAddProductionProfile() { @Test void mavenBuildWithoutHillaDoesNotAddProductionProfile() { ProjectRequest request = createProjectRequest("data-jpa"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).doesNotContain("hilla"); } @Test void gradleBuildWithHillaConfigurePlugin() { ProjectRequest request = createProjectRequest("hilla", "data-jpa"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).hasPlugin("dev.hilla"); } @Test void gradleBuildWithHillaConfigureTask() { ProjectRequest request = createProjectRequest("data-jpa"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).doesNotContain("hilla"); } @Test void projectWithHillaCustomizesGitIgnore() { ProjectRequest request = createProjectRequest("hilla", "data-jpa"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(generateProject(request)).textFile(".gitignore").contains("node_modules/", "frontend/generated/"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java index 41dd93788b..31e04066a5 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java @@ -30,10 +30,12 @@ */ class MyBatisTestBuildCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.2.0"; + @Test void mybatisIsAddedWithSecurity() { ProjectRequest request = createProjectRequest("mybatis"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(mybatis()) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(mybatisTest()) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java index 0d7030bd39..bc75bcf8e5 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java @@ -31,11 +31,14 @@ */ class ObservabilityActuatorBuildCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + @ParameterizedTest @ValueSource(strings = { "datadog", "dynatrace", "influx", "graphite", "new-relic", "distributed-tracing", "zipkin", "wavefront" }) void actuatorIsAddedWithObservabilityEntries(String dependency) { - assertThat(generateProject("3.1.0", dependency)).mavenBuild().hasDependency(getDependency("actuator")); + assertThat(generateProject(SPRING_BOOT_VERSION, dependency)).mavenBuild() + .hasDependency(getDependency("actuator")); } private ProjectStructure generateProject(String bootVersion, String... dependencies) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java index 65cb81abba..5fe3cdec20 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java @@ -29,6 +29,8 @@ */ class OktaHelpDocumentCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.2.0"; + @Test void oktaSectionWithOktaDependencyIsPresent() { assertHelpDocument("okta").contains("## OAuth 2.0 and OIDC with Okta"); @@ -41,7 +43,7 @@ void oktaSectionWithoutOktaDependencyIsMissing() { private TextAssert assertHelpDocument(String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); ProjectStructure project = generateProject(request); return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java index ec5b119195..4531d3e4c8 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java @@ -32,6 +32,8 @@ */ class OracleProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.2.0"; + @Test void doesNotGenerateComposeYamlWithoutDockerCompose() { ProjectRequest request = createProjectRequest("web", "oracle"); @@ -39,34 +41,17 @@ void doesNotGenerateComposeYamlWithoutDockerCompose() { assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } - @Test - void createsOracleXeServiceWithBoot31() { - ProjectRequest request = createProjectRequest("docker-compose", "oracle"); - request.setBootVersion("3.1.0"); - assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle-xe.yaml")); - } - @Test void createsOracleFreeServiceWithBoot32() { ProjectRequest request = createProjectRequest("docker-compose", "oracle"); - request.setBootVersion("3.2.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle-free.yaml")); } - @Test - void declaresOracleXeContainerBeanWithBoot31() { - ProjectRequest request = createProjectRequest("testcontainers", "oracle"); - request.setBootVersion("3.1.0"); - request.setLanguage("java"); - assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") - .contains("import org.testcontainers.containers.OracleContainer;") - .contains(" return new OracleContainer(DockerImageName.parse(\"gvenzl/oracle-xe:latest\"));"); - } - @Test void declaresOracleFreeContainerBeanWithBoot32() { ProjectRequest request = createProjectRequest("testcontainers", "oracle"); - request.setBootVersion("3.2.0"); + request.setBootVersion(SPRING_BOOT_VERSION); request.setLanguage("java"); assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") .contains("import org.testcontainers.oracle.OracleContainer;") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java index 9885762aca..17edd1cbe2 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java @@ -37,10 +37,12 @@ */ class SpringAzureProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.2.0"; + @ParameterizedTest @MethodSource("azureDependencies") void onlyAzureDependency(String dependencyId) { - ProjectStructure project = generateProject("3.1.0", dependencyId); + ProjectStructure project = generateProject(SPRING_BOOT_VERSION, dependencyId); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency(dependencyId)) @@ -52,7 +54,7 @@ void onlyAzureDependency(String dependencyId) { @Test void onlyActuator() { - ProjectStructure project = generateProject("3.1.0", "actuator"); + ProjectStructure project = generateProject(SPRING_BOOT_VERSION, "actuator"); assertThat(project).mavenBuild() .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") .hasDependenciesSize(2) @@ -63,7 +65,7 @@ void onlyActuator() { @ParameterizedTest @MethodSource("azureDependencies") void azureDependencyWithActuator(String dependencyId) { - ProjectStructure project = generateProject("3.1.0", dependencyId, "actuator"); + ProjectStructure project = generateProject(SPRING_BOOT_VERSION, dependencyId, "actuator"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency(dependencyId)) @@ -74,7 +76,7 @@ void azureDependencyWithActuator(String dependencyId) { @Test void onlyIntegration() { - ProjectStructure project = generateProject("3.1.0", "integration"); + ProjectStructure project = generateProject(SPRING_BOOT_VERSION, "integration"); assertThat(project).mavenBuild() .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") .hasDependenciesSize(3) @@ -85,7 +87,7 @@ void onlyIntegration() { @Test void azureStorageWithIntegration() { - ProjectStructure project = generateProject("3.1.0", "azure-storage", "integration"); + ProjectStructure project = generateProject(SPRING_BOOT_VERSION, "azure-storage", "integration"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency("azure-storage")) @@ -97,7 +99,7 @@ void azureStorageWithIntegration() { @Test void azureJdbcWithMysql() { - ProjectStructure project = generateProject("3.1.0", "mysql", "azure-support"); + ProjectStructure project = generateProject(SPRING_BOOT_VERSION, "mysql", "azure-support"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-mysql"); @@ -107,7 +109,7 @@ void azureJdbcWithMysql() { @Test void azureJdbcWithPostgresql() { - ProjectStructure project = generateProject("3.1.0", "postgresql", "azure-support"); + ProjectStructure project = generateProject(SPRING_BOOT_VERSION, "postgresql", "azure-support"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-postgresql"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java index 34a4930e0b..d67367e344 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java @@ -60,7 +60,7 @@ void dockerComposeSupportHasOptionalScope() { @Test void springBoot32DoesNotConfigureJammyBaseBuilder() { ProjectRequest request = createProjectRequest(); - request.setBootVersion("3.2.0-RC1"); + request.setBootVersion("3.2.0"); assertThat(mavenPom(request)).doesNotContain(""); } @@ -102,14 +102,14 @@ void mavenWithDockerComposeSupportHasOptionalScope() { @Test void springBoot32WithGroovyDslDoesNotConfigureJammyBaseBuilder() { ProjectRequest request = createProjectRequest(); - request.setBootVersion("3.2.0-RC1"); + request.setBootVersion("3.2.0"); assertThat(gradleBuild(request)).doesNotContain("builder = '"); } @Test void springBoot32WithKotlinDslDoesNotConfigureJammyBaseBuilder() { ProjectRequest request = createProjectRequest(); - request.setBootVersion("3.2.0-RC1"); + request.setBootVersion("3.2.0"); assertThat(gradleKotlinDslBuild(request)).doesNotContain("builder.set(\""); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java index 093715c49f..970d329fc4 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java @@ -114,15 +114,6 @@ void connectionNotAddedWhenPulsarNotSelected() { (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); } - @Test - void connectionNotAddedWhenIncompatibleBootVersionSelected() { - MutableProjectDescription description = new MutableProjectDescription(); - description.addDependency("pulsar", mock(Dependency.class)); - description.addDependency("testcontainers", mock(Dependency.class)); - this.projectTester.configure(description, - (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); - } - @ParameterizedTest @ValueSource(strings = { "pulsar", "pulsar-reactive" }) void connectionAddedWhenTestcontainersAndPulsarSelectedWithCompatibleBootVersion(String pulsarDependencyId) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java index 8418d1bccb..4c6b9d3134 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java @@ -30,10 +30,12 @@ */ class VaadinProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.2.0"; + @Test void mavenBuildWithVaadinAddProductionProfileWithoutProductionModeFlag() { ProjectRequest request = createProjectRequest("vaadin", "data-jpa"); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasProfile("production") .lines() .containsSequence(" ", " production", " ", @@ -88,7 +90,7 @@ void gitIgnoreWithoutVaadinDoesNotIgnoreNodeModules() { @Override protected ProjectRequest createProjectRequest(String... dependencies) { ProjectRequest request = super.createProjectRequest(dependencies); - request.setBootVersion("3.1.0"); + request.setBootVersion(SPRING_BOOT_VERSION); return request; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java index 2ad2b564df..b6452e134d 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java @@ -30,9 +30,11 @@ */ class InvalidJvmVersionHelpDocumentCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + @Test void warningAddedWithUnsupportedCombination() { - assertHelpDocument("3.1.0", "11").lines() + assertHelpDocument(SPRING_BOOT_VERSION, "11").lines() .containsSubsequence("# Read Me First", "* The JVM level was changed from '11' to '17', review the [JDK Version Range](https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range) on the wiki for more details."); } @@ -40,17 +42,17 @@ void warningAddedWithUnsupportedCombination() { @Test void warningAddedWithUnsupportedKotlinVersion() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("3.1.0"); - request.setJavaVersion("21"); + request.setBootVersion(SPRING_BOOT_VERSION); + request.setJavaVersion("22"); request.setLanguage(KotlinLanguage.ID); assertHelpDocument(request).lines() .containsSubsequence("# Read Me First", - "* The JVM level was changed from '21' to '17' as the Kotlin version does not support Java 21 yet."); + "* The JVM level was changed from '22' to '21' as the Kotlin version does not support Java 22 yet."); } @Test void warningNotAddedWithCompatibleVersion() { - assertHelpDocument("3.1.0", "17").doesNotContain("# Read Me First"); + assertHelpDocument(SPRING_BOOT_VERSION, "17").doesNotContain("# Read Me First"); } private TextAssert assertHelpDocument(ProjectRequest request) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java index 8dd78c6751..b3579fc4c2 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java @@ -32,7 +32,6 @@ class DefaultApplicationPropertiesCustomizerTests extends AbstractExtensionTests @Test void shouldAddSpringApplicationName() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion("3.1.0"); request.setJavaVersion("21"); request.setName("test"); assertApplicationProperties(request).lines().contains("spring.application.name=test"); diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index c350e8c9a8..d94d38668b 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -37,12 +37,12 @@ class JavaVersionProjectDescriptionCustomizerTests extends AbstractExtensionTest @Test void javaUnknownVersionIsLeftAsIs() { - assertThat(mavenPom(javaProject("9999999", "3.1.0"))).hasProperty("java.version", "9999999"); + assertThat(mavenPom(javaProject("9999999", "3.3.0"))).hasProperty("java.version", "9999999"); } @Test void javaInvalidVersionIsLeftAsIs() { - assertThat(mavenPom(javaProject("${another.version}", "3.1.0"))).hasProperty("java.version", + assertThat(mavenPom(javaProject("${another.version}", "3.3.0"))).hasProperty("java.version", "${another.version}"); } @@ -61,11 +61,6 @@ void gradleGroovyBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String lan assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasSourceCompatibility(javaVersion); } - @Test - void kotlinIsNotSupportedWithJava21AndSpringBoot31() { - assertThat(mavenPom(kotlinProject("21", "3.1.6"))).hasProperty("java.version", "17"); - } - @Test void java22IsNotSupportedWithBoot323() { assertThat(mavenPom(javaProject("22", "3.2.3"))).hasProperty("java.version", "21"); @@ -86,17 +81,17 @@ static Stream supportedGradleGroovyParameters() { } private static Stream supportedJavaParameters() { - return Stream.of(java("17", "3.1.0"), java("21", "3.1.0"), java("17", "3.2.0"), java("21", "3.2.0"), - java("22", "3.2.4"), java("17", "3.3.0-RC1"), java("21", "3.3.0-RC1"), java("22", "3.3.0-RC1")); + return Stream.of(java("17", "3.2.0"), java("21", "3.2.0"), java("22", "3.2.4"), java("17", "3.3.0"), + java("21", "3.3.0"), java("22", "3.3.0")); } private static Stream supportedKotlinParameters() { - return Stream.of(kotlin("17", "3.1.0"), kotlin("21", "3.2.0"), kotlin("21", "3.3.0-M2")); + return Stream.of(kotlin("21", "3.2.0"), kotlin("21", "3.3.0")); } private static Stream supportedGroovyParameters() { - return Stream.of(groovy("17", "3.1.0"), groovy("21", "3.1.0"), groovy("21", "3.2.0"), groovy("22", "3.2.4"), - groovy("21", "3.3.0-M2"), groovy("22", "3.3.0-M3")); + return Stream.of(groovy("21", "3.2.0"), groovy("22", "3.2.4"), groovy("21", "3.3.0-M2"), + groovy("22", "3.3.0-M3")); } private static Arguments java(String javaVersion, String springBootVersion) { diff --git a/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java index d15c5b74d3..6a95af4302 100644 --- a/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java @@ -63,10 +63,10 @@ void clearCache() { @Test void managedDependenciesAreCached() { Map dependencies = this.versionResolver.resolveDependencies("org.springframework.boot", - "spring-boot-dependencies", "3.1.0"); + "spring-boot-dependencies", "3.2.0"); assertThat(dependencies).isNotNull(); ValueWrapper valueWrapper = this.cache - .get("dependencies-org.springframework.boot:spring-boot-dependencies:3.1.0"); + .get("dependencies-org.springframework.boot:spring-boot-dependencies:3.2.0"); assertThat(valueWrapper).isNotNull(); assertThat(valueWrapper.get()).isInstanceOf(Map.class); } @@ -74,9 +74,9 @@ void managedDependenciesAreCached() { @Test void managedPluginsAreCached() { Map plugins = this.versionResolver.resolvePlugins("org.springframework.boot", - "spring-boot-dependencies", "3.1.0"); + "spring-boot-dependencies", "3.2.0"); assertThat(plugins).isNotNull(); - ValueWrapper valueWrapper = this.cache.get("plugins-org.springframework.boot:spring-boot-dependencies:3.1.0"); + ValueWrapper valueWrapper = this.cache.get("plugins-org.springframework.boot:spring-boot-dependencies:3.2.0"); assertThat(valueWrapper).isNotNull(); assertThat(valueWrapper.get()).isInstanceOf(Map.class); } From c2b11a0a52cdd66f678d97ea245c6d0545c42191 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 24 May 2024 14:12:29 +0200 Subject: [PATCH 527/825] Remove OracleXE This was only used for Boot applications < 3.2.0, which are no longer supported. --- .../start/site/container/SimpleDockerServiceResolver.java | 8 -------- start-site/src/test/resources/compose/oracle-xe.yaml | 7 ------- 2 files changed, 15 deletions(-) delete mode 100644 start-site/src/test/resources/compose/oracle-xe.yaml diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index 268de1f56e..ef615d37e5 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -45,7 +45,6 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("mysql", mysql()); this.dockerServices.put("neo4j", neo4j()); this.dockerServices.put("oracleFree", oracleFree()); - this.dockerServices.put("oracleXe", oracleXe()); this.dockerServices.put("pgvector", pgvector()); this.dockerServices.put("postgres", postgres()); this.dockerServices.put("pulsar", pulsar()); @@ -121,13 +120,6 @@ private static DockerService oracleFree() { .build(); } - private static DockerService oracleXe() { - return DockerService.withImageAndTag("gvenzl/oracle-xe") - .website("https://hub.docker.com/r/gvenzl/oracle-xe") - .ports(1521) - .build(); - } - private static DockerService pgvector() { return DockerService.withImageAndTag("pgvector/pgvector:pg16") .website("https://hub.docker.com/r/pgvector/pgvector") diff --git a/start-site/src/test/resources/compose/oracle-xe.yaml b/start-site/src/test/resources/compose/oracle-xe.yaml deleted file mode 100644 index 6fbff0e486..0000000000 --- a/start-site/src/test/resources/compose/oracle-xe.yaml +++ /dev/null @@ -1,7 +0,0 @@ -services: - oracle: - image: 'gvenzl/oracle-xe:latest' - environment: - - 'ORACLE_PASSWORD=secret' - ports: - - '1521' From f03572da04d438bd09c5147978f97a764ee10188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Sat, 25 May 2024 10:17:09 +0200 Subject: [PATCH 528/825] Set Timefold Solver compatibility with Boot 3.3.0 See gh-1478 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 72379c64cb..500e862fa3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -147,7 +147,7 @@ initializr: artifactId: timefold-solver-bom versionProperty: timefold-solver.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.4.0-M1)" version: 1.10.0 vaadin: groupId: com.vaadin From dd0ff9fcb0c4d312c3ecdd48dc4fc3de25ee5240 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 27 May 2024 08:46:08 +0200 Subject: [PATCH 529/825] Polish "Set Timefold Solver compatibility with Boot 3.3.0" See gh-1478 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 500e862fa3..0a690b78e1 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1621,7 +1621,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/weaviate.html - name: Timefold Solver id: timefold-solver - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" groupId: ai.timefold.solver artifactId: timefold-solver-spring-boot-starter description: AI solver to optimize operations and scheduling. From a7948cfe281b035a9d71f64b5610ed77f56876d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 02:47:37 +0000 Subject: [PATCH 530/825] Bump azure/login from 2.1.0 to 2.1.1 Bumps [azure/login](https://github.com/azure/login) from 2.1.0 to 2.1.1. - [Release notes](https://github.com/azure/login/releases) - [Commits](https://github.com/azure/login/compare/6b2456866fc08b011acb422a92a4aa20e2c4de32...6c251865b4e6290e7b78be643ea2d005bc51f69a) --- updated-dependencies: - dependency-name: azure/login dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] See gh-1479 --- .github/workflows/build-and-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 53ec709e66..26f143e065 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -36,7 +36,7 @@ jobs: run: ./mvnw --batch-mode --update-snapshots verify - name: Set up Azure - uses: azure/login@6b2456866fc08b011acb422a92a4aa20e2c4de32 + uses: azure/login@6c251865b4e6290e7b78be643ea2d005bc51f69a with: creds: ${{ secrets.AZURE_CREDENTIALS_SPRING_IO }} From c1e0d911f796f9644c56c9a08a6936625e4f2d9a Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 27 May 2024 13:59:24 +0200 Subject: [PATCH 531/825] Clean up obsolete templates --- .../templates/spring-native-0.9.x.mustache | 16 --------- .../templates/spring-native.mustache | 34 ------------------- 2 files changed, 50 deletions(-) delete mode 100644 start-site/src/main/resources/templates/spring-native-0.9.x.mustache delete mode 100644 start-site/src/main/resources/templates/spring-native.mustache diff --git a/start-site/src/main/resources/templates/spring-native-0.9.x.mustache b/start-site/src/main/resources/templates/spring-native-0.9.x.mustache deleted file mode 100644 index cbc1a8759f..0000000000 --- a/start-site/src/main/resources/templates/spring-native-0.9.x.mustache +++ /dev/null @@ -1,16 +0,0 @@ -## Spring Native - -This project has been configured to let you generate a lightweight container running a native executable. -Docker should be installed and configured on your machine prior to creating the image, see [the Getting Started section of the reference guide](https://docs.spring.io/spring-native/docs/{{version}}/reference/htmlsingle/#getting-started-buildpacks). - -To create the image, run the following goal: - -``` -$ {{cnbBuildImageCommand}} -``` - -Then, you can run the app like any other container: - -``` -$ {{cnbRunImageCommand}} -``` \ No newline at end of file diff --git a/start-site/src/main/resources/templates/spring-native.mustache b/start-site/src/main/resources/templates/spring-native.mustache deleted file mode 100644 index c593ab312a..0000000000 --- a/start-site/src/main/resources/templates/spring-native.mustache +++ /dev/null @@ -1,34 +0,0 @@ -## Spring Native - -This project has been configured to let you generate either a lightweight container or a native executable. - -### Lightweight Container with Cloud Native Buildpacks -If you're already familiar with Spring Boot container images support, this is the easiest way to get started with Spring Native. -Docker should be installed and configured on your machine prior to creating the image, see [the Getting Started section of the reference guide](https://docs.spring.io/spring-native/docs/{{version}}/reference/htmlsingle/#getting-started-buildpacks). - -To create the image, run the following goal: - -``` -$ {{cnbBuildImageCommand}} -``` - -Then, you can run the app like any other container: - -``` -$ {{cnbRunImageCommand}} -``` - -### Executable with Native Build Tools -Use this option if you want to explore more options such as running your tests in a native image. -The GraalVM native-image compiler should be installed and configured on your machine, see [the Getting Started section of the reference guide](https://docs.spring.io/spring-native/docs/{{version}}/reference/htmlsingle/#getting-started-native-build-tools). - -To create the executable, run the following goal: - -``` -$ {{nbtBuildImageCommand}} -``` - -Then, you can run the app as follows: -``` -$ {{nbtRunImageCommand}} -``` \ No newline at end of file From f234ccf519943dc3f90cfaae988f373469da3b04 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 27 May 2024 14:02:13 +0200 Subject: [PATCH 532/825] Update Spring Cloud GCP to 5.3.0 Closes gh-1471 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0a690b78e1..225169c8d5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -113,7 +113,7 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 5.1.2 + version: 5.3.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 730ab4fa757c0572b6ddbeadd4e7af6c377ade9c Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 27 May 2024 14:05:35 +0200 Subject: [PATCH 533/825] Update to Spring Boot 3.2.6 Closes gh-1482 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6547bc131b..0cfce4cc27 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.4 + 3.2.6 io.spring.start start-parent From 0e3cca2d6f825b14b8cdbb2d01901bd89e69b76c Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 27 May 2024 14:13:37 +0200 Subject: [PATCH 534/825] Polish --- .../ElasticsearchProjectGenerationConfiguration.java | 2 +- .../mysql/MysqlProjectGenerationConfiguration.java | 2 +- .../oracle/OracleProjectGenerationConfiguration.java | 6 ++++-- .../SpringAmqpProjectGenerationConfiguration.java | 2 +- .../SpringCloudProjectGenerationConfiguration.java | 12 ++++++------ .../SpringKafkaProjectGenerationConfiguration.java | 7 ++++--- .../SqlServerProjectGenerationConfiguration.java | 2 +- ...TestcontainersProjectGenerationConfiguration.java | 2 -- 8 files changed, 18 insertions(+), 17 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java index 18a96d257e..1e74daf882 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java @@ -35,7 +35,7 @@ @ConditionalOnRequestedDependency("data-elasticsearch") class ElasticsearchProjectGenerationConfiguration { - private static String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.elasticsearch.ElasticsearchContainer"; + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.elasticsearch.ElasticsearchContainer"; @Bean @ConditionalOnRequestedDependency("testcontainers") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/mysql/MysqlProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/mysql/MysqlProjectGenerationConfiguration.java index 95a95520cf..49e35d8545 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/mysql/MysqlProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/mysql/MysqlProjectGenerationConfiguration.java @@ -35,7 +35,7 @@ @ConditionalOnRequestedDependency("mysql") class MysqlProjectGenerationConfiguration { - private static String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.MySQLContainer"; + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.MySQLContainer"; @Bean @ConditionalOnRequestedDependency("testcontainers") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java index db1f568ff4..ac7f70ec28 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java @@ -35,12 +35,14 @@ @ConditionalOnRequestedDependency("oracle") class OracleProjectGenerationConfiguration { + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.oracle.OracleContainer"; + @Bean @ConditionalOnRequestedDependency("testcontainers") ServiceConnectionsCustomizer oracleServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { return (serviceConnections) -> serviceResolver.doWith("oracleFree", - (service) -> serviceConnections.addServiceConnection(ServiceConnection.ofContainer("oracleFree", - service, "org.testcontainers.oracle.OracleContainer", false))); + (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("oracleFree", service, TESTCONTAINERS_CLASS_NAME, false))); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springamqp/SpringAmqpProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springamqp/SpringAmqpProjectGenerationConfiguration.java index 6c5a457f9f..29ccafce5c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springamqp/SpringAmqpProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springamqp/SpringAmqpProjectGenerationConfiguration.java @@ -35,7 +35,7 @@ @ConditionalOnRequestedDependency("amqp") class SpringAmqpProjectGenerationConfiguration { - private static String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.RabbitMQContainer"; + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.RabbitMQContainer"; @Bean SpringRabbitTestBuildCustomizer springAmqpTestBuildCustomizer() { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java index 27415f50b8..0c668f7f7f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudProjectGenerationConfiguration.java @@ -42,24 +42,24 @@ * @author Stephane Nicoll */ @ProjectGenerationConfiguration -public class SpringCloudProjectGenerationConfiguration { +class SpringCloudProjectGenerationConfiguration { private final InitializrMetadata metadata; private final ProjectDescription description; - public SpringCloudProjectGenerationConfiguration(InitializrMetadata metadata, ProjectDescription description) { + SpringCloudProjectGenerationConfiguration(InitializrMetadata metadata, ProjectDescription description) { this.metadata = metadata; this.description = description; } @Bean - public SpringCloudFunctionBuildCustomizer springCloudFunctionBuildCustomizer() { + SpringCloudFunctionBuildCustomizer springCloudFunctionBuildCustomizer() { return new SpringCloudFunctionBuildCustomizer(this.metadata, this.description); } @Bean - public SpringCloudStreamBuildCustomizer springCloudStreamBuildCustomizer() { + SpringCloudStreamBuildCustomizer springCloudStreamBuildCustomizer() { return new SpringCloudStreamBuildCustomizer(); } @@ -69,14 +69,14 @@ SpringCloudProjectVersionResolver springCloudProjectVersionResolver(MavenVersion } @Bean - public SpringCloudFunctionHelpDocumentCustomizer springCloudFunctionHelpDocumentCustomizer(Build build, + SpringCloudFunctionHelpDocumentCustomizer springCloudFunctionHelpDocumentCustomizer(Build build, MustacheTemplateRenderer templateRenderer, SpringCloudProjectVersionResolver versionResolver) { return new SpringCloudFunctionHelpDocumentCustomizer(build, this.description, templateRenderer, versionResolver); } @Bean - public SpringCloudCircuitBreakerBuildCustomizer springCloudCircuitBreakerBuildCustomizer() { + SpringCloudCircuitBreakerBuildCustomizer springCloudCircuitBreakerBuildCustomizer() { return new SpringCloudCircuitBreakerBuildCustomizer(this.metadata, this.description); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java index af981eb215..d1b8c6a909 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java @@ -33,6 +33,8 @@ @ConditionalOnRequestedDependency("kafka") class SpringKafkaProjectGenerationConfiguration { + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.KafkaContainer"; + @Bean SpringKafkaBuildCustomizer springKafkaBuildCustomizer() { return new SpringKafkaBuildCustomizer(); @@ -41,9 +43,8 @@ SpringKafkaBuildCustomizer springKafkaBuildCustomizer() { @Bean @ConditionalOnRequestedDependency("testcontainers") ServiceConnectionsCustomizer kafkaServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { - return (serviceConnections) -> serviceResolver.doWith("kafka", - (service) -> serviceConnections.addServiceConnection(ServiceConnection.ofContainer("kafka", service, - "org.testcontainers.containers.KafkaContainer", false))); + return (serviceConnections) -> serviceResolver.doWith("kafka", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("kafka", service, TESTCONTAINERS_CLASS_NAME, false))); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sqlserver/SqlServerProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sqlserver/SqlServerProjectGenerationConfiguration.java index 50ad4fe5f1..1005a1d60b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/sqlserver/SqlServerProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sqlserver/SqlServerProjectGenerationConfiguration.java @@ -35,7 +35,7 @@ @ConditionalOnRequestedDependency("sqlserver") class SqlServerProjectGenerationConfiguration { - private static String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.MSSQLServerContainer"; + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.MSSQLServerContainer"; @Bean @ConditionalOnRequestedDependency("testcontainers") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java index b3f59fa575..4cedcf17a6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java @@ -20,7 +20,6 @@ import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.condition.ConditionalOnLanguage; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.io.IndentingWriterFactory; import io.spring.initializr.generator.language.groovy.GroovyLanguage; @@ -114,7 +113,6 @@ GroovyTestContainersApplicationCodeProjectContributor groovyTestContainersApplic @Bean @ConditionalOnLanguage(KotlinLanguage.ID) - @ConditionalOnPlatformVersion("3.1.1-SNAPSHOT") // https://github.com/spring-projects/spring-boot/issues/35756 KotlinTestContainersApplicationCodeProjectContributor kotlinTestContainersApplicationCodeProjectContributor( ServiceConnections serviceConnections) { return new KotlinTestContainersApplicationCodeProjectContributor(this.indentingWriterFactory, From 2401e9539cc7ea460a08e6c60f690a590474ea15 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 27 May 2024 14:18:43 +0200 Subject: [PATCH 535/825] Remove superfluous Gradle DSL classes for GraalVM Gradle and Kotlin DSL did the same thing, this condenses it down to only one class. --- .../graalvm/GraalVmGradleBuildCustomizer.java | 6 --- ...GraalVmGroovyDslGradleBuildCustomizer.java | 37 ------------------- ...GraalVmKotlinDslGradleBuildCustomizer.java | 30 --------------- ...GraalVmProjectGenerationConfiguration.java | 12 ++---- .../GraalVmGradleBuildCustomizerTests.java | 6 +-- ...VmGroovyDslGradleBuildCustomizerTests.java | 31 ---------------- ...VmKotlinDslGradleBuildCustomizerTests.java | 31 ---------------- 7 files changed, 5 insertions(+), 148 deletions(-) delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizer.java delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizer.java delete mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizerTests.java delete mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java index 377a1d7272..9041b1f01c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizer.java @@ -37,12 +37,6 @@ public final void customize(GradleBuild build) { if (this.nbtVersion != null) { build.plugins().add("org.graalvm.buildtools.native", (plugin) -> plugin.setVersion(this.nbtVersion)); } - // Spring Boot plugin - customizeSpringBootPlugin(build); - } - - protected void customizeSpringBootPlugin(GradleBuild build) { - } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizer.java deleted file mode 100644 index a5b4a7379c..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizer.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.graalvm; - -import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; - -/** - * {@link GraalVmGradleBuildCustomizer} implementations for projects using the Groovy DSL. - * - * @author Stephane Nicoll - */ -class GraalVmGroovyDslGradleBuildCustomizer extends GraalVmGradleBuildCustomizer { - - GraalVmGroovyDslGradleBuildCustomizer(String nbtVersion) { - super(nbtVersion); - } - - @Override - protected void customizeSpringBootPlugin(GradleBuild build) { - - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizer.java deleted file mode 100644 index c5d4e48eb6..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizer.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.graalvm; - -/** - * {@link GraalVmGradleBuildCustomizer} implementations for projects using the Kotlin DSL. - * - * @author Stephane Nicoll - */ -class GraalVmKotlinDslGradleBuildCustomizer extends GraalVmGradleBuildCustomizer { - - GraalVmKotlinDslGradleBuildCustomizer(String nbtVersion) { - super(nbtVersion); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java index 8711533bf9..ce41dda872 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java @@ -69,15 +69,9 @@ GraalVmMavenBuildCustomizer graalVmMavenBuildCustomizer() { } @Bean - @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) - GraalVmGroovyDslGradleBuildCustomizer graalVmGroovyDslGradleBuildCustomizer() { - return new GraalVmGroovyDslGradleBuildCustomizer(this.nbtVersion.get()); - } - - @Bean - @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) - GraalVmKotlinDslGradleBuildCustomizer graalVmKotlinDslGradleBuildCustomizer() { - return new GraalVmKotlinDslGradleBuildCustomizer(this.nbtVersion.get()); + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + GraalVmGradleBuildCustomizer graalVmGradleBuildCustomizer() { + return new GraalVmGradleBuildCustomizer(this.nbtVersion.get()); } @Bean diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java index ad1180bece..c7509f43cd 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGradleBuildCustomizerTests.java @@ -30,13 +30,11 @@ * * @author Stephane Nicoll */ -abstract class GraalVmGradleBuildCustomizerTests { - - protected abstract GraalVmGradleBuildCustomizer createCustomizer(String nbtVersion); +class GraalVmGradleBuildCustomizerTests { @Test void gradleBuildConfigureNativeBuildToolsPlugin() { - GraalVmGradleBuildCustomizer customizer = createCustomizer("1.0.0"); + GraalVmGradleBuildCustomizer customizer = new GraalVmGradleBuildCustomizer("1.0.0"); GradleBuild build = createBuild(); customizer.customize(build); GradlePlugin nbtPlugin = build.plugins() diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizerTests.java deleted file mode 100644 index 4cea3d6694..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmGroovyDslGradleBuildCustomizerTests.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2012-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.graalvm; - -/** - * Tests for {@link GraalVmGroovyDslGradleBuildCustomizer}. - * - * @author Stephane Nicoll - */ -class GraalVmGroovyDslGradleBuildCustomizerTests extends GraalVmGradleBuildCustomizerTests { - - @Override - protected GraalVmGroovyDslGradleBuildCustomizer createCustomizer(String nbtVersion) { - return new GraalVmGroovyDslGradleBuildCustomizer(nbtVersion); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizerTests.java deleted file mode 100644 index 523d37c730..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmKotlinDslGradleBuildCustomizerTests.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2012-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.graalvm; - -/** - * Tests for {@link GraalVmKotlinDslGradleBuildCustomizer}. - * - * @author Stephane Nicoll - */ -class GraalVmKotlinDslGradleBuildCustomizerTests extends GraalVmGradleBuildCustomizerTests { - - @Override - protected GraalVmKotlinDslGradleBuildCustomizer createCustomizer(String nbtVersion) { - return new GraalVmKotlinDslGradleBuildCustomizer(nbtVersion); - } - -} From fce115aea78b2484d80b7f279133974192ce20a4 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 27 May 2024 14:19:44 +0200 Subject: [PATCH 536/825] Remove useless ConditionalOnPlatformVersion annotations --- ...CodegenProjectGenerationConfiguration.java | 2 - ...abilityProjectGenerationConfiguration.java | 43 ++++++++----------- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java index fb6df253ff..4967169150 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfiguration.java @@ -19,7 +19,6 @@ import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; @@ -37,7 +36,6 @@ */ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("dgs-codegen") -@ConditionalOnPlatformVersion("3.2.0") class DgsCodegenProjectGenerationConfiguration { private final String dgsCodegenPluginVersion; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java index 0fdf01de9d..4c6b2e0cf3 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java @@ -23,7 +23,6 @@ import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; /** * Configuration for generation of projects that use observability. @@ -33,33 +32,27 @@ @ProjectGenerationConfiguration class ObservabilityProjectGenerationConfiguration { - @Configuration(proxyBeanMethods = false) - @ConditionalOnPlatformVersion("3.2.0") - static class ObservabilityConfiguration { - - @Bean - ObservabilityActuatorBuildCustomizer observabilityActuatorBuildCustomizer() { - return new ObservabilityActuatorBuildCustomizer(); - } - - @Bean - ObservabilityDistributedTracingBuildCustomizer observabilityDistributedTracingBuildCustomizer() { - return new ObservabilityDistributedTracingBuildCustomizer(); - } + @Bean + ObservabilityActuatorBuildCustomizer observabilityActuatorBuildCustomizer() { + return new ObservabilityActuatorBuildCustomizer(); + } - @Bean - ObservabilityHelpDocumentCustomizer observabilityHelpDocumentCustomizer(ProjectDescription description, - Build build) { - return new ObservabilityHelpDocumentCustomizer(description, build); - } + @Bean + ObservabilityDistributedTracingBuildCustomizer observabilityDistributedTracingBuildCustomizer() { + return new ObservabilityDistributedTracingBuildCustomizer(); + } - @Bean - @ConditionalOnRequestedDependency("wavefront") - @ConditionalOnPlatformVersion("[3.2.0, 3.3.0-M1)") - WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { - return new WavefrontHelpDocumentCustomizer("https://docs.wavefront.com/wavefront_springboot3.html", build); - } + @Bean + ObservabilityHelpDocumentCustomizer observabilityHelpDocumentCustomizer(ProjectDescription description, + Build build) { + return new ObservabilityHelpDocumentCustomizer(description, build); + } + @Bean + @ConditionalOnRequestedDependency("wavefront") + @ConditionalOnPlatformVersion("[3.2.0, 3.3.0-M1)") + WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { + return new WavefrontHelpDocumentCustomizer("https://docs.wavefront.com/wavefront_springboot3.html", build); } } From 91cc6f12a2a1536861380d2a614a84c0d4cee43f Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Mon, 27 May 2024 22:39:25 +0200 Subject: [PATCH 537/825] Upgrade to latest Spring Modulith releases and optimize dependencies See gh-1483 --- .../SpringModulithBuildCustomizer.java | 30 ++++++++++++------- start-site/src/main/resources/application.yml | 7 ++--- .../SpringModulithBuildCustomizerTests.java | 13 +++++++- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java index 38cde13677..820988ef03 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java @@ -39,6 +39,8 @@ class SpringModulithBuildCustomizer implements BuildCustomizer { private static final Collection OBSERVABILITY_DEPENDENCIES = List.of("actuator", "datadog", "graphite", "influx", "new-relic", "prometheus", "wavefront", "zipkin"); + private static final Collection PERSISTENCE = List.of("jdbc", "jpa", "mongodb"); + @Override public void customize(Build build) { DependencyContainer dependencies = build.dependencies(); @@ -49,22 +51,30 @@ public void customize(Build build) { dependencies.add("modulith-observability", modulithDependency("observability").scope(DependencyScope.RUNTIME)); } - addEventPublicationRegistryBackend(build); + + boolean persistenceBackendAdded = addEventPublicationRegistryBackend(build); + + if (persistenceBackendAdded) { + dependencies.remove("modulith"); + } + dependencies.add("modulith-starter-test", modulithDependency("starter-test").scope(DependencyScope.TEST_COMPILE)); } - private void addEventPublicationRegistryBackend(Build build) { + private boolean addEventPublicationRegistryBackend(Build build) { DependencyContainer dependencies = build.dependencies(); - if (dependencies.has("data-mongodb")) { - dependencies.add("modulith-starter-mongodb", modulithDependency("starter-mongodb")); - } - if (dependencies.has("data-jdbc")) { - dependencies.add("modulith-starter-jdbc", modulithDependency("starter-jdbc")); - } - if (dependencies.has("data-jpa")) { - dependencies.add("modulith-starter-jpa", modulithDependency("starter-jpa")); + return PERSISTENCE.stream() + .map((it) -> addPersistenceDependency(it, dependencies)) + .reduce(false, (l, r) -> l || r); + } + + private boolean addPersistenceDependency(String store, DependencyContainer dependencies) { + if (!dependencies.has("data-" + store)) { + return false; } + dependencies.add("modulith-starter-" + store, modulithDependency("starter-" + store)); + return true; } private Builder modulithDependency(String name) { diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 225169c8d5..137a8621c9 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -128,10 +128,9 @@ initializr: versionProperty: spring-modulith.version mappings: - compatibility-range: "[3.2.0,3.3.0-M1)" - version: 1.1.4 - - compatibility-range: "3.3.0-M1" - version: 1.2.0-RC1 - repositories: spring-milestones + version: 1.1.5 + - compatibility-range: "3.3.0" + version: 1.2.0 spring-shell: groupId: org.springframework.shell artifactId: spring-shell-dependencies diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java index e1ea2dd8d0..6e039726bc 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java @@ -40,9 +40,10 @@ class SpringModulithBuildCustomizerTests extends AbstractExtensionTests { private final SpringModulithBuildCustomizer customizer = new SpringModulithBuildCustomizer(); @Test - void registersTestStarterWhenModulithIsSelected() { + void registersTestAndCoreStarterWhenModulithIsSelected() { Build build = createBuild("modulith"); this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith"); assertThat(build.dependencies().ids()).contains("modulith-starter-test"); } @@ -70,6 +71,16 @@ void presenceOfSpringDataModuleAddsModuleEventStarter(String store) { build.dependencies().add("data-" + store); this.customizer.customize(build); assertThat(build.dependencies().ids()).contains("modulith-starter-" + store); + assertThat(build.dependencies().ids()).doesNotContain("modulith"); + } + + @ParameterizedTest + @ValueSource(strings = { "jdbc", "jpa", "mongodb" }) + void presenceOfSpringDataModuleRemovesCoreStarter(String store) { + Build build = createBuild("modulith"); + build.dependencies().add("data-" + store); + this.customizer.customize(build); + assertThat(build.dependencies().ids()).doesNotContain("modulith"); } private Build createBuild(String... dependencies) { From 01f64eff75ad4431a47a742338326979340b4ac0 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 28 May 2024 08:28:16 +0200 Subject: [PATCH 538/825] Polish "Upgrade to latest Spring Modulith releases and optimize dependencies" See gh-1483 --- .../springmodulith/SpringModulithBuildCustomizer.java | 5 +---- start-site/src/main/resources/application.yml | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java index 820988ef03..ac717639f2 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java @@ -51,13 +51,10 @@ public void customize(Build build) { dependencies.add("modulith-observability", modulithDependency("observability").scope(DependencyScope.RUNTIME)); } - boolean persistenceBackendAdded = addEventPublicationRegistryBackend(build); - if (persistenceBackendAdded) { dependencies.remove("modulith"); } - dependencies.add("modulith-starter-test", modulithDependency("starter-test").scope(DependencyScope.TEST_COMPILE)); } @@ -65,7 +62,7 @@ public void customize(Build build) { private boolean addEventPublicationRegistryBackend(Build build) { DependencyContainer dependencies = build.dependencies(); return PERSISTENCE.stream() - .map((it) -> addPersistenceDependency(it, dependencies)) + .map((persistence) -> addPersistenceDependency(persistence, dependencies)) .reduce(false, (l, r) -> l || r); } diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 137a8621c9..550a604681 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -129,7 +129,7 @@ initializr: mappings: - compatibility-range: "[3.2.0,3.3.0-M1)" version: 1.1.5 - - compatibility-range: "3.3.0" + - compatibility-range: "[3.3.0,3.4.0-M1)" version: 1.2.0 spring-shell: groupId: org.springframework.shell @@ -219,7 +219,7 @@ initializr: - name: Spring Modulith id: modulith bom: spring-modulith - compatibility-range: "3.2.0" + compatibility-range: "[3.2.0,3.4.0-M1)" group-id: org.springframework.modulith artifact-id: spring-modulith-starter-core description: Support for building modular monolithic applications. From bd3ce300c8f0b4002ca5b9d70149dd359a55138a Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 28 May 2024 09:47:10 +0200 Subject: [PATCH 539/825] Validate and clean up all compatibility ranges There are now no more unbounded ranges in the config, and Spring Cloud has been set to be compatible with 3.2.x only. The configuration is now consistently named 'compatibilityRange', and the range doesn't include any spaces. This removes some useless compatibilityRange declarations. It also moves the compatibilityRange for Spring AI to an upper level. --- start-site/src/main/resources/application.yml | 64 +++++++------------ .../SolaceBinderBuildCustomizerTests.java | 4 +- ...oudCircuitBreakerBuildCustomizerTests.java | 6 +- ...SpringCloudContractConfigurationTests.java | 6 ++ ...oudContractGradleBuildCustomizerTests.java | 33 ++++++---- ...loudContractMavenBuildCustomizerTests.java | 5 +- ...ringCloudFunctionBuildCustomizerTests.java | 5 ++ ...SpringCloudStreamBuildCustomizerTests.java | 11 +++- 8 files changed, 76 insertions(+), 58 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 550a604681..814f2e9915 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -81,7 +81,7 @@ initializr: artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "[3.2.0, 3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 4.0.0 spring-ai: groupId: org.springframework.ai @@ -97,7 +97,7 @@ initializr: versionProperty: spring-cloud.version order: 50 mappings: - - compatibilityRange: "3.2.0" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 2023.0.1 spring-cloud-azure: groupId: com.azure.spring @@ -127,9 +127,9 @@ initializr: artifactId: spring-modulith-bom versionProperty: spring-modulith.version mappings: - - compatibility-range: "[3.2.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 1.1.5 - - compatibility-range: "[3.3.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 1.2.0 spring-shell: groupId: org.springframework.shell @@ -138,7 +138,7 @@ initializr: mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 3.2.4 - - compatibility-range: "3.3.0-M1" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 3.3.0-M1 repositories: spring-milestones timefold-solver: @@ -158,7 +158,7 @@ initializr: gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: - compatibility-range: "3.2.0" + compatibilityRange: "3.2.0" dependencies: - name: Developer Tools content: @@ -170,12 +170,9 @@ initializr: starter: false - name: GraphQL DGS Code Generation id: dgs-codegen - compatibilityRange: "3.2.0" groupId: com.netflix.graphql.dgs.codegen artifactId: graphql-dgs-codegen-gradle - mappings: - - compatibilityRange: "3.2.0" - version: 6.2.1 + version: 6.2.1 description: Generate data types and type-safe APIs for querying GraphQL APIs by parsing schema files. starter: false - name: Spring Boot DevTools @@ -207,7 +204,6 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#appendix.configuration-metadata.annotation-processor - name: Docker Compose Support id: docker-compose - compatibilityRange: "3.2.0" groupId: org.springframework.boot artifactId: spring-boot-docker-compose scope: runtime @@ -219,7 +215,7 @@ initializr: - name: Spring Modulith id: modulith bom: spring-modulith - compatibility-range: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" group-id: org.springframework.modulith artifact-id: spring-modulith-starter-core description: Support for building modular monolithic applications. @@ -426,7 +422,6 @@ initializr: - name: OAuth2 Authorization Server id: oauth2-authorization-server description: Spring Boot integration for Spring Authorization Server. - compatibilityRange: "3.2.0-RC1" links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.security.oauth2.authorization-server @@ -518,17 +513,17 @@ initializr: id: mybatis compatibilityRange: "[3.2.0,3.3.0-M1)" description: Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. + groupId: org.mybatis.spring.boot + artifactId: mybatis-spring-boot-starter + mappings: + - compatibilityRange: "[3.2.0,3.3.0-M1)" + version: 3.0.3 links: - rel: guide href: https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start description: MyBatis Quick Start - rel: reference href: https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/ - groupId: org.mybatis.spring.boot - artifactId: mybatis-spring-boot-starter - mappings: - - compatibilityRange: "3.2.0" - version: 3.0.3 - name: Liquibase Migration id: liquibase description: Liquibase database migration and source control library. @@ -1007,12 +1002,12 @@ initializr: id: wavefront description: Publish metrics and optionally distributed traces to Tanzu Observability by Wavefront, a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and alert over data from across your entire stack. mappings: - - compatibility-range: "[3.2.0, 3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" groupId: com.wavefront artifactId: wavefront-spring-boot-starter version: 3.2.0 starter: true - - compatibility-range: "3.3.0-M1" + - compatibilityRange: "3.3.0-M1" groupId: io.micrometer artifactId: micrometer-registry-wavefront starter: false @@ -1046,6 +1041,7 @@ initializr: href: https://java.testcontainers.org/ - name: Contract Verifier bom: spring-cloud + compatibilityRange: "[3.2.0,3.3.0-M1)" id: cloud-contract-verifier description: Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development. groupId: org.springframework.cloud @@ -1056,6 +1052,7 @@ initializr: href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsingle/ - name: Contract Stub Runner bom: spring-cloud + compatibilityRange: "[3.2.0,3.3.0-M1)" id: cloud-contract-stub-runner description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests. groupId: org.springframework.cloud @@ -1076,6 +1073,7 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap.embedded - name: Spring Cloud bom: spring-cloud + compatibilityRange: "[3.2.0,3.3.0-M1)" content: - name: Cloud Bootstrap id: cloud-starter @@ -1107,6 +1105,7 @@ initializr: href: https://docs.spring.io/spring-cloud-task/docs/current/reference/html/ - name: Spring Cloud Config bom: spring-cloud + compatibilityRange: "[3.2.0,3.3.0-M1)" content: - name: Config Client id: cloud-config-client @@ -1157,6 +1156,7 @@ initializr: description: Spring Cloud Consul Quick Start - name: Spring Cloud Discovery bom: spring-cloud + compatibilityRange: "[3.2.0,3.3.0-M1)" content: - name: Eureka Discovery Client id: cloud-eureka @@ -1198,12 +1198,12 @@ initializr: href: https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#spring-cloud-consul-discovery - name: Spring Cloud Routing bom: spring-cloud + compatibilityRange: "[3.2.0,3.3.0-M1)" content: - name: Gateway id: cloud-gateway groupId: org.springframework.cloud artifactId: spring-cloud-starter-gateway-mvc - compatibilityRange: "3.2.0" description: Provides a simple, yet effective way to route to APIs in Servlet-based applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. links: - rel: reference @@ -1245,6 +1245,7 @@ initializr: href: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer - name: Spring Cloud Circuit Breaker bom: spring-cloud + compatibilityRange: "[3.2.0,3.3.0-M1)" content: - name: Resilience4J id: cloud-resilience4j @@ -1256,6 +1257,7 @@ initializr: href: https://docs.spring.io/spring-cloud-circuitbreaker/docs/current/reference/html/#configuring-resilience4j-circuit-breakers - name: Spring Cloud Messaging bom: spring-cloud + compatibilityRange: "[3.2.0,3.3.0-M1)" content: - name: Cloud Bus id: cloud-bus @@ -1408,10 +1410,10 @@ initializr: - rel: guide href: https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample - name: AI + compatibilityRange: "[3.2.0,3.3.0-M1)" content: - name: Azure OpenAI id: spring-ai-azure-openai - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-azure-openai-spring-boot-starter description: Spring AI support for Azure’s OpenAI offering, powered by ChatGPT. It extends beyond traditional OpenAI capabilities, delivering AI-driven text generation with enhanced functionality. @@ -1422,7 +1424,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/azure-openai-chat.html - name: Azure AI Search id: spring-ai-vectordb-azure - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-azure-vector-store-spring-boot-starter description: Spring AI vector database support for Azure AI Search. It is an AI-powered information retrieval platform and part of Microsoft’s larger AI platform. Among other features, it allows users to query information using vector-based storage and retrieval. @@ -1433,7 +1434,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/azure.html - name: Amazon Bedrock id: spring-ai-bedrock - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-bedrock-ai-spring-boot-starter description: Spring AI support for Amazon Bedrock. It is a managed service that provides foundation models from various AI providers, available through a unified API. @@ -1444,7 +1444,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/bedrock-chat.html - name: Chroma Vector Database id: spring-ai-vectordb-chroma - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-chroma-store-spring-boot-starter description: Spring AI vector database support for Chroma. It is an open-source embedding database and gives you the tools to store document embeddings, content, and metadata. It also allows to search through those embeddings, including metadata filtering. @@ -1455,7 +1454,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/chroma.html - name: Milvus Vector Database id: spring-ai-vectordb-milvus - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-milvus-store-spring-boot-starter description: Spring AI vector database support for Milvus. It is an open-source vector database that has garnered significant attention in the fields of data science and machine learning. One of its standout features lies in its robust support for vector indexing and querying. @@ -1466,7 +1464,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/milvus.html - name: Mistral AI id: spring-ai-mistral - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-mistral-ai-spring-boot-starter description: Spring AI support for Mistral AI, the open and portable generative AI for devs and businesses. @@ -1477,7 +1474,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/mistralai-chat.html - name: Neo4J Vector Database id: spring-ai-vectordb-neo4j - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-neo4j-store-spring-boot-starter description: Spring AI vector database support for Neo4j's Vector Search. It allows users to query vector embeddings from large datasets. @@ -1488,7 +1484,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/neo4j.html - name: Ollama id: spring-ai-ollama - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-ollama-spring-boot-starter description: Spring AI support for Ollama. It allows you to run various Large Language Models (LLMs) locally and generate text from them. @@ -1499,7 +1494,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/ollama-chat.html - name: OpenAI id: spring-ai-openai - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-openai-spring-boot-starter description: Spring AI support for ChatGPT, the AI language model and DALL-E, the Image generation model from OpenAI. @@ -1510,7 +1504,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/openai-chat.html - name: PGvector Vector Database id: spring-ai-vectordb-pgvector - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-pgvector-store-spring-boot-starter description: Spring AI vector database support for PGvector. It is an open-source extension for PostgreSQL that enables storing and searching over machine learning-generated embeddings. @@ -1521,7 +1514,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pgvector.html - name: Pinecone Vector Database id: spring-ai-vectordb-pinecone - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-pinecone-store-spring-boot-starter description: Spring AI vector database support for Pinecone. It is a popular cloud-based vector database and allows you to store and search vectors efficiently. @@ -1532,7 +1524,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pinecone.html - name: PostgresML id: spring-ai-postgresml - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-postgresml-spring-boot-starter description: Spring AI support for the PostgresML text embeddings models. @@ -1543,7 +1534,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/embeddings/postgresml-embeddings.html - name: Redis Search and Query Vector Database id: spring-ai-vectordb-redis - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-redis-spring-boot-starter description: Spring AI vector database support for Redis Search and Query.It extends the core features of Redis OSS and allows you to use Redis as a vector database. @@ -1554,7 +1544,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/redis.html - name: Stability AI id: spring-ai-stabilityai - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-stability-ai-spring-boot-starter description: Spring AI support for Stability AI's text to image generation model. @@ -1565,7 +1554,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/image/stabilityai-image.html - name: Transformers (ONNX) Embeddings id: spring-ai-transformers - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-transformers-spring-boot-starter description: Spring AI support for pre-trained transformer models, serialized into the Open Neural Network Exchange (ONNX) format. @@ -1576,7 +1564,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html - name: Vertex AI PaLM2 id: spring-ai-vertexai-palm2 - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-vertex-ai-palm2-spring-boot-starter description: Spring AI support for Google Vertex PaLM2 chat and embedding models. @@ -1587,7 +1574,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-palm2-chat.html - name: Vertex AI Gemini id: spring-ai-vertexai-gemini - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-vertex-ai-gemini-spring-boot-starter description: Spring AI support for Google Vertex Gemini chat. @@ -1598,7 +1584,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-gemini-chat.html - name: Qdrant Vector Database id: spring-ai-vectordb-qdrant - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-qdrant-store-spring-boot-starter description: Spring AI vector database support for Qdrant. It is an open-source, high-performance vector search engine/database. @@ -1609,7 +1594,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/qdrant.html - name: Weaviate Vector Database id: spring-ai-vectordb-weaviate - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-weaviate-store-spring-boot-starter description: Spring AI vector database support for Weaviate, an open-source vector database. It allows you to store data objects and vector embeddings from your favorite ML-models and scale seamlessly into billions of data objects. diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java index decdbcb3c8..6179c263dd 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java @@ -35,7 +35,9 @@ class SolaceBinderBuildCustomizerTests extends AbstractExtensionTests { @Test void binderNotAddedWhenSolaceNotSelected() { - ProjectStructure project = generateProject(createProjectRequest("cloud-stream")); + ProjectRequest request = createProjectRequest("cloud-stream"); + request.setBootVersion(BOOT_VERSION); + ProjectStructure project = generateProject(request); assertNoBinder(project); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java index 0aeb6e74fe..6cd93abfef 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java @@ -30,12 +30,15 @@ */ class SpringCloudCircuitBreakerBuildCustomizerTests extends AbstractExtensionTests { - static final Dependency REACTIVE_CLOUD_CIRCUIT_BREAKER = Dependency.withId("cloud-resilience4j-reactive", + private static final String BOOT_VERSION = "3.2.6"; + + private static final Dependency REACTIVE_CLOUD_CIRCUIT_BREAKER = Dependency.withId("cloud-resilience4j-reactive", "org.springframework.cloud", "spring-cloud-starter-circuitbreaker-reactor-resilience4j"); @Test void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() { ProjectRequest request = createProjectRequest("webflux", "cloud-resilience4j"); + request.setBootVersion(BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("webflux")) .hasDependency(REACTIVE_CLOUD_CIRCUIT_BREAKER) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-resilience4j") @@ -46,6 +49,7 @@ void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() @Test void doesNotReplaceCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetNotPresent() { ProjectRequest request = createProjectRequest("cloud-resilience4j"); + request.setBootVersion(BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-resilience4j")) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-reactor-resilience4j") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java index dcd71a87ae..2eabac67de 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java @@ -31,9 +31,12 @@ */ class SpringCloudContractConfigurationTests extends AbstractExtensionTests { + private static final String BOOT_VERSION = "3.2.6"; + @Test void contractsDirectoryWithMavenIsCreatedWithSpringCloudContractVerifier() { ProjectRequest request = createProjectRequest("web", "cloud-contract-verifier"); + request.setBootVersion(BOOT_VERSION); request.setType("maven-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/test/resources/contracts")).exists().isDirectory(); @@ -42,6 +45,7 @@ void contractsDirectoryWithMavenIsCreatedWithSpringCloudContractVerifier() { @Test void contractsDirectoryWithMavenIsNotCreatedIfSpringCloudContractVerifierIsNotRequested() { ProjectRequest request = createProjectRequest("web"); + request.setBootVersion(BOOT_VERSION); request.setType("maven-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/test/resources/contracts")).doesNotExist(); @@ -50,6 +54,7 @@ void contractsDirectoryWithMavenIsNotCreatedIfSpringCloudContractVerifierIsNotRe @Test void contractsDirectoryWithGradleIsCreatedWithSpringCloudContractVerifier() { ProjectRequest request = createProjectRequest("web", "cloud-contract-verifier"); + request.setBootVersion(BOOT_VERSION); request.setType("gradle-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/contractTest/resources/contracts")).exists() @@ -59,6 +64,7 @@ void contractsDirectoryWithGradleIsCreatedWithSpringCloudContractVerifier() { @Test void contractsDirectoryWithGradleIsNotCreatedIfSpringCloudContractVerifierIsNotRequested() { ProjectRequest request = createProjectRequest("web"); + request.setBootVersion(BOOT_VERSION); request.setType("gradle-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/contractTest/resources/contracts")).doesNotExist(); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java index ad6ae59982..9043012bac 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java @@ -31,43 +31,50 @@ */ class SpringCloudContractGradleBuildCustomizerTests extends AbstractExtensionTests { + private static final String BOOT_VERSION = "3.2.6"; + @Test void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - assertThat(gradleBuild(projectRequest)).contains("id 'org.springframework.cloud.contract' version '"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier"); + request.setBootVersion(BOOT_VERSION); + assertThat(gradleBuild(request)).contains("id 'org.springframework.cloud.contract' version '"); } @Test void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { - ProjectRequest projectRequest = createProjectRequest(); - assertThat(gradleBuild(projectRequest)).doesNotContain("org.springframework.cloud.contract"); + ProjectRequest request = createProjectRequest(); + request.setBootVersion(BOOT_VERSION); + assertThat(gradleBuild(request)).doesNotContain("org.springframework.cloud.contract"); } @Test void springCloudContractVerifierPluginContractTestWithJUnit5ByDefault() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - assertThat(gradleBuild(projectRequest)).containsSubsequence("tasks.named('contractTest') {", - "useJUnitPlatform()"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier"); + request.setBootVersion(BOOT_VERSION); + assertThat(gradleBuild(request)).containsSubsequence("tasks.named('contractTest') {", "useJUnitPlatform()"); } @Test void springCloudContractVerifierPluginWithGroovyDslAndWithTestModeSetWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - assertThat(gradleBuild(projectRequest)).containsSubsequence("contracts {", "testMode = 'WebTestClient'"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + request.setBootVersion(BOOT_VERSION); + assertThat(gradleBuild(request)).containsSubsequence("contracts {", "testMode = 'WebTestClient'"); } @Test void springCloudContractVerifierPluginWithKotlinDslAndTestModeSetWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - assertThat(gradleKotlinDslBuild(projectRequest)) + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + request.setBootVersion(BOOT_VERSION); + assertThat(gradleKotlinDslBuild(request)) .contains("import org.springframework.cloud.contract.verifier.config.TestMode") .containsSubsequence("contracts {", "testMode.set(TestMode.WEBTESTCLIENT)"); } @Test void springWebTestClientDependencyAddedWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - assertThat(gradleBuild(projectRequest)).contains("testImplementation 'io.rest-assured:spring-web-test-client'"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + request.setBootVersion(BOOT_VERSION); + assertThat(gradleBuild(request)).contains("testImplementation 'io.rest-assured:spring-web-test-client'"); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java index c847cc03d1..f1dedd1c1c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java @@ -70,11 +70,12 @@ void springCloudContractVerifierPluginWithTestModeSetWhenWebFluxIsPresent() { @Test void springWebTestClientDependencyAddedWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + request.setBootVersion(SPRING_BOOT_VERSION); Dependency springWebTestClientDep = Dependency.withId("rest-assured-spring-web-test-client", "io.rest-assured", "spring-web-test-client"); springWebTestClientDep.setScope(Dependency.SCOPE_TEST); - assertThat(mavenPom(projectRequest)).hasDependency(springWebTestClientDep); + assertThat(mavenPom(request)).hasDependency(springWebTestClientDep); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java index 8ca22758b4..9060b9e3da 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java @@ -32,12 +32,15 @@ */ class SpringCloudFunctionBuildCustomizerTests extends AbstractExtensionTests { + private static final String BOOT_VERSION = "3.2.6"; + static final Dependency WEB_ADAPTER = Dependency.withId("cloud-function-web", "org.springframework.cloud", "spring-cloud-function-web"); @Test void functionOnly() { ProjectRequest request = createProjectRequest("cloud-function"); + request.setBootVersion(BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-function")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(Dependency.createSpringBootStarter("")) @@ -49,6 +52,7 @@ void functionOnly() { @Test void web() { ProjectRequest request = createProjectRequest("web", "cloud-function"); + request.setBootVersion(BOOT_VERSION); BillOfMaterials bom = getBom("spring-cloud", request.getBootVersion()); assertThat(mavenPom(request)).hasDependency(getDependency("web")) .hasDependency(WEB_ADAPTER) @@ -61,6 +65,7 @@ void web() { @Test void webflux() { ProjectRequest request = createProjectRequest("webflux", "cloud-function"); + request.setBootVersion(BOOT_VERSION); BillOfMaterials bom = getBom("spring-cloud", request.getBootVersion()); assertThat(mavenPom(request)).hasDependency(getDependency("webflux")) .hasDependency(WEB_ADAPTER) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java index 65af47a818..dc8bb4ff68 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java @@ -32,6 +32,8 @@ */ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { + private static final String BOOT_VERSION = "3.2.6"; + private static final Dependency KAFKA_BINDER = Dependency.withId("cloud-stream-binder-kafka", "org.springframework.cloud", "spring-cloud-stream-binder-kafka"); @@ -50,6 +52,7 @@ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { @Test void springCloudStreamWithRabbit() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp"); + request.setBootVersion(BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -61,6 +64,7 @@ void springCloudStreamWithRabbit() { @Test void springCloudStreamWithKafka() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka"); + request.setBootVersion(BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka")) .hasDependency(KAFKA_BINDER) @@ -72,6 +76,7 @@ void springCloudStreamWithKafka() { @Test void springCloudStreamWithKafkaStreams() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka-streams"); + request.setBootVersion(BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka-streams")) .hasDependency(KAFKA_STREAMS_BINDER) @@ -83,7 +88,7 @@ void springCloudStreamWithKafkaStreams() { @Test void springCloudStreamWithPulsar() { ProjectRequest request = createProjectRequest("cloud-stream", "pulsar"); - request.setBootVersion("3.2.0"); + request.setBootVersion(BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("pulsar")) .hasDependency(PULSAR_BINDER) @@ -93,6 +98,7 @@ void springCloudStreamWithPulsar() { @Test void springCloudStreamWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp", "kafka", "kafka-streams"); + request.setBootVersion(BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) @@ -108,6 +114,7 @@ void springCloudStreamWithAllBinders() { @Test void springCloudBusWithRabbit() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); + request.setBootVersion(BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -118,6 +125,7 @@ void springCloudBusWithRabbit() { @Test void springCloudBusWithKafka() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); + request.setBootVersion(BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -128,6 +136,7 @@ void springCloudBusWithKafka() { @Test void springCloudBusWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp", "kafka", "kafka-streams"); + request.setBootVersion(BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) From d939a1ca9732a8184c6a614446b17a6311041590 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 28 May 2024 09:52:37 +0200 Subject: [PATCH 540/825] Polish --- ...ingBootProjectGenerationConfiguration.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java index 6d24a1a40c..eecae228c6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java @@ -36,24 +36,20 @@ @ProjectGenerationConfiguration class SpringBootProjectGenerationConfiguration { - private static final String DEVTOOLS_ID = "devtools"; - - private static final String DOCKER_COMPOSE_ID = "docker-compose"; - @Configuration(proxyBeanMethods = false) @ConditionalOnBuildSystem(MavenBuildSystem.ID) static class MavenConfiguration { @Bean - @ConditionalOnRequestedDependency(DEVTOOLS_ID) + @ConditionalOnRequestedDependency("devtools") OptionalDependencyMavenBuildCustomizer devToolsMavenBuildCustomizer() { - return new OptionalDependencyMavenBuildCustomizer(DEVTOOLS_ID); + return new OptionalDependencyMavenBuildCustomizer("devtools"); } @Bean - @ConditionalOnRequestedDependency(DOCKER_COMPOSE_ID) + @ConditionalOnRequestedDependency("docker-compose") OptionalDependencyMavenBuildCustomizer dockerComposeMavenBuildCustomizer() { - return new OptionalDependencyMavenBuildCustomizer(DOCKER_COMPOSE_ID); + return new OptionalDependencyMavenBuildCustomizer("docker-compose"); } } @@ -63,15 +59,15 @@ OptionalDependencyMavenBuildCustomizer dockerComposeMavenBuildCustomizer() { static class GradleConfiguration { @Bean - @ConditionalOnRequestedDependency(DEVTOOLS_ID) + @ConditionalOnRequestedDependency("devtools") DevelopmentOnlyDependencyGradleBuildCustomizer devToolsGradleBuildCustomizer() { - return new DevelopmentOnlyDependencyGradleBuildCustomizer(DEVTOOLS_ID); + return new DevelopmentOnlyDependencyGradleBuildCustomizer("devtools"); } @Bean - @ConditionalOnRequestedDependency(DOCKER_COMPOSE_ID) + @ConditionalOnRequestedDependency("docker-compose") DevelopmentOnlyDependencyGradleBuildCustomizer dockerComposeGradleBuildCustomizer() { - return new DevelopmentOnlyDependencyGradleBuildCustomizer(DOCKER_COMPOSE_ID); + return new DevelopmentOnlyDependencyGradleBuildCustomizer("docker-compose"); } } From 1c8492d9737f1885a0721d26c859332d992288cc Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Wed, 15 May 2024 16:58:45 +0200 Subject: [PATCH 541/825] Add history feature See gh-1470 --- start-client/package.json | 1 + start-client/src/components/Application.js | 20 +- .../src/components/common/history/History.js | 23 ++ .../src/components/common/history/Modal.js | 213 ++++++++++++++++++ .../src/components/common/history/Utils.js | 46 ++++ .../src/components/common/history/index.js | 1 + .../src/components/common/icons/Icons.js | 31 +++ .../src/components/common/icons/index.js | 1 + .../src/components/common/layout/SideLeft.js | 20 +- start-client/src/components/reducer/App.js | 34 ++- .../reducer/__tests__/Initializr.js | 2 +- start-client/src/components/utils/ApiUtils.js | 3 + start-client/src/styles/_dark.scss | 7 +- start-client/src/styles/_main.scss | 35 ++- start-client/src/styles/history.scss | 120 ++++++++++ start-client/yarn.lock | 5 + 16 files changed, 554 insertions(+), 8 deletions(-) create mode 100644 start-client/src/components/common/history/History.js create mode 100644 start-client/src/components/common/history/Modal.js create mode 100644 start-client/src/components/common/history/Utils.js create mode 100644 start-client/src/components/common/history/index.js create mode 100644 start-client/src/styles/history.scss diff --git a/start-client/package.json b/start-client/package.json index 5fe0092f8b..5dbcaa0783 100644 --- a/start-client/package.json +++ b/start-client/package.json @@ -92,6 +92,7 @@ "js-search": "^2.0.0", "jszip": "^3.6.0", "lodash": "^4.17.21", + "luxon": "^3.4.4", "prism-react-renderer": "^1.2.0", "prismjs": "^1.24.0", "prop-types": "^15.7.2", diff --git a/start-client/src/components/Application.js b/start-client/src/components/Application.js index 9640520567..7862e98fda 100644 --- a/start-client/src/components/Application.js +++ b/start-client/src/components/Application.js @@ -23,6 +23,7 @@ import { getConfig, getInfo, getProject } from './utils/ApiUtils' const Explore = lazy(() => import('./common/explore/Explore')) const Share = lazy(() => import('./common/share/Share')) +const History = lazy(() => import('./common/history/History')) const HotKeys = lazy(() => import('./common/builder/HotKeys')) export default function Application() { @@ -32,6 +33,7 @@ export default function Application() { theme, share: shareOpen, explore: exploreOpen, + history: historyOpen, list, dependencies, } = useContext(AppContext) @@ -78,6 +80,7 @@ export default function Application() { setGenerating(false) if (project) { FileSaver.saveAs(project, `${get(values, 'meta.artifact')}.zip`) + dispatch({ type: 'ADD_HISTORY', payload: share }) } } @@ -102,7 +105,13 @@ export default function Application() { setBlob(null) dispatch({ type: 'UPDATE', - payload: { list: false, share: false, explore: false, nav: false }, + payload: { + list: false, + share: false, + explore: false, + nav: false, + history: false, + }, }) } @@ -163,6 +172,15 @@ export default function Application() { onClose={onEscape} /> + + + + ) } diff --git a/start-client/src/components/common/history/History.js b/start-client/src/components/common/history/History.js new file mode 100644 index 0000000000..498c068937 --- /dev/null +++ b/start-client/src/components/common/history/History.js @@ -0,0 +1,23 @@ +import '../../../styles/history.scss' + +import PropTypes from 'prop-types' +import React from 'react' + +import Modal from './Modal' +import { Overlay } from '../form' + +function History({ open, onClose }) { + return ( + <> + + + + ) +} + +History.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default History diff --git a/start-client/src/components/common/history/Modal.js b/start-client/src/components/common/history/Modal.js new file mode 100644 index 0000000000..941b11564c --- /dev/null +++ b/start-client/src/components/common/history/Modal.js @@ -0,0 +1,213 @@ +import PropTypes from 'prop-types' +import get from 'lodash/get' +import React, { useEffect, useRef, useContext, useMemo } from 'react' +import { CSSTransition, TransitionGroup } from 'react-transition-group' +import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' +import { AppContext } from '../../reducer/App' +import { Transform } from './Utils' +import queryString from 'query-string' + +function HistoryDate({ label, items, onClose }) { + return ( + <> +

    {label}
    +
      + {items.map(item => ( + + ))} +
    + + ) +} + +HistoryDate.propTypes = { + label: PropTypes.string.isRequired, + items: PropTypes.arrayOf( + PropTypes.shape({ + time: PropTypes.string, + value: PropTypes.string, + }) + ), + onClose: PropTypes.func.isRequired, +} + +HistoryDate.defaultProps = { + items: [], +} + +function getLabelFromList(list, key) { + return list.find(item => item.key === key)?.text || key +} + +function getLabelFromDepsList(list, key) { + return list.find(item => item.id === key)?.name || key +} + +function HistoryItem({ time, value, onClose }) { + const { config } = useContext(AppContext) + const params = queryString.parse(value) + const deps = get(params, 'dependencies', '') + .split(',') + .filter(dep => !!dep) + return ( +
  • + { + onClose() + }} + > + {time} + + + Project{' '} + + {getLabelFromList( + get(config, 'lists.project'), + get(params, 'type') + )} + + {`, `} + Language{' '} + + {getLabelFromList( + get(config, 'lists.language'), + get(params, 'language') + )} + + {`, `} + Spring Boot{' '} + + {getLabelFromList( + get(config, 'lists.boot'), + get(params, 'platformVersion') + )} + + + + {deps.length === 0 && 'No dependencies'} + {deps.length > 0 && ( + <> + Dependencies:{' '} + + {deps + .map(dep => + getLabelFromDepsList( + get(config, 'lists.dependencies'), + dep + ) + ) + .join(', ')} + + + )} + + + +
  • + ) +} + +HistoryItem.propTypes = { + time: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired, +} + +function Modal({ open, onClose }) { + const wrapper = useRef(null) + const { histories, dispatch } = useContext(AppContext) + + const historiesTransform = useMemo(() => Transform(histories), [histories]) + + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + onClose() + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, [onClose]) + + useEffect(() => { + if (get(wrapper, 'current') && open) { + disableBodyScroll(get(wrapper, 'current')) + } + return () => { + clearAllBodyScrollLocks() + } + }, [wrapper, open]) + + return ( + + {open && ( + + + + )} + + ) +} + +Modal.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Modal diff --git a/start-client/src/components/common/history/Utils.js b/start-client/src/components/common/history/Utils.js new file mode 100644 index 0000000000..6df683cd52 --- /dev/null +++ b/start-client/src/components/common/history/Utils.js @@ -0,0 +1,46 @@ +import { DateTime } from 'luxon' + +function isToday(date) { + return date.hasSame(DateTime.now(), 'day') +} + +function isYesterday(date) { + return date.hasSame(DateTime.now().minus({ days: 1 }), 'day') +} + +export function Transform(histories) { + if (histories.length === 0) { + return [] + } + const parsed = histories.map(history => { + const dateLuxon = DateTime.fromISO(history.date) + let label = '' + if (isToday(dateLuxon)) { + label = 'Today, ' + } else if (isYesterday(dateLuxon)) { + label = 'Yesterday, ' + } + return { + date: dateLuxon, + time: `${dateLuxon.toFormat('HH:mm')}`, + label: `${label}${dateLuxon.toFormat('cccc, d LLLL yyyy')}`, + value: history.value, + } + }) + return parsed.reduce((acc, history) => { + if (acc.length === 0) { + acc.push({ + label: history.label, + histories: [history], + }) + } else if (acc[acc.length - 1].label === history.label) { + acc[acc.length - 1].histories.push(history) + } else { + acc.push({ + label: history.label, + histories: [history], + }) + } + return acc + }, []) +} diff --git a/start-client/src/components/common/history/index.js b/start-client/src/components/common/history/index.js new file mode 100644 index 0000000000..2efd9c0c11 --- /dev/null +++ b/start-client/src/components/common/history/index.js @@ -0,0 +1 @@ +export { default as History } from './History' diff --git a/start-client/src/components/common/icons/Icons.js b/start-client/src/components/common/icons/Icons.js index 1a2e0d153f..9318ca56f1 100644 --- a/start-client/src/components/common/icons/Icons.js +++ b/start-client/src/components/common/icons/Icons.js @@ -368,3 +368,34 @@ export function IconEnter() { ) } + +export function IconHistory() { + return ( + + ) +} diff --git a/start-client/src/components/common/icons/index.js b/start-client/src/components/common/icons/index.js index f8010ec116..7fa600b408 100644 --- a/start-client/src/components/common/icons/index.js +++ b/start-client/src/components/common/icons/index.js @@ -16,5 +16,6 @@ export { IconSun } from './Icons' export { IconMoon } from './Icons' export { IconRemove } from './Icons' export { IconEnter } from './Icons' +export { IconHistory } from './Icons' export { IconSpring } from './IconSpring' diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index c8ca6aa0ca..12596f1eda 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -5,14 +5,14 @@ import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' import Header from './Header' import { AppContext } from '../../reducer/App' -import { IconGithub } from '../icons' +import { IconGithub, IconHistory } from '../icons' function SideLeft() { const [isOpen, setIsOpen] = useState(false) const [lock, setLock] = useState(false) const wrapper = useRef(null) - const { nav, dispatch } = useContext(AppContext) + const { nav, histories, dispatch } = useContext(AppContext) useEffect(() => { if (get(wrapper, 'current') && nav) { @@ -61,6 +61,22 @@ function SideLeft() { + {!isOpen && !lock && histories.length > 0 && ( + <> +
    + + + )}
    {}, + setItem: () => {}, + } + export function reduceDependencies(boot, items) { const groups = [] const list = [] @@ -96,7 +107,26 @@ export function reducer(state, action) { get(json, 'defaultValues.boot'), get(json, 'lists.dependencies') ) - return { ...state, complete: true, config: json, dependencies } + const histories = localStorage.getItem('histories') + ? JSON.parse(localStorage.getItem('histories')) + : [] + return { ...state, complete: true, config: json, dependencies, histories } + } + case 'ADD_HISTORY': { + const newHistory = get(action, 'payload') + const histories = [ + { + date: new Date().toISOString(), + value: newHistory, + }, + ...state.histories.slice(0, MAX_HISTORY - 1), + ] + localStorage.setItem('histories', JSON.stringify(histories)) + return { ...state, histories } + } + case 'CLEAR_HISTORY': { + localStorage.setItem('histories', JSON.stringify([])) + return { ...state, histories: [] } } default: return state diff --git a/start-client/src/components/reducer/__tests__/Initializr.js b/start-client/src/components/reducer/__tests__/Initializr.js index 20ef2bdd15..23f43b046e 100644 --- a/start-client/src/components/reducer/__tests__/Initializr.js +++ b/start-client/src/components/reducer/__tests__/Initializr.js @@ -47,7 +47,7 @@ describe('COMPLETE action', () => { }, }) expect(get(result, 'share')).toBe( - 'type=maven-project&language=java&platformVersion=2.2.0.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo' + 'type=maven-project&language=java&platformVersion=2.2.0.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo&dependencies=' ) expect(get(result, 'values.project')).toBe('maven-project') expect(get(result, 'values.language')).toBe('java') diff --git a/start-client/src/components/utils/ApiUtils.js b/start-client/src/components/utils/ApiUtils.js index 7de37d1ae8..15cdbb8f50 100644 --- a/start-client/src/components/utils/ApiUtils.js +++ b/start-client/src/components/utils/ApiUtils.js @@ -54,6 +54,8 @@ export const getShareUrl = values => { let params = `${querystring.stringify(props)}` if (get(values, 'dependencies', []).length > 0) { params = `${params}&dependencies=${get(values, 'dependencies').join(',')}` + } else { + params = `${params}&dependencies=` } return params } @@ -151,6 +153,7 @@ export const parseParams = (values, queryParams, lists) => { const depsWarning = [] const newVal = value .split(',') + .filter(item => !!item) .map(item => { const dep = get(lists, 'dependencies').find( d => d.id === item.trim() diff --git a/start-client/src/styles/_dark.scss b/start-client/src/styles/_dark.scss index 984ceaf056..58a0127dba 100644 --- a/start-client/src/styles/_dark.scss +++ b/start-client/src/styles/_dark.scss @@ -16,6 +16,10 @@ body.dark { border-color: rgba(255, 255, 255, 0.2); } + #side-left .navigation-item { + color: white; + } + #side-right .side-container { border-color: $dark-border; background: $dark-background; @@ -321,7 +325,8 @@ body.dark { #side-left a, .explorer-ul .file, .explorer-ul .folder, - ul.dependencies-list li a { + ul.dependencies-list li a, + #side-left .navigation-item { &:focus { outline: 1px dotted $dark-border; } diff --git a/start-client/src/styles/_main.scss b/start-client/src/styles/_main.scss index 70ce292e0e..af24fb6993 100644 --- a/start-client/src/styles/_main.scss +++ b/start-client/src/styles/_main.scss @@ -85,6 +85,39 @@ body { left: 0; width: 5rem; } + .navigation-divider { + margin: 20px; + border-top: 1px solid $light-border; + } + .navigation-item { + $size: 30px; + display: block; + margin: 0.2rem auto; + color: $light-color; + padding: 0; + cursor: pointer; + width: $size + 12px; + height: $size + 12px; + @include transition(color $spring-transition-duration); + border: 0 none; + background: none; + .icon-history { + width: 30px; + margin-top: 6px; + } + &:hover { + color: $light-primary; + } + &:focus { + outline: 1px dotted #aecaca; + } + } + &.is-open .navigation-item { + color: white; + &:hover { + opacity: 0.7; + } + } } #side-right { @@ -1316,4 +1349,4 @@ ul.dependencies-list { display: inline-block; height: 14px; background: $light-placeholder; -} \ No newline at end of file +} diff --git a/start-client/src/styles/history.scss b/start-client/src/styles/history.scss new file mode 100644 index 0000000000..9d1ace6786 --- /dev/null +++ b/start-client/src/styles/history.scss @@ -0,0 +1,120 @@ +@import 'variables'; +@import 'mixins'; + +$w_arrow: 12px; +$w: 1000px; + +.modal-share { + z-index: 10000; + position: fixed; + top: 50px; + left: 0; + right: 0; + + .modal-history-container { + max-width: $w; + margin: 0 auto; + background: white; + } + + @include transition(all $spring-transition-duration); + &:before { + $h: 60px; + content: ' '; + height: $h; + width: $w; + position: absolute; + bottom: -$h; + left: 0; + } + .modal-content { + padding: $spring-8points * 3; + padding-top: $spring-8points; + padding-bottom: $spring-8points * 2; + max-height: 70vh; + overflow: auto; + .list { + .date { + font-weight: bold; + padding: 10px 0 5px; + } + ul { + padding: 0; + margin: 0 0 10px; + } + li { + list-style: none; + padding: 1px 0; + margin: 0; + } + a.item { + position: relative; + background: $light-background-seconday; + border-radius: 3px; + display: flex; + text-decoration: none; + padding: 5px 10px; + color: $light-color; + padding-right: 60px; + &:hover { + background: lighten($light-background-seconday, 2); + a { + opacity: 1; + } + } + } + .time { + width: 80px; + } + .time, + .desc, + .main, + .deps { + display: block; + } + } + } + .modal-header { + position: relative; + padding: 6px $spring-8points * 2 2px; + border-bottom: 1px solid #ebebeb; + h1 { + font-size: $spring-8points * 2.5; + line-height: $spring-8points * 2.5; + font-weight: 600; + } + .button { + position: absolute; + top: 11px; + right: 11px; + font-size: $spring-font-size - 3; + line-height: 0.7rem; + margin-right: 0; + } + } + .modal-action { + text-align: center; + border-top: 1px solid $light-border; + padding: 16px 0 8px; + } +} + +.modal-enter { + opacity: 0; +} + +.modal-enter-active { + opacity: 1; + transition: all 300ms; +} + +.modal-exit { + opacity: 1; +} + +.modal-exit-active { + opacity: 0; + transition: all 300ms; +} + +@import 'responsive'; diff --git a/start-client/yarn.lock b/start-client/yarn.lock index d8dd9ba088..da1fe44136 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -7295,6 +7295,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +luxon@^3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" + integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== + magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" From def50934883fbb15633ab664440377f950e35cdf Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Tue, 28 May 2024 13:17:37 +0200 Subject: [PATCH 542/825] Fix wording --- start-client/src/components/common/history/Modal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-client/src/components/common/history/Modal.js b/start-client/src/components/common/history/Modal.js index 941b11564c..c8847c222d 100644 --- a/start-client/src/components/common/history/Modal.js +++ b/start-client/src/components/common/history/Modal.js @@ -91,7 +91,7 @@ function HistoryItem({ time, value, onClose }) { - {deps.length === 0 && 'No dependencies'} + {deps.length === 0 && 'No dependency'} {deps.length > 0 && ( <> Dependencies:{' '} From 16f3af30ab0aae4a049102f2f27e2131456a430e Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 28 May 2024 09:03:15 +0200 Subject: [PATCH 543/825] Upgrade to Spring AI 1.0.0-M1 Closes gh-1486 --- start-site/src/main/resources/application.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 814f2e9915..c2d290e241 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -88,8 +88,8 @@ initializr: artifactId: spring-ai-bom versionProperty: spring-ai.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 0.8.1 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 1.0.0-M1 repositories: spring-milestones spring-cloud: groupId: org.springframework.cloud @@ -1410,7 +1410,7 @@ initializr: - rel: guide href: https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample - name: AI - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Azure OpenAI id: spring-ai-azure-openai @@ -1425,7 +1425,7 @@ initializr: - name: Azure AI Search id: spring-ai-vectordb-azure group-id: org.springframework.ai - artifact-id: spring-ai-azure-vector-store-spring-boot-starter + artifact-id: spring-ai-azure-store-spring-boot-starter description: Spring AI vector database support for Azure AI Search. It is an AI-powered information retrieval platform and part of Microsoft’s larger AI platform. Among other features, it allows users to query information using vector-based storage and retrieval. bom: spring-ai starter: true @@ -1535,7 +1535,7 @@ initializr: - name: Redis Search and Query Vector Database id: spring-ai-vectordb-redis group-id: org.springframework.ai - artifact-id: spring-ai-redis-spring-boot-starter + artifact-id: spring-ai-redis-store-spring-boot-starter description: Spring AI vector database support for Redis Search and Query.It extends the core features of Redis OSS and allows you to use Redis as a vector database. bom: spring-ai starter: true From 869e4de38572cc4d92eaa8904e019ab5b77a0a9c Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Tue, 28 May 2024 13:39:06 +0100 Subject: [PATCH 544/825] Upgrade to Spring Shell 3.2.5 and 3.3.0-RC1 See gh-1489 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c2d290e241..1e19fef473 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -137,9 +137,9 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 3.2.4 + version: 3.2.5 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.3.0-M1 + version: 3.3.0-RC1 repositories: spring-milestones timefold-solver: groupId: ai.timefold.solver From 4145dbba7bf52f2d00e17e66cf416078ff9b9070 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 28 May 2024 22:22:48 +0200 Subject: [PATCH 545/825] Revert optimizations in Spring Modulith dependency setup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The removal of the core dependency causes the BOM not being added as that's contained in the dependency declaration. Manually adding the BOM (build.boms().add(…)) adds the BOM segment but does not declare the version property that's needed to resolve it properly. See gh-1490 --- .../springmodulith/SpringModulithBuildCustomizer.java | 5 +---- .../SpringModulithBuildCustomizerTests.java | 11 +---------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java index ac717639f2..a979040ff7 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java @@ -51,10 +51,7 @@ public void customize(Build build) { dependencies.add("modulith-observability", modulithDependency("observability").scope(DependencyScope.RUNTIME)); } - boolean persistenceBackendAdded = addEventPublicationRegistryBackend(build); - if (persistenceBackendAdded) { - dependencies.remove("modulith"); - } + addEventPublicationRegistryBackend(build); dependencies.add("modulith-starter-test", modulithDependency("starter-test").scope(DependencyScope.TEST_COMPILE)); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java index 6e039726bc..957b56547b 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java @@ -71,16 +71,7 @@ void presenceOfSpringDataModuleAddsModuleEventStarter(String store) { build.dependencies().add("data-" + store); this.customizer.customize(build); assertThat(build.dependencies().ids()).contains("modulith-starter-" + store); - assertThat(build.dependencies().ids()).doesNotContain("modulith"); - } - - @ParameterizedTest - @ValueSource(strings = { "jdbc", "jpa", "mongodb" }) - void presenceOfSpringDataModuleRemovesCoreStarter(String store) { - Build build = createBuild("modulith"); - build.dependencies().add("data-" + store); - this.customizer.customize(build); - assertThat(build.dependencies().ids()).doesNotContain("modulith"); + assertThat(build.dependencies().ids()).doesNotContain("modulith-starter-core"); } private Build createBuild(String... dependencies) { From 198a828b06a01685c8443931fad6f4b326592ef2 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Sat, 1 Jun 2024 10:43:04 +0200 Subject: [PATCH 546/825] Upgrade to Netflix DGS 9.0.0 and 8.7.1 Netflix DGS 9.0 is compatible with Spring Boot 3.3! Closes gh-1493 --- start-site/src/main/resources/application.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 1e19fef473..32bde08bc5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -54,7 +54,9 @@ initializr: versionProperty: netflix-dgs.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 8.6.1 + version: 8.7.1 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 9.0.0 hilla: groupId: dev.hilla artifactId: hilla-bom @@ -360,7 +362,7 @@ initializr: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-spring-graphql-starter description: Build GraphQL applications with Netflix DGS and Spring for GraphQL. - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" bom: netflix-dgs links: - rel: reference From 93748c347b0efea2805d42ffc3a6ceed57cdddea Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 3 Jun 2024 08:57:52 +0200 Subject: [PATCH 547/825] Upgrade to Spring Cloud 2023.0.2 Closes gh-1495 --- start-site/src/main/resources/application.yml | 20 +++++++++---------- ...oudCircuitBreakerBuildCustomizerTests.java | 6 +++--- ...SpringCloudContractConfigurationTests.java | 10 +++++----- ...oudContractGradleBuildCustomizerTests.java | 14 ++++++------- ...loudContractMavenBuildCustomizerTests.java | 2 +- ...ringCloudFunctionBuildCustomizerTests.java | 8 ++++---- ...udFunctionHelpDocumentCustomizerTests.java | 6 +++--- ...SpringCloudStreamBuildCustomizerTests.java | 18 ++++++++--------- 8 files changed, 42 insertions(+), 42 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 32bde08bc5..ee15aed365 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -99,8 +99,8 @@ initializr: versionProperty: spring-cloud.version order: 50 mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 2023.0.1 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 2023.0.2 spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies @@ -1043,7 +1043,7 @@ initializr: href: https://java.testcontainers.org/ - name: Contract Verifier bom: spring-cloud - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" id: cloud-contract-verifier description: Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development. groupId: org.springframework.cloud @@ -1054,7 +1054,7 @@ initializr: href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsingle/ - name: Contract Stub Runner bom: spring-cloud - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" id: cloud-contract-stub-runner description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests. groupId: org.springframework.cloud @@ -1075,7 +1075,7 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap.embedded - name: Spring Cloud bom: spring-cloud - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Cloud Bootstrap id: cloud-starter @@ -1107,7 +1107,7 @@ initializr: href: https://docs.spring.io/spring-cloud-task/docs/current/reference/html/ - name: Spring Cloud Config bom: spring-cloud - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Config Client id: cloud-config-client @@ -1158,7 +1158,7 @@ initializr: description: Spring Cloud Consul Quick Start - name: Spring Cloud Discovery bom: spring-cloud - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Eureka Discovery Client id: cloud-eureka @@ -1200,7 +1200,7 @@ initializr: href: https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#spring-cloud-consul-discovery - name: Spring Cloud Routing bom: spring-cloud - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Gateway id: cloud-gateway @@ -1247,7 +1247,7 @@ initializr: href: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer - name: Spring Cloud Circuit Breaker bom: spring-cloud - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Resilience4J id: cloud-resilience4j @@ -1259,7 +1259,7 @@ initializr: href: https://docs.spring.io/spring-cloud-circuitbreaker/docs/current/reference/html/#configuring-resilience4j-circuit-breakers - name: Spring Cloud Messaging bom: spring-cloud - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Cloud Bus id: cloud-bus diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java index 6cd93abfef..b9ffe3178c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java @@ -30,7 +30,7 @@ */ class SpringCloudCircuitBreakerBuildCustomizerTests extends AbstractExtensionTests { - private static final String BOOT_VERSION = "3.2.6"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; private static final Dependency REACTIVE_CLOUD_CIRCUIT_BREAKER = Dependency.withId("cloud-resilience4j-reactive", "org.springframework.cloud", "spring-cloud-starter-circuitbreaker-reactor-resilience4j"); @@ -38,7 +38,7 @@ class SpringCloudCircuitBreakerBuildCustomizerTests extends AbstractExtensionTes @Test void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() { ProjectRequest request = createProjectRequest("webflux", "cloud-resilience4j"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("webflux")) .hasDependency(REACTIVE_CLOUD_CIRCUIT_BREAKER) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-resilience4j") @@ -49,7 +49,7 @@ void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() @Test void doesNotReplaceCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetNotPresent() { ProjectRequest request = createProjectRequest("cloud-resilience4j"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-resilience4j")) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-reactor-resilience4j") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java index 2eabac67de..de74a948eb 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java @@ -31,12 +31,12 @@ */ class SpringCloudContractConfigurationTests extends AbstractExtensionTests { - private static final String BOOT_VERSION = "3.2.6"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test void contractsDirectoryWithMavenIsCreatedWithSpringCloudContractVerifier() { ProjectRequest request = createProjectRequest("web", "cloud-contract-verifier"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("maven-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/test/resources/contracts")).exists().isDirectory(); @@ -45,7 +45,7 @@ void contractsDirectoryWithMavenIsCreatedWithSpringCloudContractVerifier() { @Test void contractsDirectoryWithMavenIsNotCreatedIfSpringCloudContractVerifierIsNotRequested() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("maven-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/test/resources/contracts")).doesNotExist(); @@ -54,7 +54,7 @@ void contractsDirectoryWithMavenIsNotCreatedIfSpringCloudContractVerifierIsNotRe @Test void contractsDirectoryWithGradleIsCreatedWithSpringCloudContractVerifier() { ProjectRequest request = createProjectRequest("web", "cloud-contract-verifier"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("gradle-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/contractTest/resources/contracts")).exists() @@ -64,7 +64,7 @@ void contractsDirectoryWithGradleIsCreatedWithSpringCloudContractVerifier() { @Test void contractsDirectoryWithGradleIsNotCreatedIfSpringCloudContractVerifierIsNotRequested() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("gradle-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/contractTest/resources/contracts")).doesNotExist(); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java index 9043012bac..d3da6f831a 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java @@ -31,40 +31,40 @@ */ class SpringCloudContractGradleBuildCustomizerTests extends AbstractExtensionTests { - private static final String BOOT_VERSION = "3.2.6"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).contains("id 'org.springframework.cloud.contract' version '"); } @Test void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { ProjectRequest request = createProjectRequest(); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).doesNotContain("org.springframework.cloud.contract"); } @Test void springCloudContractVerifierPluginContractTestWithJUnit5ByDefault() { ProjectRequest request = createProjectRequest("cloud-contract-verifier"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).containsSubsequence("tasks.named('contractTest') {", "useJUnitPlatform()"); } @Test void springCloudContractVerifierPluginWithGroovyDslAndWithTestModeSetWhenWebFluxIsPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).containsSubsequence("contracts {", "testMode = 'WebTestClient'"); } @Test void springCloudContractVerifierPluginWithKotlinDslAndTestModeSetWhenWebFluxIsPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleKotlinDslBuild(request)) .contains("import org.springframework.cloud.contract.verifier.config.TestMode") .containsSubsequence("contracts {", "testMode.set(TestMode.WEBTESTCLIENT)"); @@ -73,7 +73,7 @@ void springCloudContractVerifierPluginWithKotlinDslAndTestModeSetWhenWebFluxIsPr @Test void springWebTestClientDependencyAddedWhenWebFluxIsPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).contains("testImplementation 'io.rest-assured:spring-web-test-client'"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java index f1dedd1c1c..3b54637905 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java @@ -32,7 +32,7 @@ */ class SpringCloudContractMavenBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java index 9060b9e3da..cdb9c9a60a 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java @@ -32,7 +32,7 @@ */ class SpringCloudFunctionBuildCustomizerTests extends AbstractExtensionTests { - private static final String BOOT_VERSION = "3.2.6"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; static final Dependency WEB_ADAPTER = Dependency.withId("cloud-function-web", "org.springframework.cloud", "spring-cloud-function-web"); @@ -40,7 +40,7 @@ class SpringCloudFunctionBuildCustomizerTests extends AbstractExtensionTests { @Test void functionOnly() { ProjectRequest request = createProjectRequest("cloud-function"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-function")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(Dependency.createSpringBootStarter("")) @@ -52,7 +52,7 @@ void functionOnly() { @Test void web() { ProjectRequest request = createProjectRequest("web", "cloud-function"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); BillOfMaterials bom = getBom("spring-cloud", request.getBootVersion()); assertThat(mavenPom(request)).hasDependency(getDependency("web")) .hasDependency(WEB_ADAPTER) @@ -65,7 +65,7 @@ void web() { @Test void webflux() { ProjectRequest request = createProjectRequest("webflux", "cloud-function"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); BillOfMaterials bom = getBom("spring-cloud", request.getBootVersion()); assertThat(mavenPom(request)).hasDependency(getDependency("webflux")) .hasDependency(WEB_ADAPTER) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java index 305a26645e..54c63382e1 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java @@ -33,12 +33,12 @@ class SpringCloudFunctionHelpDocumentCustomizerTests extends AbstractExtensionTe private static final String AZURE_SECTION_TITLE = "## Running Spring Cloud Function applications on Microsoft Azure"; - private static final String BOOT_VERSION = "3.2.6"; + private static final String SPRING_BOOT_VERSION = "3.2.0"; @Test void functionBuildSetupInfoSectionAddedForMaven() { ProjectRequest request = createProjectRequest(); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("maven-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); @@ -47,7 +47,7 @@ void functionBuildSetupInfoSectionAddedForMaven() { @Test void functionBuildSetupInfoSectionAddedForGradle() { ProjectRequest request = createProjectRequest(); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("gradle-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java index dc8bb4ff68..715243845f 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java @@ -32,7 +32,7 @@ */ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { - private static final String BOOT_VERSION = "3.2.6"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; private static final Dependency KAFKA_BINDER = Dependency.withId("cloud-stream-binder-kafka", "org.springframework.cloud", "spring-cloud-stream-binder-kafka"); @@ -52,7 +52,7 @@ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { @Test void springCloudStreamWithRabbit() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -64,7 +64,7 @@ void springCloudStreamWithRabbit() { @Test void springCloudStreamWithKafka() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka")) .hasDependency(KAFKA_BINDER) @@ -76,7 +76,7 @@ void springCloudStreamWithKafka() { @Test void springCloudStreamWithKafkaStreams() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka-streams"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka-streams")) .hasDependency(KAFKA_STREAMS_BINDER) @@ -88,7 +88,7 @@ void springCloudStreamWithKafkaStreams() { @Test void springCloudStreamWithPulsar() { ProjectRequest request = createProjectRequest("cloud-stream", "pulsar"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("pulsar")) .hasDependency(PULSAR_BINDER) @@ -98,7 +98,7 @@ void springCloudStreamWithPulsar() { @Test void springCloudStreamWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp", "kafka", "kafka-streams"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) @@ -114,7 +114,7 @@ void springCloudStreamWithAllBinders() { @Test void springCloudBusWithRabbit() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -125,7 +125,7 @@ void springCloudBusWithRabbit() { @Test void springCloudBusWithKafka() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -136,7 +136,7 @@ void springCloudBusWithKafka() { @Test void springCloudBusWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp", "kafka", "kafka-streams"); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) From 69c876938168a534de9de9757b51e44eafd04c0b Mon Sep 17 00:00:00 2001 From: Joe Wang <106995533+JoeWang1127@users.noreply.github.com> Date: Thu, 30 May 2024 14:52:26 -0400 Subject: [PATCH 548/825] Upgrade to Spring Cloud GCP 5.4.1 See gh-1491 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ee15aed365..bdfd24b45d 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -115,7 +115,7 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 5.3.0 + version: 5.4.1 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From e6e69bb6961e016ab70bce5c229af9fb4f2b4143 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 3 Jun 2024 10:05:19 +0200 Subject: [PATCH 549/825] Add vaadin-dev exclusion to Maven profile Closes gh-1492 --- .../vaadin/VaadinMavenBuildCustomizer.java | 13 +++- .../VaadinMavenBuildCustomizerTests.java | 76 +++++++++++++++++++ ...inProjectGenerationConfigurationTests.java | 55 ++++++++++---- 3 files changed, 125 insertions(+), 19 deletions(-) create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java index a1889d1822..740cde0ae4 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java @@ -16,7 +16,9 @@ package io.spring.start.site.extension.dependency.vaadin; +import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.buildsystem.maven.MavenProfile; import io.spring.initializr.generator.spring.build.BuildCustomizer; /** @@ -24,14 +26,19 @@ * mode. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class VaadinMavenBuildCustomizer implements BuildCustomizer { @Override public void customize(MavenBuild build) { - build.profiles() - .id("production") - .plugins() + MavenProfile profile = build.profiles().id("production"); + profile.dependencies() + .add("vaadin-core", + Dependency.withCoordinates("com.vaadin", "vaadin-core") + .exclusions(new Dependency.Exclusion("com.vaadin", "vaadin-dev")) + .build()); + profile.plugins() .add("com.vaadin", "vaadin-maven-plugin", (plugin) -> plugin.version("${vaadin.version}") .execution("frontend", (execution) -> execution.goal("prepare-frontend").goal("build-frontend").phase("compile"))); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java new file mode 100644 index 0000000000..f9ffe3ea94 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java @@ -0,0 +1,76 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.vaadin; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link VaadinMavenBuildCustomizer}. + * + * @author Moritz Halbritter + */ +class VaadinMavenBuildCustomizerTests extends AbstractExtensionTests { + + @Test + void shouldAddProductionProfile() { + ProjectRequest projectRequest = createProjectRequest("vaadin", "web"); + assertThat(mavenPom(projectRequest)).hasProfile("production").lines().containsSequence( + // @formatter:off + " ", + " production", + " ", + " ", + " com.vaadin", + " vaadin-core", + " ", + " ", + " com.vaadin", + " vaadin-dev", + " ", + " ", + " ", + "", + " ", + " ", + " ", + " ", + " com.vaadin", + " vaadin-maven-plugin", + " ${vaadin.version}", + " ", + " ", + " frontend", + " compile", + " ", + " prepare-frontend", + " build-frontend", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ); + // @formatter:on + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java index 4c6b9d3134..1cc693cab1 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java @@ -30,27 +30,50 @@ */ class VaadinProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test void mavenBuildWithVaadinAddProductionProfileWithoutProductionModeFlag() { ProjectRequest request = createProjectRequest("vaadin", "data-jpa"); request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(mavenPom(request)).hasProfile("production") - .lines() - .containsSequence(" ", " production", " ", - " ", " ", - " com.vaadin", - " vaadin-maven-plugin", - " ${vaadin.version}", - " ", " ", - " frontend", - " compile", " ", - " prepare-frontend", - " build-frontend", - " ", " ", - " ", " ", " ", - " ", " "); + assertThat(mavenPom(request)).hasProfile("production").lines().containsSequence( + // @formatter:off + " ", + " production", + " ", + " ", + " com.vaadin", + " vaadin-core", + " ", + " ", + " com.vaadin", + " vaadin-dev", + " ", + " ", + " ", + "", + " ", + " ", + " ", + " ", + " com.vaadin", + " vaadin-maven-plugin", + " ${vaadin.version}", + " ", + " ", + " frontend", + " compile", + " ", + " prepare-frontend", + " build-frontend", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ); } @Test From a1cdb68013977b51c21fd8b9394e8321dc642df8 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 4 Jun 2024 10:20:32 +0200 Subject: [PATCH 550/825] Migrate DGS customizations to new extension API See gh-1497 --- .../DgsCodegenGroovyDslGradleBuildCustomizer.java | 12 ++++-------- .../DgsCodegenKotlinDslGradleBuildCustomizer.java | 12 ++++-------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java index 06f0252df4..48b7ffe7ce 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java @@ -38,14 +38,10 @@ class DgsCodegenGroovyDslGradleBuildCustomizer implements BuildCustomizer plugin.setVersion(this.pluginVersion)); - build.snippets().add((writer) -> { - writer.println("generateJava {"); - writer.indented(() -> { - writer.println("schemaPaths = [\"${projectDir}/src/main/resources/graphql-client\"]"); - writer.println("packageName = '" + this.packageName + ".codegen'"); - writer.println("generateClient = true"); - }); - writer.println("}"); + build.extensions().customize("generateJava", (generateJava) -> { + generateJava.attribute("schemaPaths", "[\"${projectDir}/src/main/resources/graphql-client\"]"); + generateJava.attribute("packageName", "'" + this.packageName + ".codegen'"); + generateJava.attribute("generateClient", "true"); }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java index b64eb82b93..85dd43bf70 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java @@ -38,14 +38,10 @@ class DgsCodegenKotlinDslGradleBuildCustomizer implements BuildCustomizer plugin.setVersion(this.pluginVersion)); - build.snippets().add((writer) -> { - writer.println("tasks.generateJava {"); - writer.indented(() -> { - writer.println("schemaPaths.add(\"${projectDir}/src/main/resources/graphql-client\")"); - writer.println("packageName = \"" + this.packageName + ".codegen\""); - writer.println("generateClient = true"); - }); - writer.println("}"); + build.extensions().customize("tasks.generateJava", (generateJava) -> { + generateJava.invoke("schemaPaths.add", "\"${projectDir}/src/main/resources/graphql-client\""); + generateJava.attribute("packageName", "\"" + this.packageName + ".codegen\""); + generateJava.attribute("generateClient", "true"); }); } From 217921c4cf71addc78893df8c99d95686c40ec93 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 4 Jun 2024 10:27:29 +0200 Subject: [PATCH 551/825] Migrate Hibernate customizations to new extension API See gh-1497 --- ...GraalVmProjectGenerationConfiguration.java | 15 ++---- ...HibernatePluginGradleBuildCustomizer.java} | 18 +++---- ...ePluginKotlinDslGradleBuildCustomizer.java | 50 ------------------- ...VmProjectGenerationConfigurationTests.java | 2 +- ...natePluginGradleBuildCustomizerTests.java} | 8 +-- ...inKotlinDslGradleBuildCustomizerTests.java | 50 ------------------- 6 files changed, 15 insertions(+), 128 deletions(-) rename start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/{HibernatePluginGroovyDslGradleBuildCustomizer.java => HibernatePluginGradleBuildCustomizer.java} (70%) delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java rename start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/{HibernatePluginGroovyDslGradleBuildCustomizerTests.java => HibernatePluginGradleBuildCustomizerTests.java} (84%) delete mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java index ce41dda872..ff53be8702 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -97,17 +97,10 @@ HibernatePluginMavenBuildCustomizer hibernatePluginMavenBuildCustomizer() { } @Bean - @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) - HibernatePluginGroovyDslGradleBuildCustomizer hibernatePluginGroovyDslGradleBuildCustomizer( + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + HibernatePluginGradleBuildCustomizer hibernatePluginGroovyDslGradleBuildCustomizer( MavenVersionResolver versionResolver) { - return new HibernatePluginGroovyDslGradleBuildCustomizer(determineHibernateVersion(versionResolver)); - } - - @Bean - @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) - HibernatePluginKotlinDslGradleBuildCustomizer hibernatePluginKotlinDslGradleBuildCustomizer( - MavenVersionResolver versionResolver) { - return new HibernatePluginKotlinDslGradleBuildCustomizer(determineHibernateVersion(versionResolver)); + return new HibernatePluginGradleBuildCustomizer(determineHibernateVersion(versionResolver)); } private Version determineHibernateVersion(MavenVersionResolver versionResolver) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizer.java similarity index 70% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizer.java index 46427aa5d6..52b6bae816 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,26 +25,20 @@ * * @author Stephane Nicoll */ -class HibernatePluginGroovyDslGradleBuildCustomizer implements BuildCustomizer { +class HibernatePluginGradleBuildCustomizer implements BuildCustomizer { private final Version hibernateVersion; - HibernatePluginGroovyDslGradleBuildCustomizer(Version hibernateVersion) { + HibernatePluginGradleBuildCustomizer(Version hibernateVersion) { this.hibernateVersion = hibernateVersion; } @Override public void customize(GradleBuild build) { build.plugins().add("org.hibernate.orm", (plugin) -> plugin.setVersion(this.hibernateVersion.toString())); - build.snippets().add((writer) -> { - writer.println("hibernate {"); - writer.indented(() -> { - writer.println("enhancement {"); - writer.indented(() -> writer.println("enableAssociationManagement = true")); - writer.println("}"); - }); - writer.println("}"); - }); + build.extensions() + .customize("hibernate", (hibernate) -> hibernate.nested("enhancement", + (enhancement) -> enhancement.attribute("enableAssociationManagement", "true"))); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java deleted file mode 100644 index 683ec763a5..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.graalvm; - -import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; -import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; - -/** - * A {@link BuildCustomizer} for projects using the Kotlin DSL with GraalVm and Hibernate. - * - * @author Stephane Nicoll - */ -class HibernatePluginKotlinDslGradleBuildCustomizer implements BuildCustomizer { - - private final Version hibernateVersion; - - HibernatePluginKotlinDslGradleBuildCustomizer(Version hibernateVersion) { - this.hibernateVersion = hibernateVersion; - } - - @Override - public void customize(GradleBuild build) { - build.plugins().add("org.hibernate.orm", (plugin) -> plugin.setVersion(this.hibernateVersion.toString())); - build.snippets().add((writer) -> { - writer.println("hibernate {"); - writer.indented(() -> { - writer.println("enhancement {"); - writer.indented(() -> writer.println("enableAssociationManagement.set(true)")); - writer.println("}"); - }); - writer.println("}"); - }); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index f404440595..535210101c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -94,7 +94,7 @@ void gradleBuildAndKotlinDslWithJpaConfiguresHibernateEnhancePlugin() { // @formatter:off "hibernate {", " enhancement {", - " enableAssociationManagement.set(true)", + " enableAssociationManagement = true", " }", "}"); // @formatter:on diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizerTests.java similarity index 84% rename from start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java rename to start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizerTests.java index 61d7007e4e..431efea445 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,15 +25,15 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link HibernatePluginGroovyDslGradleBuildCustomizer}. + * Tests for {@link HibernatePluginGradleBuildCustomizer}. * * @author Stephane Nicoll */ -class HibernatePluginGroovyDslGradleBuildCustomizerTests { +class HibernatePluginGradleBuildCustomizerTests { @Test void customizerAppliesHibernateEnhancePlugin() { - HibernatePluginGroovyDslGradleBuildCustomizer customizer = new HibernatePluginGroovyDslGradleBuildCustomizer( + HibernatePluginGradleBuildCustomizer customizer = new HibernatePluginGradleBuildCustomizer( Version.parse("6.1.0.Final")); GradleBuild build = new GradleBuild(); customizer.customize(build); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java deleted file mode 100644 index b52ac3b86d..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.graalvm; - -import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; -import io.spring.initializr.generator.buildsystem.gradle.GradlePlugin; -import io.spring.initializr.generator.buildsystem.gradle.StandardGradlePlugin; -import io.spring.initializr.generator.version.Version; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link HibernatePluginKotlinDslGradleBuildCustomizer}. - * - * @author Stephane Nicoll - */ -class HibernatePluginKotlinDslGradleBuildCustomizerTests { - - @Test - void customizerAppliesHibernateEnhancePlugin() { - HibernatePluginKotlinDslGradleBuildCustomizer customizer = new HibernatePluginKotlinDslGradleBuildCustomizer( - Version.parse("6.1.0.Final")); - GradleBuild build = new GradleBuild(); - customizer.customize(build); - GradlePlugin hibernatePlugin = build.plugins() - .values() - .filter((plugin) -> plugin.getId().equals("org.hibernate.orm")) - .findAny() - .orElse(null); - assertThat(hibernatePlugin).isNotNull(); - assertThat(hibernatePlugin).isInstanceOf(StandardGradlePlugin.class) - .satisfies((plugin) -> assertThat(((StandardGradlePlugin) plugin).getVersion()).isEqualTo("6.1.0.Final")); - } - -} From b1e4b535970b2c1edc82bba68e4e25c2c9b1ebc4 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 4 Jun 2024 10:54:59 +0200 Subject: [PATCH 552/825] Migrate Spring Cloud Contract customizations to new extension API See gh-1497 --- ...ontractGroovyDslGradleBuildCustomizer.java | 14 ++++------- ...ontractKotlinDslGradleBuildCustomizer.java | 23 +++++-------------- ...oudContractGradleBuildCustomizerTests.java | 4 ++-- 3 files changed, 13 insertions(+), 28 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java index cdb092ff19..08c3f65509 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,14 +33,10 @@ class SpringCloudContractGroovyDslGradleBuildCustomizer extends SpringCloudContr @Override protected void configureContractsDsl(GradleBuild build) { - build.snippets().add((indentingWriter) -> { - indentingWriter.println("contracts {"); - indentingWriter.indented(() -> { - if (build.dependencies().has("webflux")) { - indentingWriter.println("testMode = 'WebTestClient'"); - } - }); - indentingWriter.println("}"); + build.extensions().customize("contracts", (contracts) -> { + if (build.dependencies().has("webflux")) { + contracts.attribute("testMode", "'WebTestClient'"); + } }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java index 91b8b09887..1e7d064934 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,6 @@ package io.spring.start.site.extension.dependency.springcloud; -import java.util.LinkedHashSet; -import java.util.Set; - import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.project.ProjectDescription; @@ -36,19 +33,11 @@ class SpringCloudContractKotlinDslGradleBuildCustomizer extends SpringCloudContr @Override protected void configureContractsDsl(GradleBuild build) { - boolean hasWebflux = build.dependencies().has("webflux"); - Set imports = new LinkedHashSet<>(); - if (hasWebflux) { - imports.add("org.springframework.cloud.contract.verifier.config.TestMode"); - } - build.snippets().add(imports, (indentingWriter) -> { - indentingWriter.println("contracts {"); - indentingWriter.indented(() -> { - if (hasWebflux) { - indentingWriter.println("testMode.set(TestMode.WEBTESTCLIENT)"); - } - }); - indentingWriter.println("}"); + build.extensions().customize("contracts", (contracts) -> { + if (build.dependencies().has("webflux")) { + contracts.attributeWithType("testMode", "TestMode.WEBTESTCLIENT", + "org.springframework.cloud.contract.verifier.config.TestMode"); + } }); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java index d3da6f831a..3e87a7d55a 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -67,7 +67,7 @@ void springCloudContractVerifierPluginWithKotlinDslAndTestModeSetWhenWebFluxIsPr request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleKotlinDslBuild(request)) .contains("import org.springframework.cloud.contract.verifier.config.TestMode") - .containsSubsequence("contracts {", "testMode.set(TestMode.WEBTESTCLIENT)"); + .containsSubsequence("contracts {", "testMode = TestMode.WEBTESTCLIENT"); } @Test From 9f94bf82673dd783210da21ecbc4e45427c79c47 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 4 Jun 2024 11:12:07 +0200 Subject: [PATCH 553/825] Suppress deprecations --- .../SpringRestDocsGradleGroovyBuildCustomizerTests.java | 1 + .../SpringRestDocsGradleKotlinBuildCustomizerTests.java | 1 + 2 files changed, 2 insertions(+) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java index 56263f84d2..a0fbf82ced 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java @@ -35,6 +35,7 @@ class SpringRestDocsGradleGroovyBuildCustomizerTests { private final SpringRestDocsGradleGroovyBuildCustomizer customizer = new SpringRestDocsGradleGroovyBuildCustomizer(); @Test + @SuppressWarnings("removal") void customizesGradleBuild() { GradleBuild build = new GradleBuild(); this.customizer.customize(build); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java index 743c07652b..42a7917e63 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java @@ -30,6 +30,7 @@ * * @author Moritz Halbritter */ +@SuppressWarnings("removal") class SpringRestDocsGradleKotlinBuildCustomizerTests { private final SpringRestDocsGradleKotlinBuildCustomizer customizer = new SpringRestDocsGradleKotlinBuildCustomizer(); From 71f8164a01f20a5dc78ab8822f6361ebf7887bae Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:40:55 +0300 Subject: [PATCH 554/825] Upgrade to Vaadin 24.3.13 See gh-1496 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index bdfd24b45d..a38f6e52e5 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -156,7 +156,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.3.12 + version: 24.3.13 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From f86919f08d95ec28a1165e83ffb4b50cbe0f7754 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Tue, 4 Jun 2024 15:38:50 +0100 Subject: [PATCH 555/825] Upgrade to Spring Shell 3.3.0 See gh-1498 --- start-site/src/main/resources/application.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index a38f6e52e5..7338050b5e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -141,8 +141,7 @@ initializr: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 3.2.5 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.3.0-RC1 - repositories: spring-milestones + version: 3.3.0 timefold-solver: groupId: ai.timefold.solver artifactId: timefold-solver-bom From 927f4e728ae2da82fdb75de36c161d5e88c95139 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 5 Jun 2024 09:09:07 +0200 Subject: [PATCH 556/825] Adapt to initializr changes --- .../project/JavaVersionProjectDescriptionCustomizerTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index d94d38668b..6d83d76ab4 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -58,7 +58,7 @@ void mavenBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String language, @MethodSource("supportedGradleGroovyParameters") void gradleGroovyBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String language, String javaVersion, String springBootVersion) { - assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasSourceCompatibility(javaVersion); + assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasToolchainForJava(javaVersion); } @Test From e5c95207a1332414edce39f20719c65834e643cb Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 5 Jun 2024 10:47:37 +0200 Subject: [PATCH 557/825] Adapt to initializr changes --- .../extension/code/kotlin/KotlinCoroutinesCustomizer.java | 4 ++-- .../code/kotlin/KotlinProjectGenerationConfiguration.java | 7 ++++--- .../code/kotlin/ReactorKotlinExtensionsCustomizer.java | 7 ++++--- .../DependencyProjectGenerationConfiguration.java | 7 ++++--- .../dependency/graphql/SpringGraphQlBuildCustomizer.java | 7 ++++--- .../SpringGraphQlProjectGenerationConfiguration.java | 8 +++++--- .../dependency/reactor/ReactorTestBuildCustomizer.java | 7 ++++--- .../SpringCloudCircuitBreakerBuildCustomizer.java | 4 ++-- 8 files changed, 29 insertions(+), 22 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java index 88fcf4bb19..3634d8ce93 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,7 +41,7 @@ public class KotlinCoroutinesCustomizer { public KotlinCoroutinesCustomizer(InitializrMetadata metadata, ProjectDescription description, MavenVersionResolver versionResolver) { - this.buildResolver = new BuildMetadataResolver(metadata); + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); this.description = description; this.versionResolver = versionResolver; } diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java index 67a42b9024..54d7310c28 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,8 +50,9 @@ KotlinVersionResolver kotlinVersionResolver(MavenVersionResolver versionResolver } @Bean - ReactorKotlinExtensionsCustomizer reactorKotlinExtensionsCustomizer(InitializrMetadata metadata) { - return new ReactorKotlinExtensionsCustomizer(metadata); + ReactorKotlinExtensionsCustomizer reactorKotlinExtensionsCustomizer(InitializrMetadata metadata, + ProjectDescription description) { + return new ReactorKotlinExtensionsCustomizer(metadata, description); } @Configuration diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java index d813c43196..12673ac225 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.spring.build.BuildMetadataResolver; import io.spring.initializr.metadata.InitializrMetadata; @@ -32,8 +33,8 @@ class ReactorKotlinExtensionsCustomizer implements BuildCustomizer { private final BuildMetadataResolver buildResolver; - ReactorKotlinExtensionsCustomizer(InitializrMetadata metadata) { - this.buildResolver = new BuildMetadataResolver(metadata); + ReactorKotlinExtensionsCustomizer(InitializrMetadata metadata, ProjectDescription description) { + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java index 4a42b1a1b7..a5240dc1ad 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.gradle.ConditionalOnGradleVersion; import io.spring.initializr.metadata.InitializrMetadata; @@ -56,8 +57,8 @@ public DependencyProjectGenerationConfiguration(InitializrMetadata metadata) { } @Bean - public ReactorTestBuildCustomizer reactorTestBuildCustomizer() { - return new ReactorTestBuildCustomizer(this.metadata); + public ReactorTestBuildCustomizer reactorTestBuildCustomizer(ProjectDescription description) { + return new ReactorTestBuildCustomizer(this.metadata, description); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java index 57a22722ee..e07bf52471 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.spring.build.BuildMetadataResolver; import io.spring.initializr.metadata.InitializrMetadata; @@ -34,8 +35,8 @@ class SpringGraphQlBuildCustomizer implements BuildCustomizer { private final BuildMetadataResolver buildResolver; - SpringGraphQlBuildCustomizer(InitializrMetadata metadata) { - this.buildResolver = new BuildMetadataResolver(metadata); + SpringGraphQlBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java index 6fd3c04195..f676f89fad 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package io.spring.start.site.extension.dependency.graphql; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.metadata.InitializrMetadata; import org.springframework.context.annotation.Bean; @@ -37,8 +38,9 @@ SpringGraphQlProjectContributor SpringGraphQlProjectContributor() { } @Bean - SpringGraphQlBuildCustomizer SpringGraphQlBuildCustomizer(InitializrMetadata initializrMetadata) { - return new SpringGraphQlBuildCustomizer(initializrMetadata); + SpringGraphQlBuildCustomizer SpringGraphQlBuildCustomizer(InitializrMetadata initializrMetadata, + ProjectDescription description) { + return new SpringGraphQlBuildCustomizer(initializrMetadata, description); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java index 277c8227c0..6b0eed8b20 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.spring.build.BuildMetadataResolver; import io.spring.initializr.metadata.InitializrMetadata; @@ -34,8 +35,8 @@ public class ReactorTestBuildCustomizer implements BuildCustomizer { private final BuildMetadataResolver buildResolver; - public ReactorTestBuildCustomizer(InitializrMetadata metadata) { - this.buildResolver = new BuildMetadataResolver(metadata); + public ReactorTestBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java index 420374e020..569cd725e6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,7 +43,7 @@ public class SpringCloudCircuitBreakerBuildCustomizer implements BuildCustomizer private final ProjectDescription description; public SpringCloudCircuitBreakerBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { - this.buildResolver = new BuildMetadataResolver(metadata); + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); this.metadata = metadata; this.description = description; } From ee437fd85264203304cab7feb27920e994def9ba Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 5 Jun 2024 13:59:06 +0200 Subject: [PATCH 558/825] Add SBOM support Closes gh-1480 --- .../sbom/SbomCycloneDxBuildCustomizer.java | 42 +++++++++++ .../SbomCycloneDxGradleBuildCustomizer.java | 36 ++++++++++ .../SbomCycloneDxMavenBuildCustomizer.java | 34 +++++++++ .../SbomProjectGenerationConfiguration.java | 53 ++++++++++++++ .../dependency/sbom/package-info.java | 20 ++++++ .../main/resources/META-INF/spring.factories | 1 + start-site/src/main/resources/application.yml | 10 +++ ...omProjectGenerationConfigurationTests.java | 70 +++++++++++++++++++ 8 files changed, 266 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxMavenBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/package-info.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxBuildCustomizer.java new file mode 100644 index 0000000000..0b08f1d88c --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxBuildCustomizer.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.sbom; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +import org.springframework.core.Ordered; + +/** + * {@link BuildCustomizer} that removes the CycloneDX SBOM dependency as SBOM support does + * not require any dependency. + * + * @author Moritz Halbritter + */ +class SbomCycloneDxBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + build.dependencies().remove("sbom-cyclone-dx"); + } + + @Override + public int getOrder() { + return Ordered.LOWEST_PRECEDENCE - 10; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java new file mode 100644 index 0000000000..a68ed6fcf3 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java @@ -0,0 +1,36 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.sbom; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} that adds the CycloneDX Gradle plugin. + * + * @author Moritz Halbritter + */ +class SbomCycloneDxGradleBuildCustomizer implements BuildCustomizer { + + private static final String PLUGIN_VERSION = "1.8.2"; + + @Override + public void customize(GradleBuild build) { + build.plugins().add("org.cyclonedx.bom", (plugin) -> plugin.setVersion(PLUGIN_VERSION)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxMavenBuildCustomizer.java new file mode 100644 index 0000000000..3282385f4f --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxMavenBuildCustomizer.java @@ -0,0 +1,34 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.sbom; + +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} that adds the CycloneDX Maven plugin. + * + * @author Moritz Halbritter + */ +class SbomCycloneDxMavenBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(MavenBuild build) { + build.plugins().add("org.cyclonedx", "cyclonedx-maven-plugin"); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfiguration.java new file mode 100644 index 0000000000..d6d5528155 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfiguration.java @@ -0,0 +1,53 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.sbom; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; + +import org.springframework.context.annotation.Bean; + +/** + * {@link ProjectGenerationConfiguration} for generation of projects that use SBOMs. + * + * @author Moritz Halbritter + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("sbom-cyclone-dx") +class SbomProjectGenerationConfiguration { + + @Bean + SbomCycloneDxBuildCustomizer sbomBuildCustomizer() { + return new SbomCycloneDxBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + SbomCycloneDxMavenBuildCustomizer sbomCycloneDxMavenBuildCustomizer() { + return new SbomCycloneDxMavenBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + SbomCycloneDxGradleBuildCustomizer sbomCycloneDxGradleBuildCustomizer() { + return new SbomCycloneDxGradleBuildCustomizer(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/package-info.java new file mode 100644 index 0000000000..81b08a0254 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that use SBOMs. + */ +package io.spring.start.site.extension.dependency.sbom; diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 181db41f02..7a2980f95d 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -23,6 +23,7 @@ io.spring.start.site.extension.dependency.oracle.OracleProjectGenerationConfigur io.spring.start.site.extension.dependency.postgresql.PgVectorProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.postgresql.PostgresqlProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.redis.RedisProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.sbom.SbomProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.solace.SolaceProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springamqp.SpringAmqpProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springazure.SpringAzureProjectGenerationConfiguration,\ diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 7338050b5e..61339f66df 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -898,6 +898,16 @@ initializr: description: Building a RESTful Web Service with Spring Boot Actuator - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator + - name: CycloneDX SBOM support + id: sbom-cyclone-dx + description: Creates a Software Bill of Materials in CycloneDX format. + groupId: org.springframework.boot + artifactId: spring-boot + starter: false + compatibilityRange: "3.3.0" + links: + - rel: reference + href: https://docs.spring.io/spring-boot/reference/actuator/endpoints.html#actuator.endpoints.sbom - name: codecentric's Spring Boot Admin (Client) id: codecentric-spring-boot-admin-client groupId: de.codecentric diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..56c3dfd052 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java @@ -0,0 +1,70 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.sbom; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SbomProjectGenerationConfiguration}. + * + * @author Moritz Halbritter + */ +class SbomProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void shouldNotAddGradlePluginIfSbomIsNotSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(gradleBuild(request)).doesNotContain("org.cyclonedx.bom"); + } + + @Test + void shouldNotAddMavenPluginIfSbomIsNotSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("cyclonedx-maven-plugin"); + } + + @Test + void shouldRemoveArtificalDependency() { + ProjectRequest request = createProjectRequest("sbom-cyclone-dx"); + assertThat(mavenPom(request)).doesNotHaveDependency("org.springframework.boot", "spring-boot"); + assertThat(gradleBuild(request)).doesNotContain("'org.springframework.boot:spring-boot'"); + } + + @Test + void shouldAddMavenPlugin() { + ProjectRequest request = createProjectRequest("sbom-cyclone-dx"); + assertThat(mavenPom(request)).lines().containsSequence( + // @formatter:off + " ", + " org.cyclonedx", + " cyclonedx-maven-plugin", + " " + // @formatter:on + ); + } + + @Test + void shouldAddGradlePlugin() { + ProjectRequest request = createProjectRequest("sbom-cyclone-dx"); + assertThat(gradleBuild(request)).hasPlugin("org.cyclonedx.bom", "1.8.2"); + } + +} From 55f991d0f818990260ada1d1360050dc1b430b34 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 6 Jun 2024 11:56:35 +0200 Subject: [PATCH 559/825] Document Gradle toolchain limitations when using native image Closes gh-1499 --- .../GraalVmHelpDocumentCustomizer.java | 5 ++++- .../main/resources/templates/graalvm.mustache | 9 +++++++++ .../GraalVmHelpDocumentCustomizerTests.java | 19 ++++++++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java index e1af26e55e..685edb169b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import java.util.stream.Stream; import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.documentation.HelpDocument; @@ -59,11 +60,13 @@ public void customize(HelpDocument document) { "https://docs.spring.io/spring-boot/docs/%s/reference/html/native-image.html#native-image", this.platformVersion), "GraalVM Native Image Support"); boolean mavenBuild = this.build instanceof MavenBuild; + boolean gradleBuild = this.build instanceof GradleBuild; String url = String.format("https://docs.spring.io/spring-boot/docs/%s/%s/reference/htmlsingle/#aot", this.platformVersion, (mavenBuild) ? "maven-plugin" : "gradle-plugin"); document.gettingStarted().addAdditionalLink(url, "Configure AOT settings in Build Plugin"); Map model = new HashMap<>(); + model.put("gradleBuild", gradleBuild); // Cloud native buildpacks model.put("cnbBuildImageCommand", mavenBuild ? "./mvnw spring-boot:build-image -Pnative" : "./gradlew bootBuildImage"); diff --git a/start-site/src/main/resources/templates/graalvm.mustache b/start-site/src/main/resources/templates/graalvm.mustache index 9bda7dfc54..765a136edb 100644 --- a/start-site/src/main/resources/templates/graalvm.mustache +++ b/start-site/src/main/resources/templates/graalvm.mustache @@ -44,3 +44,12 @@ To run your existing tests in a native image, run the following goal: ``` $ {{testsExecutionCommand}} ``` + +{{#gradleBuild}} +### Gradle Toolchain support + +There are some limitations regarding Native Build Tools and Gradle toolchains. +Native Build Tools disable toolchain support by default. +Effectively, native image compilation is done with the JDK used to execute Gradle. +You can read more about [toolchain support in the Native Build tools here](https://graalvm.github.io/native-build-tools/latest/gradle-plugin.html#configuration-toolchains). +{{/gradleBuild}} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java index ceaad5ab42..78961c3b53 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,6 +38,7 @@ * Tests for {@link GraalVmHelpDocumentCustomizer}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class GraalVmHelpDocumentCustomizerTests extends AbstractExtensionTests { @@ -102,6 +103,22 @@ void nativeSectionWithWebExposesPort() { assertHelpDocument(request).contains("$ docker run --rm -p 8080:8080 another-project:2.0.0-SNAPSHOT"); } + @Test + void shouldDocumentGradleToolchainLimitations() { + ProjectRequest request = createProjectRequest("native"); + request.setType("gradle-project"); + assertHelpDocument(request) + .contains("There are some limitations regarding Native Build Tools and Gradle toolchains."); + } + + @Test + void shouldNotDocumentGradleToolchainLimitationsWhenUsingMaven() { + ProjectRequest request = createProjectRequest("native"); + request.setType("maven-project"); + assertHelpDocument(request) + .doesNotContain("There are some limitations regarding Native Build Tools and Gradle toolchains."); + } + private TextAssert assertHelpDocument(ProjectRequest request) { ProjectStructure project = generateProject(request); return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); From 29980bcf1cc484701105bfd113b75440a5c8b252 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 6 Jun 2024 13:20:01 +0200 Subject: [PATCH 560/825] Fix typo --- start-site/src/main/resources/templates/graalvm.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/templates/graalvm.mustache b/start-site/src/main/resources/templates/graalvm.mustache index 765a136edb..ff92955d5b 100644 --- a/start-site/src/main/resources/templates/graalvm.mustache +++ b/start-site/src/main/resources/templates/graalvm.mustache @@ -51,5 +51,5 @@ $ {{testsExecutionCommand}} There are some limitations regarding Native Build Tools and Gradle toolchains. Native Build Tools disable toolchain support by default. Effectively, native image compilation is done with the JDK used to execute Gradle. -You can read more about [toolchain support in the Native Build tools here](https://graalvm.github.io/native-build-tools/latest/gradle-plugin.html#configuration-toolchains). +You can read more about [toolchain support in the Native Build Tools here](https://graalvm.github.io/native-build-tools/latest/gradle-plugin.html#configuration-toolchains). {{/gradleBuild}} From 4cadd871de8a4689977714eb178e645a17728561 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 5 Jun 2024 15:41:33 +0200 Subject: [PATCH 561/825] Import testcontainers configuration in integration tests This changes the code generation of the Testcontainers support: the testcontainer beans are now defined in their own configuration. This configuration is used in the test main method, and is @Import-ed in the integration test. The result is that the test main method starts testcontainers, and the tests pass too as they now also start the testcontainers. Closes gh-1247 --- ...nersApplicationCodeProjectContributor.java | 7 +- ...gurationTestApplicationTypeCustomizer.java | 39 +++++ ...nersApplicationCodeProjectContributor.java | 7 +- ...nersApplicationCodeProjectContributor.java | 23 +-- ...nersApplicationCodeProjectContributor.java | 26 +++- ...tainersProjectGenerationConfiguration.java | 7 +- ...leProjectGenerationConfigurationTests.java | 4 +- ...rsProjectGenerationConfigurationTests.java | 142 +++++++++++++----- 8 files changed, 184 insertions(+), 71 deletions(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/ImportTestcontainersConfigurationTestApplicationTypeCustomizer.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java index cee6236a48..460aabba43 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,14 +52,15 @@ class GroovyTestContainersApplicationCodeProjectContributor extends @Override protected void contributeCode(GroovySourceCode sourceCode) { + super.contributeCode(sourceCode); customizeApplicationTypeDeclaration(sourceCode, (type) -> { type.modifiers(Modifier.PUBLIC); type.addMethodDeclaration(GroovyMethodDeclaration.method("main") .modifiers(Modifier.PUBLIC | Modifier.STATIC) .returning("void") .parameters(Parameter.of("args", String[].class)) - .body(CodeBlock.ofStatement("$T.from($L::main).with($L).run(args)", SpringApplication.class, - getDescription().getApplicationName(), getTestApplicationName()))); + .body(CodeBlock.ofStatement("$T.from($L::main).with($T).run(args)", SpringApplication.class, + getDescription().getApplicationName(), TESTCONTAINERS_CONFIGURATION_CLASS_NAME))); }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/ImportTestcontainersConfigurationTestApplicationTypeCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/ImportTestcontainersConfigurationTestApplicationTypeCustomizer.java new file mode 100644 index 0000000000..98fedf7594 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/ImportTestcontainersConfigurationTestApplicationTypeCustomizer.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.testcontainers; + +import io.spring.initializr.generator.language.ClassName; +import io.spring.initializr.generator.language.TypeDeclaration; +import io.spring.initializr.generator.spring.code.TestApplicationTypeCustomizer; + +/** + * {@link TestApplicationTypeCustomizer} that imports the generated Testcontainers test + * configuration. + * + * @author Moritz Halbritter + */ +class ImportTestcontainersConfigurationTestApplicationTypeCustomizer + implements TestApplicationTypeCustomizer { + + @Override + public void customize(TypeDeclaration typeDeclaration) { + typeDeclaration.annotations() + .add(ClassName.of("org.springframework.context.annotation.Import"), (annotation) -> annotation.set("value", + TestContainersApplicationCodeProjectContributor.TESTCONTAINERS_CONFIGURATION_CLASS_NAME)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java index 774cf4ac3c..6bd9717be1 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,14 +52,15 @@ class JavaTestContainersApplicationCodeProjectContributor extends @Override protected void contributeCode(JavaSourceCode sourceCode) { + super.contributeCode(sourceCode); customizeApplicationTypeDeclaration(sourceCode, (type) -> { type.modifiers(Modifier.PUBLIC); type.addMethodDeclaration(JavaMethodDeclaration.method("main") .modifiers(Modifier.PUBLIC | Modifier.STATIC) .returning("void") .parameters(Parameter.of("args", String[].class)) - .body(CodeBlock.ofStatement("$T.from($L::main).with($L.class).run(args)", SpringApplication.class, - getDescription().getApplicationName(), getTestApplicationName()))); + .body(CodeBlock.ofStatement("$T.from($L::main).with($T.class).run(args)", SpringApplication.class, + getDescription().getApplicationName(), TESTCONTAINERS_CONFIGURATION_CLASS_NAME))); }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java index 715d462022..4105fd4409 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package io.spring.start.site.extension.dependency.testcontainers; import java.util.Arrays; -import java.util.function.Consumer; import java.util.stream.Collectors; import io.spring.initializr.generator.io.IndentingWriterFactory; @@ -25,7 +24,6 @@ import io.spring.initializr.generator.language.Parameter; import io.spring.initializr.generator.language.kotlin.KotlinCompilationUnit; import io.spring.initializr.generator.language.kotlin.KotlinFunctionDeclaration; -import io.spring.initializr.generator.language.kotlin.KotlinModifier; import io.spring.initializr.generator.language.kotlin.KotlinSourceCode; import io.spring.initializr.generator.language.kotlin.KotlinSourceCodeWriter; import io.spring.initializr.generator.language.kotlin.KotlinTypeDeclaration; @@ -53,18 +51,13 @@ class KotlinTestContainersApplicationCodeProjectContributor extends @Override protected void contributeCode(KotlinSourceCode sourceCode) { - customizeApplicationTypeDeclaration(sourceCode, (type) -> type.modifiers(KotlinModifier.PUBLIC)); - } - - @Override - protected void customizeApplicationCompilationUnit(KotlinSourceCode sourceCode, - Consumer customizer) { - super.customizeApplicationCompilationUnit(sourceCode, customizer - .andThen((compilationUnit) -> compilationUnit.addTopLevelFunction(KotlinFunctionDeclaration.function("main") - .parameters(Parameter.of("args", "Array")) - .body(CodeBlock.ofStatement("$T<$L>().$T($L::class).run(*args)", - "org.springframework.boot.fromApplication", getDescription().getApplicationName(), - "org.springframework.boot.with", getTestApplicationName()))))); + super.contributeCode(sourceCode); + customizeApplicationCompilationUnit(sourceCode, + (compilationUnit) -> compilationUnit.addTopLevelFunction(KotlinFunctionDeclaration.function("main") + .parameters(Parameter.of("args", "Array")) + .body(CodeBlock.ofStatement("$T<$L>().$T($T::class).run(*args)", + "org.springframework.boot.fromApplication", getDescription().getApplicationName(), + "org.springframework.boot.with", TESTCONTAINERS_CONFIGURATION_CLASS_NAME)))); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java index 6e5667c39e..1d87858037 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,6 +40,7 @@ * @param language-specific compilation unit * @param language-specific source code * @author Stephane Nicoll + * @author Moritz Halbritter */ abstract class TestContainersApplicationCodeProjectContributor, S extends SourceCode> implements ProjectContributor { @@ -55,6 +56,8 @@ abstract class TestContainersApplicationCodeProjectContributor annotation.set("proxyBeanMethods", false)); + this.serviceConnections.values() + .forEach((serviceConnection) -> configureServiceConnection(testcontainersConfiguration, serviceConnection)); + } protected abstract void configureServiceConnection(T typeDeclaration, ServiceConnection serviceConnection); @@ -101,10 +117,6 @@ protected void customizeApplicationCompilationUnit(S sourceCode, Consumer cus protected void customizeApplicationTypeDeclaration(S sourceCode, Consumer customizer) { customizeApplicationCompilationUnit(sourceCode, (compilationUnit) -> { T applicationType = compilationUnit.createTypeDeclaration(getTestApplicationName()); - applicationType.annotations() - .add(TEST_CONFIGURATION_CLASS_NAME, (annotation) -> annotation.set("proxyBeanMethods", false)); - this.serviceConnections.values() - .forEach((serviceConnection) -> configureServiceConnection(applicationType, serviceConnection)); customizer.accept(applicationType); }); } @@ -118,7 +130,7 @@ protected void annotateContainerMethod(Annotatable annotable, String name) { }); } - protected String getTestApplicationName() { + private String getTestApplicationName() { return "Test" + this.description.getApplicationName(); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java index 4cedcf17a6..3de0c8dfab 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -127,6 +127,11 @@ JavaTestContainersApplicationCodeProjectContributor javaTestContainersApplicatio this.description, serviceConnections); } + @Bean + ImportTestcontainersConfigurationTestApplicationTypeCustomizer importTestcontainersConfigurationTestApplicationTypeCustomizer() { + return new ImportTestcontainersConfigurationTestApplicationTypeCustomizer(); + } + } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java index 4531d3e4c8..a179303734 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,7 +53,7 @@ void declaresOracleFreeContainerBeanWithBoot32() { ProjectRequest request = createProjectRequest("testcontainers", "oracle"); request.setBootVersion(SPRING_BOOT_VERSION); request.setLanguage("java"); - assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") + assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") .contains("import org.testcontainers.oracle.OracleContainer;") .contains(" return new OracleContainer(DockerImageName.parse(\"gvenzl/oracle-free:latest\"));"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 118839c380..5773293b59 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -168,11 +168,11 @@ void testApplicationWithGroovyAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("groovy"); - assertThat(generateProject(request)).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") + assertThat(generateProject(request)) + .textFile("src/test/groovy/com/example/demo/TestcontainersConfiguration.groovy") .isEqualTo(""" package com.example.demo - import org.springframework.boot.SpringApplication import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection import org.springframework.context.annotation.Bean @@ -180,7 +180,7 @@ void testApplicationWithGroovyAndGenericContainerIsContributed() { import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection(name = "redis") @@ -188,10 +188,6 @@ GenericContainer redisContainer() { new GenericContainer<>(DockerImageName.parse("redis:latest")).withExposedPorts(6379) } - static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication).run(args) - } - } """); } @@ -201,11 +197,10 @@ void testApplicationWithJavaAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("java"); - assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") + assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") .isEqualTo(""" package com.example.demo; - import org.springframework.boot.SpringApplication; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; @@ -213,7 +208,7 @@ void testApplicationWithJavaAndGenericContainerIsContributed() { import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) - public class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection(name = "redis") @@ -221,10 +216,6 @@ GenericContainer redisContainer() { return new GenericContainer<>(DockerImageName.parse("redis:latest")).withExposedPorts(6379); } - public static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication.class).run(args); - } - } """); } @@ -234,20 +225,18 @@ void testApplicationWithKotlinAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("kotlin"); - assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt") + assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestcontainersConfiguration.kt") .isEqualTo(""" package com.example.demo - import org.springframework.boot.fromApplication import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection - import org.springframework.boot.with import org.springframework.context.annotation.Bean import org.testcontainers.containers.GenericContainer import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection(name = "redis") @@ -256,10 +245,6 @@ fun redisContainer(): GenericContainer<*> { } } - - fun main(args: Array) { - fromApplication().with(TestDemoApplication::class).run(*args) - } """); } @@ -268,11 +253,25 @@ void testApplicationWithGroovyAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("groovy"); - assertThat(generateProject(request)).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") + ProjectStructure projectStructure = generateProject(request); + assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") .isEqualTo(""" package com.example.demo import org.springframework.boot.SpringApplication + + class TestDemoApplication { + + static void main(String[] args) { + SpringApplication.from(DemoApplication::main).with(TestcontainersConfiguration).run(args) + } + + } + """); + assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/TestcontainersConfiguration.groovy") + .isEqualTo(""" + package com.example.demo + import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection import org.springframework.context.annotation.Bean @@ -280,7 +279,7 @@ void testApplicationWithGroovyAndSpecificContainerIsContributed() { import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection @@ -288,8 +287,22 @@ CassandraContainer cassandraContainer() { new CassandraContainer<>(DockerImageName.parse("cassandra:latest")) } - static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication).run(args) + } + """); + assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/DemoApplicationTests.groovy") + .isEqualTo(""" + package com.example.demo + + import org.junit.jupiter.api.Test + import org.springframework.boot.test.context.SpringBootTest + import org.springframework.context.annotation.Import + + @Import(TestcontainersConfiguration) + @SpringBootTest + class DemoApplicationTests { + + @Test + void contextLoads() { } } @@ -301,11 +314,24 @@ void testApplicationWithJavaAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("java"); - assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") + ProjectStructure projectStructure = generateProject(request); + assertThat(projectStructure).textFile("src/test/java/com/example/demo/TestDemoApplication.java").isEqualTo(""" + package com.example.demo; + + import org.springframework.boot.SpringApplication; + + public class TestDemoApplication { + + public static void main(String[] args) { + SpringApplication.from(DemoApplication::main).with(TestcontainersConfiguration.class).run(args); + } + + } + """); + assertThat(projectStructure).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") .isEqualTo(""" package com.example.demo; - import org.springframework.boot.SpringApplication; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; @@ -313,7 +339,7 @@ void testApplicationWithJavaAndSpecificContainerIsContributed() { import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) - public class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection @@ -321,12 +347,25 @@ CassandraContainer cassandraContainer() { return new CassandraContainer<>(DockerImageName.parse("cassandra:latest")); } - public static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication.class).run(args); - } - } """); + assertThat(projectStructure).textFile("src/test/java/com/example/demo/DemoApplicationTests.java").isEqualTo(""" + package com.example.demo; + + import org.junit.jupiter.api.Test; + import org.springframework.boot.test.context.SpringBootTest; + import org.springframework.context.annotation.Import; + + @Import(TestcontainersConfiguration.class) + @SpringBootTest + class DemoApplicationTests { + + @Test + void contextLoads() { + } + + } + """); } @Test @@ -334,20 +373,30 @@ void testApplicationWithKotlinAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("kotlin"); - assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt") + ProjectStructure projectStructure = generateProject(request); + assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt").isEqualTo(""" + package com.example.demo + + import org.springframework.boot.fromApplication + import org.springframework.boot.with + + + fun main(args: Array) { + fromApplication().with(TestcontainersConfiguration::class).run(*args) + } + """); + assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/TestcontainersConfiguration.kt") .isEqualTo(""" package com.example.demo - import org.springframework.boot.fromApplication import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection - import org.springframework.boot.with import org.springframework.context.annotation.Bean import org.testcontainers.containers.CassandraContainer import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection @@ -356,11 +405,24 @@ fun cassandraContainer(): CassandraContainer<*> { } } + """); + assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/DemoApplicationTests.kt").isEqualTo(""" + package com.example.demo + + import org.junit.jupiter.api.Test + import org.springframework.boot.test.context.SpringBootTest + import org.springframework.context.annotation.Import - fun main(args: Array) { - fromApplication().with(TestDemoApplication::class).run(*args) + @Import(TestcontainersConfiguration::class) + @SpringBootTest + class DemoApplicationTests { + + @Test + fun contextLoads() { } - """); + + } + """); } @Test From 4593fafdbf5eb23ab90e63ffbe6d80e21185b93b Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 7 Jun 2024 09:05:36 +0200 Subject: [PATCH 562/825] Upgrade to Spring Cloud Azure 5.13.0 Closes gh-1502 --- start-site/src/main/resources/application.yml | 6 +++--- .../SpringAzureProjectGenerationConfigurationTests.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 61339f66df..43ef8590da 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -106,8 +106,8 @@ initializr: artifactId: spring-cloud-azure-dependencies versionProperty: spring-cloud-azure.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 5.12.0 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 5.13.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies @@ -1308,7 +1308,7 @@ initializr: href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - name: Microsoft Azure bom: spring-cloud-azure - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Azure Support id: azure-support diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java index 17edd1cbe2..4590531a98 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,7 @@ */ class SpringAzureProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @ParameterizedTest @MethodSource("azureDependencies") From a3b407229dc3ef6f7653d7531aad4d538437c360 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 7 Jun 2024 09:13:38 +0200 Subject: [PATCH 563/825] Upgrade to Spring Boot 3.3.0 Closes gh-1475 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 0cfce4cc27..04aeb6b6fc 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.6 + 3.3.0 io.spring.start start-parent @@ -82,7 +82,7 @@ com.azure.spring spring-cloud-azure-dependencies - 5.8.0 + 5.13.0 pom import From e74e9a2f581e21b75c1386542c4c7d00a0c8f9a9 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 11 Jun 2024 08:22:20 +0200 Subject: [PATCH 564/825] Use initializr 0.22.0-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 04aeb6b6fc..f46361b7a7 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ 0.0.1-SNAPSHOT false - 0.21.0-SNAPSHOT + 0.22.0-SNAPSHOT 0.0.41 From 0802a8b304328bd53b5a61f2c396c16262c38756 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 11 Jun 2024 08:42:11 +0200 Subject: [PATCH 565/825] Upgrade to Spring Javaformat 0.0.42 Closes gh-1503 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f46361b7a7..5cdacfcdc8 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 0.0.1-SNAPSHOT false 0.22.0-SNAPSHOT - 0.0.41 + 0.0.42 From ce48933f03153197e8fc3ff9a98225d98ec09a48 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 11 Jun 2024 08:43:29 +0200 Subject: [PATCH 566/825] Upgrade checkstyle dependencies Closes gh-1504 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5cdacfcdc8..393d60a43b 100644 --- a/pom.xml +++ b/pom.xml @@ -116,7 +116,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 3.3.1 + 3.4.0 checkstyle-validation @@ -135,7 +135,7 @@ com.puppycrawl.tools checkstyle - 10.12.7 + 10.17.0 io.spring.javaformat From e44ae080a3696cde9f679b2968d3d848b80ddb70 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 11 Jun 2024 08:48:28 +0200 Subject: [PATCH 567/825] Update yarn dependencies --- start-client/yarn.lock | 1715 ++++++++++++++++++++-------------------- 1 file changed, 860 insertions(+), 855 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index da1fe44136..8df5e413b7 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -20,12 +20,12 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.5.tgz#9eba21699f289c32e63a28aedf82f888dc134b30" - integrity sha512-2qg1mYtJRsOOWF6IUwLP5jI42P8Cc0hQ5TmnjLrik/4DKouO8dFJN80HEz81VmVeUs97yuuf3vQ/9j7Elrcjlg== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.7.tgz#eb2868c1fa384b17ea88d60107577d3e6fd05c4e" + integrity sha512-8dfPprJgV4O14WTx+AQyEA+opgUKPrsIXX/MdL50J1n06EQJ6m1T+CdsJe0qEC0B/Xl85i+Un5KVAxd/PACX9A== dependencies: "@jridgewell/trace-mapping" "^0.3.25" - commander "^4.0.1" + commander "^6.2.0" convert-source-map "^2.0.0" fs-readdir-recursive "^1.1.0" glob "^7.2.0" @@ -35,34 +35,34 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.24.2" + "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" + integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" - integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" + integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.24.5" - "@babel/helpers" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helpers" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -70,70 +70,71 @@ semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" - integrity sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz#27ebab1a1ec21f48ae191a8aaac5b82baf80d9c7" + integrity sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" - integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== +"@babel/generator@^7.24.7", "@babel/generator@^7.7.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" + integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== dependencies: - "@babel/types" "^7.24.5" + "@babel/types" "^7.24.7" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== +"@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== dependencies: - "@babel/types" "^7.22.15" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" + integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" + "@babel/compat-data" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" - integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.24.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b" + integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da" + integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.24.7" regexpu-core "^5.3.1" semver "^6.3.1" @@ -148,181 +149,187 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== +"@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.7" -"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" - integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== +"@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== - dependencies: - "@babel/types" "^7.24.0" + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" -"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" - integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-simple-access" "^7.24.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/helper-validator-identifier" "^7.24.5" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" - integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== - -"@babel/helper-remap-async-to-generator@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" - -"@babel/helper-replace-supers@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" - integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" - integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" - integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-string-parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== - -"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" - integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helper-wrap-function@^7.22.20": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" - integrity sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw== - dependencies: - "@babel/helper-function-name" "^7.23.0" - "@babel/template" "^7.24.0" - "@babel/types" "^7.24.5" - -"@babel/helpers@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" - integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== - dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" - -"@babel/highlight@^7.24.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" - integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.5" +"@babel/helper-member-expression-to-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f" + integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" + integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" + integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== + +"@babel/helper-remap-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7" + integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-wrap-function" "^7.24.7" + +"@babel/helper-replace-supers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765" + integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-optimise-call-expression" "^7.24.7" + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" + integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" + integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== + +"@babel/helper-wrap-function@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" + integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw== + dependencies: + "@babel/helper-function-name" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helpers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" + integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5", "@babel/parser@^7.7.0": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.7", "@babel/parser@^7.7.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" + integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" - integrity sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055" + integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" - integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107" + integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" - integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" + integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" - integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec" + integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-proposal-class-properties@^7.13.0": version "7.18.6" @@ -333,29 +340,29 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.13.15": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz#bab2b9e174a2680f0a80f341f3ec70f809f8bb4b" - integrity sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz#7e2dcfeda4a42596b57c4c9de1f5176bbfc532e3" + integrity sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-decorators" "^7.24.1" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-decorators" "^7.24.7" "@babel/plugin-proposal-do-expressions@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.24.1.tgz#580e97ffb93d537933df3b8d2e6bef67d0beaa0e" - integrity sha512-tVYbJAE3Duz/T0lV5P27aAgpg2vTfUuV0dXN4NNbnoRk7G989IcgjYIA+1pMHUMMLij7Gun42CC15UN5jWm4LA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.24.7.tgz#09ab8037ef28d71578b1734dc8a88fd00887c98a" + integrity sha512-M9pJwhoROof4rc4WzDdMoftv8JrtYfBVurvReacQ8lit+qUd0d71+1zUltb6/zCI7HBW4+KZbtBGmcudXw0GDQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-do-expressions" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-do-expressions" "^7.24.7" "@babel/plugin-proposal-export-default-from@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz#d242019488277c9a5a8035e5b70de54402644b89" - integrity sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz#0b539c46b8ac804f694e338f803c8354c0f788b6" + integrity sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-export-default-from" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-export-default-from" "^7.24.7" "@babel/plugin-proposal-export-namespace-from@^7.12.13": version "7.18.9" @@ -366,21 +373,21 @@ "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-function-bind@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.24.1.tgz#e3e265ec2f1324dbe29b249c35fab58b5c15a684" - integrity sha512-GDz3lXY623E+SMhloR0HDKYfFjLnqYEHjxIHo3SvpJTV3SV89974Y3mADXSYnO1N+UP7bioAFKqpOmsD9aOnuw== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.24.7.tgz#8b4fcef3fd90bd5671a940693683c76ab0984df8" + integrity sha512-cq2mwxcvNAWWL+IiqiSiVhCeqTQs532Ktl3N2FMuW0bQVF/N0W6QNyywO+KkM3Yr/jwYmjeSS+yKQQUh79VOxQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-function-bind" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-function-bind" "^7.24.7" "@babel/plugin-proposal-function-sent@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.24.1.tgz#228c85798b62fc1c1a84c8ab512d46c41885f4bd" - integrity sha512-GxHpB7jATDZWYEuYkR5jv5aiHbwkmbvk3fJP5G2Dvl7va+kewfbYxpnU1BadIHd3kXlLPQj4CKbLKoWxX4nTtA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.24.7.tgz#522a49543a278e1f28eba36e753201f72ae18a11" + integrity sha512-42Pq9d8fV5CrjygcVAA7aAEFpkAJluWWvlO7bvOMDEutxIS44COcFU61V92VBzUZvOkjIoQrPJNUtmY/d9XMgA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-wrap-function" "^7.22.20" - "@babel/plugin-syntax-function-sent" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-wrap-function" "^7.24.7" + "@babel/plugin-syntax-function-sent" "^7.24.7" "@babel/plugin-proposal-json-strings@^7.13.8": version "7.18.6" @@ -424,12 +431,12 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-pipeline-operator@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.24.1.tgz#a8ea2b281b68cdb676270298f32d46da61c22a6b" - integrity sha512-JFqo+VsSosYxzo1PPfrbeoIi0IcAJnjGpDXeVABNl5bH6/Zvn84Kd8utGEA1eT3gLsynyt1+TfQ/opGXtb0Y/A== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.24.7.tgz#a96009e358eb357f88301ab74e4788812a5957fa" + integrity sha512-cJOSXlieT6/Yul8yEkbBRzhyf/J4jeeqUREw8HCf8nxT4DTP5FCdC0EXf+b8+vBt34IMYYvTDiC8uC91KSSLpA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-pipeline-operator" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-pipeline-operator" "^7.24.7" "@babel/plugin-proposal-private-methods@^7.13.0": version "7.18.6" @@ -445,12 +452,12 @@ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-proposal-throw-expressions@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.24.1.tgz#7f08e07de51463fd302860e7928cccdcb4fa1d48" - integrity sha512-wiae/VkKNX1WuM+wXIeAZY1cvbVKJJIf92eA23s2ufpp4w+vOlp+/4T3yfxN6nzN+hIwT15AsdwujAelIqNW+w== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.24.7.tgz#8a386bcb77965d82f5b926508b27919d9ac9450f" + integrity sha512-Rh4WoHyWKgsxvdkEMqDEZtKuGnZw+JwicMCvcZaIjYaQ3fK+a8JZYLhgcac9dKcL47Xqf+SG3MopTx+8BACdrQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-throw-expressions" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-throw-expressions" "^7.24.7" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -480,19 +487,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa" - integrity sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw== +"@babel/plugin-syntax-decorators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz#e4f8a0a8778ccec669611cd5aed1ed8e6e3a6fcf" + integrity sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-do-expressions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.24.1.tgz#8e423c79355797e2dbdac26e03c248be27391795" - integrity sha512-l5ZJA2DB2s/pM3SQzwf1ykWOiBaqN6Eb07EoZ/mH8dUR5RnaWlmPLoav6y4OT8A9Pkl615osBMZOedFbErdOOA== +"@babel/plugin-syntax-do-expressions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.24.7.tgz#c8aa7471fa25286fede4c12a464a49d286de8362" + integrity sha512-lQee+garSbTjCvXdzfjXeSzPd03pyBXALfB2C4bW7SwORrZAs5CDt67toH8MRPuvQFYvWpkXYe07AhHDY3tWfQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -501,12 +508,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz#a92852e694910ae4295e6e51e87b83507ed5e6e8" - integrity sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA== +"@babel/plugin-syntax-export-default-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz#85dae9098933573aae137fb52141dd3ca52ae7ac" + integrity sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -515,33 +522,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-function-bind@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.24.1.tgz#5a3ba1b9ab91286822373fb1dc34b468d8510ea2" - integrity sha512-7K+uzNJ5ZuL6g4Ud/UhbIxghwN2FAj8NBrzEO+eM0g9YddjOv+BD81ar/N7Es5sH+G8z9tnTYcfCu6EaPrkSDw== +"@babel/plugin-syntax-function-bind@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.24.7.tgz#60103187663fb121976d972b23bfb097d9d0234a" + integrity sha512-dqm7VhgJ2sXCEc0WDJV+q8OI1Qzwn4OFbqsHTVtYoc4L7jJYtF6pEQYcbmlMMWBZjw0tJYuXeyiTQVboWIwAKg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-function-sent@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.24.1.tgz#cd3fd5fa9fce0f53d6dcb78999dd7201561c2304" - integrity sha512-aVwkxqagsGCI8vtuyMI+LnZ2SWtGP4+v9T/T88j2MwKRsGYzc9FAaEzsNMu1Htu6SsHPcfwQ7uZ7pYPGrVmG+g== +"@babel/plugin-syntax-function-sent@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.24.7.tgz#4d5e647ca67bee243f58a9a596352dc2920434a6" + integrity sha512-me5EHEx4GXxAE8mnlZaWA+ARIyMSPOXcw6WlqWGIfTg36oeWm4FxR/Djs1DGPbmSIwJqMboiN7gK8eCyzyNK2A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-assertions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" - integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== +"@babel/plugin-syntax-import-assertions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" + integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-attributes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" - integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" + integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -557,12 +564,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.23.3": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" - integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== +"@babel/plugin-syntax-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -606,12 +613,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-pipeline-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.24.1.tgz#149bacade7594288dd9ad373bcbfe2927ea750cc" - integrity sha512-UU7uLj95zh6oMQiREvkTmXAvWy9pJI9p76SFkNsXTesDwQ67YM1UU1Bkx576djA6ZDcPSbzM/MqTJNcYeQ0G2g== +"@babel/plugin-syntax-pipeline-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.24.7.tgz#1558f683508708d0528eaab7e4bf13b6ae793b1f" + integrity sha512-PnW47ro0vPh4Raqabn3FM7opwdKbNQoFJKSNfCj7lmqcQlVMYFcJ6b+rhMyfB/g1SlWRwnodffVzLcee1FDHYQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" @@ -620,12 +627,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-throw-expressions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.24.1.tgz#f8b18a0126cb2991e4f093c6fdab662ef46d7eee" - integrity sha512-o4dN/9/hUAC6RuX1QZDlauBG2nmSmUMk0K7/IOIFxjM8V16FS1JTHHiBWqGkkIjK4myeHucJbBHurqjtWFAdsw== +"@babel/plugin-syntax-throw-expressions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.24.7.tgz#30887b54c478120831bc95881e73ec1984584930" + integrity sha512-b1bdlAmUTy9VQ/g2cnBuJFwd7jeARNW2F65c9Gcn8qyNYGuVy/cYyqpiSL6SVmUAJTDbIYL2FzlZ8nH1qUCBXA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" @@ -635,11 +642,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" - integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" + integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -649,459 +656,459 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" - integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== +"@babel/plugin-transform-arrow-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-async-generator-functions@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" - integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== +"@babel/plugin-transform-async-generator-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz#7330a5c50e05181ca52351b8fd01642000c96cfd" + integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" - integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== +"@babel/plugin-transform-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== dependencies: - "@babel/helper-module-imports" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" -"@babel/plugin-transform-block-scoped-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" - integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== +"@babel/plugin-transform-block-scoped-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoping@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz#89574191397f85661d6f748d4b89ee4d9ee69a2a" - integrity sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw== +"@babel/plugin-transform-block-scoping@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02" + integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-class-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" - integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== +"@babel/plugin-transform-class-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" + integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-class-static-block@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" - integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== +"@babel/plugin-transform-class-static-block@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" + integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.4" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz#05e04a09df49a46348299a0e24bfd7e901129339" - integrity sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-split-export-declaration" "^7.24.5" +"@babel/plugin-transform-classes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz#4ae6ef43a12492134138c1e45913f7c46c41b4bf" + integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" - integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== +"@babel/plugin-transform-computed-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/template" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/template" "^7.24.7" -"@babel/plugin-transform-destructuring@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz#80843ee6a520f7362686d1a97a7b53544ede453c" - integrity sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg== +"@babel/plugin-transform-destructuring@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz#a097f25292defb6e6cc16d6333a4cfc1e3c72d9e" + integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-dotall-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" - integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== +"@babel/plugin-transform-dotall-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-duplicate-keys@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" - integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== +"@babel/plugin-transform-duplicate-keys@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-dynamic-import@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" - integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== +"@babel/plugin-transform-dynamic-import@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" + integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" - integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== +"@babel/plugin-transform-exponentiation-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-export-namespace-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" - integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== +"@babel/plugin-transform-export-namespace-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" + integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" - integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== +"@babel/plugin-transform-for-of@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-function-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" - integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== +"@babel/plugin-transform-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6" + integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-json-strings@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" - integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== +"@babel/plugin-transform-json-strings@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" + integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" - integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== +"@babel/plugin-transform-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c" + integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-logical-assignment-operators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" - integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== +"@babel/plugin-transform-logical-assignment-operators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" - integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== +"@babel/plugin-transform-member-expression-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" + integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-amd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" - integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== +"@babel/plugin-transform-modules-amd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-commonjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" - integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== +"@babel/plugin-transform-modules-commonjs@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz#9fd5f7fdadee9085886b183f1ad13d1ab260f4ab" + integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-modules-systemjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" - integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== +"@babel/plugin-transform-modules-systemjs@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7" + integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw== dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" -"@babel/plugin-transform-modules-umd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" - integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== +"@babel/plugin-transform-modules-umd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== +"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-new-target@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" - integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== +"@babel/plugin-transform-new-target@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" - integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" - integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== +"@babel/plugin-transform-numeric-separator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz#f91bbcb092ff957c54b4091c86bda8372f0b10ef" - integrity sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA== +"@babel/plugin-transform-object-rest-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.5" + "@babel/plugin-transform-parameters" "^7.24.7" -"@babel/plugin-transform-object-super@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" - integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== +"@babel/plugin-transform-object-super@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" -"@babel/plugin-transform-optional-catch-binding@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" - integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== +"@babel/plugin-transform-optional-catch-binding@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.1", "@babel/plugin-transform-optional-chaining@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f" - integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg== +"@babel/plugin-transform-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz#b8f6848a80cf2da98a8a204429bec04756c6d454" + integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" - integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== +"@babel/plugin-transform-parameters@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-methods@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" - integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== +"@babel/plugin-transform-private-methods@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" + integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-property-in-object@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz#f5d1fcad36e30c960134cb479f1ca98a5b06eda5" - integrity sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ== +"@babel/plugin-transform-private-property-in-object@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.5" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" - integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== +"@babel/plugin-transform-property-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" + integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-display-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" - integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== +"@babel/plugin-transform-react-display-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" + integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== +"@babel/plugin-transform-react-jsx-development@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" + integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.24.7" -"@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" - integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== +"@babel/plugin-transform-react-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz#17cd06b75a9f0e2bd076503400e7c4b99beedac4" + integrity sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/types" "^7.23.4" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/plugin-transform-react-pure-annotations@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" - integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== +"@babel/plugin-transform-react-pure-annotations@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" + integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-regenerator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" - integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== +"@babel/plugin-transform-regenerator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" - integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== +"@babel/plugin-transform-reserved-words@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" + integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-runtime@^7.18.5": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f" - integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca" + integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw== dependencies: - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.1" babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" - integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== +"@babel/plugin-transform-shorthand-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" - integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== +"@babel/plugin-transform-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-sticky-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" - integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== +"@babel/plugin-transform-sticky-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-template-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" - integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== +"@babel/plugin-transform-template-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz#703cace5ef74155fb5eecab63cbfc39bdd25fe12" - integrity sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg== +"@babel/plugin-transform-typeof-symbol@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz#f074be466580d47d6e6b27473a840c9f9ca08fb0" + integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-escapes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" - integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== +"@babel/plugin-transform-unicode-escapes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" + integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-property-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" - integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== +"@babel/plugin-transform-unicode-property-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" + integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" - integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== +"@babel/plugin-transform-unicode-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-sets-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" - integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== +"@babel/plugin-transform-unicode-sets-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" + integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.5.tgz#6a9ac90bd5a5a9dae502af60dfc58c190551bbcd" - integrity sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ== - dependencies: - "@babel/compat-data" "^7.24.4" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.7.tgz#ff067b4e30ba4a72f225f12f123173e77b987f37" + integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ== + dependencies: + "@babel/compat-data" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.1" - "@babel/plugin-syntax-import-attributes" "^7.24.1" + "@babel/plugin-syntax-import-assertions" "^7.24.7" + "@babel/plugin-syntax-import-attributes" "^7.24.7" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1113,54 +1120,54 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.1" - "@babel/plugin-transform-async-generator-functions" "^7.24.3" - "@babel/plugin-transform-async-to-generator" "^7.24.1" - "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.5" - "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.4" - "@babel/plugin-transform-classes" "^7.24.5" - "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.5" - "@babel/plugin-transform-dotall-regex" "^7.24.1" - "@babel/plugin-transform-duplicate-keys" "^7.24.1" - "@babel/plugin-transform-dynamic-import" "^7.24.1" - "@babel/plugin-transform-exponentiation-operator" "^7.24.1" - "@babel/plugin-transform-export-namespace-from" "^7.24.1" - "@babel/plugin-transform-for-of" "^7.24.1" - "@babel/plugin-transform-function-name" "^7.24.1" - "@babel/plugin-transform-json-strings" "^7.24.1" - "@babel/plugin-transform-literals" "^7.24.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" - "@babel/plugin-transform-member-expression-literals" "^7.24.1" - "@babel/plugin-transform-modules-amd" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-modules-systemjs" "^7.24.1" - "@babel/plugin-transform-modules-umd" "^7.24.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.24.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" - "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.5" - "@babel/plugin-transform-object-super" "^7.24.1" - "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.5" - "@babel/plugin-transform-parameters" "^7.24.5" - "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.5" - "@babel/plugin-transform-property-literals" "^7.24.1" - "@babel/plugin-transform-regenerator" "^7.24.1" - "@babel/plugin-transform-reserved-words" "^7.24.1" - "@babel/plugin-transform-shorthand-properties" "^7.24.1" - "@babel/plugin-transform-spread" "^7.24.1" - "@babel/plugin-transform-sticky-regex" "^7.24.1" - "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.5" - "@babel/plugin-transform-unicode-escapes" "^7.24.1" - "@babel/plugin-transform-unicode-property-regex" "^7.24.1" - "@babel/plugin-transform-unicode-regex" "^7.24.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" + "@babel/plugin-transform-arrow-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.24.7" + "@babel/plugin-transform-async-to-generator" "^7.24.7" + "@babel/plugin-transform-block-scoped-functions" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.24.7" + "@babel/plugin-transform-class-properties" "^7.24.7" + "@babel/plugin-transform-class-static-block" "^7.24.7" + "@babel/plugin-transform-classes" "^7.24.7" + "@babel/plugin-transform-computed-properties" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.7" + "@babel/plugin-transform-dotall-regex" "^7.24.7" + "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-dynamic-import" "^7.24.7" + "@babel/plugin-transform-exponentiation-operator" "^7.24.7" + "@babel/plugin-transform-export-namespace-from" "^7.24.7" + "@babel/plugin-transform-for-of" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.24.7" + "@babel/plugin-transform-json-strings" "^7.24.7" + "@babel/plugin-transform-literals" "^7.24.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" + "@babel/plugin-transform-member-expression-literals" "^7.24.7" + "@babel/plugin-transform-modules-amd" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.7" + "@babel/plugin-transform-modules-systemjs" "^7.24.7" + "@babel/plugin-transform-modules-umd" "^7.24.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" + "@babel/plugin-transform-new-target" "^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" + "@babel/plugin-transform-numeric-separator" "^7.24.7" + "@babel/plugin-transform-object-rest-spread" "^7.24.7" + "@babel/plugin-transform-object-super" "^7.24.7" + "@babel/plugin-transform-optional-catch-binding" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/plugin-transform-private-methods" "^7.24.7" + "@babel/plugin-transform-private-property-in-object" "^7.24.7" + "@babel/plugin-transform-property-literals" "^7.24.7" + "@babel/plugin-transform-regenerator" "^7.24.7" + "@babel/plugin-transform-reserved-words" "^7.24.7" + "@babel/plugin-transform-shorthand-properties" "^7.24.7" + "@babel/plugin-transform-spread" "^7.24.7" + "@babel/plugin-transform-sticky-regex" "^7.24.7" + "@babel/plugin-transform-template-literals" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.7" + "@babel/plugin-transform-unicode-escapes" "^7.24.7" + "@babel/plugin-transform-unicode-property-regex" "^7.24.7" + "@babel/plugin-transform-unicode-regex" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.4" @@ -1178,16 +1185,16 @@ esutils "^2.0.2" "@babel/preset-react@^7.13.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" - integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" + integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-transform-react-display-name" "^7.24.1" - "@babel/plugin-transform-react-jsx" "^7.23.4" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-transform-react-display-name" "^7.24.7" + "@babel/plugin-transform-react-jsx" "^7.24.7" + "@babel/plugin-transform-react-jsx-development" "^7.24.7" + "@babel/plugin-transform-react-pure-annotations" "^7.24.7" "@babel/regjsgen@^0.8.0": version "0.8.0" @@ -1195,44 +1202,44 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" - integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" + integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.24.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== - dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" +"@babel/template@^7.24.7", "@babel/template@^7.3.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.24.7", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" + integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" - integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" + integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== dependencies: - "@babel/helper-string-parser" "^7.24.1" - "@babel/helper-validator-identifier" "^7.24.5" + "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1253,9 +1260,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + version "4.10.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" + integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -2038,9 +2045,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" @@ -2108,9 +2115,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz#3ae8ab3767d98d0b682cda063c3339e1e86ccfaa" - integrity sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ== + version "4.19.3" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz#e469a13e4186c9e1c0418fb17be8bc8ff1b19a7a" + integrity sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2230,9 +2237,9 @@ "@types/node" "*" "@types/node@*": - version "20.12.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.10.tgz#8f0c3f12b0f075eee1fe20c1afb417e9765bef76" - integrity sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw== + version "20.14.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" + integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== dependencies: undici-types "~5.26.4" @@ -2646,9 +2653,9 @@ ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" - integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== + version "8.16.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" + integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== dependencies: fast-deep-equal "^3.1.3" json-schema-traverse "^1.0.0" @@ -2792,7 +2799,7 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.1.6, array-includes@^3.1.7: +array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -2826,7 +2833,7 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -array.prototype.findlast@^1.2.4: +array.prototype.findlast@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== @@ -2881,14 +2888,14 @@ array.prototype.toreversed@^1.1.2: es-shim-unscopables "^1.0.0" array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" + es-abstract "^1.23.3" + es-errors "^1.3.0" es-shim-unscopables "^1.0.2" arraybuffer.prototype.slice@^1.0.3: @@ -2975,9 +2982,9 @@ aws-sign2@~0.7.0: integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + version "1.13.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.0.tgz#d9b802e9bb9c248d7be5f7f5ef178dc3684e9dcc" + integrity sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g== axe-core@=4.7.0: version "4.7.0" @@ -3230,22 +3237,22 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + version "4.23.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + update-browserslist-db "^1.0.16" bser@2.1.1: version "2.1.1" @@ -3393,10 +3400,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001587: - version "1.0.30001616" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz#4342712750d35f71ebba9fcac65e2cf8870013c3" - integrity sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw== +caniuse-lite@^1.0.30001629: + version "1.0.30001632" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz#964207b7cba5851701afb4c8afaf1448db3884b6" + integrity sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg== caseless@~0.12.0: version "0.12.0" @@ -3456,9 +3463,9 @@ chownr@^2.0.0: integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== ci-info@^2.0.0: version "2.0.0" @@ -3615,10 +3622,10 @@ commander@^2.19.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== commander@^7.0.0, commander@^7.2.0: version "7.2.0" @@ -3742,9 +3749,9 @@ copy-webpack-plugin@^11.0.0: serialize-javascript "^6.0.0" core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.37.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" - integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" + integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== dependencies: browserslist "^4.23.0" @@ -3897,9 +3904,9 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: ms "2.0.0" debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== dependencies: ms "2.1.2" @@ -4180,10 +4187,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.668: - version "1.4.757" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz#45f7c9341b538f8c4b9ca8af9692e0ed1a776a44" - integrity sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw== +electron-to-chromium@^1.4.796: + version "1.4.798" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.798.tgz#6a3fcab2edc1e66e3883466f6b4b8944323c0164" + integrity sha512-by9J2CiM9KPGj9qfp5U4FcPSbXJG7FNzqnYaY4WLzX+v2PHieVGmnsA4dxfpGE3QEC7JofpPZmn7Vn1B9NR2+Q== emittery@^0.10.2: version "0.10.2" @@ -4230,9 +4237,9 @@ end-of-stream@^1.1.0: once "^1.4.0" enhanced-resolve@^5.16.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + version "5.17.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" + integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4323,12 +4330,12 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: +es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.19: version "1.0.19" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== @@ -4349,9 +4356,9 @@ es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.2.tgz#00b423304f2500ac59359cc9b6844951f372d497" - integrity sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA== + version "1.5.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.3.tgz#25969419de9c0b1fbe54279789023e8a9a788412" + integrity sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg== es-object-atoms@^1.0.0: version "1.0.0" @@ -4515,28 +4522,28 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.23.2: - version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + version "7.34.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz#2780a1a35a51aca379d86d29b9a72adc6bfe6b66" + integrity sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw== dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" array.prototype.toreversed "^1.1.2" array.prototype.tosorted "^1.1.3" doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" + es-iterator-helpers "^1.0.19" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.hasown "^1.1.4" + object.values "^1.2.0" prop-types "^15.8.1" resolve "^2.0.0-next.5" semver "^6.3.1" - string.prototype.matchall "^4.0.10" + string.prototype.matchall "^4.0.11" eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" @@ -5033,10 +5040,10 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -5852,9 +5859,9 @@ immediate@~3.0.5: integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== immutable@^4.0.0, immutable@^4.0.0-rc.12: - version "4.3.5" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" - integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== + version "4.3.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" + integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== import-fresh@^2.0.0: version "2.0.0" @@ -7131,9 +7138,9 @@ kleur@^4.0.3: integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== language-tags@^1.0.9: version "1.0.9" @@ -7708,11 +7715,11 @@ micromatch@^3.1.10: to-regex "^3.0.2" micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": @@ -8154,7 +8161,7 @@ object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5, object.entries@^1.1.7: +object.entries@^1.1.5, object.entries@^1.1.7, object.entries@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== @@ -8163,7 +8170,7 @@ object.entries@^1.1.5, object.entries@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" -object.fromentries@^2.0.7: +object.fromentries@^2.0.7, object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -8182,7 +8189,7 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.hasown@^1.1.3: +object.hasown@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== @@ -8198,7 +8205,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.6, object.values@^1.1.7: +object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -8531,10 +8538,10 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -8614,9 +8621,9 @@ postcss-modules-values@^4.0.0: icss-utils "^5.0.0" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" - integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" + integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -9397,18 +9404,18 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.77.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.0.tgz#e736c69aff9fae4a4e6dae60a979eee9c942f321" - integrity sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw== + version "1.77.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.4.tgz#92059c7bfc56b827c56eb116778d157ec017a5cd" + integrity sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" sax@>=0.6.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== scheduler@^0.23.2: version "0.23.2" @@ -9477,11 +9484,9 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== send@0.18.0: version "0.18.0" @@ -9837,9 +9842,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.17" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" - integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== + version "3.0.18" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz#22aa922dcf2f2885a6494a261f2d8b75345d0326" + integrity sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ== spdy-transport@^3.0.0: version "3.0.0" @@ -9988,7 +9993,7 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.matchall@^4.0.10, string.prototype.matchall@^4.0.6: +string.prototype.matchall@^4.0.11, string.prototype.matchall@^4.0.6: version "4.0.11" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== @@ -10243,9 +10248,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.31.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1" - integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== + version "5.31.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.1.tgz#735de3c987dd671e95190e6b98cfe2f07f3cf0d4" + integrity sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10416,9 +10421,9 @@ tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== tsutils@^3.21.0: version "3.21.0" @@ -10693,13 +10698,13 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.13: - version "1.0.15" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz#60ed9f8cba4a728b7ecf7356f641a31e3a691d97" - integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== +update-browserslist-db@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== dependencies: escalade "^3.1.2" - picocolors "^1.0.0" + picocolors "^1.0.1" uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" From 2d90fb3b9ba18ec698074ce5bc0036bfe688fd38 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 11 Jun 2024 19:40:20 +0300 Subject: [PATCH 568/825] Upgrade to Vaadin 24.4.1 See gh-1506 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 43ef8590da..31a9d1f483 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -155,7 +155,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.3.13 + version: 24.4.1 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 650cd43cefc7c11d947d165fc21bfdcb5ad9e8ac Mon Sep 17 00:00:00 2001 From: Zhe Sun Date: Tue, 11 Jun 2024 19:55:25 +0300 Subject: [PATCH 569/825] Remove hilla entry See gh-1507 --- .../hilla/HillaGradleBuildCustomizer.java | 48 ------------ .../hilla/HillaMavenBuildCustomizer.java | 47 ----------- .../HillaProjectGenerationConfiguration.java | 57 -------------- .../dependency/hilla/package-info.java | 20 ----- start-site/src/main/resources/application.yml | 22 ------ ...laProjectGenerationConfigurationTests.java | 78 ------------------- .../dependency/hilla/hilla-maven-profile.xml | 26 ------- 7 files changed, 298 deletions(-) delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaGradleBuildCustomizer.java delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaMavenBuildCustomizer.java delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfiguration.java delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/package-info.java delete mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java delete mode 100644 start-site/src/test/resources/dependency/hilla/hilla-maven-profile.xml diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaGradleBuildCustomizer.java deleted file mode 100644 index 7280f73651..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaGradleBuildCustomizer.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.hilla; - -import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; -import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.metadata.InitializrMetadata; - -/** - * A {@link BuildCustomizer} that registers Hilla's Gradle plugin. - * - * @author Luciano Vernaschi - * @author Stephane Nicoll - */ -class HillaGradleBuildCustomizer implements BuildCustomizer { - - private final String hillaVersion; - - HillaGradleBuildCustomizer(InitializrMetadata metadata, Version platformVersion) { - this.hillaVersion = metadata.getConfiguration() - .getEnv() - .getBoms() - .get("hilla") - .resolve(platformVersion) - .getVersion(); - } - - @Override - public void customize(GradleBuild build) { - build.plugins().add("dev.hilla", (plugin) -> plugin.setVersion(this.hillaVersion)); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaMavenBuildCustomizer.java deleted file mode 100644 index f9ff726fe8..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaMavenBuildCustomizer.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.hilla; - -import io.spring.initializr.generator.buildsystem.maven.MavenBuild; -import io.spring.initializr.generator.spring.build.BuildCustomizer; - -/** - * A {@link BuildCustomizer} that adds a production profile to enable Hilla's production - * mode. - * - * @author Luciano Vernaschi - * @author Stephane Nicoll - */ -class HillaMavenBuildCustomizer implements BuildCustomizer { - - @Override - public void customize(MavenBuild build) { - build.plugins() - .add("dev.hilla", "hilla-maven-plugin", (plugin) -> plugin.version("${hilla.version}") - .execution("frontend", (execution) -> execution.goal("prepare-frontend"))); - build.profiles() - .id("production") - .plugins() - .add("dev.hilla", "hilla-maven-plugin", - (plugin) -> plugin.version("${hilla.version}") - .execution("frontend", - (execution) -> execution.goal("build-frontend") - .phase("compile") - .configuration((configuration) -> configuration.add("productionMode", "true")))); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfiguration.java deleted file mode 100644 index f910ff521f..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfiguration.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.hilla; - -import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; -import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; -import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; -import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; -import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.generator.spring.scm.git.GitIgnoreCustomizer; -import io.spring.initializr.metadata.InitializrMetadata; - -import org.springframework.context.annotation.Bean; - -/** - * Configuration for generation of projects that depend on Hilla. - * - * @author Luciano Vernaschi - * @author Stephane Nicoll - */ -@ProjectGenerationConfiguration -@ConditionalOnRequestedDependency("hilla") -class HillaProjectGenerationConfiguration { - - @Bean - @ConditionalOnBuildSystem(MavenBuildSystem.ID) - HillaMavenBuildCustomizer hillaMavenBuildCustomizer() { - return new HillaMavenBuildCustomizer(); - } - - @Bean - @ConditionalOnBuildSystem(GradleBuildSystem.ID) - HillaGradleBuildCustomizer hillaGradleBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { - return new HillaGradleBuildCustomizer(metadata, description.getPlatformVersion()); - } - - @Bean - GitIgnoreCustomizer hillaGitIgnoreCustomizer() { - return (gitignore) -> gitignore.getGeneral().add("node_modules/", "frontend/generated/"); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/package-info.java deleted file mode 100644 index 342c0856b6..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/package-info.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Extensions for generation of projects that depend on Hilla. - */ -package io.spring.start.site.extension.dependency.hilla; diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 31a9d1f483..4eac340781 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -57,13 +57,6 @@ initializr: version: 8.7.1 - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 9.0.0 - hilla: - groupId: dev.hilla - artifactId: hilla-bom - versionProperty: hilla.version - mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 2.5.5 sentry: groupId: io.sentry artifactId: sentry-bom @@ -341,21 +334,6 @@ initializr: description: Creating CRUD UI with Vaadin - rel: reference href: https://vaadin.com/docs - - name: Hilla - id: hilla - bom: hilla - compatibilityRange: "[3.2.0,3.3.0-M1)" - facets: - - web - groupId: dev.hilla - artifactId: hilla-react-spring-boot-starter - description: An open source framework that integrates a Spring Boot Java backend with a reactive TypeScript frontend. - links: - - rel: guide - href: https://hilla.dev/docs/react/start/quick/#coming-from-spring-initializr - description: Next Steps with Hilla - - rel: reference - href: https://hilla.dev/ - name: Netflix DGS id: netflix-dgs groupId: com.netflix.graphql.dgs diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java deleted file mode 100644 index e28c24445b..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.hilla; - -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.junit.jupiter.api.Test; - -import org.springframework.core.io.ClassPathResource; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link HillaProjectGenerationConfiguration}. - * - * @author Stephane Nicoll - */ -class HillaProjectGenerationConfigurationTests extends AbstractExtensionTests { - - private static final String SPRING_BOOT_VERSION = "3.2.0"; - - @Test - void mavenBuildWithHillaAddProductionProfile() { - ProjectRequest request = createProjectRequest("hilla", "data-jpa"); - request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(mavenPom(request)).hasProfile("production") - .contains(new ClassPathResource("dependency/hilla/hilla-maven-profile.xml")); - } - - @Test - void mavenBuildWithoutHillaDoesNotAddProductionProfile() { - ProjectRequest request = createProjectRequest("data-jpa"); - request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(mavenPom(request)).doesNotContain("hilla"); - } - - @Test - void gradleBuildWithHillaConfigurePlugin() { - ProjectRequest request = createProjectRequest("hilla", "data-jpa"); - request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(gradleBuild(request)).hasPlugin("dev.hilla"); - } - - @Test - void gradleBuildWithHillaConfigureTask() { - ProjectRequest request = createProjectRequest("data-jpa"); - request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(gradleBuild(request)).doesNotContain("hilla"); - } - - @Test - void projectWithHillaCustomizesGitIgnore() { - ProjectRequest request = createProjectRequest("hilla", "data-jpa"); - request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(generateProject(request)).textFile(".gitignore").contains("node_modules/", "frontend/generated/"); - } - - @Test - void projectWithoutHillaDoesNotCustomizeGitIgnore() { - assertThat(generateProject(createProjectRequest("data-jpa"))).textFile(".gitignore") - .doesNotContain("frontend/generated/"); - } - -} diff --git a/start-site/src/test/resources/dependency/hilla/hilla-maven-profile.xml b/start-site/src/test/resources/dependency/hilla/hilla-maven-profile.xml deleted file mode 100644 index 6cc09429e4..0000000000 --- a/start-site/src/test/resources/dependency/hilla/hilla-maven-profile.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - production - - - - dev.hilla - hilla-maven-plugin - ${hilla.version} - - - frontend - compile - - build-frontend - - - true - - - - - - - - \ No newline at end of file From 5acad93b3df0345e35bd86e018dfa4435dc5d016 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 12 Jun 2024 09:19:34 +0200 Subject: [PATCH 570/825] Polish "Remove hilla entry" See gh-1507 --- start-site/src/main/resources/META-INF/spring.factories | 1 - 1 file changed, 1 deletion(-) diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 7a2980f95d..28826f662c 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -13,7 +13,6 @@ io.spring.start.site.extension.dependency.elasticsearch.ElasticsearchProjectGene io.spring.start.site.extension.dependency.flyway.FlywayProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.graalvm.GraalVmProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.graphql.SpringGraphQlProjectGenerationConfiguration,\ -io.spring.start.site.extension.dependency.hilla.HillaProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mariadb.MariaDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mongodb.MongoDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mysql.MysqlProjectGenerationConfiguration,\ From 35ea5ffd615ba8fbd209ede163e252d87e2e3a2c Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 12 Jun 2024 09:38:40 +0200 Subject: [PATCH 571/825] Upgrade to Spring Boot Admin 3.3.2 Closes gh-1508 --- start-site/src/main/resources/application.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4eac340781..70b9f4ee88 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -48,6 +48,8 @@ initializr: mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 3.2.3 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 3.3.2 netflix-dgs: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-platform-dependencies @@ -891,7 +893,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-client description: Required for your application to register with a Codecentric's Spring Boot Admin Server instance. - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -901,7 +903,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-server description: A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints. - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference From 713052e86b335f4080c0b00067884b20ba1ecc63 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:55:06 +0300 Subject: [PATCH 572/825] Update description for Vaadin entry Since Vaadin 24.4, we provide original vaadin and hilla in this unified platform. See gh-1509 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4eac340781..5d73f194c1 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -325,7 +325,7 @@ initializr: - web groupId: com.vaadin artifactId: vaadin-spring-boot-starter - description: A web framework that allows you to write UI in pure Java without getting bogged down in JS, HTML, and CSS. + description: The full-stack web app platform for Spring. Build views in fully in Java with Flow, or in React using Hilla. bom: vaadin compatibilityRange: "[3.2.0,3.4.0-M1)" links: From 4dcb0a201846b779e9f247ff18d16ca2ee79fa43 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 12 Jun 2024 10:00:04 +0200 Subject: [PATCH 573/825] Polish "Update description for Vaadin entry" See gh-1509 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 5d73f194c1..cff9ef5199 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -325,7 +325,7 @@ initializr: - web groupId: com.vaadin artifactId: vaadin-spring-boot-starter - description: The full-stack web app platform for Spring. Build views in fully in Java with Flow, or in React using Hilla. + description: The full-stack web app platform for Spring. Build views fully in Java with Flow, or in React using Hilla. bom: vaadin compatibilityRange: "[3.2.0,3.4.0-M1)" links: From 6cc4e762916e6524dcceb425bb76849618265a57 Mon Sep 17 00:00:00 2001 From: Sanajit Jana Date: Wed, 12 Jun 2024 14:45:18 +0530 Subject: [PATCH 574/825] Ensure that a pointer curser is shown for theme switcher The pointer is already set in the non-mobile version, this also sets the pointer on the mobile version. See gh-1512 --- start-client/src/styles/_main.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/start-client/src/styles/_main.scss b/start-client/src/styles/_main.scss index af24fb6993..85065d29d7 100644 --- a/start-client/src/styles/_main.scss +++ b/start-client/src/styles/_main.scss @@ -196,6 +196,7 @@ body { border: 0; padding: 4px; outline: none; + cursor: pointer; } svg { display: block; From 69ae46dfec89cb834bd152543998e73264f033c4 Mon Sep 17 00:00:00 2001 From: Iwao AVE! Date: Wed, 12 Jun 2024 23:51:33 +0900 Subject: [PATCH 575/825] Update mybatis compatibility range See gh-1511 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f0abdce0c3..822d27332c 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -492,12 +492,12 @@ initializr: description: R2DBC Homepage - name: MyBatis Framework id: mybatis - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.3.0)" description: Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. groupId: org.mybatis.spring.boot artifactId: mybatis-spring-boot-starter mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0)" version: 3.0.3 links: - rel: guide From 4ac5ae50647ef6563bcf8f55b3abb2877bc1b795 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 13 Jun 2024 12:52:56 +0200 Subject: [PATCH 576/825] Polish "Update mybatis compatibility range" See gh-1511 --- start-site/src/main/resources/application.yml | 4 ++-- .../dependency/mybatis/MyBatisTestBuildCustomizerTests.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 822d27332c..a93b002991 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -492,12 +492,12 @@ initializr: description: R2DBC Homepage - name: MyBatis Framework id: mybatis - compatibilityRange: "[3.2.0,3.3.0)" + compatibilityRange: "[3.2.0,3.4.0-M1)" description: Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. groupId: org.mybatis.spring.boot artifactId: mybatis-spring-boot-starter mappings: - - compatibilityRange: "[3.2.0,3.3.0)" + - compatibilityRange: "[3.2.0,3.4.0-M1)" version: 3.0.3 links: - rel: guide diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java index 31e04066a5..c25c843f85 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java @@ -30,7 +30,7 @@ */ class MyBatisTestBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test void mybatisIsAddedWithSecurity() { From b7a18ee3ed4ee25d38ea4a0c7551a525623930bc Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 18 Jun 2024 11:09:39 +0200 Subject: [PATCH 577/825] Upgrade to Spring Cloud Services 4.1.3 Closes gh-1515 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index a93b002991..3e221c50bc 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -117,8 +117,8 @@ initializr: versionProperty: spring-cloud-services.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 4.1.0 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 4.1.3 spring-modulith: groupId: org.springframework.modulith artifactId: spring-modulith-bom @@ -1268,7 +1268,7 @@ initializr: href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-introducing - name: VMware Tanzu Application Service bom: spring-cloud-services - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Config Client (TAS) id: scs-config-client From 02879ee44cff26a676c03638d2c0ec82d10aecd9 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 18 Jun 2024 08:29:53 +0200 Subject: [PATCH 578/825] Upgrade to Solace Spring Cloud 4.1.0 This also marks Solace PubSub+ 3.3.x ready. Closes gh-1513 --- start-site/src/main/resources/application.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3e221c50bc..c843de23c4 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -71,15 +71,15 @@ initializr: artifactId: solace-spring-boot-bom versionProperty: solace-spring-boot.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" + - compatibilityRange: "[3.2.0,3.4.0-M1)" version: 2.0.0 solace-spring-cloud: groupId: com.solace.spring.cloud artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 4.0.0 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 4.1.0 spring-ai: groupId: org.springframework.ai artifactId: spring-ai-bom @@ -806,7 +806,7 @@ initializr: - name: Solace PubSub+ bom: solace-spring-boot id: solace - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" description: Connect to a Solace PubSub+ Advanced Event Broker to publish, subscribe, request/reply and store/replay messages groupId: com.solace.spring.boot artifactId: solace-spring-boot-starter From ce3050eb290cddca4aa057deda37858ec528c6e4 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:34:13 +0300 Subject: [PATCH 579/825] Upgrade to Vaadin 24.4.3 See gh-1516 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c843de23c4..1e87f60162 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -150,7 +150,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.4.1 + version: 24.4.3 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 6d20d72001bfac2f4a3f603c875e030be6df7bdb Mon Sep 17 00:00:00 2001 From: Christopher Chianelli Date: Wed, 19 Jun 2024 12:50:40 -0400 Subject: [PATCH 580/825] Upgrade Timefold Solver to 1.11.0 See gh-1517 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 1e87f60162..e4084d7b50 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -143,7 +143,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 1.10.0 + version: 1.11.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From 4dacbdb62fc9e0693a996238989c505f012c0c87 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 20 Jun 2024 14:07:29 +0200 Subject: [PATCH 581/825] Upgrade to Spring Boot 3.3.1 Closes gh-1518 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 393d60a43b..c9c86e78e2 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.0 + 3.3.1 io.spring.start start-parent From e4f8cde63de94e7f57d1cd54549e1d2fd11f6021 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 24 Jun 2024 08:37:31 +0200 Subject: [PATCH 582/825] Upgrade node dependencies --- start-client/yarn.lock | 276 ++++++++++++++++++++++++++--------------- 1 file changed, 174 insertions(+), 102 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 8df5e413b7..1cf2a984cb 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -1201,7 +1201,7 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== @@ -2115,9 +2115,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.19.3" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz#e469a13e4186c9e1c0418fb17be8bc8ff1b19a7a" - integrity sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg== + version "4.19.5" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" + integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2237,9 +2237,9 @@ "@types/node" "*" "@types/node@*": - version "20.14.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" - integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== + version "20.14.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.8.tgz#45c26a2a5de26c3534a9504530ddb3b27ce031ac" + integrity sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA== dependencies: undici-types "~5.26.4" @@ -2576,10 +2576,10 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" @@ -2587,19 +2587,21 @@ acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" acorn@^6.0.7: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +acorn@^8.0.4, acorn@^8.11.0, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" + integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -2764,12 +2766,12 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== +aria-query@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: - dequal "^2.0.3" + deep-equal "^2.0.5" arr-diff@^4.0.0: version "4.0.0" @@ -2786,7 +2788,7 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-buffer-byte-length@^1.0.1: +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== @@ -2887,7 +2889,7 @@ array.prototype.toreversed@^1.1.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.tosorted@^1.1.3: +array.prototype.tosorted@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== @@ -2986,17 +2988,17 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.0.tgz#d9b802e9bb9c248d7be5f7f5ef178dc3684e9dcc" integrity sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g== -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axe-core@^4.9.1: + version "4.9.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.1.tgz#fcd0f4496dad09e0c899b44f6c4bb7848da912ae" + integrity sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw== -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== +axobject-query@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== dependencies: - dequal "^2.0.3" + deep-equal "^2.0.5" babel-eslint@^10.0.3: version "10.1.0" @@ -3401,9 +3403,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001629: - version "1.0.30001632" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz#964207b7cba5851701afb4c8afaf1448db3884b6" - integrity sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg== + version "1.0.30001636" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78" + integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== caseless@~0.12.0: version "0.12.0" @@ -3947,6 +3949,30 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3978,7 +4004,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -4029,7 +4055,7 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -dequal@^2.0.0, dequal@^2.0.3: +dequal@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== @@ -4188,9 +4214,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.4.796: - version "1.4.798" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.798.tgz#6a3fcab2edc1e66e3883466f6b4b8944323c0164" - integrity sha512-by9J2CiM9KPGj9qfp5U4FcPSbXJG7FNzqnYaY4WLzX+v2PHieVGmnsA4dxfpGE3QEC7JofpPZmn7Vn1B9NR2+Q== + version "1.4.810" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz#7dee01b090b9e048e6db752f7b30921790230654" + integrity sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ== emittery@^0.10.2: version "0.10.2" @@ -4236,7 +4262,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.16.0: +enhanced-resolve@^5.17.0: version "5.17.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== @@ -4271,7 +4297,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== @@ -4335,7 +4361,22 @@ es-errors@^1.2.1, es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.19: +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-iterator-helpers@^1.0.19: version "1.0.19" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== @@ -4356,9 +4397,9 @@ es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.19: safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.5.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.3.tgz#25969419de9c0b1fbe54279789023e8a9a788412" - integrity sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg== + version "1.5.4" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== es-object-atoms@^1.0.0: version "1.0.0" @@ -4488,26 +4529,26 @@ eslint-plugin-jest@^26.5.3: "@typescript-eslint/utils" "^5.10.0" eslint-plugin-jsx-a11y@^6.4.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + version "6.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8" + integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" + aria-query "~5.1.3" + array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" + axe-core "^4.9.1" + axobject-query "~3.1.1" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" + es-iterator-helpers "^1.0.19" + hasown "^2.0.2" jsx-ast-utils "^3.3.5" language-tags "^1.0.9" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.0" eslint-plugin-prettier@^4.0.0: version "4.2.1" @@ -4522,15 +4563,15 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.23.2: - version "7.34.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz#2780a1a35a51aca379d86d29b9a72adc6bfe6b66" - integrity sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw== + version "7.34.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz#9965f27bd1250a787b5d4cfcc765e5a5d58dcb7b" + integrity sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" es-iterator-helpers "^1.0.19" estraverse "^5.3.0" @@ -5301,7 +5342,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -6016,7 +6057,7 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -internal-slot@^1.0.7: +internal-slot@^1.0.4, internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== @@ -6060,7 +6101,15 @@ is-accessor-descriptor@^1.0.1: dependencies: hasown "^2.0.0" -is-array-buffer@^3.0.4: +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== @@ -6132,11 +6181,11 @@ is-ci@^2.0.0: ci-info "^2.0.0" is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + version "2.14.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" + integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-data-descriptor@^1.0.1: version "1.0.1" @@ -6262,7 +6311,7 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.3: +is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== @@ -6341,7 +6390,7 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-set@^2.0.3: +is-set@^2.0.2, is-set@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== @@ -7150,9 +7199,9 @@ language-tags@^1.0.9: language-subtag-registry "^0.3.20" launch-editor@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" - integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== + version "2.8.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.8.0.tgz#7255d90bdba414448e2138faa770a74f28451305" + integrity sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA== dependencies: picocolors "^1.0.0" shell-quote "^1.8.1" @@ -7924,9 +7973,9 @@ mute-stream@0.0.7: integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== nan@^2.13.2: - version "2.19.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0" - integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw== + version "2.20.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" + integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== nanoid@^3.3.7: version "3.3.7" @@ -8135,9 +8184,17 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" @@ -8161,7 +8218,7 @@ object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5, object.entries@^1.1.7, object.entries@^1.1.8: +object.entries@^1.1.5, object.entries@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== @@ -9080,7 +9137,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.5.2: +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== @@ -9404,9 +9461,9 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.77.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.4.tgz#92059c7bfc56b827c56eb116778d157ec017a5cd" - integrity sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw== + version "1.77.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.6.tgz#898845c1348078c2e6d1b64f9ee06b3f8bd489e4" + integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9945,6 +10002,13 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -9993,6 +10057,14 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string.prototype.includes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f" + integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.matchall@^4.0.11, string.prototype.matchall@^4.0.6: version "4.0.11" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" @@ -10773,9 +10845,9 @@ uvu@^0.5.0: sade "^1.7.3" v8-to-istanbul@^9.0.1: - version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -10977,9 +11049,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.91.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" - integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== + version "5.92.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.92.1.tgz#eca5c1725b9e189cffbd86e8b6c3c7400efc5788" + integrity sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" @@ -10987,10 +11059,10 @@ webpack@^5.73.0: "@webassemblyjs/wasm-edit" "^1.12.1" "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.9.0" + acorn-import-attributes "^1.9.5" browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.16.0" + enhanced-resolve "^5.17.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -11081,7 +11153,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== @@ -11330,14 +11402,14 @@ write@1.0.3: mkdirp "^0.5.1" ws@^7.3.1: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== ws@^8.13.0: - version "8.17.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" - integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== xhr@^2.0.1: version "2.6.0" From 9447e839964dab711d52b74a21c1cbf500f5aa0c Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Fri, 21 Jun 2024 21:00:50 +0200 Subject: [PATCH 583/825] Upgrade to Spring Modulith 1.1.6 and 1.2.1 See gh-1520 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e4084d7b50..6c270ec600 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -125,9 +125,9 @@ initializr: versionProperty: spring-modulith.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 1.1.5 + version: 1.1.6 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 1.2.0 + version: 1.2.1 spring-shell: groupId: org.springframework.shell artifactId: spring-shell-dependencies From 327735a63b0fc5aa0ecde5c8f965872d7d967a2a Mon Sep 17 00:00:00 2001 From: Arvind Krishnakumar <61501885+arvindkrishnakumar-okta@users.noreply.github.com> Date: Fri, 21 Jun 2024 12:25:10 -0500 Subject: [PATCH 584/825] Upgrade to Okta Spring Boot 3.0.7 See gh-1519 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 6c270ec600..835f298a86 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -425,8 +425,8 @@ initializr: groupId: com.okta.spring artifactId: okta-spring-boot-starter mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 3.0.6 + - compatibilityRange: "[3.2.0,3.3.0)" + version: 3.0.7 links: - rel: guide href: https://github.com/okta/samples-java-spring/tree/master/okta-hosted-login From 466db9ec9f8a59450d39a028ad8eb53e4b0892ac Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 24 Jun 2024 08:52:43 +0200 Subject: [PATCH 585/825] Polish "Upgrade to Okta Spring Boot 3.0.7" See gh-1519 --- start-site/src/main/resources/application.yml | 4 ++-- .../dependency/okta/OktaHelpDocumentCustomizerTests.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 835f298a86..ce0404b970 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -420,12 +420,12 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap - name: Okta id: okta - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" description: Okta specific configuration for Spring Security/Spring Boot OAuth2 features. Enable your Spring Boot application to work with Okta via OAuth 2.0/OIDC. groupId: com.okta.spring artifactId: okta-spring-boot-starter mappings: - - compatibilityRange: "[3.2.0,3.3.0)" + - compatibilityRange: "[3.2.0,3.4.0-M1)" version: 3.0.7 links: - rel: guide diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java index 5fe3cdec20..921908539b 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java @@ -29,7 +29,7 @@ */ class OktaHelpDocumentCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test void oktaSectionWithOktaDependencyIsPresent() { From 9ea618421e0d1217a85fd164252f28e28f19fbd4 Mon Sep 17 00:00:00 2001 From: Gerrit Meier Date: Mon, 24 Jun 2024 09:22:29 +0200 Subject: [PATCH 586/825] Fix typo in Neo4j Vector database The product is spelled with a lower-case j. See gh-1523 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ce0404b970..f5de5cf7fd 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1463,7 +1463,7 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/clients/mistralai-chat.html - - name: Neo4J Vector Database + - name: Neo4j Vector Database id: spring-ai-vectordb-neo4j group-id: org.springframework.ai artifact-id: spring-ai-neo4j-store-spring-boot-starter From 94eba9281f1a1b9139f83fd8eb17aed254b13d72 Mon Sep 17 00:00:00 2001 From: Sanajit Jana Date: Mon, 24 Jun 2024 12:24:42 +0530 Subject: [PATCH 587/825] Adapt history dialog to dark theme See gh-1522 --- start-client/src/styles/_dark.scss | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/start-client/src/styles/_dark.scss b/start-client/src/styles/_dark.scss index 58a0127dba..3414d8fbcb 100644 --- a/start-client/src/styles/_dark.scss +++ b/start-client/src/styles/_dark.scss @@ -396,4 +396,23 @@ body.dark { box-shadow: inset 0 0 0 2px $dark-color; background: $dark-background; } + + .modal-share .modal-header { + background: $dark-background; + border-bottom: 1px solid #4a5053; + } + .modal-content { + background: $dark-background; + } + .modal-content .list a.item { + background: $dark-background-secondary; + color: white; + &:hover { + background: lighten($dark-background-secondary, 2); + } + } + .modal-action { + background: $dark-background; + border-top: 1px solid #4a5053; + } } From 8079e0026c22a8dd6fa5926547817393dd25063e Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 24 Jun 2024 13:41:06 +0200 Subject: [PATCH 588/825] Polish "Adapt history dialog to dark theme" See gh-1522 --- start-client/src/styles/_dark.scss | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/start-client/src/styles/_dark.scss b/start-client/src/styles/_dark.scss index 3414d8fbcb..819696c4b5 100644 --- a/start-client/src/styles/_dark.scss +++ b/start-client/src/styles/_dark.scss @@ -399,20 +399,23 @@ body.dark { .modal-share .modal-header { background: $dark-background; - border-bottom: 1px solid #4a5053; + border-bottom: 1px solid $dark-border; + } + .modal-history-container { + border: 1px solid $dark-border; } .modal-content { background: $dark-background; } .modal-content .list a.item { background: $dark-background-secondary; - color: white; + color: $dark-color; &:hover { background: lighten($dark-background-secondary, 2); } } .modal-action { background: $dark-background; - border-top: 1px solid #4a5053; + border-top: 1px solid $dark-border; } } From 2ed09a2ab1846774dd93ed8c2dfea0c1e58c0bd3 Mon Sep 17 00:00:00 2001 From: Sanajit Jana Date: Tue, 25 Jun 2024 14:00:34 +0530 Subject: [PATCH 589/825] Fix history icon hover and transition on dark theme --- start-client/src/styles/_dark.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/start-client/src/styles/_dark.scss b/start-client/src/styles/_dark.scss index 819696c4b5..6b00b3cfb0 100644 --- a/start-client/src/styles/_dark.scss +++ b/start-client/src/styles/_dark.scss @@ -18,6 +18,10 @@ body.dark { #side-left .navigation-item { color: white; + transition: all 0.15s; + &:hover { + opacity: 0.7; + } } #side-right .side-container { From 23a0f2e97324022570dbb3e4502c8b64a96c58fc Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 26 Jun 2024 09:40:54 +0200 Subject: [PATCH 590/825] Add MongoDB Atlas vector database for Spring AI Closes gh-1525 --- start-site/src/main/resources/application.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f5de5cf7fd..9a16bb7434 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1463,6 +1463,16 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/clients/mistralai-chat.html + - name: MongoDB Atlas Vector Database + id: spring-ai-vectordb-mongodb-atlas + group-id: org.springframework.ai + artifact-id: spring-ai-mongodb-atlas-store-spring-boot-starter + description: Spring AI vector database support for MongoDB Atlas. Is is a fully managed cloud database service that provides an easy way to deploy, operate, and scale a MongoDB database in the cloud. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/mongodb.html - name: Neo4j Vector Database id: spring-ai-vectordb-neo4j group-id: org.springframework.ai From d249c70be9ad7909709423ae7355cebb3f13ff88 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Wed, 26 Jun 2024 11:50:22 +0100 Subject: [PATCH 591/825] Upgrade to Spring Shell 3.2.6 and 3.3.1 See gh-1526 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9a16bb7434..8e048e6814 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -134,9 +134,9 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 3.2.5 + version: 3.2.6 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.3.0 + version: 3.3.1 timefold-solver: groupId: ai.timefold.solver artifactId: timefold-solver-bom From be3e35a0cdcf7a27125c5448665b7619f35614df Mon Sep 17 00:00:00 2001 From: Diego Marquez Date: Fri, 28 Jun 2024 21:01:36 -0400 Subject: [PATCH 592/825] Update spring-cloud-gcp to 5.4.3 See gh-1527 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8e048e6814..aed56aa349 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -110,7 +110,7 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 5.4.1 + version: 5.4.3 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From d9bc915d07535c63541bdafd706eaa81ab9ea384 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 2 Jul 2024 22:08:56 +0200 Subject: [PATCH 593/825] Automatically add Spring Modulith event externalization dependency If a message broker *and* Spring Modulith are declared as project dependencies, the event externalization of Spring Modulith for configured broker are now declared automatically as well. Also, the Spring Modulith Events API dependency is declared in compile scope to allow event types to be marked for externalization. See gh-1528 --- .../SpringModulithBuildCustomizer.java | 30 +++++++++++++++++++ .../SpringModulithBuildCustomizerTests.java | 18 +++++++++++ 2 files changed, 48 insertions(+) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java index a979040ff7..f01b1a44f9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java @@ -41,6 +41,8 @@ class SpringModulithBuildCustomizer implements BuildCustomizer { private static final Collection PERSISTENCE = List.of("jdbc", "jpa", "mongodb"); + private static final Collection BROKERS = List.of("activemq", "amqp", "artemis", "kafka"); + @Override public void customize(Build build) { DependencyContainer dependencies = build.dependencies(); @@ -52,6 +54,9 @@ public void customize(Build build) { modulithDependency("observability").scope(DependencyScope.RUNTIME)); } addEventPublicationRegistryBackend(build); + if (addEventExternalizationDependency(build)) { + dependencies.add("modulith-events-api", modulithDependency("events-api")); + } dependencies.add("modulith-starter-test", modulithDependency("starter-test").scope(DependencyScope.TEST_COMPILE)); } @@ -75,4 +80,29 @@ private Builder modulithDependency(String name) { return Dependency.withCoordinates("org.springframework.modulith", "spring-modulith-" + name); } + private boolean addEventExternalizationDependency(Build build) { + DependencyContainer dependencies = build.dependencies(); + return BROKERS.stream() + .filter(dependencies::has) + .map(this::getModulithBrokerKey) + .peek((it) -> dependencies.add("modulith-events-" + it, + modulithDependency("events-" + it).scope(DependencyScope.RUNTIME))) + .findAny() + .isPresent(); + } + + private String getModulithBrokerKey(String broker) { + + switch (broker) { + case "kafka": + case "amqp": + return broker; + case "artemis": + case "activemq": + return "jms"; + default: + throw new IllegalArgumentException("Unsupported broker!"); + } + } + } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java index 957b56547b..81ac376dfb 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java @@ -74,6 +74,24 @@ void presenceOfSpringDataModuleAddsModuleEventStarter(String store) { assertThat(build.dependencies().ids()).doesNotContain("modulith-starter-core"); } + @ParameterizedTest + @ValueSource(strings = { "amqp", "kafka" }) + void addsExternalizationDependency(String broker) { + Build build = createBuild("modulith", broker); + this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith-events-" + broker); + assertThat(build.dependencies().ids()).contains("modulith-events-api"); + } + + @ParameterizedTest + @ValueSource(strings = { "activemq", "artemis" }) + void addsJmsExternalizationDependency(String broker) { + Build build = createBuild("modulith", broker); + this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith-events-jms"); + assertThat(build.dependencies().ids()).contains("modulith-events-api"); + } + private Build createBuild(String... dependencies) { InitializrMetadata metadata = getMetadata(); MavenBuild build = new MavenBuild(new MetadataBuildItemResolver(metadata, getDefaultPlatformVersion(metadata))); From bc87b20e4ee1319797233545a02d67eb1f3964de Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 3 Jul 2024 08:30:47 +0200 Subject: [PATCH 594/825] Polish "Automatically add Spring Modulith event externalization dependency" See gh-1528 --- .../SpringModulithBuildCustomizer.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java index f01b1a44f9..91604af4cd 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java @@ -92,17 +92,11 @@ private boolean addEventExternalizationDependency(Build build) { } private String getModulithBrokerKey(String broker) { - - switch (broker) { - case "kafka": - case "amqp": - return broker; - case "artemis": - case "activemq": - return "jms"; - default: - throw new IllegalArgumentException("Unsupported broker!"); - } + return switch (broker) { + case "kafka", "amqp" -> broker; + case "artemis", "activemq" -> "jms"; + default -> throw new IllegalArgumentException("Unsupported broker!"); + }; } } From a18bb0edc2a16ca90b52f103e666f7fb234878ef Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 8 Jul 2024 16:31:23 +0300 Subject: [PATCH 595/825] Upgrade to Vaadin 24.4.5 See gh-1530 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index aed56aa349..ea1268ba9c 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -150,7 +150,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.4.3 + version: 24.4.5 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From baa8f80a2d024780ca307181d20b2977bdf693fa Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 9 Jul 2024 14:47:45 +0300 Subject: [PATCH 596/825] Upgrade to Vaadin 24.4.6 See gh-1531 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ea1268ba9c..2df8166ce8 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -150,7 +150,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.4.5 + version: 24.4.6 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 11d49fde05438498dbaf7eeebaf0617a4684bf09 Mon Sep 17 00:00:00 2001 From: Fred Date: Tue, 9 Jul 2024 13:06:28 -0300 Subject: [PATCH 597/825] Update Timefold solver version to 1.12.0 See gh-1532 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2df8166ce8..2855538b66 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -143,7 +143,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 1.11.0 + version: 1.12.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From 6816410dabe7c2bbfac3227051bf9bc19ce0d966 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 11 Jul 2024 15:55:37 +0100 Subject: [PATCH 598/825] Upgrade to Spring Cloud Azure 5.14.0 Closes gh-1535 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2855538b66..9721274649 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -102,7 +102,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 5.13.0 + version: 5.14.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From 9b93f1e13bd4e689e35bcaca35d5fb025c38e364 Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Fri, 12 Jul 2024 20:42:37 +0200 Subject: [PATCH 599/825] Upgrade to Spring Cloud 2023.0.3 See gh-1536 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9721274649..fa410ea97a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -95,7 +95,7 @@ initializr: order: 50 mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 2023.0.2 + version: 2023.0.3 spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies From 70afa6b90f7629688a84b6c97a207e09f0bb02cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Carrasco=20Mo=C3=B1ino?= Date: Mon, 22 Jul 2024 19:59:37 +0200 Subject: [PATCH 600/825] Upgrade to Vaadin 24.4.7 See gh-1538 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index fa410ea97a..0de685a1e3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -150,7 +150,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.4.6 + version: 24.4.7 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 0508a9e1f008005ed837e80e38c857315751d3bc Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Sat, 27 Jul 2024 23:00:30 +0700 Subject: [PATCH 601/825] Update reference links in HELP.md See gh-1541 --- ...adleBuildSystemHelpDocumentCustomizer.java | 24 +++++++++++++++---- ...avenBuildSystemHelpDocumentCustomizer.java | 16 +++++++++++-- .../GraalVmHelpDocumentCustomizer.java | 20 ++++++++++++---- .../ObservabilityHelpDocumentCustomizer.java | 17 ++++++++++--- .../TestContainersHelpDocumentCustomizer.java | 20 ++++++++++++---- ...uildSystemHelpDocumentCustomizerTests.java | 4 ++-- ...uildSystemHelpDocumentCustomizerTests.java | 6 ++--- .../GraalVmHelpDocumentCustomizerTests.java | 11 +++++++++ 8 files changed, 95 insertions(+), 23 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java index 35052ee14b..5134c12c68 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java @@ -20,6 +20,8 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds reference links for Gradle. @@ -29,6 +31,10 @@ */ class GradleBuildSystemHelpDocumentCustomizer implements HelpDocumentCustomizer { + private static final String SPRING_BOOT_DOCS_URL = "https://docs.spring.io/spring-boot"; + + private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); + private final Version springBootVersion; GradleBuildSystemHelpDocumentCustomizer(ProjectDescription description) { @@ -42,14 +48,22 @@ public void customize(HelpDocument document) { "Gradle Build Scans – insights for your project's build"); document.gettingStarted().addReferenceDocLink("https://docs.gradle.org", "Official Gradle documentation"); document.gettingStarted() - .addReferenceDocLink( - String.format("https://docs.spring.io/spring-boot/docs/%s/gradle-plugin/reference/html/", - this.springBootVersion), - "Spring Boot Gradle Plugin Reference Guide"); + .addReferenceDocLink(generateReferenceGuideUrl(), "Spring Boot Gradle Plugin Reference Guide"); document.gettingStarted() .addReferenceDocLink(String.format( - "https://docs.spring.io/spring-boot/docs/%s/gradle-plugin/reference/html/#build-image", + generateReferenceGuideUrl() + (shouldChangeUrl() ? "/packaging-oci-image.html" : "#build-image"), this.springBootVersion), "Create an OCI image"); } + private String generateReferenceGuideUrl() { + String baseUrlFormat = SPRING_BOOT_DOCS_URL + + (shouldChangeUrl() ? "/%s/gradle-plugin" : "/%s/gradle-plugin/reference/html/"); + return String.format(baseUrlFormat, this.springBootVersion); + } + + private boolean shouldChangeUrl() { + + return this.SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion); + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java index 3d8ef23487..1333d78b6f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java @@ -20,6 +20,8 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds reference links for Apache Maven. @@ -29,6 +31,10 @@ */ class MavenBuildSystemHelpDocumentCustomizer implements HelpDocumentCustomizer { + private static final String SPRING_BOOT_DOCS_URL = "https://docs.spring.io/spring-boot"; + + private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); + private final Version springBootVersion; MavenBuildSystemHelpDocumentCustomizer(ProjectDescription description) { @@ -41,13 +47,19 @@ public void customize(HelpDocument document) { .addReferenceDocLink("https://maven.apache.org/guides/index.html", "Official Apache Maven documentation"); String referenceGuideUrl = generateReferenceGuideUrl(); document.gettingStarted().addReferenceDocLink(referenceGuideUrl, "Spring Boot Maven Plugin Reference Guide"); - String buildImageSection = referenceGuideUrl + "#build-image"; + String buildImageSection = referenceGuideUrl + (shouldChangeUrl() ? "/build-image.html" : "#build-image"); document.gettingStarted().addReferenceDocLink(buildImageSection, "Create an OCI image"); } private String generateReferenceGuideUrl() { - String baseUrlFormat = "https://docs.spring.io/spring-boot/docs/%s/maven-plugin/reference/html/"; + String baseUrlFormat = SPRING_BOOT_DOCS_URL + + (shouldChangeUrl() ? "/%s/maven-plugin" : "/docs/%s/maven-plugin/reference/html/"); return String.format(baseUrlFormat, this.springBootVersion); } + private boolean shouldChangeUrl() { + + return this.SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion); + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java index 685edb169b..363f54b647 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java @@ -28,6 +28,8 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; @@ -38,6 +40,8 @@ */ class GraalVmHelpDocumentCustomizer implements HelpDocumentCustomizer { + private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); + private final InitializrMetadata metadata; private final ProjectDescription description; @@ -56,13 +60,16 @@ class GraalVmHelpDocumentCustomizer implements HelpDocumentCustomizer { @Override public void customize(HelpDocument document) { document.gettingStarted() - .addReferenceDocLink(String.format( - "https://docs.spring.io/spring-boot/docs/%s/reference/html/native-image.html#native-image", + .addReferenceDocLink(String.format(shouldChangeUrl() + ? "https://docs.spring.io/spring-boot/%s/reference/packaging/native-image/introducing-graalvm-native-images.html" + : "https://docs.spring.io/spring-boot/docs/%s/reference/html/native-image.html#native-image", this.platformVersion), "GraalVM Native Image Support"); boolean mavenBuild = this.build instanceof MavenBuild; boolean gradleBuild = this.build instanceof GradleBuild; - String url = String.format("https://docs.spring.io/spring-boot/docs/%s/%s/reference/htmlsingle/#aot", - this.platformVersion, (mavenBuild) ? "maven-plugin" : "gradle-plugin"); + String url = shouldChangeUrl() + ? String.format("https://docs.spring.io/spring-boot/%s/how-to/aot.html", this.platformVersion) + : String.format("https://docs.spring.io/spring-boot/docs/%s/%s/reference/htmlsingle/#aot", + this.platformVersion, (mavenBuild) ? "maven-plugin" : "gradle-plugin"); document.gettingStarted().addAdditionalLink(url, "Configure AOT settings in Build Plugin"); Map model = new HashMap<>(); @@ -98,4 +105,9 @@ private Stream buildDependencies() { .filter(Objects::nonNull); } + private boolean shouldChangeUrl() { + + return this.SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion); + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java index a14175982a..a5af92e770 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java @@ -21,6 +21,8 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; /** * {@link HelpDocumentCustomizer} implementation for Observability. @@ -29,6 +31,8 @@ */ public class ObservabilityHelpDocumentCustomizer implements HelpDocumentCustomizer { + private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); + private final Version platformVersion; private final Build build; @@ -42,13 +46,20 @@ public ObservabilityHelpDocumentCustomizer(ProjectDescription description, Build public void customize(HelpDocument document) { if (this.build.dependencies().has("distributed-tracing")) { document.gettingStarted() - .addReferenceDocLink("https://micrometer.io/docs/tracing", "Distributed Tracing Reference Guide"); + .addReferenceDocLink("https://docs.micrometer.io/tracing/reference/index.html", + "Distributed Tracing Reference Guide"); document.gettingStarted() - .addReferenceDocLink(String.format( - "https://docs.spring.io/spring-boot/docs/%s/reference/html/actuator.html#actuator.micrometer-tracing.getting-started", + .addReferenceDocLink(String.format(shouldChangeUrl() + ? "https://docs.spring.io/spring-boot/%s/reference/actuator/tracing.html" + : "https://docs.spring.io/spring-boot/docs/%s/reference/html/actuator.html#actuator.micrometer-tracing.getting-started", this.platformVersion), "Getting Started with Distributed Tracing"); } } + private boolean shouldChangeUrl() { + + return this.SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion); + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java index 91f3422424..41e3d689ce 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java @@ -23,6 +23,8 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.container.DockerService; import io.spring.start.site.container.ServiceConnections; import io.spring.start.site.container.ServiceConnections.ServiceConnection; @@ -35,6 +37,8 @@ */ class TestContainersHelpDocumentCustomizer implements HelpDocumentCustomizer { + private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); + private final ProjectDescription description; private final ServiceConnections serviceConnections; @@ -46,7 +50,9 @@ class TestContainersHelpDocumentCustomizer implements HelpDocumentCustomizer { @Override public void customize(HelpDocument document) { - String referenceDocUrl = "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers" + String referenceDocUrl = (shouldChangeUrl() + ? "https://docs.spring.io/spring-boot/%s/reference/testing/testcontainers.html#testing.testcontainers" + : "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers") .formatted(this.description.getPlatformVersion()); document.gettingStarted().addReferenceDocLink(referenceDocUrl, "Spring Boot Testcontainers support"); @@ -55,10 +61,16 @@ public void customize(HelpDocument document) { .map(ServiceConnection::dockerService) .toList(); model.put("services", dockerServices); - model.put("testcontainersAtDevelopmentTimeLink", - "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers.at-development-time" - .formatted(this.description.getPlatformVersion())); + model.put("testcontainersAtDevelopmentTimeLink", (shouldChangeUrl() + ? "https://docs.spring.io/spring-boot/%s/reference/features/dev-services.html#features.dev-services.testcontainers" + : "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testcontainers") + .formatted(this.description.getPlatformVersion())); document.addSection("testcontainers", model); } + private boolean shouldChangeUrl() { + + return this.SPRING_BOOT_3_3_0_OR_LATER.match(this.description.getPlatformVersion()); + } + } diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java index cefd302996..74da64eb4d 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java @@ -38,8 +38,8 @@ void linksAddedToHelpDocumentForGradleBuild() { assertHelpDocument("gradle-build", SPRING_BOOT_VERSION).contains( "* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/gradle-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.3.0/gradle-plugin/reference/html/#build-image)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.0/gradle-plugin)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/3.3.0/gradle-plugin/packaging-oci-image.html)"); } @Test diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java index 56a17532e5..e4b43e8755 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java @@ -37,15 +37,15 @@ class MavenBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests void linksAddedToHelpDocumentForMavenBuild() { assertHelpDocument("maven-build", SPRING_BOOT_VERSION).contains( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/maven-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.3.0/maven-plugin/reference/html/#build-image)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.0/maven-plugin)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/3.3.0/maven-plugin/build-image.html)"); } @Test void linksNotAddedToHelpDocumentForGradleBuild() { assertHelpDocument("gradle-build", SPRING_BOOT_VERSION).doesNotContain( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/maven-plugin/)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.0/maven-plugin/)"); } private ListAssert assertHelpDocument(String type, String version) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java index 78961c3b53..b6c4b94200 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java @@ -45,6 +45,17 @@ class GraalVmHelpDocumentCustomizerTests extends AbstractExtensionTests { @Autowired private MustacheTemplateRenderer templateRenderer; + @Test + void mavenBuildAndGradleAddLinkToMavenAotPlugin() { + MutableProjectDescription description = new MutableProjectDescription(); + description.setPlatformVersion(Version.parse("3.3.0")); + HelpDocument document = customize(description, new MavenBuild()); + assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { + assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); + assertThat(link.getHref()).isEqualTo("https://docs.spring.io/spring-boot/3.3.0/how-to/aot.html"); + }); + } + @Test void mavenBuildAddLinkToMavenAotPlugin() { MutableProjectDescription description = new MutableProjectDescription(); From 880c59dfc0ceffebdef56dfbf7e4019e2b952cb8 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 29 Jul 2024 09:29:30 +0200 Subject: [PATCH 602/825] Polish "Update reference links in HELP.md" See gh-1541 --- ...adleBuildSystemHelpDocumentCustomizer.java | 19 +++--- ...avenBuildSystemHelpDocumentCustomizer.java | 14 ++-- .../GraalVmHelpDocumentCustomizer.java | 9 +-- .../ObservabilityHelpDocumentCustomizer.java | 7 +- .../TestContainersHelpDocumentCustomizer.java | 15 ++--- ...uildSystemHelpDocumentCustomizerTests.java | 15 ++++- ...uildSystemHelpDocumentCustomizerTests.java | 15 ++++- .../GraalVmHelpDocumentCustomizerTests.java | 25 ++++++-- ...ervabilityHelpDocumentCustomizerTests.java | 64 +++++++++++++++++++ ...rsProjectGenerationConfigurationTests.java | 14 +++- 10 files changed, 141 insertions(+), 56 deletions(-) create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java index 5134c12c68..b645a5cb97 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java @@ -50,20 +50,17 @@ public void customize(HelpDocument document) { document.gettingStarted() .addReferenceDocLink(generateReferenceGuideUrl(), "Spring Boot Gradle Plugin Reference Guide"); document.gettingStarted() - .addReferenceDocLink(String.format( - generateReferenceGuideUrl() + (shouldChangeUrl() ? "/packaging-oci-image.html" : "#build-image"), - this.springBootVersion), "Create an OCI image"); + .addReferenceDocLink( + String + .format(generateReferenceGuideUrl() + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) + ? "/packaging-oci-image.html" : "#build-image"), this.springBootVersion), + "Create an OCI image"); } private String generateReferenceGuideUrl() { - String baseUrlFormat = SPRING_BOOT_DOCS_URL - + (shouldChangeUrl() ? "/%s/gradle-plugin" : "/%s/gradle-plugin/reference/html/"); - return String.format(baseUrlFormat, this.springBootVersion); - } - - private boolean shouldChangeUrl() { - - return this.SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion); + String baseUrlFormat = SPRING_BOOT_DOCS_URL + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) + ? "/%s/gradle-plugin" : "/docs/%s/gradle-plugin/reference/html/"); + return baseUrlFormat.formatted(this.springBootVersion); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java index 1333d78b6f..e4fe3d8d71 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java @@ -47,19 +47,15 @@ public void customize(HelpDocument document) { .addReferenceDocLink("https://maven.apache.org/guides/index.html", "Official Apache Maven documentation"); String referenceGuideUrl = generateReferenceGuideUrl(); document.gettingStarted().addReferenceDocLink(referenceGuideUrl, "Spring Boot Maven Plugin Reference Guide"); - String buildImageSection = referenceGuideUrl + (shouldChangeUrl() ? "/build-image.html" : "#build-image"); + String buildImageSection = referenceGuideUrl + + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) ? "/build-image.html" : "#build-image"); document.gettingStarted().addReferenceDocLink(buildImageSection, "Create an OCI image"); } private String generateReferenceGuideUrl() { - String baseUrlFormat = SPRING_BOOT_DOCS_URL - + (shouldChangeUrl() ? "/%s/maven-plugin" : "/docs/%s/maven-plugin/reference/html/"); - return String.format(baseUrlFormat, this.springBootVersion); - } - - private boolean shouldChangeUrl() { - - return this.SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion); + String baseUrlFormat = SPRING_BOOT_DOCS_URL + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) + ? "/%s/maven-plugin" : "/docs/%s/maven-plugin/reference/html/"); + return baseUrlFormat.formatted(this.springBootVersion); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java index 363f54b647..9a962a914f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java @@ -60,13 +60,13 @@ class GraalVmHelpDocumentCustomizer implements HelpDocumentCustomizer { @Override public void customize(HelpDocument document) { document.gettingStarted() - .addReferenceDocLink(String.format(shouldChangeUrl() + .addReferenceDocLink(String.format(SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion) ? "https://docs.spring.io/spring-boot/%s/reference/packaging/native-image/introducing-graalvm-native-images.html" : "https://docs.spring.io/spring-boot/docs/%s/reference/html/native-image.html#native-image", this.platformVersion), "GraalVM Native Image Support"); boolean mavenBuild = this.build instanceof MavenBuild; boolean gradleBuild = this.build instanceof GradleBuild; - String url = shouldChangeUrl() + String url = SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion) ? String.format("https://docs.spring.io/spring-boot/%s/how-to/aot.html", this.platformVersion) : String.format("https://docs.spring.io/spring-boot/docs/%s/%s/reference/htmlsingle/#aot", this.platformVersion, (mavenBuild) ? "maven-plugin" : "gradle-plugin"); @@ -105,9 +105,4 @@ private Stream buildDependencies() { .filter(Objects::nonNull); } - private boolean shouldChangeUrl() { - - return this.SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion); - } - } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java index a5af92e770..0b82d7e30b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java @@ -49,7 +49,7 @@ public void customize(HelpDocument document) { .addReferenceDocLink("https://docs.micrometer.io/tracing/reference/index.html", "Distributed Tracing Reference Guide"); document.gettingStarted() - .addReferenceDocLink(String.format(shouldChangeUrl() + .addReferenceDocLink(String.format(SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion) ? "https://docs.spring.io/spring-boot/%s/reference/actuator/tracing.html" : "https://docs.spring.io/spring-boot/docs/%s/reference/html/actuator.html#actuator.micrometer-tracing.getting-started", this.platformVersion), "Getting Started with Distributed Tracing"); @@ -57,9 +57,4 @@ public void customize(HelpDocument document) { } } - private boolean shouldChangeUrl() { - - return this.SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion); - } - } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java index 41e3d689ce..cbe847d9f0 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java @@ -50,27 +50,22 @@ class TestContainersHelpDocumentCustomizer implements HelpDocumentCustomizer { @Override public void customize(HelpDocument document) { - String referenceDocUrl = (shouldChangeUrl() + String referenceDocUrl = (SPRING_BOOT_3_3_0_OR_LATER.match(this.description.getPlatformVersion()) ? "https://docs.spring.io/spring-boot/%s/reference/testing/testcontainers.html#testing.testcontainers" : "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers") .formatted(this.description.getPlatformVersion()); document.gettingStarted().addReferenceDocLink(referenceDocUrl, "Spring Boot Testcontainers support"); - Map model = new HashMap<>(); List dockerServices = this.serviceConnections.values() .map(ServiceConnection::dockerService) .toList(); model.put("services", dockerServices); - model.put("testcontainersAtDevelopmentTimeLink", (shouldChangeUrl() - ? "https://docs.spring.io/spring-boot/%s/reference/features/dev-services.html#features.dev-services.testcontainers" - : "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testcontainers") + model.put("testcontainersAtDevelopmentTimeLink", (SPRING_BOOT_3_3_0_OR_LATER + .match(this.description.getPlatformVersion()) + ? "https://docs.spring.io/spring-boot/%s/reference/features/dev-services.html#features.dev-services.testcontainers" + : "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers.at-development-time") .formatted(this.description.getPlatformVersion())); document.addSection("testcontainers", model); } - private boolean shouldChangeUrl() { - - return this.SPRING_BOOT_3_3_0_OR_LATER.match(this.description.getPlatformVersion()); - } - } diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java index 74da64eb4d..fe8970a452 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java @@ -28,9 +28,12 @@ * * @author Jenn Strater * @author Andy Wilkinson + * @author Moritz Halbritter */ class GradleBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests { + private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test @@ -43,11 +46,17 @@ void linksAddedToHelpDocumentForGradleBuild() { } @Test - void linksNotAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", SPRING_BOOT_VERSION).doesNotContain( + void linksAddedToHelpDocumentForGradleBuildWithOldSpringBootVersion() { + assertHelpDocument("gradle-build", OLD_SPRING_BOOT_VERSION).contains( "* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/gradle-plugin/reference/html/)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.2.0/gradle-plugin/reference/html/)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.2.0/gradle-plugin/reference/html/#build-image)"); + } + + @Test + void linksNotAddedToHelpDocumentForMavenBuild() { + assertHelpDocument("maven-build", SPRING_BOOT_VERSION).noneMatch((line) -> line.contains("Gradle")); } private ListAssert assertHelpDocument(String type, String version) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java index e4b43e8755..c430cb05b6 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java @@ -28,11 +28,14 @@ * * @author Jenn Strater * @author Andy Wilkinson + * @author Moritz Halbritter */ class MavenBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests { private static final String SPRING_BOOT_VERSION = "3.3.0"; + private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; + @Test void linksAddedToHelpDocumentForMavenBuild() { assertHelpDocument("maven-build", SPRING_BOOT_VERSION).contains( @@ -42,10 +45,16 @@ void linksAddedToHelpDocumentForMavenBuild() { } @Test - void linksNotAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", SPRING_BOOT_VERSION).doesNotContain( + void linksAddedToHelpDocumentForMavenBuildWithOldSpringBootVersion() { + assertHelpDocument("maven-build", OLD_SPRING_BOOT_VERSION).contains( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.0/maven-plugin/)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.2.0/maven-plugin/reference/html/)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.2.0/maven-plugin/reference/html/#build-image)"); + } + + @Test + void linksNotAddedToHelpDocumentForGradleBuild() { + assertHelpDocument("gradle-build", SPRING_BOOT_VERSION).noneMatch((line) -> line.contains("Maven")); } private ListAssert assertHelpDocument(String type, String version) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java index b6c4b94200..0ec9c9e040 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java @@ -42,13 +42,17 @@ */ class GraalVmHelpDocumentCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + + private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; + @Autowired private MustacheTemplateRenderer templateRenderer; @Test - void mavenBuildAndGradleAddLinkToMavenAotPlugin() { + void mavenBuildAddLinkToMavenAotPlugin() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.3.0")); + description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); HelpDocument document = customize(description, new MavenBuild()); assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); @@ -57,9 +61,9 @@ void mavenBuildAndGradleAddLinkToMavenAotPlugin() { } @Test - void mavenBuildAddLinkToMavenAotPlugin() { + void mavenBuildAddLinkToMavenAotPluginWithOldSpringBootVersion() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.2.0")); + description.setPlatformVersion(Version.parse(OLD_SPRING_BOOT_VERSION)); HelpDocument document = customize(description, new MavenBuild()); assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); @@ -71,7 +75,18 @@ void mavenBuildAddLinkToMavenAotPlugin() { @Test void gradleBuildAddLinkToGradleAotPlugin() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.2.0")); + description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); + HelpDocument document = customize(description, new GradleBuild()); + assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { + assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); + assertThat(link.getHref()).isEqualTo("https://docs.spring.io/spring-boot/3.3.0/how-to/aot.html"); + }); + } + + @Test + void gradleBuildAddLinkToGradleAotPluginWithOldSpringBootVersion() { + MutableProjectDescription description = new MutableProjectDescription(); + description.setPlatformVersion(Version.parse(OLD_SPRING_BOOT_VERSION)); HelpDocument document = customize(description, new GradleBuild()); assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java new file mode 100644 index 0000000000..9b1dae50d9 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.observability; + +import io.spring.initializr.generator.test.io.TextAssert; +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.assertj.core.api.ListAssert; +import org.junit.jupiter.api.Test; + +/** + * Tests for {@link ObservabilityHelpDocumentCustomizer}. + * + * @author Moritz Halbritter + */ +class ObservabilityHelpDocumentCustomizerTests extends AbstractExtensionTests { + + private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; + + private static final String SPRING_BOOT_VERSION = "3.3.0"; + + @Test + void linksAddedToHelpDocumentForGradleBuild() { + assertHelpDocument(SPRING_BOOT_VERSION, "distributed-tracing").contains( + "* [Distributed Tracing Reference Guide](https://docs.micrometer.io/tracing/reference/index.html)", + "* [Getting Started with Distributed Tracing](https://docs.spring.io/spring-boot/3.3.0/reference/actuator/tracing.html)"); + } + + @Test + void linksAddedToHelpDocumentForGradleBuildWithOldSpringBootVersion() { + assertHelpDocument(OLD_SPRING_BOOT_VERSION, "distributed-tracing").contains( + "* [Distributed Tracing Reference Guide](https://docs.micrometer.io/tracing/reference/index.html)", + "* [Getting Started with Distributed Tracing](https://docs.spring.io/spring-boot/docs/3.2.0/reference/html/actuator.html#actuator.micrometer-tracing.getting-started)"); + } + + @Test + void linksNotAddedToHelpDocumentForBuildWithoutTracing() { + assertHelpDocument(SPRING_BOOT_VERSION).noneMatch((line) -> line.contains("Tracing")); + } + + private ListAssert assertHelpDocument(String version, String... dependencies) { + ProjectRequest request = createProjectRequest(dependencies); + request.setType("gradle-build"); + request.setBootVersion(version); + ProjectStructure project = generateProject(request); + return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 5773293b59..a18c5e3bbc 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -428,9 +428,19 @@ fun contextLoads() { @Test void shouldAddHelpSection() { assertHelpDocument(SPRING_BOOT_VERSION_3_3, "testcontainers", "data-mongodb", "postgresql").contains( - "https://docs.spring.io/spring-boot/docs/3.3.0/reference/html/features.html#features.testing.testcontainers") + "https://docs.spring.io/spring-boot/3.3.0/reference/testing/testcontainers.html#testing.testcontainers") .contains( - "https://docs.spring.io/spring-boot/docs/3.3.0/reference/html/features.html#features.testing.testcontainers.at-development-time") + "https://docs.spring.io/spring-boot/3.3.0/reference/features/dev-services.html#features.dev-services.testcontainers") + .contains("mongo:latest") + .contains("postgres:latest"); + } + + @Test + void shouldAddHelpSectionWithOldSpringBoot() { + assertHelpDocument(SPRING_BOOT_VERSION_3_2, "testcontainers", "data-mongodb", "postgresql").contains( + "https://docs.spring.io/spring-boot/docs/3.2.0/reference/html/features.html#features.testing.testcontainers") + .contains( + "https://docs.spring.io/spring-boot/docs/3.2.0/reference/html/features.html#features.testing.testcontainers.at-development-time") .contains("mongo:latest") .contains("postgres:latest"); } From 40e9ea3ddbf03a44d34e28ead05c4144dd4e19e8 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 30 Jul 2024 09:01:44 +0200 Subject: [PATCH 603/825] Add thymeleaf security extensions and Security test if OAuth2 client is selected Closes gh-1542 --- .../DependencyProjectGenerationConfiguration.java | 7 +++++++ .../dependency/thymeleaf/ThymeleafBuildCustomizer.java | 3 ++- .../SpringSecurityTestBuildCustomizerTests.java | 10 ++++++++++ .../thymeleaf/ThymeleafBuildCustomizerTests.java | 10 ++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java index a5240dc1ad..62a456c9e2 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java @@ -46,6 +46,7 @@ * @author Stephane Nicoll * @author Eddú Meléndez * @author Kazuki Shimizu + * @author Moritz Halbritter */ @ProjectGenerationConfiguration public class DependencyProjectGenerationConfiguration { @@ -67,6 +68,12 @@ public SpringSecurityTestBuildCustomizer securityTestBuildCustomizer() { return new SpringSecurityTestBuildCustomizer(); } + @Bean + @ConditionalOnRequestedDependency("oauth2-client") + SpringSecurityTestBuildCustomizer oauth2ClientTestBuildCustomizer() { + return new SpringSecurityTestBuildCustomizer(); + } + @Bean @ConditionalOnRequestedDependency("security") public SpringSecurityRSocketBuildCustomizer securityRSocketBuildCustomizer() { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java index 47d17d7606..236bdfd0ea 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java @@ -24,12 +24,13 @@ * A {@link BuildCustomizer} for Thymeleaf. * * @author Stephane Nicoll + * @author Moritz Halbritter */ public class ThymeleafBuildCustomizer implements BuildCustomizer { @Override public void customize(Build build) { - if (build.dependencies().has("security")) { + if (build.dependencies().has("security") || build.dependencies().has("oauth2-client")) { build.dependencies() .add("thymeleaf-extras-spring-security", Dependency.withCoordinates("org.thymeleaf.extras", "thymeleaf-extras-springsecurity6")); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java index 4f70572652..1f9f392ff1 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java @@ -27,6 +27,7 @@ * Tests for {@link SpringSecurityTestBuildCustomizer}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class SpringSecurityTestBuildCustomizerTests extends AbstractExtensionTests { @@ -39,6 +40,15 @@ void securityTestIsAddedWithSecurity() { .hasDependenciesSize(3); } + @Test + void securityTestIsAddedWithOAuth2Client() { + ProjectRequest request = createProjectRequest("oauth2-client"); + assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("oauth2-client")) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependency(springSecurityTest()) + .hasDependenciesSize(3); + } + @Test void securityTestIsNotAddedWithoutSpringSecurity() { ProjectRequest request = createProjectRequest("web"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java index 97482ed6c0..9a4eda8b6c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java @@ -27,6 +27,7 @@ * Tests for {@link ThymeleafBuildCustomizer}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class ThymeleafBuildCustomizerTests extends AbstractExtensionTests { @@ -39,6 +40,15 @@ void thymeleafWithSpringSecurityAndSpringBootAddsExtrasDependency() { "thymeleaf-extras-springsecurity6")); } + @Test + void thymeleafWithOAuth2ClientAndSpringBootAddsExtrasDependency() { + ProjectRequest projectRequest = createProjectRequest("thymeleaf", "oauth2-client"); + assertThat(mavenPom(projectRequest)).hasDependency(Dependency.createSpringBootStarter("thymeleaf")) + .hasDependency(Dependency.createSpringBootStarter("oauth2-client")) + .hasDependency(Dependency.withId("thymeleaf-extras-spring-security", "org.thymeleaf.extras", + "thymeleaf-extras-springsecurity6")); + } + @Test void thymeleafWithoutSpringSecurityDoesNotAddExtrasDependency() { assertThat(mavenPom(createProjectRequest("thymeleaf", "web"))) From aab159a7b47ae883eb87a55e88a3408aeeb3bd07 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 2 Aug 2024 09:32:45 +0200 Subject: [PATCH 604/825] Remove wavefront starter Closes gh-1543 --- ...abilityProjectGenerationConfiguration.java | 9 --- .../WavefrontHelpDocumentCustomizer.java | 63 --------------- start-site/src/main/resources/application.yml | 13 +--- .../WavefrontHelpDocumentCustomizerTests.java | 78 ------------------- 4 files changed, 3 insertions(+), 160 deletions(-) delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java delete mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java index 4c6b2e0cf3..7d5ace1bc9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java @@ -17,8 +17,6 @@ package io.spring.start.site.extension.dependency.observability; import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; -import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; @@ -48,11 +46,4 @@ ObservabilityHelpDocumentCustomizer observabilityHelpDocumentCustomizer(ProjectD return new ObservabilityHelpDocumentCustomizer(description, build); } - @Bean - @ConditionalOnRequestedDependency("wavefront") - @ConditionalOnPlatformVersion("[3.2.0, 3.3.0-M1)") - WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { - return new WavefrontHelpDocumentCustomizer("https://docs.wavefront.com/wavefront_springboot3.html", build); - } - } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java deleted file mode 100644 index 94d7533466..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2012-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.observability; - -import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.spring.documentation.HelpDocument; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; - -/** - * A {@link HelpDocumentCustomizer} that provides additional references when Wavefront is - * selected. - * - * @author Stephane Nicoll - * @author Brian Clozel - */ -class WavefrontHelpDocumentCustomizer implements HelpDocumentCustomizer { - - private final Build build; - - private final String referenceLink; - - WavefrontHelpDocumentCustomizer(String referenceLink, Build build) { - this.referenceLink = referenceLink; - this.build = build; - } - - @Override - public void customize(HelpDocument document) { - document.gettingStarted().addReferenceDocLink(this.referenceLink, "Wavefront for Spring Boot documentation"); - - StringBuilder sb = new StringBuilder(); - sb.append(String.format("## Observability with Wavefront%n%n")); - sb.append(String - .format("If you don't have a Wavefront account, the starter will create a freemium account for you.%n")); - sb.append(String.format("The URL to access the Wavefront Service dashboard is logged on startup.%n")); - - if (this.build.dependencies().has("web") || this.build.dependencies().has("webflux")) { - sb.append( - String.format("%nYou can also access your dashboard using the `/actuator/wavefront` endpoint.%n")); - } - - if (!this.build.dependencies().has("distributed-tracing")) { - sb.append(String.format( - "%nFinally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry.%n")); - } - document.addSection((writer) -> writer.print(sb)); - } - -} diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0de685a1e3..100175b7fb 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -992,16 +992,9 @@ initializr: - name: Wavefront id: wavefront description: Publish metrics and optionally distributed traces to Tanzu Observability by Wavefront, a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and alert over data from across your entire stack. - mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - groupId: com.wavefront - artifactId: wavefront-spring-boot-starter - version: 3.2.0 - starter: true - - compatibilityRange: "3.3.0-M1" - groupId: io.micrometer - artifactId: micrometer-registry-wavefront - starter: false + groupId: io.micrometer + artifactId: micrometer-registry-wavefront + starter: false - name: Zipkin id: zipkin description: Enable and expose span and trace IDs to Zipkin. diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java deleted file mode 100644 index e272182566..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2012-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.observability; - -import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.assertj.core.api.ListAssert; -import org.junit.jupiter.api.Test; - -/** - * Tests for {@link WavefrontHelpDocumentCustomizer}. - * - * @author Stephane Nicoll - * @author Brian Clozel - */ -class WavefrontHelpDocumentCustomizerTests extends AbstractExtensionTests { - - @Test - void wavefrontAddGeneralSection() { - assertHelpDocument("3.2.0", "wavefront").contains("## Observability with Wavefront", "", - "If you don't have a Wavefront account, the starter will create a freemium account for you.", - "The URL to access the Wavefront Service dashboard is logged on startup."); - } - - @Test - void wavefrontWithoutWebApplicationDoesNotAddActuatorSection() { - assertHelpDocument("3.2.0", "wavefront") - .doesNotContain("You can also access your dashboard using the `/actuator/wavefront` endpoint."); - } - - @Test - void wavefrontWithWebApplicationAddActuatorSection() { - assertHelpDocument("3.2.0", "wavefront", "web") - .contains("You can also access your dashboard using the `/actuator/wavefront` endpoint."); - } - - @Test - void wavefrontWithoutDistributedTracingAddTracingNote() { - assertHelpDocument("3.2.0", "wavefront") - .contains("Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); - } - - @Test - void wavefrontWithDistributedTracingDoesNotAddTracingNote() { - assertHelpDocument("3.2.0", "wavefront", "distributed-tracing").doesNotContain( - "Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); - } - - @Test - void springBoot3xWavefrontReference() { - assertHelpDocument("3.2.0", "wavefront").contains( - "* [Wavefront for Spring Boot documentation](https://docs.wavefront.com/wavefront_springboot3.html)"); - } - - private ListAssert assertHelpDocument(String version, String... dependencies) { - ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(version); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); - } - -} From 625de84333fc75ad780a7a9cae04003170a42929 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 2 Aug 2024 09:33:10 +0200 Subject: [PATCH 605/825] Upgrade to Spring Boot 3.3.2 Closes gh-1544 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c9c86e78e2..7f9b038a60 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.1 + 3.3.2 io.spring.start start-parent From b6d7321b8dbc80d7e6ae7d3fb78c8791ee873e07 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 7 Aug 2024 09:46:00 +0300 Subject: [PATCH 606/825] Upgrade to Vaadin 24.4.8 See gh-1545 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 100175b7fb..f33b6f523a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -150,7 +150,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.4.7 + version: 24.4.8 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From d5b25e832f8d3b49fa69b1c370d96b74e5bffc45 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 7 Aug 2024 10:32:03 +0200 Subject: [PATCH 607/825] Upgrade to Spring Cloud Azure 5.15.0 Closes gh-1546 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f33b6f523a..aa79cf7cd6 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -102,7 +102,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 5.14.0 + version: 5.15.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From f98159a4738effa9ebdf37d1ea9a41444248cb4c Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 7 Aug 2024 11:12:34 +0200 Subject: [PATCH 608/825] Adapt to changes in the initialzr library --- .../KotlinTestContainersApplicationCodeProjectContributor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java index 4105fd4409..bd9ba8b5e9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java @@ -46,7 +46,7 @@ class KotlinTestContainersApplicationCodeProjectContributor extends KotlinTestContainersApplicationCodeProjectContributor(IndentingWriterFactory indentingWriterFactory, ProjectDescription description, ServiceConnections serviceConnections) { super(description, serviceConnections, KotlinSourceCode::new, - new KotlinSourceCodeWriter(indentingWriterFactory)); + new KotlinSourceCodeWriter(description.getLanguage(), indentingWriterFactory)); } @Override From 3d1f3f11c633ea8c87fb508b25abac4a3ed41877 Mon Sep 17 00:00:00 2001 From: Fred Date: Tue, 13 Aug 2024 12:28:32 -0300 Subject: [PATCH 609/825] Upgrade Timefold Solver to 1.13.0 See gh-1551 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index aa79cf7cd6..4218532745 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -143,7 +143,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 1.12.0 + version: 1.13.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From c58bbad85a7b40efbce84e58d408f1c5c459ec32 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Mon, 12 Aug 2024 17:23:29 -0600 Subject: [PATCH 610/825] Upgrade to netflix-dgs 9.0.4 See gh-1550 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4218532745..201e53cabe 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -58,7 +58,7 @@ initializr: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 8.7.1 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 9.0.0 + version: 9.0.4 sentry: groupId: io.sentry artifactId: sentry-bom From 6681ea040c4dbac5f3c93187f373bbe09c68f17f Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Mon, 12 Aug 2024 17:44:12 -0600 Subject: [PATCH 611/825] Fix java version in CONTRIBUTING.adoc file See gh-1550 --- CONTRIBUTING.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index 07dccdb206..2b98592fcc 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -53,7 +53,7 @@ added after the original pull request but before a merge. === Building from Source start.spring.io can be build from the command line using -https://maven.apache.org/run-maven/index.html[Apache Maven] on JDK 11 or above. +https://maven.apache.org/run-maven/index.html[Apache Maven] on JDK 17 or above. We include '`Maven Wrapper`' scripts (`./mvnw` or `mvnw.bat`) that you can run rather than needing to install Maven locally. From 5636684519971d180d13aa4d7b132e8903cadef5 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Tue, 13 Aug 2024 07:31:29 -0600 Subject: [PATCH 612/825] Upgrade to yarn 1.22.22 See gh-1550 --- start-client/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-client/pom.xml b/start-client/pom.xml index f8f46ea4a2..d6277a9b54 100644 --- a/start-client/pom.xml +++ b/start-client/pom.xml @@ -24,7 +24,7 @@ v16.20.0 - v1.22.19 + v1.22.22 From 86c98ff0b081f02e205093d2316a4b8261db90a8 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 16 Aug 2024 11:23:03 +0200 Subject: [PATCH 613/825] Set Vaadin's launch-browser property automatically Closes gh-1552 --- .../VaadinProjectGenerationConfiguration.java | 7 +++++++ .../VaadinProjectGenerationConfigurationTests.java | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java index 8c1435fd15..5415099a7e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java @@ -21,6 +21,7 @@ import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.properties.ApplicationPropertiesCustomizer; import io.spring.initializr.generator.spring.scm.git.GitIgnoreCustomizer; import io.spring.initializr.metadata.InitializrMetadata; @@ -31,6 +32,7 @@ * Configuration for generation of projects that depend on Vaadin. * * @author Stephane Nicoll + * @author Moritz Halbritter */ @Configuration(proxyBeanMethods = false) @ConditionalOnRequestedDependency("vaadin") @@ -54,4 +56,9 @@ GitIgnoreCustomizer vaadinGitIgnoreCustomizer() { return (gitignore) -> gitignore.getGeneral().add("node_modules"); } + @Bean + ApplicationPropertiesCustomizer launchBrowserApplicationPropertiesCustomizer() { + return (properties) -> properties.add("vaadin.launch-browser", true); + } + } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java index 1cc693cab1..67da317458 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java @@ -27,6 +27,7 @@ * Tests for {@link VaadinProjectGenerationConfiguration}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class VaadinProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -110,6 +111,18 @@ void gitIgnoreWithoutVaadinDoesNotIgnoreNodeModules() { .doesNotContain("node_modules"); } + @Test + void shouldAddLaunchBrowserProperty() { + assertThat(generateProject(createProjectRequest("vaadin"))).textFile("src/main/resources/application.properties") + .contains("vaadin.launch-browser=true"); + } + + @Test + void shouldNotAddLaunchBrowserPropertyIfVaadinIsNotSelected() { + assertThat(generateProject(createProjectRequest("data-jpa"))).textFile("src/main/resources/application.properties") + .doesNotContain("vaadin.launch-browser=true"); + } + @Override protected ProjectRequest createProjectRequest(String... dependencies) { ProjectRequest request = super.createProjectRequest(dependencies); From 872a7f5abed2f02bf6d8d3fcf3c18a191f553ae7 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 16 Aug 2024 11:47:33 +0200 Subject: [PATCH 614/825] Upgrade to spring-java-format 0.0.43 Closes gh-1555 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7f9b038a60..47c50ec75a 100644 --- a/pom.xml +++ b/pom.xml @@ -34,8 +34,8 @@ 0.0.1-SNAPSHOT false 0.22.0-SNAPSHOT - 0.0.42 - + 0.0.43 + v start-client From dbf359d7600b628319642a641a7c99c0c88b90c4 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 16 Aug 2024 12:08:01 +0200 Subject: [PATCH 615/825] Fix typo --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 47c50ec75a..ee38ddeb80 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ false 0.22.0-SNAPSHOT 0.0.43 - v + start-client From 0884b2f19d7dbfb59ffb407f92b6cc03da5d9b3c Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 19 Aug 2024 12:37:03 +0300 Subject: [PATCH 616/825] Upgrade to Vaadin 24.4.9 See gh-1556 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 201e53cabe..e665cc04b7 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -150,7 +150,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.4.8 + version: 24.4.9 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 8d661c5ea125fc75998b17fbf8b3559d4a9f3a80 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 15 Aug 2024 02:27:42 -0600 Subject: [PATCH 617/825] Upgrade to Sentry 7.14.0 See gh-1553 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e665cc04b7..5865180d67 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -65,7 +65,7 @@ initializr: versionProperty: sentry.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 7.3.0 + version: 7.14.0 solace-spring-boot: groupId: com.solace.spring.boot artifactId: solace-spring-boot-bom From 7abe5d399e496762a832c7b82da272c504f5594f Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 15 Aug 2024 02:30:12 -0600 Subject: [PATCH 618/825] Upgrade to Solace Spring Boot 2.1.1 See gh-1553 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 5865180d67..5683fb8d03 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -72,7 +72,7 @@ initializr: versionProperty: solace-spring-boot.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 2.0.0 + version: 2.1.1 solace-spring-cloud: groupId: com.solace.spring.cloud artifactId: solace-spring-cloud-bom From 888f93aa74eaaa7104d2693e26a05d14d9b055eb Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 15 Aug 2024 02:32:09 -0600 Subject: [PATCH 619/825] Upgrade to Solace Cloud 4.4.0 See gh-1553 --- start-site/src/main/resources/application.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 5683fb8d03..3d85651378 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -78,8 +78,10 @@ initializr: artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 4.1.0 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 4.4.0 spring-ai: groupId: org.springframework.ai artifactId: spring-ai-bom From 1b865e178a6f4b70b3df7a9dd370df35d0623368 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 15 Aug 2024 02:33:21 -0600 Subject: [PATCH 620/825] Upgrade to Spring Cloud gcp to 5.5.0 See gh-1553 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3d85651378..ac736220aa 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -112,7 +112,7 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 5.4.3 + version: 5.5.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 9306854414422a926207e9e34a77ec739399ca5e Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 15 Aug 2024 02:40:56 -0600 Subject: [PATCH 621/825] Upgrade to Spring Cloud Services 4.1.5 See gh-1553 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ac736220aa..7eb651fbc3 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -120,7 +120,7 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 4.1.3 + version: 4.1.5 spring-modulith: groupId: org.springframework.modulith artifactId: spring-modulith-bom From 9164f4141e6e6ee048b5735d8c1486b4d7cd0bfb Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 20 Aug 2024 09:18:43 +0200 Subject: [PATCH 622/825] Upgrade to cyclonedx-gradle-plugin 1.10.0 Closes gh-1558 --- .../dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java | 2 +- .../sbom/SbomProjectGenerationConfigurationTests.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java index a68ed6fcf3..879875bf54 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java @@ -26,7 +26,7 @@ */ class SbomCycloneDxGradleBuildCustomizer implements BuildCustomizer { - private static final String PLUGIN_VERSION = "1.8.2"; + private static final String PLUGIN_VERSION = "1.10.0"; @Override public void customize(GradleBuild build) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java index 56c3dfd052..89bfe1eb4a 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java @@ -64,7 +64,7 @@ void shouldAddMavenPlugin() { @Test void shouldAddGradlePlugin() { ProjectRequest request = createProjectRequest("sbom-cyclone-dx"); - assertThat(gradleBuild(request)).hasPlugin("org.cyclonedx.bom", "1.8.2"); + assertThat(gradleBuild(request)).hasPlugin("org.cyclonedx.bom", "1.10.0"); } } From df8b1287d61b1b4afbe8b9ecf43275a137b4a2d3 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 20 Aug 2024 13:45:36 +0200 Subject: [PATCH 623/825] Add htmx dependency Closes gh-1549 --- .../dependency/htmx/HtmxBuildCustomizer.java | 44 ++++++++++++++ .../HtmxProjectGenerationConfiguration.java | 38 ++++++++++++ .../dependency/htmx/package-info.java | 20 +++++++ .../main/resources/META-INF/spring.factories | 1 + start-site/src/main/resources/application.yml | 15 +++++ .../htmx/HtmxBuildCustomizerTests.java | 60 +++++++++++++++++++ 6 files changed, 178 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/package-info.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizer.java new file mode 100644 index 0000000000..456646c24e --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizer.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.htmx; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * A {@link BuildCustomizer} that replaces {@code htmx-spring-boot} with + * {@code htmx-spring-boot-thymeleaf} if Thymeleaf is selected. + * + * @author Moritz Halbritter + */ +class HtmxBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + if (build.dependencies().has("thymeleaf")) { + Dependency htmx = build.dependencies().get("htmx"); + build.dependencies().remove("htmx"); + build.dependencies() + .add("htmx-thymeleaf", + Dependency.withCoordinates(htmx.getGroupId(), "htmx-spring-boot-thymeleaf") + .version(htmx.getVersion()) + .build()); + } + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxProjectGenerationConfiguration.java new file mode 100644 index 0000000000..7360d24bd9 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxProjectGenerationConfiguration.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.htmx; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configuration for generation of projects that depend on htmx. + * + * @author Moritz Halbritter + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnRequestedDependency("htmx") +class HtmxProjectGenerationConfiguration { + + @Bean + HtmxBuildCustomizer htmxBuildCustomizer() { + return new HtmxBuildCustomizer(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/package-info.java new file mode 100644 index 0000000000..b0e25f8f18 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on htmx. + */ +package io.spring.start.site.extension.dependency.htmx; diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 28826f662c..f2a5813249 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -13,6 +13,7 @@ io.spring.start.site.extension.dependency.elasticsearch.ElasticsearchProjectGene io.spring.start.site.extension.dependency.flyway.FlywayProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.graalvm.GraalVmProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.graphql.SpringGraphQlProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.htmx.HtmxProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mariadb.MariaDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mongodb.MongoDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mysql.MysqlProjectGenerationConfiguration,\ diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 7eb651fbc3..52faf59e0c 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -348,6 +348,21 @@ initializr: links: - rel: reference href: https://netflix.github.io/dgs/ + - name: htmx + id: htmx + facets: + - web + starter: false + groupId: io.github.wimdeblauwe + artifactId: htmx-spring-boot + description: Build modern user interfaces with the simplicity and power of hypertext. + compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 3.4.1 + links: + - rel: reference + href: https://github.com/wimdeblauwe/htmx-spring-boot + - rel: guide + href: https://www.youtube.com/watch?v=j-rfPoXe5aE - name: Template Engines content: - name: Thymeleaf diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java new file mode 100644 index 0000000000..ada2bc088d --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java @@ -0,0 +1,60 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.htmx; + +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link HtmxBuildCustomizer}. + * + * @author Moritz Halbritter + */ +class HtmxBuildCustomizerTests extends AbstractExtensionTests { + + private final Dependency htmx = Dependency.withId("htmx", "io.github.wimdeblauwe", "htmx-spring-boot"); + + private final Dependency htmxThymeleaf = Dependency.withId("htmx", "io.github.wimdeblauwe", + "htmx-spring-boot-thymeleaf"); + + @Test + void shouldUseHtmxThymleafIfThymeleafIsSelected() { + ProjectRequest request = createProjectRequest("htmx", "thymeleaf"); + assertThat(mavenPom(request)).doesNotHaveDependency(this.htmx.getGroupId(), this.htmx.getArtifactId()) + .hasDependency(this.htmxThymeleaf); + } + + @Test + void shouldUsePlainHtmxIfThymeleafIsNotSelected() { + ProjectRequest request = createProjectRequest("htmx"); + assertThat(mavenPom(request)) + .doesNotHaveDependency(this.htmxThymeleaf.getGroupId(), this.htmxThymeleaf.getArtifactId()) + .hasDependency(this.htmx); + } + + @Test + void shouldNotAddHtmx() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotHaveDependency(this.htmx.getGroupId(), this.htmx.getArtifactId()) + .doesNotHaveDependency(this.htmxThymeleaf.getGroupId(), this.htmxThymeleaf.getArtifactId()); + } + +} From 4542e80bef5241512fc575005d41428bab18ff6f Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 20 Aug 2024 16:00:53 +0200 Subject: [PATCH 624/825] Upgrade to Spring Cloud 2024.0.0-M1 Closes gh-1559 --- start-site/src/main/resources/application.yml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 52faf59e0c..8453d1a6f6 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -98,6 +98,9 @@ initializr: mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" version: 2023.0.3 + - compatibilityRange: "[3.4.0-M1,3.5.0-M1)" + version: 2024.0.0-M1 + repositories: spring-milestones spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies @@ -1042,7 +1045,7 @@ initializr: href: https://java.testcontainers.org/ - name: Contract Verifier bom: spring-cloud - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.5.0-M1)" id: cloud-contract-verifier description: Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development. groupId: org.springframework.cloud @@ -1053,7 +1056,7 @@ initializr: href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsingle/ - name: Contract Stub Runner bom: spring-cloud - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.5.0-M1)" id: cloud-contract-stub-runner description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests. groupId: org.springframework.cloud @@ -1074,7 +1077,7 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap.embedded - name: Spring Cloud bom: spring-cloud - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Cloud Bootstrap id: cloud-starter @@ -1106,7 +1109,7 @@ initializr: href: https://docs.spring.io/spring-cloud-task/docs/current/reference/html/ - name: Spring Cloud Config bom: spring-cloud - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Config Client id: cloud-config-client @@ -1157,7 +1160,7 @@ initializr: description: Spring Cloud Consul Quick Start - name: Spring Cloud Discovery bom: spring-cloud - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Eureka Discovery Client id: cloud-eureka @@ -1199,7 +1202,7 @@ initializr: href: https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#spring-cloud-consul-discovery - name: Spring Cloud Routing bom: spring-cloud - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Gateway id: cloud-gateway @@ -1246,7 +1249,7 @@ initializr: href: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer - name: Spring Cloud Circuit Breaker bom: spring-cloud - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Resilience4J id: cloud-resilience4j @@ -1258,7 +1261,7 @@ initializr: href: https://docs.spring.io/spring-cloud-circuitbreaker/docs/current/reference/html/#configuring-resilience4j-circuit-breakers - name: Spring Cloud Messaging bom: spring-cloud - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Cloud Bus id: cloud-bus From 7900339c737c0593aa43db757af9b3dbf4bffde3 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 21 Aug 2024 09:12:14 +0200 Subject: [PATCH 625/825] Ensure that DependencyResolver is thread safe --- .../src/test/java/io/spring/start/site/DependencyResolver.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java index 025fe5f38e..63ed6d84f8 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java +++ b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -62,7 +63,7 @@ final class DependencyResolver { - private static final Collection instances = new ArrayList<>(); + private static final Collection instances = new CopyOnWriteArrayList<>(); private static final ThreadLocal instanceForThread = ThreadLocal.withInitial(() -> { DependencyResolver instance = new DependencyResolver(); From 0f095d7210dfd04a643fdf881fe7af924ac807bc Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 21 Aug 2024 09:12:21 +0200 Subject: [PATCH 626/825] Polish --- .../java/io/spring/start/site/MetadataVerificationTests.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java index 7d689ebea6..af4735ed2f 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java +++ b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java @@ -16,7 +16,6 @@ package io.spring.start.site; -import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -62,7 +61,7 @@ class MetadataVerificationTests { private final InitializrMetadata metadata; - MetadataVerificationTests(@Autowired InitializrMetadataProvider metadataProvider) throws IOException { + MetadataVerificationTests(@Autowired InitializrMetadataProvider metadataProvider) { this.metadata = metadataProvider.get(); } From 242da36ef386ed0acfaee48ce3137ae7769de3a1 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 21 Aug 2024 09:12:29 +0200 Subject: [PATCH 627/825] Mark htmx as a starter --- start-site/src/main/resources/application.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8453d1a6f6..e5e751cd38 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -355,7 +355,6 @@ initializr: id: htmx facets: - web - starter: false groupId: io.github.wimdeblauwe artifactId: htmx-spring-boot description: Build modern user interfaces with the simplicity and power of hypertext. From e62e17f115dd7752e63097ac6a98e5bab832f6a7 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 21 Aug 2024 10:18:58 +0200 Subject: [PATCH 628/825] Cache MetadataVerificationTests They are quite slow to execute as they always resolve against an empty Maven repository. This commit moves the Homes and some other test support infra structure to a shared module which is used in start-site and start-site-verification in test scope. The DependencyResolver used in MetadataVerificationTests is using the Homes class, reusing the already cached repository, thus speeding it up. --- pom.xml | 6 ++ start-site-verification/pom.xml | 6 ++ .../spring/start/site/DependencyResolver.java | 63 ++++-------- .../start/site/MetadataVerificationTests.java | 13 +-- .../src/test/resources/application-test.yml | 3 + .../test/resources/junit-platform.properties | 18 ++++ start-site/pom.xml | 5 + .../ProjectGenerationIntegrationTests.java | 65 ++---------- .../site/test/TestMavenVersionResolver.java | 1 + .../test/resources/junit-platform.properties | 2 +- test-support/pom.xml | 51 ++++++++++ .../io/spring/start/testsupport/Homes.java | 99 +++++++++++++++++++ .../JunitMaxParallelismStrategy.java | 2 +- .../start/testsupport}/TemporaryFiles.java | 2 +- .../start/testsupport/package-info.java | 20 ++++ .../spring/start/testsupport/HomesTests.java | 43 ++++++++ 16 files changed, 286 insertions(+), 113 deletions(-) create mode 100644 start-site-verification/src/test/resources/application-test.yml create mode 100644 test-support/pom.xml create mode 100644 test-support/src/main/java/io/spring/start/testsupport/Homes.java rename {start-site/src/test/java/io/spring/start/site/test => test-support/src/main/java/io/spring/start/testsupport}/JunitMaxParallelismStrategy.java (98%) rename {start-site/src/test/java/io/spring/start/site/test => test-support/src/main/java/io/spring/start/testsupport}/TemporaryFiles.java (98%) create mode 100644 test-support/src/main/java/io/spring/start/testsupport/package-info.java create mode 100644 test-support/src/test/java/io/spring/start/testsupport/HomesTests.java diff --git a/pom.xml b/pom.xml index ee38ddeb80..6e466dea7e 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,7 @@ start-client start-site + test-support @@ -79,6 +80,11 @@ start-site ${revision} + + io.spring.start + test-support + ${revision} + com.azure.spring spring-cloud-azure-dependencies diff --git a/start-site-verification/pom.xml b/start-site-verification/pom.xml index 6d15809c9a..55da66153b 100644 --- a/start-site-verification/pom.xml +++ b/start-site-verification/pom.xml @@ -28,6 +28,12 @@ + + + io.spring.start + test-support + test + diff --git a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java index 63ed6d84f8..3efb658d72 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java +++ b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java @@ -16,19 +16,16 @@ package io.spring.start.site; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; import java.util.stream.Stream; import io.spring.initializr.metadata.BillOfMaterials; +import io.spring.start.testsupport.Homes; import org.apache.maven.repository.internal.MavenRepositorySystemUtils; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; @@ -59,36 +56,23 @@ import org.eclipse.aether.util.graph.visitor.FilteringDependencyVisitor; import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy; -import org.springframework.util.FileSystemUtils; - final class DependencyResolver { - private static final Collection instances = new CopyOnWriteArrayList<>(); - - private static final ThreadLocal instanceForThread = ThreadLocal.withInitial(() -> { - DependencyResolver instance = new DependencyResolver(); - instances.add(instance); - return instance; - }); - static final RemoteRepository mavenCentral = createRemoteRepository("central", "https://repo1.maven.org/maven2", false); private static final Map> managedDependencies = new ConcurrentHashMap<>(); - private final Path localRepositoryLocation; - private final RepositorySystemSession repositorySystemSession; private final RepositorySystem repositorySystem; - DependencyResolver() { + DependencyResolver(Path localRepositoryLocation) { try { ServiceLocator serviceLocator = createServiceLocator(); DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(false, false)); - this.localRepositoryLocation = Files.createTempDirectory("metadata-validation-m2"); - LocalRepository localRepository = new LocalRepository(this.localRepositoryLocation.toFile()); + LocalRepository localRepository = new LocalRepository(localRepositoryLocation.toFile()); this.repositorySystem = serviceLocator.getService(RepositorySystem.class); session .setLocalRepositoryManager(this.repositorySystem.newLocalRepositoryManager(session, localRepository)); @@ -113,33 +97,26 @@ static RemoteRepository createRemoteRepository(String id, String url, boolean sn return repositoryBuilder.build(); } - static List resolveDependencies(String groupId, String artifactId, String version, + static List resolveDependencies(Homes homes, String groupId, String artifactId, String version, List boms, List repositories) { - DependencyResolver instance = instanceForThread.get(); - List managedDependencies = instance.getManagedDependencies(boms, repositories); - Dependency aetherDependency = new Dependency(new DefaultArtifact(groupId, artifactId, "pom", - instance.getVersion(groupId, artifactId, version, managedDependencies)), "compile"); - CollectRequest collectRequest = new CollectRequest(aetherDependency, repositories); - collectRequest.setManagedDependencies(managedDependencies); - try { - CollectResult result = instance.collectDependencies(collectRequest); - return DependencyCollector.collect(result.getRoot(), RuntimeTransitiveOnlyDependencyFilter.INSTANCE); - } - catch (DependencyCollectionException ex) { - throw new RuntimeException(ex); - } - } - - static void cleanUp() { - instances.forEach(DependencyResolver::deleteLocalRepository); - } - - void deleteLocalRepository() { + Path home = homes.acquire(); try { - FileSystemUtils.deleteRecursively(this.localRepositoryLocation); + DependencyResolver instance = new DependencyResolver(home.resolve("repository")); + List managedDependencies = instance.getManagedDependencies(boms, repositories); + Dependency aetherDependency = new Dependency(new DefaultArtifact(groupId, artifactId, "pom", + instance.getVersion(groupId, artifactId, version, managedDependencies)), "compile"); + CollectRequest collectRequest = new CollectRequest(aetherDependency, repositories); + collectRequest.setManagedDependencies(managedDependencies); + try { + CollectResult result = instance.collectDependencies(collectRequest); + return DependencyCollector.collect(result.getRoot(), RuntimeTransitiveOnlyDependencyFilter.INSTANCE); + } + catch (DependencyCollectionException ex) { + throw new RuntimeException(ex); + } } - catch (IOException ex) { - // Continue + finally { + homes.release(home); } } diff --git a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java index af4735ed2f..dbc1b0b400 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java +++ b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java @@ -34,8 +34,8 @@ import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.metadata.InitializrMetadataProvider; import io.spring.initializr.metadata.Repository; +import io.spring.start.testsupport.Homes; import org.eclipse.aether.repository.RemoteRepository; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.parallel.Execution; @@ -46,6 +46,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; @@ -57,6 +58,7 @@ @SpringBootTest @TestInstance(Lifecycle.PER_CLASS) @Execution(ExecutionMode.CONCURRENT) +@ActiveProfiles("test") class MetadataVerificationTests { private final InitializrMetadata metadata; @@ -65,11 +67,6 @@ class MetadataVerificationTests { this.metadata = metadataProvider.get(); } - @AfterAll - static void cleanUp() { - DependencyResolver.cleanUp(); - } - @ParameterizedTest(name = "{3}") @MethodSource("parameters") void dependencyStarterConfigurationIsCorrect(Dependency dependency, List boms, @@ -88,8 +85,8 @@ void dependencyStarterConfigurationIsCorrect(Dependency dependency, List collectDependencies(Dependency dependency, List boms, List repositories) { try { - return DependencyResolver.resolveDependencies(dependency.getGroupId(), dependency.getArtifactId(), - dependency.getVersion(), boms, repositories); + return DependencyResolver.resolveDependencies(Homes.MAVEN, dependency.getGroupId(), + dependency.getArtifactId(), dependency.getVersion(), boms, repositories); } catch (RuntimeException ex) { // ActiveMQ starter does not exist with Spring Boot 3.0 diff --git a/start-site-verification/src/test/resources/application-test.yml b/start-site-verification/src/test/resources/application-test.yml new file mode 100644 index 0000000000..604ee888f6 --- /dev/null +++ b/start-site-verification/src/test/resources/application-test.yml @@ -0,0 +1,3 @@ +application: + maven-version-resolver: + cache-directory: "${START_SPRING_IO_TMPDIR:${java.io.tmpdir}}/maven-version-resolver-cache" diff --git a/start-site-verification/src/test/resources/junit-platform.properties b/start-site-verification/src/test/resources/junit-platform.properties index 1d27b78fbb..5c068dfbba 100644 --- a/start-site-verification/src/test/resources/junit-platform.properties +++ b/start-site-verification/src/test/resources/junit-platform.properties @@ -1 +1,19 @@ +# +# Copyright 2012-2024 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + junit.jupiter.execution.parallel.enabled=true +junit.jupiter.execution.parallel.config.strategy=custom +junit.jupiter.execution.parallel.config.custom.class=io.spring.start.testsupport.JunitMaxParallelismStrategy diff --git a/start-site/pom.xml b/start-site/pom.xml index 322e5e48e2..044ab775b6 100644 --- a/start-site/pom.xml +++ b/start-site/pom.xml @@ -92,6 +92,11 @@ initializr-generator-test test + + io.spring.start + test-support + test + diff --git a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java index e4c3d219f1..314484e582 100644 --- a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java @@ -17,17 +17,11 @@ package io.spring.start.site; import java.io.IOException; -import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Queue; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; import io.spring.initializr.generator.buildsystem.BuildSystem; @@ -48,7 +42,8 @@ import io.spring.initializr.web.project.ProjectGenerationInvoker; import io.spring.initializr.web.project.ProjectRequest; import io.spring.initializr.web.project.WebProjectRequest; -import io.spring.start.site.test.TemporaryFiles; +import io.spring.start.testsupport.Homes; +import io.spring.start.testsupport.TemporaryFiles; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.parallel.Execution; @@ -61,7 +56,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; import org.springframework.test.context.ActiveProfiles; -import org.springframework.util.Assert; import static org.assertj.core.api.Assertions.assertThat; @@ -78,10 +72,6 @@ @Execution(ExecutionMode.CONCURRENT) class ProjectGenerationIntegrationTests { - private static final Homes mavenHomes = new Homes("maven-home"); - - private static final Homes gradleHomes = new Homes("gradle-home"); - private final ProjectGenerationInvoker invoker; private final InitializrMetadata metadata; @@ -157,16 +147,16 @@ void projectBuilds(Version bootVersion, Packaging packaging, Language language, private Path acquireHome(BuildSystem buildSystem) { return switch (buildSystem.id()) { - case MavenBuildSystem.ID -> mavenHomes.acquire(); - case GradleBuildSystem.ID -> gradleHomes.acquire(); + case MavenBuildSystem.ID -> Homes.MAVEN.acquire(); + case GradleBuildSystem.ID -> Homes.GRADLE.acquire(); default -> throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); }; } private void releaseHome(BuildSystem buildSystem, Path home) { switch (buildSystem.id()) { - case MavenBuildSystem.ID -> mavenHomes.release(home); - case GradleBuildSystem.ID -> gradleHomes.release(home); + case MavenBuildSystem.ID -> Homes.MAVEN.release(home); + case GradleBuildSystem.ID -> Homes.GRADLE.release(home); default -> throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); } } @@ -186,47 +176,4 @@ private ProcessBuilder createProcessBuilder(BuildSystem buildSystem, Path home) throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); } - private static final class Homes { - - private final Set homes = ConcurrentHashMap.newKeySet(); - - private final Queue freeHomes = new ConcurrentLinkedQueue<>(); - - private final AtomicInteger counter = new AtomicInteger(); - - private final String prefix; - - private Homes(String prefix) { - this.prefix = prefix; - } - - Path acquire() { - Path home = this.freeHomes.poll(); - if (home == null) { - home = createTempDirectory(); - this.homes.add(home); - } - return home; - } - - void release(Path home) { - Assert.state(this.homes.contains(home), "Invalid home '%s'".formatted(home)); - this.freeHomes.add(home); - } - - private Path createTempDirectory() { - try { - Path path = TemporaryFiles.getTempDir() - .resolve("homes") - .resolve(this.prefix + "-" + this.counter.getAndIncrement()); - Files.createDirectories(path); - return path; - } - catch (IOException ex) { - throw new UncheckedIOException("Failed to create temp directory", ex); - } - } - - } - } diff --git a/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java b/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java index 3c6fedb07f..49cac91169 100644 --- a/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java +++ b/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java @@ -19,6 +19,7 @@ import java.util.Map; import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.testsupport.TemporaryFiles; /** * A {@link MavenVersionResolver} for tests, which uses a fixed directory for the cache. diff --git a/start-site/src/test/resources/junit-platform.properties b/start-site/src/test/resources/junit-platform.properties index 308777dedb..5c068dfbba 100644 --- a/start-site/src/test/resources/junit-platform.properties +++ b/start-site/src/test/resources/junit-platform.properties @@ -16,4 +16,4 @@ junit.jupiter.execution.parallel.enabled=true junit.jupiter.execution.parallel.config.strategy=custom -junit.jupiter.execution.parallel.config.custom.class=io.spring.start.site.test.JunitMaxParallelismStrategy +junit.jupiter.execution.parallel.config.custom.class=io.spring.start.testsupport.JunitMaxParallelismStrategy diff --git a/test-support/pom.xml b/test-support/pom.xml new file mode 100644 index 0000000000..29137b934e --- /dev/null +++ b/test-support/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + io.spring.start + start-parent + ${revision} + + test-support + Support utilities for tests + + + + org.springframework + spring-core + + + org.junit.jupiter + junit-jupiter-engine + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + io.spring.javaformat + spring-javaformat-maven-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + false + + + + + + diff --git a/test-support/src/main/java/io/spring/start/testsupport/Homes.java b/test-support/src/main/java/io/spring/start/testsupport/Homes.java new file mode 100644 index 0000000000..a13f24dabb --- /dev/null +++ b/test-support/src/main/java/io/spring/start/testsupport/Homes.java @@ -0,0 +1,99 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.testsupport; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Queue; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; + +import org.springframework.util.Assert; + +/** + * Manages Maven and Gradle home directories. + *

    + * The directories are reused, if possible. If no home is available for reuse, a new one + * will be created. + * + * @author Moritz Halbritter + */ +public class Homes { + + /** + * Maven homes. + */ + public static final Homes MAVEN = new Homes("maven-home"); + + /** + * Gradle homes. + */ + public static final Homes GRADLE = new Homes("gradle-home"); + + private final Set homes = ConcurrentHashMap.newKeySet(); + + private final Queue freeHomes = new ConcurrentLinkedQueue<>(); + + private final AtomicInteger counter = new AtomicInteger(); + + private final String prefix; + + public Homes(String prefix) { + this.prefix = prefix; + } + + /** + * Acquires a path to the home. Callers are responsible to call {@link #release(Path)} + * when done. + * @return the path to the home + */ + public Path acquire() { + Path home = this.freeHomes.poll(); + if (home == null) { + home = createTempDirectory(); + this.homes.add(home); + } + return home; + } + + /** + * Releases a path to the home. + * @param home the path to the home + */ + public void release(Path home) { + Assert.state(this.homes.contains(home), "Invalid home '%s'".formatted(home)); + this.freeHomes.add(home); + } + + private Path createTempDirectory() { + try { + Path path = TemporaryFiles.getTempDir() + .resolve("homes") + .resolve(this.prefix + "-" + this.counter.getAndIncrement()); + Files.createDirectories(path); + return path; + } + catch (IOException ex) { + throw new UncheckedIOException("Failed to create temp directory", ex); + } + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/test/JunitMaxParallelismStrategy.java b/test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java similarity index 98% rename from start-site/src/test/java/io/spring/start/site/test/JunitMaxParallelismStrategy.java rename to test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java index 97d3c63bbf..9b0e22f19f 100644 --- a/start-site/src/test/java/io/spring/start/site/test/JunitMaxParallelismStrategy.java +++ b/test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.spring.start.site.test; +package io.spring.start.testsupport; import java.util.concurrent.ForkJoinPool; import java.util.function.Predicate; diff --git a/start-site/src/test/java/io/spring/start/site/test/TemporaryFiles.java b/test-support/src/main/java/io/spring/start/testsupport/TemporaryFiles.java similarity index 98% rename from start-site/src/test/java/io/spring/start/site/test/TemporaryFiles.java rename to test-support/src/main/java/io/spring/start/testsupport/TemporaryFiles.java index 70151d6053..92fab023fe 100644 --- a/start-site/src/test/java/io/spring/start/site/test/TemporaryFiles.java +++ b/test-support/src/main/java/io/spring/start/testsupport/TemporaryFiles.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.spring.start.site.test; +package io.spring.start.testsupport; import java.io.IOException; import java.nio.file.Files; diff --git a/test-support/src/main/java/io/spring/start/testsupport/package-info.java b/test-support/src/main/java/io/spring/start/testsupport/package-info.java new file mode 100644 index 0000000000..1399b403a4 --- /dev/null +++ b/test-support/src/main/java/io/spring/start/testsupport/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Test support classes. + */ +package io.spring.start.testsupport; diff --git a/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java b/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java new file mode 100644 index 0000000000..3411d61ad4 --- /dev/null +++ b/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.testsupport; + +import java.nio.file.Path; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link Homes}. + * + * @author Moritz Halbritter + */ +class HomesTests { + + @Test + void shouldAcquireNewHome() { + Homes homes = new Homes("test"); + Path home1 = homes.acquire(); + Path home2 = homes.acquire(); + assertThat(home1).isNotEqualTo(home2); + homes.release(home1); + Path home3 = homes.acquire(); + assertThat(home3).isEqualTo(home1); + } + +} From ce9eb98a539f0ad19d69dc2b48bfda9a84c12c57 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 21 Aug 2024 10:31:55 +0200 Subject: [PATCH 629/825] Remove unused code --- .../start/site/MetadataVerificationTests.java | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java index dbc1b0b400..e77d6ddd2d 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java +++ b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java @@ -84,24 +84,8 @@ void dependencyStarterConfigurationIsCorrect(Dependency dependency, List collectDependencies(Dependency dependency, List boms, List repositories) { - try { - return DependencyResolver.resolveDependencies(Homes.MAVEN, dependency.getGroupId(), - dependency.getArtifactId(), dependency.getVersion(), boms, repositories); - } - catch (RuntimeException ex) { - // ActiveMQ starter does not exist with Spring Boot 3.0 - if (ex.getMessage().contains("rg.springframework.boot:spring-boot-starter-activemq:pom:")) { - return null; - } - // Known issue with Spring Cloud Contract to be fixed in the next release - // See - // https://github.com/spring-cloud/spring-cloud-contract/commit/13c7d477fbbc856b319600874a11aabcef283df7 - if (ex.getMessage() - .contains("org.springframework.cloud:spring-cloud-starter-contract-verifier:pom:2.2.3.RELEASE")) { - return null; - } - throw ex; - } + return DependencyResolver.resolveDependencies(Homes.MAVEN, dependency.getGroupId(), dependency.getArtifactId(), + dependency.getVersion(), boms, repositories); } Stream parameters() { From 15c8f233e9e03c14048186157a9e28954194aab8 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Mon, 26 Aug 2024 09:46:37 -0600 Subject: [PATCH 630/825] Upgrade to Spring Boot Admin 3.3.3 See gh-1561 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e5e751cd38..2b3a1496d9 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -49,7 +49,7 @@ initializr: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 3.2.3 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.3.2 + version: 3.3.3 netflix-dgs: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-platform-dependencies From 01eeac1ef15dc9c94ccd7cc164d370cd5937396e Mon Sep 17 00:00:00 2001 From: Craig Walls Date: Tue, 27 Aug 2024 10:31:17 -0600 Subject: [PATCH 631/825] Upgrade Spring AI to 1.0.0-M2 See gh-1562 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2b3a1496d9..1190a9bf46 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -88,7 +88,7 @@ initializr: versionProperty: spring-ai.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 1.0.0-M1 + version: 1.0.0-M2 repositories: spring-milestones spring-cloud: groupId: org.springframework.cloud From 9833ffff362d0b09d4600704cbb617c842d3e3b2 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 28 Aug 2024 09:38:56 +0200 Subject: [PATCH 632/825] Add comment to clarify which version of Azure/login we use --- .github/workflows/build-and-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 26f143e065..0ee8f52314 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -36,7 +36,7 @@ jobs: run: ./mvnw --batch-mode --update-snapshots verify - name: Set up Azure - uses: azure/login@6c251865b4e6290e7b78be643ea2d005bc51f69a + uses: azure/login@6c251865b4e6290e7b78be643ea2d005bc51f69a # v2.1.1 with: creds: ${{ secrets.AZURE_CREDENTIALS_SPRING_IO }} From a279ed086bd10cdbcd31f0810fdd33b47401ed6c Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 28 Aug 2024 09:40:38 +0200 Subject: [PATCH 633/825] Update Maven to 3.9.9 Also updates the wrapper to 3.3.2 Closes gh-1564 --- .mvn/wrapper/maven-wrapper.properties | 5 +++-- mvnw | 17 +++++++++++++---- mvnw.cmd | 5 ++++- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index fe378a151d..d58dfb70ba 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -14,5 +14,6 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -wrapperVersion=3.3.1 -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/mvnw b/mvnw index ac8e247e1c..19529ddf8c 100755 --- a/mvnw +++ b/mvnw @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.3.1 +# Apache Maven Wrapper startup batch script, version 3.3.2 # # Optional ENV vars # ----------------- @@ -97,11 +97,19 @@ die() { exit 1 } +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + # parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties while IFS="=" read -r key value; do case "${key-}" in - distributionUrl) distributionUrl="${value-}" ;; - distributionSha256Sum) distributionSha256Sum="${value-}" ;; + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; esac done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" [ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" @@ -131,7 +139,8 @@ esac distributionUrlName="${distributionUrl##*/}" distributionUrlNameMain="${distributionUrlName%.*}" distributionUrlNameMain="${distributionUrlNameMain%-bin}" -MAVEN_HOME="$HOME/.m2/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" exec_maven() { unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : diff --git a/mvnw.cmd b/mvnw.cmd index 7b0c0943b2..249bdf3822 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -19,7 +19,7 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.3.1 +@REM Apache Maven Wrapper startup batch script, version 3.3.2 @REM @REM Optional ENV vars @REM MVNW_REPOURL - repo url base for downloading maven distribution @@ -79,6 +79,9 @@ if ($env:MVNW_REPOURL) { $distributionUrlName = $distributionUrl -replace '^.*/','' $distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' $MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} $MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' $MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" From 9c5e72b8a3ca3d941a813ead2e6d10c35451d0d4 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 28 Aug 2024 10:03:19 +0200 Subject: [PATCH 634/825] Upgrade to Spring Boot 3.3.3 Closes gh-1565 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6e466dea7e..1a0c232bf9 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.2 + 3.3.3 io.spring.start start-parent From efe2ccffd81bea6f3e33a5ed8ff11a1bf841c140 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 28 Aug 2024 10:06:01 +0200 Subject: [PATCH 635/825] Upgrade to Netflix DGS 9.1.0 Closes gh-1566 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 1190a9bf46..7b84148f51 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -58,7 +58,7 @@ initializr: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 8.7.1 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 9.0.4 + version: 9.1.0 sentry: groupId: io.sentry artifactId: sentry-bom From d986d1c5f1aee6499b34bc7c1ccebe64c3b95853 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 28 Aug 2024 10:06:41 +0200 Subject: [PATCH 636/825] Upgrade to DGS Codegen Maven plugin 1.61.5 Closes gh-1567 --- .../extension/dependency/dgs/DgsCodegenVersionResolver.java | 2 +- .../dgs/DgsCodegenProjectGenerationConfigurationTests.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java index d126cc9e46..7fd96a0c26 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java @@ -36,7 +36,7 @@ static String resolve(InitializrMetadata metadata, Version platformVersion, Buil } else if (MavenBuildSystem.ID.equals(build.id())) { // https://github.com/deweyjose/graphqlcodegen/releases - return "1.50"; + return "1.61.5"; } throw new IllegalArgumentException("Could not resolve DGS Codegen version for build system " + build.id()); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java index 538c2a573f..cda1a9a94f 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java @@ -89,7 +89,7 @@ void mavenBuildConfiguresCodegenPlugin() { " ", " io.github.deweyjose", " graphqlcodegen-maven-plugin", - " 1.50", + " 1.61.5", " ", " ", " dgs-codegen", From a7c1d9cc59f12d70832769d8edc5991d248ec3e7 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 28 Aug 2024 10:08:51 +0200 Subject: [PATCH 637/825] Add DGS testing dependency automatically for DGS apps Closes gh-1563 --- .../dependency/dgs/DgsBuildCustomizer.java | 40 ++++++++++++++++ .../DgsProjectGenerationConfiguration.java | 39 +++++++++++++++ .../main/resources/META-INF/spring.factories | 1 + .../dgs/DgsBuildCustomizerTests.java | 47 +++++++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsProjectGenerationConfiguration.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizer.java new file mode 100644 index 0000000000..349ba5b921 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizer.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * A {@link BuildCustomizer} that automatically adds + * "graphql-dgs-spring-graphql-starter-test" when the {@code dgs} dependency is present. + * + * @author Brian Clozel + */ +class DgsBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + build.dependencies() + .add("graphql-dgs-spring-graphql-starter-test", + Dependency.withCoordinates("com.netflix.graphql.dgs", "graphql-dgs-spring-graphql-starter-test") + .scope(DependencyScope.TEST_COMPILE)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsProjectGenerationConfiguration.java new file mode 100644 index 0000000000..be1387b6c1 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsProjectGenerationConfiguration.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; + +import org.springframework.context.annotation.Bean; + +/** + * {@link ProjectGenerationConfiguration} for generation of projects that use the Netflix + * DGS. + * + * @author Brian Clozel + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("netflix-dgs") +class DgsProjectGenerationConfiguration { + + @Bean + DgsBuildCustomizer dgsBuildCustomizer() { + return new DgsBuildCustomizer(); + } + +} diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index f2a5813249..40924849fc 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -7,6 +7,7 @@ io.spring.start.site.extension.dependency.activemq.ActiveMQProjectGenerationConf io.spring.start.site.extension.dependency.activemq.ArtemisProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.cassandra.CassandraProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.derby.DerbyProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.dgs.DgsProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.dgs.DgsCodegenProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.dockercompose.DockerComposeProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.elasticsearch.ElasticsearchProjectGenerationConfiguration,\ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java new file mode 100644 index 0000000000..0dd86da5b9 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class DgsBuildCustomizerTests extends AbstractExtensionTests { + + private Dependency dgsTest; + + @BeforeEach + void setup() { + this.dgsTest = Dependency.withId("graphql-dgs-spring-graphql-starter-test", "com.netflix.graphql.dgs", + "graphql-dgs-spring-graphql-starter-test"); + this.dgsTest.setScope(Dependency.SCOPE_TEST); + } + + @Test + void shouldAddTestingDependency() { + ProjectRequest request = createProjectRequest("web", "netflix-dgs"); + assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("web")) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependency(this.dgsTest) + .hasDependenciesSize(4); + } + +} From 728b4cd2b72b21ae323291035fc5712e082600d1 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Wed, 28 Aug 2024 21:02:48 +0200 Subject: [PATCH 638/825] Upgrade to latest Spring Modulith releases Extend general compatibility to Spring Boot 3.4 (covered by milestones) See gh-1568 --- start-site/src/main/resources/application.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 7b84148f51..67bc97a951 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -130,9 +130,12 @@ initializr: versionProperty: spring-modulith.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 1.1.6 + version: 1.1.8 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 1.2.1 + version: 1.2.3 + - compatibilityRange: "[3.4.0-M1,3.5.0-M1)" + version: 1.3.0-M2 + repositories: spring-milestones spring-shell: groupId: org.springframework.shell artifactId: spring-shell-dependencies @@ -216,7 +219,7 @@ initializr: - name: Spring Modulith id: modulith bom: spring-modulith - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.2.0,3.5.0-M1)" group-id: org.springframework.modulith artifact-id: spring-modulith-starter-core description: Support for building modular monolithic applications. From ef846792d95a3bf1451ceaa24e0d084c5c059fa6 Mon Sep 17 00:00:00 2001 From: Wim Deblauwe Date: Thu, 29 Aug 2024 08:14:25 +0200 Subject: [PATCH 639/825] Update htmx-spring-boot to 3.5.0 See gh-1569 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 67bc97a951..bf2f6d0473 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -362,7 +362,7 @@ initializr: artifactId: htmx-spring-boot description: Build modern user interfaces with the simplicity and power of hypertext. compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 3.4.1 + version: 3.5.0 links: - rel: reference href: https://github.com/wimdeblauwe/htmx-spring-boot From d2102ff7c4f55f8a25f5998e603e96cc4c532fcb Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 29 Aug 2024 07:31:45 -0600 Subject: [PATCH 640/825] Upgrade to Spring Shell 3.2.7 and 3.3.2 See gh-1571 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index bf2f6d0473..8a3c0bf795 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -142,9 +142,9 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 3.2.6 + version: 3.2.7 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.3.1 + version: 3.3.2 timefold-solver: groupId: ai.timefold.solver artifactId: timefold-solver-bom From 4ae354f038c625392fd33eb71d6d881ccca610ae Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 29 Aug 2024 07:35:28 -0600 Subject: [PATCH 641/825] Upgrade to Vaadin 24.4.10 See gh-1572 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8a3c0bf795..47edcb790a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -158,7 +158,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.4.9 + version: 24.4.10 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From d8791aa41b07ac447a28fd303972e0383f288f12 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 29 Aug 2024 07:24:05 -0600 Subject: [PATCH 642/825] Upgrade to Solace Spring Boot 2.2.0 See gh-1570 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 47edcb790a..4c9f87432c 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -72,7 +72,7 @@ initializr: versionProperty: solace-spring-boot.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 2.1.1 + version: 2.2.0 solace-spring-cloud: groupId: com.solace.spring.cloud artifactId: solace-spring-cloud-bom From 1c825ed0bc46cac0bd5f43a3f1bac53d3d465608 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 3 Sep 2024 08:40:45 +0300 Subject: [PATCH 643/825] Upgrade to Vaadin 24.4.11 See gh-1573 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4c9f87432c..0d438aa073 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -158,7 +158,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.4.10 + version: 24.4.11 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 9221bb1f47e38265c33edaad2eeae099c25f85ef Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Mon, 17 Jun 2024 15:11:25 -0400 Subject: [PATCH 644/825] Add starter for Spring AI vector store for Oracle See gh-1514 --- start-site/src/main/resources/application.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0d438aa073..52b1f7630d 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1518,6 +1518,16 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/clients/openai-chat.html + - name: Oracle Vector Database + id: spring-ai-vectordb-oracle + group-id: org.springframework.ai + artifact-id: spring-ai-oracle-store-spring-boot-starter + description: Spring AI vector database support for Oracle. Enables storing, indexing and searching vector embeddings in Oracle Database 23ai. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/oracle.html - name: PGvector Vector Database id: spring-ai-vectordb-pgvector group-id: org.springframework.ai From d2b676d09bf41254912cb9226036a5c4314635c5 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 3 Sep 2024 09:32:24 +0200 Subject: [PATCH 645/825] Upgrade to Spring Cloud GCP 5.6.0 Closes gh-1574 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 52b1f7630d..1c364b78d2 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -114,8 +114,8 @@ initializr: versionProperty: spring-cloud-gcp.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 5.5.0 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 5.6.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies @@ -1381,7 +1381,7 @@ initializr: description: Azure Storage Sample - name: Google Cloud bom: spring-cloud-gcp - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Google Cloud Support id: cloud-gcp From 3e6efe5f8a6a5e8eb92479b8e68ecb4198023772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 4 Sep 2024 17:06:59 -0600 Subject: [PATCH 646/825] Add new entries for Elasticsearch and Typesense vector databases See gh-1575 --- start-site/src/main/resources/application.yml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 1c364b78d2..f9946d74cd 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1458,6 +1458,16 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/vectordbs/chroma.html + - name: Elasticsearch Vector Database + id: spring-ai-vectordb-elasticsearch + group-id: org.springframework.ai + artifact-id: spring-ai-elasticsearch-store-spring-boot-starter + description: Spring AI vector database support for Elasticsearch. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/elasticsearch.html - name: Milvus Vector Database id: spring-ai-vectordb-milvus group-id: org.springframework.ai @@ -1618,6 +1628,16 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/vectordbs/qdrant.html + - name: Typesense Vector Database + id: spring-ai-vectordb-typesense + group-id: org.springframework.ai + artifact-id: spring-ai-typesense-store-spring-boot-starter + description: Spring AI vector database support for Typesense. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/typesense.html - name: Weaviate Vector Database id: spring-ai-vectordb-weaviate group-id: org.springframework.ai From ed3a97dd06b8652068180ec8dbc3203b0b453ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 5 Sep 2024 00:28:25 -0600 Subject: [PATCH 647/825] Generate test application when spring ai redis is selected Add support for Testcontainers and Docker Compose. See gh-1579 --- .../SimpleDockerServiceResolver.java | 8 +++ ...isStackProjectGenerationConfiguration.java | 53 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 1 + ...ckProjectGenerationConfigurationTests.java | 48 +++++++++++++++++ .../test/resources/compose/redis-stack.yaml | 7 +++ 5 files changed, 117 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfiguration.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/resources/compose/redis-stack.yaml diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index ef615d37e5..8e75364f5b 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -50,6 +50,7 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("pulsar", pulsar()); this.dockerServices.put("rabbit", rabbit()); this.dockerServices.put("redis", redis()); + this.dockerServices.put("redisStack", redisStack()); this.dockerServices.put("sqlServer", sqlServer()); this.dockerServices.put("zipkin", zipkin()); } @@ -153,6 +154,13 @@ private static DockerService redis() { return DockerService.withImageAndTag("redis").website("https://hub.docker.com/_/redis").ports(6379).build(); } + private static DockerService redisStack() { + return DockerService.withImageAndTag("redis/redis-stack") + .website("https://hub.docker.com/r/redis/redis-stack") + .ports(6379) + .build(); + } + private static DockerService sqlServer() { return DockerService.withImageAndTag("mcr.microsoft.com/mssql/server") .website("https://mcr.microsoft.com/en-us/product/mssql/server/about/") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfiguration.java new file mode 100644 index 0000000000..0351fa9caa --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfiguration.java @@ -0,0 +1,53 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.redis; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configuration for generation of projects that depend on Redis Stack. + * + * @author Eddú Meléndez + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnRequestedDependency("spring-ai-vectordb-redis") +class RedisStackProjectGenerationConfiguration { + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer redisStackServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("redisStack", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofGenericContainer("redisStack", service, "redis"))); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer redisStackComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("redisStack", + (service) -> composeFile.services() + .add("redis", service + .andThen((builder) -> builder.label("org.springframework.boot.service-connection", "redis")))); + } + +} diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 40924849fc..d5c145a717 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -24,6 +24,7 @@ io.spring.start.site.extension.dependency.oracle.OracleProjectGenerationConfigur io.spring.start.site.extension.dependency.postgresql.PgVectorProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.postgresql.PostgresqlProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.redis.RedisProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.redis.RedisStackProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.sbom.SbomProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.solace.SolaceProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springamqp.SpringAmqpProjectGenerationConfiguration,\ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..44a283445c --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.redis; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link RedisStackProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class RedisStackProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("spring-ai-vectordb-redis"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsRedisStackService() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-redis"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/redis-stack.yaml")); + } + +} diff --git a/start-site/src/test/resources/compose/redis-stack.yaml b/start-site/src/test/resources/compose/redis-stack.yaml new file mode 100644 index 0000000000..2b23270487 --- /dev/null +++ b/start-site/src/test/resources/compose/redis-stack.yaml @@ -0,0 +1,7 @@ +services: + redis: + image: 'redis/redis-stack:latest' + labels: + - "org.springframework.boot.service-connection=redis" + ports: + - '6379' From 39ef0c069fac9eab0ca7fccb90cb5139b31a3b98 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 5 Sep 2024 09:57:08 +0200 Subject: [PATCH 648/825] Polish "Generate test application when spring ai redis is selected" See gh-1579 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f9946d74cd..6ed44af5db 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1572,7 +1572,7 @@ initializr: id: spring-ai-vectordb-redis group-id: org.springframework.ai artifact-id: spring-ai-redis-store-spring-boot-starter - description: Spring AI vector database support for Redis Search and Query.It extends the core features of Redis OSS and allows you to use Redis as a vector database. + description: Spring AI vector database support for Redis Search and Query. It extends the core features of Redis OSS and allows you to use Redis as a vector database. bom: spring-ai starter: true links: From 1c8208a756dbdcb96eb287a8aec04d1910a5fe51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 4 Sep 2024 20:38:42 -0600 Subject: [PATCH 649/825] Add missing test to generate compose file when spring-ai-vectordb-neo4j is selected See gh-1576 --- .../neo4j/Neo4jProjectGenerationConfigurationTests.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java index 33b1bbb945..46891f3d4a 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java @@ -45,4 +45,10 @@ void createsNeo4jService() { assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/neo4j.yaml")); } + @Test + void createsNeo4jServiceWhenSpringAiModuleIsSelected() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-neo4j"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/neo4j.yaml")); + } + } From e02424073626651a3214f87f69acae0e0fa2436b Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 5 Sep 2024 10:09:35 +0200 Subject: [PATCH 650/825] Update yarn lockfile --- start-client/yarn.lock | 1118 ++++++++++++++++++++-------------------- 1 file changed, 551 insertions(+), 567 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 1cf2a984cb..100586f018 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -20,9 +20,9 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.7.tgz#eb2868c1fa384b17ea88d60107577d3e6fd05c4e" - integrity sha512-8dfPprJgV4O14WTx+AQyEA+opgUKPrsIXX/MdL50J1n06EQJ6m1T+CdsJe0qEC0B/Xl85i+Un5KVAxd/PACX9A== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.25.6.tgz#bc35561adc78ade43ac9c09a690768493ab9ed95" + integrity sha512-Z+Doemr4VtvSD2SNHTrkiFZ1LX+JI6tyRXAAOb4N9khIuPyoEPmTPJarPm8ljJV1D6bnMQjyHMWTT9NeKbQuXA== dependencies: "@jridgewell/trace-mapping" "^0.3.25" commander "^6.2.0" @@ -33,7 +33,7 @@ slash "^2.0.0" optionalDependencies: "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" - chokidar "^3.4.0" + chokidar "^3.6.0" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": version "7.24.7" @@ -43,26 +43,26 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" - integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2", "@babel/compat-data@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" - integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helpers" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -70,20 +70,20 @@ semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz#27ebab1a1ec21f48ae191a8aaac5b82baf80d9c7" - integrity sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA== + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz#469cee4bd18a88ff3edbdfbd227bd20e82aa9b82" + integrity sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.24.7", "@babel/generator@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" - integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== dependencies: - "@babel/types" "^7.24.7" + "@babel/types" "^7.25.6" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" @@ -103,42 +103,40 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" - integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - browserslist "^4.22.2" + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b" - integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14" + integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-replace-supers" "^7.25.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/traverse" "^7.25.4" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da" - integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0", "@babel/helper-create-regexp-features-plugin@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" + integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": +"@babel/helper-define-polyfill-provider@^0.6.2": version "0.6.2" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== @@ -149,35 +147,13 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" - integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-hoist-variables@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-member-expression-to-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f" - integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w== +"@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.24.7": version "7.24.7" @@ -187,16 +163,15 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-module-transforms@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" - integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== +"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" "@babel/helper-module-imports" "^7.24.7" "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" "@babel/helper-optimise-call-expression@^7.24.7": version "7.24.7" @@ -205,28 +180,28 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" - integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== -"@babel/helper-remap-async-to-generator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7" - integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA== +"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" + integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-wrap-function" "^7.24.7" + "@babel/helper-wrap-function" "^7.25.0" + "@babel/traverse" "^7.25.0" -"@babel/helper-replace-supers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765" - integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg== +"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" + integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/traverse" "^7.25.0" "@babel/helper-simple-access@^7.24.7": version "7.24.7" @@ -244,45 +219,37 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-split-export-declaration@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" - integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" - integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== -"@babel/helper-validator-option@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" - integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== +"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== -"@babel/helper-wrap-function@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" - integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw== +"@babel/helper-wrap-function@^7.24.7", "@babel/helper-wrap-function@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" + integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== dependencies: - "@babel/helper-function-name" "^7.24.7" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.0" + "@babel/types" "^7.25.0" -"@babel/helpers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" - integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== +"@babel/helpers@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" "@babel/highlight@^7.24.7": version "7.24.7" @@ -294,25 +261,34 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.7", "@babel/parser@^7.7.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" - integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6", "@babel/parser@^7.7.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055" - integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" + integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.3" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107" - integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" + integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" + integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": version "7.24.7" @@ -323,13 +299,13 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-transform-optional-chaining" "^7.24.7" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec" - integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" + integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.0" "@babel/plugin-proposal-class-properties@^7.13.0": version "7.18.6" @@ -473,7 +449,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== @@ -537,20 +513,20 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-import-assertions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" - integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz#bb918905c58711b86f9710d74a3744b6c56573b5" + integrity sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" - integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" + integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -571,7 +547,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -585,7 +561,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -634,7 +610,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -642,11 +618,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" - integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" + integrity sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -663,15 +639,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-async-generator-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz#7330a5c50e05181ca52351b8fd01642000c96cfd" - integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g== +"@babel/plugin-transform-async-generator-functions@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz#2afd4e639e2d055776c9f091b6c0c180ed8cf083" + integrity sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-remap-async-to-generator" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-remap-async-to-generator" "^7.25.0" "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/traverse" "^7.25.4" "@babel/plugin-transform-async-to-generator@^7.24.7": version "7.24.7" @@ -689,20 +665,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoping@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02" - integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ== +"@babel/plugin-transform-block-scoping@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" + integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-class-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" - integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== +"@babel/plugin-transform-class-properties@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz#bae7dbfcdcc2e8667355cd1fb5eda298f05189fd" + integrity sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-class-static-block@^7.24.7": version "7.24.7" @@ -713,18 +689,16 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz#4ae6ef43a12492134138c1e45913f7c46c41b4bf" - integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw== +"@babel/plugin-transform-classes@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz#d29dbb6a72d79f359952ad0b66d88518d65ef89a" + integrity sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/traverse" "^7.25.4" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.24.7": @@ -735,12 +709,12 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/template" "^7.24.7" -"@babel/plugin-transform-destructuring@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz#a097f25292defb6e6cc16d6333a4cfc1e3c72d9e" - integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw== +"@babel/plugin-transform-destructuring@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-dotall-regex@^7.24.7": version "7.24.7" @@ -757,6 +731,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" + integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-transform-dynamic-import@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" @@ -789,14 +771,14 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6" - integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w== +"@babel/plugin-transform-function-name@^7.25.1": + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" + integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== dependencies: - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.1" "@babel/plugin-transform-json-strings@^7.24.7": version "7.24.7" @@ -806,12 +788,12 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c" - integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== +"@babel/plugin-transform-literals@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" + integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-logical-assignment-operators@^7.24.7": version "7.24.7" @@ -836,24 +818,24 @@ "@babel/helper-module-transforms" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-commonjs@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz#9fd5f7fdadee9085886b183f1ad13d1ab260f4ab" - integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ== +"@babel/plugin-transform-modules-commonjs@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" + integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-modules-systemjs@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7" - integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw== +"@babel/plugin-transform-modules-systemjs@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" + integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== dependencies: - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.0" "@babel/plugin-transform-modules-umd@^7.24.7": version "7.24.7" @@ -920,12 +902,12 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz#b8f6848a80cf2da98a8a204429bec04756c6d454" - integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ== +"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" + integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-optional-chaining" "^7.8.3" @@ -936,13 +918,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-methods@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" - integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== +"@babel/plugin-transform-private-methods@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz#9bbefbe3649f470d681997e0b64a4b254d877242" + integrity sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-private-property-in-object@^7.24.7": version "7.24.7" @@ -976,15 +958,15 @@ "@babel/plugin-transform-react-jsx" "^7.24.7" "@babel/plugin-transform-react-jsx@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz#17cd06b75a9f0e2bd076503400e7c4b99beedac4" - integrity sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA== + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a" + integrity sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-syntax-jsx" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/types" "^7.25.2" "@babel/plugin-transform-react-pure-annotations@^7.24.7": version "7.24.7" @@ -1010,14 +992,14 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-runtime@^7.18.5": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca" - integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw== + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz#96e4ad7bfbbe0b4a7b7e6f2a533ca326cf204963" + integrity sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ== dependencies: "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.1" + babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" @@ -1050,12 +1032,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz#f074be466580d47d6e6b27473a840c9f9ca08fb0" - integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg== +"@babel/plugin-transform-typeof-symbol@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" + integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-unicode-escapes@^7.24.7": version "7.24.7" @@ -1080,27 +1062,28 @@ "@babel/helper-create-regexp-features-plugin" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-sets-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" - integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== +"@babel/plugin-transform-unicode-sets-regex@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz#be664c2a0697ffacd3423595d5edef6049e8946c" + integrity sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.7.tgz#ff067b4e30ba4a72f225f12f123173e77b987f37" - integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ== - dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7" + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.4.tgz#be23043d43a34a2721cd0f676c7ba6f1481f6af6" + integrity sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw== + dependencies: + "@babel/compat-data" "^7.25.4" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" @@ -1121,29 +1104,30 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.24.7" - "@babel/plugin-transform-async-generator-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.25.4" "@babel/plugin-transform-async-to-generator" "^7.24.7" "@babel/plugin-transform-block-scoped-functions" "^7.24.7" - "@babel/plugin-transform-block-scoping" "^7.24.7" - "@babel/plugin-transform-class-properties" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.25.0" + "@babel/plugin-transform-class-properties" "^7.25.4" "@babel/plugin-transform-class-static-block" "^7.24.7" - "@babel/plugin-transform-classes" "^7.24.7" + "@babel/plugin-transform-classes" "^7.25.4" "@babel/plugin-transform-computed-properties" "^7.24.7" - "@babel/plugin-transform-destructuring" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.8" "@babel/plugin-transform-dotall-regex" "^7.24.7" "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0" "@babel/plugin-transform-dynamic-import" "^7.24.7" "@babel/plugin-transform-exponentiation-operator" "^7.24.7" "@babel/plugin-transform-export-namespace-from" "^7.24.7" "@babel/plugin-transform-for-of" "^7.24.7" - "@babel/plugin-transform-function-name" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.25.1" "@babel/plugin-transform-json-strings" "^7.24.7" - "@babel/plugin-transform-literals" "^7.24.7" + "@babel/plugin-transform-literals" "^7.25.2" "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" "@babel/plugin-transform-member-expression-literals" "^7.24.7" "@babel/plugin-transform-modules-amd" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.7" - "@babel/plugin-transform-modules-systemjs" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.8" + "@babel/plugin-transform-modules-systemjs" "^7.25.0" "@babel/plugin-transform-modules-umd" "^7.24.7" "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" "@babel/plugin-transform-new-target" "^7.24.7" @@ -1152,9 +1136,9 @@ "@babel/plugin-transform-object-rest-spread" "^7.24.7" "@babel/plugin-transform-object-super" "^7.24.7" "@babel/plugin-transform-optional-catch-binding" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.8" "@babel/plugin-transform-parameters" "^7.24.7" - "@babel/plugin-transform-private-methods" "^7.24.7" + "@babel/plugin-transform-private-methods" "^7.25.4" "@babel/plugin-transform-private-property-in-object" "^7.24.7" "@babel/plugin-transform-property-literals" "^7.24.7" "@babel/plugin-transform-regenerator" "^7.24.7" @@ -1163,16 +1147,16 @@ "@babel/plugin-transform-spread" "^7.24.7" "@babel/plugin-transform-sticky-regex" "^7.24.7" "@babel/plugin-transform-template-literals" "^7.24.7" - "@babel/plugin-transform-typeof-symbol" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.8" "@babel/plugin-transform-unicode-escapes" "^7.24.7" "@babel/plugin-transform-unicode-property-regex" "^7.24.7" "@babel/plugin-transform-unicode-regex" "^7.24.7" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.4" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.31.0" + core-js-compat "^3.37.1" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -1202,43 +1186,40 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" - integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.24.7", "@babel/template@^7.3.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" - integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== +"@babel/template@^7.24.7", "@babel/template@^7.25.0", "@babel/template@^7.3.3": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.24.7", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" - integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.4", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" - integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== dependencies: - "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-string-parser" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" @@ -1260,9 +1241,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": - version "4.10.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" - integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -1858,9 +1839,9 @@ "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" @@ -1979,6 +1960,11 @@ estree-walker "^1.0.1" picomatch "^2.2.2" +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -2088,32 +2074,16 @@ dependencies: "@types/ms" "*" -"@types/eslint-scope@^3.7.3": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.56.10" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" - integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.19.5" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" @@ -2167,9 +2137,9 @@ integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.8": - version "1.17.14" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" - integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== + version "1.17.15" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.15.tgz#12118141ce9775a6499ecb4c01d02f90fc839d36" + integrity sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ== dependencies: "@types/node" "*" @@ -2192,7 +2162,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2237,11 +2207,11 @@ "@types/node" "*" "@types/node@*": - version "20.14.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.8.tgz#45c26a2a5de26c3534a9504530ddb3b27ce031ac" - integrity sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA== + version "22.5.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.4.tgz#83f7d1f65bc2ed223bdbf57c7884f1d5a4fa84e8" + integrity sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg== dependencies: - undici-types "~5.26.4" + undici-types "~6.19.2" "@types/node@16.9.1": version "16.9.1" @@ -2332,14 +2302,14 @@ integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== "@types/unist@^2", "@types/unist@^2.0.0": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" - integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== "@types/ws@^8.5.5": - version "8.5.10" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" - integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + version "8.5.12" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== dependencies: "@types/node" "*" @@ -2356,9 +2326,9 @@ "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" @@ -2599,9 +2569,9 @@ acorn@^6.0.7: integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== acorn@^8.0.4, acorn@^8.11.0, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" - integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -2655,14 +2625,14 @@ ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" - integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.4.1" ansi-escapes@^3.2.0: version "3.2.0" @@ -2801,7 +2771,7 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: +array-includes@^3.1.6, array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -2847,7 +2817,7 @@ array.prototype.findlast@^1.2.5: es-object-atoms "^1.0.0" es-shim-unscopables "^1.0.2" -array.prototype.findlastindex@^1.2.3: +array.prototype.findlastindex@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== @@ -2879,16 +2849,6 @@ array.prototype.flatmap@^1.3.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - array.prototype.tosorted@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" @@ -2952,9 +2912,9 @@ async-foreach@^0.1.3: integrity sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA== async@^3.2.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" @@ -2984,21 +2944,19 @@ aws-sign2@~0.7.0: integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.0.tgz#d9b802e9bb9c248d7be5f7f5ef178dc3684e9dcc" - integrity sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g== + version "1.13.2" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef" + integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== -axe-core@^4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.1.tgz#fcd0f4496dad09e0c899b44f6c4bb7848da912ae" - integrity sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw== +axe-core@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59" + integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g== -axobject-query@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== - dependencies: - deep-equal "^2.0.5" +axobject-query@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== babel-eslint@^10.0.3: version "10.1.0" @@ -3076,13 +3034,13 @@ babel-plugin-polyfill-corejs2@^0.4.10: "@babel/helper-define-polyfill-provider" "^0.6.2" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: - version "0.10.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" - integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== +babel-plugin-polyfill-corejs3@^0.10.6: + version "0.10.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" - core-js-compat "^3.36.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" + core-js-compat "^3.38.0" babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.2" @@ -3092,22 +3050,25 @@ babel-plugin-polyfill-regenerator@^0.6.1: "@babel/helper-define-polyfill-provider" "^0.6.2" babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" babel-preset-jest@^28.1.3: version "28.1.3" @@ -3246,15 +3207,15 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0: - version "4.23.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" - integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== +browserslist@^4.21.10, browserslist@^4.23.1, browserslist@^4.23.3: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: - caniuse-lite "^1.0.30001629" - electron-to-chromium "^1.4.796" - node-releases "^2.0.14" - update-browserslist-db "^1.0.16" + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" bser@2.1.1: version "2.1.1" @@ -3402,16 +3363,23 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001629: - version "1.0.30001636" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78" - integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== +caniuse-lite@^1.0.30001646: + version "1.0.30001657" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001657.tgz#29fd504bffca719d1c6b63a1f6f840be1973a660" + integrity sha512-DPbJAlP8/BAXy3IgiWmZKItubb3TYGP0WscQQlVGIfT4s/YlFYVuJgyOsQNP7rJRChx/qdMeLJQJP0Sgg2yjNA== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +centra@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/centra/-/centra-2.7.0.tgz#4c8312a58436e8a718302011561db7e6a2b0ec18" + integrity sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg== + dependencies: + follow-redirects "^1.15.6" + chalk@^2.1.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3444,7 +3412,7 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0, chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -3480,9 +3448,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + version "1.4.0" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz#677de7ed7efff67cc40c9bf1897fea79d41b5215" + integrity sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g== class-utils@^0.3.5: version "0.3.6" @@ -3750,12 +3718,12 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.37.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" - integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== +core-js-compat@^3.37.1, core-js-compat@^3.38.0: + version "3.38.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" + integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.3" core-util-is@1.0.2: version "1.0.2" @@ -3906,9 +3874,9 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: ms "2.0.0" debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" @@ -4213,10 +4181,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.796: - version "1.4.810" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz#7dee01b090b9e048e6db752f7b30921790230654" - integrity sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ== +electron-to-chromium@^1.5.4: + version "1.5.14" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.14.tgz#8de5fd941f4deede999f90503c4b5923fbe1962b" + integrity sha512-bEfPECb3fJ15eaDnu9LEJ2vPGD6W1vt7vZleSVyFhYuMIKm3vz/g9lt7IvEzgdwj58RjbPKUF2rXTCN/UW47tQ== emittery@^0.10.2: version "0.10.2" @@ -4262,10 +4230,10 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.17.0: - version "5.17.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" - integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== +enhanced-resolve@^5.17.1: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4434,9 +4402,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" @@ -4491,33 +4459,34 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== +eslint-module-utils@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.9.0.tgz#95d4ac038a68cd3f63482659dffe0883900eb342" + integrity sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ== dependencies: debug "^3.2.7" eslint-plugin-import@^2.22.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + version "2.30.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" + integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" array.prototype.flat "^1.3.2" array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" + eslint-module-utils "^2.9.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" tsconfig-paths "^3.15.0" @@ -4529,16 +4498,16 @@ eslint-plugin-jest@^26.5.3: "@typescript-eslint/utils" "^5.10.0" eslint-plugin-jsx-a11y@^6.4.1: - version "6.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8" - integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== + version "6.10.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz#36fb9dead91cafd085ddbe3829602fb10ef28339" + integrity sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg== dependencies: aria-query "~5.1.3" array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" - axe-core "^4.9.1" - axobject-query "~3.1.1" + axe-core "^4.10.0" + axobject-query "^4.1.0" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" es-iterator-helpers "^1.0.19" @@ -4563,28 +4532,28 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.23.2: - version "7.34.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz#9965f27bd1250a787b5d4cfcc765e5a5d58dcb7b" - integrity sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA== + version "7.35.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz#d32500d3ec268656d5071918bfec78cfd8b070ed" + integrity sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" es-iterator-helpers "^1.0.19" estraverse "^5.3.0" + hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" object.entries "^1.1.8" object.fromentries "^2.0.8" - object.hasown "^1.1.4" object.values "^1.2.0" prop-types "^15.8.1" resolve "^2.0.0-next.5" semver "^6.3.1" string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" @@ -4742,9 +4711,9 @@ esprima@^4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1, esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -4985,6 +4954,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + fastest-levenshtein@^1.0.12: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -5181,10 +5155,10 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== -follow-redirects@^1.0.0: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== +follow-redirects@^1.0.0, follow-redirects@^1.15.6: + version "1.15.8" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.8.tgz#ae67b97ae32e0a7b36066a5448938374ec18d13d" + integrity sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig== for-each@^0.3.3: version "0.3.3" @@ -5271,7 +5245,7 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: +function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -5883,9 +5857,9 @@ ignore@^4.0.3, ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.2.0, ignore@^5.2.4: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== image-q@^4.0.0: version "4.0.0" @@ -5900,9 +5874,9 @@ immediate@~3.0.5: integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== immutable@^4.0.0, immutable@^4.0.0-rc.12: - version "4.3.6" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" - integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== import-fresh@^2.0.0: version "2.0.0" @@ -5921,9 +5895,9 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: resolve-from "^4.0.0" import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -6180,10 +6154,10 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== +is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.5.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: hasown "^2.0.2" @@ -6556,9 +6530,9 @@ iterator.prototype@^1.1.2: set-function-name "^2.0.1" jake@^10.8.5: - version "10.9.1" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.1.tgz#8dc96b7fcc41cb19aa502af506da4e1d56f5e62b" - integrity sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w== + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" chalk "^4.0.2" @@ -7199,9 +7173,9 @@ language-tags@^1.0.9: language-subtag-registry "^0.3.20" launch-editor@^2.6.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.8.0.tgz#7255d90bdba414448e2138faa770a74f28451305" - integrity sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA== + version "2.8.2" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.8.2.tgz#939e1b3469f9d5471e4eaacedd51b3b7c45352cd" + integrity sha512-eF5slEUZXmi6WvFzI3dYcv+hA24/iKnROf24HztcURJpSz9RBmBgz5cNCVOeguouf1llrwy6Yctl4C4HM+xI8g== dependencies: picocolors "^1.0.0" shell-quote "^1.8.1" @@ -7247,16 +7221,16 @@ lines-and-columns@^1.1.6: integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== load-bmfont@^1.3.1, load-bmfont@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9" - integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA== + version "1.4.2" + resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.2.tgz#e0f4516064fa5be8439f9c3696c01423a64e8717" + integrity sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog== dependencies: buffer-equal "0.0.1" mime "^1.3.4" parse-bmfont-ascii "^1.0.3" parse-bmfont-binary "^1.0.5" parse-bmfont-xml "^1.1.4" - phin "^2.9.1" + phin "^3.7.1" xhr "^2.0.1" xtend "^4.0.0" @@ -7352,9 +7326,9 @@ lru-cache@^6.0.0: yallist "^4.0.0" luxon@^3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" - integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== + version "3.5.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.5.0.tgz#6b6f65c5cd1d61d1fd19dbf07ee87a50bf4b8e20" + integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ== magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.9" @@ -7764,18 +7738,23 @@ micromatch@^3.1.10: to-regex "^3.0.2" micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +"mime-db@>= 1.43.0 < 2": + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" @@ -8060,10 +8039,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== node-sass@^7.0.1: version "7.0.3" @@ -8227,7 +8206,7 @@ object.entries@^1.1.5, object.entries@^1.1.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -object.fromentries@^2.0.7, object.fromentries@^2.0.8: +object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -8237,7 +8216,7 @@ object.fromentries@^2.0.7, object.fromentries@^2.0.8: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.groupby@^1.0.1: +object.groupby@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== @@ -8246,15 +8225,6 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.hasown@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" - integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== - dependencies: - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -8262,7 +8232,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: +object.values@^1.1.6, object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -8595,10 +8565,17 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== +phin@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/phin/-/phin-3.7.1.tgz#bf841da75ee91286691b10e41522a662aa628fd6" + integrity sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ== + dependencies: + centra "^2.7.0" + picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -8678,9 +8655,9 @@ postcss-modules-values@^4.0.0: icss-utils "^5.0.0" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.1.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" - integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -8691,12 +8668,12 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.4.33: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + version "8.4.45" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.45.tgz#538d13d89a16ef71edbf75d895284ae06b79e603" + integrity sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q== dependencies: nanoid "^3.3.7" - picocolors "^1.0.0" + picocolors "^1.0.1" source-map-js "^1.2.0" prelude-ls@^1.2.1: @@ -9461,9 +9438,9 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.77.6" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.6.tgz#898845c1348078c2e6d1b64f9ee06b3f8bd489e4" - integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q== + version "1.78.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.78.0.tgz#cef369b2f9dc21ea1d2cf22c979f52365da60841" + integrity sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9541,9 +9518,9 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== send@0.18.0: version "0.18.0" @@ -9899,9 +9876,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.18" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz#22aa922dcf2f2885a6494a261f2d8b75345d0326" - integrity sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ== + version "3.0.20" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== spdy-transport@^3.0.0: version "3.0.0" @@ -10083,6 +10060,14 @@ string.prototype.matchall@^4.0.11, string.prototype.matchall@^4.0.6: set-function-name "^2.0.2" side-channel "^1.0.6" +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trim@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" @@ -10320,9 +10305,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.31.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.1.tgz#735de3c987dd671e95190e6b98cfe2f07f3cf0d4" - integrity sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg== + version "5.31.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.6.tgz#c63858a0f0703988d0266a82fcbf2d7ba76422b1" + integrity sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10493,9 +10478,9 @@ tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== tsutils@^3.21.0: version "3.21.0" @@ -10632,10 +10617,10 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" @@ -10770,15 +10755,15 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" - integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: escalade "^3.1.2" picocolors "^1.0.1" -uri-js@^4.2.2, uri-js@^4.4.1: +uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== @@ -10901,9 +10886,9 @@ walker@^1.0.8: makeerror "1.0.12" watchpack@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" - integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -11049,11 +11034,10 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.92.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.92.1.tgz#eca5c1725b9e189cffbd86e8b6c3c7400efc5788" - integrity sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA== + version "5.94.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" + integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== dependencies: - "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" "@webassemblyjs/ast" "^1.12.1" "@webassemblyjs/wasm-edit" "^1.12.1" @@ -11062,7 +11046,7 @@ webpack@^5.73.0: acorn-import-attributes "^1.9.5" browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.0" + enhanced-resolve "^5.17.1" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -11121,12 +11105,12 @@ which-boxed-primitive@^1.0.2: is-symbol "^1.0.3" which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" + integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" is-async-function "^2.0.0" is-date-object "^1.0.5" is-finalizationregistry "^1.0.2" @@ -11135,10 +11119,10 @@ which-builtin-type@^1.1.3: is-weakref "^1.0.2" isarray "^2.0.5" which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" + which-collection "^1.0.2" + which-typed-array "^1.1.15" -which-collection@^1.0.1: +which-collection@^1.0.1, which-collection@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== @@ -11153,7 +11137,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== @@ -11407,9 +11391,9 @@ ws@^7.3.1: integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== ws@^8.13.0: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== xhr@^2.0.1: version "2.6.0" From 0bbca6d5761f0367c8d72a25947bf1506a75d7c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 4 Sep 2024 21:01:18 -0600 Subject: [PATCH 651/825] Generate test application when spring ai oracle is selected Add support for Testcontainers and Docker Compose. See gh-1577 --- .../OracleProjectGenerationConfiguration.java | 29 ++++++++++++++----- .../TestcontainersModuleRegistry.java | 2 +- ...leProjectGenerationConfigurationTests.java | 8 +++++ ...rsProjectGenerationConfigurationTests.java | 1 + 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java index ac7f70ec28..7310d312fb 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package io.spring.start.site.extension.dependency.oracle; +import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; @@ -30,26 +31,38 @@ * * @author Moritz Halbritter * @author Stephane Nicoll + * @author Eddú Meléndez */ @Configuration(proxyBeanMethods = false) -@ConditionalOnRequestedDependency("oracle") class OracleProjectGenerationConfiguration { private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.oracle.OracleContainer"; @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer oracleServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { - return (serviceConnections) -> serviceResolver.doWith("oracleFree", - (service) -> serviceConnections.addServiceConnection( + ServiceConnectionsCustomizer oracleServiceConnectionsCustomizer(Build build, + DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (isOracleEnabled(build)) { + serviceResolver.doWith("oracleFree", (service) -> serviceConnections.addServiceConnection( ServiceConnection.ofContainer("oracleFree", service, TESTCONTAINERS_CLASS_NAME, false))); + } + }; } @Bean @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer oracleComposeFileCustomizer(DockerServiceResolver serviceResolver) { - return (composeFile) -> serviceResolver.doWith("oracleFree", (service) -> composeFile.services() - .add("oracle", service.andThen((builder) -> builder.environment("ORACLE_PASSWORD", "secret")))); + ComposeFileCustomizer oracleComposeFileCustomizer(Build build, DockerServiceResolver serviceResolver) { + return (composeFile) -> { + if (isOracleEnabled(build)) { + serviceResolver.doWith("oracleFree", (service) -> composeFile.services() + .add("oracle", service.andThen((builder) -> builder.environment("ORACLE_PASSWORD", "secret")))); + } + }; + } + + private boolean isOracleEnabled(Build build) { + return build.dependencies().has("oracle") || build.dependencies().has("spring-ai-vectordb-oracle"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 7917ecd839..35cdfff1fb 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -78,7 +78,7 @@ static Iterable create(Version platformVersion) { .customizeHelpDocument(addReferenceLink("MariaDB Module", "databases/mariadb/"))); builders.add(onDependencies("mysql").customizeBuild(addModule("mysql")) .customizeHelpDocument(addReferenceLink("MySQL Module", "databases/mysql/"))); - builders.add(onDependencies("oracle").customizeBuild(addModule("oracle-free")) + builders.add(onDependencies("oracle", "spring-ai-vectordb-oracle").customizeBuild(addModule("oracle-free")) .customizeHelpDocument(addReferenceLink("Oracle-Free Module", "databases/oraclefree/"))); builders.add(onDependencies("postgresql", "spring-ai-vectordb-pgvector").customizeBuild(addModule("postgresql")) .customizeHelpDocument(addReferenceLink("Postgres Module", "databases/postgres/"))); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java index a179303734..4ce6787f76 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java @@ -29,6 +29,7 @@ * Tests for {@link OracleProjectGenerationConfiguration}. * * @author Moritz Halbritter + * @author Eddú Meléndez */ class OracleProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -48,6 +49,13 @@ void createsOracleFreeServiceWithBoot32() { assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle-free.yaml")); } + @Test + void createsOracleFreeServiceWithBoot32AndSpringAi() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-oracle"); + request.setBootVersion(SPRING_BOOT_VERSION); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle-free.yaml")); + } + @Test void declaresOracleFreeContainerBeanWithBoot32() { ProjectRequest request = createProjectRequest("testcontainers", "oracle"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index a18c5e3bbc..722cb3d15d 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -87,6 +87,7 @@ static Stream supportedEntriesBuild320() { Arguments.arguments("oracle", "oracle-free"), Arguments.arguments("pulsar", "pulsar"), Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), Arguments.arguments("spring-ai-vectordb-neo4j", "neo4j"), + Arguments.arguments("spring-ai-vectordb-oracle", "oracle-free"), Arguments.arguments("spring-ai-vectordb-pgvector", "postgresql"), Arguments.arguments("sqlserver", "mssqlserver")); } From 35a4f51ac8ede1a4527d9928cd3684ccf98a8b89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 4 Sep 2024 20:35:52 -0600 Subject: [PATCH 652/825] Generate test application when spring ai elasticsearch is selected See gh-1578 --- ...csearchProjectGenerationConfiguration.java | 38 +++++++++++++------ .../TestcontainersModuleRegistry.java | 3 +- ...chProjectGenerationConfigurationTests.java | 9 ++++- ...rsProjectGenerationConfigurationTests.java | 1 + 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java index 1e74daf882..818d3614cb 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package io.spring.start.site.extension.dependency.elasticsearch; +import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; @@ -30,30 +31,43 @@ * * @author Moritz Halbritter * @author Stephane Nicoll + * @author Eddú Meléndez */ @Configuration(proxyBeanMethods = false) -@ConditionalOnRequestedDependency("data-elasticsearch") class ElasticsearchProjectGenerationConfiguration { private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.elasticsearch.ElasticsearchContainer"; @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer elasticsearchServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { - return (serviceConnections) -> serviceResolver.doWith("elasticsearch", - (service) -> serviceConnections.addServiceConnection( + ServiceConnectionsCustomizer elasticsearchServiceConnectionsCustomizer(Build build, + DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (isElasticsearchEnabled(build)) { + serviceResolver.doWith("elasticsearch", (service) -> serviceConnections.addServiceConnection( ServiceConnection.ofContainer("elasticsearch", service, TESTCONTAINERS_CLASS_NAME, false))); + } + }; } @Bean @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer elasticsearchComposeFileCustomizer(DockerServiceResolver serviceResolver) { - return (composeFile) -> serviceResolver.doWith("elasticsearch", - (service) -> composeFile.services() - .add("elasticsearch", - service.andThen((builder) -> builder.environment("ELASTIC_PASSWORD", "secret") - .environment("xpack.security.enabled", "false") - .environment("discovery.type", "single-node")))); + ComposeFileCustomizer elasticsearchComposeFileCustomizer(Build build, DockerServiceResolver serviceResolver) { + return (composeFile) -> { + if (isElasticsearchEnabled(build)) { + serviceResolver.doWith("elasticsearch", + (service) -> composeFile.services() + .add("elasticsearch", + service.andThen((builder) -> builder.environment("ELASTIC_PASSWORD", "secret") + .environment("xpack.security.enabled", "false") + .environment("discovery.type", "single-node")))); + } + }; + } + + private boolean isElasticsearchEnabled(Build build) { + return build.dependencies().has("data-elasticsearch") + || build.dependencies().has("spring-ai-vectordb-elasticsearch"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 35cdfff1fb..2fa551e2cb 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -62,7 +62,8 @@ static Iterable create(Version platformVersion) { .customizeHelpDocument(addReferenceLink("Cassandra Module", "databases/cassandra/"))); builders.add(onDependencies("data-couchbase", "data-couchbase-reactive").customizeBuild(addModule("couchbase")) .customizeHelpDocument(addReferenceLink("Couchbase Module", "databases/couchbase/"))); - builders.add(onDependencies("data-elasticsearch").customizeBuild(addModule("elasticsearch")) + builders.add(onDependencies("data-elasticsearch", "spring-ai-vectordb-elasticsearch") + .customizeBuild(addModule("elasticsearch")) .customizeHelpDocument(addReferenceLink("Elasticsearch Container", "elasticsearch/"))); builders.add(onDependencies("data-mongodb", "data-mongodb-reactive").customizeBuild(addModule("mongodb")) .customizeHelpDocument(addReferenceLink("MongoDB Module", "databases/mongodb/"))); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java index db81ddf1c6..7bd55b1a60 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ * Tests for {@link ElasticsearchProjectGenerationConfiguration}. * * @author Moritz Halbritter + * @author Eddú Meléndez */ class ElasticsearchProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -45,4 +46,10 @@ void createsElasticsearchService() { assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/elasticsearch.yaml")); } + @Test + void createsElasticsearchServiceWhenSpringAiModuleIsSelected() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-elasticsearch"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/elasticsearch.yaml")); + } + } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 722cb3d15d..6186931933 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -86,6 +86,7 @@ static Stream supportedEntriesBuild320() { Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), Arguments.arguments("oracle", "oracle-free"), Arguments.arguments("pulsar", "pulsar"), Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), + Arguments.arguments("spring-ai-vectordb-elasticsearch", "elasticsearch"), Arguments.arguments("spring-ai-vectordb-neo4j", "neo4j"), Arguments.arguments("spring-ai-vectordb-oracle", "oracle-free"), Arguments.arguments("spring-ai-vectordb-pgvector", "postgresql"), From 25f499832ef72da7ab3159f03c73c8b593f270cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 5 Sep 2024 10:47:47 +0200 Subject: [PATCH 653/825] Generate test apps for spring-ai projects Add support for Testcontainers and Docker Compose. See gh-1484 --- .../SimpleDockerServiceResolver.java | 40 ++++++++++++ ...iChromaProjectGenerationConfiguration.java | 64 +++++++++++++++++++ ...ComposeProjectGenerationConfiguration.java | 52 +++++++++++++++ ...iMilvusProjectGenerationConfiguration.java | 52 +++++++++++++++ ...iOllamaProjectGenerationConfiguration.java | 64 +++++++++++++++++++ ...iQdrantProjectGenerationConfiguration.java | 64 +++++++++++++++++++ ...tainersProjectGenerationConfiguration.java | 52 +++++++++++++++ .../dependency/springai/SpringAiVersion.java | 42 ++++++++++++ ...eaviateProjectGenerationConfiguration.java | 64 +++++++++++++++++++ .../dependency/springai/package-info.java | 20 ++++++ .../TestcontainersModuleRegistry.java | 14 ++++ .../main/resources/META-INF/spring.factories | 7 ++ ...maProjectGenerationConfigurationTests.java | 48 ++++++++++++++ ...seProjectGenerationConfigurationTests.java | 55 ++++++++++++++++ ...maProjectGenerationConfigurationTests.java | 48 ++++++++++++++ ...ntProjectGenerationConfigurationTests.java | 48 ++++++++++++++ ...rsProjectGenerationConfigurationTests.java | 55 ++++++++++++++++ ...teProjectGenerationConfigurationTests.java | 48 ++++++++++++++ ...rsProjectGenerationConfigurationTests.java | 18 ++++++ .../src/test/resources/compose/chroma.yaml | 5 ++ .../src/test/resources/compose/ollama.yaml | 5 ++ .../src/test/resources/compose/qdrant.yaml | 5 ++ .../src/test/resources/compose/weaviate.yaml | 5 ++ 23 files changed, 875 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMilvusProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiVersion.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/package-info.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/resources/compose/chroma.yaml create mode 100644 start-site/src/test/resources/compose/ollama.yaml create mode 100644 start-site/src/test/resources/compose/qdrant.yaml create mode 100644 start-site/src/test/resources/compose/weaviate.yaml diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index 8e75364f5b..e7c9928132 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -38,20 +38,25 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("activeMQClassic", activeMQClassic()); this.dockerServices.put("artemis", artemis()); this.dockerServices.put("cassandra", cassandra()); + this.dockerServices.put("chroma", chroma()); this.dockerServices.put("elasticsearch", elasticsearch()); this.dockerServices.put("kafka", kafka()); this.dockerServices.put("mariaDb", mariaDb()); + this.dockerServices.put("milvus", milvus()); this.dockerServices.put("mongoDb", mongoDb()); this.dockerServices.put("mysql", mysql()); this.dockerServices.put("neo4j", neo4j()); + this.dockerServices.put("ollama", ollama()); this.dockerServices.put("oracleFree", oracleFree()); this.dockerServices.put("pgvector", pgvector()); this.dockerServices.put("postgres", postgres()); this.dockerServices.put("pulsar", pulsar()); + this.dockerServices.put("qdrant", qdrant()); this.dockerServices.put("rabbit", rabbit()); this.dockerServices.put("redis", redis()); this.dockerServices.put("redisStack", redisStack()); this.dockerServices.put("sqlServer", sqlServer()); + this.dockerServices.put("weaviate", weaviate()); this.dockerServices.put("zipkin", zipkin()); } @@ -83,6 +88,13 @@ private static DockerService cassandra() { .build(); } + private static DockerService chroma() { + return DockerService.withImageAndTag("chromadb/chroma") + .website("https://hub.docker.com/r/chromadb/chroma") + .ports(8000) + .build(); + } + private static DockerService elasticsearch() { // They don't provide a 'latest' tag return DockerService.withImageAndTag("docker.elastic.co/elasticsearch/elasticsearch:7.17.10") @@ -102,6 +114,13 @@ private static DockerService mariaDb() { return DockerService.withImageAndTag("mariadb").website("https://hub.docker.com/_/mariadb").ports(3306).build(); } + private static DockerService milvus() { + return DockerService.withImageAndTag("milvusdb/milvus") + .website("https://hub.docker.com/r/milvusdb/milvus") + .ports(19530) + .build(); + } + private static DockerService mongoDb() { return DockerService.withImageAndTag("mongo").website("https://hub.docker.com/_/mongo").ports(27017).build(); } @@ -114,6 +133,13 @@ private static DockerService neo4j() { return DockerService.withImageAndTag("neo4j").website("https://hub.docker.com/_/neo4j").ports(7687).build(); } + private static DockerService ollama() { + return DockerService.withImageAndTag("ollama/ollama") + .website("https://hub.docker.com/r/ollama/ollama") + .ports(11434) + .build(); + } + private static DockerService oracleFree() { return DockerService.withImageAndTag("gvenzl/oracle-free") .website("https://hub.docker.com/r/gvenzl/oracle-free") @@ -143,6 +169,13 @@ private static DockerService pulsar() { .build(); } + private static DockerService qdrant() { + return DockerService.withImageAndTag("qdrant/qdrant") + .website("https://hub.docker.com/r/qdrant/qdrant") + .ports(6334) + .build(); + } + private static DockerService rabbit() { return DockerService.withImageAndTag("rabbitmq") .website("https://hub.docker.com/_/rabbitmq") @@ -168,6 +201,13 @@ private static DockerService sqlServer() { .build(); } + private static DockerService weaviate() { + return DockerService.withImageAndTag("semitechnologies/weaviate") + .website("https://hub.docker.com/r/semitechnologies/weaviate") + .ports(8080) + .build(); + } + private static DockerService zipkin() { return DockerService.withImageAndTag("openzipkin/zipkin") .website("https://hub.docker.com/r/openzipkin/zipkin/") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfiguration.java new file mode 100644 index 0000000000..129be44dbb --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfiguration.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Chroma. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-ai-vectordb-chroma") +class SpringAiChromaProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.chromadb.ChromaDBContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer chromaServiceConnectionsCustomizer(InitializrMetadata metadata, + ProjectDescription description, DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { + serviceResolver.doWith("chroma", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("chroma", service, TESTCONTAINERS_CLASS_NAME))); + } + }; + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer chromaComposeFileCustomizer(InitializrMetadata metadata, ProjectDescription description, + DockerServiceResolver serviceResolver) { + return (composeFile) -> { + if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { + serviceResolver.doWith("chroma", (service) -> composeFile.services().add("chroma", service)); + } + }; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java new file mode 100644 index 0000000000..07241d26f4 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java @@ -0,0 +1,52 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.metadata.InitializrMetadata; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring AI Docker Compose. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("docker-compose") +class SpringAiDockerComposeProjectGenerationConfiguration { + + @Bean + BuildCustomizer springAiDockerComposeBuildCustomizer(InitializrMetadata metadata, + ProjectDescription description) { + return (build) -> { + if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { + build.dependencies() + .add("spring-ai-docker-compose", + Dependency.withCoordinates("org.springframework.ai", "spring-ai-spring-boot-docker-compose") + .scope(DependencyScope.TEST_COMPILE)); + } + }; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMilvusProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMilvusProjectGenerationConfiguration.java new file mode 100644 index 0000000000..80973d72f5 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMilvusProjectGenerationConfiguration.java @@ -0,0 +1,52 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Milvus. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-ai-vectordb-milvus") +class SpringAiMilvusProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.milvus.MilvusContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer milvusServiceConnectionsCustomizer(InitializrMetadata metadata, + ProjectDescription description, DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { + serviceResolver.doWith("milvus", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("milvus", service, TESTCONTAINERS_CLASS_NAME))); + } + }; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfiguration.java new file mode 100644 index 0000000000..fea79e3092 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfiguration.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Ollama. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-ai-ollama") +class SpringAiOllamaProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.ollama.OllamaContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer ollamaServiceConnectionsCustomizer(InitializrMetadata metadata, + ProjectDescription description, DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { + serviceResolver.doWith("ollama", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("ollama", service, TESTCONTAINERS_CLASS_NAME))); + } + }; + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer ollamaComposeFileCustomizer(InitializrMetadata metadata, ProjectDescription description, + DockerServiceResolver serviceResolver) { + return (composeFile) -> { + if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { + serviceResolver.doWith("ollama", (service) -> composeFile.services().add("ollama", service)); + } + }; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfiguration.java new file mode 100644 index 0000000000..a9a4004980 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfiguration.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Qdrant. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-ai-vectordb-qdrant") +class SpringAiQdrantProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.qdrant.QdrantContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer qdrantServiceConnectionsCustomizer(InitializrMetadata metadata, + ProjectDescription description, DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { + serviceResolver.doWith("qdrant", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("qdrant", service, TESTCONTAINERS_CLASS_NAME))); + } + }; + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer qdrantComposeFileCustomizer(InitializrMetadata metadata, ProjectDescription description, + DockerServiceResolver serviceResolver) { + return (composeFile) -> { + if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { + serviceResolver.doWith("qdrant", (service) -> composeFile.services().add("qdrant", service)); + } + }; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfiguration.java new file mode 100644 index 0000000000..1df9e88b2f --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfiguration.java @@ -0,0 +1,52 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.metadata.InitializrMetadata; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring AI Testcontainers. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("testcontainers") +class SpringAiTestcontainersProjectGenerationConfiguration { + + @Bean + BuildCustomizer springAiTestcontainersBuildCustomizer(InitializrMetadata metadata, + ProjectDescription description) { + return (build) -> { + if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { + build.dependencies() + .add("spring-ai-testcontainers", + Dependency.withCoordinates("org.springframework.ai", "spring-ai-spring-boot-testcontainers") + .scope(DependencyScope.TEST_COMPILE)); + } + }; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiVersion.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiVersion.java new file mode 100644 index 0000000000..38b681c060 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiVersion.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; +import io.spring.initializr.metadata.InitializrMetadata; + +final class SpringAiVersion { + + private static final VersionRange SPRING_AI_1_0_0_OR_LATER = VersionParser.DEFAULT.parseRange("1.0.0-M2"); + + private SpringAiVersion() { + + } + + static boolean version1OrLater(InitializrMetadata metadata, Version platformVersion) { + var springAiBomVersion = metadata.getConfiguration() + .getEnv() + .getBoms() + .get("spring-ai") + .resolve(platformVersion) + .getVersion(); + return SPRING_AI_1_0_0_OR_LATER.match(Version.parse(springAiBomVersion)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfiguration.java new file mode 100644 index 0000000000..b6f4c63e15 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfiguration.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Weaviate. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-ai-vectordb-weaviate") +class SpringAiWeaviateProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.weaviate.WeaviateContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer weaviateServiceConnectionsCustomizer(InitializrMetadata metadata, + ProjectDescription description, DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { + serviceResolver.doWith("weaviate", (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("weaviate", service, TESTCONTAINERS_CLASS_NAME))); + } + }; + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer weaviateComposeFileCustomizer(InitializrMetadata metadata, ProjectDescription description, + DockerServiceResolver serviceResolver) { + return (composeFile) -> { + if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { + serviceResolver.doWith("weaviate", (service) -> composeFile.services().add("weaviate", service)); + } + }; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/package-info.java new file mode 100644 index 0000000000..94f77d1eaa --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on Spring AI. + */ +package io.spring.start.site.extension.dependency.springai; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 2fa551e2cb..334b564111 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -42,6 +42,8 @@ abstract class TestcontainersModuleRegistry { private static final VersionRange SPRING_BOOT_3_3_0_M2_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0-M2"); + private static final VersionRange SPRING_BOOT_3_3_0_M3_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0-M3"); + static Iterable create(Version platformVersion) { List builders = new ArrayList<>(); if (SPRING_BOOT_3_3_0_M2_OR_LATER.match(platformVersion)) { @@ -89,6 +91,18 @@ static Iterable create(Version platformVersion) { .customizeHelpDocument(addReferenceLink("Solace Module", "solace/"))); builders.add(onDependencies("sqlserver").customizeBuild(addModule("mssqlserver")) .customizeHelpDocument(addReferenceLink("MS SQL Server Module", "databases/mssqlserver/"))); + if (SPRING_BOOT_3_3_0_M3_OR_LATER.match(platformVersion)) { + builders.add(onDependencies("spring-ai-vectordb-chroma").customizeBuild(addModule("chromadb")) + .customizeHelpDocument(addReferenceLink("Chroma Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-vectordb-milvus").customizeBuild(addModule("milvus")) + .customizeHelpDocument(addReferenceLink("Milvus Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-ollama").customizeBuild(addModule("ollama")) + .customizeHelpDocument(addReferenceLink("Ollama Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-vectordb-qdrant").customizeBuild(addModule("qdrant")) + .customizeHelpDocument(addReferenceLink("Qdrant Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-vectordb-weaviate").customizeBuild(addModule("weaviate")) + .customizeHelpDocument(addReferenceLink("Weaviate Module", "testcontainers/"))); + } return builders.stream().map(Builder::build).collect(Collectors.toList()); } diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index d5c145a717..da59fbe1f5 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -27,6 +27,13 @@ io.spring.start.site.extension.dependency.redis.RedisProjectGenerationConfigurat io.spring.start.site.extension.dependency.redis.RedisStackProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.sbom.SbomProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.solace.SolaceProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiChromaProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiDockerComposeProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiMilvusProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiOllamaProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiQdrantProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiTestcontainersProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiWeaviateProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springamqp.SpringAmqpProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springazure.SpringAzureProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springboot.SpringBootProjectGenerationConfiguration,\ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..84549936da --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiChromaProjectGenerationConfiguration} + * + * @author Eddú Meléndez + */ +class SpringAiChromaProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("web", "spring-ai-vectordb-chroma"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsChromaService() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-chroma"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/chroma.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..587a1e247b --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java @@ -0,0 +1,55 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import java.util.stream.Stream; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiDockerComposeProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class SpringAiDockerComposeProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @ParameterizedTest + @MethodSource("supportedDockerComposeSpringAiEntriesBuild") + void springAiTestcontainersDependencyIsAdded(String springAiDependency) { + ProjectRequest projectRequest = createProject("3.3.0", "docker-compose", springAiDependency); + assertThat(mavenPom(projectRequest)).hasDependency("org.springframework.ai", + "spring-ai-spring-boot-docker-compose", null, "test"); + } + + private ProjectRequest createProject(String springBootVersion, String... styles) { + ProjectRequest projectRequest = createProjectRequest(styles); + projectRequest.setLanguage("java"); + projectRequest.setBootVersion(springBootVersion); + return projectRequest; + } + + static Stream supportedDockerComposeSpringAiEntriesBuild() { + return Stream.of("spring-ai-vectordb-chroma", "spring-ai-vectordb-milvus", "spring-ai-ollama", + "spring-ai-vectordb-qdrant", "spring-ai-vectordb-weaviate"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..aab0aa859d --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiOllamaProjectGenerationConfiguration} + * + * @author Eddú Meléndez + */ +class SpringAiOllamaProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("web", "spring-ai-ollama"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsOllamaService() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-ollama"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/ollama.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..aea6c230f9 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiQdrantProjectGenerationConfiguration} + * + * @author Eddú Meléndez + */ +class SpringAiQdrantProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("web", "spring-ai-vectordb-qdrant"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsQdrantService() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-qdrant"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/qdrant.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..a63b1ad8df --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java @@ -0,0 +1,55 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import java.util.stream.Stream; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiTestcontainersProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class SpringAiTestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @ParameterizedTest + @MethodSource("supportedTestcontainersSpringAiEntriesBuild") + void springAiTestcontainersDependencyIsAdded(String springAiDependency) { + ProjectRequest projectRequest = createProject("3.3.0", "testcontainers", springAiDependency); + assertThat(mavenPom(projectRequest)).hasDependency("org.springframework.ai", + "spring-ai-spring-boot-testcontainers", null, "test"); + } + + private ProjectRequest createProject(String springBootVersion, String... styles) { + ProjectRequest projectRequest = createProjectRequest(styles); + projectRequest.setLanguage("java"); + projectRequest.setBootVersion(springBootVersion); + return projectRequest; + } + + static Stream supportedTestcontainersSpringAiEntriesBuild() { + return Stream.of("spring-ai-vectordb-chroma", "spring-ai-vectordb-milvus", "spring-ai-ollama", + "spring-ai-vectordb-qdrant", "spring-ai-vectordb-weaviate"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..8560dd744e --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiWeaviateProjectGenerationConfiguration} + * + * @author Eddú Meléndez + */ +class SpringAiWeaviateProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("web", "spring-ai-vectordb-qdrant"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsWeaviateService() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-weaviate"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/weaviate.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 6186931933..f9421a31b0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -71,6 +71,17 @@ void buildWithSpringBoot33AndTestcontainersActiveMQModule(String springBootDepen .hasDependency(getDependency("testcontainers")); } + @ParameterizedTest + @MethodSource("supportedTestcontainersSpringAiEntriesBuild") + void buildWithSpringBoot33M3AndTestcontainersSpringAiModule(String springBootDependencyId, + String testcontainersArtifactId) { + assertThat(generateProject(SPRING_BOOT_VERSION_3_3, "testcontainers", springBootDependencyId)).mavenBuild() + .doesNotHaveBom("org.testcontainers", "testcontainers-bom") + .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.3.0"))) + .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") + .hasDependency(getDependency("testcontainers")); + } + static Stream supportedEntriesBuild320() { return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.of("amqp-streams", "rabbitmq"), Arguments.arguments("cloud-gcp", "gcloud"), Arguments.arguments("cloud-gcp-pubsub", "gcloud"), @@ -97,6 +108,13 @@ static Stream supportedTestcontainersActiveMQEntriesBuild() { return Stream.of(Arguments.arguments("activemq", "activemq"), Arguments.arguments("artemis", "activemq")); } + static Stream supportedTestcontainersSpringAiEntriesBuild() { + return Stream.of(Arguments.arguments("spring-ai-vectordb-chroma", "chromadb"), + Arguments.arguments("spring-ai-vectordb-milvus", "milvus"), + Arguments.arguments("spring-ai-vectordb-qdrant", "qdrant"), + Arguments.arguments("spring-ai-vectordb-weaviate", "weaviate")); + } + @ParameterizedTest @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsPresentIsAdded(String dependencyId, String docHref) { diff --git a/start-site/src/test/resources/compose/chroma.yaml b/start-site/src/test/resources/compose/chroma.yaml new file mode 100644 index 0000000000..9f00255351 --- /dev/null +++ b/start-site/src/test/resources/compose/chroma.yaml @@ -0,0 +1,5 @@ +services: + chroma: + image: 'chromadb/chroma:latest' + ports: + - '8000' diff --git a/start-site/src/test/resources/compose/ollama.yaml b/start-site/src/test/resources/compose/ollama.yaml new file mode 100644 index 0000000000..60ccf775b2 --- /dev/null +++ b/start-site/src/test/resources/compose/ollama.yaml @@ -0,0 +1,5 @@ +services: + ollama: + image: 'ollama/ollama:latest' + ports: + - '11434' diff --git a/start-site/src/test/resources/compose/qdrant.yaml b/start-site/src/test/resources/compose/qdrant.yaml new file mode 100644 index 0000000000..01613ae2fd --- /dev/null +++ b/start-site/src/test/resources/compose/qdrant.yaml @@ -0,0 +1,5 @@ +services: + qdrant: + image: 'qdrant/qdrant:latest' + ports: + - '6334' diff --git a/start-site/src/test/resources/compose/weaviate.yaml b/start-site/src/test/resources/compose/weaviate.yaml new file mode 100644 index 0000000000..4dac3a88bb --- /dev/null +++ b/start-site/src/test/resources/compose/weaviate.yaml @@ -0,0 +1,5 @@ +services: + weaviate: + image: 'semitechnologies/weaviate:latest' + ports: + - '8080' From f11444906acc370817bc4939c7777d41708dc156 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 5 Sep 2024 11:18:46 +0200 Subject: [PATCH 654/825] Polish "Generate test apps for spring-ai projects" See gh-1484 --- ...ditionalOnRequestedSpringAiDependency.java | 43 +++++++++++++ ...nRequestedSpringAiDependencyCondition.java | 45 ++++++++++++++ ...iChromaProjectGenerationConfiguration.java | 23 ++----- ...ComposeProjectGenerationConfiguration.java | 31 +++++++--- ...iMilvusProjectGenerationConfiguration.java | 13 +--- ...iOllamaProjectGenerationConfiguration.java | 23 ++----- ...iQdrantProjectGenerationConfiguration.java | 23 ++----- ...tainersProjectGenerationConfiguration.java | 18 ++---- .../dependency/springai/SpringAiVersion.java | 42 ------------- ...eaviateProjectGenerationConfiguration.java | 24 +++----- ...ingBootProjectGenerationConfiguration.java | 25 ++++++++ .../TestcontainersModuleRegistry.java | 8 +-- ...estedSpringAiDependencyConditionTests.java | 60 +++++++++++++++++++ ...seProjectGenerationConfigurationTests.java | 17 ++++-- ...rsProjectGenerationConfigurationTests.java | 21 +++++-- 15 files changed, 260 insertions(+), 156 deletions(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/ConditionalOnRequestedSpringAiDependency.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyCondition.java delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiVersion.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyConditionTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/ConditionalOnRequestedSpringAiDependency.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/ConditionalOnRequestedSpringAiDependency.java new file mode 100644 index 0000000000..7c9d263077 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/ConditionalOnRequestedSpringAiDependency.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import io.spring.initializr.generator.project.ProjectDescription; + +import org.springframework.context.annotation.Conditional; + +/** + * Condition that matches when a {@link ProjectDescription} defines a dependency on Spring + * AI. A generated project may ultimately define a different set of dependencies according + * to the contributors that have been executed. To contribute to the project according to + * the real set, prefer querying the model itself rather than using this condition. + * + * @author Moritz Halbritter + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Documented +@Conditional(OnRequestedSpringAiDependencyCondition.class) +@interface ConditionalOnRequestedSpringAiDependency { + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyCondition.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyCondition.java new file mode 100644 index 0000000000..9546f27758 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyCondition.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.condition.ProjectGenerationCondition; +import io.spring.initializr.generator.project.ProjectDescription; + +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +/** + * {@link ProjectGenerationCondition} implementation for + * {@link ConditionalOnRequestedSpringAiDependency}. + * + * @author Moritz Halbritter + */ +class OnRequestedSpringAiDependencyCondition extends ProjectGenerationCondition { + + @Override + protected boolean matches(ProjectDescription description, ConditionContext context, + AnnotatedTypeMetadata metadata) { + for (Dependency dependency : description.getRequestedDependencies().values()) { + if (dependency.getGroupId().equals("org.springframework.ai")) { + return true; + } + } + return false; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfiguration.java index 129be44dbb..c45ff6da9a 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfiguration.java @@ -17,9 +17,7 @@ package io.spring.start.site.extension.dependency.springai; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.metadata.InitializrMetadata; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections.ServiceConnection; @@ -40,25 +38,16 @@ class SpringAiChromaProjectGenerationConfiguration { @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer chromaServiceConnectionsCustomizer(InitializrMetadata metadata, - ProjectDescription description, DockerServiceResolver serviceResolver) { - return (serviceConnections) -> { - if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { - serviceResolver.doWith("chroma", (service) -> serviceConnections - .addServiceConnection(ServiceConnection.ofContainer("chroma", service, TESTCONTAINERS_CLASS_NAME))); - } - }; + ServiceConnectionsCustomizer chromaServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("chroma", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("chroma", service, TESTCONTAINERS_CLASS_NAME, false))); } @Bean @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer chromaComposeFileCustomizer(InitializrMetadata metadata, ProjectDescription description, - DockerServiceResolver serviceResolver) { - return (composeFile) -> { - if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { - serviceResolver.doWith("chroma", (service) -> composeFile.services().add("chroma", service)); - } - }; + ComposeFileCustomizer chromaComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("chroma", + (service) -> composeFile.services().add("chroma", service)); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java index 07241d26f4..85e90d580b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java @@ -23,6 +23,8 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.generator.version.VersionProperty; +import io.spring.initializr.generator.version.VersionReference; import io.spring.initializr.metadata.InitializrMetadata; import org.springframework.context.annotation.Bean; @@ -34,19 +36,30 @@ */ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("docker-compose") -class SpringAiDockerComposeProjectGenerationConfiguration { +@ConditionalOnRequestedSpringAiDependency +public class SpringAiDockerComposeProjectGenerationConfiguration { + + /** + * Dependency id of + * {@code org.springframework.ai:spring-ai-spring-boot-docker-compose}. + */ + public static final String DEPENDENCY_ID = "spring-ai-docker-compose"; @Bean BuildCustomizer springAiDockerComposeBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { - return (build) -> { - if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { - build.dependencies() - .add("spring-ai-docker-compose", - Dependency.withCoordinates("org.springframework.ai", "spring-ai-spring-boot-docker-compose") - .scope(DependencyScope.TEST_COMPILE)); - } - }; + // spring-ai-spring-boot-docker-compose is not managed in the BOM + // See https://github.com/spring-projects/spring-ai/issues/1314 + VersionProperty springAiBomVersion = getSpringAiVersion(metadata, description); + return (build) -> build.dependencies() + .add(DEPENDENCY_ID, + Dependency.withCoordinates("org.springframework.ai", "spring-ai-spring-boot-docker-compose") + .version(VersionReference.ofProperty(springAiBomVersion)) + .scope(DependencyScope.RUNTIME)); + } + + private static VersionProperty getSpringAiVersion(InitializrMetadata metadata, ProjectDescription description) { + return metadata.getConfiguration().getEnv().getBoms().get("spring-ai").getVersionProperty(); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMilvusProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMilvusProjectGenerationConfiguration.java index 80973d72f5..2a20b5117f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMilvusProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMilvusProjectGenerationConfiguration.java @@ -17,9 +17,7 @@ package io.spring.start.site.extension.dependency.springai; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.metadata.InitializrMetadata; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections.ServiceConnection; import io.spring.start.site.container.ServiceConnectionsCustomizer; @@ -39,14 +37,9 @@ class SpringAiMilvusProjectGenerationConfiguration { @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer milvusServiceConnectionsCustomizer(InitializrMetadata metadata, - ProjectDescription description, DockerServiceResolver serviceResolver) { - return (serviceConnections) -> { - if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { - serviceResolver.doWith("milvus", (service) -> serviceConnections - .addServiceConnection(ServiceConnection.ofContainer("milvus", service, TESTCONTAINERS_CLASS_NAME))); - } - }; + ServiceConnectionsCustomizer milvusServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("milvus", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("milvus", service, TESTCONTAINERS_CLASS_NAME, false))); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfiguration.java index fea79e3092..be2561d3e9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfiguration.java @@ -17,9 +17,7 @@ package io.spring.start.site.extension.dependency.springai; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.metadata.InitializrMetadata; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections.ServiceConnection; @@ -40,25 +38,16 @@ class SpringAiOllamaProjectGenerationConfiguration { @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer ollamaServiceConnectionsCustomizer(InitializrMetadata metadata, - ProjectDescription description, DockerServiceResolver serviceResolver) { - return (serviceConnections) -> { - if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { - serviceResolver.doWith("ollama", (service) -> serviceConnections - .addServiceConnection(ServiceConnection.ofContainer("ollama", service, TESTCONTAINERS_CLASS_NAME))); - } - }; + ServiceConnectionsCustomizer ollamaServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("ollama", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("ollama", service, TESTCONTAINERS_CLASS_NAME, false))); } @Bean @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer ollamaComposeFileCustomizer(InitializrMetadata metadata, ProjectDescription description, - DockerServiceResolver serviceResolver) { - return (composeFile) -> { - if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { - serviceResolver.doWith("ollama", (service) -> composeFile.services().add("ollama", service)); - } - }; + ComposeFileCustomizer ollamaComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("ollama", + (service) -> composeFile.services().add("ollama", service)); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfiguration.java index a9a4004980..23c6721983 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfiguration.java @@ -17,9 +17,7 @@ package io.spring.start.site.extension.dependency.springai; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.metadata.InitializrMetadata; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections.ServiceConnection; @@ -40,25 +38,16 @@ class SpringAiQdrantProjectGenerationConfiguration { @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer qdrantServiceConnectionsCustomizer(InitializrMetadata metadata, - ProjectDescription description, DockerServiceResolver serviceResolver) { - return (serviceConnections) -> { - if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { - serviceResolver.doWith("qdrant", (service) -> serviceConnections - .addServiceConnection(ServiceConnection.ofContainer("qdrant", service, TESTCONTAINERS_CLASS_NAME))); - } - }; + ServiceConnectionsCustomizer qdrantServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("qdrant", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("qdrant", service, TESTCONTAINERS_CLASS_NAME, false))); } @Bean @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer qdrantComposeFileCustomizer(InitializrMetadata metadata, ProjectDescription description, - DockerServiceResolver serviceResolver) { - return (composeFile) -> { - if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { - serviceResolver.doWith("qdrant", (service) -> composeFile.services().add("qdrant", service)); - } - }; + ComposeFileCustomizer qdrantComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("qdrant", + (service) -> composeFile.services().add("qdrant", service)); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfiguration.java index 1df9e88b2f..2cad68a947 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfiguration.java @@ -20,10 +20,8 @@ import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.metadata.InitializrMetadata; import org.springframework.context.annotation.Bean; @@ -34,19 +32,15 @@ */ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("testcontainers") +@ConditionalOnRequestedSpringAiDependency class SpringAiTestcontainersProjectGenerationConfiguration { @Bean - BuildCustomizer springAiTestcontainersBuildCustomizer(InitializrMetadata metadata, - ProjectDescription description) { - return (build) -> { - if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { - build.dependencies() - .add("spring-ai-testcontainers", - Dependency.withCoordinates("org.springframework.ai", "spring-ai-spring-boot-testcontainers") - .scope(DependencyScope.TEST_COMPILE)); - } - }; + BuildCustomizer springAiTestcontainersBuildCustomizer() { + return (build) -> build.dependencies() + .add("spring-ai-testcontainers", + Dependency.withCoordinates("org.springframework.ai", "spring-ai-spring-boot-testcontainers") + .scope(DependencyScope.TEST_COMPILE)); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiVersion.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiVersion.java deleted file mode 100644 index 38b681c060..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiVersion.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2012-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springai; - -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; -import io.spring.initializr.metadata.InitializrMetadata; - -final class SpringAiVersion { - - private static final VersionRange SPRING_AI_1_0_0_OR_LATER = VersionParser.DEFAULT.parseRange("1.0.0-M2"); - - private SpringAiVersion() { - - } - - static boolean version1OrLater(InitializrMetadata metadata, Version platformVersion) { - var springAiBomVersion = metadata.getConfiguration() - .getEnv() - .getBoms() - .get("spring-ai") - .resolve(platformVersion) - .getVersion(); - return SPRING_AI_1_0_0_OR_LATER.match(Version.parse(springAiBomVersion)); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfiguration.java index b6f4c63e15..eabc301e8c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfiguration.java @@ -17,9 +17,7 @@ package io.spring.start.site.extension.dependency.springai; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.metadata.InitializrMetadata; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections.ServiceConnection; @@ -40,25 +38,17 @@ class SpringAiWeaviateProjectGenerationConfiguration { @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer weaviateServiceConnectionsCustomizer(InitializrMetadata metadata, - ProjectDescription description, DockerServiceResolver serviceResolver) { - return (serviceConnections) -> { - if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { - serviceResolver.doWith("weaviate", (service) -> serviceConnections.addServiceConnection( - ServiceConnection.ofContainer("weaviate", service, TESTCONTAINERS_CLASS_NAME))); - } - }; + ServiceConnectionsCustomizer weaviateServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("weaviate", + (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("weaviate", service, TESTCONTAINERS_CLASS_NAME, false))); } @Bean @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer weaviateComposeFileCustomizer(InitializrMetadata metadata, ProjectDescription description, - DockerServiceResolver serviceResolver) { - return (composeFile) -> { - if (SpringAiVersion.version1OrLater(metadata, description.getPlatformVersion())) { - serviceResolver.doWith("weaviate", (service) -> composeFile.services().add("weaviate", service)); - } - }; + ComposeFileCustomizer weaviateComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("weaviate", + (service) -> composeFile.services().add("weaviate", service)); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java index eecae228c6..7d0f3b7ac9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java @@ -23,6 +23,7 @@ import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.gradle.DevelopmentOnlyDependencyGradleBuildCustomizer; import io.spring.initializr.generator.spring.build.maven.OptionalDependencyMavenBuildCustomizer; +import io.spring.start.site.extension.dependency.springai.SpringAiDockerComposeProjectGenerationConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -52,6 +53,18 @@ OptionalDependencyMavenBuildCustomizer dockerComposeMavenBuildCustomizer() { return new OptionalDependencyMavenBuildCustomizer("docker-compose"); } + /** + * Marks {@code org.springframework.ai:spring-ai-spring-boot-docker-compose} as + * optional. + * @return the build customizer + * @see SpringAiDockerComposeProjectGenerationConfiguration + */ + @Bean + OptionalDependencyMavenBuildCustomizer springAiDockerComposeMavenBuildCustomizer() { + return new OptionalDependencyMavenBuildCustomizer( + SpringAiDockerComposeProjectGenerationConfiguration.DEPENDENCY_ID); + } + } @Configuration(proxyBeanMethods = false) @@ -70,6 +83,18 @@ DevelopmentOnlyDependencyGradleBuildCustomizer dockerComposeGradleBuildCustomize return new DevelopmentOnlyDependencyGradleBuildCustomizer("docker-compose"); } + /** + * Puts {@code org.springframework.ai:spring-ai-spring-boot-docker-compose} in + * {@code developmentOnly} scope. + * @return the build customizer + * @see SpringAiDockerComposeProjectGenerationConfiguration + */ + @Bean + DevelopmentOnlyDependencyGradleBuildCustomizer springAiDockerComposeGradleBuildCustomizer() { + return new DevelopmentOnlyDependencyGradleBuildCustomizer( + SpringAiDockerComposeProjectGenerationConfiguration.DEPENDENCY_ID); + } + } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 334b564111..3859b0415d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -40,13 +40,11 @@ */ abstract class TestcontainersModuleRegistry { - private static final VersionRange SPRING_BOOT_3_3_0_M2_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0-M2"); - - private static final VersionRange SPRING_BOOT_3_3_0_M3_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0-M3"); + private static final VersionRange SPRING_BOOT_3_3_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); static Iterable create(Version platformVersion) { List builders = new ArrayList<>(); - if (SPRING_BOOT_3_3_0_M2_OR_LATER.match(platformVersion)) { + if (SPRING_BOOT_3_3_OR_LATER.match(platformVersion)) { builders.add(onDependencies("activemq").customizeBuild(addModule("activemq")) .customizeHelpDocument(addReferenceLink("ActiveMQ Module", "activemq/"))); builders.add(onDependencies("artemis").customizeBuild(addModule("activemq")) @@ -91,7 +89,7 @@ static Iterable create(Version platformVersion) { .customizeHelpDocument(addReferenceLink("Solace Module", "solace/"))); builders.add(onDependencies("sqlserver").customizeBuild(addModule("mssqlserver")) .customizeHelpDocument(addReferenceLink("MS SQL Server Module", "databases/mssqlserver/"))); - if (SPRING_BOOT_3_3_0_M3_OR_LATER.match(platformVersion)) { + if (SPRING_BOOT_3_3_OR_LATER.match(platformVersion)) { builders.add(onDependencies("spring-ai-vectordb-chroma").customizeBuild(addModule("chromadb")) .customizeHelpDocument(addReferenceLink("Chroma Module", "testcontainers/"))); builders.add(onDependencies("spring-ai-vectordb-milvus").customizeBuild(addModule("milvus")) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyConditionTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyConditionTests.java new file mode 100644 index 0000000000..ff95735d20 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/OnRequestedSpringAiDependencyConditionTests.java @@ -0,0 +1,60 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.project.MutableProjectDescription; +import io.spring.initializr.generator.project.ProjectDescription; +import org.junit.jupiter.api.Test; + +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +/** + * Tests for {@link OnRequestedSpringAiDependencyCondition}. + * + * @author Moritz Halbritter + */ +class OnRequestedSpringAiDependencyConditionTests { + + @Test + void shouldMatchIfSpringAiHasBeenRequested() { + OnRequestedSpringAiDependencyCondition condition = new OnRequestedSpringAiDependencyCondition(); + MutableProjectDescription description = new MutableProjectDescription(); + description.addDependency("spring-ai-azure-openai", + Dependency.withCoordinates("org.springframework.ai", "spring-ai-azure-openai-spring-boot-starter") + .build()); + assertThat(matches(condition, description)).isTrue(); + } + + @Test + void shouldNotMatchIfSpringAiHasNotBeenRequested() { + OnRequestedSpringAiDependencyCondition condition = new OnRequestedSpringAiDependencyCondition(); + MutableProjectDescription description = new MutableProjectDescription(); + description.addDependency("devtools", + Dependency.withCoordinates("org.springframework.boot", "spring-boot-devtools").build()); + assertThat(matches(condition, description)).isFalse(); + } + + private static boolean matches(OnRequestedSpringAiDependencyCondition condition, ProjectDescription description) { + return condition.matches(description, mock(ConditionContext.class), mock(AnnotatedTypeMetadata.class)); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java index 587a1e247b..ca0731f232 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java @@ -20,6 +20,7 @@ import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -29,21 +30,29 @@ * Tests for {@link SpringAiDockerComposeProjectGenerationConfiguration}. * * @author Eddú Meléndez + * @author Moritz Halbritter */ class SpringAiDockerComposeProjectGenerationConfigurationTests extends AbstractExtensionTests { @ParameterizedTest @MethodSource("supportedDockerComposeSpringAiEntriesBuild") void springAiTestcontainersDependencyIsAdded(String springAiDependency) { - ProjectRequest projectRequest = createProject("3.3.0", "docker-compose", springAiDependency); + ProjectRequest projectRequest = createProject("docker-compose", springAiDependency); assertThat(mavenPom(projectRequest)).hasDependency("org.springframework.ai", - "spring-ai-spring-boot-docker-compose", null, "test"); + "spring-ai-spring-boot-docker-compose", null, "runtime"); } - private ProjectRequest createProject(String springBootVersion, String... styles) { + @Test + void shouldNotAddSpringAiTestcontainersDependencyIfNoSpringAiDependencyIsSelected() { + ProjectRequest projectRequest = createProject("docker-compose", "web"); + assertThat(mavenPom(projectRequest)).doesNotHaveDependency("org.springframework.ai", + "spring-ai-spring-boot-docker-compose"); + } + + private ProjectRequest createProject(String... styles) { ProjectRequest projectRequest = createProjectRequest(styles); projectRequest.setLanguage("java"); - projectRequest.setBootVersion(springBootVersion); + projectRequest.setBootVersion("3.3.0"); return projectRequest; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java index a63b1ad8df..fe7536aa8b 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java @@ -20,6 +20,7 @@ import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -29,22 +30,23 @@ * Tests for {@link SpringAiTestcontainersProjectGenerationConfiguration}. * * @author Eddú Meléndez + * @author Moritz Halbritter */ class SpringAiTestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { @ParameterizedTest @MethodSource("supportedTestcontainersSpringAiEntriesBuild") void springAiTestcontainersDependencyIsAdded(String springAiDependency) { - ProjectRequest projectRequest = createProject("3.3.0", "testcontainers", springAiDependency); + ProjectRequest projectRequest = createProject("testcontainers", springAiDependency); assertThat(mavenPom(projectRequest)).hasDependency("org.springframework.ai", "spring-ai-spring-boot-testcontainers", null, "test"); } - private ProjectRequest createProject(String springBootVersion, String... styles) { - ProjectRequest projectRequest = createProjectRequest(styles); - projectRequest.setLanguage("java"); - projectRequest.setBootVersion(springBootVersion); - return projectRequest; + @Test + void shouldNotAddSpringAiTestcontainersDependencyIfNoSpringAiDependencyIsSelected() { + ProjectRequest projectRequest = createProject("testcontainers", "web"); + assertThat(mavenPom(projectRequest)).doesNotHaveDependency("org.springframework.ai", + "spring-ai-spring-boot-testcontainers"); } static Stream supportedTestcontainersSpringAiEntriesBuild() { @@ -52,4 +54,11 @@ static Stream supportedTestcontainersSpringAiEntriesBuild() { "spring-ai-vectordb-qdrant", "spring-ai-vectordb-weaviate"); } + private ProjectRequest createProject(String... styles) { + ProjectRequest projectRequest = createProjectRequest(styles); + projectRequest.setLanguage("java"); + projectRequest.setBootVersion("3.3.0"); + return projectRequest; + } + } From df06977135c0a5391c910bd28b74d1e4fabd5d29 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 11 Sep 2024 09:36:46 +0200 Subject: [PATCH 655/825] Update Spring Cloud Azure to 5.16.0 Closes gh-1581 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 6ed44af5db..d1e456f603 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -107,7 +107,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 5.15.0 + version: 5.16.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From e0d2f1ce4ce30cfb5afe0cd2745d0f568a7e2fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 5 Sep 2024 09:52:26 -0600 Subject: [PATCH 656/825] Generate test application when spring ai cassandra is selected See gh-1580 --- .../CassandraProjectGenerationConfiguration.java | 6 ++++-- .../TestcontainersModuleRegistry.java | 3 ++- start-site/src/main/resources/application.yml | 15 +++++++++++++++ ...sandraProjectGenerationConfigurationTests.java | 9 ++++++++- ...ainersProjectGenerationConfigurationTests.java | 1 + 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfiguration.java index e4f3d4a818..08a1d8388a 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ * * @author Moritz Halbritter * @author Stephane Nicoll + * @author Eddú Meléndez */ @Configuration(proxyBeanMethods = false) class CassandraProjectGenerationConfiguration { @@ -63,7 +64,8 @@ ComposeFileCustomizer cassandraComposeFileCustomizer(Build build, DockerServiceR } private boolean isCassandraEnabled(Build build) { - return build.dependencies().has("data-cassandra") || build.dependencies().has("data-cassandra-reactive"); + return build.dependencies().has("data-cassandra") || build.dependencies().has("data-cassandra-reactive") + || build.dependencies().has("spring-ai-vectordb-cassandra"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 3859b0415d..3622622c97 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -58,7 +58,8 @@ static Iterable create(Version platformVersion) { .customizeHelpDocument(addReferenceLink("Consul Module", "consul/"))); builders.add(onDependencies("cloud-starter-vault-config").customizeBuild(addModule("vault")) .customizeHelpDocument(addReferenceLink("Vault Module", "vault/"))); - builders.add(onDependencies("data-cassandra", "data-cassandra-reactive").customizeBuild(addModule("cassandra")) + builders.add(onDependencies("data-cassandra", "data-cassandra-reactive", "spring-ai-vectordb-cassandra") + .customizeBuild(addModule("cassandra")) .customizeHelpDocument(addReferenceLink("Cassandra Module", "databases/cassandra/"))); builders.add(onDependencies("data-couchbase", "data-couchbase-reactive").customizeBuild(addModule("couchbase")) .customizeHelpDocument(addReferenceLink("Couchbase Module", "databases/couchbase/"))); diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index d1e456f603..bc33b2420a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1448,6 +1448,21 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/bedrock-chat.html + - name: Apache Cassandra Vector Database + id: spring-ai-vectordb-cassandra + group-id: org.springframework.ai + artifact-id: spring-ai-cassandra-store-spring-boot-starter + # spring-ai-cassandra-store-spring-boot-starter is not managed in the BOM + # See https://github.com/spring-projects/spring-ai/pull/1312 + mappings: + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 1.0.0-M2 + repository: spring-milestones + description: Spring AI vector database support for Apache Cassandra. + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/apache-cassandra.html - name: Chroma Vector Database id: spring-ai-vectordb-chroma group-id: org.springframework.ai diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java index f60b6374c3..88ca962b60 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ * Tests for {@link CassandraProjectGenerationConfiguration}. * * @author Moritz Halbritter + * @author Eddú Meléndez */ class CassandraProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -51,6 +52,12 @@ void createsCassandraServiceWhenReactive() { assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/cassandra.yaml")); } + @Test + void createsCassandraServiceWhenSpringAiIsSelected() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-cassandra"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/cassandra.yaml")); + } + @Test void doesNotFailWhenBothCassandraAndReactiveCassandraAreSelected() { ProjectRequest request = createProjectRequest("docker-compose", "data-cassandra", "data-cassandra-reactive"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index f9421a31b0..6d547b55ab 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -97,6 +97,7 @@ static Stream supportedEntriesBuild320() { Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), Arguments.arguments("oracle", "oracle-free"), Arguments.arguments("pulsar", "pulsar"), Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), + Arguments.arguments("spring-ai-vectordb-cassandra", "cassandra"), Arguments.arguments("spring-ai-vectordb-elasticsearch", "elasticsearch"), Arguments.arguments("spring-ai-vectordb-neo4j", "neo4j"), Arguments.arguments("spring-ai-vectordb-oracle", "oracle-free"), From 7b3f6f3b27a6efbd38df4aeb95e40148af4ca192 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 11 Sep 2024 10:51:19 +0200 Subject: [PATCH 657/825] Polish "Generate test application when spring ai cassandra is selected" See gh-1580 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index bc33b2420a..afca26d626 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1452,8 +1452,8 @@ initializr: id: spring-ai-vectordb-cassandra group-id: org.springframework.ai artifact-id: spring-ai-cassandra-store-spring-boot-starter - # spring-ai-cassandra-store-spring-boot-starter is not managed in the BOM - # See https://github.com/spring-projects/spring-ai/pull/1312 + # spring-ai-cassandra-store-spring-boot-starter is not managed in the BOM + # See https://github.com/spring-projects/spring-ai/pull/1312 mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" version: 1.0.0-M2 From ddf254a08396c506b1261a970e02814251b2ea0a Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 11 Sep 2024 10:57:08 +0200 Subject: [PATCH 658/825] Update yarn lockfile --- start-client/yarn.lock | 158 ++++++++++++++++++++++++----------------- 1 file changed, 92 insertions(+), 66 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 100586f018..7b49217a9c 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -2557,9 +2557,9 @@ acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: - version "8.3.3" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" - integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" @@ -3133,10 +3133,10 @@ bmp-js@^0.1.0: resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw== -body-parser@1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: bytes "3.1.2" content-type "~1.0.5" @@ -3146,7 +3146,7 @@ body-parser@1.20.2: http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.11.0" + qs "6.13.0" raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -3364,9 +3364,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001646: - version "1.0.30001657" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001657.tgz#29fd504bffca719d1c6b63a1f6f840be1973a660" - integrity sha512-DPbJAlP8/BAXy3IgiWmZKItubb3TYGP0WscQQlVGIfT4s/YlFYVuJgyOsQNP7rJRChx/qdMeLJQJP0Sgg2yjNA== + version "1.0.30001660" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355" + integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg== caseless@~0.12.0: version "0.12.0" @@ -3448,9 +3448,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz#677de7ed7efff67cc40c9bf1897fea79d41b5215" - integrity sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== class-utils@^0.3.5: version "0.3.6" @@ -3874,11 +3874,11 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: ms "2.0.0" debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.2.7: version "3.2.7" @@ -4182,9 +4182,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.5.4: - version "1.5.14" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.14.tgz#8de5fd941f4deede999f90503c4b5923fbe1962b" - integrity sha512-bEfPECb3fJ15eaDnu9LEJ2vPGD6W1vt7vZleSVyFhYuMIKm3vz/g9lt7IvEzgdwj58RjbPKUF2rXTCN/UW47tQ== + version "1.5.19" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.19.tgz#aeaa0a076f3f0f0e8db2c57fd10158508f00725a" + integrity sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w== emittery@^0.10.2: version "0.10.2" @@ -4216,6 +4216,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + encoding@^0.1.12: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -4460,9 +4465,9 @@ eslint-import-resolver-node@^0.3.9: resolve "^1.22.4" eslint-module-utils@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.9.0.tgz#95d4ac038a68cd3f63482659dffe0883900eb342" - integrity sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ== + version "2.11.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz#b99b211ca4318243f09661fae088f373ad5243c4" + integrity sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ== dependencies: debug "^3.2.7" @@ -4822,36 +4827,36 @@ expect@^28.1.3: jest-util "^28.1.3" express@^4.17.3: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== + version "4.20.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.20.0.tgz#f1d08e591fcec770c07be4767af8eb9bcfd67c48" + integrity sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.2" + body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" finalhandler "1.2.0" fresh "0.5.2" http-errors "2.0.0" - merge-descriptors "1.0.1" + merge-descriptors "1.0.3" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.7" + path-to-regexp "0.1.10" proxy-addr "~2.0.7" qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" + send "0.19.0" + serve-static "1.16.0" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -5156,9 +5161,9 @@ flatted@^3.2.9: integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== follow-redirects@^1.0.0, follow-redirects@^1.15.6: - version "1.15.8" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.8.tgz#ae67b97ae32e0a7b36066a5448938374ec18d13d" - integrity sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig== + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: version "0.3.3" @@ -7173,9 +7178,9 @@ language-tags@^1.0.9: language-subtag-registry "^0.3.20" launch-editor@^2.6.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.8.2.tgz#939e1b3469f9d5471e4eaacedd51b3b7c45352cd" - integrity sha512-eF5slEUZXmi6WvFzI3dYcv+hA24/iKnROf24HztcURJpSz9RBmBgz5cNCVOeguouf1llrwy6Yctl4C4HM+xI8g== + version "2.9.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.9.1.tgz#253f173bd441e342d4344b4dae58291abb425047" + integrity sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w== dependencies: picocolors "^1.0.0" shell-quote "^1.8.1" @@ -7504,10 +7509,10 @@ meow@^9.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== merge-stream@^2.0.0: version "2.0.0" @@ -7928,12 +7933,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -8525,10 +8525,10 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== path-type@^3.0.0: version "3.0.0" @@ -8810,9 +8810,9 @@ psl@^1.1.28: integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -8829,6 +8829,13 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -9541,6 +9548,25 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -9568,10 +9594,10 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== +serve-static@1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.0.tgz#2bf4ed49f8af311b519c46f272bf6ac3baf38a92" + integrity sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" @@ -9786,9 +9812,9 @@ source-list-map@^2.0.0: integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-resolve@^0.5.0: version "0.5.3" @@ -10305,9 +10331,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.31.6" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.6.tgz#c63858a0f0703988d0266a82fcbf2d7ba76422b1" - integrity sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg== + version "5.32.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.32.0.tgz#ee811c0d2d6b741c1cc34a2bc5bcbfc1b5b1f96c" + integrity sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" From b9d7dbd589e7838b2967ed4c0c5b8f4782af4b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 11 Sep 2024 14:29:34 -0600 Subject: [PATCH 659/825] Generate test app when spring cloud azure storage is selected Spring Cloud Azure 5.16.0 supports Testcontainers and Docker Compose Service Connection for Blob Storage and Queue. * Add `spring-cloud-azure-docker-compose` or `spring-cloud-azure-testcontainers` dependency * Configure `docker-compose.yaml` with image `mcr.microsoft.com/azure-storage/azurite:latest` * Configure `GenericContainer` with image `mcr.microsoft.com/azure-storage/azurite:latest` See gh-1582 --- .../SimpleDockerServiceResolver.java | 8 +++ ...ComposeProjectGenerationConfiguration.java | 46 ++++++++++++++++ ...StorageProjectGenerationConfiguration.java | 52 +++++++++++++++++++ ...tainersProjectGenerationConfiguration.java | 46 ++++++++++++++++ .../main/resources/META-INF/spring.factories | 3 ++ ...seProjectGenerationConfigurationTests.java | 46 ++++++++++++++++ ...geProjectGenerationConfigurationTests.java | 48 +++++++++++++++++ ...rsProjectGenerationConfigurationTests.java | 46 ++++++++++++++++ .../src/test/resources/compose/azurite.yaml | 7 +++ 9 files changed, 302 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfiguration.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/resources/compose/azurite.yaml diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index e7c9928132..4a1cab951a 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -37,6 +37,7 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("activeMQ", activeMQ()); this.dockerServices.put("activeMQClassic", activeMQClassic()); this.dockerServices.put("artemis", artemis()); + this.dockerServices.put("azurite", azurite()); this.dockerServices.put("cassandra", cassandra()); this.dockerServices.put("chroma", chroma()); this.dockerServices.put("elasticsearch", elasticsearch()); @@ -81,6 +82,13 @@ private static DockerService artemis() { .build(); } + private static DockerService azurite() { + return DockerService.withImageAndTag("mcr.microsoft.com/azure-storage/azurite") + .website("https://github.com/Azure/Azurite?tab=readme-ov-file#dockerhub") + .ports(10000, 10001, 10002) + .build(); + } + private static DockerService cassandra() { return DockerService.withImageAndTag("cassandra") .website("https://hub.docker.com/_/cassandra") diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfiguration.java new file mode 100644 index 0000000000..ce80a7707a --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfiguration.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring Azure Docker Compose. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("azure-storage") +class SpringAzureDockerComposeProjectGenerationConfiguration { + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + BuildCustomizer springAzureDockerComposeBuildCustomizer() { + return (build) -> build.dependencies() + .add("spring-azure-docker-compose", + Dependency.withCoordinates("com.azure.spring", "spring-cloud-azure-docker-compose") + .scope(DependencyScope.TEST_COMPILE)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfiguration.java new file mode 100644 index 0000000000..fd6fd4ba62 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfiguration.java @@ -0,0 +1,52 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Azurite (Storage Emulator). + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("azure-storage") +class SpringAzureStorageProjectGenerationConfiguration { + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer azureStorageServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("azurite", + (service) -> serviceConnections.addServiceConnection(ServiceConnections.ServiceConnection + .ofGenericContainer("azurite", service, "azure-storage/azurite"))); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer azureStorageComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("azurite", + (service) -> composeFile.services().add("azurite", service)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfiguration.java new file mode 100644 index 0000000000..b4aec46743 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfiguration.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring Azure Testcontainers. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("azure-storage") +class SpringAzureTestcontainersProjectGenerationConfiguration { + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + BuildCustomizer springAzureTestcontainersBuildCustomizer() { + return (build) -> build.dependencies() + .add("spring-azure-testcontainers", + Dependency.withCoordinates("com.azure.spring", "spring-cloud-azure-testcontainers") + .scope(DependencyScope.TEST_COMPILE)); + } + +} diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index da59fbe1f5..af88d22983 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -35,7 +35,10 @@ io.spring.start.site.extension.dependency.springai.SpringAiQdrantProjectGenerati io.spring.start.site.extension.dependency.springai.SpringAiTestcontainersProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springai.SpringAiWeaviateProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springamqp.SpringAmqpProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springazure.SpringAzureDockerComposeProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springazure.SpringAzureStorageProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springazure.SpringAzureProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springazure.SpringAzureTestcontainersProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springboot.SpringBootProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springcloud.SpringCloudProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springdata.SpringDataProjectGenerationConfiguration,\ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..b11be15475 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAzureDockerComposeProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class SpringAzureDockerComposeProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void springAzureDockerComposeDependencyIsAdded() { + ProjectRequest projectRequest = createProjectRequest("docker-compose", "azure-storage"); + assertThat(mavenPom(projectRequest)).hasDependency("com.azure.spring", "spring-cloud-azure-docker-compose", + null, "test"); + } + + @Test + void shouldNotAddDockerComposeTestcontainersDependencyIfNoSpringAzureDependencyIsSelected() { + ProjectRequest projectRequest = createProjectRequest("docker-compose", "web"); + assertThat(mavenPom(projectRequest)).doesNotHaveDependency("com.azure.spring", + "spring-cloud-azure-docker-compose"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..93e139ac4a --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfigurationTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAzureStorageProjectGenerationConfiguration} + * + * @author Eddú Meléndez + */ +class SpringAzureStorageProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("web", "azure-storage"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsAzuriteService() { + ProjectRequest request = createProjectRequest("docker-compose", "azure-storage"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/azurite.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..7863ef955c --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAzureTestcontainersProjectGenerationConfiguration}. + * + * @author Eddú Meléndez + */ +class SpringAzureTestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void springAzureTestcontainersDependencyIsAdded() { + ProjectRequest projectRequest = createProjectRequest("testcontainers", "azure-storage"); + assertThat(mavenPom(projectRequest)).hasDependency("com.azure.spring", "spring-cloud-azure-testcontainers", + null, "test"); + } + + @Test + void shouldNotAddSpringAzureTestcontainersDependencyIfNoSpringAzureDependencyIsSelected() { + ProjectRequest projectRequest = createProjectRequest("testcontainers", "azure-keyvault"); + assertThat(mavenPom(projectRequest)).doesNotHaveDependency("com.azure.spring", + "spring-cloud-azure-testcontainers"); + } + +} diff --git a/start-site/src/test/resources/compose/azurite.yaml b/start-site/src/test/resources/compose/azurite.yaml new file mode 100644 index 0000000000..ba2b9ad710 --- /dev/null +++ b/start-site/src/test/resources/compose/azurite.yaml @@ -0,0 +1,7 @@ +services: + azurite: + image: 'mcr.microsoft.com/azure-storage/azurite:latest' + ports: + - '10000' + - '10001' + - '10002' From 440054492b89403451dca0b63bcdfaf14165e37f Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 13 Sep 2024 11:04:21 +0200 Subject: [PATCH 660/825] Polish "Generate test app when spring cloud azure storage is selected" See gh-1582 --- ...ComposeProjectGenerationConfiguration.java | 34 ++++++++++-- ...StorageProjectGenerationConfiguration.java | 52 ------------------- ...tainersProjectGenerationConfiguration.java | 11 ++++ .../main/resources/META-INF/spring.factories | 1 - ...seProjectGenerationConfigurationTests.java | 18 ++++++- ...geProjectGenerationConfigurationTests.java | 48 ----------------- 6 files changed, 59 insertions(+), 105 deletions(-) delete mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfiguration.java delete mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfigurationTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfiguration.java index ce80a7707a..f7ba912a97 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfiguration.java @@ -19,9 +19,16 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.generator.spring.build.gradle.DevelopmentOnlyDependencyGradleBuildCustomizer; +import io.spring.initializr.generator.spring.build.maven.OptionalDependencyMavenBuildCustomizer; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; import org.springframework.context.annotation.Bean; @@ -29,18 +36,39 @@ * Configuration for generation of projects that depend on Spring Azure Docker Compose. * * @author Eddú Meléndez + * @author Moritz Halbritter */ @ProjectGenerationConfiguration @ConditionalOnRequestedDependency("azure-storage") class SpringAzureDockerComposeProjectGenerationConfiguration { + private static final String DEPENDENCY_ID = "spring-azure-docker-compose"; + @Bean @ConditionalOnRequestedDependency("docker-compose") BuildCustomizer springAzureDockerComposeBuildCustomizer() { return (build) -> build.dependencies() - .add("spring-azure-docker-compose", - Dependency.withCoordinates("com.azure.spring", "spring-cloud-azure-docker-compose") - .scope(DependencyScope.TEST_COMPILE)); + .add(DEPENDENCY_ID, Dependency.withCoordinates("com.azure.spring", "spring-cloud-azure-docker-compose") + .scope(DependencyScope.RUNTIME)); + } + + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + OptionalDependencyMavenBuildCustomizer springAzureDockerComposeMavenBuildCustomizer() { + return new OptionalDependencyMavenBuildCustomizer(DEPENDENCY_ID); + } + + @Bean + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + DevelopmentOnlyDependencyGradleBuildCustomizer springAzureDockerComposeGradleBuildCustomizer() { + return new DevelopmentOnlyDependencyGradleBuildCustomizer(DEPENDENCY_ID); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer azureStorageComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("azurite", + (service) -> composeFile.services().add("azurite", service)); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfiguration.java deleted file mode 100644 index fd6fd4ba62..0000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfiguration.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2012-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springazure; - -import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.start.site.container.ComposeFileCustomizer; -import io.spring.start.site.container.DockerServiceResolver; -import io.spring.start.site.container.ServiceConnections; -import io.spring.start.site.container.ServiceConnectionsCustomizer; - -import org.springframework.context.annotation.Bean; - -/** - * Configuration for generation of projects that depend on Azurite (Storage Emulator). - * - * @author Eddú Meléndez - */ -@ProjectGenerationConfiguration -@ConditionalOnRequestedDependency("azure-storage") -class SpringAzureStorageProjectGenerationConfiguration { - - @Bean - @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer azureStorageServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { - return (serviceConnections) -> serviceResolver.doWith("azurite", - (service) -> serviceConnections.addServiceConnection(ServiceConnections.ServiceConnection - .ofGenericContainer("azurite", service, "azure-storage/azurite"))); - } - - @Bean - @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer azureStorageComposeFileCustomizer(DockerServiceResolver serviceResolver) { - return (composeFile) -> serviceResolver.doWith("azurite", - (service) -> composeFile.services().add("azurite", service)); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfiguration.java index b4aec46743..f2f3500f8e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfiguration.java @@ -22,6 +22,9 @@ import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections; +import io.spring.start.site.container.ServiceConnectionsCustomizer; import org.springframework.context.annotation.Bean; @@ -43,4 +46,12 @@ BuildCustomizer springAzureTestcontainersBuildCustomizer() { .scope(DependencyScope.TEST_COMPILE)); } + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer azureStorageServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("azurite", + (service) -> serviceConnections.addServiceConnection(ServiceConnections.ServiceConnection + .ofGenericContainer("azurite", service, "azure-storage/azurite"))); + } + } diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index af88d22983..216c753ae8 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -36,7 +36,6 @@ io.spring.start.site.extension.dependency.springai.SpringAiTestcontainersProject io.spring.start.site.extension.dependency.springai.SpringAiWeaviateProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springamqp.SpringAmqpProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springazure.SpringAzureDockerComposeProjectGenerationConfiguration,\ -io.spring.start.site.extension.dependency.springazure.SpringAzureStorageProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springazure.SpringAzureProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springazure.SpringAzureTestcontainersProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springboot.SpringBootProjectGenerationConfiguration,\ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java index b11be15475..eead354025 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java @@ -16,10 +16,13 @@ package io.spring.start.site.extension.dependency.springazure; +import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; + import static org.assertj.core.api.Assertions.assertThat; /** @@ -29,11 +32,24 @@ */ class SpringAzureDockerComposeProjectGenerationConfigurationTests extends AbstractExtensionTests { + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("web", "azure-storage"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsAzuriteService() { + ProjectRequest request = createProjectRequest("docker-compose", "azure-storage"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/azurite.yaml")); + } + @Test void springAzureDockerComposeDependencyIsAdded() { ProjectRequest projectRequest = createProjectRequest("docker-compose", "azure-storage"); assertThat(mavenPom(projectRequest)).hasDependency("com.azure.spring", "spring-cloud-azure-docker-compose", - null, "test"); + null, "runtime"); } @Test diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfigurationTests.java deleted file mode 100644 index 93e139ac4a..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureStorageProjectGenerationConfigurationTests.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2012-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.springazure; - -import io.spring.initializr.generator.test.project.ProjectStructure; -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.junit.jupiter.api.Test; - -import org.springframework.core.io.ClassPathResource; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link SpringAzureStorageProjectGenerationConfiguration} - * - * @author Eddú Meléndez - */ -class SpringAzureStorageProjectGenerationConfigurationTests extends AbstractExtensionTests { - - @Test - void doesNothingWithoutDockerCompose() { - ProjectRequest request = createProjectRequest("web", "azure-storage"); - ProjectStructure structure = generateProject(request); - assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); - } - - @Test - void createsAzuriteService() { - ProjectRequest request = createProjectRequest("docker-compose", "azure-storage"); - assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/azurite.yaml")); - } - -} From 5bd5a72d0457eead6e3e92d551b13361c83bb1d6 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 13 Sep 2024 11:20:05 +0200 Subject: [PATCH 661/825] Polish --- ...ComposeProjectGenerationConfiguration.java | 29 +++++++++++++++---- ...ingBootProjectGenerationConfiguration.java | 25 ---------------- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java index 85e90d580b..704b76a13b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java @@ -19,10 +19,14 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.generator.spring.build.gradle.DevelopmentOnlyDependencyGradleBuildCustomizer; +import io.spring.initializr.generator.spring.build.maven.OptionalDependencyMavenBuildCustomizer; import io.spring.initializr.generator.version.VersionProperty; import io.spring.initializr.generator.version.VersionReference; import io.spring.initializr.metadata.InitializrMetadata; @@ -43,14 +47,13 @@ public class SpringAiDockerComposeProjectGenerationConfiguration { * Dependency id of * {@code org.springframework.ai:spring-ai-spring-boot-docker-compose}. */ - public static final String DEPENDENCY_ID = "spring-ai-docker-compose"; + private static final String DEPENDENCY_ID = "spring-ai-docker-compose"; @Bean - BuildCustomizer springAiDockerComposeBuildCustomizer(InitializrMetadata metadata, - ProjectDescription description) { + BuildCustomizer springAiDockerComposeBuildCustomizer(InitializrMetadata metadata) { // spring-ai-spring-boot-docker-compose is not managed in the BOM // See https://github.com/spring-projects/spring-ai/issues/1314 - VersionProperty springAiBomVersion = getSpringAiVersion(metadata, description); + VersionProperty springAiBomVersion = getSpringAiVersion(metadata); return (build) -> build.dependencies() .add(DEPENDENCY_ID, Dependency.withCoordinates("org.springframework.ai", "spring-ai-spring-boot-docker-compose") @@ -58,7 +61,21 @@ BuildCustomizer springAiDockerComposeBuildCustomizer(InitializrMetadata m .scope(DependencyScope.RUNTIME)); } - private static VersionProperty getSpringAiVersion(InitializrMetadata metadata, ProjectDescription description) { + @Bean + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + DevelopmentOnlyDependencyGradleBuildCustomizer springAiDockerComposeGradleBuildCustomizer() { + return new DevelopmentOnlyDependencyGradleBuildCustomizer( + SpringAiDockerComposeProjectGenerationConfiguration.DEPENDENCY_ID); + } + + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + OptionalDependencyMavenBuildCustomizer springAiDockerComposeMavenBuildCustomizer() { + return new OptionalDependencyMavenBuildCustomizer( + SpringAiDockerComposeProjectGenerationConfiguration.DEPENDENCY_ID); + } + + private static VersionProperty getSpringAiVersion(InitializrMetadata metadata) { return metadata.getConfiguration().getEnv().getBoms().get("spring-ai").getVersionProperty(); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java index 7d0f3b7ac9..eecae228c6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java @@ -23,7 +23,6 @@ import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.gradle.DevelopmentOnlyDependencyGradleBuildCustomizer; import io.spring.initializr.generator.spring.build.maven.OptionalDependencyMavenBuildCustomizer; -import io.spring.start.site.extension.dependency.springai.SpringAiDockerComposeProjectGenerationConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -53,18 +52,6 @@ OptionalDependencyMavenBuildCustomizer dockerComposeMavenBuildCustomizer() { return new OptionalDependencyMavenBuildCustomizer("docker-compose"); } - /** - * Marks {@code org.springframework.ai:spring-ai-spring-boot-docker-compose} as - * optional. - * @return the build customizer - * @see SpringAiDockerComposeProjectGenerationConfiguration - */ - @Bean - OptionalDependencyMavenBuildCustomizer springAiDockerComposeMavenBuildCustomizer() { - return new OptionalDependencyMavenBuildCustomizer( - SpringAiDockerComposeProjectGenerationConfiguration.DEPENDENCY_ID); - } - } @Configuration(proxyBeanMethods = false) @@ -83,18 +70,6 @@ DevelopmentOnlyDependencyGradleBuildCustomizer dockerComposeGradleBuildCustomize return new DevelopmentOnlyDependencyGradleBuildCustomizer("docker-compose"); } - /** - * Puts {@code org.springframework.ai:spring-ai-spring-boot-docker-compose} in - * {@code developmentOnly} scope. - * @return the build customizer - * @see SpringAiDockerComposeProjectGenerationConfiguration - */ - @Bean - DevelopmentOnlyDependencyGradleBuildCustomizer springAiDockerComposeGradleBuildCustomizer() { - return new DevelopmentOnlyDependencyGradleBuildCustomizer( - SpringAiDockerComposeProjectGenerationConfiguration.DEPENDENCY_ID); - } - } } From 4fc04d17826a15819f8c52c045ca0eec362eae49 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 16 Sep 2024 12:34:39 +0300 Subject: [PATCH 662/825] Upgrade to Vaadin 24.4.12 See gh-1583 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index afca26d626..470f5aef30 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -158,7 +158,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.4.11 + version: 24.4.12 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From 40418d6db1ea0a5090a34b3ea475dd358ae19a24 Mon Sep 17 00:00:00 2001 From: Fred Date: Tue, 17 Sep 2024 17:00:25 -0300 Subject: [PATCH 663/825] Upgrade Timefold Solver to 1.14.0 See gh-1584 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 470f5aef30..929f0f414e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -151,7 +151,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 1.13.0 + version: 1.14.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From a312dd0e30bbab43c6ba01811cf878f1aa31e373 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 19 Sep 2024 07:31:08 -0600 Subject: [PATCH 664/825] Upgrade to Netflix DGS 9.1.2 See gh-1586 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 929f0f414e..e93c3579a4 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -58,7 +58,7 @@ initializr: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 8.7.1 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 9.1.0 + version: 9.1.2 sentry: groupId: io.sentry artifactId: sentry-bom From 96c365bfa07905025a86e9c2056e831c9ad0c10e Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 19 Sep 2024 07:39:45 -0600 Subject: [PATCH 665/825] Upgrade to Solace Cloud 4.5.0 See gh-1587 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e93c3579a4..428829e8b9 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -81,7 +81,7 @@ initializr: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 4.1.0 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 4.4.0 + version: 4.5.0 spring-ai: groupId: org.springframework.ai artifactId: spring-ai-bom From e1eeda3d6bd2afc5f1c7f4c097447ff3e6d0ef78 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 18 Sep 2024 10:09:56 +0200 Subject: [PATCH 666/825] Add support for Java 23 Closes gh-1585 --- .../JavaVersionProjectDescriptionCustomizer.java | 14 +++----------- start-site/src/main/resources/application.yml | 2 +- ...aVersionProjectDescriptionCustomizerTests.java | 15 +++++++-------- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index d46d939f85..b238e51822 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -24,8 +24,6 @@ import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * Validate that the requested java version is compatible with the chosen Spring Boot @@ -37,8 +35,6 @@ */ public class JavaVersionProjectDescriptionCustomizer implements ProjectDescriptionCustomizer { - private static final VersionRange SPRING_BOOT_3_2_4_OR_LATER = VersionParser.DEFAULT.parseRange("3.2.4"); - private static final List UNSUPPORTED_VERSIONS = Arrays.asList("1.6", "1.7", "1.8"); @Override @@ -56,13 +52,9 @@ public void customize(MutableProjectDescription description) { if (javaGeneration < 17) { updateTo(description, "17"); } - if (javaGeneration == 22) { - // Java 21 support as of Spring Boot 3.2.4 - if (!SPRING_BOOT_3_2_4_OR_LATER.match(platformVersion)) { - updateTo(description, "21"); - } + if (javaGeneration >= 22) { if (isKotlin(description)) { - // Kotlin 1.9.x doesn't support Java 22 + // Kotlin 1.9.x doesn't support Java > 21 updateTo(description, "21"); } } @@ -80,7 +72,7 @@ private void updateTo(MutableProjectDescription description, String jvmVersion) private Integer determineJavaGeneration(String javaVersion) { try { int generation = Integer.parseInt(javaVersion); - return ((generation > 9 && generation <= 22) ? generation : null); + return ((generation > 9 && generation <= 23) ? generation : null); } catch (NumberFormatException ex) { return null; diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 428829e8b9..8cef013e03 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1727,7 +1727,7 @@ initializr: id: war default: false javaVersions: - - id: 22 + - id: 23 default: false - id: 21 default: false diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index 6d83d76ab4..ec8a153f85 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -62,13 +62,13 @@ void gradleGroovyBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String lan } @Test - void java22IsNotSupportedWithBoot323() { - assertThat(mavenPom(javaProject("22", "3.2.3"))).hasProperty("java.version", "21"); + void java22IsNotSupportedWithKotlin() { + assertThat(mavenPom(kotlinProject("22", "3.2.9"))).hasProperty("java.version", "21"); } @Test - void java22IsNotSupportedWithKotlin() { - assertThat(mavenPom(kotlinProject("22", "3.2.5"))).hasProperty("java.version", "21"); + void java23IsNotSupportedWithKotlin() { + assertThat(mavenPom(kotlinProject("23", "3.2.9"))).hasProperty("java.version", "21"); } static Stream supportedMavenParameters() { @@ -81,8 +81,8 @@ static Stream supportedGradleGroovyParameters() { } private static Stream supportedJavaParameters() { - return Stream.of(java("17", "3.2.0"), java("21", "3.2.0"), java("22", "3.2.4"), java("17", "3.3.0"), - java("21", "3.3.0"), java("22", "3.3.0")); + return Stream.of(java("17", "3.2.0"), java("21", "3.2.0"), java("23", "3.2.9"), java("17", "3.3.0"), + java("21", "3.3.0"), java("23", "3.3.0")); } private static Stream supportedKotlinParameters() { @@ -90,8 +90,7 @@ private static Stream supportedKotlinParameters() { } private static Stream supportedGroovyParameters() { - return Stream.of(groovy("21", "3.2.0"), groovy("22", "3.2.4"), groovy("21", "3.3.0-M2"), - groovy("22", "3.3.0-M3")); + return Stream.of(groovy("21", "3.2.0"), groovy("23", "3.2.9"), groovy("21", "3.3.0-M2"), groovy("23", "3.3.0")); } private static Arguments java(String javaVersion, String springBootVersion) { From 9eefd7457714f52f850ca0038675eadd3fb18f3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 02:50:50 +0000 Subject: [PATCH 667/825] Bump azure/login from 2.1.1 to 2.2.0 Bumps [azure/login](https://github.com/azure/login) from 2.1.1 to 2.2.0. - [Release notes](https://github.com/azure/login/releases) - [Commits](https://github.com/azure/login/compare/6c251865b4e6290e7b78be643ea2d005bc51f69a...a65d910e8af852a8061c627c456678983e180302) --- updated-dependencies: - dependency-name: azure/login dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] See gh-1591 --- .github/workflows/build-and-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 0ee8f52314..c638a90103 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -36,7 +36,7 @@ jobs: run: ./mvnw --batch-mode --update-snapshots verify - name: Set up Azure - uses: azure/login@6c251865b4e6290e7b78be643ea2d005bc51f69a # v2.1.1 + uses: azure/login@a65d910e8af852a8061c627c456678983e180302 # v2.2.0 with: creds: ${{ secrets.AZURE_CREDENTIALS_SPRING_IO }} From 1172d05ed6a0516e3745f1cf70a19b48165e9a7f Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Mon, 23 Sep 2024 02:45:18 -0600 Subject: [PATCH 668/825] Upgrade to latest Spring Modulith releases See gh-1593 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8cef013e03..0eecb177fc 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -130,9 +130,9 @@ initializr: versionProperty: spring-modulith.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 1.1.8 + version: 1.1.9 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 1.2.3 + version: 1.2.4 - compatibilityRange: "[3.4.0-M1,3.5.0-M1)" version: 1.3.0-M2 repositories: spring-milestones From 91485ea18ee46c5f032f48cbe1be04ea60fcf100 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 25 Sep 2024 07:43:10 +0200 Subject: [PATCH 669/825] Polish "Upgrade to latest Spring Modulith releases" See gh-1593 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0eecb177fc..3e01b889c9 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -134,7 +134,7 @@ initializr: - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 1.2.4 - compatibilityRange: "[3.4.0-M1,3.5.0-M1)" - version: 1.3.0-M2 + version: 1.3.0-M3 repositories: spring-milestones spring-shell: groupId: org.springframework.shell From e3f456fd884bd539a42bd6974cf50fe501d9b76d Mon Sep 17 00:00:00 2001 From: Corneil du Plessis Date: Mon, 23 Sep 2024 11:22:35 +0200 Subject: [PATCH 670/825] Upgrade to Spring Shell 3.2.8 and 3.3.3 See gh-1594 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3e01b889c9..e07563c3f8 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -142,9 +142,9 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 3.2.7 + version: 3.2.8 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.3.2 + version: 3.3.3 timefold-solver: groupId: ai.timefold.solver artifactId: timefold-solver-bom From d6d26c0649e464b6ab899e00eb5e230e6c50c400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 24 Sep 2024 20:02:47 -0600 Subject: [PATCH 671/825] Generate test app when kafka streams is selected Spring Boot's Kafka Stream support already support KafkaConnectionDetails. start.spring.io should generate the KafkaContainer bean when kafka-streams is selected. See gh-1595 --- ...ngKafkaProjectGenerationConfiguration.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java index d1b8c6a909..66d84f0f87 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package io.spring.start.site.extension.dependency.springkafka; +import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.start.site.container.DockerServiceResolver; @@ -25,26 +26,35 @@ import org.springframework.context.annotation.Bean; /** - * Configuration for generation of projects that depend on Spring Kafka. + * Configuration for generation of projects that depend on Spring Kafka and Kafka Streams. * * @author Stephane Nicoll + * @author Eddú Meléndez */ @ProjectGenerationConfiguration -@ConditionalOnRequestedDependency("kafka") class SpringKafkaProjectGenerationConfiguration { private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.KafkaContainer"; @Bean + @ConditionalOnRequestedDependency("kafka") SpringKafkaBuildCustomizer springKafkaBuildCustomizer() { return new SpringKafkaBuildCustomizer(); } @Bean @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer kafkaServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { - return (serviceConnections) -> serviceResolver.doWith("kafka", (service) -> serviceConnections - .addServiceConnection(ServiceConnection.ofContainer("kafka", service, TESTCONTAINERS_CLASS_NAME, false))); + ServiceConnectionsCustomizer kafkaServiceConnectionsCustomizer(Build build, DockerServiceResolver serviceResolver) { + return (serviceConnections) -> { + if (isKafkaEnabled(build)) { + serviceResolver.doWith("kafka", (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("kafka", service, TESTCONTAINERS_CLASS_NAME, false))); + } + }; + } + + private boolean isKafkaEnabled(Build build) { + return build.dependencies().has("kafka") || build.dependencies().has("kafka-streams"); } } From e07386743301b562813e194911d145c1b70c4fcf Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 25 Sep 2024 08:30:18 +0200 Subject: [PATCH 672/825] Update yarn lockfile --- start-client/yarn.lock | 240 +++++++++++++++++++---------------------- 1 file changed, 113 insertions(+), 127 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 7b49217a9c..89888c8959 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -1241,9 +1241,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -1260,22 +1260,22 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -1284,7 +1284,7 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": +"@humanwhocodes/object-schema@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== @@ -1919,9 +1919,9 @@ rimraf "^3.0.2" "@polka/url@^1.0.0-next.24": - version "1.0.0-next.25" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" - integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== + version "1.0.0-next.28" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" + integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== "@rollup/plugin-babel@^5.2.0": version "5.3.1" @@ -2080,9 +2080,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/estree@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.19.5" @@ -2207,9 +2207,9 @@ "@types/node" "*" "@types/node@*": - version "22.5.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.4.tgz#83f7d1f65bc2ed223bdbf57c7884f1d5a4fa84e8" - integrity sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg== + version "22.7.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.0.tgz#670aa1874bc836863e5c116f9f2c32416ff27e1f" + integrity sha512-MOdOibwBs6KW1vfqz2uKMlxq5xAfAZ98SZjO8e3XnAbFnTJtAspqhWk7hrdSAs9/Y14ZWMiy7/MxMUzAOadYEw== dependencies: undici-types "~6.19.2" @@ -2229,14 +2229,14 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@^15.0.0": - version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + version "15.7.13" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" + integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== "@types/qs@*": - version "6.9.15" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" - integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + version "6.9.16" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" + integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== "@types/range-parser@*": version "1.2.7" @@ -2984,12 +2984,12 @@ babel-jest@^28.1.1, babel-jest@^28.1.3: slash "^3.0.0" babel-loader@^8.2.2: - version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + version "8.4.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.4.1.tgz#6ccb75c66e62c3b144e1c5f2eaec5b8f6c08c675" + integrity sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA== dependencies: find-cache-dir "^3.3.1" - loader-utils "^2.0.0" + loader-utils "^2.0.4" make-dir "^3.1.0" schema-utils "^2.6.5" @@ -3208,12 +3208,12 @@ braces@^3.0.3, braces@~3.0.2: fill-range "^7.1.1" browserslist@^4.21.10, browserslist@^4.23.1, browserslist@^4.23.3: - version "4.23.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" - integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + version "4.24.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" + integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== dependencies: - caniuse-lite "^1.0.30001646" - electron-to-chromium "^1.5.4" + caniuse-lite "^1.0.30001663" + electron-to-chromium "^1.5.28" node-releases "^2.0.18" update-browserslist-db "^1.1.0" @@ -3363,10 +3363,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001646: - version "1.0.30001660" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355" - integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg== +caniuse-lite@^1.0.30001663: + version "1.0.30001663" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz#1529a723505e429fdfd49532e9fc42273ba7fed7" + integrity sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA== caseless@~0.12.0: version "0.12.0" @@ -3412,7 +3412,7 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3, chokidar@^3.6.0: +chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -3427,6 +3427,13 @@ chardet@^0.7.0: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -4181,10 +4188,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.4: - version "1.5.19" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.19.tgz#aeaa0a076f3f0f0e8db2c57fd10158508f00725a" - integrity sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w== +electron-to-chromium@^1.5.28: + version "1.5.28" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz#aee074e202c6ee8a0030a9c2ef0b3fe9f967d576" + integrity sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw== emittery@^0.10.2: version "0.10.2" @@ -4254,9 +4261,9 @@ env-paths@^2.2.0: integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: - version "7.13.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31" - integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q== + version "7.14.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== err-code@^2.0.2: version "2.0.3" @@ -4465,9 +4472,9 @@ eslint-import-resolver-node@^0.3.9: resolve "^1.22.4" eslint-module-utils@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz#b99b211ca4318243f09661fae088f373ad5243c4" - integrity sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ== + version "2.11.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.11.1.tgz#6d5a05f09af98f4d238a819ae4c23626a75fa65b" + integrity sha512-EwcbfLOhwVMAfatfqLecR2yv3dE5+kQ8kx+Rrt0DvDXEVwW86KQ/xbMDQhtp5l42VXukD5SOF8mQQHbaNtO0CQ== dependencies: debug "^3.2.7" @@ -4537,9 +4544,9 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.23.2: - version "7.35.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz#d32500d3ec268656d5071918bfec78cfd8b070ed" - integrity sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ== + version "7.36.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz#f1dabbb11f3d4ebe8b0cf4e54aff4aee81144ee5" + integrity sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" @@ -4649,15 +4656,15 @@ eslint@^5.0.0: text-table "^0.2.0" eslint@^8.17.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -4827,9 +4834,9 @@ expect@^28.1.3: jest-util "^28.1.3" express@^4.17.3: - version "4.20.0" - resolved "https://registry.yarnpkg.com/express/-/express-4.20.0.tgz#f1d08e591fcec770c07be4767af8eb9bcfd67c48" - integrity sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw== + version "4.21.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" + integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== dependencies: accepts "~1.3.8" array-flatten "1.1.1" @@ -4843,7 +4850,7 @@ express@^4.17.3: encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "1.3.1" fresh "0.5.2" http-errors "2.0.0" merge-descriptors "1.0.3" @@ -4852,11 +4859,11 @@ express@^4.17.3: parseurl "~1.3.3" path-to-regexp "0.1.10" proxy-addr "~2.0.7" - qs "6.11.0" + qs "6.13.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.19.0" - serve-static "1.16.0" + serve-static "1.16.2" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -5072,13 +5079,13 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" parseurl "~1.3.3" @@ -7244,7 +7251,7 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^2.0.0: +loader-utils@^2.0.0, loader-utils@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== @@ -8572,7 +8579,7 @@ phin@^3.7.1: dependencies: centra "^2.7.0" -picocolors@^1.0.0, picocolors@^1.0.1: +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== @@ -8668,13 +8675,13 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.4.33: - version "8.4.45" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.45.tgz#538d13d89a16ef71edbf75d895284ae06b79e603" - integrity sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q== + version "8.4.47" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" + integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== dependencies: nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" + picocolors "^1.1.0" + source-map-js "^1.2.1" prelude-ls@^1.2.1: version "1.2.1" @@ -8822,13 +8829,6 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - qs@6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" @@ -9049,6 +9049,11 @@ readable-web-to-node-stream@^3.0.0: dependencies: readable-stream "^3.6.0" +readdirp@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.1.tgz#b2fe35f8dca63183cd3b86883ecc8f720ea96ae6" + integrity sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -9085,9 +9090,9 @@ reflect.getprototypeof@^1.0.4: which-builtin-type "^1.1.3" regenerate-unicode-properties@^10.1.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" - integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== dependencies: regenerate "^1.4.2" @@ -9445,11 +9450,11 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.78.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.78.0.tgz#cef369b2f9dc21ea1d2cf22c979f52365da60841" - integrity sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ== + version "1.79.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.79.3.tgz#7811b000eb68195fe51dea89177e73e7ef7f546f" + integrity sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA== dependencies: - chokidar ">=3.0.0 <4.0.0" + chokidar "^4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" @@ -9529,25 +9534,6 @@ semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - send@0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" @@ -9594,15 +9580,15 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.16.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.0.tgz#2bf4ed49f8af311b519c46f272bf6ac3baf38a92" - integrity sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA== +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.19.0" set-blocking@^2.0.0: version "2.0.0" @@ -9811,7 +9797,7 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -10331,9 +10317,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.32.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.32.0.tgz#ee811c0d2d6b741c1cc34a2bc5bcbfc1b5b1f96c" - integrity sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ== + version "5.33.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.33.0.tgz#8f9149538c7468ffcb1246cfec603c16720d2db1" + integrity sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10649,9 +10635,9 @@ undici-types@~6.19.2: integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" @@ -10662,9 +10648,9 @@ unicode-match-property-ecmascript@^2.0.0: unicode-property-aliases-ecmascript "^2.0.0" unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" From 9414aa4902acad35670bad549c05ee9ebec455ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 25 Sep 2024 05:55:52 -0600 Subject: [PATCH 673/825] Generate test app for Kafka using KafkaContainer and apache/kafka-native Spring Boot 3.4.0-M2 supports org.testcontainers.kafka.KafkaContainer. It also provides Testcontainers 1.20.1, which supports the apache/kafka-native image. See gh-1597 --- .../SimpleDockerServiceResolver.java | 8 ++++++ ...ngKafkaProjectGenerationConfiguration.java | 26 ++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index 4a1cab951a..e7c66f7168 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -42,6 +42,7 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("chroma", chroma()); this.dockerServices.put("elasticsearch", elasticsearch()); this.dockerServices.put("kafka", kafka()); + this.dockerServices.put("kafka-native", kafkaNative()); this.dockerServices.put("mariaDb", mariaDb()); this.dockerServices.put("milvus", milvus()); this.dockerServices.put("mongoDb", mongoDb()); @@ -118,6 +119,13 @@ private static DockerService kafka() { .build(); } + private static DockerService kafkaNative() { + return DockerService.withImageAndTag("apache/kafka-native") + .website("https://hub.docker.com/r/confluentinc/cp-kafka") + .ports(9092) + .build(); + } + private static DockerService mariaDb() { return DockerService.withImageAndTag("mariadb").website("https://hub.docker.com/_/mariadb").ports(3306).build(); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java index 66d84f0f87..3431c1bf67 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java @@ -18,7 +18,10 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections.ServiceConnection; import io.spring.start.site.container.ServiceConnectionsCustomizer; @@ -34,7 +37,17 @@ @ProjectGenerationConfiguration class SpringKafkaProjectGenerationConfiguration { - private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.KafkaContainer"; + private static final String TESTCONTAINERS_CONFLUENT_CLASS_NAME = "org.testcontainers.containers.KafkaContainer"; + + private static final String TESTCONTAINERS_APACHE_CLASS_NAME = "org.testcontainers.kafka.KafkaContainer"; + + private static final VersionRange SPRING_BOOT_3_4_M2_OR_LATER = VersionParser.DEFAULT.parseRange("3.4.0-M2"); + + private final boolean isSpringBoot34OrLater; + + SpringKafkaProjectGenerationConfiguration(ProjectDescription projectDescription) { + this.isSpringBoot34OrLater = SPRING_BOOT_3_4_M2_OR_LATER.match(projectDescription.getPlatformVersion()); + } @Bean @ConditionalOnRequestedDependency("kafka") @@ -47,8 +60,15 @@ SpringKafkaBuildCustomizer springKafkaBuildCustomizer() { ServiceConnectionsCustomizer kafkaServiceConnectionsCustomizer(Build build, DockerServiceResolver serviceResolver) { return (serviceConnections) -> { if (isKafkaEnabled(build)) { - serviceResolver.doWith("kafka", (service) -> serviceConnections.addServiceConnection( - ServiceConnection.ofContainer("kafka", service, TESTCONTAINERS_CLASS_NAME, false))); + if (this.isSpringBoot34OrLater) { + serviceResolver.doWith("kafka-native", (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("kafka", service, TESTCONTAINERS_APACHE_CLASS_NAME, false))); + } + else { + serviceResolver.doWith("kafka", + (service) -> serviceConnections.addServiceConnection(ServiceConnection.ofContainer("kafka", + service, TESTCONTAINERS_CONFLUENT_CLASS_NAME, false))); + } } }; } From b1f668b8c18f71ca843cfdde6e977da3e2379b13 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 25 Sep 2024 15:03:40 +0200 Subject: [PATCH 674/825] Polish "Generate test app for Kafka using KafkaContainer and apache/kafka-native" See gh-1597 --- .../start/site/container/SimpleDockerServiceResolver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index e7c66f7168..5d158a9e0e 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -121,7 +121,7 @@ private static DockerService kafka() { private static DockerService kafkaNative() { return DockerService.withImageAndTag("apache/kafka-native") - .website("https://hub.docker.com/r/confluentinc/cp-kafka") + .website("https://hub.docker.com/r/apache/kafka-native") .ports(9092) .build(); } From 3d7aa9abed9000a2b1305c17e589addfb2dd2e99 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 27 Sep 2024 14:31:44 +0200 Subject: [PATCH 675/825] Add OTLP for metrics entry Closes gh-1598 --- .../ObservabilityActuatorBuildCustomizer.java | 2 +- .../springmodulith/SpringModulithBuildCustomizer.java | 2 +- start-site/src/main/resources/application.yml | 10 ++++++++++ .../ObservabilityActuatorBuildCustomizerTests.java | 4 ++-- .../SpringModulithBuildCustomizerTests.java | 4 ++-- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java index 8f870b3ab9..a199ce069c 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java @@ -31,7 +31,7 @@ class ObservabilityActuatorBuildCustomizer implements BuildCustomizer { private static final List STANDARD_REGISTRY_IDS = Arrays.asList("datadog", "distributed-tracing", - "dynatrace", "graphite", "influx", "new-relic", "wavefront", "zipkin"); + "dynatrace", "graphite", "influx", "new-relic", "otlp-metrics", "wavefront", "zipkin"); @Override public void customize(Build build) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java index 91604af4cd..c5f0a5fe65 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java @@ -37,7 +37,7 @@ class SpringModulithBuildCustomizer implements BuildCustomizer { private static final Collection OBSERVABILITY_DEPENDENCIES = List.of("actuator", "datadog", "graphite", - "influx", "new-relic", "prometheus", "wavefront", "zipkin"); + "influx", "new-relic", "otlp-metrics", "prometheus", "wavefront", "zipkin"); private static final Collection PERSISTENCE = List.of("jdbc", "jpa", "mongodb"); diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e07563c3f8..87b497a06f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -995,6 +995,16 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.newrelic + - name: OTLP for metrics + id: otlp-metrics + groupId: io.micrometer + artifactId: micrometer-registry-otlp + scope: runtime + starter: false + description: Publish Micrometer metrics to an OTLP capable backend. + links: + - rel: reference + href: https://docs.spring.io/spring-boot/reference/actuator/metrics.html#actuator.metrics.export.otlp - name: Prometheus id: prometheus groupId: io.micrometer diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java index bc75bcf8e5..ed0002ca4b 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java @@ -34,8 +34,8 @@ class ObservabilityActuatorBuildCustomizerTests extends AbstractExtensionTests { private static final String SPRING_BOOT_VERSION = "3.3.0"; @ParameterizedTest - @ValueSource(strings = { "datadog", "dynatrace", "influx", "graphite", "new-relic", "distributed-tracing", "zipkin", - "wavefront" }) + @ValueSource(strings = { "datadog", "dynatrace", "influx", "graphite", "new-relic", "otlp-metrics", + "distributed-tracing", "zipkin", "wavefront" }) void actuatorIsAddedWithObservabilityEntries(String dependency) { assertThat(generateProject(SPRING_BOOT_VERSION, dependency)).mavenBuild() .hasDependency(getDependency("actuator")); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java index 81ac376dfb..86ce6f09e4 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java @@ -55,8 +55,8 @@ void registersActuatorStarterIfActuatorsIsPresent() { } @ParameterizedTest - @ValueSource( - strings = { "actuator", "datadog", "graphite", "influx", "new-relic", "prometheus", "wavefront", "zipkin" }) + @ValueSource(strings = { "actuator", "datadog", "graphite", "influx", "new-relic", "otlp-metrics", "prometheus", + "wavefront", "zipkin" }) void registersObservabilityStarterIfObservabilityDependencyIsPresent(String dependency) { Build build = createBuild("modulith"); build.dependencies().add(dependency); From 6d1dcb52c0a5650f8b75f00cc69a5b7e5fb17dbc Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 27 Sep 2024 14:33:58 +0200 Subject: [PATCH 676/825] Add actuator when Prometheus is selected Closes gh-1599 --- .../observability/ObservabilityActuatorBuildCustomizer.java | 2 +- .../ObservabilityActuatorBuildCustomizerTests.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java index a199ce069c..12937c1a84 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizer.java @@ -31,7 +31,7 @@ class ObservabilityActuatorBuildCustomizer implements BuildCustomizer { private static final List STANDARD_REGISTRY_IDS = Arrays.asList("datadog", "distributed-tracing", - "dynatrace", "graphite", "influx", "new-relic", "otlp-metrics", "wavefront", "zipkin"); + "dynatrace", "graphite", "influx", "new-relic", "otlp-metrics", "prometheus", "wavefront", "zipkin"); @Override public void customize(Build build) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java index ed0002ca4b..6c3f6c9feb 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java @@ -34,7 +34,7 @@ class ObservabilityActuatorBuildCustomizerTests extends AbstractExtensionTests { private static final String SPRING_BOOT_VERSION = "3.3.0"; @ParameterizedTest - @ValueSource(strings = { "datadog", "dynatrace", "influx", "graphite", "new-relic", "otlp-metrics", + @ValueSource(strings = { "datadog", "dynatrace", "influx", "graphite", "new-relic", "otlp-metrics", "prometheus", "distributed-tracing", "zipkin", "wavefront" }) void actuatorIsAddedWithObservabilityEntries(String dependency) { assertThat(generateProject(SPRING_BOOT_VERSION, dependency)).mavenBuild() From 407ec4deba8a3437e12036ce7d44081070fca4c5 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 30 Sep 2024 11:19:55 +0200 Subject: [PATCH 677/825] Update yarn lockfile --- start-client/yarn.lock | 104 ++++++++++++++++++++++++----------------- 1 file changed, 62 insertions(+), 42 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 89888c8959..7ef8b39604 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -2084,17 +2084,37 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.19.5" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" - integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz#91f06cda1049e8f17eeab364798ed79c97488a1c" + integrity sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.17.13": +"@types/express-serve-static-core@^4.17.33": + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/express@^4.17.13": version "4.17.21" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== @@ -2207,9 +2227,9 @@ "@types/node" "*" "@types/node@*": - version "22.7.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.0.tgz#670aa1874bc836863e5c116f9f2c32416ff27e1f" - integrity sha512-MOdOibwBs6KW1vfqz2uKMlxq5xAfAZ98SZjO8e3XnAbFnTJtAspqhWk7hrdSAs9/Y14ZWMiy7/MxMUzAOadYEw== + version "22.7.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.4.tgz#e35d6f48dca3255ce44256ddc05dee1c23353fcc" + integrity sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg== dependencies: undici-types "~6.19.2" @@ -3364,9 +3384,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001663: - version "1.0.30001663" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz#1529a723505e429fdfd49532e9fc42273ba7fed7" - integrity sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA== + version "1.0.30001664" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" + integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== caseless@~0.12.0: version "0.12.0" @@ -4189,9 +4209,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.5.28: - version "1.5.28" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz#aee074e202c6ee8a0030a9c2ef0b3fe9f967d576" - integrity sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw== + version "1.5.29" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" + integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== emittery@^0.10.2: version "0.10.2" @@ -4413,7 +4433,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.1.1, escalade@^3.1.2: +escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== @@ -4472,9 +4492,9 @@ eslint-import-resolver-node@^0.3.9: resolve "^1.22.4" eslint-module-utils@^2.9.0: - version "2.11.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.11.1.tgz#6d5a05f09af98f4d238a819ae4c23626a75fa65b" - integrity sha512-EwcbfLOhwVMAfatfqLecR2yv3dE5+kQ8kx+Rrt0DvDXEVwW86KQ/xbMDQhtp5l42VXukD5SOF8mQQHbaNtO0CQ== + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== dependencies: debug "^3.2.7" @@ -4544,9 +4564,9 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.23.2: - version "7.36.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz#f1dabbb11f3d4ebe8b0cf4e54aff4aee81144ee5" - integrity sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA== + version "7.37.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.0.tgz#c21f64a32fc34df1eaeca571ec8f70bdc40dd20a" + integrity sha512-IHBePmfWH5lKhJnJ7WB1V+v/GolbB0rjS8XYVCSQCZKaQCAUhMoVoOEn1Ef8Z8Wf0a7l8KTJvuZg5/e4qrZ6nA== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" @@ -4967,9 +4987,9 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-uri@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" - integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.2.tgz#d78b298cf70fd3b752fd951175a3da6a7b48f024" + integrity sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row== fastest-levenshtein@^1.0.12: version "1.0.16" @@ -8579,7 +8599,7 @@ phin@^3.7.1: dependencies: centra "^2.7.0" -picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: +picocolors@^1.0.0, picocolors@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== @@ -9359,9 +9379,9 @@ rollup-plugin-terser@^7.0.0: terser "^5.0.0" rollup@^2.43.1: - version "2.79.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + version "2.79.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.2.tgz#f150e4a5db4b121a21a747d762f701e5e9f49090" + integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ== optionalDependencies: fsevents "~2.3.2" @@ -9450,9 +9470,9 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.79.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.79.3.tgz#7811b000eb68195fe51dea89177e73e7ef7f546f" - integrity sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA== + version "1.79.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.79.4.tgz#f9c45af35fbeb53d2c386850ec842098d9935267" + integrity sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg== dependencies: chokidar "^4.0.0" immutable "^4.0.0" @@ -10317,9 +10337,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.33.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.33.0.tgz#8f9149538c7468ffcb1246cfec603c16720d2db1" - integrity sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g== + version "5.34.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.34.1.tgz#af40386bdbe54af0d063e0670afd55c3105abeb6" + integrity sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10768,12 +10788,12 @@ upath@^1.2.0: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== update-browserslist-db@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" - integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" + escalade "^3.2.0" + picocolors "^1.1.0" uri-js@^4.2.2: version "4.4.1" @@ -11046,9 +11066,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.94.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" - integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== + version "5.95.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.95.0.tgz#8fd8c454fa60dad186fbe36c400a55848307b4c0" + integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== dependencies: "@types/estree" "^1.0.5" "@webassemblyjs/ast" "^1.12.1" From 3767fe19169337b7e5f10f16537b86c084c3ba20 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 30 Sep 2024 13:37:57 +0200 Subject: [PATCH 678/825] Add helper methods to AbstractExtensionTests --- .../site/extension/AbstractExtensionTests.java | 18 ++++++++++++++++++ ...BuildSystemHelpDocumentCustomizerTests.java | 7 +++---- ...BuildSystemHelpDocumentCustomizerTests.java | 7 +++---- .../KotlinCoroutinesCustomizerTests.java | 5 ++--- .../DgsCodegenHelpDocumentCustomizerTests.java | 6 +++--- .../GraalVmHelpDocumentCustomizerTests.java | 4 +--- ...servabilityHelpDocumentCustomizerTests.java | 7 +++---- .../okta/OktaHelpDocumentCustomizerTests.java | 6 +++--- ...ureProjectGenerationConfigurationTests.java | 2 +- ...oudFunctionHelpDocumentCustomizerTests.java | 6 +++--- ...ionProjectGenerationConfigurationTests.java | 3 +-- ...ersProjectGenerationConfigurationTests.java | 3 +-- ...dinProjectGenerationConfigurationTests.java | 6 ++---- ...dJvmVersionHelpDocumentCustomizerTests.java | 6 +++--- ...PackageNameHelpDocumentCustomizerTests.java | 6 +++--- ...ltApplicationPropertiesCustomizerTests.java | 11 +++-------- 16 files changed, 53 insertions(+), 50 deletions(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java b/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java index 8a8fcbe327..0a9db9caf0 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java @@ -101,6 +101,24 @@ protected AssertProvider composeFile(ProjectRequest request) { return () -> new TextAssert(project.getProjectDirectory().resolve("compose.yaml")); } + protected AssertProvider applicationProperties(ProjectRequest request) { + ProjectStructure project = generateProject(request); + return () -> new TextAssert(project.getProjectDirectory().resolve("src/main/resources/application.properties")); + } + + protected AssertProvider gitIgnore(ProjectRequest request) { + ProjectStructure project = generateProject(request); + return () -> new TextAssert(project.getProjectDirectory().resolve(".gitignore")); + } + + protected AssertProvider helpDocument(ProjectStructure project) { + return () -> new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + } + + protected AssertProvider helpDocument(ProjectRequest request) { + return helpDocument(generateProject(request)); + } + protected ProjectStructure generateProject(ProjectRequest request) { ProjectGenerationResult result = getInvoker().invokeProjectStructureGeneration(request); return new ProjectStructure(result.getRootDirectory()); diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java index fe8970a452..7b95f58773 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java @@ -16,13 +16,13 @@ package io.spring.start.site.extension.build.gradle; -import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.assertj.core.api.ListAssert; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link GradleBuildSystemHelpDocumentCustomizer}. * @@ -63,8 +63,7 @@ private ListAssert assertHelpDocument(String type, String version) { ProjectRequest request = createProjectRequest("web"); request.setType(type); request.setBootVersion(version); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); + return assertThat(helpDocument(request)).lines(); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java index c430cb05b6..147116d9b5 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java @@ -16,13 +16,13 @@ package io.spring.start.site.extension.build.maven; -import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.assertj.core.api.ListAssert; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link MavenBuildSystemHelpDocumentCustomizer}. * @@ -61,8 +61,7 @@ private ListAssert assertHelpDocument(String type, String version) { ProjectRequest request = createProjectRequest("web"); request.setType(type); request.setBootVersion(version); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); + return assertThat(helpDocument(request)).lines(); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java index c2b3ff2ab0..b05cdfe4f0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java @@ -37,9 +37,8 @@ void kotlinCoroutinesIsAdded() { request.setLanguage("kotlin"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("org.jetbrains.kotlinx", "kotlinx-coroutines-reactor"); - assertThat(project).textFile("HELP.md") - .contains( - "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring/docs/6.1.8/spring-framework-reference/languages.html#coroutines)"); + assertThat(helpDocument(request)).contains( + "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring/docs/6.1.8/spring-framework-reference/languages.html#coroutines)"); } @Test diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizerTests.java index 7714880ad4..9d49a7e493 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenHelpDocumentCustomizerTests.java @@ -18,13 +18,14 @@ import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link DgsCodegenHelpDocumentCustomizer}. * @@ -52,8 +53,7 @@ void gradleBuildAddsLinkToGradleCodegenPlugin() { private TextAssert assertHelpDocument(String type, String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); request.setType(type); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(request)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java index 0ec9c9e040..5a52066e79 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java @@ -24,7 +24,6 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.generator.version.Version; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; @@ -146,8 +145,7 @@ void shouldNotDocumentGradleToolchainLimitationsWhenUsingMaven() { } private TextAssert assertHelpDocument(ProjectRequest request) { - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(request)); } private TextAssert assertHelpDocument(String type, String... dependencies) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java index 9b1dae50d9..44f9777fdb 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java @@ -16,13 +16,13 @@ package io.spring.start.site.extension.dependency.observability; -import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.assertj.core.api.ListAssert; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link ObservabilityHelpDocumentCustomizer}. * @@ -57,8 +57,7 @@ private ListAssert assertHelpDocument(String version, String... dependen ProjectRequest request = createProjectRequest(dependencies); request.setType("gradle-build"); request.setBootVersion(version); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); + return assertThat(helpDocument(request)).lines(); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java index 921908539b..145284c186 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java @@ -17,11 +17,12 @@ package io.spring.start.site.extension.dependency.okta; import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link OktaHelpDocumentCustomizer}. * @@ -44,8 +45,7 @@ void oktaSectionWithoutOktaDependencyIsMissing() { private TextAssert assertHelpDocument(String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); request.setBootVersion(SPRING_BOOT_VERSION); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(request)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java index 4590531a98..f980c5c21c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java @@ -130,7 +130,7 @@ private ProjectStructure generateProject(String bootVersion, String... dependenc } private TextAssert assertThatHelpDocumentOf(ProjectStructure project) { - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(project)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java index 54c63382e1..2b6218da9e 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java @@ -41,7 +41,7 @@ void functionBuildSetupInfoSectionAddedForMaven() { request.setBootVersion(SPRING_BOOT_VERSION); request.setType("maven-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); - assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); + assertThat(helpDocument(request)).contains(AZURE_SECTION_TITLE); } @Test @@ -50,13 +50,13 @@ void functionBuildSetupInfoSectionAddedForGradle() { request.setBootVersion(SPRING_BOOT_VERSION); request.setType("gradle-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); - assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); + assertThat(helpDocument(request)).contains(AZURE_SECTION_TITLE); } @Test void functionBuildSetupInfoSectionNotAddedWhenFunctionAndCloudDependenciesAbsent() { ProjectRequest request = createProjectRequest(); - assertThat(generateProject(request)).textFile("HELP.md").doesNotContain(AZURE_SECTION_TITLE); + assertThat(helpDocument(request)).doesNotContain(AZURE_SECTION_TITLE); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java index 0cecbd417f..123d22fb20 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java @@ -120,8 +120,7 @@ private ProjectStructure generateProject(String... dependencies) { private TextAssert assertHelpDocument(String... dependencyIds) { ProjectRequest request = createProjectRequest(dependencyIds); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(request)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 6d547b55ab..d06ad5ea0f 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -476,8 +476,7 @@ private ProjectStructure generateProject(String platformVersion, String... depen private TextAssert assertHelpDocument(String platformVersion, String... dependencyIds) { ProjectRequest request = createProjectRequest(dependencyIds); request.setBootVersion(platformVersion); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(request)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java index 67da317458..639beeec91 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java @@ -113,14 +113,12 @@ void gitIgnoreWithoutVaadinDoesNotIgnoreNodeModules() { @Test void shouldAddLaunchBrowserProperty() { - assertThat(generateProject(createProjectRequest("vaadin"))).textFile("src/main/resources/application.properties") - .contains("vaadin.launch-browser=true"); + assertThat(applicationProperties(createProjectRequest("vaadin"))).lines().contains("vaadin.launch-browser=true"); } @Test void shouldNotAddLaunchBrowserPropertyIfVaadinIsNotSelected() { - assertThat(generateProject(createProjectRequest("data-jpa"))).textFile("src/main/resources/application.properties") - .doesNotContain("vaadin.launch-browser=true"); + assertThat(applicationProperties(createProjectRequest("data-jpa"))).lines().doesNotContain("vaadin.launch-browser=true"); } @Override diff --git a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java index b6452e134d..16fb3a8112 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java @@ -18,11 +18,12 @@ import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link InvalidJvmVersionHelpDocumentCustomizer}. * @@ -56,8 +57,7 @@ void warningNotAddedWithCompatibleVersion() { } private TextAssert assertHelpDocument(ProjectRequest request) { - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(request)); } private TextAssert assertHelpDocument(String platformVersion, String jvmVersion) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java index 3b62ae1923..f31bed08a1 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidPackageNameHelpDocumentCustomizerTests.java @@ -17,11 +17,12 @@ package io.spring.start.site.extension.description; import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link InvalidPackageNameHelpDocumentCustomizer}. * @@ -44,8 +45,7 @@ void warningNotAddedWithValidPackageName() { private TextAssert assertHelpDocument(String packageName) { ProjectRequest request = createProjectRequest("web"); request.setPackageName(packageName); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); + return assertThat(helpDocument(request)); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java index b3579fc4c2..26b19792f6 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/properties/DefaultApplicationPropertiesCustomizerTests.java @@ -16,12 +16,12 @@ package io.spring.start.site.extension.properties; -import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for {@link DefaultApplicationPropertiesCustomizer}. * @@ -34,12 +34,7 @@ void shouldAddSpringApplicationName() { ProjectRequest request = createProjectRequest("web"); request.setJavaVersion("21"); request.setName("test"); - assertApplicationProperties(request).lines().contains("spring.application.name=test"); - } - - private TextAssert assertApplicationProperties(ProjectRequest request) { - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("src/main/resources/application.properties")); + assertThat(applicationProperties(request)).lines().contains("spring.application.name=test"); } } From 412d95dfddf7fe865aeff7028de94e613de5496d Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 27 Sep 2024 17:18:05 +0200 Subject: [PATCH 679/825] Add support for JTE Closes gh-1560 --- .../jte/JteGradleBuildCustomizer.java | 40 ++++++ .../jte/JteHelpDocumentCustomizer.java | 36 ++++++ .../jte/JteMavenBuildCustomizer.java | 48 +++++++ .../JteProjectGenerationConfiguration.java | 90 +++++++++++++ .../dependency/jte/package-info.java | 20 +++ .../main/resources/META-INF/spring.factories | 1 + start-site/src/main/resources/application.yml | 10 ++ .../src/main/resources/templates/jte.mustache | 19 +++ ...teProjectGenerationConfigurationTests.java | 119 ++++++++++++++++++ 9 files changed, 383 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteGradleBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteHelpDocumentCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteMavenBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/jte/package-info.java create mode 100644 start-site/src/main/resources/templates/jte.mustache create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfigurationTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteGradleBuildCustomizer.java new file mode 100644 index 0000000000..fa81d81522 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteGradleBuildCustomizer.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.jte; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} to configure the JTE Gradle plugin. + * + * @author Moritz Halbritter + */ +class JteGradleBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(GradleBuild build) { + Dependency jteStarter = build.dependencies().get("jte"); + build.plugins().add("gg.jte.gradle", (plugin) -> plugin.setVersion(jteStarter.getVersion().getValue())); + build.extensions().customize("jte", (jte) -> { + jte.invoke("generate"); + jte.attribute("binaryStaticContent", "true"); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteHelpDocumentCustomizer.java new file mode 100644 index 0000000000..7671f76c4b --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteHelpDocumentCustomizer.java @@ -0,0 +1,36 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.jte; + +import java.util.Collections; + +import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; + +/** + * {@link HelpDocumentCustomizer} to add a JTE section. + * + * @author Moritz Halbritter + */ +class JteHelpDocumentCustomizer implements HelpDocumentCustomizer { + + @Override + public void customize(HelpDocument document) { + document.addSection("jte", Collections.emptyMap()); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteMavenBuildCustomizer.java new file mode 100644 index 0000000000..b918cb3452 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteMavenBuildCustomizer.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.jte; + +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} to configure the JTE Maven plugin. + * + * @author Moritz Halbritter + */ +class JteMavenBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(MavenBuild build) { + Dependency jteStarter = build.dependencies().get("jte"); + build.plugins().add("gg.jte", "jte-maven-plugin", (plugin) -> { + plugin.version(jteStarter.getVersion().getValue()); + plugin.execution("jte-generate", (execution) -> { + execution.phase("generate-sources"); + execution.goal("generate"); + execution.configuration((configuration) -> { + configuration.add("sourceDirectory", "${project.basedir}/src/main/jte"); + configuration.add("contentType", "Html"); + configuration.add("binaryStaticContent", "true"); + configuration.add("targetResourceDirectory", "${project.build.outputDirectory}"); + }); + }); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfiguration.java new file mode 100644 index 0000000000..ffa3c81e94 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfiguration.java @@ -0,0 +1,90 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.jte; + +import java.nio.file.Files; +import java.nio.file.Path; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.generator.project.contributor.ProjectContributor; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.generator.spring.properties.ApplicationPropertiesCustomizer; +import io.spring.initializr.generator.spring.scm.git.GitIgnoreCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * {@link ProjectGenerationConfiguration} for JTE. + * + * @author Moritz Halbritter + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("jte") +class JteProjectGenerationConfiguration { + + @Bean + ProjectContributor jteTemplateDirectoryProjectContributor() { + return (projectRoot) -> { + Path templatesDirectory = projectRoot.resolve("src/main/jte"); + Files.createDirectories(templatesDirectory); + }; + } + + @Bean + ApplicationPropertiesCustomizer jteApplicationPropertiesCustomizer() { + return (properties) -> properties.add("gg.jte.development-mode", true); + } + + @Bean + BuildCustomizer jteBuildCustomizer() { + // https://github.com/casid/jte/issues/381 + return (build) -> { + Dependency jteStarter = build.dependencies().get("jte"); + build.dependencies() + .add("jte-core", Dependency.withCoordinates("gg.jte", "jte").version(jteStarter.getVersion()).build()); + }; + } + + @Bean + GitIgnoreCustomizer jteGitIgnoreCustomizer() { + return (gitignore) -> gitignore.addSectionIfAbsent("JTE").add("/jte-classes/"); + } + + @Bean + JteHelpDocumentCustomizer jteHelpDocumentCustomizer() { + return new JteHelpDocumentCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + JteGradleBuildCustomizer jteGradleBuildCustomizer() { + return new JteGradleBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + JteMavenBuildCustomizer jteMavenBuildCustomizer() { + return new JteMavenBuildCustomizer(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/package-info.java new file mode 100644 index 0000000000..ddc28f9e2a --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/jte/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on JTE. + */ +package io.spring.start.site.extension.dependency.jte; diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 216c753ae8..4d5022e73e 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -15,6 +15,7 @@ io.spring.start.site.extension.dependency.flyway.FlywayProjectGenerationConfigur io.spring.start.site.extension.dependency.graalvm.GraalVmProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.graphql.SpringGraphQlProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.htmx.HtmxProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.jte.JteProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mariadb.MariaDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mongodb.MongoDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mysql.MysqlProjectGenerationConfiguration,\ diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 87b497a06f..a0769b1b3d 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -399,6 +399,16 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.servlet.spring-mvc.template-engines + - name: JTE + id: jte + description: Secure and lightweight template engine for Java and Kotlin. + groupId: gg.jte + artifactId: jte-spring-boot-starter-3 + version: 3.1.12 + starter: true + links: + - rel: reference + href: https://jte.gg/ - name: Security content: - name: Spring Security diff --git a/start-site/src/main/resources/templates/jte.mustache b/start-site/src/main/resources/templates/jte.mustache new file mode 100644 index 0000000000..a140ccc64d --- /dev/null +++ b/start-site/src/main/resources/templates/jte.mustache @@ -0,0 +1,19 @@ +## JTE + +This project has been configured to use [JTE precompiled templates](https://jte.gg/pre-compiling/). + +However, to ease development, those are not enabled out of the box. +For production deployments, you should remove + +```properties +gg.jte.development-mode=true +``` + +from the `application.properties` file and set + +```properties +gg.jte.use-precompiled-templates=true +``` + +instead. +For more details, please take a look at [the official documentation](https://jte.gg/spring-boot-starter-3/). diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..95cdd4781b --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/jte/JteProjectGenerationConfigurationTests.java @@ -0,0 +1,119 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.jte; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link JteProjectGenerationConfiguration}. + * + * @author Moritz Halbritter + */ +class JteProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private final Dependency jte = Dependency.withId("jte", "gg.jte", "jte-spring-boot-starter-3"); + + @Test + void shouldDoNothingIfJteIsNotSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotHaveDependency(this.jte.getGroupId(), this.jte.getArtifactId()); + assertThat(mavenPom(request)).doesNotHaveDependency("gg.jte", "jte"); + ProjectStructure structure = generateProject(request); + assertThat(structure).doesNotContainDirectories("src/main/jte"); + assertThat(applicationProperties(request)).lines().doesNotContain("gg.jte.development-mode=true"); + assertThat(gitIgnore(request)).lines().doesNotContain("/jte-classes/"); + assertThat(helpDocument(request)).lines().doesNotContain("## JTE"); + } + + @Test + void shouldAddJteCore() { + ProjectRequest request = createProjectRequest("jte"); + assertThat(mavenPom(request)).hasDependency("gg.jte", "jte"); + } + + @Test + void shouldCreateTemplateDirectory() { + ProjectRequest request = createProjectRequest("jte"); + ProjectStructure structure = generateProject(request); + assertThat(structure).containsDirectories("src/main/jte"); + } + + @Test + void shouldAddProperties() { + ProjectRequest request = createProjectRequest("jte"); + assertThat(applicationProperties(request)).lines().contains("gg.jte.development-mode=true"); + } + + @Test + void shouldAddGitIgnoreEntries() { + ProjectRequest request = createProjectRequest("jte"); + assertThat(gitIgnore(request)).lines().contains("/jte-classes/"); + } + + @Test + void shouldAddHelpSection() { + ProjectRequest request = createProjectRequest("jte"); + assertThat(helpDocument(request)).lines().contains("## JTE"); + } + + @Test + void shouldAddGradlePluginAndConfigureIt() { + String jteVersion = getDependency("jte").getVersion(); + ProjectRequest request = createProjectRequest("jte"); + assertThat(gradleBuild(request)).hasPlugin("gg.jte.gradle", jteVersion).containsIgnoringWhitespaces(""" + jte { + generate() + binaryStaticContent = true + } + """); + } + + @Test + void shouldAddMavenPluginAndConfigureIt() { + String jteVersion = getDependency("jte").getVersion(); + ProjectRequest request = createProjectRequest("jte"); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + gg.jte + jte-maven-plugin + %s + + + jte-generate + generate-sources + + generate + + + ${project.basedir}/src/main/jte + Html + true + ${project.build.outputDirectory} + + + + + """.formatted(jteVersion)); + } + +} From fb8ee03c82a32afb0c1939cb15562913a07b9b05 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 30 Sep 2024 16:29:40 +0200 Subject: [PATCH 680/825] Include "OpenTelemetry Protocol" into the OTLP description --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index a0769b1b3d..aae673739f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1011,7 +1011,7 @@ initializr: artifactId: micrometer-registry-otlp scope: runtime starter: false - description: Publish Micrometer metrics to an OTLP capable backend. + description: Publish Micrometer metrics to an OpenTelemetry Protocol (OTLP) capable backend. links: - rel: reference href: https://docs.spring.io/spring-boot/reference/actuator/metrics.html#actuator.metrics.export.otlp From 1941d7ca2abfbc8d58bd28bce418c854ed941de3 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:33:43 +0300 Subject: [PATCH 681/825] Upgrade to Vaadin 24.4.13 See gh-1603 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index aae673739f..9148838df2 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -158,7 +158,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.4.12 + version: 24.4.13 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: From d1595ff496696e44e9279c772c71f4309f3a1f46 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 1 Oct 2024 11:41:30 +0200 Subject: [PATCH 682/825] Disable starter flag for JTE See gh-1560 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 9148838df2..66295e25cd 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -405,7 +405,7 @@ initializr: groupId: gg.jte artifactId: jte-spring-boot-starter-3 version: 3.1.12 - starter: true + starter: false # https://github.com/casid/jte/issues/386 links: - rel: reference href: https://jte.gg/ From 960a2210979aede056bafb9ae9e72ab6d9557f69 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 1 Oct 2024 11:43:03 +0200 Subject: [PATCH 683/825] Use mvnw.cmd and gradlew.bat on Windows Also adds a Windows build. --- .github/workflows/build-on-windows.yml | 26 +++++++++++++++++++ .../ProjectGenerationIntegrationTests.java | 10 +++++-- 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/build-on-windows.yml diff --git a/.github/workflows/build-on-windows.yml b/.github/workflows/build-on-windows.yml new file mode 100644 index 0000000000..08a37fc547 --- /dev/null +++ b/.github/workflows/build-on-windows.yml @@ -0,0 +1,26 @@ +name: Build on Windows +on: + push: + branches: + - main + workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + build: + name: Build + runs-on: windows-latest + steps: + - name: Check out + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'liberica' + cache: 'maven' + + - name: Build with Maven + run: ./mvnw --batch-mode --update-snapshots --no-transfer-progress verify diff --git a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java index 314484e582..4a73a1f439 100644 --- a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java @@ -44,6 +44,7 @@ import io.spring.initializr.web.project.WebProjectRequest; import io.spring.start.testsupport.Homes; import io.spring.start.testsupport.TemporaryFiles; +import org.apache.commons.lang3.SystemUtils; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.parallel.Execution; @@ -163,17 +164,22 @@ private void releaseHome(BuildSystem buildSystem, Path home) { private ProcessBuilder createProcessBuilder(BuildSystem buildSystem, Path home) { if (buildSystem.id().equals(MavenBuildSystem.ID)) { - ProcessBuilder processBuilder = new ProcessBuilder("./mvnw", + ProcessBuilder processBuilder = new ProcessBuilder((isWindows()) ? "mvnw.cmd" : "./mvnw", "-Dmaven.repo.local=" + home.resolve("repository").toFile(), "package"); processBuilder.environment().put("MAVEN_USER_HOME", home.toFile().getAbsolutePath()); return processBuilder; } if (buildSystem.id().equals(GradleBuildSystem.ID)) { - ProcessBuilder processBuilder = new ProcessBuilder("./gradlew", "--no-daemon", "build"); + ProcessBuilder processBuilder = new ProcessBuilder((isWindows()) ? "gradlew.bat" : "./gradlew", + "--no-daemon", "build"); processBuilder.environment().put("GRADLE_USER_HOME", home.toFile().getAbsolutePath()); return processBuilder; } throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); } + private boolean isWindows() { + return SystemUtils.IS_OS_WINDOWS; + } + } From cecae8b1447ecee0ebca1ac7b0a756c5e53cf5bd Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 1 Oct 2024 11:45:47 +0200 Subject: [PATCH 684/825] Use mvnw.cmd on Windows --- .github/workflows/build-on-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-on-windows.yml b/.github/workflows/build-on-windows.yml index 08a37fc547..7fa5f32d02 100644 --- a/.github/workflows/build-on-windows.yml +++ b/.github/workflows/build-on-windows.yml @@ -23,4 +23,4 @@ jobs: cache: 'maven' - name: Build with Maven - run: ./mvnw --batch-mode --update-snapshots --no-transfer-progress verify + run: mvnw.cmd --batch-mode --update-snapshots --no-transfer-progress verify From 96a101db6b68ea83cbfc06ed3d4f485b3e066399 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 1 Oct 2024 11:46:48 +0200 Subject: [PATCH 685/825] Use mvnw on Windows --- .github/workflows/build-on-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-on-windows.yml b/.github/workflows/build-on-windows.yml index 7fa5f32d02..faba93f263 100644 --- a/.github/workflows/build-on-windows.yml +++ b/.github/workflows/build-on-windows.yml @@ -23,4 +23,4 @@ jobs: cache: 'maven' - name: Build with Maven - run: mvnw.cmd --batch-mode --update-snapshots --no-transfer-progress verify + run: mvnw --batch-mode --update-snapshots --no-transfer-progress verify From ccce62cc566d59436eac51f7df19f3056ef81013 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 1 Oct 2024 11:47:28 +0200 Subject: [PATCH 686/825] Use ./mvnw.cmd on Windows --- .github/workflows/build-on-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-on-windows.yml b/.github/workflows/build-on-windows.yml index faba93f263..9f849db818 100644 --- a/.github/workflows/build-on-windows.yml +++ b/.github/workflows/build-on-windows.yml @@ -23,4 +23,4 @@ jobs: cache: 'maven' - name: Build with Maven - run: mvnw --batch-mode --update-snapshots --no-transfer-progress verify + run: ./mvnw.cmd --batch-mode --update-snapshots --no-transfer-progress verify From 90b5a3e8a2fbc736e345e3efce2ff89175ff3208 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 1 Oct 2024 11:57:24 +0200 Subject: [PATCH 687/825] Fix Maven and Gradle commands on Windows --- .../spring/start/site/ProjectGenerationIntegrationTests.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java index 4a73a1f439..4957dbca70 100644 --- a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java @@ -164,13 +164,13 @@ private void releaseHome(BuildSystem buildSystem, Path home) { private ProcessBuilder createProcessBuilder(BuildSystem buildSystem, Path home) { if (buildSystem.id().equals(MavenBuildSystem.ID)) { - ProcessBuilder processBuilder = new ProcessBuilder((isWindows()) ? "mvnw.cmd" : "./mvnw", + ProcessBuilder processBuilder = new ProcessBuilder((isWindows()) ? "./mvnw.cmd" : "./mvnw", "-Dmaven.repo.local=" + home.resolve("repository").toFile(), "package"); processBuilder.environment().put("MAVEN_USER_HOME", home.toFile().getAbsolutePath()); return processBuilder; } if (buildSystem.id().equals(GradleBuildSystem.ID)) { - ProcessBuilder processBuilder = new ProcessBuilder((isWindows()) ? "gradlew.bat" : "./gradlew", + ProcessBuilder processBuilder = new ProcessBuilder((isWindows()) ? "./gradlew.bat" : "./gradlew", "--no-daemon", "build"); processBuilder.environment().put("GRADLE_USER_HOME", home.toFile().getAbsolutePath()); return processBuilder; From 57c34b20195847c4baed01b9b340eaed7f0d9a76 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 1 Oct 2024 13:11:35 +0200 Subject: [PATCH 688/825] Try to fix Maven and Gradle commands on Windows --- .../ProjectGenerationIntegrationTests.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java index 4957dbca70..d72450a873 100644 --- a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java @@ -132,8 +132,7 @@ void projectBuilds(Version bootVersion, Packaging packaging, Language language, Path project = this.invoker.invokeProjectStructureGeneration(request).getRootDirectory(); Path home = acquireHome(buildSystem); try { - ProcessBuilder processBuilder = createProcessBuilder(buildSystem, home); - processBuilder.directory(project.toFile()); + ProcessBuilder processBuilder = createProcessBuilder(project, buildSystem, home); Path output = TemporaryFiles.newTemporaryDirectory("ProjectGenerationIntegrationTests-projectBuilds") .resolve("output.log"); processBuilder.redirectError(output.toFile()); @@ -162,17 +161,21 @@ private void releaseHome(BuildSystem buildSystem, Path home) { } } - private ProcessBuilder createProcessBuilder(BuildSystem buildSystem, Path home) { + private ProcessBuilder createProcessBuilder(Path directory, BuildSystem buildSystem, Path home) { if (buildSystem.id().equals(MavenBuildSystem.ID)) { - ProcessBuilder processBuilder = new ProcessBuilder((isWindows()) ? "./mvnw.cmd" : "./mvnw", - "-Dmaven.repo.local=" + home.resolve("repository").toFile(), "package"); - processBuilder.environment().put("MAVEN_USER_HOME", home.toFile().getAbsolutePath()); + String command = (isWindows()) ? "mvnw.cmd" : "mvnw"; + ProcessBuilder processBuilder = new ProcessBuilder(directory.resolve(command).toAbsolutePath().toString(), + "-Dmaven.repo.local=" + home.resolve("repository").toAbsolutePath(), "package"); + processBuilder.environment().put("MAVEN_USER_HOME", home.toAbsolutePath().toString()); + processBuilder.directory(directory.toFile()); return processBuilder; } if (buildSystem.id().equals(GradleBuildSystem.ID)) { - ProcessBuilder processBuilder = new ProcessBuilder((isWindows()) ? "./gradlew.bat" : "./gradlew", + String command = (isWindows()) ? "gradlew.bat" : "gradlew"; + ProcessBuilder processBuilder = new ProcessBuilder(directory.resolve(command).toAbsolutePath().toString(), "--no-daemon", "build"); - processBuilder.environment().put("GRADLE_USER_HOME", home.toFile().getAbsolutePath()); + processBuilder.environment().put("GRADLE_USER_HOME", home.toAbsolutePath().toString()); + processBuilder.directory(directory.toFile()); return processBuilder; } throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); From cdbfba5ca7d5c8b2a464dab43db346a373b1b474 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 2 Oct 2024 10:27:27 +0200 Subject: [PATCH 689/825] Upgrade to Spring Boot 3.3.4 Closes gh-1602 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1a0c232bf9..37b83344ff 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.3 + 3.3.4 io.spring.start start-parent From 6654b73259eef6129b2cb10e3ae6d8fe8e899e00 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 2 Oct 2024 10:35:23 +0200 Subject: [PATCH 690/825] Upgrade to Spring Cloud GCP 5.6.1 Closes gh-1590 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 66295e25cd..4a0f380921 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -115,7 +115,7 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 5.6.0 + version: 5.6.1 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 0adf51c85325ae58360b15ac68ec2b128ee3c43e Mon Sep 17 00:00:00 2001 From: Mridula <66699525+mpeddada1@users.noreply.github.com> Date: Fri, 4 Oct 2024 10:56:05 -0400 Subject: [PATCH 691/825] Update spring-cloud-gcp to 5.7.0 See gh-1608 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4a0f380921..b7f35aa1c1 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -115,7 +115,7 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 5.6.1 + version: 5.7.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From b0e428fbced2225cf4bee271c39d5a5da4d815fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Ko=CC=88ninger?= Date: Fri, 4 Oct 2024 09:33:54 +0200 Subject: [PATCH 692/825] Upgrade to Spring Boot Admin 3.3.4 See gh-1607 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b7f35aa1c1..8eda1a636e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -49,7 +49,7 @@ initializr: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 3.2.3 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.3.3 + version: 3.3.4 netflix-dgs: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-platform-dependencies From 62bd12f7f9897b7f045afa4b04577322e160df00 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Fri, 4 Oct 2024 09:13:34 +0200 Subject: [PATCH 693/825] Update to Camel 4.8.0 See gh-1606 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8eda1a636e..1846fafaa4 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -824,10 +824,10 @@ initializr: href: https://rsocket.io/ - name: Apache Camel id: camel - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 4.6.0 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 4.8.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From ad12311b50735830ecd636a57e602a052ae5a203 Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Thu, 3 Oct 2024 20:02:19 +0700 Subject: [PATCH 694/825] Use OS agnostic newline comparison See gh-1605 --- ...rsProjectGenerationConfigurationTests.java | 108 +++++++++--------- 1 file changed, 57 insertions(+), 51 deletions(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index d06ad5ea0f..fbd512cac2 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -38,6 +38,7 @@ * @author Eddú Meléndez * @author Chris Bono * @author Moritz Halbritter + * @author Ngoc Nhan */ class TestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -191,7 +192,7 @@ void testApplicationWithGroovyAndGenericContainerIsContributed() { request.setLanguage("groovy"); assertThat(generateProject(request)) .textFile("src/test/groovy/com/example/demo/TestcontainersConfiguration.groovy") - .isEqualTo(""" + .isEqualToNormalizingNewlines(""" package com.example.demo import org.springframework.boot.test.context.TestConfiguration @@ -219,7 +220,7 @@ void testApplicationWithJavaAndGenericContainerIsContributed() { request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("java"); assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") - .isEqualTo(""" + .isEqualToNormalizingNewlines(""" package com.example.demo; import org.springframework.boot.test.context.TestConfiguration; @@ -247,7 +248,7 @@ void testApplicationWithKotlinAndGenericContainerIsContributed() { request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("kotlin"); assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestcontainersConfiguration.kt") - .isEqualTo(""" + .isEqualToNormalizingNewlines(""" package com.example.demo import org.springframework.boot.test.context.TestConfiguration @@ -276,7 +277,7 @@ void testApplicationWithGroovyAndSpecificContainerIsContributed() { request.setLanguage("groovy"); ProjectStructure projectStructure = generateProject(request); assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") - .isEqualTo(""" + .isEqualToNormalizingNewlines(""" package com.example.demo import org.springframework.boot.SpringApplication @@ -290,7 +291,7 @@ static void main(String[] args) { } """); assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/TestcontainersConfiguration.groovy") - .isEqualTo(""" + .isEqualToNormalizingNewlines(""" package com.example.demo import org.springframework.boot.test.context.TestConfiguration @@ -311,7 +312,7 @@ CassandraContainer cassandraContainer() { } """); assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/DemoApplicationTests.groovy") - .isEqualTo(""" + .isEqualToNormalizingNewlines(""" package com.example.demo import org.junit.jupiter.api.Test @@ -336,21 +337,23 @@ void testApplicationWithJavaAndSpecificContainerIsContributed() { request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("java"); ProjectStructure projectStructure = generateProject(request); - assertThat(projectStructure).textFile("src/test/java/com/example/demo/TestDemoApplication.java").isEqualTo(""" - package com.example.demo; + assertThat(projectStructure).textFile("src/test/java/com/example/demo/TestDemoApplication.java") + .isEqualToNormalizingNewlines( + """ + package com.example.demo; - import org.springframework.boot.SpringApplication; + import org.springframework.boot.SpringApplication; - public class TestDemoApplication { + public class TestDemoApplication { - public static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestcontainersConfiguration.class).run(args); - } + public static void main(String[] args) { + SpringApplication.from(DemoApplication::main).with(TestcontainersConfiguration.class).run(args); + } - } - """); + } + """); assertThat(projectStructure).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") - .isEqualTo(""" + .isEqualToNormalizingNewlines(""" package com.example.demo; import org.springframework.boot.test.context.TestConfiguration; @@ -370,23 +373,24 @@ CassandraContainer cassandraContainer() { } """); - assertThat(projectStructure).textFile("src/test/java/com/example/demo/DemoApplicationTests.java").isEqualTo(""" - package com.example.demo; + assertThat(projectStructure).textFile("src/test/java/com/example/demo/DemoApplicationTests.java") + .isEqualToNormalizingNewlines(""" + package com.example.demo; - import org.junit.jupiter.api.Test; - import org.springframework.boot.test.context.SpringBootTest; - import org.springframework.context.annotation.Import; + import org.junit.jupiter.api.Test; + import org.springframework.boot.test.context.SpringBootTest; + import org.springframework.context.annotation.Import; - @Import(TestcontainersConfiguration.class) - @SpringBootTest - class DemoApplicationTests { + @Import(TestcontainersConfiguration.class) + @SpringBootTest + class DemoApplicationTests { - @Test - void contextLoads() { - } + @Test + void contextLoads() { + } - } - """); + } + """); } @Test @@ -395,19 +399,20 @@ void testApplicationWithKotlinAndSpecificContainerIsContributed() { request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("kotlin"); ProjectStructure projectStructure = generateProject(request); - assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt").isEqualTo(""" - package com.example.demo + assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt") + .isEqualToNormalizingNewlines(""" + package com.example.demo - import org.springframework.boot.fromApplication - import org.springframework.boot.with + import org.springframework.boot.fromApplication + import org.springframework.boot.with - fun main(args: Array) { - fromApplication().with(TestcontainersConfiguration::class).run(*args) - } - """); + fun main(args: Array) { + fromApplication().with(TestcontainersConfiguration::class).run(*args) + } + """); assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/TestcontainersConfiguration.kt") - .isEqualTo(""" + .isEqualToNormalizingNewlines(""" package com.example.demo import org.springframework.boot.test.context.TestConfiguration @@ -427,23 +432,24 @@ fun cassandraContainer(): CassandraContainer<*> { } """); - assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/DemoApplicationTests.kt").isEqualTo(""" - package com.example.demo + assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/DemoApplicationTests.kt") + .isEqualToNormalizingNewlines(""" + package com.example.demo + + import org.junit.jupiter.api.Test + import org.springframework.boot.test.context.SpringBootTest + import org.springframework.context.annotation.Import - import org.junit.jupiter.api.Test - import org.springframework.boot.test.context.SpringBootTest - import org.springframework.context.annotation.Import + @Import(TestcontainersConfiguration::class) + @SpringBootTest + class DemoApplicationTests { - @Import(TestcontainersConfiguration::class) - @SpringBootTest - class DemoApplicationTests { + @Test + fun contextLoads() { + } - @Test - fun contextLoads() { } - - } - """); + """); } @Test From ec08cd6ca27249a97a32c27784f3266ebd91dbb0 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Mon, 7 Oct 2024 18:40:34 +0200 Subject: [PATCH 695/825] Add favicons --- start-client/static/images/icon_144x144.png | Bin 0 -> 6303 bytes start-client/static/images/icon_192x192.png | Bin 0 -> 8553 bytes start-client/static/images/icon_256x256.png | Bin 0 -> 10696 bytes start-client/static/images/icon_384x384.png | Bin 0 -> 19617 bytes start-client/static/images/icon_512x512.png | Bin 0 -> 21861 bytes start-client/static/images/icon_72x72.png | Bin 0 -> 2907 bytes start-client/static/images/icon_96x96.png | Bin 0 -> 3966 bytes start-client/static/index.html | 8 ++++++++ 8 files changed, 8 insertions(+) create mode 100644 start-client/static/images/icon_144x144.png create mode 100644 start-client/static/images/icon_192x192.png create mode 100644 start-client/static/images/icon_256x256.png create mode 100644 start-client/static/images/icon_384x384.png create mode 100644 start-client/static/images/icon_512x512.png create mode 100644 start-client/static/images/icon_72x72.png create mode 100644 start-client/static/images/icon_96x96.png diff --git a/start-client/static/images/icon_144x144.png b/start-client/static/images/icon_144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..b030bf4d851515082db0abf52156d40b0f66f849 GIT binary patch literal 6303 zcmYLu1yqyY|Nnw!ba#yoNk=LTV}Nu>NQc1aP!NYoqjU%ZK}U(;2mvWai-brBBFLl> zfeCyN5#jgnJ^yq5=WKg+&fW9A_qq4|iuZe|7Uo8DG~6^G5Qq+GtZxNevo7CM6u{@E z;YvFQ#OZ_7*RhEK@Agv1xp*g#zF+(;3ol#@L~NTCSNbnh`A^FRZR?CXpd1l@jl4XjDP<0VeeWR$eF~_}s%^a-MA=q7pUb6I9SydRUoD z+EEePHQUQ!oj7!B{t|e#WZdU}mt7kn&WZ@VaOffCFdWhRf<6OXE zwnFJGCK!#AveABQgmi7$)?RgvlgDVkM3}1@K4-NFgW`mY$bX`fr9I)2r~Ya&PFV&_ z*h_o`Sv>2Oj?~MA<#?UMaXCDab>x7kQ%}(a@rLj%;VeAN2iYozA>|Kra$wM8gffL*&K+N{y&LMy4e%S7HbR+$#7Hdvs^%$2&*7b~7C_@u zhaP099Cij~&hpAa`^gb?v^`KN;-qr4pVU7ma+&gyD|PUQ^Y#F2#AxJQzFBgmz9SN7 zl#>kU;{qKUERaKC(zo>xE#!pKh+JI-d(%_wwvDq?x6dg%)20V-mee_3DQLexggJ16 ztP7lkLHnWaZYSBnG^xEl?fyKV?X1cyerAB(ez8%PW+8Iq09(rz%!gg>cQiCZ5Tt^Wc zh)#q*5u>4NMz5bmb*@+~=3FDw9V5x&RreswaHJBju8=EP4`rki_$tGhA{9gg6&||b^1jDF%^TOueQxa@>8*N@Lge(MA$U|hjc=U#M>pYC!g3V8XrQPb8Dus`>RGFS^JkoB zoKs{y)3iL>Lr-07)@-t0r7fnSGez3!w5E#5O(8>|PEHIw5r7VO8N?dsFU~k7rT*~B z_??tAtdx}wjpWPjH|$!@1cqes1vQ2VnZl{K`iwh!| zmL?6Mb&Zuv?OohGnw#zgHqJ?`G_`iS_4$IPcd;*cxS^KFQVk4qp#N%?xg6(xS(KDq zzfdU-WocJiyf2f|`iQ4gTg8G*d6FTYb&@VfDulMRg^|kVgdN{?>XX*|0f{KgseCe0 zuf7n5`$VmpaEEYsq$i5(sE{Q5!$6%rPo((rVx%OF zGb$9@iWT14=6Pp|EUVBY5N)h~N=DaAF+C|}5|`IQC_~N#f7wv%3%hX%Sm_$GR;*;v zW7BvFR}7h?=(h>=KDj%joK2|#$@u)sl+ zBUWs%RB!=bgTy-z`AE_CLCw44kxEJmU_9TlH;+1;e7LDef&GO@fY-P5&WrTWNY z2b1RE=TvM?D<7JM)!GojxDt>UG?>vyG_;bio8hMRB+lo=+&3v0Jp1it6W?1ZvepXe z8)jH3FCwMw}Uymm5u3c4Ws9bOwwa5s|oM1^wNn8h+fW;YsJ4R$F z*_Fl~F^(O{t~9;mkvz`xL}hqC?V3A7_^_3ZSV&kgsZE?6w}v!xaMHCWFm~IRYa?2C zi94`nOeaAk#`&EzM*2vygP!g>4`G-)!*&Il<-#)=jO z@?)8HSu@59$eAu)dsANI#Rk+~38wkP8C~0*{AJMBou?yd;@{aH!hVrUoY)A!gEYfz z%tn%*|oChQYpR5VogQ(`h!llsY z;+|saKh}++o824H4!172RmiKe_qh$4oTtpNnk&XDTS*19adcT;^Wraq-EV()4jfUC z&GlW5%_w5?wESXa)m!PqG_1!vvfRm5BizrP`8LnM8`UVfzkctX*Nv~SCryS*K{Ihy zLa1>ubGcA>cZ6OY8CtY|Xu~etfA&8hz1EZ?_BQ{N-UuCY^yYX@m1q-U%n=HZzMcLR zB;wK#MG{aHYHS?OuwgvrgO6p^s@PU*>z6A;?&k3t@uz<%$N|uhVhxKkKqx=SK2oJ? zPlFxW%T#OnYPPO*ckQdSs&tPl0Kdy#eJ^f{v)Eb{b5mS`YoVd6ith_;`-Y_ekMOPG zbNyMzUg(ohNyiiEf?N|OC4B+38`}~N?Pox+Qv7)qYQJjNgcq&Wn)@(!uWzETuE z>}(30l1*BX`)Oz@+K-%Bl}|$Op@}Bj7+*K1Q<$mrkhPP*ip8+&6Ch=N*~^H}c04aV z>ZioYB}|XtMcE1gUJo3(6F+C&HA^zOb}4Ib&9Bsc=F<8AVmEP9|kZPB;vZ&32QGX&NTt!8^R*kXBTTsUN*1%025F-T(VNard+ zP=B4|-By1u!n21{Ssb7YD|Icnai$E>=}=ClR{~i>WWC=r$ngn#d26A5* zicL%ZR7Mk+3JAut{qFAKq>10D)l`WA0q2RDzToZF{VjUJa{+cz2hA%eJ*X0AdFMC= z0QYojsnPP=l8s6C)09^F`6eh(nHj%tx? zFC((3+1VrOowkfvNG=`7yFbZ#jJWT(TnmIY%lr>H)oog)GZ|BbM&s)nT(^Y2W*b!j zvxVah1^=}RsOlq-ZJ6uEZNZ>eB#W&&K$xP7??r-_2ls!UL#7qCQTg=fqIk-6HJ10d zj)HOhG5LFe;2sVVrJCWCG?C#d_|{;7Wu&ZAOvqAwpue-xeO%V7q9eyD_6gDHtB8gd z47BaQ&swKZ>-+U!G{jtdP-e6*%6Tm9*Wd1UL`38bMuq+(Bf<8NGm{A!jc2CK`1zQV z*GEib@n*b8Eao~Vcn|a(=P>`X@AHe=x`fMJy@kFIVp1}_Pxjz&=$vI#%3hu~sx`1e zWziVR7-B>a$Y3&B7wCqa@jB?xs6?rdEPdS@kBR$tqW*feB$lXU13>EYww)7sqzn5nJST?p_&0H0KT7vu1m19su7JS%4`~HxEoJudwqDaLFq?}P?GOmNkcih{_}s7 z1xs#l5a;1`6*q^5F#NOFUXCI%5#_9KJ>k~{3>2h?o*ln?|N2L~ek|^B?k{`ip>>vE zLz^n1Si2SM*M29IJAq3Ta@2^5ppR z>-9v-LZ>m39Kq4U*sZD>cO(d-$m~!s!s5hF4A}(V{U=9c_%@8Jfp4IR5CV$X!!GX~zjC`@ zpNYAxg7k+c8)jWi`}TpFO$8}j9`d*>taZFXp;;F=IYPneRdCGX=#p<0_EabK%;h;4 z%yoxqo&`O^g(&j1KukhqzI2Eb+FUeQgQ2P6-1a<7{yo4cFoRZ+%sR3AWz%UN4Fx$R z7es>2;{Gz=@mv2{6X}33?ZMzV@T##cswR8x_dCK$+9>CUjLc2l$6etkA75!4(ExBw zDP~H#9o8$;(C{|@`70|!X4>>yKTp7BF8>{=Ll)Ucl*mUW4}enIa%s{IdIRzReirpx zX-wKt_ld}}?5du_dsq1!N0XA~zISdCFC2tmFmBXSxJ6$d=F&4*WT73uq6186#n&!|LW#rBPhE&Fy!F-q#z0%Z_+nV z8QC=hW@f%m#(M&^wx^6U$<}d(4I% zfM5!syD}deeJjuWNOsl>(koYt$OO%SXW_Mg%mHdgeDG@y57dOL6;lEL(WXV>>mqqN zZ?-ixdn?5*v`(}8_coa-4(=Q@)D9a)&*JO|_8q%hIu2W=}XGanD2jxzTo7 zl$*N(FD@%DW=OI6Byb~Nrnk^GO*`Zzkj$eib?u0+LMP)#t%#mK0^X9C8`E$ zxZDFQHQ=#vt$sqHWsSx{YHTV|vxjF5&q#&PD@@JLv4r0VvT$S;(2mK6I3;LO7!a)% z^~V^iymOFg7PXRCv-)76X~Xf#NiA-mikfA;O{~=Vc(4h5SE;nni{ypehMc=8A(?SN z$D|HJX{_xZC5n=^m+x-_WftqrWZ=8+hzxzZh5z-Q2Zt(a&KeZWM z{(rpEdT~Fd?mTngl>{{&Qv#s%eilTk_D~{3%c7rp=9K-Qw)WOg{oNCc6yFT%gpXCP zX?)vXuK4alYMD{EBjmE=y15LwEF2!4Nw%{wR4Y!Wg_hrA*x9)toSt3}sqqwGXMac% zBe7WNXX$oSxX_&Cfb+cVn{H3^1COa$2x?xfQ zKVSMrf9(tmic6P$yyLgE_>mE4^${6*bkk~ZpMx=i<)1Pu{|6>)igrkEd%&I5a-Ers zEUE;;&ap!0mgxrTGd+Vnecq{&+JQb{W?H7S$j0AWQS`0*?!jN_f80b&&qNlba0!#g z(|4KB)Z#1v>D^9>(g}`chjPehEGM4`C zz|rZ{7OFgDV&C#Gg=?s9ph@PM;3IvSR4G1H97}b?s?{QJ6(WPAvNB7u+SER$qNLx} z&Ns)V0Y-(1${Zl2M;52v#PF&Co0!T-MYCuy*@pp)=g^u>WA~rnOM46;sD`Vz#grfn zNSlH#6&XYb4oP5SPSvMM&?dcmq#c4aK#Z<%($Y>VD%5jUd3$(xIEwYJF%ey?OhpHQ zI=!P}3F-_!*==-5Jiz-e`U{nlT=%pQW6)aN#y5+pKA?JBs@hPr)%dXgR8 zSHK*QPz}ttU7jTt+)$f71}HO6J2PX1#$-5C?0iXTJaBHWDk}#p5deybh?Vzyzl)B(Cqpi^~CTdzH;C`_;s$~1LbMD zAPPKt2$T45wozoSDUI_r_2;`YD#6bIEee#JrkDY`#4fmOL1=_tEZGTft7(Tgk>On0 zUu+~JHbHM*(OaCvr>HFi1^R3g2L=#IL?^?1rmSr%l!5$AN6}0X21JG8x$$_>QL-Lh66IG;ik$Dw6fw+B zP5jU@&msv}E?`C+!|m1D6nuuYQikT481Wy{Dl85Y?| zlx>Q-REC^OlUuEzb~Xo^wZl)JVO><3WL-=oN-iXsNFLfRf`<-EhXtELXh4Y!Z4#4I tU9?^FT@*8vXFC7C$$#1F&mmoa<#6fOr*54)0)IS!kOt=Z4Z3a*{tvi!o%#R( literal 0 HcmV?d00001 diff --git a/start-client/static/images/icon_192x192.png b/start-client/static/images/icon_192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..324d034e1761a8771328870652328cda98a1230e GIT binary patch literal 8553 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 NTy#RznTU+N{{o%q)RzDN literal 0 HcmV?d00001 diff --git a/start-client/static/images/icon_512x512.png b/start-client/static/images/icon_512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb3af35969d9194d7e52460b9cef4fce4960c94 GIT binary patch literal 21861 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 C`wLP4 literal 0 HcmV?d00001 diff --git a/start-client/static/images/icon_72x72.png b/start-client/static/images/icon_72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..8804cbab9ff55e3ba446e4f20a04cc97df6da42b GIT binary patch literal 2907 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 FV1nxBRpS5v literal 0 HcmV?d00001 diff --git a/start-client/static/images/icon_96x96.png b/start-client/static/images/icon_96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..ff450e791e3a0c0ec667a862119a3f380c6e128a GIT binary patch literal 3966 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 htmlWebpackPlugin.options.title %> + + + + + + + + From df9f120a851a42b1530b7a21503615ccc11cdfaa Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Tue, 8 Oct 2024 09:44:35 +0200 Subject: [PATCH 696/825] Fix images filename --- .../images/{icon_144x144.png => icon-144x144.png} | Bin .../images/{icon_192x192.png => icon-192x192.png} | Bin .../images/{icon_256x256.png => icon-256x256.png} | Bin .../images/{icon_384x384.png => icon-384x384.png} | Bin .../images/{icon_512x512.png => icon-512x512.png} | Bin .../images/{icon_72x72.png => icon-72x72.png} | Bin .../images/{icon_96x96.png => icon-96x96.png} | Bin 7 files changed, 0 insertions(+), 0 deletions(-) rename start-client/static/images/{icon_144x144.png => icon-144x144.png} (100%) rename start-client/static/images/{icon_192x192.png => icon-192x192.png} (100%) rename start-client/static/images/{icon_256x256.png => icon-256x256.png} (100%) rename start-client/static/images/{icon_384x384.png => icon-384x384.png} (100%) rename start-client/static/images/{icon_512x512.png => icon-512x512.png} (100%) rename start-client/static/images/{icon_72x72.png => icon-72x72.png} (100%) rename start-client/static/images/{icon_96x96.png => icon-96x96.png} (100%) diff --git a/start-client/static/images/icon_144x144.png b/start-client/static/images/icon-144x144.png similarity index 100% rename from start-client/static/images/icon_144x144.png rename to start-client/static/images/icon-144x144.png diff --git a/start-client/static/images/icon_192x192.png b/start-client/static/images/icon-192x192.png similarity index 100% rename from start-client/static/images/icon_192x192.png rename to start-client/static/images/icon-192x192.png diff --git a/start-client/static/images/icon_256x256.png b/start-client/static/images/icon-256x256.png similarity index 100% rename from start-client/static/images/icon_256x256.png rename to start-client/static/images/icon-256x256.png diff --git a/start-client/static/images/icon_384x384.png b/start-client/static/images/icon-384x384.png similarity index 100% rename from start-client/static/images/icon_384x384.png rename to start-client/static/images/icon-384x384.png diff --git a/start-client/static/images/icon_512x512.png b/start-client/static/images/icon-512x512.png similarity index 100% rename from start-client/static/images/icon_512x512.png rename to start-client/static/images/icon-512x512.png diff --git a/start-client/static/images/icon_72x72.png b/start-client/static/images/icon-72x72.png similarity index 100% rename from start-client/static/images/icon_72x72.png rename to start-client/static/images/icon-72x72.png diff --git a/start-client/static/images/icon_96x96.png b/start-client/static/images/icon-96x96.png similarity index 100% rename from start-client/static/images/icon_96x96.png rename to start-client/static/images/icon-96x96.png From f3c13f61843a25d2d2d7b07a1d4fcb50a29b2b43 Mon Sep 17 00:00:00 2001 From: Christian Tzolov Date: Wed, 9 Oct 2024 07:59:35 +0200 Subject: [PATCH 697/825] Upgrade Spring AI to 1.0.0-M3 - Upgrade Spring AI version from 1.0.0-M2 to 1.0.0-M3 - Remove explicit version mapping for spring-ai-cassandra-store-spring-boot-starter - Add .vscode/ to .gitignore See gh-1613 --- .gitignore | 4 +++- start-site/src/main/resources/application.yml | 8 +------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index a4e518a941..bc2b431d8c 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,6 @@ target /start-client/.cache/ /start-client/package-lock.json /start-client/yarn-error.log -/start-client/analysis \ No newline at end of file +/start-client/analysis + +.vscode/ \ No newline at end of file diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 1846fafaa4..20a3b65f85 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -88,7 +88,7 @@ initializr: versionProperty: spring-ai.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 1.0.0-M2 + version: 1.0.0-M3 repositories: spring-milestones spring-cloud: groupId: org.springframework.cloud @@ -1472,12 +1472,6 @@ initializr: id: spring-ai-vectordb-cassandra group-id: org.springframework.ai artifact-id: spring-ai-cassandra-store-spring-boot-starter - # spring-ai-cassandra-store-spring-boot-starter is not managed in the BOM - # See https://github.com/spring-projects/spring-ai/pull/1312 - mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 1.0.0-M2 - repository: spring-milestones description: Spring AI vector database support for Apache Cassandra. starter: true links: From cae8c24394a4cc0f300560b18f901038385da952 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 9 Oct 2024 08:40:13 +0200 Subject: [PATCH 698/825] Polish "Upgrade Spring AI to 1.0.0-M3" See gh-1613 --- .gitignore | 5 +++-- .../SpringAiDockerComposeProjectGenerationConfiguration.java | 5 ----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index bc2b431d8c..21c6b153be 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,9 @@ target /nbdist/ /.nb-gradle/ +### Visual Studio Code ### +.vscode/ + ### Start Client ### /start-client/public/ /start-client/node_modules/ @@ -34,5 +37,3 @@ target /start-client/package-lock.json /start-client/yarn-error.log /start-client/analysis - -.vscode/ \ No newline at end of file diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java index 704b76a13b..db4af6a76b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfiguration.java @@ -28,7 +28,6 @@ import io.spring.initializr.generator.spring.build.gradle.DevelopmentOnlyDependencyGradleBuildCustomizer; import io.spring.initializr.generator.spring.build.maven.OptionalDependencyMavenBuildCustomizer; import io.spring.initializr.generator.version.VersionProperty; -import io.spring.initializr.generator.version.VersionReference; import io.spring.initializr.metadata.InitializrMetadata; import org.springframework.context.annotation.Bean; @@ -51,13 +50,9 @@ public class SpringAiDockerComposeProjectGenerationConfiguration { @Bean BuildCustomizer springAiDockerComposeBuildCustomizer(InitializrMetadata metadata) { - // spring-ai-spring-boot-docker-compose is not managed in the BOM - // See https://github.com/spring-projects/spring-ai/issues/1314 - VersionProperty springAiBomVersion = getSpringAiVersion(metadata); return (build) -> build.dependencies() .add(DEPENDENCY_ID, Dependency.withCoordinates("org.springframework.ai", "spring-ai-spring-boot-docker-compose") - .version(VersionReference.ofProperty(springAiBomVersion)) .scope(DependencyScope.RUNTIME)); } From a9f20b855e085627bca944902b1734b341ef9c3b Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:24:30 -0400 Subject: [PATCH 699/825] Upgrade to Spring Cloud 2024.0.0-M2 See gh-1610 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 20a3b65f85..cacaf17371 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -99,7 +99,7 @@ initializr: - compatibilityRange: "[3.2.0,3.4.0-M1)" version: 2023.0.3 - compatibilityRange: "[3.4.0-M1,3.5.0-M1)" - version: 2024.0.0-M1 + version: 2024.0.0-M2 repositories: spring-milestones spring-cloud-azure: groupId: com.azure.spring From 29b4c6c9aefc71a590377b3c88c6174b5bb46419 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 9 Oct 2024 10:14:04 +0200 Subject: [PATCH 700/825] Add json facet to websocket entry Closes gh-1614 --- start-site/src/main/resources/application.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index cacaf17371..be739e42eb 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -808,6 +808,8 @@ initializr: - name: WebSocket id: websocket description: Build Servlet-based WebSocket applications with SockJS and STOMP. + facets: + - json links: - rel: guide href: https://spring.io/guides/gs/messaging-stomp-websocket/ From c82a735a4d652791b406e1b02b12b5730b249f1c Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 10 Oct 2024 08:22:53 +0200 Subject: [PATCH 701/825] Fix missing bom on spring-ai-vectordb-cassandra --- start-site/src/main/resources/application.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index be739e42eb..c3eaac791e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1475,6 +1475,7 @@ initializr: group-id: org.springframework.ai artifact-id: spring-ai-cassandra-store-spring-boot-starter description: Spring AI vector database support for Apache Cassandra. + bom: spring-ai starter: true links: - rel: reference From 53b9d6e1e196585c585af31f077fad0e1ce94fff Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 10 Oct 2024 02:36:59 -0600 Subject: [PATCH 702/825] Upgrade Timefold Solver to 1.15.0 See gh-1616 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c3eaac791e..ea5a550159 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -151,7 +151,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 1.14.0 + version: 1.15.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From 6ca816369a540c52d92be351c355cfeeb3e9ccd2 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 10 Oct 2024 14:38:30 +0200 Subject: [PATCH 703/825] Remove unused initializr.env.gradle.dependency-management-plugin-version property --- start-site/src/main/resources/application.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ea5a550159..8618219694 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -159,8 +159,6 @@ initializr: mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" version: 24.4.13 - gradle: - dependency-management-plugin-version: 1.0.14.RELEASE platform: compatibilityRange: "3.2.0" dependencies: From 9efeee726486c3c66b5ea275b9de340db3f1428a Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 11 Oct 2024 09:45:03 +0200 Subject: [PATCH 704/825] Upgrade to Spring Cloud Azure 5.17.1 Closes gh-1615 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8618219694..8438d4499a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -107,7 +107,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 5.16.0 + version: 5.17.1 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From da6cf78efe8f5a26a7ae4c96c419d5d41190d1c5 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Mon, 14 Oct 2024 14:17:24 +0200 Subject: [PATCH 705/825] Add SVG favicon --- start-client/static/images/icon.svg | 28 ++++++++++++++++++++++++++++ start-client/static/index.html | 1 + 2 files changed, 29 insertions(+) create mode 100644 start-client/static/images/icon.svg diff --git a/start-client/static/images/icon.svg b/start-client/static/images/icon.svg new file mode 100644 index 0000000000..c73323ccb6 --- /dev/null +++ b/start-client/static/images/icon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/start-client/static/index.html b/start-client/static/index.html index e523c0cee3..54ea4cae7b 100644 --- a/start-client/static/index.html +++ b/start-client/static/index.html @@ -9,6 +9,7 @@ <%= htmlWebpackPlugin.options.title %> + From df0471d2696fa9336ec9c3486e5794d4cdabeb05 Mon Sep 17 00:00:00 2001 From: Christian Tzolov Date: Tue, 15 Oct 2024 15:49:12 +0200 Subject: [PATCH 706/825] Add Spring AI document readers to initializr - Include Markdown, Tika, and PDF document readers - Add descriptions and reference links for each reader - Set Spring AI BOM and disable starters for new entries See gh-1619 --- start-site/src/main/resources/application.yml | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8438d4499a..98952e2c72 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1678,6 +1678,36 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/vectordbs/weaviate.html + - name: Markdown Document Reader + id: spring-ai-markdown-document-reader + group-id: org.springframework.ai + artifact-id: spring-ai-markdown-document-reader + description: Spring AI Markdown document reader. It allows to load Markdown documents, converting them into a list of Spring AI Document objects. + bom: spring-ai + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_markdown + - name: Tika Document Reader + id: spring-ai-tika-document-reader + group-id: org.springframework.ai + artifact-id: spring-ai-tika-document-reader + description: Spring AI Tika document reader. It uses Apache Tika to extract text from a variety of document formats, such as PDF, DOC/DOCX, PPT/PPTX, and HTML. and converting them into a list of Spring AI Document objects. + bom: spring-ai + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_tika_docx_pptx_html + - name: PDF Document Readers + id: spring-ai-pdf-document-reader + group-id: org.springframework.ai + artifact-id: spring-ai-pdf-document-reader + description: Spring AI PDF document readers. It uses Apache PdfBox to extract text from PDF documents and converting them into a list of Spring AI Document objects. + bom: spring-ai + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_pdf_page - name: Timefold Solver id: timefold-solver compatibilityRange: "[3.2.0,3.4.0-M1)" From ffa75d1784d6554016688525c17ac0230de37962 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 16 Oct 2024 09:44:01 +0200 Subject: [PATCH 707/825] Polish "Add Spring AI document readers to initializr" See gh-1619 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 98952e2c72..92730de7e7 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1692,17 +1692,17 @@ initializr: id: spring-ai-tika-document-reader group-id: org.springframework.ai artifact-id: spring-ai-tika-document-reader - description: Spring AI Tika document reader. It uses Apache Tika to extract text from a variety of document formats, such as PDF, DOC/DOCX, PPT/PPTX, and HTML. and converting them into a list of Spring AI Document objects. + description: Spring AI Tika document reader. It uses Apache Tika to extract text from a variety of document formats, such as PDF, DOC/DOCX, PPT/PPTX, and HTML. The documents are converted into a list of Spring AI Document objects. bom: spring-ai starter: false links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_tika_docx_pptx_html - - name: PDF Document Readers + - name: PDF Document Reader id: spring-ai-pdf-document-reader group-id: org.springframework.ai artifact-id: spring-ai-pdf-document-reader - description: Spring AI PDF document readers. It uses Apache PdfBox to extract text from PDF documents and converting them into a list of Spring AI Document objects. + description: Spring AI PDF document reader. It uses Apache PdfBox to extract text from PDF documents and converting them into a list of Spring AI Document objects. bom: spring-ai starter: false links: From f63c3d54b0fdbdee7e6e13b9ded671c82e43b928 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 16 Oct 2024 17:02:15 +0300 Subject: [PATCH 708/825] Upgrade to Vaadin 24.5.0 See gh-1620 --- start-site/src/main/resources/application.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 92730de7e7..e0fe75d40e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -157,8 +157,10 @@ initializr: artifactId: vaadin-bom versionProperty: vaadin.version mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 24.4.13 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 24.5.0 platform: compatibilityRange: "3.2.0" dependencies: From cb5c9390d31a066189bace845f1e1ad485450426 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Wed, 16 Oct 2024 10:15:22 -0600 Subject: [PATCH 709/825] Upgrade to Netflix DGS 9.1.3 See gh-1622 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e0fe75d40e..2225b83ef8 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -58,7 +58,7 @@ initializr: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 8.7.1 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 9.1.2 + version: 9.1.3 sentry: groupId: io.sentry artifactId: sentry-bom From 77b3453dab49f96f958185264654bc9f46694ab8 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 17 Oct 2024 09:42:29 +0200 Subject: [PATCH 710/825] Enable display of .gitattributes in the UI Closes gh-1621 --- start-client/src/components/utils/Zip.js | 1 + start-client/src/components/utils/__tests__/Zip.js | 1 + 2 files changed, 2 insertions(+) diff --git a/start-client/src/components/utils/Zip.js b/start-client/src/components/utils/Zip.js index 461a88f730..28c39f3985 100644 --- a/start-client/src/components/utils/Zip.js +++ b/start-client/src/components/utils/Zip.js @@ -7,6 +7,7 @@ const FILE_EXTENSION = { kts: 'kotlin', gradle: 'groovy', gitignore: 'git', + gitattributes: 'git', java: 'java', xml: 'xml', properties: 'properties', diff --git a/start-client/src/components/utils/__tests__/Zip.js b/start-client/src/components/utils/__tests__/Zip.js index 36fdbc0914..c2b54e388b 100644 --- a/start-client/src/components/utils/__tests__/Zip.js +++ b/start-client/src/components/utils/__tests__/Zip.js @@ -17,6 +17,7 @@ describe('getLanguage', () => { expect(getLanguage('index.kts')).toBe('kotlin') expect(getLanguage('index.gradle')).toBe('groovy') expect(getLanguage('index.gitignore')).toBe('git') + expect(getLanguage('index.gitattributes')).toBe('git') expect(getLanguage('index.java')).toBe('java') expect(getLanguage('index.xml')).toBe('xml') expect(getLanguage('index.properties')).toBe('properties') From 550cc53a19e499cdd464b17f12cc4542ec375ef8 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 17 Oct 2024 10:07:32 +0200 Subject: [PATCH 711/825] Revert "Enable display of .gitattributes in the UI" This reverts commit 77b3453dab49f96f958185264654bc9f46694ab8. --- start-client/src/components/utils/Zip.js | 1 - start-client/src/components/utils/__tests__/Zip.js | 1 - 2 files changed, 2 deletions(-) diff --git a/start-client/src/components/utils/Zip.js b/start-client/src/components/utils/Zip.js index 28c39f3985..461a88f730 100644 --- a/start-client/src/components/utils/Zip.js +++ b/start-client/src/components/utils/Zip.js @@ -7,7 +7,6 @@ const FILE_EXTENSION = { kts: 'kotlin', gradle: 'groovy', gitignore: 'git', - gitattributes: 'git', java: 'java', xml: 'xml', properties: 'properties', diff --git a/start-client/src/components/utils/__tests__/Zip.js b/start-client/src/components/utils/__tests__/Zip.js index c2b54e388b..36fdbc0914 100644 --- a/start-client/src/components/utils/__tests__/Zip.js +++ b/start-client/src/components/utils/__tests__/Zip.js @@ -17,7 +17,6 @@ describe('getLanguage', () => { expect(getLanguage('index.kts')).toBe('kotlin') expect(getLanguage('index.gradle')).toBe('groovy') expect(getLanguage('index.gitignore')).toBe('git') - expect(getLanguage('index.gitattributes')).toBe('git') expect(getLanguage('index.java')).toBe('java') expect(getLanguage('index.xml')).toBe('xml') expect(getLanguage('index.properties')).toBe('properties') From 5f39279582f8d8b4c1dfe4d923ee18c7ca79462f Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 17 Oct 2024 10:08:04 +0200 Subject: [PATCH 712/825] Reapply "Enable display of .gitattributes in the UI" This reverts commit 550cc53a19e499cdd464b17f12cc4542ec375ef8. --- start-client/src/components/utils/Zip.js | 1 + start-client/src/components/utils/__tests__/Zip.js | 1 + 2 files changed, 2 insertions(+) diff --git a/start-client/src/components/utils/Zip.js b/start-client/src/components/utils/Zip.js index 461a88f730..28c39f3985 100644 --- a/start-client/src/components/utils/Zip.js +++ b/start-client/src/components/utils/Zip.js @@ -7,6 +7,7 @@ const FILE_EXTENSION = { kts: 'kotlin', gradle: 'groovy', gitignore: 'git', + gitattributes: 'git', java: 'java', xml: 'xml', properties: 'properties', diff --git a/start-client/src/components/utils/__tests__/Zip.js b/start-client/src/components/utils/__tests__/Zip.js index 36fdbc0914..c2b54e388b 100644 --- a/start-client/src/components/utils/__tests__/Zip.js +++ b/start-client/src/components/utils/__tests__/Zip.js @@ -17,6 +17,7 @@ describe('getLanguage', () => { expect(getLanguage('index.kts')).toBe('kotlin') expect(getLanguage('index.gradle')).toBe('groovy') expect(getLanguage('index.gitignore')).toBe('git') + expect(getLanguage('index.gitattributes')).toBe('git') expect(getLanguage('index.java')).toBe('java') expect(getLanguage('index.xml')).toBe('xml') expect(getLanguage('index.properties')).toBe('properties') From c4cedcb9230e3bc4f75476a9f21a469b81af7dda Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 17 Oct 2024 02:27:16 -0600 Subject: [PATCH 713/825] Update node to the latest v16 See gh-1623 --- start-client/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-client/pom.xml b/start-client/pom.xml index d6277a9b54..710cdb21d5 100644 --- a/start-client/pom.xml +++ b/start-client/pom.xml @@ -23,7 +23,7 @@ install-node-and-yarn - v16.20.0 + v16.20.2 v1.22.22 From d1f926d79b0d41526541d27cd0469ec245ed8196 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 18 Oct 2024 11:39:35 +0200 Subject: [PATCH 714/825] Polish "Update node to the latest v16" This updates to the latest LTS version of node. See gh-1623 --- start-client/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-client/pom.xml b/start-client/pom.xml index 710cdb21d5..f5330a509a 100644 --- a/start-client/pom.xml +++ b/start-client/pom.xml @@ -23,7 +23,7 @@ install-node-and-yarn - v16.20.2 + v20.18.0 v1.22.22 From 9b0847c389af03d8c9f27254de2300dcf2d26e57 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 22 Oct 2024 08:34:52 +0300 Subject: [PATCH 715/825] Upgrade to Vaadin 24.4.14 See gh-1625 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2225b83ef8..5ad7c8f8a0 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -158,7 +158,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 24.4.13 + version: 24.4.14 - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 24.5.0 platform: From 356d151ed7687ceb84b8a1ff956805f012321318 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 23 Oct 2024 15:01:28 +0200 Subject: [PATCH 716/825] Add 'spring-security-messaging' if integration and securty is selected With Spring Integration 6.3+, which is included in Spring Boor 3.3+, there's no longer a spring-integration-security module. It has been superseded by spring-security-messaging. See https://docs.spring .io/spring-integration/reference/security.html Closes gh-1626 --- .../SpringIntegrationModuleRegistry.java | 102 ++++++++++-------- ...grationProjectGenerationConfiguration.java | 5 +- ...onProjectGenerationConfigurationTests.java | 20 +++- 3 files changed, 76 insertions(+), 51 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java index 9dedd005a9..369d15db5e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java @@ -16,7 +16,8 @@ package io.spring.start.site.extension.dependency.springintegration; -import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -24,6 +25,9 @@ import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.spring.documentation.HelpDocument; +import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependency.Builder; @@ -32,48 +36,57 @@ * * @author Artem Bilan * @author Stephane Nicoll + * @author Moritz Halbritter */ abstract class SpringIntegrationModuleRegistry { - static Iterable create() { - return create( - onDependencies("activemq", "artemis").customizeBuild(addDependency("jms")) - .customizeHelpDocument(addReferenceLink("JMS Module", "jms")), - onDependencies("amqp", "amqp-streams").customizeBuild(addDependency("amqp")) - .customizeHelpDocument(addReferenceLink("AMQP Module", "amqp")), - onDependencies("data-jdbc", "jdbc").customizeBuild(addDependency("jdbc")) - .customizeHelpDocument(addReferenceLink("JDBC Module", "jdbc")), - onDependencies("data-jpa").customizeBuild(addDependency("jpa")) - .customizeHelpDocument(addReferenceLink("JPA Module", "jpa")), - onDependencies("data-mongodb", "data-mongodb-reactive").customizeBuild(addDependency("mongodb")) - .customizeHelpDocument(addReferenceLink("MongoDB Module", "mongodb")), - onDependencies("data-r2dbc").customizeBuild(addDependency("r2dbc")) - .customizeHelpDocument(addReferenceLink("R2DBC Module", "r2dbc")), - onDependencies("data-redis", "data-redis-reactive").customizeBuild(addDependency("redis")) - .customizeHelpDocument(addReferenceLink("Redis Module", "redis")), - onDependencies("integration").customizeBuild(addDependency("test", DependencyScope.TEST_COMPILE)) - .customizeHelpDocument(addReferenceLink("Test Module", "testing")), - onDependencies("kafka", "kafka-streams").customizeBuild(addDependency("kafka")) - .customizeHelpDocument(addReferenceLink("Apache Kafka Module", "kafka")), - onDependencies("mail").customizeBuild(addDependency("mail")) - .customizeHelpDocument(addReferenceLink("Mail Module", "mail")), - onDependencies("rsocket").customizeBuild(addDependency("rsocket")) - .customizeHelpDocument(addReferenceLink("RSocket Module", "rsocket")), - onDependencies("security").customizeBuild(addDependency("security")) - .customizeHelpDocument(addReferenceLink("Security Module", "security")), - onDependencies("web").customizeBuild(addDependency("http")) - .customizeHelpDocument(addReferenceLink("HTTP Module", "http")), - onDependencies("webflux").customizeBuild(addDependency("webflux")) - .customizeHelpDocument(addReferenceLink("WebFlux Module", "webflux")), - onDependencies("websocket").customizeBuild(addDependency("stomp").andThen(addDependency("websocket"))) - .customizeHelpDocument(addReferenceLink("STOMP Module", "stomp") - .andThen(addReferenceLink("WebSocket Module", "web-sockets"))), - onDependencies("web-services").customizeBuild(addDependency("ws")) - .customizeHelpDocument(addReferenceLink("Web Services Module", "ws"))); - } + private static final VersionRange SPRING_BOOT_3_3_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); - private static Iterable create(ImplicitDependency.Builder... dependencies) { - return Arrays.stream(dependencies).map(Builder::build).collect(Collectors.toList()); + static Iterable create(Version platformVersion) { + List builders = new ArrayList<>(); + builders.add(onDependencies("activemq", "artemis").customizeBuild(addDependency("jms")) + .customizeHelpDocument(addReferenceLink("JMS Module", "jms"))); + builders.add(onDependencies("amqp", "amqp-streams").customizeBuild(addDependency("amqp")) + .customizeHelpDocument(addReferenceLink("AMQP Module", "amqp"))); + builders.add(onDependencies("data-jdbc", "jdbc").customizeBuild(addDependency("jdbc")) + .customizeHelpDocument(addReferenceLink("JDBC Module", "jdbc"))); + builders.add(onDependencies("data-jpa").customizeBuild(addDependency("jpa")) + .customizeHelpDocument(addReferenceLink("JPA Module", "jpa"))); + builders.add(onDependencies("data-mongodb", "data-mongodb-reactive").customizeBuild(addDependency("mongodb")) + .customizeHelpDocument(addReferenceLink("MongoDB Module", "mongodb"))); + builders.add(onDependencies("data-r2dbc").customizeBuild(addDependency("r2dbc")) + .customizeHelpDocument(addReferenceLink("R2DBC Module", "r2dbc"))); + builders.add(onDependencies("data-redis", "data-redis-reactive").customizeBuild(addDependency("redis")) + .customizeHelpDocument(addReferenceLink("Redis Module", "redis"))); + builders.add(onDependencies("integration").customizeBuild(addDependency("test", DependencyScope.TEST_COMPILE)) + .customizeHelpDocument(addReferenceLink("Test Module", "testing"))); + builders.add(onDependencies("kafka", "kafka-streams").customizeBuild(addDependency("kafka")) + .customizeHelpDocument(addReferenceLink("Apache Kafka Module", "kafka"))); + builders.add(onDependencies("mail").customizeBuild(addDependency("mail")) + .customizeHelpDocument(addReferenceLink("Mail Module", "mail"))); + builders.add(onDependencies("rsocket").customizeBuild(addDependency("rsocket")) + .customizeHelpDocument(addReferenceLink("RSocket Module", "rsocket"))); + if (SPRING_BOOT_3_3_OR_LATER.match(platformVersion)) { + builders.add(onDependencies("security") + .customizeBuild(addDependency("spring-security-messaging", "org.springframework.security", + "spring-security-messaging", DependencyScope.COMPILE)) + .customizeHelpDocument(addReferenceLink("Security Module", "security"))); + } + else { + builders.add(onDependencies("security").customizeBuild(addDependency("security")) + .customizeHelpDocument(addReferenceLink("Security Module", "security"))); + } + builders.add(onDependencies("web").customizeBuild(addDependency("http")) + .customizeHelpDocument(addReferenceLink("HTTP Module", "http"))); + builders.add(onDependencies("webflux").customizeBuild(addDependency("webflux")) + .customizeHelpDocument(addReferenceLink("WebFlux Module", "webflux"))); + builders + .add(onDependencies("websocket").customizeBuild(addDependency("stomp").andThen(addDependency("websocket"))) + .customizeHelpDocument(addReferenceLink("STOMP Module", "stomp") + .andThen(addReferenceLink("WebSocket Module", "web-sockets")))); + builders.add(onDependencies("web-services").customizeBuild(addDependency("ws")) + .customizeHelpDocument(addReferenceLink("Web Services Module", "ws"))); + return builders.stream().map(Builder::build).collect(Collectors.toList()); } private static ImplicitDependency.Builder onDependencies(String... dependencyIds) { @@ -85,15 +98,16 @@ private static Consumer addDependency(String id) { } private static Consumer addDependency(String id, DependencyScope scope) { - return (build) -> build.dependencies() - .add("integration-" + id, - Dependency.withCoordinates("org.springframework.integration", "spring-integration-" + id) - .scope(scope)); + return addDependency("integration-" + id, "org.springframework.integration", "spring-integration-" + id, scope); + } + + private static Consumer addDependency(String id, String groupId, String artifactId, DependencyScope scope) { + return (build) -> build.dependencies().add(id, Dependency.withCoordinates(groupId, artifactId).scope(scope)); } private static Consumer addReferenceLink(String name, String id) { return (helpDocument) -> { - String href = String.format("https://docs.spring.io/spring-integration/reference/html/%s.html", id); + String href = "https://docs.spring.io/spring-integration/reference/%s.html".formatted(id); String description = String.format("Spring Integration %s Reference Guide", name); helpDocument.gettingStarted().addReferenceDocLink(href, description); }; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfiguration.java index 89cef27b63..b91e06f4db 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfiguration.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependencyBuildCustomizer; @@ -37,8 +38,8 @@ class SpringIntegrationProjectGenerationConfiguration { private final Iterable dependencies; - SpringIntegrationProjectGenerationConfiguration() { - this.dependencies = SpringIntegrationModuleRegistry.create(); + SpringIntegrationProjectGenerationConfiguration(ProjectDescription projectDescription) { + this.dependencies = SpringIntegrationModuleRegistry.create(projectDescription.getPlatformVersion()); } @Bean diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java index 123d22fb20..5109e0b088 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java @@ -36,6 +36,7 @@ * @author Stephane Nicoll * @author Artem Bilan * @author Brian Clozel + * @author Moritz Halbritter */ class SpringIntegrationProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -43,7 +44,7 @@ class SpringIntegrationProjectGenerationConfigurationTests extends AbstractExten void buildWithOnlySpringIntegration() { Dependency integrationTest = integrationDependency("test"); integrationTest.setScope(Dependency.SCOPE_TEST); - assertThat(generateProject("integration")).mavenBuild() + assertThat(generateProject("3.2.0", "integration")).mavenBuild() .hasDependency(getDependency("integration")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(integrationTest); @@ -52,7 +53,7 @@ void buildWithOnlySpringIntegration() { @ParameterizedTest @MethodSource("supportedEntries") void buildWithSupportedEntries(String springBootDependencyId, String integrationModuleId) { - assertThat(generateProject("integration", springBootDependencyId)).mavenBuild() + assertThat(generateProject("3.2.0", "integration", springBootDependencyId)).mavenBuild() .hasDependency(getDependency("integration")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(integrationDependency(integrationModuleId)); @@ -76,14 +77,14 @@ static Stream supportedEntries() { @MethodSource("referenceLinks") void linkToSupportedEntriesWhenSpringIntegrationIsPresentIsAdded(String dependencyId, String pageName) { assertHelpDocument("integration", dependencyId) - .contains("https://docs.spring.io/spring-integration/reference/html/" + pageName + ".html"); + .contains("https://docs.spring.io/spring-integration/reference/%s.html".formatted(pageName)); } @ParameterizedTest @MethodSource("referenceLinks") void linkToSupportedEntriesWhenSpringIntegrationIsNotPresentIsNotAdded(String dependencyId, String pageName) { assertHelpDocument(dependencyId) - .doesNotContain("https://docs.spring.io/spring-integration/reference/html/" + pageName + ".html"); + .doesNotContain("https://docs.spring.io/spring-integration/reference/%s.html".formatted(pageName)); } static Stream referenceLinks() { @@ -106,14 +107,23 @@ void linkToSupportedEntriesWhenTwoMatchesArePresentOnlyAddLinkOnce() { .containsOnlyOnce("https://java.testcontainers.org/modules/databases/mongodb/"); } + @Test + void securityAddsSpringSecurityMessagingOnBoot3dot3() { + assertThat(generateProject("3.3.0", "integration", "security")).mavenBuild() + .hasDependency("org.springframework.security", "spring-security-messaging") + .doesNotHaveDependency("org.springframework.integration", "spring-integration-security"); + + } + private static Dependency integrationDependency(String id) { String integrationModule = "spring-integration-" + id; return io.spring.initializr.metadata.Dependency.withId(integrationModule, "org.springframework.integration", integrationModule, null, io.spring.initializr.metadata.Dependency.SCOPE_COMPILE); } - private ProjectStructure generateProject(String... dependencies) { + private ProjectStructure generateProject(String bootVersion, String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); + request.setBootVersion(bootVersion); request.setType("maven-build"); return generateProject(request); } From c5a7c853a8dcad2edec7a941c81cc3cf9a117f79 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 24 Oct 2024 12:33:41 +0200 Subject: [PATCH 717/825] Fix documentation links Closes gh-1627 --- USING.adoc | 3 +- .../kotlin/KotlinCoroutinesCustomizer.java | 2 +- start-site/src/main/resources/application.yml | 200 +++++++++--------- ...-cloud-function-build-setup-azure.mustache | 5 +- .../KotlinCoroutinesCustomizerTests.java | 2 +- 5 files changed, 103 insertions(+), 109 deletions(-) diff --git a/USING.adoc b/USING.adoc index 8fb2a7ebf6..4da69c2455 100644 --- a/USING.adoc +++ b/USING.adoc @@ -1,4 +1,3 @@ -:spring-boot-docs: https://docs.spring.io/spring-boot/docs/current/reference/html = User Guide If you're wondering how to use https://start.spring.io or what features are available, @@ -190,7 +189,7 @@ Refer to the documentation of your favorite IDE for more details. The `spring` command line tool defines an `init` command that allows you to create a project using Spring Initializr. It defaults to start.spring.io. -Check {spring-boot-docs}/spring-boot-cli.html#cli-init[the documentation for more details]. +Check https://docs.spring.io/spring-boot/cli/index.html[the documentation for more details]. diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java index 3634d8ce93..31dfe75140 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java @@ -61,7 +61,7 @@ public void customize(HelpDocument document, Build build) { String frameworkVersion = resolve.get("org.springframework:spring-core"); String versionToUse = (frameworkVersion != null) ? frameworkVersion : "current"; String href = String.format( - "https://docs.spring.io/spring/docs/%s/spring-framework-reference/languages.html#coroutines", + "https://docs.spring.io/spring-framework/reference/%s/languages/kotlin/coroutines.html", versionToUse); document.gettingStarted() .addReferenceDocLink(href, "Coroutines section of the Spring Framework Documentation"); diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 5ad7c8f8a0..7558a86a7a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -188,7 +188,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#using.devtools + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/using/devtools.html - name: Lombok id: lombok groupId: org.projectlombok @@ -205,7 +205,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#appendix.configuration-metadata.annotation-processor + href: https://docs.spring.io/spring-boot/{bootVersion}/specification/configuration-metadata/annotation-processor.html - name: Docker Compose Support id: docker-compose groupId: org.springframework.boot @@ -215,7 +215,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#features.docker-compose + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/features/dev-services.html#features.dev-services.docker-compose - name: Spring Modulith id: modulith bom: spring-modulith @@ -239,7 +239,7 @@ initializr: href: https://spring.io/guides/gs/rest-service/ description: Building a RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html - rel: guide href: https://spring.io/guides/gs/serving-web-content/ description: Serving Web Content with Spring MVC @@ -257,7 +257,7 @@ initializr: href: https://spring.io/guides/gs/reactive-rest-service/ description: Building a Reactive RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.reactive + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/reactive.html - name: Spring for GraphQL id: graphql description: Build GraphQL applications with Spring for GraphQL and GraphQL Java. @@ -268,7 +268,7 @@ initializr: href: https://spring.io/guides/gs/graphql-server/ description: Building a GraphQL service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.graphql + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-graphql.html - name: Rest Repositories id: data-rest facets: @@ -285,7 +285,7 @@ initializr: href: https://spring.io/guides/gs/accessing-mongodb-data-rest/ description: Accessing MongoDB Data with REST - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#howto.data-access.exposing-spring-data-repositories-as-rest + href: https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-access.html#howto.data-access.exposing-spring-data-repositories-as-rest - name: Spring Session id: session groupId: org.springframework.session @@ -309,7 +309,7 @@ initializr: href: https://spring.io/guides/gs/rest-hateoas/ description: Building a Hypermedia-Driven RESTful Web Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.spring-hateoas + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-hateoas.html - name: Spring Web Services id: web-services description: Facilitates contract-first SOAP development. Allows for the creation of flexible web services using one of the many ways to manipulate XML payloads. @@ -320,7 +320,7 @@ initializr: href: https://spring.io/guides/gs/producing-web-service/ description: Producing a SOAP web service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.webservices + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/io/webservices.html - name: Jersey id: jersey description: Framework for developing RESTful Web Services in Java that provides support for JAX-RS APIs. @@ -328,7 +328,7 @@ initializr: - json links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.servlet.jersey + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.jersey - name: Vaadin id: vaadin facets: @@ -378,19 +378,19 @@ initializr: href: https://spring.io/guides/gs/handling-form-submission/ description: Handling Form Submission - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines - name: Apache Freemarker id: freemarker description: Java library to generate text output (HTML web pages, e-mails, configuration files, source code, etc.) based on templates and changing data. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines - name: Mustache id: mustache description: Logic-less templates for both web and standalone environments. There are no if statements, else clauses, or for loops. Instead there are only tags. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines - name: Groovy Templates id: groovy-templates description: Groovy templating engine. @@ -398,7 +398,7 @@ initializr: - web links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.servlet.spring-mvc.template-engines + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines - name: JTE id: jte description: Secure and lightweight template engine for Java and Kotlin. @@ -425,31 +425,31 @@ initializr: href: https://spring.io/guides/gs/authenticating-ldap/ description: Authenticating a User with LDAP - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.security + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html - name: OAuth2 Client id: oauth2-client description: Spring Boot integration for Spring Security's OAuth2/OpenID Connect client features. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.security.oauth2.client + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.client - name: OAuth2 Authorization Server id: oauth2-authorization-server description: Spring Boot integration for Spring Authorization Server. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.security.oauth2.authorization-server + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.authorization-server - name: OAuth2 Resource Server id: oauth2-resource-server description: Spring Boot integration for Spring Security's OAuth2 resource server features. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.security.oauth2.server + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.server - name: Spring LDAP id: data-ldap description: Makes it easier to build Spring based applications that use the Lightweight Directory Access Protocol. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.ldap - name: Okta id: okta compatibilityRange: "[3.2.0,3.4.0-M1)" @@ -485,7 +485,7 @@ initializr: href: https://spring.io/guides/gs/managing-transactions/ description: Managing Transactions - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.sql + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html - name: Spring Data JPA id: data-jpa description: Persist data in SQL stores with Java Persistence API using Spring Data and Hibernate. @@ -498,7 +498,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-jpa/ description: Accessing Data with JPA - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.sql.jpa-and-spring-data + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jpa-and-spring-data - name: Spring Data JDBC id: data-jdbc description: Persist data in SQL stores with plain JDBC using Spring Data. @@ -507,7 +507,7 @@ initializr: href: https://github.com/spring-projects/spring-data-examples/tree/master/jdbc/basics description: Using Spring Data JDBC - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.sql.jdbc + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jdbc - name: Spring Data R2DBC id: data-r2dbc description: Provides Reactive Relational Database Connectivity to persist data in SQL stores using Spring Data in reactive applications. @@ -518,7 +518,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-r2dbc/ description: Accessing data with R2DBC - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.sql.r2dbc + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.r2dbc - rel: home href: https://r2dbc.io description: R2DBC Homepage @@ -545,7 +545,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#howto.data-initialization.migration-tool.liquibase + href: https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-initialization.html#howto.data-initialization.migration-tool.liquibase - name: Flyway Migration id: flyway description: Version control for your database so you can migrate from any version (incl. an empty database) to the latest version of the schema. @@ -554,13 +554,13 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#howto.data-initialization.migration-tool.flyway + href: https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-initialization.html#howto.data-initialization.migration-tool.flyway - name: JOOQ Access Layer id: jooq description: Generate Java code from your database and build type safe SQL queries through a fluent API. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.sql.jooq + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jooq - name: IBM DB2 Driver id: db2 description: A JDBC driver that provides access to IBM DB2. @@ -640,7 +640,7 @@ initializr: href: https://spring.io/guides/gs/messaging-redis/ description: Messaging with Redis - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.redis + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.redis - name: Spring Data Reactive Redis id: data-redis-reactive description: Access Redis key-value data stores in a reactive fashion with Spring Data Redis. @@ -651,7 +651,7 @@ initializr: href: https://spring.io/guides/gs/messaging-redis/ description: Messaging with Redis - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.redis + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.redis - name: Spring Data MongoDB id: data-mongodb description: Store data in flexible, JSON-like documents, meaning fields can vary from document to document and data structure can be changed over time. @@ -660,48 +660,48 @@ initializr: href: https://spring.io/guides/gs/accessing-data-mongodb/ description: Accessing Data with MongoDB - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.mongodb + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.mongodb - name: Spring Data Reactive MongoDB id: data-mongodb-reactive description: Provides asynchronous stream processing with non-blocking back pressure for MongoDB. facets: - reactive links: - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.mongodb - rel: guide href: https://spring.io/guides/gs/accessing-data-mongodb/ description: Accessing Data with MongoDB + - rel: reference + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.mongodb - name: Spring Data Elasticsearch (Access+Driver) id: data-elasticsearch description: A distributed, RESTful search and analytics engine with Spring Data Elasticsearch. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.elasticsearch + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.elasticsearch - name: Spring Data for Apache Cassandra id: data-cassandra description: A free and open-source, distributed, NoSQL database management system that offers high-scalability and high-performance. links: - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.cassandra - rel: guide href: https://spring.io/guides/gs/accessing-data-cassandra/ + - rel: reference + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.cassandra - name: Spring Data Reactive for Apache Cassandra id: data-cassandra-reactive description: Access Cassandra NoSQL Database in a reactive fashion. facets: - reactive links: - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.cassandra - rel: guide href: https://spring.io/guides/gs/accessing-data-cassandra/ + - rel: reference + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.cassandra - name: Spring Data Couchbase id: data-couchbase description: NoSQL document-oriented database that offers in memory-first architecture, geo-distributed deployments, and workload isolation. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.couchbase + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.couchbase - name: Spring Data Reactive Couchbase id: data-couchbase-reactive description: Access Couchbase NoSQL database in a reactive fashion with Spring Data Couchbase. @@ -709,7 +709,7 @@ initializr: - reactive links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.couchbase + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.couchbase - name: Spring Data Neo4j id: data-neo4j description: An open source NoSQL database that stores data structured as graphs consisting of nodes, connected by relationships. @@ -718,7 +718,7 @@ initializr: href: https://spring.io/guides/gs/accessing-data-neo4j/ description: Accessing Data with Neo4j - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.neo4j + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.neo4j - name: Messaging content: - name: Spring Integration @@ -729,7 +729,7 @@ initializr: href: https://spring.io/guides/gs/integration/ description: Integrating Data - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.spring-integration + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/spring-integration.html - name: Spring for RabbitMQ id: amqp description: Gives your applications a common platform to send and receive messages, and your messages a safe place to live until received. @@ -738,7 +738,7 @@ initializr: href: https://spring.io/guides/gs/messaging-rabbitmq/ description: Messaging with RabbitMQ - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.amqp + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/amqp.html - name: Spring for RabbitMQ Streams id: amqp-streams description: Building stream processing applications with RabbitMQ. @@ -756,7 +756,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.kafka + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/kafka.html - name: Spring for Apache Kafka Streams id: kafka-streams description: Building stream processing applications with Apache Kafka Streams. @@ -768,10 +768,10 @@ initializr: href: https://github.com/spring-cloud/spring-cloud-stream-samples/tree/master/kafka-streams-samples description: Samples for using Apache Kafka Streams with Spring Cloud stream - rel: reference - href: https://docs.spring.io/spring-kafka/docs/current/reference/html/#streams-kafka-streams + href: https://docs.spring.io/spring-kafka/reference/streams.html description: Apache Kafka Streams Support - rel: reference - href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/index.html#_kafka_streams_binding_capabilities_of_spring_cloud_stream + href: https://docs.spring.io/spring-cloud-stream/reference/kafka/kafka-streams-binder/usage.html description: Apache Kafka Streams Binding Capabilities of Spring Cloud Stream - name: Spring for Apache ActiveMQ 5 id: activemq @@ -781,7 +781,7 @@ initializr: href: https://spring.io/guides/gs/messaging-jms/ description: Java Message Service API via Apache ActiveMQ Classic. - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.jms.activemq + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/jms.html#messaging.jms.activemq - name: Spring for Apache ActiveMQ Artemis id: artemis description: Spring JMS support with Apache ActiveMQ Artemis. @@ -790,13 +790,13 @@ initializr: href: https://spring.io/guides/gs/messaging-jms/ description: Messaging with JMS - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.jms.artemis + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/jms.html#messaging.jms.artemis - name: Spring for Apache Pulsar id: pulsar description: Build messaging applications with Apache Pulsar links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.pulsar + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/pulsar.html - name: Spring for Apache Pulsar (Reactive) id: pulsar-reactive description: Build reactive messaging applications with Apache Pulsar @@ -804,7 +804,7 @@ initializr: - reactive links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.pulsar + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/pulsar.html - name: WebSocket id: websocket description: Build Servlet-based WebSocket applications with SockJS and STOMP. @@ -815,7 +815,7 @@ initializr: href: https://spring.io/guides/gs/messaging-stomp-websocket/ description: Using WebSocket to build an interactive web application - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#messaging.websockets + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/websockets.html - name: RSocket id: rsocket description: RSocket.io applications with Spring Messaging and Netty. @@ -861,27 +861,27 @@ initializr: href: https://spring.io/guides/gs/batch-processing/ description: Creating a Batch Service - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#howto.batch + href: https://docs.spring.io/spring-boot/{bootVersion}/how-to/batch.html - name: Validation id: validation description: Bean Validation with Hibernate validator. links: - - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.validation - rel: guide href: https://spring.io/guides/gs/validating-form-input/ + - rel: reference + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/io/validation.html - name: Java Mail Sender id: mail description: Send email using Java Mail and Spring Framework's JavaMailSender. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.email + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/io/email.html - name: Quartz Scheduler id: quartz description: Schedule jobs using Quartz. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.quartz + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/io/quartz.html - name: Spring Cache Abstraction id: cache description: Provides cache-related operations, such as the ability to update the content of the cache, but does not provide the actual data store. @@ -890,7 +890,7 @@ initializr: href: https://spring.io/guides/gs/caching/ description: Caching Data with Spring - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#io.caching + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/io/caching.html - name: Spring Shell id: spring-shell groupId: org.springframework.shell @@ -900,7 +900,7 @@ initializr: bom: spring-shell links: - rel: reference - href: https://spring.io/projects/spring-shell + href: https://docs.spring.io/spring-shell/reference/index.html - name: Ops content: - name: Spring Boot Actuator @@ -911,7 +911,7 @@ initializr: href: https://spring.io/guides/gs/actuator-service/ description: Building a RESTful Web Service with Spring Boot Actuator - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/index.html - name: CycloneDX SBOM support id: sbom-cyclone-dx description: Creates a Software Bill of Materials in CycloneDX format. @@ -921,7 +921,7 @@ initializr: compatibilityRange: "3.3.0" links: - rel: reference - href: https://docs.spring.io/spring-boot/reference/actuator/endpoints.html#actuator.endpoints.sbom + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/endpoints.html#actuator.endpoints.sbom - name: codecentric's Spring Boot Admin (Client) id: codecentric-spring-boot-admin-client groupId: de.codecentric @@ -950,11 +950,11 @@ initializr: groupId: io.sentry artifactId: sentry-spring-boot-starter-jakarta links: - - rel: reference - href: https://docs.sentry.io/platforms/java/ - rel: guide href: https://docs.sentry.io/platforms/java/guides/spring-boot/ description: Getting Started with Sentry + - rel: reference + href: https://docs.sentry.io/platforms/java/ - name: Observability content: - name: Datadog @@ -966,7 +966,7 @@ initializr: description: Publish Micrometer metrics to Datadog, a dimensional time-series SaaS with built-in dashboarding and alerting. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.datadog + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.datadog - name: Dynatrace id: dynatrace groupId: io.micrometer @@ -976,7 +976,7 @@ initializr: description: Publish Micrometer metrics to Dynatrace, a platform featuring observability, AIOps, application security and analytics. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/index.html#actuator.metrics.export.dynatrace + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.dynatrace - name: Influx id: influx groupId: io.micrometer @@ -986,7 +986,7 @@ initializr: description: Publish Micrometer metrics to InfluxDB, a dimensional time-series server that support real-time stream processing of data. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.influx + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.influx - name: Graphite id: graphite groupId: io.micrometer @@ -996,7 +996,7 @@ initializr: description: Publish Micrometer metrics to Graphite, a hierarchical metrics system backed by a fixed-size database. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.graphite + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.graphite - name: New Relic id: new-relic groupId: io.micrometer @@ -1006,7 +1006,7 @@ initializr: description: Publish Micrometer metrics to New Relic, a SaaS offering with a full UI and a query language called NRQL. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.newrelic + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.newrelic - name: OTLP for metrics id: otlp-metrics groupId: io.micrometer @@ -1016,7 +1016,7 @@ initializr: description: Publish Micrometer metrics to an OpenTelemetry Protocol (OTLP) capable backend. links: - rel: reference - href: https://docs.spring.io/spring-boot/reference/actuator/metrics.html#actuator.metrics.export.otlp + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.otlp - name: Prometheus id: prometheus groupId: io.micrometer @@ -1026,7 +1026,7 @@ initializr: description: Expose Micrometer metrics in Prometheus format, an in-memory dimensional time series database with a simple built-in UI, a custom query language, and math operations. links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator.metrics.export.prometheus + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.prometheus - name: Distributed Tracing id: distributed-tracing description: Enable span and trace IDs in logs. @@ -1077,7 +1077,7 @@ initializr: scope: test links: - rel: reference - href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsingle/ + href: https://docs.spring.io/spring-cloud-contract/reference/ - name: Contract Stub Runner bom: spring-cloud compatibilityRange: "[3.2.0,3.5.0-M1)" @@ -1088,7 +1088,7 @@ initializr: scope: test links: - rel: reference - href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsingle/index.html#features-stub-runner + href: https://docs.spring.io/spring-cloud-contract/reference/project-features-stubrunner.html - name: Embedded LDAP Server id: unboundid-ldap description: Provides a platform neutral way for running a LDAP server in unit tests. @@ -1098,7 +1098,7 @@ initializr: starter: false links: - rel: reference - href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap.embedded + href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.ldap.embedded - name: Spring Cloud bom: spring-cloud compatibilityRange: "[3.2.0,3.5.0-M1)" @@ -1110,7 +1110,7 @@ initializr: artifactId: spring-cloud-starter links: - rel: reference - href: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/ + href: https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/application-context-services.html - name: Function id: cloud-function groupId: org.springframework.cloud @@ -1119,7 +1119,7 @@ initializr: description: Promotes the implementation of business logic via functions and supports a uniform programming model across serverless providers, as well as the ability to run standalone (locally or in a PaaS). links: - rel: reference - href: https://docs.spring.io/spring-cloud-function/docs/current/reference/html/spring-cloud-function.html + href: https://docs.spring.io/spring-cloud-function/reference/ - rel: sample href: https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-function-samples description: Various sample apps using Spring Cloud Function @@ -1130,7 +1130,7 @@ initializr: artifactId: spring-cloud-starter-task links: - rel: reference - href: https://docs.spring.io/spring-cloud-task/docs/current/reference/html/ + href: https://docs.spring.io/spring-cloud-task/reference/ - name: Spring Cloud Config bom: spring-cloud compatibilityRange: "[3.2.0,3.5.0-M1)" @@ -1142,19 +1142,18 @@ initializr: artifactId: spring-cloud-starter-config links: - rel: reference - href: https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_client_side_usage - description: Config Client Quick Start + href: https://docs.spring.io/spring-cloud-config/reference/client.html - name: Config Server id: cloud-config-server description: Central management for configuration via Git, SVN, or HashiCorp Vault. groupId: org.springframework.cloud artifactId: spring-cloud-config-server links: - - rel: reference - href: https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_spring_cloud_config_server - rel: guide href: https://spring.io/guides/gs/centralized-configuration/ description: Centralized Configuration + - rel: reference + href: https://docs.spring.io/spring-cloud-config/reference/server.html - name: Vault Configuration id: cloud-starter-vault-config description: Provides client-side support for externalized configuration in a distributed system. Using HashiCorp's Vault you have a central place to manage external secret properties for applications across all environments. @@ -1162,8 +1161,7 @@ initializr: artifactId: spring-cloud-starter-vault-config links: - rel: reference - href: https://docs.spring.io/spring-cloud-vault/docs/current/reference/html/#client-side-usage - description: Vault Client Quick Start + href: https://docs.spring.io/spring-cloud-vault/reference/ - name: Apache Zookeeper Configuration id: cloud-starter-zookeeper-config description: Enable and configure common patterns inside your application and build large distributed systems with Apache Zookeeper based components. The provided patterns include Service Discovery and Configuration. @@ -1171,8 +1169,7 @@ initializr: artifactId: spring-cloud-starter-zookeeper-config links: - rel: reference - href: https://docs.spring.io/spring-cloud-zookeeper/docs/current/reference/html/#distributed-configuration-usage - description: Apache Zookeeper Quick Start + href: https://docs.spring.io/spring-cloud-zookeeper/reference/config.html - name: Consul Configuration id: cloud-starter-consul-config description: Enable and configure the common patterns inside your application and build large distributed systems with Hashicorp’s Consul. The patterns provided include Service Discovery, Distributed Configuration and Control Bus. @@ -1180,8 +1177,7 @@ initializr: artifactId: spring-cloud-starter-consul-config links: - rel: reference - href: https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#distributed-configuration-usage - description: Spring Cloud Consul Quick Start + href: https://docs.spring.io/spring-cloud-consul/reference/ - name: Spring Cloud Discovery bom: spring-cloud compatibilityRange: "[3.2.0,3.5.0-M1)" @@ -1196,7 +1192,7 @@ initializr: href: https://spring.io/guides/gs/service-registration-and-discovery/ description: Service Registration and Discovery with Eureka and Spring Cloud - rel: reference - href: https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/#service-discovery-eureka-clients + href: https://docs.spring.io/spring-cloud-netflix/reference/spring-cloud-netflix.html#_service_discovery_eureka_clients - name: Eureka Server id: cloud-eureka-server description: spring-cloud-netflix Eureka Server. @@ -1207,7 +1203,7 @@ initializr: href: https://spring.io/guides/gs/service-registration-and-discovery/ description: Service Registration and Discovery with Eureka and Spring Cloud - rel: reference - href: https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/#spring-cloud-eureka-server + href: https://docs.spring.io/spring-cloud-netflix/reference/spring-cloud-netflix.html#spring-cloud-eureka-server - name: Apache Zookeeper Discovery id: cloud-starter-zookeeper-discovery description: Service discovery with Apache Zookeeper. @@ -1215,7 +1211,7 @@ initializr: artifactId: spring-cloud-starter-zookeeper-discovery links: - rel: reference - href: https://docs.spring.io/spring-cloud-zookeeper/docs/current/reference/html/#spring-cloud-zookeeper-discovery + href: https://docs.spring.io/spring-cloud-zookeeper/reference/discovery.html - name: Consul Discovery id: cloud-starter-consul-discovery description: Service discovery with Hashicorp Consul. @@ -1223,7 +1219,7 @@ initializr: artifactId: spring-cloud-starter-consul-discovery links: - rel: reference - href: https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#spring-cloud-consul-discovery + href: https://docs.spring.io/spring-cloud-consul/reference/discovery.html - name: Spring Cloud Routing bom: spring-cloud compatibilityRange: "[3.2.0,3.5.0-M1)" @@ -1235,7 +1231,7 @@ initializr: description: Provides a simple, yet effective way to route to APIs in Servlet-based applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. links: - rel: reference - href: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ + href: https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway-server-mvc.html - name: Reactive Gateway id: cloud-gateway-reactive groupId: org.springframework.cloud @@ -1245,7 +1241,7 @@ initializr: - reactive links: - rel: reference - href: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ + href: https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway.html - rel: guide href: https://github.com/spring-cloud-samples/spring-cloud-gateway-sample description: Using Spring Cloud Gateway @@ -1259,7 +1255,7 @@ initializr: href: https://github.com/spring-cloud-samples/feign-eureka description: Declarative REST calls with Spring Cloud OpenFeign sample - rel: reference - href: https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/ + href: https://docs.spring.io/spring-cloud-openfeign/reference/ - name: Cloud LoadBalancer id: cloud-loadbalancer description: Client-side load-balancing with Spring Cloud LoadBalancer. @@ -1270,7 +1266,7 @@ initializr: href: https://spring.io/guides/gs/spring-cloud-loadbalancer/ description: Client-side load-balancing with Spring Cloud LoadBalancer - rel: reference - href: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer + href: https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html - name: Spring Cloud Circuit Breaker bom: spring-cloud compatibilityRange: "[3.2.0,3.5.0-M1)" @@ -1282,7 +1278,7 @@ initializr: artifactId: spring-cloud-starter-circuitbreaker-resilience4j links: - rel: reference - href: https://docs.spring.io/spring-cloud-circuitbreaker/docs/current/reference/html/#configuring-resilience4j-circuit-breakers + href: https://docs.spring.io/spring-cloud-circuitbreaker/reference/spring-cloud-circuitbreaker-resilience4j.html - name: Spring Cloud Messaging bom: spring-cloud compatibilityRange: "[3.2.0,3.5.0-M1)" @@ -1294,7 +1290,7 @@ initializr: artifactId: spring-cloud-bus links: - rel: reference - href: https://docs.spring.io/spring-cloud-bus/docs/current/reference/html/ + href: https://docs.spring.io/spring-cloud-bus/reference/ - name: Cloud Stream id: cloud-stream description: Framework for building highly scalable event-driven microservices connected with shared messaging systems (requires a binder, e.g. Apache Kafka, Apache Pulsar, RabbitMQ, or Solace PubSub+). @@ -1302,7 +1298,7 @@ initializr: artifactId: spring-cloud-stream links: - rel: reference - href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-introducing + href: https://docs.spring.io/spring-cloud-stream/reference/ - name: VMware Tanzu Application Service bom: spring-cloud-services compatibilityRange: "[3.2.0,3.4.0-M1)" @@ -1449,7 +1445,7 @@ initializr: starter: true links: - rel: reference - href: https://docs.spring.io/spring-ai/reference/api/clients/azure-openai-chat.html + href: https://docs.spring.io/spring-ai/reference/api/chat/azure-openai-chat.html - name: Azure AI Search id: spring-ai-vectordb-azure group-id: org.springframework.ai @@ -1519,7 +1515,7 @@ initializr: starter: true links: - rel: reference - href: https://docs.spring.io/spring-ai/reference/api/clients/mistralai-chat.html + href: https://docs.spring.io/spring-ai/reference/api/chat/mistralai-chat.html - name: MongoDB Atlas Vector Database id: spring-ai-vectordb-mongodb-atlas group-id: org.springframework.ai @@ -1549,7 +1545,7 @@ initializr: starter: true links: - rel: reference - href: https://docs.spring.io/spring-ai/reference/api/clients/ollama-chat.html + href: https://docs.spring.io/spring-ai/reference/api/chat/ollama-chat.html - name: OpenAI id: spring-ai-openai group-id: org.springframework.ai @@ -1559,7 +1555,7 @@ initializr: starter: true links: - rel: reference - href: https://docs.spring.io/spring-ai/reference/api/clients/openai-chat.html + href: https://docs.spring.io/spring-ai/reference/api/chat/openai-chat.html - name: Oracle Vector Database id: spring-ai-vectordb-oracle group-id: org.springframework.ai @@ -1619,7 +1615,7 @@ initializr: starter: true links: - rel: reference - href: https://docs.spring.io/spring-ai/reference/api/clients/image/stabilityai-image.html + href: https://docs.spring.io/spring-ai/reference/api/image/stabilityai-image.html - name: Transformers (ONNX) Embeddings id: spring-ai-transformers group-id: org.springframework.ai @@ -1639,7 +1635,7 @@ initializr: starter: true links: - rel: reference - href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-palm2-chat.html + href: https://docs.spring.io/spring-ai/reference/api/chat/vertexai-palm2-chat.html - name: Vertex AI Gemini id: spring-ai-vertexai-gemini group-id: org.springframework.ai @@ -1649,7 +1645,7 @@ initializr: starter: true links: - rel: reference - href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-gemini-chat.html + href: https://docs.spring.io/spring-ai/reference/api/chat/vertexai-gemini-chat.html - name: Qdrant Vector Database id: spring-ai-vectordb-qdrant group-id: org.springframework.ai @@ -1721,7 +1717,7 @@ initializr: - rel: reference href: https://timefold.ai/docs/timefold-solver/latest/quickstart/spring-boot/spring-boot-quickstart#springBootJavaQuickStart - rel: sample - href: https://github.com/TimefoldAI/timefold-quickstarts/tree/stable/technology/java-spring-boot + href: https://github.com/TimefoldAI/timefold-quickstarts/tree/stable/java/spring-boot-integration description: Timetabling sample. Assign lessons to timeslots and rooms to produce a better schedule for teachers and students types: - name: Gradle - Groovy diff --git a/start-site/src/main/resources/templates/spring-cloud-function-build-setup-azure.mustache b/start-site/src/main/resources/templates/spring-cloud-function-build-setup-azure.mustache index e76c3eb4d1..f03b507d57 100644 --- a/start-site/src/main/resources/templates/spring-cloud-function-build-setup-azure.mustache +++ b/start-site/src/main/resources/templates/spring-cloud-function-build-setup-azure.mustache @@ -3,6 +3,5 @@ In order to run Spring Cloud Function applications on Microsoft Azure, you can leverage Spring Cloud Function Microsoft Azure adapter and {{buildTool}} plugins offered by {{platform}}. -Check the documentation for detailed information on [using the Azure adapter](https://docs.spring.io/spring-cloud-function/docs/{{version}}/reference/html/azure.html) and [setting -up the {{buildTool}} build, along with a full build setup sample](https://docs.spring.io/spring-cloud-function/docs/{{version}}/reference/html/azure.html#_build_file_setup). - +Check the documentation for detailed information on [using the Azure adapter](https://docs.spring.io/spring-cloud-function/reference/{{version}}/adapters/azure-intro.html) and [setting +up the {{buildTool}} build, along with a full build setup sample](https://docs.spring.io/spring-cloud-function/reference/{{version}}/adapters/azure-intro.html#azure.configuration). diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java index b05cdfe4f0..cf126f3767 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java @@ -38,7 +38,7 @@ void kotlinCoroutinesIsAdded() { ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("org.jetbrains.kotlinx", "kotlinx-coroutines-reactor"); assertThat(helpDocument(request)).contains( - "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring/docs/6.1.8/spring-framework-reference/languages.html#coroutines)"); + "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring-framework/reference/6.1.8/languages/kotlin/coroutines.html)"); } @Test From f9ff96b2ccc48eef9ffa4b27bc7411231599266b Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 24 Oct 2024 14:46:46 +0200 Subject: [PATCH 718/825] Update yarn lockfile --- start-client/yarn.lock | 1887 ++++++++++++++++++++-------------------- 1 file changed, 923 insertions(+), 964 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 7ef8b39604..373820b065 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -20,9 +20,9 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.25.6.tgz#bc35561adc78ade43ac9c09a690768493ab9ed95" - integrity sha512-Z+Doemr4VtvSD2SNHTrkiFZ1LX+JI6tyRXAAOb4N9khIuPyoEPmTPJarPm8ljJV1D6bnMQjyHMWTT9NeKbQuXA== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.25.9.tgz#51036166fd0e9cfb26eee1b9ddc264a0d6d5f843" + integrity sha512-I+02IfrTiSanpxJBlZQYb18qCxB6c2Ih371cVpfgIrPQrjAYkf45XxomTJOG8JBWX5GY35/+TmhCMdJ4ZPkL8Q== dependencies: "@jridgewell/trace-mapping" "^0.3.25" commander "^6.2.0" @@ -35,34 +35,34 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.6.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.9.tgz#895b6c7e04a7271a0cbfd575d2e8131751914cc7" + integrity sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ== dependencies: - "@babel/highlight" "^7.24.7" + "@babel/highlight" "^7.25.9" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2", "@babel/compat-data@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" - integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.9.tgz#24b01c5db6a3ebf85661b4fb4a946a9bccc72ac8" + integrity sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" - integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.9.tgz#855a4cddcec4158f3f7afadacdab2a7de8af7434" + integrity sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.0" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-module-transforms" "^7.25.2" - "@babel/helpers" "^7.25.0" - "@babel/parser" "^7.25.0" - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.2" - "@babel/types" "^7.25.2" + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helpers" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -70,70 +70,70 @@ semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.25.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz#469cee4bd18a88ff3edbdfbd227bd20e82aa9b82" - integrity sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz#603c68a63078796527bc9d0833f5e52dd5f9224c" + integrity sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" - integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== +"@babel/generator@^7.25.9", "@babel/generator@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.9.tgz#c7e828ebe0c2baba103b712924699c9e8a6e32f0" + integrity sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA== dependencies: - "@babel/types" "^7.25.6" + "@babel/types" "^7.25.9" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" + jsesc "^3.0.2" -"@babel/helper-annotate-as-pure@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" - integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== dependencies: - "@babel/types" "^7.24.7" + "@babel/types" "^7.25.9" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" - integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9" + integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g== dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" - integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== dependencies: - "@babel/compat-data" "^7.25.2" - "@babel/helper-validator-option" "^7.24.8" - browserslist "^4.23.1" + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14" - integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.8" - "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/helper-replace-supers" "^7.25.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/traverse" "^7.25.4" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" + integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.25.9" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0", "@babel/helper-create-regexp-features-plugin@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" - integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26" + integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - regexpu-core "^5.3.1" + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.1.1" semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.6.2": @@ -147,165 +147,165 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-member-expression-to-functions@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" - integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== - dependencies: - "@babel/traverse" "^7.24.8" - "@babel/types" "^7.24.8" - -"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" - integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" - integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== - dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - "@babel/traverse" "^7.25.2" - -"@babel/helper-optimise-call-expression@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" - integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" - integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== - -"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" - integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-wrap-function" "^7.25.0" - "@babel/traverse" "^7.25.0" - -"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" - integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.24.8" - "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/traverse" "^7.25.0" - -"@babel/helper-simple-access@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" - integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" - integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" - integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" - integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== - -"@babel/helper-wrap-function@^7.24.7", "@babel/helper-wrap-function@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" - integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== - dependencies: - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/helpers@^7.25.0": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" - integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== - dependencies: - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.6" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz#12e4fb2969197ef6d78ea8a2f24375ce85b425fb" + integrity sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-simple-access" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + +"@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-replace-supers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" + integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-simple-access@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739" + integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helpers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.9.tgz#9e26aa6fbefdbca4f8c8a1d66dc6f1c00ddadb0a" + integrity sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/highlight@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6" + integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6", "@babel/parser@^7.7.0": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" - integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.7.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.9.tgz#8fcaa079ac7458facfddc5cd705cc8005e4d3817" + integrity sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg== dependencies: - "@babel/types" "^7.25.6" + "@babel/types" "^7.25.9" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": - version "7.25.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" - integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/traverse" "^7.25.3" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" - integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" - integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" - integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" - integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/traverse" "^7.25.0" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/plugin-proposal-class-properties@^7.13.0": version "7.18.6" @@ -316,29 +316,27 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.13.15": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz#7e2dcfeda4a42596b57c4c9de1f5176bbfc532e3" - integrity sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz#8680707f943d1a3da2cd66b948179920f097e254" + integrity sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-decorators" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-decorators" "^7.25.9" "@babel/plugin-proposal-do-expressions@^7.12.13": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.24.7.tgz#09ab8037ef28d71578b1734dc8a88fd00887c98a" - integrity sha512-M9pJwhoROof4rc4WzDdMoftv8JrtYfBVurvReacQ8lit+qUd0d71+1zUltb6/zCI7HBW4+KZbtBGmcudXw0GDQ== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.25.9.tgz#c1eae77aeb86fcd689804378acefd9e8f1ca8a27" + integrity sha512-0IkO77tw2OcZua/ADovH//IEiUyQpNjWvLyMFNidXnZx4eEriQjwkH9t/EyQZUaQu0KOxxdszC7m8VUVs51ydg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-do-expressions" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-proposal-export-default-from@^7.12.13": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz#0b539c46b8ac804f694e338f803c8354c0f788b6" - integrity sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz#52702be6ef8367fc8f18b8438278332beeb8f87c" + integrity sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-export-default-from" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-proposal-export-namespace-from@^7.12.13": version "7.18.9" @@ -349,21 +347,19 @@ "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-function-bind@^7.12.13": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.24.7.tgz#8b4fcef3fd90bd5671a940693683c76ab0984df8" - integrity sha512-cq2mwxcvNAWWL+IiqiSiVhCeqTQs532Ktl3N2FMuW0bQVF/N0W6QNyywO+KkM3Yr/jwYmjeSS+yKQQUh79VOxQ== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.25.9.tgz#ef98187f3d2cb87abf0f815f43bf4f26c1a6d968" + integrity sha512-1g0b0XU667A2IZNdhovGr0ZdywJxf081B8JN5qyiNqzJK7GtdYBxGcuA+lq7q8OgO4cAc4vF57Ad0XLoDBsJAg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-function-bind" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-proposal-function-sent@^7.12.13": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.24.7.tgz#522a49543a278e1f28eba36e753201f72ae18a11" - integrity sha512-42Pq9d8fV5CrjygcVAA7aAEFpkAJluWWvlO7bvOMDEutxIS44COcFU61V92VBzUZvOkjIoQrPJNUtmY/d9XMgA== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.25.9.tgz#50eccfe5a6a518f9f264eacfc9a9865dcb2bfa85" + integrity sha512-Qi9KEBTY6WAjHBeHJ1jm4HyGlwvZLfjUaxO9g1jKHqyQPe6c+q7DlKgyrBUH7v+VWLJ0bNy5cQlXHtOV5/uibw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-wrap-function" "^7.24.7" - "@babel/plugin-syntax-function-sent" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" "@babel/plugin-proposal-json-strings@^7.13.8": version "7.18.6" @@ -407,12 +403,12 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-pipeline-operator@^7.12.13": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.24.7.tgz#a96009e358eb357f88301ab74e4788812a5957fa" - integrity sha512-cJOSXlieT6/Yul8yEkbBRzhyf/J4jeeqUREw8HCf8nxT4DTP5FCdC0EXf+b8+vBt34IMYYvTDiC8uC91KSSLpA== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.25.9.tgz#8494cd391e0f08de9cb2b19e48978554b4683daa" + integrity sha512-rmb8zOYFdVz6y/OqJn6RfbIBiJPQdUbHg7R5ibym5KM0e8uNGdU9yfn9cjkBLwS22Lqd+ey3D8/UvK5GLyyh5A== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-pipeline-operator" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-pipeline-operator" "^7.25.9" "@babel/plugin-proposal-private-methods@^7.13.0": version "7.18.6" @@ -428,12 +424,11 @@ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-proposal-throw-expressions@^7.12.13": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.24.7.tgz#8a386bcb77965d82f5b926508b27919d9ac9450f" - integrity sha512-Rh4WoHyWKgsxvdkEMqDEZtKuGnZw+JwicMCvcZaIjYaQ3fK+a8JZYLhgcac9dKcL47Xqf+SG3MopTx+8BACdrQ== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.25.9.tgz#9bfba4a4b775dbadfc5ca91a9f22097754142b56" + integrity sha512-Zw62DP6cdbXXEtTNMWYY10rIOPGAWPk8qdqM+AT3JbHtFq8ook0JXJCWdQJTlSVACHo0R6lvoNKO9B1ZVkjClg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-throw-expressions" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -463,19 +458,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz#e4f8a0a8778ccec669611cd5aed1ed8e6e3a6fcf" - integrity sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ== +"@babel/plugin-syntax-decorators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz#986b4ca8b7b5df3f67cee889cedeffc2e2bf14b3" + integrity sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-do-expressions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.24.7.tgz#c8aa7471fa25286fede4c12a464a49d286de8362" - integrity sha512-lQee+garSbTjCvXdzfjXeSzPd03pyBXALfB2C4bW7SwORrZAs5CDt67toH8MRPuvQFYvWpkXYe07AhHDY3tWfQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -484,13 +472,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz#85dae9098933573aae137fb52141dd3ca52ae7ac" - integrity sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" @@ -498,33 +479,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-function-bind@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.24.7.tgz#60103187663fb121976d972b23bfb097d9d0234a" - integrity sha512-dqm7VhgJ2sXCEc0WDJV+q8OI1Qzwn4OFbqsHTVtYoc4L7jJYtF6pEQYcbmlMMWBZjw0tJYuXeyiTQVboWIwAKg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-function-sent@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.24.7.tgz#4d5e647ca67bee243f58a9a596352dc2920434a6" - integrity sha512-me5EHEx4GXxAE8mnlZaWA+ARIyMSPOXcw6WlqWGIfTg36oeWm4FxR/Djs1DGPbmSIwJqMboiN7gK8eCyzyNK2A== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-import-assertions@^7.24.7": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz#bb918905c58711b86f9710d74a3744b6c56573b5" - integrity sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ== +"@babel/plugin-syntax-import-assertions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.9.tgz#631686872fac3d4d1f1ae9a406a8fd1c482c7b2a" + integrity sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" - integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== +"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.9.tgz#29c9643445deea4533c05e6ac6c39d15424bbe78" + integrity sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" @@ -540,12 +507,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" - integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== +"@babel/plugin-syntax-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -589,12 +556,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-pipeline-operator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.24.7.tgz#1558f683508708d0528eaab7e4bf13b6ae793b1f" - integrity sha512-PnW47ro0vPh4Raqabn3FM7opwdKbNQoFJKSNfCj7lmqcQlVMYFcJ6b+rhMyfB/g1SlWRwnodffVzLcee1FDHYQ== +"@babel/plugin-syntax-pipeline-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.25.9.tgz#5488436b3e0a313716b4ff05d3a4f47970639dd4" + integrity sha512-W0KjBvv8uT4A8DUoRNpXEHkKekqO/PC57doaWCqbJeG0lGxKFh7w7/PHYPmwgF+jKxekNnc+YOMQNCo94d8MJg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" @@ -603,13 +570,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-throw-expressions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.24.7.tgz#30887b54c478120831bc95881e73ec1984584930" - integrity sha512-b1bdlAmUTy9VQ/g2cnBuJFwd7jeARNW2F65c9Gcn8qyNYGuVy/cYyqpiSL6SVmUAJTDbIYL2FzlZ8nH1qUCBXA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" @@ -618,11 +578,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" - integrity sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -632,531 +592,504 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" - integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== +"@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-async-generator-functions@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz#2afd4e639e2d055776c9f091b6c0c180ed8cf083" - integrity sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg== +"@babel/plugin-transform-async-generator-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2" + integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-remap-async-to-generator" "^7.25.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/traverse" "^7.25.4" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-async-to-generator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" - integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== +"@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-remap-async-to-generator" "^7.24.7" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-block-scoped-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" - integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== +"@babel/plugin-transform-block-scoped-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" + integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-block-scoping@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" - integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== +"@babel/plugin-transform-block-scoping@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-properties@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz#bae7dbfcdcc2e8667355cd1fb5eda298f05189fd" - integrity sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g== +"@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.4" - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-static-block@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" - integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== +"@babel/plugin-transform-class-static-block@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.9.tgz#1cab37c4278a563409d74c1e4f08fb77de5d7a5c" + integrity sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-classes@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz#d29dbb6a72d79f359952ad0b66d88518d65ef89a" - integrity sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg== +"@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-replace-supers" "^7.25.0" - "@babel/traverse" "^7.25.4" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" - integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== +"@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/template" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" - integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== +"@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dotall-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" - integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-duplicate-keys@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" - integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" - integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.0" - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dynamic-import@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" - integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" - integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== +"@babel/plugin-transform-exponentiation-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f" + integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-export-namespace-from@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" - integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-for-of@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" - integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== +"@babel/plugin-transform-for-of@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755" + integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-function-name@^7.25.1": - version "7.25.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" - integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== +"@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== dependencies: - "@babel/helper-compilation-targets" "^7.24.8" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/traverse" "^7.25.1" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-json-strings@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" - integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-literals@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" - integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== +"@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-logical-assignment-operators@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" - integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== +"@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-member-expression-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" - integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-amd@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" - integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" - integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== +"@babel/plugin-transform-modules-commonjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686" + integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg== dependencies: - "@babel/helper-module-transforms" "^7.24.8" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-simple-access" "^7.25.9" -"@babel/plugin-transform-modules-systemjs@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" - integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== dependencies: - "@babel/helper-module-transforms" "^7.25.0" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - "@babel/traverse" "^7.25.0" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-modules-umd@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" - integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" - integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-new-target@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" - integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" - integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== +"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949" + integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-numeric-separator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" - integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== +"@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-object-rest-spread@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" - integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== +"@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== dependencies: - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" -"@babel/plugin-transform-object-super@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" - integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" -"@babel/plugin-transform-optional-catch-binding@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" - integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== +"@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" - integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== +"@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-parameters@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" - integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== +"@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-private-methods@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz#9bbefbe3649f470d681997e0b64a4b254d877242" - integrity sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw== +"@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.4" - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-private-property-in-object@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" - integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== +"@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-property-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" - integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-display-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" - integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== +"@babel/plugin-transform-react-display-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz#4b79746b59efa1f38c8695065a92a9f5afb24f7d" + integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-development@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" - integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== +"@babel/plugin-transform-react-jsx-development@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz#8fd220a77dd139c07e25225a903b8be8c829e0d7" + integrity sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw== dependencies: - "@babel/plugin-transform-react-jsx" "^7.24.7" + "@babel/plugin-transform-react-jsx" "^7.25.9" -"@babel/plugin-transform-react-jsx@^7.24.7": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a" - integrity sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA== +"@babel/plugin-transform-react-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166" + integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/plugin-syntax-jsx" "^7.24.7" - "@babel/types" "^7.25.2" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/plugin-transform-react-pure-annotations@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" - integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== +"@babel/plugin-transform-react-pure-annotations@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz#ea1c11b2f9dbb8e2d97025f43a3b5bc47e18ae62" + integrity sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-regenerator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" - integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== +"@babel/plugin-transform-regenerator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" - integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-runtime@^7.18.5": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz#96e4ad7bfbbe0b4a7b7e6f2a533ca326cf204963" - integrity sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" + integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ== dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" - integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== +"@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-spread@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" - integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== +"@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-sticky-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" - integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== +"@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-template-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" - integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== +"@babel/plugin-transform-template-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1" + integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typeof-symbol@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" - integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== +"@babel/plugin-transform-typeof-symbol@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" + integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-escapes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" - integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== +"@babel/plugin-transform-unicode-escapes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-property-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" - integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== +"@babel/plugin-transform-unicode-property-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" - integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== +"@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-sets-regex@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz#be664c2a0697ffacd3423595d5edef6049e8946c" - integrity sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA== +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.2" - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.4.tgz#be23043d43a34a2721cd0f676c7ba6f1481f6af6" - integrity sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw== - dependencies: - "@babel/compat-data" "^7.25.4" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-validator-option" "^7.24.8" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0" + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.9.tgz#fc8a68705e02553cdeeeb5477bf241e12b9c3cd9" + integrity sha512-XqDEt+hfsQukahSX9JOBDHhpUHDhj2zGSxoqWQFCMajOSBnbhBdgON/bU/5PkBA1yX5tqW6tTzuIPVsZTQ7h5Q== + dependencies: + "@babel/compat-data" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.7" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-import-assertions" "^7.25.9" + "@babel/plugin-syntax-import-attributes" "^7.25.9" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.7" - "@babel/plugin-transform-async-generator-functions" "^7.25.4" - "@babel/plugin-transform-async-to-generator" "^7.24.7" - "@babel/plugin-transform-block-scoped-functions" "^7.24.7" - "@babel/plugin-transform-block-scoping" "^7.25.0" - "@babel/plugin-transform-class-properties" "^7.25.4" - "@babel/plugin-transform-class-static-block" "^7.24.7" - "@babel/plugin-transform-classes" "^7.25.4" - "@babel/plugin-transform-computed-properties" "^7.24.7" - "@babel/plugin-transform-destructuring" "^7.24.8" - "@babel/plugin-transform-dotall-regex" "^7.24.7" - "@babel/plugin-transform-duplicate-keys" "^7.24.7" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0" - "@babel/plugin-transform-dynamic-import" "^7.24.7" - "@babel/plugin-transform-exponentiation-operator" "^7.24.7" - "@babel/plugin-transform-export-namespace-from" "^7.24.7" - "@babel/plugin-transform-for-of" "^7.24.7" - "@babel/plugin-transform-function-name" "^7.25.1" - "@babel/plugin-transform-json-strings" "^7.24.7" - "@babel/plugin-transform-literals" "^7.25.2" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" - "@babel/plugin-transform-member-expression-literals" "^7.24.7" - "@babel/plugin-transform-modules-amd" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.8" - "@babel/plugin-transform-modules-systemjs" "^7.25.0" - "@babel/plugin-transform-modules-umd" "^7.24.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" - "@babel/plugin-transform-new-target" "^7.24.7" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" - "@babel/plugin-transform-numeric-separator" "^7.24.7" - "@babel/plugin-transform-object-rest-spread" "^7.24.7" - "@babel/plugin-transform-object-super" "^7.24.7" - "@babel/plugin-transform-optional-catch-binding" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.8" - "@babel/plugin-transform-parameters" "^7.24.7" - "@babel/plugin-transform-private-methods" "^7.25.4" - "@babel/plugin-transform-private-property-in-object" "^7.24.7" - "@babel/plugin-transform-property-literals" "^7.24.7" - "@babel/plugin-transform-regenerator" "^7.24.7" - "@babel/plugin-transform-reserved-words" "^7.24.7" - "@babel/plugin-transform-shorthand-properties" "^7.24.7" - "@babel/plugin-transform-spread" "^7.24.7" - "@babel/plugin-transform-sticky-regex" "^7.24.7" - "@babel/plugin-transform-template-literals" "^7.24.7" - "@babel/plugin-transform-typeof-symbol" "^7.24.8" - "@babel/plugin-transform-unicode-escapes" "^7.24.7" - "@babel/plugin-transform-unicode-property-regex" "^7.24.7" - "@babel/plugin-transform-unicode-regex" "^7.24.7" - "@babel/plugin-transform-unicode-sets-regex" "^7.25.4" + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.25.9" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.25.9" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.25.9" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.25.9" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.25.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.25.9" + "@babel/plugin-transform-typeof-symbol" "^7.25.9" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.37.1" + core-js-compat "^3.38.1" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -1169,59 +1102,53 @@ esutils "^2.0.2" "@babel/preset-react@^7.13.13": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" - integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-transform-react-display-name" "^7.24.7" - "@babel/plugin-transform-react-jsx" "^7.24.7" - "@babel/plugin-transform-react-jsx-development" "^7.24.7" - "@babel/plugin-transform-react-pure-annotations" "^7.24.7" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.25.9.tgz#5f473035dc2094bcfdbc7392d0766bd42dce173e" + integrity sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-transform-react-display-name" "^7.25.9" + "@babel/plugin-transform-react-jsx" "^7.25.9" + "@babel/plugin-transform-react-jsx-development" "^7.25.9" + "@babel/plugin-transform-react-pure-annotations" "^7.25.9" "@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" - integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.9.tgz#65884fd6dc255a775402cc1d9811082918f4bf00" + integrity sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.24.7", "@babel/template@^7.25.0", "@babel/template@^7.3.3": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" - integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.4", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" - integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.6" - "@babel/parser" "^7.25.6" - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.6" +"@babel/template@^7.25.9", "@babel/template@^7.3.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.25.9", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" - integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.9.tgz#620f35ea1f4233df529ec9a2668d2db26574deee" + integrity sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ== dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" @@ -1918,6 +1845,89 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@parcel/watcher-android-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" + integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg== + +"@parcel/watcher-darwin-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34" + integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA== + +"@parcel/watcher-darwin-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020" + integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg== + +"@parcel/watcher-freebsd-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8" + integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w== + +"@parcel/watcher-linux-arm-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d" + integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA== + +"@parcel/watcher-linux-arm64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7" + integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA== + +"@parcel/watcher-linux-arm64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635" + integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA== + +"@parcel/watcher-linux-x64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz#0ce29966b082fb6cdd3de44f2f74057eef2c9e39" + integrity sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg== + +"@parcel/watcher-linux-x64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz#d2ebbf60e407170bb647cd6e447f4f2bab19ad16" + integrity sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ== + +"@parcel/watcher-win32-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc" + integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg== + +"@parcel/watcher-win32-ia32@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7" + integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw== + +"@parcel/watcher-win32-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf" + integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A== + +"@parcel/watcher@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.4.1.tgz#a50275151a1bb110879c6123589dba90c19f1bf8" + integrity sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.4.1" + "@parcel/watcher-darwin-arm64" "2.4.1" + "@parcel/watcher-darwin-x64" "2.4.1" + "@parcel/watcher-freebsd-x64" "2.4.1" + "@parcel/watcher-linux-arm-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-musl" "2.4.1" + "@parcel/watcher-linux-x64-glibc" "2.4.1" + "@parcel/watcher-linux-x64-musl" "2.4.1" + "@parcel/watcher-win32-arm64" "2.4.1" + "@parcel/watcher-win32-ia32" "2.4.1" + "@parcel/watcher-win32-x64" "2.4.1" + "@polka/url@^1.0.0-next.24": version "1.0.0-next.28" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" @@ -2227,9 +2237,9 @@ "@types/node" "*" "@types/node@*": - version "22.7.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.4.tgz#e35d6f48dca3255ce44256ddc05dee1c23353fcc" - integrity sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg== + version "22.7.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.9.tgz#2bf2797b5e84702d8262ea2cf843c3c3c880d0e9" + integrity sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg== dependencies: undici-types "~6.19.2" @@ -2589,9 +2599,9 @@ acorn@^6.0.7: integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== acorn@^8.0.4, acorn@^8.11.0, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + version "8.13.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" + integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -2756,12 +2766,10 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" +aria-query@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== arr-diff@^4.0.0: version "4.0.0" @@ -2778,7 +2786,7 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: +array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== @@ -2969,9 +2977,9 @@ aws4@^1.8.0: integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== axe-core@^4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59" - integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g== + version "4.10.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.2.tgz#85228e3e1d8b8532a27659b332e39b7fa0e022df" + integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w== axobject-query@^4.1.0: version "4.1.0" @@ -3227,15 +3235,15 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.21.10, browserslist@^4.23.1, browserslist@^4.23.3: - version "4.24.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" - integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== +browserslist@^4.21.10, browserslist@^4.23.3, browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: - caniuse-lite "^1.0.30001663" - electron-to-chromium "^1.5.28" + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" node-releases "^2.0.18" - update-browserslist-db "^1.1.0" + update-browserslist-db "^1.1.1" bser@2.1.1: version "2.1.1" @@ -3383,10 +3391,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001663: - version "1.0.30001664" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" - integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== +caniuse-lite@^1.0.30001669: + version "1.0.30001669" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz#fda8f1d29a8bfdc42de0c170d7f34a9cf19ed7a3" + integrity sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w== caseless@~0.12.0: version "0.12.0" @@ -3716,10 +3724,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== copy-descriptor@^0.1.0: version "0.1.1" @@ -3745,7 +3753,7 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.37.1, core-js-compat@^3.38.0: +core-js-compat@^3.38.0, core-js-compat@^3.38.1: version "3.38.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== @@ -3944,30 +3952,6 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-equal@^2.0.5: - version "2.2.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" - integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.5" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.2" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.13" - deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -4060,6 +4044,11 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -4208,10 +4197,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.28: - version "1.5.29" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" - integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== +electron-to-chromium@^1.5.41: + version "1.5.45" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.45.tgz#fa592ce6a88b44d23acbc7453a2feab98996e6c9" + integrity sha512-vOzZS6uZwhhbkZbcRyiy99Wg+pYFV5hk+5YaECvx0+Z31NR3Tt5zS6dze2OepT6PCTzVzT0dIJItti+uAW5zmw== emittery@^0.10.2: version "0.10.2" @@ -4361,25 +4350,10 @@ es-errors@^1.2.1, es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - -es-iterator-helpers@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" - integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== +es-iterator-helpers@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz#f6d745d342aea214fe09497e7152170dc333a7a6" + integrity sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" @@ -4388,12 +4362,12 @@ es-iterator-helpers@^1.0.19: es-set-tostringtag "^2.0.3" function-bind "^1.1.2" get-intrinsic "^1.2.4" - globalthis "^1.0.3" + globalthis "^1.0.4" has-property-descriptors "^1.0.2" has-proto "^1.0.3" has-symbols "^1.0.3" internal-slot "^1.0.7" - iterator.prototype "^1.1.2" + iterator.prototype "^1.1.3" safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: @@ -4491,7 +4465,7 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.9.0: +eslint-module-utils@^2.12.0: version "2.12.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== @@ -4499,9 +4473,9 @@ eslint-module-utils@^2.9.0: debug "^3.2.7" eslint-plugin-import@^2.22.1: - version "2.30.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" - integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== + version "2.31.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== dependencies: "@rtsao/scc" "^1.1.0" array-includes "^3.1.8" @@ -4511,7 +4485,7 @@ eslint-plugin-import@^2.22.1: debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.9.0" + eslint-module-utils "^2.12.0" hasown "^2.0.2" is-core-module "^2.15.1" is-glob "^4.0.3" @@ -4520,6 +4494,7 @@ eslint-plugin-import@^2.22.1: object.groupby "^1.0.3" object.values "^1.2.0" semver "^6.3.1" + string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" eslint-plugin-jest@^26.5.3: @@ -4530,11 +4505,11 @@ eslint-plugin-jest@^26.5.3: "@typescript-eslint/utils" "^5.10.0" eslint-plugin-jsx-a11y@^6.4.1: - version "6.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz#36fb9dead91cafd085ddbe3829602fb10ef28339" - integrity sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg== + version "6.10.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.1.tgz#87003835bad8875e023aa5db26f41a0c9e6a8fa9" + integrity sha512-zHByM9WTUMnfsDTafGXRiqxp6lFtNoSOWBY6FonVRn3A+BUwN1L/tdBXT40BcBJi0cZjOGTXZ0eD/rTG9fEJ0g== dependencies: - aria-query "~5.1.3" + aria-query "^5.3.2" array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" @@ -4542,14 +4517,14 @@ eslint-plugin-jsx-a11y@^6.4.1: axobject-query "^4.1.0" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.19" + es-iterator-helpers "^1.1.0" hasown "^2.0.2" jsx-ast-utils "^3.3.5" language-tags "^1.0.9" minimatch "^3.1.2" object.fromentries "^2.0.8" safe-regex-test "^1.0.3" - string.prototype.includes "^2.0.0" + string.prototype.includes "^2.0.1" eslint-plugin-prettier@^4.0.0: version "4.2.1" @@ -4564,16 +4539,16 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.23.2: - version "7.37.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.0.tgz#c21f64a32fc34df1eaeca571ec8f70bdc40dd20a" - integrity sha512-IHBePmfWH5lKhJnJ7WB1V+v/GolbB0rjS8XYVCSQCZKaQCAUhMoVoOEn1Ef8Z8Wf0a7l8KTJvuZg5/e4qrZ6nA== + version "7.37.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz#cd0935987876ba2900df2f58339f6d92305acc7a" + integrity sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" - es-iterator-helpers "^1.0.19" + es-iterator-helpers "^1.1.0" estraverse "^5.3.0" hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" @@ -4854,16 +4829,16 @@ expect@^28.1.3: jest-util "^28.1.3" express@^4.17.3: - version "4.21.0" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" - integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== + version "4.21.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" + integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.6.0" + cookie "0.7.1" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" @@ -4987,9 +4962,9 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-uri@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.2.tgz#d78b298cf70fd3b752fd951175a3da6a7b48f024" - integrity sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row== + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" + integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== fastest-levenshtein@^1.0.12: version "1.0.16" @@ -5348,7 +5323,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -5491,7 +5466,7 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globalthis@^1.0.3: +globalthis@^1.0.3, globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== @@ -5735,9 +5710,9 @@ html-minifier-terser@^6.0.2: terser "^5.10.0" html-webpack-plugin@^5.3.1: - version "5.6.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" - integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== + version "5.6.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz#a31145f0fee4184d53a794f9513147df1e653685" + integrity sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -5801,9 +5776,9 @@ http-proxy-agent@^4.0.1: debug "4" http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + version "2.0.7" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" + integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -6063,7 +6038,7 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -internal-slot@^1.0.4, internal-slot@^1.0.7: +internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== @@ -6107,15 +6082,7 @@ is-accessor-descriptor@^1.0.1: dependencies: hasown "^2.0.0" -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: +is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== @@ -6317,7 +6284,7 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.2, is-map@^2.0.3: +is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== @@ -6396,7 +6363,7 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-set@^2.0.2, is-set@^2.0.3: +is-set@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== @@ -6550,10 +6517,10 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== +iterator.prototype@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c" + integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ== dependencies: define-properties "^1.2.1" get-intrinsic "^1.2.1" @@ -7050,15 +7017,10 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +jsesc@^3.0.2, jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-buffer@3.0.1: version "3.0.1" @@ -7769,7 +7731,7 @@ micromatch@^3.1.10: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -7979,9 +7941,9 @@ mute-stream@0.0.7: integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== nan@^2.13.2: - version "2.20.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" - integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== + version "2.22.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" + integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== nanoid@^3.3.7: version "3.3.7" @@ -8010,11 +7972,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3, negotiator@^0.6.2: +negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@^0.6.2: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -8033,6 +8000,11 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-fetch@^2.6.12: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -8194,14 +8166,6 @@ object-inspect@^1.13.1: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -8600,9 +8564,9 @@ phin@^3.7.1: centra "^2.7.0" picocolors@^1.0.0, picocolors@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" - integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -9070,9 +9034,9 @@ readable-web-to-node-stream@^3.0.0: readable-stream "^3.6.0" readdirp@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.1.tgz#b2fe35f8dca63183cd3b86883ecc8f720ea96ae6" - integrity sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== readdirp@~3.6.0: version "3.6.0" @@ -9109,7 +9073,7 @@ reflect.getprototypeof@^1.0.4: globalthis "^1.0.3" which-builtin-type "^1.1.3" -regenerate-unicode-properties@^10.1.0: +regenerate-unicode-properties@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== @@ -9146,39 +9110,44 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== +regexp.prototype.flags@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== dependencies: - call-bind "^1.0.6" + call-bind "^1.0.7" define-properties "^1.2.1" es-errors "^1.3.0" - set-function-name "^2.0.1" + set-function-name "^2.0.2" regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== +regexpu-core@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac" + integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw== dependencies: - "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.11.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.1.tgz#ae55c74f646db0c8fcb922d4da635e33da405149" + integrity sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ== dependencies: - jsesc "~0.5.0" + jsesc "~3.0.2" relateurl@^0.2.7: version "0.2.7" @@ -9470,10 +9439,11 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.79.4.tgz#f9c45af35fbeb53d2c386850ec842098d9935267" - integrity sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg== + version "1.80.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.80.4.tgz#bc0418fd796cad2f1a1309d8b4d7fe44b7027de0" + integrity sha512-rhMQ2tSF5CsuuspvC94nPM9rToiAFw2h3JTrLlgmNw1MH79v8Cr3DH6KF6o6r+8oofY3iYVPUf66KzC8yuVN1w== dependencies: + "@parcel/watcher" "^2.4.1" chokidar "^4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" @@ -10011,13 +9981,6 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -10066,13 +10029,14 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.includes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f" - integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== +string.prototype.includes@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" + integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" string.prototype.matchall@^4.0.11, string.prototype.matchall@^4.0.6: version "4.0.11" @@ -10337,9 +10301,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.34.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.34.1.tgz#af40386bdbe54af0d063e0670afd55c3105abeb6" - integrity sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA== + version "5.36.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e" + integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10392,11 +10356,6 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -10510,9 +10469,9 @@ tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.7.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" - integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + version "2.8.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" + integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== tsutils@^3.21.0: version "3.21.0" @@ -10787,7 +10746,7 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.1.0: +update-browserslist-db@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== @@ -11154,7 +11113,7 @@ which-builtin-type@^1.1.3: which-collection "^1.0.2" which-typed-array "^1.1.15" -which-collection@^1.0.1, which-collection@^1.0.2: +which-collection@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== @@ -11169,7 +11128,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: +which-typed-array@^1.1.14, which-typed-array@^1.1.15: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== From 66d8187b26be06f7ecb5bdd5c87a67c53b9dd6e2 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 25 Oct 2024 09:03:50 +0200 Subject: [PATCH 719/825] Add entry for Vertex AI Embeddings Closes gh-1628 --- start-site/src/main/resources/application.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 7558a86a7a..6ed1758891 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1646,6 +1646,16 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/chat/vertexai-gemini-chat.html + - name: Vertex AI Embeddings + id: spring-ai-vertexai-embeddings + group-id: org.springframework.ai + artifact-id: spring-ai-vertex-ai-embedding-spring-boot-starter + description: Spring AI support for Google Vertex embeddings. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/embeddings/vertexai-embeddings-text.html - name: Qdrant Vector Database id: spring-ai-vectordb-qdrant group-id: org.springframework.ai From 76a9d0ac9880446c435e20d9a137b89eb9a9dc90 Mon Sep 17 00:00:00 2001 From: Christian Tzolov Date: Fri, 25 Oct 2024 08:59:05 +0200 Subject: [PATCH 720/825] Add Anthropic Claude and polish Vertex AI Embedding support See gh-1629 --- start-site/src/main/resources/application.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 6ed1758891..ba39d07e37 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1436,6 +1436,16 @@ initializr: - name: AI compatibilityRange: "[3.2.0,3.4.0-M1)" content: + - name: Anthropic Claude + id: spring-ai-anthropic + group-id: org.springframework.ai + artifact-id: spring-ai-anthropic-spring-boot-starter + description: Spring AI support for Anthropic Claude AI models. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/chat/anthropic-chat.html - name: Azure OpenAI id: spring-ai-azure-openai group-id: org.springframework.ai @@ -1640,7 +1650,7 @@ initializr: id: spring-ai-vertexai-gemini group-id: org.springframework.ai artifact-id: spring-ai-vertex-ai-gemini-spring-boot-starter - description: Spring AI support for Google Vertex Gemini chat. + description: Spring AI support for Google Vertex Gemini chat. Doesn't support embeddings. bom: spring-ai starter: true links: @@ -1650,12 +1660,16 @@ initializr: id: spring-ai-vertexai-embeddings group-id: org.springframework.ai artifact-id: spring-ai-vertex-ai-embedding-spring-boot-starter - description: Spring AI support for Google Vertex embeddings. + description: Spring AI support for Google Vertex text and multimodal embedding models. bom: spring-ai starter: true links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/embeddings/vertexai-embeddings-text.html + description: Text embedding reference + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/embeddings/vertexai-embeddings-multimodal.html + description: Multimodal embedding reference - name: Qdrant Vector Database id: spring-ai-vectordb-qdrant group-id: org.springframework.ai From 9b251c5c021ebc565f7111f1a0024417a637ec32 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 28 Oct 2024 10:23:53 +0100 Subject: [PATCH 721/825] Upgrade to Camel 4.8.1 https://camel.apache.org/blog/2024/10/RELEASE-4.8.1/ See gh-1631 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ba39d07e37..a419268b06 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -829,7 +829,7 @@ initializr: compatibilityRange: "[3.2.0,3.4.0-M1)" mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 4.8.0 + version: 4.8.1 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From 3e7a8976573a89937a9f0f1b94d82d8d22d47a8b Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 28 Oct 2024 12:23:59 +0200 Subject: [PATCH 722/825] Upgrade to Vaadin 24.5.2 See gh-1632 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index a419268b06..6c2d00192e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -160,7 +160,7 @@ initializr: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 24.4.14 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 24.5.0 + version: 24.5.2 platform: compatibilityRange: "3.2.0" dependencies: From e2af349574e5969c89ad84304f81b2aa924a33fc Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Thu, 17 Oct 2024 16:41:22 +0200 Subject: [PATCH 723/825] Improve error message in UI See gh-1624 --- start-client/src/components/Application.js | 41 +++++++++++-------- start-client/src/components/utils/ApiUtils.js | 10 ++++- start-client/webpack.dev.js | 9 ++++ 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/start-client/src/components/Application.js b/start-client/src/components/Application.js index 7862e98fda..9a240ca4a2 100644 --- a/start-client/src/components/Application.js +++ b/start-client/src/components/Application.js @@ -64,6 +64,20 @@ export default function Application() { } }, [dispatch, dispatchInitializr, windowsUtils.origin]) + const onEscape = () => { + setBlob(null) + dispatch({ + type: 'UPDATE', + payload: { + list: false, + share: false, + explore: false, + nav: false, + history: false, + }, + }) + } + const onSubmit = async () => { if (generating || list) { return @@ -74,8 +88,10 @@ export default function Application() { url, values, get(dependencies, 'list') - ).catch(() => { - toast.error(`Could not connect to server. Please check your network.`) + ).catch(err => { + toast.error( + err || `Could not connect to server. Please check your network.` + ) }) setGenerating(false) if (project) { @@ -91,8 +107,11 @@ export default function Application() { url, values, get(dependencies, 'list') - ).catch(() => { - toast.error(`Could not connect to server. Please check your network.`) + ).catch(err => { + toast.error( + err || `Could not connect to server. Please check your network.` + ) + onEscape() }) setBlob(project) } @@ -101,20 +120,6 @@ export default function Application() { dispatch({ type: 'UPDATE', payload: { share: true } }) } - const onEscape = () => { - setBlob(null) - dispatch({ - type: 'UPDATE', - payload: { - list: false, - share: false, - explore: false, - nav: false, - history: false, - }, - }) - } - return ( <> diff --git a/start-client/src/components/utils/ApiUtils.js b/start-client/src/components/utils/ApiUtils.js index 15cdbb8f50..f12bb094f9 100644 --- a/start-client/src/components/utils/ApiUtils.js +++ b/start-client/src/components/utils/ApiUtils.js @@ -153,7 +153,7 @@ export const parseParams = (values, queryParams, lists) => { const depsWarning = [] const newVal = value .split(',') - .filter(item => !!item) + .filter(item => !!item) .map(item => { const dep = get(lists, 'dependencies').find( d => d.id === item.trim() @@ -301,7 +301,13 @@ export const getProject = function getProject(url, values, config) { resolve(response.blob()) return } - reject() + try { + response.json().then(res => { + reject(res?.message || '') + }) + } catch (e) { + reject() + } }, () => { reject() diff --git a/start-client/webpack.dev.js b/start-client/webpack.dev.js index 06d594311d..e58aad3a7b 100644 --- a/start-client/webpack.dev.js +++ b/start-client/webpack.dev.js @@ -25,6 +25,15 @@ const config = { }, 800) }) devServer.app.get('/starter.zip', function (req, res) { + // 500 errors + // res.status(500).json({ + // timestamp: '2022-09-05T14:39:37.471+00:00', + // status: 500, + // error: 'Internal Server Error', + // message: + // 'Malformed input or input contains unmappable characters: MixérApplication.java', + // path: '/starter.zip', + // }) fs.readFile(path.resolve('./dev/starter.mock.zip'), (err, data) => { if (err) return sendError(err, res) setTimeout(() => { From 9143f2d261846f1fbe0e199b7a760204bbf635d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Ko=CC=88ninger?= Date: Sat, 2 Nov 2024 17:39:44 +0100 Subject: [PATCH 724/825] Upgrade Spring Boot Admin to 3.3.5 See gh-1633 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 6c2d00192e..4aa3699cdd 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -49,7 +49,7 @@ initializr: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 3.2.3 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.3.4 + version: 3.3.5 netflix-dgs: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-platform-dependencies From 057765b98c63d04c12e7ce8b7fcf73414a1476a0 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 5 Nov 2024 10:57:59 +0200 Subject: [PATCH 725/825] Upgrade to Vaadin 24.5.3 See gh-1634 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4aa3699cdd..2ce8225c69 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -160,7 +160,7 @@ initializr: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 24.4.14 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 24.5.2 + version: 24.5.3 platform: compatibilityRange: "3.2.0" dependencies: From 1fb8caa2213a66615dc754dd9d8142cbdf2404bd Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 5 Nov 2024 16:25:02 +0100 Subject: [PATCH 726/825] Set User-Agent header when making requests against api.spring.io Closes gh-1635 --- .../main/java/io/spring/start/site/StartApplication.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/java/io/spring/start/site/StartApplication.java b/start-site/src/main/java/io/spring/start/site/StartApplication.java index 2a8fb9a18e..757acc26e7 100644 --- a/start-site/src/main/java/io/spring/start/site/StartApplication.java +++ b/start-site/src/main/java/io/spring/start/site/StartApplication.java @@ -36,8 +36,10 @@ import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; +import org.springframework.http.HttpHeaders; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.util.StringUtils; +import org.springframework.web.client.RestTemplate; /** * Initializr website application. @@ -64,7 +66,9 @@ public HomeController homeController() { @Bean public StartInitializrMetadataUpdateStrategy initializrMetadataUpdateStrategy( RestTemplateBuilder restTemplateBuilder, ObjectMapper objectMapper) { - return new StartInitializrMetadataUpdateStrategy(restTemplateBuilder.build(), objectMapper); + RestTemplate restTemplate = restTemplateBuilder.defaultHeader(HttpHeaders.USER_AGENT, "start.spring.io") + .build(); + return new StartInitializrMetadataUpdateStrategy(restTemplate, objectMapper); } @Bean From ae9e5a05544ea1a9ff6831b526a9a826d1a14eac Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 6 Nov 2024 08:46:54 +0200 Subject: [PATCH 727/825] Upgrade to Vaadin 24.4.15 See gh-1637 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2ce8225c69..0e95d69cd4 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -158,7 +158,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 24.4.14 + version: 24.4.15 - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 24.5.3 platform: From ad66be99302667367ff06203a48b9f8e971dd6ae Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 6 Nov 2024 09:29:10 +0100 Subject: [PATCH 728/825] Upgrade to Spring Cloud Azure 5.18.0 Closes gh-1636 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0e95d69cd4..e8a7e848b8 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -107,7 +107,7 @@ initializr: versionProperty: spring-cloud-azure.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 5.17.1 + version: 5.18.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies From eab3c29267fa95ecff53fbcc5936faf9270f8bee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 8 Nov 2024 14:38:40 -0600 Subject: [PATCH 729/825] Replace Collectors.toList() with toList() See gh-1640 --- .../java/io/spring/start/site/DependencyResolver.java | 5 ++--- .../spring/start/site/MetadataVerificationTests.java | 10 +++------- .../springazure/SpringAzureModuleRegistry.java | 6 +++--- .../SpringIntegrationModuleRegistry.java | 4 ++-- .../testcontainers/TestcontainersModuleRegistry.java | 3 +-- .../support/StartInitializrMetadataUpdateStrategy.java | 7 +++---- 6 files changed, 14 insertions(+), 21 deletions(-) diff --git a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java index 3efb658d72..fae4953711 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java +++ b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; import java.util.stream.Stream; import io.spring.initializr.metadata.BillOfMaterials; @@ -124,7 +123,7 @@ private List getManagedDependencies(List boms, List return boms.stream() .flatMap((bom) -> getManagedDependencies(bom.getGroupId(), bom.getArtifactId(), bom.getVersion(), repositories)) - .collect(Collectors.toList()); + .toList(); } private Stream getManagedDependencies(String groupId, String artifactId, String version, diff --git a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java index e77d6ddd2d..b170aae24f 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java +++ b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; -import java.util.stream.Collectors; import java.util.stream.Stream; import io.spring.initializr.generator.version.Version; @@ -161,7 +160,7 @@ private Collection bootVersions() { .stream() .map(DefaultMetadataElement::getId) .map(VersionParser.DEFAULT::parse) - .collect(Collectors.toList()); + .toList(); } private Collection groups() { @@ -169,10 +168,7 @@ private Collection groups() { } private Collection dependenciesForBootVersion(DependencyGroup group, Version bootVersion) { - return group.getContent() - .stream() - .filter((dependency) -> dependency.match(bootVersion)) - .collect(Collectors.toList()); + return group.getContent().stream().filter((dependency) -> dependency.match(bootVersion)).toList(); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java index 86f30bb446..095d60c5a7 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ import java.util.Arrays; import java.util.function.Consumer; -import java.util.stream.Collectors; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; @@ -33,6 +32,7 @@ * @author Andy Wilkinson * @author Yonghui Ye * @author Stephane Nicoll + * @author Eddú Meléndez */ abstract class SpringAzureModuleRegistry { @@ -55,7 +55,7 @@ static Iterable createSpringBootRegistry() { } private static Iterable create(ImplicitDependency.Builder... dependencies) { - return Arrays.stream(dependencies).map(Builder::build).collect(Collectors.toList()); + return Arrays.stream(dependencies).map(Builder::build).toList(); } private static ImplicitDependency.Builder onDependencies(String... dependencyIds) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java index 369d15db5e..054f959d39 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; -import java.util.stream.Collectors; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; @@ -37,6 +36,7 @@ * @author Artem Bilan * @author Stephane Nicoll * @author Moritz Halbritter + * @author Eddú Meléndez */ abstract class SpringIntegrationModuleRegistry { @@ -86,7 +86,7 @@ static Iterable create(Version platformVersion) { .andThen(addReferenceLink("WebSocket Module", "web-sockets")))); builders.add(onDependencies("web-services").customizeBuild(addDependency("ws")) .customizeHelpDocument(addReferenceLink("Web Services Module", "ws"))); - return builders.stream().map(Builder::build).collect(Collectors.toList()); + return builders.stream().map(Builder::build).toList(); } private static ImplicitDependency.Builder onDependencies(String... dependencyIds) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 3622622c97..f3f694d048 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; -import java.util.stream.Collectors; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; @@ -102,7 +101,7 @@ static Iterable create(Version platformVersion) { builders.add(onDependencies("spring-ai-vectordb-weaviate").customizeBuild(addModule("weaviate")) .customizeHelpDocument(addReferenceLink("Weaviate Module", "testcontainers/"))); } - return builders.stream().map(Builder::build).collect(Collectors.toList()); + return builders.stream().map(Builder::build).toList(); } private static ImplicitDependency.Builder onDependencies(String... dependencyIds) { diff --git a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java index b3c9019eb4..c3f6763d08 100644 --- a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java +++ b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package io.spring.start.site.support; import java.util.List; -import java.util.stream.Collectors; import com.fasterxml.jackson.databind.ObjectMapper; import io.spring.initializr.generator.version.Version; @@ -33,6 +32,7 @@ * * @author Stephane Nicoll * @author Moritz Halbritter + * @author Eddú Meléndez */ public class StartInitializrMetadataUpdateStrategy extends SpringIoInitializrMetadataUpdateStrategy { @@ -45,8 +45,7 @@ public StartInitializrMetadataUpdateStrategy(RestTemplate restTemplate, ObjectMa @Override protected List fetchSpringBootVersions(String url) { List versions = super.fetchSpringBootVersions(url); - return (versions != null) ? versions.stream().filter(this::isCompatibleVersion).collect(Collectors.toList()) - : null; + return (versions != null) ? versions.stream().filter(this::isCompatibleVersion).toList() : null; } private boolean isCompatibleVersion(DefaultMetadataElement versionMetadata) { From 9a474127b4309cbb8e29d720d0d9aba550e11034 Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Fri, 8 Nov 2024 18:40:18 +0100 Subject: [PATCH 730/825] Upgrade to Spring Cloud 2024.0.0-RC1 See gh-1638 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e8a7e848b8..7953da50ed 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -99,7 +99,7 @@ initializr: - compatibilityRange: "[3.2.0,3.4.0-M1)" version: 2023.0.3 - compatibilityRange: "[3.4.0-M1,3.5.0-M1)" - version: 2024.0.0-M2 + version: 2024.0.0-RC1 repositories: spring-milestones spring-cloud-azure: groupId: com.azure.spring From c05065659751bbf81060442398179bafedb7341b Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Mon, 11 Nov 2024 12:46:20 +0200 Subject: [PATCH 731/825] Upgrade to Vaadin 24.5.4 and 24.4.16 See gh-1641 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 7953da50ed..c590c3cb2d 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -158,9 +158,9 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 24.4.15 + version: 24.4.16 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 24.5.3 + version: 24.5.4 platform: compatibilityRange: "3.2.0" dependencies: From a7e9d91e7b759879e4fdbaa0accf512f839f50b6 Mon Sep 17 00:00:00 2001 From: Fred Date: Tue, 12 Nov 2024 13:18:25 -0300 Subject: [PATCH 732/825] Upgrade Timefold Solver to 1.16.0 See gh-1642 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c590c3cb2d..53933c4114 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -151,7 +151,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 1.15.0 + version: 1.16.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From cd6a3d81736d9416977f537c2c00ab0170e2b751 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 13 Nov 2024 09:27:32 +0100 Subject: [PATCH 733/825] Upgrade to Spring Cloud GCP 5.8.0 Closes gh-1630 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 53933c4114..c895765ec4 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -115,7 +115,7 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 5.7.0 + version: 5.8.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From b4b4c6a18e1ac177c57fac1d186fca01c472cd2e Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 20 Nov 2024 16:49:37 +0200 Subject: [PATCH 734/825] Upgrade to Vaadin 24.5.5 and 24.4.17 See gh-1644 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c895765ec4..25727dd07f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -158,9 +158,9 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 24.4.16 + version: 24.4.17 - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 24.5.4 + version: 24.5.5 platform: compatibilityRange: "3.2.0" dependencies: From d2d770eca2bf983e9b8949244e7af082c7995cc3 Mon Sep 17 00:00:00 2001 From: Ilayaperumal Gopinathan Date: Thu, 21 Nov 2024 09:10:58 +0000 Subject: [PATCH 735/825] Upgrade Spring AI to 1.0.0-M4 - Update Spring AI BOM to 1.0.0-M4 - Add Amazon Bedrock Converse Boot starter - Remove spring-ai-vertex-ai-palm2-spring-boot-starter See gh-1645 --- start-site/src/main/resources/application.yml | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 25727dd07f..aea2dfc4f2 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -88,7 +88,7 @@ initializr: versionProperty: spring-ai.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 1.0.0-M3 + version: 1.0.0-M4 repositories: spring-milestones spring-cloud: groupId: org.springframework.cloud @@ -1476,6 +1476,16 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/bedrock-chat.html + - name: Amazon Bedrock Converse + id: spring-ai-bedrock-converse + group-id: org.springframework.ai + artifact-id: spring-ai-bedrock-converse-spring-boot-starter + description: Spring AI support for Amazon Bedrock Converse. It provides a unified interface for conversational AI models with enhanced capabilities including function/tool calling, multimodal inputs, and streaming responses. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/bedrock-converse.html - name: Apache Cassandra Vector Database id: spring-ai-vectordb-cassandra group-id: org.springframework.ai @@ -1636,16 +1646,6 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html - - name: Vertex AI PaLM2 - id: spring-ai-vertexai-palm2 - group-id: org.springframework.ai - artifact-id: spring-ai-vertex-ai-palm2-spring-boot-starter - description: Spring AI support for Google Vertex PaLM2 chat and embedding models. - bom: spring-ai - starter: true - links: - - rel: reference - href: https://docs.spring.io/spring-ai/reference/api/chat/vertexai-palm2-chat.html - name: Vertex AI Gemini id: spring-ai-vertexai-gemini group-id: org.springframework.ai From 03960c6b0524e9560842b84df00afab45da51ecf Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 21 Nov 2024 14:32:31 +0100 Subject: [PATCH 736/825] Upgrade to Spring Boot 3.3.6 Closes gh-1646 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 37b83344ff..b123c2657e 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.4 + 3.3.6 io.spring.start start-parent From f0a5d23ee7a0d8259360ee1d5d8f19f4e5db13fd Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 21 Nov 2024 14:58:55 +0100 Subject: [PATCH 737/825] Update yarn lockfile --- start-client/yarn.lock | 792 +++++++++++++++++++++-------------------- 1 file changed, 406 insertions(+), 386 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 373820b065..062f165b3e 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -35,34 +35,35 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.6.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.9.tgz#895b6c7e04a7271a0cbfd575d2e8131751914cc7" - integrity sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: - "@babel/highlight" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.9.tgz#24b01c5db6a3ebf85661b4fb4a946a9bccc72ac8" - integrity sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" + integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.9.tgz#855a4cddcec4158f3f7afadacdab2a7de8af7434" - integrity sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ== + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helpers" "^7.25.9" - "@babel/parser" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" "@babel/template" "^7.25.9" "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/types" "^7.26.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -78,12 +79,13 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.25.9", "@babel/generator@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.9.tgz#c7e828ebe0c2baba103b712924699c9e8a6e32f0" - integrity sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA== +"@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" + integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== dependencies: - "@babel/types" "^7.25.9" + "@babel/parser" "^7.26.2" + "@babel/types" "^7.26.0" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -136,10 +138,10 @@ regexpu-core "^6.1.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.2": - version "0.6.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" - integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== +"@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21" + integrity sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -163,13 +165,12 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helper-module-transforms@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz#12e4fb2969197ef6d78ea8a2f24375ce85b425fb" - integrity sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA== +"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== dependencies: "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-simple-access" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" "@babel/traverse" "^7.25.9" @@ -243,30 +244,20 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helpers@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.9.tgz#9e26aa6fbefdbca4f8c8a1d66dc6f1c00ddadb0a" - integrity sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g== +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== dependencies: "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/highlight@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6" - integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" + "@babel/types" "^7.26.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.7.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.9.tgz#8fcaa079ac7458facfddc5cd705cc8005e4d3817" - integrity sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2", "@babel/parser@^7.7.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" + integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== dependencies: - "@babel/types" "^7.25.9" + "@babel/types" "^7.26.0" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -479,17 +470,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.9.tgz#631686872fac3d4d1f1ae9a406a8fd1c482c7b2a" - integrity sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg== +"@babel/plugin-syntax-import-assertions@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f" + integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.9.tgz#29c9643445deea4533c05e6ac6c39d15424bbe78" - integrity sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg== +"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== dependencies: "@babel/helper-plugin-utils" "^7.25.9" @@ -639,10 +630,10 @@ "@babel/helper-create-class-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-static-block@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.9.tgz#1cab37c4278a563409d74c1e4f08fb77de5d7a5c" - integrity sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg== +"@babel/plugin-transform-class-static-block@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0" + integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" @@ -932,6 +923,14 @@ "@babel/helper-plugin-utils" "^7.25.9" regenerator-transform "^0.15.2" +"@babel/plugin-transform-regexp-modifiers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850" + integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-reserved-words@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" @@ -1019,11 +1018,11 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.9.tgz#fc8a68705e02553cdeeeb5477bf241e12b9c3cd9" - integrity sha512-XqDEt+hfsQukahSX9JOBDHhpUHDhj2zGSxoqWQFCMajOSBnbhBdgON/bU/5PkBA1yX5tqW6tTzuIPVsZTQ7h5Q== + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1" + integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw== dependencies: - "@babel/compat-data" "^7.25.9" + "@babel/compat-data" "^7.26.0" "@babel/helper-compilation-targets" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-validator-option" "^7.25.9" @@ -1033,8 +1032,8 @@ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.25.9" - "@babel/plugin-syntax-import-attributes" "^7.25.9" + "@babel/plugin-syntax-import-assertions" "^7.26.0" + "@babel/plugin-syntax-import-attributes" "^7.26.0" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.25.9" "@babel/plugin-transform-async-generator-functions" "^7.25.9" @@ -1042,7 +1041,7 @@ "@babel/plugin-transform-block-scoped-functions" "^7.25.9" "@babel/plugin-transform-block-scoping" "^7.25.9" "@babel/plugin-transform-class-properties" "^7.25.9" - "@babel/plugin-transform-class-static-block" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.26.0" "@babel/plugin-transform-classes" "^7.25.9" "@babel/plugin-transform-computed-properties" "^7.25.9" "@babel/plugin-transform-destructuring" "^7.25.9" @@ -1075,6 +1074,7 @@ "@babel/plugin-transform-private-property-in-object" "^7.25.9" "@babel/plugin-transform-property-literals" "^7.25.9" "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-regexp-modifiers" "^7.26.0" "@babel/plugin-transform-reserved-words" "^7.25.9" "@babel/plugin-transform-shorthand-properties" "^7.25.9" "@babel/plugin-transform-spread" "^7.25.9" @@ -1114,9 +1114,9 @@ "@babel/plugin-transform-react-pure-annotations" "^7.25.9" "@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.9.tgz#65884fd6dc255a775402cc1d9811082918f4bf00" - integrity sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg== + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== dependencies: regenerator-runtime "^0.14.0" @@ -1142,10 +1142,10 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.9.tgz#620f35ea1f4233df529ec9a2668d2db26574deee" - integrity sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -1161,16 +1161,16 @@ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.6.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" - integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -1845,88 +1845,94 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@parcel/watcher-android-arm64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" - integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg== +"@parcel/watcher-android-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a" + integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ== -"@parcel/watcher-darwin-arm64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34" - integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA== +"@parcel/watcher-darwin-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f" + integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw== -"@parcel/watcher-darwin-x64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020" - integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg== +"@parcel/watcher-darwin-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb" + integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA== -"@parcel/watcher-freebsd-x64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8" - integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w== +"@parcel/watcher-freebsd-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82" + integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw== -"@parcel/watcher-linux-arm-glibc@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d" - integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA== +"@parcel/watcher-linux-arm-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42" + integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA== -"@parcel/watcher-linux-arm64-glibc@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7" - integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA== +"@parcel/watcher-linux-arm-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4" + integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA== -"@parcel/watcher-linux-arm64-musl@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635" - integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA== +"@parcel/watcher-linux-arm64-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03" + integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA== -"@parcel/watcher-linux-x64-glibc@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz#0ce29966b082fb6cdd3de44f2f74057eef2c9e39" - integrity sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg== +"@parcel/watcher-linux-arm64-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732" + integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q== -"@parcel/watcher-linux-x64-musl@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz#d2ebbf60e407170bb647cd6e447f4f2bab19ad16" - integrity sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ== +"@parcel/watcher-linux-x64-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d" + integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw== -"@parcel/watcher-win32-arm64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc" - integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg== +"@parcel/watcher-linux-x64-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef" + integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA== -"@parcel/watcher-win32-ia32@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7" - integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw== +"@parcel/watcher-win32-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154" + integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig== -"@parcel/watcher-win32-x64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf" - integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A== +"@parcel/watcher-win32-ia32@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220" + integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA== + +"@parcel/watcher-win32-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7" + integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw== "@parcel/watcher@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.4.1.tgz#a50275151a1bb110879c6123589dba90c19f1bf8" - integrity sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10" + integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ== dependencies: detect-libc "^1.0.3" is-glob "^4.0.3" micromatch "^4.0.5" node-addon-api "^7.0.0" optionalDependencies: - "@parcel/watcher-android-arm64" "2.4.1" - "@parcel/watcher-darwin-arm64" "2.4.1" - "@parcel/watcher-darwin-x64" "2.4.1" - "@parcel/watcher-freebsd-x64" "2.4.1" - "@parcel/watcher-linux-arm-glibc" "2.4.1" - "@parcel/watcher-linux-arm64-glibc" "2.4.1" - "@parcel/watcher-linux-arm64-musl" "2.4.1" - "@parcel/watcher-linux-x64-glibc" "2.4.1" - "@parcel/watcher-linux-x64-musl" "2.4.1" - "@parcel/watcher-win32-arm64" "2.4.1" - "@parcel/watcher-win32-ia32" "2.4.1" - "@parcel/watcher-win32-x64" "2.4.1" + "@parcel/watcher-android-arm64" "2.5.0" + "@parcel/watcher-darwin-arm64" "2.5.0" + "@parcel/watcher-darwin-x64" "2.5.0" + "@parcel/watcher-freebsd-x64" "2.5.0" + "@parcel/watcher-linux-arm-glibc" "2.5.0" + "@parcel/watcher-linux-arm-musl" "2.5.0" + "@parcel/watcher-linux-arm64-glibc" "2.5.0" + "@parcel/watcher-linux-arm64-musl" "2.5.0" + "@parcel/watcher-linux-x64-glibc" "2.5.0" + "@parcel/watcher-linux-x64-musl" "2.5.0" + "@parcel/watcher-win32-arm64" "2.5.0" + "@parcel/watcher-win32-ia32" "2.5.0" + "@parcel/watcher-win32-x64" "2.5.0" "@polka/url@^1.0.0-next.24": version "1.0.0-next.28" @@ -2084,20 +2090,36 @@ dependencies: "@types/ms" "*" -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" -"@types/estree@^1.0.5": +"@types/eslint@*": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz#91f06cda1049e8f17eeab364798ed79c97488a1c" - integrity sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw== + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz#3c9997ae9d00bc236e45c6374e84f2596458d9db" + integrity sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2192,7 +2214,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2237,11 +2259,11 @@ "@types/node" "*" "@types/node@*": - version "22.7.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.9.tgz#2bf2797b5e84702d8262ea2cf843c3c3c880d0e9" - integrity sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg== + version "22.9.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.1.tgz#bdf91c36e0e7ecfb7257b2d75bf1b206b308ca71" + integrity sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg== dependencies: - undici-types "~6.19.2" + undici-types "~6.19.8" "@types/node@16.9.1": version "16.9.1" @@ -2264,9 +2286,9 @@ integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== "@types/qs@*": - version "6.9.16" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" - integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== + version "6.9.17" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" + integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== "@types/range-parser@*": version "1.2.7" @@ -2337,9 +2359,9 @@ integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== "@types/ws@^8.5.5": - version "8.5.12" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" - integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== + version "8.5.13" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" + integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== dependencies: "@types/node" "*" @@ -2415,125 +2437,125 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" - integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.12.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== -"@webassemblyjs/helper-buffer@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" - integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== -"@webassemblyjs/helper-wasm-section@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" - integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== "@webassemblyjs/wasm-edit@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" - integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-opt" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - "@webassemblyjs/wast-printer" "1.12.1" - -"@webassemblyjs/wasm-gen@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" - integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" - integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - -"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" - integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" - integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== - dependencies: - "@webassemblyjs/ast" "1.12.1" + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== + dependencies: + "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.2.0": @@ -2568,7 +2590,7 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -2576,11 +2598,6 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-attributes@^1.9.5: - version "1.9.5" - resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" - integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== - acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -2598,10 +2615,10 @@ acorn@^6.0.7: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^8.0.4, acorn@^8.11.0, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" - integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== +acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.8.2, acorn@^8.9.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -3054,12 +3071,12 @@ babel-plugin-lodash@^3.3.4: require-package-name "^2.0.1" babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.11" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" - integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== + version "0.4.12" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz#ca55bbec8ab0edeeef3d7b8ffd75322e210879a9" + integrity sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.2" + "@babel/helper-define-polyfill-provider" "^0.6.3" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.10.6: @@ -3071,11 +3088,11 @@ babel-plugin-polyfill-corejs3@^0.10.6: core-js-compat "^3.38.0" babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" - integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== + version "0.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8" + integrity sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.2" + "@babel/helper-define-polyfill-provider" "^0.6.3" babel-preset-current-node-syntax@^1.0.0: version "1.1.0" @@ -3185,9 +3202,9 @@ body-scroll-lock@^3.1.5: integrity sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg== bonjour-service@^1.0.11: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" - integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" + integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== dependencies: fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" @@ -3235,7 +3252,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.21.10, browserslist@^4.23.3, browserslist@^4.24.0: +browserslist@^4.24.0, browserslist@^4.24.2: version "4.24.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== @@ -3275,11 +3292,6 @@ builtin-modules@^3.1.0, builtin-modules@^3.3.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -3392,9 +3404,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001669: - version "1.0.30001669" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz#fda8f1d29a8bfdc42de0c170d7f34a9cf19ed7a3" - integrity sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w== + version "1.0.30001683" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz#7f026a2d5d319a9cf8915a1451173052caaadc81" + integrity sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q== caseless@~0.12.0: version "0.12.0" @@ -3657,7 +3669,7 @@ component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== -compressible@~2.0.16: +compressible@~2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== @@ -3665,16 +3677,16 @@ compressible@~2.0.16: mime-db ">= 1.43.0 < 2" compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + version "1.7.5" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" + integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" + bytes "3.1.2" + compressible "~2.0.18" debug "2.6.9" + negotiator "~0.6.4" on-headers "~1.0.2" - safe-buffer "5.1.2" + safe-buffer "5.2.1" vary "~1.1.2" concat-map@0.0.1: @@ -3754,11 +3766,11 @@ copy-webpack-plugin@^11.0.0: serialize-javascript "^6.0.0" core-js-compat@^3.38.0, core-js-compat@^3.38.1: - version "3.38.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" - integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== + version "3.39.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61" + integrity sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw== dependencies: - browserslist "^4.23.3" + browserslist "^4.24.2" core-util-is@1.0.2: version "1.0.2" @@ -3788,9 +3800,9 @@ cross-fetch@^3.0.4: node-fetch "^2.6.12" cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + version "6.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" + integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== dependencies: nice-try "^1.0.4" path-key "^2.0.1" @@ -3799,9 +3811,9 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: which "^1.2.9" cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -4198,9 +4210,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.5.41: - version "1.5.45" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.45.tgz#fa592ce6a88b44d23acbc7453a2feab98996e6c9" - integrity sha512-vOzZS6uZwhhbkZbcRyiy99Wg+pYFV5hk+5YaECvx0+Z31NR3Tt5zS6dze2OepT6PCTzVzT0dIJItti+uAW5zmw== + version "1.5.63" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz#69444d592fbbe628d129866c2355691ea93eda3e" + integrity sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA== emittery@^0.10.2: version "0.10.2" @@ -4287,9 +4299,9 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + version "1.23.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb" + integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ== dependencies: array-buffer-byte-length "^1.0.1" arraybuffer.prototype.slice "^1.0.3" @@ -4306,7 +4318,7 @@ es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23 function.prototype.name "^1.1.6" get-intrinsic "^1.2.4" get-symbol-description "^1.0.2" - globalthis "^1.0.3" + globalthis "^1.0.4" gopd "^1.0.1" has-property-descriptors "^1.0.2" has-proto "^1.0.3" @@ -4322,10 +4334,10 @@ es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23 is-string "^1.0.7" is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.13.1" + object-inspect "^1.13.3" object-keys "^1.1.1" object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" + regexp.prototype.flags "^1.5.3" safe-array-concat "^1.1.2" safe-regex-test "^1.0.3" string.prototype.trim "^1.2.9" @@ -4351,9 +4363,9 @@ es-errors@^1.2.1, es-errors@^1.3.0: integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-iterator-helpers@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz#f6d745d342aea214fe09497e7152170dc333a7a6" - integrity sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz#2f1a3ab998b30cb2d10b195b587c6d9ebdebf152" + integrity sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" @@ -4363,6 +4375,7 @@ es-iterator-helpers@^1.1.0: function-bind "^1.1.2" get-intrinsic "^1.2.4" globalthis "^1.0.4" + gopd "^1.0.1" has-property-descriptors "^1.0.2" has-proto "^1.0.3" has-symbols "^1.0.3" @@ -4505,9 +4518,9 @@ eslint-plugin-jest@^26.5.3: "@typescript-eslint/utils" "^5.10.0" eslint-plugin-jsx-a11y@^6.4.1: - version "6.10.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.1.tgz#87003835bad8875e023aa5db26f41a0c9e6a8fa9" - integrity sha512-zHByM9WTUMnfsDTafGXRiqxp6lFtNoSOWBY6FonVRn3A+BUwN1L/tdBXT40BcBJi0cZjOGTXZ0eD/rTG9fEJ0g== + version "6.10.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz#d2812bb23bf1ab4665f1718ea442e8372e638483" + integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q== dependencies: aria-query "^5.3.2" array-includes "^3.1.8" @@ -4517,7 +4530,6 @@ eslint-plugin-jsx-a11y@^6.4.1: axobject-query "^4.1.0" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - es-iterator-helpers "^1.1.0" hasown "^2.0.2" jsx-ast-utils "^3.3.5" language-tags "^1.0.9" @@ -5158,9 +5170,9 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== follow-redirects@^1.0.0, follow-redirects@^1.15.6: version "1.15.9" @@ -5880,11 +5892,16 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== -immutable@^4.0.0, immutable@^4.0.0-rc.12: +immutable@^4.0.0-rc.12: version "4.3.7" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== +immutable@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.3.tgz#aa037e2313ea7b5d400cd9298fa14e404c933db1" + integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -7977,7 +7994,7 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -negotiator@^0.6.2: +negotiator@^0.6.2, negotiator@~0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== @@ -8161,10 +8178,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== +object-inspect@^1.13.1, object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== object-keys@^1.1.1: version "1.1.1" @@ -8563,7 +8580,7 @@ phin@^3.7.1: dependencies: centra "^2.7.0" -picocolors@^1.0.0, picocolors@^1.1.0: +picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -8623,20 +8640,20 @@ postcss-modules-extract-imports@^3.1.0: integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== postcss-modules-local-by-default@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" - integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz#b0db6bc81ffc7bdc52eb0f84d6ca0bedf0e36d21" + integrity sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q== dependencies: icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" + postcss-selector-parser "^7.0.0" postcss-value-parser "^4.1.0" postcss-modules-scope@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" - integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== + version "3.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== dependencies: - postcss-selector-parser "^6.0.4" + postcss-selector-parser "^7.0.0" postcss-modules-values@^4.0.0: version "4.0.0" @@ -8645,10 +8662,10 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" - integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== +postcss-selector-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz#41bd8b56f177c093ca49435f65731befe25d6b9c" + integrity sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -8659,12 +8676,12 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.4.33: - version "8.4.47" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" - integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== dependencies: nanoid "^3.3.7" - picocolors "^1.1.0" + picocolors "^1.1.1" source-map-js "^1.2.1" prelude-ls@^1.2.1: @@ -8796,9 +8813,11 @@ proxy-addr@~2.0.7: ipaddr.js "1.9.1" psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + version "1.11.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.11.0.tgz#56fed2560dcb74a9c374f8e6f6596b328b26699c" + integrity sha512-pjFdcBXT4g061k/SQkzNCRnav+1RdIOgrcX8hs5eL3CEQcFZP9qT8T1RWYxGKT11rH1DdIW+kJRfCYykBJuerQ== + dependencies: + punycode "^2.3.1" pump@^3.0.0: version "3.0.2" @@ -8808,7 +8827,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -9110,7 +9129,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.5.2: +regexp.prototype.flags@^1.5.2, regexp.prototype.flags@^1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== @@ -9143,9 +9162,9 @@ regjsgen@^0.8.0: integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== regjsparser@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.1.tgz#ae55c74f646db0c8fcb922d4da635e33da405149" - integrity sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ== + version "0.11.2" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.2.tgz#7404ad42be00226d72bcf1f003f1f441861913d8" + integrity sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA== dependencies: jsesc "~3.0.2" @@ -9390,16 +9409,16 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" @@ -9439,14 +9458,15 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.80.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.80.4.tgz#bc0418fd796cad2f1a1309d8b4d7fe44b7027de0" - integrity sha512-rhMQ2tSF5CsuuspvC94nPM9rToiAFw2h3JTrLlgmNw1MH79v8Cr3DH6KF6o6r+8oofY3iYVPUf66KzC8yuVN1w== + version "1.81.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.81.0.tgz#a9010c0599867909dfdbad057e4a6fbdd5eec941" + integrity sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA== dependencies: - "@parcel/watcher" "^2.4.1" chokidar "^4.0.0" - immutable "^4.0.0" + immutable "^5.0.2" source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" sax@>=0.6.0: version "1.4.1" @@ -10469,9 +10489,9 @@ tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.8.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" - integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tsutils@^3.21.0: version "3.21.0" @@ -10608,7 +10628,7 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici-types@~6.19.2: +undici-types@~6.19.8: version "6.19.8" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== @@ -11025,17 +11045,17 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.95.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.95.0.tgz#8fd8c454fa60dad186fbe36c400a55848307b4c0" - integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== + version "5.96.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.96.1.tgz#3676d1626d8312b6b10d0c18cc049fba7ac01f0c" + integrity sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA== dependencies: - "@types/estree" "^1.0.5" + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" "@webassemblyjs/ast" "^1.12.1" "@webassemblyjs/wasm-edit" "^1.12.1" "@webassemblyjs/wasm-parser" "^1.12.1" - acorn "^8.7.1" - acorn-import-attributes "^1.9.5" - browserslist "^4.21.10" + acorn "^8.14.0" + browserslist "^4.24.0" chrome-trace-event "^1.0.2" enhanced-resolve "^5.17.1" es-module-lexer "^1.2.1" From b7a9b6c1fb92d27957e4a010dba6b27f9eefe7b0 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 19 Nov 2024 12:42:40 +0100 Subject: [PATCH 738/825] Remove support for Spring Boot 3.2 Closes gh-1643 --- ...adleBuildSystemHelpDocumentCustomizer.java | 13 +-- ...avenBuildSystemHelpDocumentCustomizer.java | 10 +- ...ctiveMQProjectGenerationConfiguration.java | 19 ---- ...ArtemisProjectGenerationConfiguration.java | 3 - .../flyway/FlywayBuildCustomizer.java | 40 +++---- .../FlywayProjectGenerationConfiguration.java | 5 +- .../GraalVmHelpDocumentCustomizer.java | 14 +-- .../ObservabilityHelpDocumentCustomizer.java | 11 +- ...gVectorProjectGenerationConfiguration.java | 29 +---- .../SpringIntegrationModuleRegistry.java | 18 +--- .../TestContainersHelpDocumentCustomizer.java | 16 +-- .../TestcontainersModuleRegistry.java | 36 +++---- ...vaVersionProjectDescriptionCustomizer.java | 2 - ...StartInitializrMetadataUpdateStrategy.java | 2 +- start-site/src/main/resources/application.yml | 101 +++++++----------- .../start/site/SupportedBootVersion.java | 58 ++++++++++ .../extension/AbstractExtensionTests.java | 15 ++- ...uildSystemHelpDocumentCustomizerTests.java | 25 +---- ...uildSystemHelpDocumentCustomizerTests.java | 23 +--- .../KotlinCoroutinesCustomizerTests.java | 3 +- ...MQProjectGenerationConfigurationTests.java | 10 +- ...isProjectGenerationConfigurationTests.java | 11 -- ...raProjectGenerationConfigurationTests.java | 4 +- .../dgs/DgsBuildCustomizerTests.java | 5 +- ...chProjectGenerationConfigurationTests.java | 4 +- .../flyway/FlywayBuildCustomizerTests.java | 38 +++---- .../GraalVmHelpDocumentCustomizerTests.java | 37 +------ ...VmProjectGenerationConfigurationTests.java | 7 +- .../htmx/HtmxBuildCustomizerTests.java | 7 +- .../MyBatisTestBuildCustomizerTests.java | 6 +- ...4jProjectGenerationConfigurationTests.java | 4 +- ...rvabilityActuatorBuildCustomizerTests.java | 8 +- ...ervabilityHelpDocumentCustomizerTests.java | 20 +--- .../okta/OktaHelpDocumentCustomizerTests.java | 6 +- ...leProjectGenerationConfigurationTests.java | 15 ++- ...orProjectGenerationConfigurationTests.java | 13 ++- ...ckProjectGenerationConfigurationTests.java | 7 +- .../SolaceBinderBuildCustomizerTests.java | 23 ++-- ...maProjectGenerationConfigurationTests.java | 7 +- ...seProjectGenerationConfigurationTests.java | 6 +- ...maProjectGenerationConfigurationTests.java | 7 +- ...ntProjectGenerationConfigurationTests.java | 7 +- ...rsProjectGenerationConfigurationTests.java | 6 +- ...teProjectGenerationConfigurationTests.java | 7 +- ...seProjectGenerationConfigurationTests.java | 9 +- ...reProjectGenerationConfigurationTests.java | 22 ++-- ...rsProjectGenerationConfigurationTests.java | 7 +- ...otProjectGenerationConfigurationTests.java | 9 +- ...oudCircuitBreakerBuildCustomizerTests.java | 4 - ...SpringCloudContractConfigurationTests.java | 6 -- ...oudContractGradleBuildCustomizerTests.java | 8 -- ...loudContractMavenBuildCustomizerTests.java | 6 -- ...ringCloudFunctionBuildCustomizerTests.java | 5 - ...udFunctionHelpDocumentCustomizerTests.java | 11 +- ...SpringCloudStreamBuildCustomizerTests.java | 10 -- ...onProjectGenerationConfigurationTests.java | 18 ++-- ...arProjectGenerationConfigurationTests.java | 17 ++- .../SpringShellTestBuildCustomizerTests.java | 5 +- ...rsProjectGenerationConfigurationTests.java | 94 ++++------------ .../VaadinMavenBuildCustomizerTests.java | 3 +- ...inProjectGenerationConfigurationTests.java | 19 ++-- ...JvmVersionHelpDocumentCustomizerTests.java | 10 +- ...sionProjectDescriptionCustomizerTests.java | 24 +++-- .../CacheableMavenVersionResolverTests.java | 12 ++- ...InitializrMetadataUpdateStrategyTests.java | 8 +- .../resources/compose/activemq-classic.yaml | 5 - .../src/test/resources/compose/activemq.yaml | 2 +- .../metadata/springio/spring-boot.json | 51 +++++---- 68 files changed, 418 insertions(+), 655 deletions(-) create mode 100644 start-site/src/test/java/io/spring/start/site/SupportedBootVersion.java delete mode 100644 start-site/src/test/resources/compose/activemq-classic.yaml diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java index b645a5cb97..ecf0796c19 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java @@ -20,8 +20,6 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds reference links for Gradle. @@ -33,8 +31,6 @@ class GradleBuildSystemHelpDocumentCustomizer implements HelpDocumentCustomizer private static final String SPRING_BOOT_DOCS_URL = "https://docs.spring.io/spring-boot"; - private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); - private final Version springBootVersion; GradleBuildSystemHelpDocumentCustomizer(ProjectDescription description) { @@ -50,16 +46,11 @@ public void customize(HelpDocument document) { document.gettingStarted() .addReferenceDocLink(generateReferenceGuideUrl(), "Spring Boot Gradle Plugin Reference Guide"); document.gettingStarted() - .addReferenceDocLink( - String - .format(generateReferenceGuideUrl() + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) - ? "/packaging-oci-image.html" : "#build-image"), this.springBootVersion), - "Create an OCI image"); + .addReferenceDocLink(generateReferenceGuideUrl() + "/packaging-oci-image.html", "Create an OCI image"); } private String generateReferenceGuideUrl() { - String baseUrlFormat = SPRING_BOOT_DOCS_URL + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) - ? "/%s/gradle-plugin" : "/docs/%s/gradle-plugin/reference/html/"); + String baseUrlFormat = SPRING_BOOT_DOCS_URL + "/%s/gradle-plugin"; return baseUrlFormat.formatted(this.springBootVersion); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java index e4fe3d8d71..92171bec00 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java @@ -20,8 +20,6 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds reference links for Apache Maven. @@ -33,8 +31,6 @@ class MavenBuildSystemHelpDocumentCustomizer implements HelpDocumentCustomizer { private static final String SPRING_BOOT_DOCS_URL = "https://docs.spring.io/spring-boot"; - private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); - private final Version springBootVersion; MavenBuildSystemHelpDocumentCustomizer(ProjectDescription description) { @@ -47,14 +43,12 @@ public void customize(HelpDocument document) { .addReferenceDocLink("https://maven.apache.org/guides/index.html", "Official Apache Maven documentation"); String referenceGuideUrl = generateReferenceGuideUrl(); document.gettingStarted().addReferenceDocLink(referenceGuideUrl, "Spring Boot Maven Plugin Reference Guide"); - String buildImageSection = referenceGuideUrl - + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) ? "/build-image.html" : "#build-image"); + String buildImageSection = referenceGuideUrl + "/build-image.html"; document.gettingStarted().addReferenceDocLink(buildImageSection, "Create an OCI image"); } private String generateReferenceGuideUrl() { - String baseUrlFormat = SPRING_BOOT_DOCS_URL + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) - ? "/%s/maven-plugin" : "/docs/%s/maven-plugin/reference/html/"); + String baseUrlFormat = SPRING_BOOT_DOCS_URL + "/%s/maven-plugin"; return baseUrlFormat.formatted(this.springBootVersion); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java index ac72684c88..cf9f686645 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfiguration.java @@ -16,7 +16,6 @@ package io.spring.start.site.extension.dependency.activemq; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.start.site.container.ComposeFileCustomizer; @@ -38,15 +37,6 @@ public class ActiveMQProjectGenerationConfiguration { private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.activemq.ActiveMQContainer"; @Bean - @ConditionalOnPlatformVersion("[3.2.0,3.3.0-M2)") - @ConditionalOnRequestedDependency("testcontainers") - ServiceConnectionsCustomizer activeMQServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { - return (serviceConnections) -> serviceResolver.doWith("activeMQ", (service) -> serviceConnections - .addServiceConnection(ServiceConnection.ofGenericContainer("activeMQ", service, "symptoma/activemq"))); - } - - @Bean - @ConditionalOnPlatformVersion("3.3.0-M2") @ConditionalOnRequestedDependency("testcontainers") ServiceConnectionsCustomizer activeMQClassicServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { return (serviceConnections) -> serviceResolver.doWith("activeMQClassic", @@ -55,15 +45,6 @@ ServiceConnectionsCustomizer activeMQClassicServiceConnectionsCustomizer(DockerS } @Bean - @ConditionalOnPlatformVersion("[3.2.0,3.3.0-M2)") - @ConditionalOnRequestedDependency("docker-compose") - ComposeFileCustomizer activeMQComposeFileCustomizer(DockerServiceResolver serviceResolver) { - return (composeFile) -> serviceResolver.doWith("activeMQ", - (service) -> composeFile.services().add("activemq", service)); - } - - @Bean - @ConditionalOnPlatformVersion("3.3.0-M2") @ConditionalOnRequestedDependency("docker-compose") ComposeFileCustomizer activeMQClassicComposeFileCustomizer(DockerServiceResolver serviceResolver) { return (composeFile) -> serviceResolver.doWith("activeMQClassic", diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfiguration.java index d3e21c771d..42c46e53d9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfiguration.java @@ -16,7 +16,6 @@ package io.spring.start.site.extension.dependency.activemq; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.start.site.container.ComposeFileCustomizer; @@ -38,7 +37,6 @@ public class ArtemisProjectGenerationConfiguration { private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.activemq.ArtemisContainer"; @Bean - @ConditionalOnPlatformVersion("3.3.0-M2") @ConditionalOnRequestedDependency("testcontainers") ServiceConnectionsCustomizer artemisServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { return (serviceConnections) -> serviceResolver.doWith("artemis", (service) -> serviceConnections @@ -46,7 +44,6 @@ ServiceConnectionsCustomizer artemisServiceConnectionsCustomizer(DockerServiceRe } @Bean - @ConditionalOnPlatformVersion("3.3.0-M2") @ConditionalOnRequestedDependency("docker-compose") ComposeFileCustomizer artemisComposeFileCustomizer(DockerServiceResolver serviceResolver) { return (composeFile) -> serviceResolver.doWith("artemis", diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java index cd6a14f26c..9f61351ae6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizer.java @@ -19,10 +19,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.DependencyContainer; import io.spring.initializr.generator.buildsystem.DependencyScope; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * Determine the appropriate Flyway dependency according to the database. @@ -33,14 +30,6 @@ */ class FlywayBuildCustomizer implements BuildCustomizer { - private static final VersionRange SPRING_BOOT_3_3_M3_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0-M3"); - - private final boolean isSpringBoot33OrLater; - - FlywayBuildCustomizer(ProjectDescription projectDescription) { - this.isSpringBoot33OrLater = SPRING_BOOT_3_3_M3_OR_LATER.match(projectDescription.getPlatformVersion()); - } - @Override public void customize(Build build) { DependencyContainer dependencies = build.dependencies(); @@ -53,22 +42,19 @@ public void customize(Build build) { if (dependencies.has("oracle")) { dependencies.add("flyway-oracle", "org.flywaydb", "flyway-database-oracle", DependencyScope.COMPILE); } - if (this.isSpringBoot33OrLater) { - if (dependencies.has("db2")) { - dependencies.add("flyway-database-db2", "org.flywaydb", "flyway-database-db2", DependencyScope.COMPILE); - } - if (dependencies.has("derby")) { - dependencies.add("flyway-database-derby", "org.flywaydb", "flyway-database-derby", - DependencyScope.COMPILE); - } - if (dependencies.has("hsql")) { - dependencies.add("flyway-database-hsqldb", "org.flywaydb", "flyway-database-hsqldb", - DependencyScope.COMPILE); - } - if (dependencies.has("postgresql")) { - dependencies.add("flyway-database-postgresql", "org.flywaydb", "flyway-database-postgresql", - DependencyScope.COMPILE); - } + if (dependencies.has("db2")) { + dependencies.add("flyway-database-db2", "org.flywaydb", "flyway-database-db2", DependencyScope.COMPILE); + } + if (dependencies.has("derby")) { + dependencies.add("flyway-database-derby", "org.flywaydb", "flyway-database-derby", DependencyScope.COMPILE); + } + if (dependencies.has("hsql")) { + dependencies.add("flyway-database-hsqldb", "org.flywaydb", "flyway-database-hsqldb", + DependencyScope.COMPILE); + } + if (dependencies.has("postgresql")) { + dependencies.add("flyway-database-postgresql", "org.flywaydb", "flyway-database-postgresql", + DependencyScope.COMPILE); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java index 0b4a59d389..848f1caf92 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/flyway/FlywayProjectGenerationConfiguration.java @@ -17,7 +17,6 @@ package io.spring.start.site.extension.dependency.flyway; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -37,8 +36,8 @@ FlywayProjectContributor flywayProjectContributor() { } @Bean - FlywayBuildCustomizer flywayBuildCustomizer(ProjectDescription projectDescription) { - return new FlywayBuildCustomizer(projectDescription); + FlywayBuildCustomizer flywayBuildCustomizer() { + return new FlywayBuildCustomizer(); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java index 9a962a914f..2cf9cf2c30 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java @@ -28,8 +28,6 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; @@ -40,8 +38,6 @@ */ class GraalVmHelpDocumentCustomizer implements HelpDocumentCustomizer { - private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); - private final InitializrMetadata metadata; private final ProjectDescription description; @@ -60,16 +56,12 @@ class GraalVmHelpDocumentCustomizer implements HelpDocumentCustomizer { @Override public void customize(HelpDocument document) { document.gettingStarted() - .addReferenceDocLink(String.format(SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion) - ? "https://docs.spring.io/spring-boot/%s/reference/packaging/native-image/introducing-graalvm-native-images.html" - : "https://docs.spring.io/spring-boot/docs/%s/reference/html/native-image.html#native-image", + .addReferenceDocLink(String.format( + "https://docs.spring.io/spring-boot/%s/reference/packaging/native-image/introducing-graalvm-native-images.html", this.platformVersion), "GraalVM Native Image Support"); boolean mavenBuild = this.build instanceof MavenBuild; boolean gradleBuild = this.build instanceof GradleBuild; - String url = SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion) - ? String.format("https://docs.spring.io/spring-boot/%s/how-to/aot.html", this.platformVersion) - : String.format("https://docs.spring.io/spring-boot/docs/%s/%s/reference/htmlsingle/#aot", - this.platformVersion, (mavenBuild) ? "maven-plugin" : "gradle-plugin"); + String url = String.format("https://docs.spring.io/spring-boot/%s/how-to/aot.html", this.platformVersion); document.gettingStarted().addAdditionalLink(url, "Configure AOT settings in Build Plugin"); Map model = new HashMap<>(); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java index 0b82d7e30b..e772756e22 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java @@ -21,8 +21,6 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; /** * {@link HelpDocumentCustomizer} implementation for Observability. @@ -31,8 +29,6 @@ */ public class ObservabilityHelpDocumentCustomizer implements HelpDocumentCustomizer { - private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); - private final Version platformVersion; private final Build build; @@ -49,11 +45,8 @@ public void customize(HelpDocument document) { .addReferenceDocLink("https://docs.micrometer.io/tracing/reference/index.html", "Distributed Tracing Reference Guide"); document.gettingStarted() - .addReferenceDocLink(String.format(SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion) - ? "https://docs.spring.io/spring-boot/%s/reference/actuator/tracing.html" - : "https://docs.spring.io/spring-boot/docs/%s/reference/html/actuator.html#actuator.micrometer-tracing.getting-started", - this.platformVersion), "Getting Started with Distributed Tracing"); - + .addReferenceDocLink("https://docs.spring.io/spring-boot/%s/reference/actuator/tracing.html" + .formatted(this.platformVersion), "Getting Started with Distributed Tracing"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java index a8efc0a4a6..261e8521de 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfiguration.java @@ -16,14 +16,7 @@ package io.spring.start.site.extension.dependency.postgresql; -import java.util.Map; - import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; -import io.spring.initializr.versionresolver.MavenVersionResolver; import io.spring.start.site.container.ComposeFileCustomizer; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections.ServiceConnection; @@ -44,29 +37,11 @@ class PgVectorProjectGenerationConfiguration { private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.containers.PostgreSQLContainer"; - private static final VersionRange TESTCONTAINERS_1_19_7_OR_LATER = VersionParser.DEFAULT.parseRange("1.19.7"); - - private final MavenVersionResolver versionResolver; - - private final ProjectDescription description; - - PgVectorProjectGenerationConfiguration(MavenVersionResolver versionResolver, ProjectDescription description) { - this.versionResolver = versionResolver; - this.description = description; - } - @Bean @ConditionalOnRequestedDependency("testcontainers") ServiceConnectionsCustomizer pgvectorServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { - Map resolve = this.versionResolver.resolveDependencies("org.springframework.boot", - "spring-boot-dependencies", this.description.getPlatformVersion().toString()); - String testcontainersVersion = resolve.get("org.testcontainers:testcontainers"); - return (serviceConnections) -> { - if (TESTCONTAINERS_1_19_7_OR_LATER.match(Version.parse(testcontainersVersion))) { - serviceResolver.doWith("pgvector", (service) -> serviceConnections.addServiceConnection( - ServiceConnection.ofContainer("pgvector", service, TESTCONTAINERS_CLASS_NAME))); - } - }; + return (serviceConnections) -> serviceResolver.doWith("pgvector", (service) -> serviceConnections + .addServiceConnection(ServiceConnection.ofContainer("pgvector", service, TESTCONTAINERS_CLASS_NAME))); } @Bean diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java index 054f959d39..de0ec93505 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationModuleRegistry.java @@ -25,8 +25,6 @@ import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependency.Builder; @@ -40,8 +38,6 @@ */ abstract class SpringIntegrationModuleRegistry { - private static final VersionRange SPRING_BOOT_3_3_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); - static Iterable create(Version platformVersion) { List builders = new ArrayList<>(); builders.add(onDependencies("activemq", "artemis").customizeBuild(addDependency("jms")) @@ -66,16 +62,10 @@ static Iterable create(Version platformVersion) { .customizeHelpDocument(addReferenceLink("Mail Module", "mail"))); builders.add(onDependencies("rsocket").customizeBuild(addDependency("rsocket")) .customizeHelpDocument(addReferenceLink("RSocket Module", "rsocket"))); - if (SPRING_BOOT_3_3_OR_LATER.match(platformVersion)) { - builders.add(onDependencies("security") - .customizeBuild(addDependency("spring-security-messaging", "org.springframework.security", - "spring-security-messaging", DependencyScope.COMPILE)) - .customizeHelpDocument(addReferenceLink("Security Module", "security"))); - } - else { - builders.add(onDependencies("security").customizeBuild(addDependency("security")) - .customizeHelpDocument(addReferenceLink("Security Module", "security"))); - } + builders.add(onDependencies("security") + .customizeBuild(addDependency("spring-security-messaging", "org.springframework.security", + "spring-security-messaging", DependencyScope.COMPILE)) + .customizeHelpDocument(addReferenceLink("Security Module", "security"))); builders.add(onDependencies("web").customizeBuild(addDependency("http")) .customizeHelpDocument(addReferenceLink("HTTP Module", "http"))); builders.add(onDependencies("webflux").customizeBuild(addDependency("webflux")) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java index cbe847d9f0..eee58ec883 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java @@ -23,8 +23,6 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.container.DockerService; import io.spring.start.site.container.ServiceConnections; import io.spring.start.site.container.ServiceConnections.ServiceConnection; @@ -37,8 +35,6 @@ */ class TestContainersHelpDocumentCustomizer implements HelpDocumentCustomizer { - private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); - private final ProjectDescription description; private final ServiceConnections serviceConnections; @@ -50,9 +46,7 @@ class TestContainersHelpDocumentCustomizer implements HelpDocumentCustomizer { @Override public void customize(HelpDocument document) { - String referenceDocUrl = (SPRING_BOOT_3_3_0_OR_LATER.match(this.description.getPlatformVersion()) - ? "https://docs.spring.io/spring-boot/%s/reference/testing/testcontainers.html#testing.testcontainers" - : "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers") + String referenceDocUrl = "https://docs.spring.io/spring-boot/%s/reference/testing/testcontainers.html#testing.testcontainers" .formatted(this.description.getPlatformVersion()); document.gettingStarted().addReferenceDocLink(referenceDocUrl, "Spring Boot Testcontainers support"); Map model = new HashMap<>(); @@ -60,11 +54,9 @@ public void customize(HelpDocument document) { .map(ServiceConnection::dockerService) .toList(); model.put("services", dockerServices); - model.put("testcontainersAtDevelopmentTimeLink", (SPRING_BOOT_3_3_0_OR_LATER - .match(this.description.getPlatformVersion()) - ? "https://docs.spring.io/spring-boot/%s/reference/features/dev-services.html#features.dev-services.testcontainers" - : "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers.at-development-time") - .formatted(this.description.getPlatformVersion())); + model.put("testcontainersAtDevelopmentTimeLink", + "https://docs.spring.io/spring-boot/%s/reference/features/dev-services.html#features.dev-services.testcontainers" + .formatted(this.description.getPlatformVersion())); document.addSection("testcontainers", model); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index f3f694d048..858ed5206b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -25,8 +25,6 @@ import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.version.Version; -import io.spring.initializr.generator.version.VersionParser; -import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependency.Builder; @@ -39,16 +37,12 @@ */ abstract class TestcontainersModuleRegistry { - private static final VersionRange SPRING_BOOT_3_3_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); - static Iterable create(Version platformVersion) { List builders = new ArrayList<>(); - if (SPRING_BOOT_3_3_OR_LATER.match(platformVersion)) { - builders.add(onDependencies("activemq").customizeBuild(addModule("activemq")) - .customizeHelpDocument(addReferenceLink("ActiveMQ Module", "activemq/"))); - builders.add(onDependencies("artemis").customizeBuild(addModule("activemq")) - .customizeHelpDocument(addReferenceLink("ActiveMQ Module", "activemq/"))); - } + builders.add(onDependencies("activemq").customizeBuild(addModule("activemq")) + .customizeHelpDocument(addReferenceLink("ActiveMQ Module", "activemq/"))); + builders.add(onDependencies("artemis").customizeBuild(addModule("activemq")) + .customizeHelpDocument(addReferenceLink("ActiveMQ Module", "activemq/"))); builders.add(onDependencies("amqp", "amqp-streams").customizeBuild(addModule("rabbitmq")) .customizeHelpDocument(addReferenceLink("RabbitMQ Module", "rabbitmq/"))); builders.add(onDependencies("cloud-gcp", "cloud-gcp-pubsub").customizeBuild(addModule("gcloud")) @@ -89,18 +83,16 @@ static Iterable create(Version platformVersion) { .customizeHelpDocument(addReferenceLink("Solace Module", "solace/"))); builders.add(onDependencies("sqlserver").customizeBuild(addModule("mssqlserver")) .customizeHelpDocument(addReferenceLink("MS SQL Server Module", "databases/mssqlserver/"))); - if (SPRING_BOOT_3_3_OR_LATER.match(platformVersion)) { - builders.add(onDependencies("spring-ai-vectordb-chroma").customizeBuild(addModule("chromadb")) - .customizeHelpDocument(addReferenceLink("Chroma Module", "testcontainers/"))); - builders.add(onDependencies("spring-ai-vectordb-milvus").customizeBuild(addModule("milvus")) - .customizeHelpDocument(addReferenceLink("Milvus Module", "testcontainers/"))); - builders.add(onDependencies("spring-ai-ollama").customizeBuild(addModule("ollama")) - .customizeHelpDocument(addReferenceLink("Ollama Module", "testcontainers/"))); - builders.add(onDependencies("spring-ai-vectordb-qdrant").customizeBuild(addModule("qdrant")) - .customizeHelpDocument(addReferenceLink("Qdrant Module", "testcontainers/"))); - builders.add(onDependencies("spring-ai-vectordb-weaviate").customizeBuild(addModule("weaviate")) - .customizeHelpDocument(addReferenceLink("Weaviate Module", "testcontainers/"))); - } + builders.add(onDependencies("spring-ai-vectordb-chroma").customizeBuild(addModule("chromadb")) + .customizeHelpDocument(addReferenceLink("Chroma Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-vectordb-milvus").customizeBuild(addModule("milvus")) + .customizeHelpDocument(addReferenceLink("Milvus Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-ollama").customizeBuild(addModule("ollama")) + .customizeHelpDocument(addReferenceLink("Ollama Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-vectordb-qdrant").customizeBuild(addModule("qdrant")) + .customizeHelpDocument(addReferenceLink("Qdrant Module", "testcontainers/"))); + builders.add(onDependencies("spring-ai-vectordb-weaviate").customizeBuild(addModule("weaviate")) + .customizeHelpDocument(addReferenceLink("Weaviate Module", "testcontainers/"))); return builders.stream().map(Builder::build).toList(); } diff --git a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java index b238e51822..cfa3104577 100644 --- a/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizer.java @@ -23,7 +23,6 @@ import io.spring.initializr.generator.language.kotlin.KotlinLanguage; import io.spring.initializr.generator.project.MutableProjectDescription; import io.spring.initializr.generator.project.ProjectDescriptionCustomizer; -import io.spring.initializr.generator.version.Version; /** * Validate that the requested java version is compatible with the chosen Spring Boot @@ -39,7 +38,6 @@ public class JavaVersionProjectDescriptionCustomizer implements ProjectDescripti @Override public void customize(MutableProjectDescription description) { - Version platformVersion = description.getPlatformVersion(); String javaVersion = description.getLanguage().jvmVersion(); if (UNSUPPORTED_VERSIONS.contains(javaVersion)) { updateTo(description, "17"); diff --git a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java index c3f6763d08..9d56aa50c1 100644 --- a/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java +++ b/start-site/src/main/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategy.java @@ -36,7 +36,7 @@ */ public class StartInitializrMetadataUpdateStrategy extends SpringIoInitializrMetadataUpdateStrategy { - private static final Version MINIMUM_BOOT_VERSION = Version.parse("3.2.0"); + private static final Version MINIMUM_BOOT_VERSION = Version.parse("3.3.0"); public StartInitializrMetadataUpdateStrategy(RestTemplate restTemplate, ObjectMapper objectMapper) { super(restTemplate, objectMapper); diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index aea2dfc4f2..0e27ed0a29 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -46,8 +46,6 @@ initializr: artifactId: spring-boot-admin-dependencies versionProperty: spring-boot-admin.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 3.2.3 - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 3.3.5 netflix-dgs: @@ -55,8 +53,6 @@ initializr: artifactId: graphql-dgs-platform-dependencies versionProperty: netflix-dgs.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 8.7.1 - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 9.1.3 sentry: @@ -64,22 +60,20 @@ initializr: artifactId: sentry-bom versionProperty: sentry.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" + - compatibilityRange: "[3.3.0,3.3.0-M1)" version: 7.14.0 solace-spring-boot: groupId: com.solace.spring.boot artifactId: solace-spring-boot-bom versionProperty: solace-spring-boot.version mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 2.2.0 solace-spring-cloud: groupId: com.solace.spring.cloud artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 4.1.0 - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 4.5.0 spring-ai: @@ -87,7 +81,7 @@ initializr: artifactId: spring-ai-bom versionProperty: spring-ai.version mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 1.0.0-M4 repositories: spring-milestones spring-cloud: @@ -96,9 +90,9 @@ initializr: versionProperty: spring-cloud.version order: 50 mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 2023.0.3 - - compatibilityRange: "[3.4.0-M1,3.5.0-M1)" + - compatibilityRange: "[3.4.0,3.5.0-M1)" version: 2024.0.0-RC1 repositories: spring-milestones spring-cloud-azure: @@ -106,7 +100,7 @@ initializr: artifactId: spring-cloud-azure-dependencies versionProperty: spring-cloud-azure.version mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 5.18.0 spring-cloud-gcp: groupId: com.google.cloud @@ -114,7 +108,7 @@ initializr: versionProperty: spring-cloud-gcp.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 5.8.0 spring-cloud-services: groupId: io.pivotal.spring.cloud @@ -122,18 +116,16 @@ initializr: versionProperty: spring-cloud-services.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 4.1.5 spring-modulith: groupId: org.springframework.modulith artifactId: spring-modulith-bom versionProperty: spring-modulith.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 1.1.9 - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 1.2.4 - - compatibilityRange: "[3.4.0-M1,3.5.0-M1)" + - compatibilityRange: "[3.4.0,3.5.0-M1)" version: 1.3.0-M3 repositories: spring-milestones spring-shell: @@ -141,8 +133,6 @@ initializr: artifactId: spring-shell-dependencies versionProperty: spring-shell.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 3.2.8 - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 3.3.3 timefold-solver: @@ -150,19 +140,17 @@ initializr: artifactId: timefold-solver-bom versionProperty: timefold-solver.version mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 1.16.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom versionProperty: vaadin.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 24.4.17 - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 24.5.5 platform: - compatibilityRange: "3.2.0" + compatibilityRange: "3.3.0" dependencies: - name: Developer Tools content: @@ -219,7 +207,7 @@ initializr: - name: Spring Modulith id: modulith bom: spring-modulith - compatibilityRange: "[3.2.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" group-id: org.springframework.modulith artifact-id: spring-modulith-starter-core description: Support for building modular monolithic applications. @@ -337,7 +325,7 @@ initializr: artifactId: vaadin-spring-boot-starter description: The full-stack web app platform for Spring. Build views fully in Java with Flow, or in React using Hilla. bom: vaadin - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" links: - rel: guide href: https://spring.io/guides/gs/crud-with-vaadin/ @@ -349,7 +337,7 @@ initializr: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-spring-graphql-starter description: Build GraphQL applications with Netflix DGS and Spring for GraphQL. - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" bom: netflix-dgs links: - rel: reference @@ -361,7 +349,7 @@ initializr: groupId: io.github.wimdeblauwe artifactId: htmx-spring-boot description: Build modern user interfaces with the simplicity and power of hypertext. - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" version: 3.5.0 links: - rel: reference @@ -452,12 +440,12 @@ initializr: href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.ldap - name: Okta id: okta - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" description: Okta specific configuration for Spring Security/Spring Boot OAuth2 features. Enable your Spring Boot application to work with Okta via OAuth 2.0/OIDC. groupId: com.okta.spring artifactId: okta-spring-boot-starter mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 3.0.7 links: - rel: guide @@ -524,12 +512,12 @@ initializr: description: R2DBC Homepage - name: MyBatis Framework id: mybatis - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" description: Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. groupId: org.mybatis.spring.boot artifactId: mybatis-spring-boot-starter mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 3.0.3 links: - rel: guide @@ -826,9 +814,9 @@ initializr: href: https://rsocket.io/ - name: Apache Camel id: camel - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" mappings: - - compatibilityRange: "[3.2.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 4.8.1 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot @@ -840,7 +828,7 @@ initializr: - name: Solace PubSub+ bom: solace-spring-boot id: solace - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" description: Connect to a Solace PubSub+ Advanced Event Broker to publish, subscribe, request/reply and store/replay messages groupId: com.solace.spring.boot artifactId: solace-spring-boot-starter @@ -895,7 +883,7 @@ initializr: id: spring-shell groupId: org.springframework.shell artifactId: spring-shell-starter - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" description: Build command line applications with spring. bom: spring-shell links: @@ -918,7 +906,6 @@ initializr: groupId: org.springframework.boot artifactId: spring-boot starter: false - compatibilityRange: "3.3.0" links: - rel: reference href: https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/endpoints.html#actuator.endpoints.sbom @@ -927,7 +914,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-client description: Required for your application to register with a Codecentric's Spring Boot Admin Server instance. - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -937,7 +924,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-server description: A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints. - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -946,7 +933,7 @@ initializr: id: sentry bom: sentry description: Application performance monitoring and error tracking that help software teams see clearer, solve quicker, and learn continuously. - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.3.0,3.3.0-M1)" groupId: io.sentry artifactId: sentry-spring-boot-starter-jakarta links: @@ -1069,7 +1056,7 @@ initializr: href: https://java.testcontainers.org/ - name: Contract Verifier bom: spring-cloud - compatibilityRange: "[3.2.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" id: cloud-contract-verifier description: Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development. groupId: org.springframework.cloud @@ -1080,7 +1067,7 @@ initializr: href: https://docs.spring.io/spring-cloud-contract/reference/ - name: Contract Stub Runner bom: spring-cloud - compatibilityRange: "[3.2.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" id: cloud-contract-stub-runner description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests. groupId: org.springframework.cloud @@ -1101,7 +1088,7 @@ initializr: href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.ldap.embedded - name: Spring Cloud bom: spring-cloud - compatibilityRange: "[3.2.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Cloud Bootstrap id: cloud-starter @@ -1133,7 +1120,7 @@ initializr: href: https://docs.spring.io/spring-cloud-task/reference/ - name: Spring Cloud Config bom: spring-cloud - compatibilityRange: "[3.2.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Config Client id: cloud-config-client @@ -1180,7 +1167,7 @@ initializr: href: https://docs.spring.io/spring-cloud-consul/reference/ - name: Spring Cloud Discovery bom: spring-cloud - compatibilityRange: "[3.2.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Eureka Discovery Client id: cloud-eureka @@ -1222,7 +1209,7 @@ initializr: href: https://docs.spring.io/spring-cloud-consul/reference/discovery.html - name: Spring Cloud Routing bom: spring-cloud - compatibilityRange: "[3.2.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Gateway id: cloud-gateway @@ -1269,7 +1256,7 @@ initializr: href: https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html - name: Spring Cloud Circuit Breaker bom: spring-cloud - compatibilityRange: "[3.2.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Resilience4J id: cloud-resilience4j @@ -1281,7 +1268,7 @@ initializr: href: https://docs.spring.io/spring-cloud-circuitbreaker/reference/spring-cloud-circuitbreaker-resilience4j.html - name: Spring Cloud Messaging bom: spring-cloud - compatibilityRange: "[3.2.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Cloud Bus id: cloud-bus @@ -1301,7 +1288,7 @@ initializr: href: https://docs.spring.io/spring-cloud-stream/reference/ - name: VMware Tanzu Application Service bom: spring-cloud-services - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" content: - name: Config Client (TAS) id: scs-config-client @@ -1321,7 +1308,7 @@ initializr: href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - name: Microsoft Azure bom: spring-cloud-azure - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" content: - name: Azure Support id: azure-support @@ -1399,7 +1386,7 @@ initializr: description: Azure Storage Sample - name: Google Cloud bom: spring-cloud-gcp - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" content: - name: Google Cloud Support id: cloud-gcp @@ -1434,7 +1421,7 @@ initializr: - rel: guide href: https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample - name: AI - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" content: - name: Anthropic Claude id: spring-ai-anthropic @@ -1732,7 +1719,7 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_pdf_page - name: Timefold Solver id: timefold-solver - compatibilityRange: "[3.2.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.4.0-M1)" groupId: ai.timefold.solver artifactId: timefold-solver-spring-boot-starter description: AI solver to optimize operations and scheduling. @@ -1811,18 +1798,12 @@ initializr: id: groovy default: false bootVersions: - - name: 3.3.1 (SNAPSHOT) - id: 3.3.1-SNAPSHOT + - name: 3.4.0 (SNAPSHOT) + id: 3.4.0-SNAPSHOT default: false - name: 3.3.0 id: 3.3.0 default: true - - name: 3.2.7 (SNAPSHOT) - id: 3.2.7-SNAPSHOT - default: false - - name: 3.2.6 - id: 3.2.6 - default: false --- diff --git a/start-site/src/test/java/io/spring/start/site/SupportedBootVersion.java b/start-site/src/test/java/io/spring/start/site/SupportedBootVersion.java new file mode 100644 index 0000000000..e94d47aec4 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/SupportedBootVersion.java @@ -0,0 +1,58 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site; + +/** + * Supported Spring Boot versions. + * + * @author Moritz Halbritter + */ +public enum SupportedBootVersion { + + /** + * 3.3.0. + */ + V3_3("3.3.0"), + /** + * 3.4.0. + */ + V3_4("3.4.0"); + + private final String version; + + SupportedBootVersion(String version) { + this.version = version; + } + + public String getVersion() { + return this.version; + } + + @Override + public String toString() { + return getVersion(); + } + + /** + * Returns the latest supported Spring Boot version. + * @return the latest supported Spring Boot version + */ + public static SupportedBootVersion latest() { + return V3_4; + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java b/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java index 0a9db9caf0..4bde99c710 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/AbstractExtensionTests.java @@ -33,6 +33,7 @@ import io.spring.initializr.web.project.ProjectGenerationResult; import io.spring.initializr.web.project.ProjectRequest; import io.spring.initializr.web.project.WebProjectRequest; +import io.spring.start.site.SupportedBootVersion; import org.assertj.core.api.AssertProvider; import org.springframework.beans.factory.annotation.Autowired; @@ -125,13 +126,25 @@ protected ProjectStructure generateProject(ProjectRequest request) { } /** - * Create a Maven-based {@link ProjectRequest} with the specified dependencies. + * Create a Maven-based {@link ProjectRequest} with the specified dependencies. Uses + * the latest supported Spring Boot version. * @param dependencies the dependency identifiers to add * @return a project request */ protected ProjectRequest createProjectRequest(String... dependencies) { + return createProjectRequest(SupportedBootVersion.latest(), dependencies); + } + + /** + * Create a Maven-based {@link ProjectRequest} with the specified dependencies. + * @param springBootVersion the Spring Boot version to use + * @param dependencies the dependency identifiers to add + * @return a project request + */ + protected ProjectRequest createProjectRequest(SupportedBootVersion springBootVersion, String... dependencies) { WebProjectRequest request = new WebProjectRequest(); request.initialize(this.metadataProvider.get()); + request.setBootVersion(springBootVersion.getVersion()); request.setType("maven-project"); request.getDependencies().addAll(Arrays.asList(dependencies)); return request; diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java index 7b95f58773..d9e2b3860a 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java @@ -32,37 +32,22 @@ */ class GradleBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests { - private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; - - private static final String SPRING_BOOT_VERSION = "3.3.0"; - @Test void linksAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", SPRING_BOOT_VERSION).contains( - "* [Official Gradle documentation](https://docs.gradle.org)", - "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.0/gradle-plugin)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/3.3.0/gradle-plugin/packaging-oci-image.html)"); - } - - @Test - void linksAddedToHelpDocumentForGradleBuildWithOldSpringBootVersion() { - assertHelpDocument("gradle-build", OLD_SPRING_BOOT_VERSION).contains( - "* [Official Gradle documentation](https://docs.gradle.org)", + assertHelpDocument("gradle-build").contains("* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.2.0/gradle-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.2.0/gradle-plugin/reference/html/#build-image)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.0/gradle-plugin)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.0/gradle-plugin/packaging-oci-image.html)"); } @Test void linksNotAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", SPRING_BOOT_VERSION).noneMatch((line) -> line.contains("Gradle")); + assertHelpDocument("maven-build").noneMatch((line) -> line.contains("Gradle")); } - private ListAssert assertHelpDocument(String type, String version) { + private ListAssert assertHelpDocument(String type) { ProjectRequest request = createProjectRequest("web"); request.setType(type); - request.setBootVersion(version); return assertThat(helpDocument(request)).lines(); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java index 147116d9b5..71a2df4b89 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java @@ -32,35 +32,22 @@ */ class MavenBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - - private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; - @Test void linksAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", SPRING_BOOT_VERSION).contains( - "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.0/maven-plugin)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/3.3.0/maven-plugin/build-image.html)"); - } - - @Test - void linksAddedToHelpDocumentForMavenBuildWithOldSpringBootVersion() { - assertHelpDocument("maven-build", OLD_SPRING_BOOT_VERSION).contains( + assertHelpDocument("maven-build").contains( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.2.0/maven-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.2.0/maven-plugin/reference/html/#build-image)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.0/maven-plugin)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.0/maven-plugin/build-image.html)"); } @Test void linksNotAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", SPRING_BOOT_VERSION).noneMatch((line) -> line.contains("Maven")); + assertHelpDocument("gradle-build").noneMatch((line) -> line.contains("Maven")); } - private ListAssert assertHelpDocument(String type, String version) { + private ListAssert assertHelpDocument(String type) { ProjectRequest request = createProjectRequest("web"); request.setType(type); - request.setBootVersion(version); return assertThat(helpDocument(request)).lines(); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java index cf126f3767..7e6c2d0381 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizerTests.java @@ -33,12 +33,11 @@ class KotlinCoroutinesCustomizerTests extends AbstractExtensionTests { @Test void kotlinCoroutinesIsAdded() { ProjectRequest request = createProjectRequest("webflux"); - request.setBootVersion("3.3.0"); request.setLanguage("kotlin"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("org.jetbrains.kotlinx", "kotlinx-coroutines-reactor"); assertThat(helpDocument(request)).contains( - "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring-framework/reference/6.1.8/languages/kotlin/coroutines.html)"); + "* [Coroutines section of the Spring Framework Documentation](https://docs.spring.io/spring-framework/reference/6.2.0/languages/kotlin/coroutines.html)"); } @Test diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java index 8297c5168f..931f06a201 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ActiveMQProjectGenerationConfigurationTests.java @@ -41,17 +41,9 @@ void dockerComposeWhenDockerComposeIsNotSelectedDoesNotCreateService() { } @Test - void dockerComposeCreatesAppropriateService() { + void dockerComposeCreatesAppropriateServiceWithVersion() { ProjectRequest request = createProjectRequest("docker-compose", "activemq"); - request.setBootVersion("3.2.0"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/activemq.yaml")); } - @Test - void dockerComposeCreatesAppropriateServiceWithVersion33() { - ProjectRequest request = createProjectRequest("docker-compose", "activemq"); - request.setBootVersion("3.3.0"); - assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/activemq-classic.yaml")); - } - } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java index 008255cedc..b8be8e84ea 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/activemq/ArtemisProjectGenerationConfigurationTests.java @@ -32,27 +32,16 @@ */ class ArtemisProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - @Test void dockerComposeWhenDockerComposeIsNotSelectedDoesNotCreateService() { ProjectRequest request = createProjectRequest("web", "artemis"); - request.setBootVersion(SPRING_BOOT_VERSION); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } - @Test - void dockerComposeWhenIncompatibleSpringBootVersionDoesNotCreateService() { - ProjectRequest request = createProjectRequest("docker-compose", "artemis"); - request.setBootVersion("3.2.0"); - assertThat(composeFile(request)).doesNotContain("artemis"); - } - @Test void dockerComposeCreatesAppropriateService() { ProjectRequest request = createProjectRequest("docker-compose", "artemis"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/artemis.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java index 88ca962b60..f6a1df5b48 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -54,7 +55,8 @@ void createsCassandraServiceWhenReactive() { @Test void createsCassandraServiceWhenSpringAiIsSelected() { - ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-cassandra"); + ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, "docker-compose", + "spring-ai-vectordb-cassandra"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/cassandra.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java index 0dd86da5b9..65b466e2d4 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -26,6 +27,8 @@ class DgsBuildCustomizerTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private Dependency dgsTest; @BeforeEach @@ -37,7 +40,7 @@ void setup() { @Test void shouldAddTestingDependency() { - ProjectRequest request = createProjectRequest("web", "netflix-dgs"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "netflix-dgs"); assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("web")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(this.dgsTest) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java index 7bd55b1a60..adabe1284d 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -48,7 +49,8 @@ void createsElasticsearchService() { @Test void createsElasticsearchServiceWhenSpringAiModuleIsSelected() { - ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-elasticsearch"); + ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, "docker-compose", + "spring-ai-vectordb-elasticsearch"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/elasticsearch.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java index 4fe4f80050..1bb1c66357 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/flyway/FlywayBuildCustomizerTests.java @@ -30,105 +30,93 @@ */ class FlywayBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION_3_2 = "3.2.0"; - - private static final String SPRING_BOOT_VERSION_3_3 = "3.3.0"; - @Test void mariadbOnly() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "mariadb"); + ProjectRequest projectRequest = createProject("mariadb"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mariadb")) .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); } @Test void mysqlOnly() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "mysql"); + ProjectRequest projectRequest = createProject("mysql"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mysql")) .doesNotHaveDependency("org.flywaydb", "flyway-mysql"); } @Test void sqlserverOnly() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "sqlserver"); + ProjectRequest projectRequest = createProject("sqlserver"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("sqlserver")) .doesNotHaveDependency("org.flywaydb", "flyway-sqlserver"); } @Test void oracleOnly() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "oracle"); + ProjectRequest projectRequest = createProject("oracle"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("oracle")) .doesNotHaveDependency("org.flywaydb", "flyway-database-oracle"); } @Test void mariadbAndFlyway() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "mariadb", "flyway"); + ProjectRequest projectRequest = createProject("mariadb", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mariadb")) .hasDependency("org.flywaydb", "flyway-mysql"); } @Test void mysqlAndFlyway() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "mysql", "flyway"); + ProjectRequest projectRequest = createProject("mysql", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("mysql")) .hasDependency("org.flywaydb", "flyway-mysql"); } @Test void sqlserverAndFlyway() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "sqlserver", "flyway"); + ProjectRequest projectRequest = createProject("sqlserver", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("sqlserver")) .hasDependency("org.flywaydb", "flyway-sqlserver"); } @Test void oracleAndFlyway() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "oracle", "flyway"); + ProjectRequest projectRequest = createProject("oracle", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("oracle")) .hasDependency("org.flywaydb", "flyway-database-oracle"); } - @Test - void db2AndFlywayOnSpringBoot32() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_2, "db2", "flyway"); - assertThat(mavenPom(projectRequest)).hasDependency(getDependency("db2")) - .doesNotHaveDependency("org.flywaydb", "flyway-database-db2"); - } - @Test void db2AndFlyway() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_3, "db2", "flyway"); + ProjectRequest projectRequest = createProject("db2", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("db2")) .hasDependency("org.flywaydb", "flyway-database-db2"); } @Test void derbyAndFlyway() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_3, "derby", "flyway"); + ProjectRequest projectRequest = createProject("derby", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("derby")) .hasDependency("org.flywaydb", "flyway-database-derby"); } @Test void hsqlAndFlyway() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_3, "hsql", "flyway"); + ProjectRequest projectRequest = createProject("hsql", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("hsql")) .hasDependency("org.flywaydb", "flyway-database-hsqldb"); } @Test void hsqlAndPostgres() { - ProjectRequest projectRequest = createProject(SPRING_BOOT_VERSION_3_3, "postgresql", "flyway"); + ProjectRequest projectRequest = createProject("postgresql", "flyway"); assertThat(mavenPom(projectRequest)).hasDependency(getDependency("postgresql")) .hasDependency("org.flywaydb", "flyway-database-postgresql"); } - private ProjectRequest createProject(String springBootVersion, String... styles) { + private ProjectRequest createProject(String... styles) { ProjectRequest projectRequest = createProjectRequest(styles); projectRequest.setLanguage("java"); - projectRequest.setBootVersion(springBootVersion); return projectRequest; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java index 5a52066e79..927c5793f9 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java @@ -26,6 +26,7 @@ import io.spring.initializr.generator.test.io.TextAssert; import io.spring.initializr.generator.version.Version; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -41,56 +42,28 @@ */ class GraalVmHelpDocumentCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - - private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; - @Autowired private MustacheTemplateRenderer templateRenderer; @Test void mavenBuildAddLinkToMavenAotPlugin() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); - HelpDocument document = customize(description, new MavenBuild()); - assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { - assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); - assertThat(link.getHref()).isEqualTo("https://docs.spring.io/spring-boot/3.3.0/how-to/aot.html"); - }); - } - - @Test - void mavenBuildAddLinkToMavenAotPluginWithOldSpringBootVersion() { - MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse(OLD_SPRING_BOOT_VERSION)); + description.setPlatformVersion(Version.parse(SupportedBootVersion.latest().getVersion())); HelpDocument document = customize(description, new MavenBuild()); assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); - assertThat(link.getHref()) - .isEqualTo("https://docs.spring.io/spring-boot/docs/3.2.0/maven-plugin/reference/htmlsingle/#aot"); + assertThat(link.getHref()).isEqualTo("https://docs.spring.io/spring-boot/3.4.0/how-to/aot.html"); }); } @Test void gradleBuildAddLinkToGradleAotPlugin() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); - HelpDocument document = customize(description, new GradleBuild()); - assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { - assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); - assertThat(link.getHref()).isEqualTo("https://docs.spring.io/spring-boot/3.3.0/how-to/aot.html"); - }); - } - - @Test - void gradleBuildAddLinkToGradleAotPluginWithOldSpringBootVersion() { - MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse(OLD_SPRING_BOOT_VERSION)); + description.setPlatformVersion(Version.parse(SupportedBootVersion.latest().getVersion())); HelpDocument document = customize(description, new GradleBuild()); assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); - assertThat(link.getHref()) - .isEqualTo("https://docs.spring.io/spring-boot/docs/3.2.0/gradle-plugin/reference/htmlsingle/#aot"); + assertThat(link.getHref()).isEqualTo("https://docs.spring.io/spring-boot/3.4.0/how-to/aot.html"); }); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index 535210101c..ce879c9198 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -20,6 +20,7 @@ import io.spring.initializr.generator.version.Version; import io.spring.initializr.versionresolver.MavenVersionResolver; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -34,8 +35,6 @@ */ class GraalVmProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - @Test void gradleBuildWithoutNativeDoesNotConfigureNativeBuildTools() { ProjectRequest request = createProjectRequest("web"); @@ -63,9 +62,8 @@ void mavenBuildConfigureNativeBuildtoolsPlugint() { @Test void gradleBuildConfigureNativeBuildToolsPlugin(@Autowired MavenVersionResolver mavenVersionResolver) { String nbtVersion = NativeBuildtoolsVersionResolver.resolve(mavenVersionResolver, - Version.parse(SPRING_BOOT_VERSION)); + Version.parse(SupportedBootVersion.latest().getVersion())); ProjectRequest request = createNativeProjectRequest(); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).hasPlugin("org.graalvm.buildtools.native", nbtVersion); } @@ -140,7 +138,6 @@ void groovyProjectDoesNotConfigureGraalVm() { private ProjectRequest createNativeProjectRequest(String... dependencies) { ProjectRequest projectRequest = createProjectRequest(dependencies); projectRequest.getDependencies().add(0, "native"); - projectRequest.setBootVersion(SPRING_BOOT_VERSION); return projectRequest; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java index ada2bc088d..33426cb95e 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -30,6 +31,8 @@ */ class HtmxBuildCustomizerTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private final Dependency htmx = Dependency.withId("htmx", "io.github.wimdeblauwe", "htmx-spring-boot"); private final Dependency htmxThymeleaf = Dependency.withId("htmx", "io.github.wimdeblauwe", @@ -37,14 +40,14 @@ class HtmxBuildCustomizerTests extends AbstractExtensionTests { @Test void shouldUseHtmxThymleafIfThymeleafIsSelected() { - ProjectRequest request = createProjectRequest("htmx", "thymeleaf"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "htmx", "thymeleaf"); assertThat(mavenPom(request)).doesNotHaveDependency(this.htmx.getGroupId(), this.htmx.getArtifactId()) .hasDependency(this.htmxThymeleaf); } @Test void shouldUsePlainHtmxIfThymeleafIsNotSelected() { - ProjectRequest request = createProjectRequest("htmx"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "htmx"); assertThat(mavenPom(request)) .doesNotHaveDependency(this.htmxThymeleaf.getGroupId(), this.htmxThymeleaf.getArtifactId()) .hasDependency(this.htmx); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java index c25c843f85..f253ebb021 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -30,12 +31,11 @@ */ class MyBatisTestBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; @Test void mybatisIsAddedWithSecurity() { - ProjectRequest request = createProjectRequest("mybatis"); - request.setBootVersion(SPRING_BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "mybatis"); assertThat(mavenPom(request)).hasDependency(mybatis()) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(mybatisTest()) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java index 46891f3d4a..05ca1a0f03 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -47,7 +48,8 @@ void createsNeo4jService() { @Test void createsNeo4jServiceWhenSpringAiModuleIsSelected() { - ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-neo4j"); + ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, "docker-compose", + "spring-ai-vectordb-neo4j"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/neo4j.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java index 6c3f6c9feb..eb8b1bde04 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityActuatorBuildCustomizerTests.java @@ -31,19 +31,15 @@ */ class ObservabilityActuatorBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - @ParameterizedTest @ValueSource(strings = { "datadog", "dynatrace", "influx", "graphite", "new-relic", "otlp-metrics", "prometheus", "distributed-tracing", "zipkin", "wavefront" }) void actuatorIsAddedWithObservabilityEntries(String dependency) { - assertThat(generateProject(SPRING_BOOT_VERSION, dependency)).mavenBuild() - .hasDependency(getDependency("actuator")); + assertThat(generateProject(dependency)).mavenBuild().hasDependency(getDependency("actuator")); } - private ProjectStructure generateProject(String bootVersion, String... dependencies) { + private ProjectStructure generateProject(String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(bootVersion); request.setType("maven-build"); return generateProject(request); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java index 44f9777fdb..b05a038960 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java @@ -30,33 +30,21 @@ */ class ObservabilityHelpDocumentCustomizerTests extends AbstractExtensionTests { - private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; - - private static final String SPRING_BOOT_VERSION = "3.3.0"; - @Test void linksAddedToHelpDocumentForGradleBuild() { - assertHelpDocument(SPRING_BOOT_VERSION, "distributed-tracing").contains( - "* [Distributed Tracing Reference Guide](https://docs.micrometer.io/tracing/reference/index.html)", - "* [Getting Started with Distributed Tracing](https://docs.spring.io/spring-boot/3.3.0/reference/actuator/tracing.html)"); - } - - @Test - void linksAddedToHelpDocumentForGradleBuildWithOldSpringBootVersion() { - assertHelpDocument(OLD_SPRING_BOOT_VERSION, "distributed-tracing").contains( + assertHelpDocument("distributed-tracing").contains( "* [Distributed Tracing Reference Guide](https://docs.micrometer.io/tracing/reference/index.html)", - "* [Getting Started with Distributed Tracing](https://docs.spring.io/spring-boot/docs/3.2.0/reference/html/actuator.html#actuator.micrometer-tracing.getting-started)"); + "* [Getting Started with Distributed Tracing](https://docs.spring.io/spring-boot/3.4.0/reference/actuator/tracing.html)"); } @Test void linksNotAddedToHelpDocumentForBuildWithoutTracing() { - assertHelpDocument(SPRING_BOOT_VERSION).noneMatch((line) -> line.contains("Tracing")); + assertHelpDocument().noneMatch((line) -> line.contains("Tracing")); } - private ListAssert assertHelpDocument(String version, String... dependencies) { + private ListAssert assertHelpDocument(String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); request.setType("gradle-build"); - request.setBootVersion(version); return assertThat(helpDocument(request)).lines(); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java index 145284c186..5b4c0bd2a0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.io.TextAssert; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -30,7 +31,7 @@ */ class OktaHelpDocumentCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; @Test void oktaSectionWithOktaDependencyIsPresent() { @@ -43,8 +44,7 @@ void oktaSectionWithoutOktaDependencyIsMissing() { } private TextAssert assertHelpDocument(String... dependencies) { - ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(SPRING_BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION, dependencies); return assertThat(helpDocument(request)); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java index 4ce6787f76..9a1bb34062 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -33,8 +34,6 @@ */ class OracleProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; - @Test void doesNotGenerateComposeYamlWithoutDockerCompose() { ProjectRequest request = createProjectRequest("web", "oracle"); @@ -43,23 +42,21 @@ void doesNotGenerateComposeYamlWithoutDockerCompose() { } @Test - void createsOracleFreeServiceWithBoot32() { + void createsOracleFreeService() { ProjectRequest request = createProjectRequest("docker-compose", "oracle"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle-free.yaml")); } @Test - void createsOracleFreeServiceWithBoot32AndSpringAi() { - ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-oracle"); - request.setBootVersion(SPRING_BOOT_VERSION); + void createsOracleFreeServiceSpringAi() { + ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, "docker-compose", + "spring-ai-vectordb-oracle"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle-free.yaml")); } @Test - void declaresOracleFreeContainerBeanWithBoot32() { + void declaresOracleFreeContainerBean() { ProjectRequest request = createProjectRequest("testcontainers", "oracle"); - request.setBootVersion(SPRING_BOOT_VERSION); request.setLanguage("java"); assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") .contains("import org.testcontainers.oracle.OracleContainer;") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java index a8f8be1041..37ac410633 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -33,27 +34,25 @@ */ class PgVectorProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String BOOT_VERSION = "3.2.6"; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; @Test void doesNothingWithoutDockerCompose() { - ProjectRequest request = createProjectRequest("web", "spring-ai-vectordb-pgvector"); - request.setBootVersion(BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "spring-ai-vectordb-pgvector"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @Test void createsPostgresService() { - ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-pgvector"); - request.setBootVersion(BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-vectordb-pgvector"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pgvector.yaml")); } @Test void shouldOnlyHavePgVectorIfPostgresAndPgVectorIsSelected() { - ProjectRequest request = createProjectRequest("docker-compose", "postgresql", "spring-ai-vectordb-pgvector"); - request.setBootVersion(BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "postgresql", + "spring-ai-vectordb-pgvector"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pgvector.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java index 44a283445c..826253c519 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -32,16 +33,18 @@ */ class RedisStackProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @Test void doesNothingWithoutDockerCompose() { - ProjectRequest request = createProjectRequest("spring-ai-vectordb-redis"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "spring-ai-vectordb-redis"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @Test void createsRedisStackService() { - ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-redis"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-vectordb-redis"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/redis-stack.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java index 6179c263dd..5502381cc0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java @@ -19,6 +19,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -31,20 +32,18 @@ */ class SolaceBinderBuildCustomizerTests extends AbstractExtensionTests { - private static final String BOOT_VERSION = "3.2.6"; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; @Test void binderNotAddedWhenSolaceNotSelected() { ProjectRequest request = createProjectRequest("cloud-stream"); - request.setBootVersion(BOOT_VERSION); ProjectStructure project = generateProject(request); assertNoBinder(project); } @Test void binderNotAddedWhenCloudStreamNotSelected() { - ProjectRequest request = createProjectRequest("solace"); - request.setBootVersion(BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "solace"); ProjectStructure project = generateProject(request); assertNoBinder(project); assertThat(project).mavenBuild().hasDependency(getDependency("solace")); @@ -52,16 +51,14 @@ void binderNotAddedWhenCloudStreamNotSelected() { @Test void binderAddedWhenSolaceAndCloudStreamSelected() { - ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion(BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "solace", "cloud-stream"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("com.solace.spring.cloud", "spring-cloud-starter-stream-solace"); } @Test void bomAddedWhenSolaceAndCloudStreamSelected() { - ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion(BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "solace", "cloud-stream"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasBom("com.solace.spring.cloud", "solace-spring-cloud-bom", "${solace-spring-cloud.version}"); @@ -69,18 +66,16 @@ void bomAddedWhenSolaceAndCloudStreamSelected() { @Test void bomPropertyAddedWhenSolaceAndCloudStreamSelected() { - String platformVersion = "3.2.0"; - ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion(platformVersion); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "solace", "cloud-stream"); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() - .hasProperty("solace-spring-cloud.version", getBom("solace-spring-cloud", platformVersion).getVersion()); + .hasProperty("solace-spring-cloud.version", + getBom("solace-spring-cloud", BOOT_VERSION.getVersion()).getVersion()); } @Test void solaceStarterRemovedWhenSolaceAndCloudStreamSelected() { - ProjectRequest request = createProjectRequest("solace", "cloud-stream"); - request.setBootVersion(BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "solace", "cloud-stream"); ProjectStructure project = generateProject(request); Dependency solace = getDependency("solace"); assertThat(project).mavenBuild().doesNotHaveDependency(solace.getGroupId(), solace.getArtifactId()); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java index 84549936da..d88c91f0b1 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -32,16 +33,18 @@ */ class SpringAiChromaProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @Test void doesNothingWithoutDockerCompose() { - ProjectRequest request = createProjectRequest("web", "spring-ai-vectordb-chroma"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "spring-ai-vectordb-chroma"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @Test void createsChromaService() { - ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-chroma"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-vectordb-chroma"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/chroma.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java index ca0731f232..3e3efb0361 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java @@ -19,6 +19,7 @@ import java.util.stream.Stream; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -34,6 +35,8 @@ */ class SpringAiDockerComposeProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @ParameterizedTest @MethodSource("supportedDockerComposeSpringAiEntriesBuild") void springAiTestcontainersDependencyIsAdded(String springAiDependency) { @@ -50,9 +53,8 @@ void shouldNotAddSpringAiTestcontainersDependencyIfNoSpringAiDependencyIsSelecte } private ProjectRequest createProject(String... styles) { - ProjectRequest projectRequest = createProjectRequest(styles); + ProjectRequest projectRequest = createProjectRequest(BOOT_VERSION, styles); projectRequest.setLanguage("java"); - projectRequest.setBootVersion("3.3.0"); return projectRequest; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java index aab0aa859d..e1fa66067a 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -32,16 +33,18 @@ */ class SpringAiOllamaProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @Test void doesNothingWithoutDockerCompose() { - ProjectRequest request = createProjectRequest("web", "spring-ai-ollama"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "spring-ai-ollama"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @Test void createsOllamaService() { - ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-ollama"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-ollama"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/ollama.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java index aea6c230f9..51432ff95d 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -32,16 +33,18 @@ */ class SpringAiQdrantProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @Test void doesNothingWithoutDockerCompose() { - ProjectRequest request = createProjectRequest("web", "spring-ai-vectordb-qdrant"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "spring-ai-vectordb-qdrant"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @Test void createsQdrantService() { - ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-qdrant"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-vectordb-qdrant"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/qdrant.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java index fe7536aa8b..4851ea8351 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java @@ -19,6 +19,7 @@ import java.util.stream.Stream; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -34,6 +35,8 @@ */ class SpringAiTestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @ParameterizedTest @MethodSource("supportedTestcontainersSpringAiEntriesBuild") void springAiTestcontainersDependencyIsAdded(String springAiDependency) { @@ -55,9 +58,8 @@ static Stream supportedTestcontainersSpringAiEntriesBuild() { } private ProjectRequest createProject(String... styles) { - ProjectRequest projectRequest = createProjectRequest(styles); + ProjectRequest projectRequest = createProjectRequest(BOOT_VERSION, styles); projectRequest.setLanguage("java"); - projectRequest.setBootVersion("3.3.0"); return projectRequest; } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java index 8560dd744e..75dac79c68 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -32,16 +33,18 @@ */ class SpringAiWeaviateProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @Test void doesNothingWithoutDockerCompose() { - ProjectRequest request = createProjectRequest("web", "spring-ai-vectordb-qdrant"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "spring-ai-vectordb-qdrant"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @Test void createsWeaviateService() { - ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-weaviate"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "spring-ai-vectordb-weaviate"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/weaviate.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java index eead354025..c976bc74ef 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -32,22 +33,24 @@ */ class SpringAzureDockerComposeProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @Test void doesNothingWithoutDockerCompose() { - ProjectRequest request = createProjectRequest("web", "azure-storage"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "web", "azure-storage"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @Test void createsAzuriteService() { - ProjectRequest request = createProjectRequest("docker-compose", "azure-storage"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "docker-compose", "azure-storage"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/azurite.yaml")); } @Test void springAzureDockerComposeDependencyIsAdded() { - ProjectRequest projectRequest = createProjectRequest("docker-compose", "azure-storage"); + ProjectRequest projectRequest = createProjectRequest(BOOT_VERSION, "docker-compose", "azure-storage"); assertThat(mavenPom(projectRequest)).hasDependency("com.azure.spring", "spring-cloud-azure-docker-compose", null, "runtime"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java index f980c5c21c..bda785d2bc 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java @@ -21,6 +21,7 @@ import io.spring.initializr.generator.test.io.TextAssert; import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -37,12 +38,12 @@ */ class SpringAzureProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; @ParameterizedTest @MethodSource("azureDependencies") void onlyAzureDependency(String dependencyId) { - ProjectStructure project = generateProject(SPRING_BOOT_VERSION, dependencyId); + ProjectStructure project = generateProject(dependencyId); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency(dependencyId)) @@ -54,7 +55,7 @@ void onlyAzureDependency(String dependencyId) { @Test void onlyActuator() { - ProjectStructure project = generateProject(SPRING_BOOT_VERSION, "actuator"); + ProjectStructure project = generateProject("actuator"); assertThat(project).mavenBuild() .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") .hasDependenciesSize(2) @@ -65,7 +66,7 @@ void onlyActuator() { @ParameterizedTest @MethodSource("azureDependencies") void azureDependencyWithActuator(String dependencyId) { - ProjectStructure project = generateProject(SPRING_BOOT_VERSION, dependencyId, "actuator"); + ProjectStructure project = generateProject(dependencyId, "actuator"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency(dependencyId)) @@ -76,7 +77,7 @@ void azureDependencyWithActuator(String dependencyId) { @Test void onlyIntegration() { - ProjectStructure project = generateProject(SPRING_BOOT_VERSION, "integration"); + ProjectStructure project = generateProject("integration"); assertThat(project).mavenBuild() .doesNotHaveBom("com.azure.spring", "spring-cloud-azure-dependencies") .hasDependenciesSize(3) @@ -87,7 +88,7 @@ void onlyIntegration() { @Test void azureStorageWithIntegration() { - ProjectStructure project = generateProject(SPRING_BOOT_VERSION, "azure-storage", "integration"); + ProjectStructure project = generateProject("azure-storage", "integration"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency(getDependency("azure-storage")) @@ -99,7 +100,7 @@ void azureStorageWithIntegration() { @Test void azureJdbcWithMysql() { - ProjectStructure project = generateProject(SPRING_BOOT_VERSION, "mysql", "azure-support"); + ProjectStructure project = generateProject("mysql", "azure-support"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-mysql"); @@ -109,7 +110,7 @@ void azureJdbcWithMysql() { @Test void azureJdbcWithPostgresql() { - ProjectStructure project = generateProject(SPRING_BOOT_VERSION, "postgresql", "azure-support"); + ProjectStructure project = generateProject("postgresql", "azure-support"); assertThat(project).mavenBuild() .hasBom("com.azure.spring", "spring-cloud-azure-dependencies", "${spring-cloud-azure.version}") .hasDependency("com.azure.spring", "spring-cloud-azure-starter-jdbc-postgresql"); @@ -122,9 +123,8 @@ private static Stream azureDependencies() { Arguments.of("azure-storage"), Arguments.of("azure-support")); } - private ProjectStructure generateProject(String bootVersion, String... dependencies) { - ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(bootVersion); + private ProjectStructure generateProject(String... dependencies) { + ProjectRequest request = createProjectRequest(BOOT_VERSION, dependencies); request.setType("maven-build"); return generateProject(request); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java index 7863ef955c..1f5bffe02c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java @@ -17,6 +17,7 @@ package io.spring.start.site.extension.dependency.springazure; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -29,16 +30,18 @@ */ class SpringAzureTestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @Test void springAzureTestcontainersDependencyIsAdded() { - ProjectRequest projectRequest = createProjectRequest("testcontainers", "azure-storage"); + ProjectRequest projectRequest = createProjectRequest(BOOT_VERSION, "testcontainers", "azure-storage"); assertThat(mavenPom(projectRequest)).hasDependency("com.azure.spring", "spring-cloud-azure-testcontainers", null, "test"); } @Test void shouldNotAddSpringAzureTestcontainersDependencyIfNoSpringAzureDependencyIsSelected() { - ProjectRequest projectRequest = createProjectRequest("testcontainers", "azure-keyvault"); + ProjectRequest projectRequest = createProjectRequest(BOOT_VERSION, "testcontainers", "azure-keyvault"); assertThat(mavenPom(projectRequest)).doesNotHaveDependency("com.azure.spring", "spring-cloud-azure-testcontainers"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java index d67367e344..13c3fc0d32 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfigurationTests.java @@ -58,9 +58,8 @@ void dockerComposeSupportHasOptionalScope() { } @Test - void springBoot32DoesNotConfigureJammyBaseBuilder() { + void springBootDoesNotConfigureJammyBaseBuilder() { ProjectRequest request = createProjectRequest(); - request.setBootVersion("3.2.0"); assertThat(mavenPom(request)).doesNotContain(""); } @@ -100,16 +99,14 @@ void mavenWithDockerComposeSupportHasOptionalScope() { } @Test - void springBoot32WithGroovyDslDoesNotConfigureJammyBaseBuilder() { + void springBootWithGroovyDslDoesNotConfigureJammyBaseBuilder() { ProjectRequest request = createProjectRequest(); - request.setBootVersion("3.2.0"); assertThat(gradleBuild(request)).doesNotContain("builder = '"); } @Test - void springBoot32WithKotlinDslDoesNotConfigureJammyBaseBuilder() { + void springBootWithKotlinDslDoesNotConfigureJammyBaseBuilder() { ProjectRequest request = createProjectRequest(); - request.setBootVersion("3.2.0"); assertThat(gradleKotlinDslBuild(request)).doesNotContain("builder.set(\""); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java index b9ffe3178c..fd58ffdd91 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java @@ -30,15 +30,12 @@ */ class SpringCloudCircuitBreakerBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - private static final Dependency REACTIVE_CLOUD_CIRCUIT_BREAKER = Dependency.withId("cloud-resilience4j-reactive", "org.springframework.cloud", "spring-cloud-starter-circuitbreaker-reactor-resilience4j"); @Test void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() { ProjectRequest request = createProjectRequest("webflux", "cloud-resilience4j"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("webflux")) .hasDependency(REACTIVE_CLOUD_CIRCUIT_BREAKER) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-resilience4j") @@ -49,7 +46,6 @@ void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() @Test void doesNotReplaceCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetNotPresent() { ProjectRequest request = createProjectRequest("cloud-resilience4j"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-resilience4j")) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-reactor-resilience4j") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java index de74a948eb..dcd71a87ae 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java @@ -31,12 +31,9 @@ */ class SpringCloudContractConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - @Test void contractsDirectoryWithMavenIsCreatedWithSpringCloudContractVerifier() { ProjectRequest request = createProjectRequest("web", "cloud-contract-verifier"); - request.setBootVersion(SPRING_BOOT_VERSION); request.setType("maven-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/test/resources/contracts")).exists().isDirectory(); @@ -45,7 +42,6 @@ void contractsDirectoryWithMavenIsCreatedWithSpringCloudContractVerifier() { @Test void contractsDirectoryWithMavenIsNotCreatedIfSpringCloudContractVerifierIsNotRequested() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion(SPRING_BOOT_VERSION); request.setType("maven-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/test/resources/contracts")).doesNotExist(); @@ -54,7 +50,6 @@ void contractsDirectoryWithMavenIsNotCreatedIfSpringCloudContractVerifierIsNotRe @Test void contractsDirectoryWithGradleIsCreatedWithSpringCloudContractVerifier() { ProjectRequest request = createProjectRequest("web", "cloud-contract-verifier"); - request.setBootVersion(SPRING_BOOT_VERSION); request.setType("gradle-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/contractTest/resources/contracts")).exists() @@ -64,7 +59,6 @@ void contractsDirectoryWithGradleIsCreatedWithSpringCloudContractVerifier() { @Test void contractsDirectoryWithGradleIsNotCreatedIfSpringCloudContractVerifierIsNotRequested() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion(SPRING_BOOT_VERSION); request.setType("gradle-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/contractTest/resources/contracts")).doesNotExist(); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java index 3e87a7d55a..590b711ee7 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java @@ -31,40 +31,33 @@ */ class SpringCloudContractGradleBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - @Test void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).contains("id 'org.springframework.cloud.contract' version '"); } @Test void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { ProjectRequest request = createProjectRequest(); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).doesNotContain("org.springframework.cloud.contract"); } @Test void springCloudContractVerifierPluginContractTestWithJUnit5ByDefault() { ProjectRequest request = createProjectRequest("cloud-contract-verifier"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).containsSubsequence("tasks.named('contractTest') {", "useJUnitPlatform()"); } @Test void springCloudContractVerifierPluginWithGroovyDslAndWithTestModeSetWhenWebFluxIsPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).containsSubsequence("contracts {", "testMode = 'WebTestClient'"); } @Test void springCloudContractVerifierPluginWithKotlinDslAndTestModeSetWhenWebFluxIsPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleKotlinDslBuild(request)) .contains("import org.springframework.cloud.contract.verifier.config.TestMode") .containsSubsequence("contracts {", "testMode = TestMode.WEBTESTCLIENT"); @@ -73,7 +66,6 @@ void springCloudContractVerifierPluginWithKotlinDslAndTestModeSetWhenWebFluxIsPr @Test void springWebTestClientDependencyAddedWhenWebFluxIsPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(gradleBuild(request)).contains("testImplementation 'io.rest-assured:spring-web-test-client'"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java index 3b54637905..f213d9a1c8 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java @@ -32,12 +32,9 @@ */ class SpringCloudContractMavenBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - @Test void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-contract-verifier")) .hasText("/project/build/plugins/plugin[1]/groupId", "org.springframework.cloud") .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") @@ -53,7 +50,6 @@ void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { @Test void springCloudContractVerifierPluginForSpringBootWithJUnit5ByDefault() { ProjectRequest request = createProjectRequest("cloud-contract-verifier"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)) .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") .hasText("/project/build/plugins/plugin[1]/configuration/testFramework", "JUNIT5"); @@ -62,7 +58,6 @@ void springCloudContractVerifierPluginForSpringBootWithJUnit5ByDefault() { @Test void springCloudContractVerifierPluginWithTestModeSetWhenWebFluxIsPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)) .hasText("/project/build/plugins/plugin[1]/artifactId", "spring-cloud-contract-maven-plugin") .hasText("/project/build/plugins/plugin[1]/configuration/testMode", "WEBTESTCLIENT"); @@ -71,7 +66,6 @@ void springCloudContractVerifierPluginWithTestModeSetWhenWebFluxIsPresent() { @Test void springWebTestClientDependencyAddedWhenWebFluxIsPresent() { ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); - request.setBootVersion(SPRING_BOOT_VERSION); Dependency springWebTestClientDep = Dependency.withId("rest-assured-spring-web-test-client", "io.rest-assured", "spring-web-test-client"); springWebTestClientDep.setScope(Dependency.SCOPE_TEST); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java index cdb9c9a60a..8ca22758b4 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java @@ -32,15 +32,12 @@ */ class SpringCloudFunctionBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - static final Dependency WEB_ADAPTER = Dependency.withId("cloud-function-web", "org.springframework.cloud", "spring-cloud-function-web"); @Test void functionOnly() { ProjectRequest request = createProjectRequest("cloud-function"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-function")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(Dependency.createSpringBootStarter("")) @@ -52,7 +49,6 @@ void functionOnly() { @Test void web() { ProjectRequest request = createProjectRequest("web", "cloud-function"); - request.setBootVersion(SPRING_BOOT_VERSION); BillOfMaterials bom = getBom("spring-cloud", request.getBootVersion()); assertThat(mavenPom(request)).hasDependency(getDependency("web")) .hasDependency(WEB_ADAPTER) @@ -65,7 +61,6 @@ void web() { @Test void webflux() { ProjectRequest request = createProjectRequest("webflux", "cloud-function"); - request.setBootVersion(SPRING_BOOT_VERSION); BillOfMaterials bom = getBom("spring-cloud", request.getBootVersion()); assertThat(mavenPom(request)).hasDependency(getDependency("webflux")) .hasDependency(WEB_ADAPTER) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java index 2b6218da9e..c5e62c9810 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java @@ -19,6 +19,7 @@ import java.util.Arrays; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -31,14 +32,13 @@ */ class SpringCloudFunctionHelpDocumentCustomizerTests extends AbstractExtensionTests { - private static final String AZURE_SECTION_TITLE = "## Running Spring Cloud Function applications on Microsoft Azure"; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; - private static final String SPRING_BOOT_VERSION = "3.2.0"; + private static final String AZURE_SECTION_TITLE = "## Running Spring Cloud Function applications on Microsoft Azure"; @Test void functionBuildSetupInfoSectionAddedForMaven() { - ProjectRequest request = createProjectRequest(); - request.setBootVersion(SPRING_BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION); request.setType("maven-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); assertThat(helpDocument(request)).contains(AZURE_SECTION_TITLE); @@ -46,8 +46,7 @@ void functionBuildSetupInfoSectionAddedForMaven() { @Test void functionBuildSetupInfoSectionAddedForGradle() { - ProjectRequest request = createProjectRequest(); - request.setBootVersion(SPRING_BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION); request.setType("gradle-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); assertThat(helpDocument(request)).contains(AZURE_SECTION_TITLE); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java index 715243845f..0d5b7ba54c 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java @@ -32,8 +32,6 @@ */ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - private static final Dependency KAFKA_BINDER = Dependency.withId("cloud-stream-binder-kafka", "org.springframework.cloud", "spring-cloud-stream-binder-kafka"); @@ -52,7 +50,6 @@ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { @Test void springCloudStreamWithRabbit() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -64,7 +61,6 @@ void springCloudStreamWithRabbit() { @Test void springCloudStreamWithKafka() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka")) .hasDependency(KAFKA_BINDER) @@ -76,7 +72,6 @@ void springCloudStreamWithKafka() { @Test void springCloudStreamWithKafkaStreams() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka-streams"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka-streams")) .hasDependency(KAFKA_STREAMS_BINDER) @@ -88,7 +83,6 @@ void springCloudStreamWithKafkaStreams() { @Test void springCloudStreamWithPulsar() { ProjectRequest request = createProjectRequest("cloud-stream", "pulsar"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("pulsar")) .hasDependency(PULSAR_BINDER) @@ -98,7 +92,6 @@ void springCloudStreamWithPulsar() { @Test void springCloudStreamWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp", "kafka", "kafka-streams"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) @@ -114,7 +107,6 @@ void springCloudStreamWithAllBinders() { @Test void springCloudBusWithRabbit() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -125,7 +117,6 @@ void springCloudBusWithRabbit() { @Test void springCloudBusWithKafka() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -136,7 +127,6 @@ void springCloudBusWithKafka() { @Test void springCloudBusWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp", "kafka", "kafka-streams"); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java index 5109e0b088..932dfa6d1b 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springintegration/SpringIntegrationProjectGenerationConfigurationTests.java @@ -44,7 +44,7 @@ class SpringIntegrationProjectGenerationConfigurationTests extends AbstractExten void buildWithOnlySpringIntegration() { Dependency integrationTest = integrationDependency("test"); integrationTest.setScope(Dependency.SCOPE_TEST); - assertThat(generateProject("3.2.0", "integration")).mavenBuild() + assertThat(generateProject("integration")).mavenBuild() .hasDependency(getDependency("integration")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(integrationTest); @@ -53,7 +53,7 @@ void buildWithOnlySpringIntegration() { @ParameterizedTest @MethodSource("supportedEntries") void buildWithSupportedEntries(String springBootDependencyId, String integrationModuleId) { - assertThat(generateProject("3.2.0", "integration", springBootDependencyId)).mavenBuild() + assertThat(generateProject("integration", springBootDependencyId)).mavenBuild() .hasDependency(getDependency("integration")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(integrationDependency(integrationModuleId)); @@ -67,10 +67,9 @@ static Stream supportedEntries() { Arguments.arguments("data-r2dbc", "r2dbc"), Arguments.arguments("data-redis", "redis"), Arguments.arguments("data-redis-reactive", "redis"), Arguments.arguments("kafka", "kafka"), Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mail", "mail"), - Arguments.arguments("rsocket", "rsocket"), Arguments.arguments("security", "security"), - Arguments.arguments("web", "http"), Arguments.arguments("webflux", "webflux"), - Arguments.arguments("websocket", "websocket"), Arguments.arguments("websocket", "stomp"), - Arguments.arguments("web-services", "ws")); + Arguments.arguments("rsocket", "rsocket"), Arguments.arguments("web", "http"), + Arguments.arguments("webflux", "webflux"), Arguments.arguments("websocket", "websocket"), + Arguments.arguments("websocket", "stomp"), Arguments.arguments("web-services", "ws")); } @ParameterizedTest @@ -108,8 +107,8 @@ void linkToSupportedEntriesWhenTwoMatchesArePresentOnlyAddLinkOnce() { } @Test - void securityAddsSpringSecurityMessagingOnBoot3dot3() { - assertThat(generateProject("3.3.0", "integration", "security")).mavenBuild() + void securityAddsSpringSecurityMessaging() { + assertThat(generateProject("integration", "security")).mavenBuild() .hasDependency("org.springframework.security", "spring-security-messaging") .doesNotHaveDependency("org.springframework.integration", "spring-integration-security"); @@ -121,9 +120,8 @@ private static Dependency integrationDependency(String id) { integrationModule, null, io.spring.initializr.metadata.Dependency.SCOPE_COMPILE); } - private ProjectStructure generateProject(String bootVersion, String... dependencies) { + private ProjectStructure generateProject(String... dependencies) { ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(bootVersion); request.setType("maven-build"); return generateProject(request); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java index 970d329fc4..6695d762a6 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springpulsar/SpringPulsarProjectGenerationConfigurationTests.java @@ -22,6 +22,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.generator.version.Version; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.container.DockerServiceResolver; import io.spring.start.site.container.ServiceConnections; import io.spring.start.site.container.ServiceConnectionsCustomizer; @@ -44,23 +45,19 @@ */ class SpringPulsarProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; - @Nested class PulsarDependencyConfigurationTests { @Test - void pulsarBootStarterUsedWhenBoot32Selected() { + void pulsarBootStarterUsed() { ProjectRequest request = createProjectRequest("pulsar"); - request.setBootVersion(SPRING_BOOT_VERSION); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild().hasDependency("org.springframework.boot", "spring-boot-starter-pulsar"); } @Test - void pulsarReactiveBootStarterUsedWhenBoot32Selected() { + void pulsarReactiveBootStarterUsed() { ProjectRequest request = createProjectRequest("pulsar-reactive"); - request.setBootVersion(SPRING_BOOT_VERSION); ProjectStructure project = generateProject(request); assertThat(project).mavenBuild() .hasDependency("org.springframework.boot", "spring-boot-starter-pulsar-reactive"); @@ -74,7 +71,6 @@ class DockerComposeConfigurationTests { @Test void serviceNotCreatedWhenDockerComposeNotSelected() { ProjectRequest request = createProjectRequest("pulsar"); - request.setBootVersion(SPRING_BOOT_VERSION); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); } @@ -83,7 +79,6 @@ void serviceNotCreatedWhenDockerComposeNotSelected() { @ValueSource(strings = { "pulsar", "pulsar-reactive" }) void serviceCreatedWhenDockerComposeSelectedWithCompatibleBootVersion(String pulsarDependencyId) { ProjectRequest request = createProjectRequest("docker-compose", pulsarDependencyId); - request.setBootVersion(SPRING_BOOT_VERSION); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/pulsar.yaml")); } @@ -99,7 +94,7 @@ class ServiceConnectionConfigurationTests { @Test void connectionNotAddedWhenTestcontainersNotSelected() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); + description.setPlatformVersion(Version.parse(SupportedBootVersion.latest().getVersion())); description.addDependency("pulsar", mock(Dependency.class)); this.projectTester.configure(description, (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); @@ -108,7 +103,7 @@ void connectionNotAddedWhenTestcontainersNotSelected() { @Test void connectionNotAddedWhenPulsarNotSelected() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); + description.setPlatformVersion(Version.parse(SupportedBootVersion.latest().getVersion())); description.addDependency("testcontainers", mock(Dependency.class)); this.projectTester.configure(description, (context) -> assertThat(context).doesNotHaveBean("pulsarServiceConnectionsCustomizer")); @@ -118,7 +113,7 @@ void connectionNotAddedWhenPulsarNotSelected() { @ValueSource(strings = { "pulsar", "pulsar-reactive" }) void connectionAddedWhenTestcontainersAndPulsarSelectedWithCompatibleBootVersion(String pulsarDependencyId) { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); + description.setPlatformVersion(Version.parse(SupportedBootVersion.latest().getVersion())); description.addDependency("testcontainers", mock(Dependency.class)); description.addDependency(pulsarDependencyId, mock(Dependency.class)); this.projectTester.configure(description, diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java index d0e935cca7..deebee7752 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java @@ -19,6 +19,7 @@ import io.spring.initializr.metadata.BillOfMaterials; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -31,9 +32,11 @@ */ class SpringShellTestBuildCustomizerTests extends AbstractExtensionTests { + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + @Test void shellTestIsAddedWithSpringShell() { - ProjectRequest request = createProjectRequest("spring-shell"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "spring-shell"); BillOfMaterials bom = getBom("spring-shell", request.getBootVersion()); assertThat(mavenPom(request)).hasDependency(getDependency("spring-shell")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index fbd512cac2..774c0b7595 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -22,6 +22,7 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.generator.version.Version; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -42,70 +43,35 @@ */ class TestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION_3_3 = "3.3.0"; - - private static final String SPRING_BOOT_VERSION_3_2 = "3.2.0"; - @Test void buildWithOnlyTestContainers() { - assertThat(generateProject(SPRING_BOOT_VERSION_3_3, "testcontainers")).mavenBuild() - .hasDependency(getDependency("testcontainers")); - } - - @ParameterizedTest - @MethodSource("supportedEntriesBuild320") - void buildWithSupportedEntriesForSpringBoot32(String springBootDependencyId, String testcontainersArtifactId) { - assertThat(generateProject(SPRING_BOOT_VERSION_3_2, "testcontainers", springBootDependencyId)).mavenBuild() - .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse(SPRING_BOOT_VERSION_3_2))) - .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") - .hasDependency(getDependency("testcontainers")); + assertThat(generateProject("testcontainers")).mavenBuild().hasDependency(getDependency("testcontainers")); } @ParameterizedTest @MethodSource("supportedTestcontainersActiveMQEntriesBuild") - void buildWithSpringBoot33AndTestcontainersActiveMQModule(String springBootDependencyId, + void buildWithSpringBootAndTestcontainersActiveMQModule(String springBootDependencyId, String testcontainersArtifactId) { - assertThat(generateProject(SPRING_BOOT_VERSION_3_3, "testcontainers", springBootDependencyId)).mavenBuild() + assertThat(generateProject("testcontainers", springBootDependencyId)).mavenBuild() .doesNotHaveBom("org.testcontainers", "testcontainers-bom") - .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.3.0"))) + .hasDependency(getDependency(springBootDependencyId) + .resolve(Version.parse(SupportedBootVersion.latest().getVersion()))) .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") .hasDependency(getDependency("testcontainers")); } @ParameterizedTest @MethodSource("supportedTestcontainersSpringAiEntriesBuild") - void buildWithSpringBoot33M3AndTestcontainersSpringAiModule(String springBootDependencyId, + void buildWithSpringBootAndTestcontainersSpringAiModule(String springBootDependencyId, String testcontainersArtifactId) { - assertThat(generateProject(SPRING_BOOT_VERSION_3_3, "testcontainers", springBootDependencyId)).mavenBuild() + assertThat(generateProject("testcontainers", springBootDependencyId)).mavenBuild() .doesNotHaveBom("org.testcontainers", "testcontainers-bom") - .hasDependency(getDependency(springBootDependencyId).resolve(Version.parse("3.3.0"))) + .hasDependency(getDependency(springBootDependencyId) + .resolve(Version.parse(SupportedBootVersion.latest().getVersion()))) .hasDependency("org.testcontainers", testcontainersArtifactId, null, "test") .hasDependency(getDependency("testcontainers")); } - static Stream supportedEntriesBuild320() { - return Stream.of(Arguments.arguments("amqp", "rabbitmq"), Arguments.of("amqp-streams", "rabbitmq"), - Arguments.arguments("cloud-gcp", "gcloud"), Arguments.arguments("cloud-gcp-pubsub", "gcloud"), - Arguments.arguments("data-cassandra", "cassandra"), - Arguments.arguments("data-cassandra-reactive", "cassandra"), - Arguments.arguments("data-couchbase", "couchbase"), - Arguments.arguments("data-couchbase-reactive", "couchbase"), - Arguments.arguments("data-elasticsearch", "elasticsearch"), - Arguments.arguments("data-mongodb", "mongodb"), Arguments.arguments("data-mongodb-reactive", "mongodb"), - Arguments.arguments("data-neo4j", "neo4j"), Arguments.arguments("data-r2dbc", "r2dbc"), - Arguments.arguments("db2", "db2"), Arguments.arguments("kafka", "kafka"), - Arguments.arguments("kafka-streams", "kafka"), Arguments.arguments("mariadb", "mariadb"), - Arguments.arguments("mysql", "mysql"), Arguments.arguments("postgresql", "postgresql"), - Arguments.arguments("oracle", "oracle-free"), Arguments.arguments("pulsar", "pulsar"), - Arguments.arguments("pulsar-reactive", "pulsar"), Arguments.arguments("solace", "solace"), - Arguments.arguments("spring-ai-vectordb-cassandra", "cassandra"), - Arguments.arguments("spring-ai-vectordb-elasticsearch", "elasticsearch"), - Arguments.arguments("spring-ai-vectordb-neo4j", "neo4j"), - Arguments.arguments("spring-ai-vectordb-oracle", "oracle-free"), - Arguments.arguments("spring-ai-vectordb-pgvector", "postgresql"), - Arguments.arguments("sqlserver", "mssqlserver")); - } - static Stream supportedTestcontainersActiveMQEntriesBuild() { return Stream.of(Arguments.arguments("activemq", "activemq"), Arguments.arguments("artemis", "activemq")); } @@ -120,13 +86,13 @@ static Stream supportedTestcontainersSpringAiEntriesBuild() { @ParameterizedTest @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsPresentIsAdded(String dependencyId, String docHref) { - assertHelpDocument(SPRING_BOOT_VERSION_3_2, "testcontainers", dependencyId).contains(docHref); + assertHelpDocument("testcontainers", dependencyId).contains(docHref); } @ParameterizedTest @MethodSource("supportedEntriesHelpDocument") void linkToSupportedEntriesWhenTestContainerIsNotPresentIsNotAdded(String dependencyId, String docHref) { - assertHelpDocument(SPRING_BOOT_VERSION_3_2, dependencyId).doesNotContain(docHref); + assertHelpDocument(dependencyId).doesNotContain(docHref); } static Stream supportedEntriesHelpDocument() { @@ -163,32 +129,31 @@ static Stream supportedEntriesHelpDocument() { @Test void linkToSupportedEntriesWhenTwoMatchesArePresentOnlyAddLinkOnce() { - assertHelpDocument(SPRING_BOOT_VERSION_3_3, "testcontainers", "data-mongodb", "data-mongodb-reactive") + assertHelpDocument("testcontainers", "data-mongodb", "data-mongodb-reactive") .containsOnlyOnce("https://java.testcontainers.org/modules/databases/mongodb/"); } @Test void buildWithSpringBoot31DoesNotIncludeBom() { - assertThat(generateProject(SPRING_BOOT_VERSION_3_3, "testcontainers")).mavenBuild() + assertThat(generateProject("testcontainers")).mavenBuild() .doesNotHaveBom("org.testcontainers", "testcontainers-bom") .hasDependency(getDependency("testcontainers")); } @Test void buildWithSpringBoot31IncludeSpringBootTestcontainers() { - assertThat(generateProject(SPRING_BOOT_VERSION_3_3, "testcontainers")).mavenBuild() + assertThat(generateProject("testcontainers")).mavenBuild() .hasDependency("org.springframework.boot", "spring-boot-testcontainers", null, "test"); } @Test void buildWithSpringBoot31IncludeTestcontainersSection() { - assertHelpDocument(SPRING_BOOT_VERSION_3_3, "testcontainers").contains("Spring Boot Testcontainers support"); + assertHelpDocument("testcontainers").contains("Spring Boot Testcontainers support"); } @Test void testApplicationWithGroovyAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); - request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("groovy"); assertThat(generateProject(request)) .textFile("src/test/groovy/com/example/demo/TestcontainersConfiguration.groovy") @@ -217,7 +182,6 @@ GenericContainer redisContainer() { @Test void testApplicationWithJavaAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); - request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("java"); assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") .isEqualToNormalizingNewlines(""" @@ -245,7 +209,6 @@ GenericContainer redisContainer() { @Test void testApplicationWithKotlinAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); - request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("kotlin"); assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestcontainersConfiguration.kt") .isEqualToNormalizingNewlines(""" @@ -273,7 +236,6 @@ fun redisContainer(): GenericContainer<*> { @Test void testApplicationWithGroovyAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); - request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("groovy"); ProjectStructure projectStructure = generateProject(request); assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") @@ -334,7 +296,6 @@ void contextLoads() { @Test void testApplicationWithJavaAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); - request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("java"); ProjectStructure projectStructure = generateProject(request); assertThat(projectStructure).textFile("src/test/java/com/example/demo/TestDemoApplication.java") @@ -396,7 +357,6 @@ void contextLoads() { @Test void testApplicationWithKotlinAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); - request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("kotlin"); ProjectStructure projectStructure = generateProject(request); assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt") @@ -454,7 +414,7 @@ fun contextLoads() { @Test void shouldAddHelpSection() { - assertHelpDocument(SPRING_BOOT_VERSION_3_3, "testcontainers", "data-mongodb", "postgresql").contains( + assertHelpDocument("testcontainers", "data-mongodb", "postgresql").contains( "https://docs.spring.io/spring-boot/3.3.0/reference/testing/testcontainers.html#testing.testcontainers") .contains( "https://docs.spring.io/spring-boot/3.3.0/reference/features/dev-services.html#features.dev-services.testcontainers") @@ -462,26 +422,14 @@ void shouldAddHelpSection() { .contains("postgres:latest"); } - @Test - void shouldAddHelpSectionWithOldSpringBoot() { - assertHelpDocument(SPRING_BOOT_VERSION_3_2, "testcontainers", "data-mongodb", "postgresql").contains( - "https://docs.spring.io/spring-boot/docs/3.2.0/reference/html/features.html#features.testing.testcontainers") - .contains( - "https://docs.spring.io/spring-boot/docs/3.2.0/reference/html/features.html#features.testing.testcontainers.at-development-time") - .contains("mongo:latest") - .contains("postgres:latest"); - } - - private ProjectStructure generateProject(String platformVersion, String... dependencies) { - ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(platformVersion); + private ProjectStructure generateProject(String... dependencies) { + ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, dependencies); request.setType("maven-build"); return generateProject(request); } - private TextAssert assertHelpDocument(String platformVersion, String... dependencyIds) { - ProjectRequest request = createProjectRequest(dependencyIds); - request.setBootVersion(platformVersion); + private TextAssert assertHelpDocument(String... dependencyIds) { + ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, dependencyIds); return assertThat(helpDocument(request)); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java index f9ffe3ea94..48db9ddf45 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java @@ -17,6 +17,7 @@ package io.spring.start.site.extension.dependency.vaadin; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -31,7 +32,7 @@ class VaadinMavenBuildCustomizerTests extends AbstractExtensionTests { @Test void shouldAddProductionProfile() { - ProjectRequest projectRequest = createProjectRequest("vaadin", "web"); + ProjectRequest projectRequest = createProjectRequest(SupportedBootVersion.V3_3, "vaadin", "web"); assertThat(mavenPom(projectRequest)).hasProfile("production").lines().containsSequence( // @formatter:off " ", diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java index 639beeec91..89de609587 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java @@ -18,6 +18,7 @@ import io.spring.initializr.generator.version.Version; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -31,12 +32,11 @@ */ class VaadinProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; @Test void mavenBuildWithVaadinAddProductionProfileWithoutProductionModeFlag() { - ProjectRequest request = createProjectRequest("vaadin", "data-jpa"); - request.setBootVersion(SPRING_BOOT_VERSION); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "vaadin", "data-jpa"); assertThat(mavenPom(request)).hasProfile("production").lines().containsSequence( // @formatter:off " ", @@ -84,7 +84,7 @@ void mavenBuildWithoutVaadinDoesNotAddProductionProfile() { @Test void gradleBuildWithVaadinAddPlugin() { - ProjectRequest request = createProjectRequest("vaadin", "data-jpa"); + ProjectRequest request = createProjectRequest(BOOT_VERSION, "vaadin", "data-jpa"); String vaadinVersion = getMetadata().getConfiguration() .getEnv() .getBoms() @@ -101,7 +101,7 @@ void gradleBuildWithoutVaadinDoesNotAddPlugin() { @Test void gitIgnoreWithVaadinIgnoreNodeModules() { - assertThat(generateProject(createProjectRequest("vaadin", "data-jpa"))).textFile(".gitignore") + assertThat(generateProject(createProjectRequest(BOOT_VERSION, "vaadin", "data-jpa"))).textFile(".gitignore") .contains("node_modules"); } @@ -113,7 +113,7 @@ void gitIgnoreWithoutVaadinDoesNotIgnoreNodeModules() { @Test void shouldAddLaunchBrowserProperty() { - assertThat(applicationProperties(createProjectRequest("vaadin"))).lines().contains("vaadin.launch-browser=true"); + assertThat(applicationProperties(createProjectRequest(BOOT_VERSION, "vaadin"))).lines().contains("vaadin.launch-browser=true"); } @Test @@ -121,11 +121,4 @@ void shouldNotAddLaunchBrowserPropertyIfVaadinIsNotSelected() { assertThat(applicationProperties(createProjectRequest("data-jpa"))).lines().doesNotContain("vaadin.launch-browser=true"); } - @Override - protected ProjectRequest createProjectRequest(String... dependencies) { - ProjectRequest request = super.createProjectRequest(dependencies); - request.setBootVersion(SPRING_BOOT_VERSION); - return request; - } - } diff --git a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java index 16fb3a8112..b28c7a1295 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/description/InvalidJvmVersionHelpDocumentCustomizerTests.java @@ -31,11 +31,9 @@ */ class InvalidJvmVersionHelpDocumentCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.3.0"; - @Test void warningAddedWithUnsupportedCombination() { - assertHelpDocument(SPRING_BOOT_VERSION, "11").lines() + assertHelpDocument("11").lines() .containsSubsequence("# Read Me First", "* The JVM level was changed from '11' to '17', review the [JDK Version Range](https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range) on the wiki for more details."); } @@ -43,7 +41,6 @@ void warningAddedWithUnsupportedCombination() { @Test void warningAddedWithUnsupportedKotlinVersion() { ProjectRequest request = createProjectRequest("web"); - request.setBootVersion(SPRING_BOOT_VERSION); request.setJavaVersion("22"); request.setLanguage(KotlinLanguage.ID); assertHelpDocument(request).lines() @@ -53,17 +50,16 @@ void warningAddedWithUnsupportedKotlinVersion() { @Test void warningNotAddedWithCompatibleVersion() { - assertHelpDocument(SPRING_BOOT_VERSION, "17").doesNotContain("# Read Me First"); + assertHelpDocument("17").doesNotContain("# Read Me First"); } private TextAssert assertHelpDocument(ProjectRequest request) { return assertThat(helpDocument(request)); } - private TextAssert assertHelpDocument(String platformVersion, String jvmVersion) { + private TextAssert assertHelpDocument(String jvmVersion) { ProjectRequest request = createProjectRequest("web"); request.setType("gradle-project"); - request.setBootVersion(platformVersion); request.setJavaVersion(jvmVersion); return assertHelpDocument(request); } diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index ec8a153f85..90901b044e 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -19,6 +19,7 @@ import java.util.stream.Stream; import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -37,13 +38,14 @@ class JavaVersionProjectDescriptionCustomizerTests extends AbstractExtensionTest @Test void javaUnknownVersionIsLeftAsIs() { - assertThat(mavenPom(javaProject("9999999", "3.3.0"))).hasProperty("java.version", "9999999"); + assertThat(mavenPom(javaProject("9999999", SupportedBootVersion.latest().getVersion()))) + .hasProperty("java.version", "9999999"); } @Test void javaInvalidVersionIsLeftAsIs() { - assertThat(mavenPom(javaProject("${another.version}", "3.3.0"))).hasProperty("java.version", - "${another.version}"); + assertThat(mavenPom(javaProject("${another.version}", SupportedBootVersion.latest().getVersion()))) + .hasProperty("java.version", "${another.version}"); } @ParameterizedTest(name = "{0} - Java {1} - Spring Boot {2}") @@ -63,12 +65,14 @@ void gradleGroovyBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String lan @Test void java22IsNotSupportedWithKotlin() { - assertThat(mavenPom(kotlinProject("22", "3.2.9"))).hasProperty("java.version", "21"); + assertThat(mavenPom(kotlinProject("22", SupportedBootVersion.latest().getVersion()))) + .hasProperty("java.version", "21"); } @Test void java23IsNotSupportedWithKotlin() { - assertThat(mavenPom(kotlinProject("23", "3.2.9"))).hasProperty("java.version", "21"); + assertThat(mavenPom(kotlinProject("23", SupportedBootVersion.latest().getVersion()))) + .hasProperty("java.version", "21"); } static Stream supportedMavenParameters() { @@ -81,16 +85,18 @@ static Stream supportedGradleGroovyParameters() { } private static Stream supportedJavaParameters() { - return Stream.of(java("17", "3.2.0"), java("21", "3.2.0"), java("23", "3.2.9"), java("17", "3.3.0"), - java("21", "3.3.0"), java("23", "3.3.0")); + return Stream.of(java("17", SupportedBootVersion.latest().getVersion()), + java("21", SupportedBootVersion.latest().getVersion()), + java("23", SupportedBootVersion.latest().getVersion())); } private static Stream supportedKotlinParameters() { - return Stream.of(kotlin("21", "3.2.0"), kotlin("21", "3.3.0")); + return Stream.of(kotlin("21", SupportedBootVersion.latest().getVersion())); } private static Stream supportedGroovyParameters() { - return Stream.of(groovy("21", "3.2.0"), groovy("23", "3.2.9"), groovy("21", "3.3.0-M2"), groovy("23", "3.3.0")); + return Stream.of(groovy("21", SupportedBootVersion.latest().getVersion()), + groovy("23", SupportedBootVersion.latest().getVersion())); } private static Arguments java(String javaVersion, String springBootVersion) { diff --git a/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java b/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java index 6a95af4302..3512b98853 100644 --- a/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java +++ b/start-site/src/test/java/io/spring/start/site/support/CacheableMavenVersionResolverTests.java @@ -19,6 +19,7 @@ import java.util.Map; import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.site.SupportedBootVersion; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -63,10 +64,10 @@ void clearCache() { @Test void managedDependenciesAreCached() { Map dependencies = this.versionResolver.resolveDependencies("org.springframework.boot", - "spring-boot-dependencies", "3.2.0"); + "spring-boot-dependencies", SupportedBootVersion.latest().getVersion()); assertThat(dependencies).isNotNull(); - ValueWrapper valueWrapper = this.cache - .get("dependencies-org.springframework.boot:spring-boot-dependencies:3.2.0"); + ValueWrapper valueWrapper = this.cache.get("dependencies-org.springframework.boot:spring-boot-dependencies:%s" + .formatted(SupportedBootVersion.latest().getVersion())); assertThat(valueWrapper).isNotNull(); assertThat(valueWrapper.get()).isInstanceOf(Map.class); } @@ -74,9 +75,10 @@ void managedDependenciesAreCached() { @Test void managedPluginsAreCached() { Map plugins = this.versionResolver.resolvePlugins("org.springframework.boot", - "spring-boot-dependencies", "3.2.0"); + "spring-boot-dependencies", SupportedBootVersion.latest().getVersion()); assertThat(plugins).isNotNull(); - ValueWrapper valueWrapper = this.cache.get("plugins-org.springframework.boot:spring-boot-dependencies:3.2.0"); + ValueWrapper valueWrapper = this.cache.get("plugins-org.springframework.boot:spring-boot-dependencies:%s" + .formatted(SupportedBootVersion.latest().getVersion())); assertThat(valueWrapper).isNotNull(); assertThat(valueWrapper.get()).isInstanceOf(Map.class); } diff --git a/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java b/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java index de8b309fc8..6b9f052bcf 100644 --- a/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java +++ b/start-site/src/test/java/io/spring/start/site/support/StartInitializrMetadataUpdateStrategyTests.java @@ -71,10 +71,10 @@ void eolVersionsAreRemoved() { assertThat(updatedMetadata.getBootVersions()).isNotNull(); List updatedBootVersions = updatedMetadata.getBootVersions().getContent(); assertThat(updatedBootVersions).hasSize(4); - assertBootVersion(updatedBootVersions.get(0), "3.3.0 (SNAPSHOT)", false); - assertBootVersion(updatedBootVersions.get(1), "3.3.0 (RC1)", false); - assertBootVersion(updatedBootVersions.get(2), "3.2.7 (SNAPSHOT)", false); - assertBootVersion(updatedBootVersions.get(3), "3.2.6", true); + assertBootVersion(updatedBootVersions.get(0), "3.4.1 (SNAPSHOT)", false); + assertBootVersion(updatedBootVersions.get(1), "3.4.0", true); + assertBootVersion(updatedBootVersions.get(2), "3.3.7 (SNAPSHOT)", false); + assertBootVersion(updatedBootVersions.get(3), "3.3.6", false); } @Test diff --git a/start-site/src/test/resources/compose/activemq-classic.yaml b/start-site/src/test/resources/compose/activemq-classic.yaml deleted file mode 100644 index 269d4e2a2c..0000000000 --- a/start-site/src/test/resources/compose/activemq-classic.yaml +++ /dev/null @@ -1,5 +0,0 @@ -services: - activemq: - image: 'apache/activemq-classic:latest' - ports: - - '61616' diff --git a/start-site/src/test/resources/compose/activemq.yaml b/start-site/src/test/resources/compose/activemq.yaml index 0e7e1de2d8..269d4e2a2c 100644 --- a/start-site/src/test/resources/compose/activemq.yaml +++ b/start-site/src/test/resources/compose/activemq.yaml @@ -1,5 +1,5 @@ services: activemq: - image: 'symptoma/activemq:latest' + image: 'apache/activemq-classic:latest' ports: - '61616' diff --git a/start-site/src/test/resources/metadata/springio/spring-boot.json b/start-site/src/test/resources/metadata/springio/spring-boot.json index 8d3dbcd206..1d73a7b21a 100644 --- a/start-site/src/test/resources/metadata/springio/spring-boot.json +++ b/start-site/src/test/resources/metadata/springio/spring-boot.json @@ -47,9 +47,9 @@ } }, { - "version": "3.3.0-SNAPSHOT", - "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java", - "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}", + "version": "3.3.7-SNAPSHOT", + "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java/index.html", + "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}/index.html", "status": "SNAPSHOT", "current": false, "_links": { @@ -57,44 +57,44 @@ "href": "https://api.spring.io/repositories/spring-snapshots" }, "self": { - "href": "https://api.spring.io/projects/spring-boot/releases/3.3.0-SNAPSHOT" + "href": "https://api.spring.io/projects/spring-boot/releases/3.3.7-SNAPSHOT" } } }, { - "version": "3.3.0-RC1", - "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java", - "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}", - "status": "PRERELEASE", + "version": "3.3.6", + "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java/index.html", + "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}/index.html", + "status": "GENERAL_AVAILABILITY", "current": false, "_links": { "repository": { - "href": "https://api.spring.io/repositories/spring-milestones" + "href": "https://api.spring.io/repositories/spring-releases" }, "self": { - "href": "https://api.spring.io/projects/spring-boot/releases/3.3.0-RC1" + "href": "https://api.spring.io/projects/spring-boot/releases/3.3.6" } } }, { - "version": "3.2.7-SNAPSHOT", + "version": "3.2.12", "apiDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/api/", "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/reference/html/", - "status": "SNAPSHOT", + "status": "GENERAL_AVAILABILITY", "current": false, "_links": { "repository": { - "href": "https://api.spring.io/repositories/spring-snapshots" + "href": "https://api.spring.io/repositories/spring-releases" }, "self": { - "href": "https://api.spring.io/projects/spring-boot/releases/3.2.7-SNAPSHOT" + "href": "https://api.spring.io/projects/spring-boot/releases/3.2.12" } } }, { - "version": "3.2.6", - "apiDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/api/", - "referenceDocUrl": "https://docs.spring.io/spring-boot/docs/{version}/reference/html/", + "version": "3.4.0", + "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java/index.html", + "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}/index.html", "status": "GENERAL_AVAILABILITY", "current": true, "_links": { @@ -102,7 +102,22 @@ "href": "https://api.spring.io/repositories/spring-releases" }, "self": { - "href": "https://api.spring.io/projects/spring-boot/releases/3.2.6" + "href": "https://api.spring.io/projects/spring-boot/releases/3.4.0" + } + } + }, + { + "version": "3.4.1-SNAPSHOT", + "apiDocUrl": "https://docs.spring.io/spring-boot/{version}/api/java/index.html", + "referenceDocUrl": "https://docs.spring.io/spring-boot/{version}/index.html", + "status": "SNAPSHOT", + "current": false, + "_links": { + "repository": { + "href": "https://api.spring.io/repositories/spring-snapshots" + }, + "self": { + "href": "https://api.spring.io/projects/spring-boot/releases/3.4.1-SNAPSHOT" } } } From 59b19c2d6a6d4b43168eb96b036627f200c9bdd0 Mon Sep 17 00:00:00 2001 From: Christian Tzolov Date: Fri, 22 Nov 2024 14:29:16 +0100 Subject: [PATCH 739/825] Update compatibility range for AI integration See gh-1648 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 0e27ed0a29..3ee64a857a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1421,7 +1421,7 @@ initializr: - rel: guide href: https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample - name: AI - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Anthropic Claude id: spring-ai-anthropic From 499b2222799f7af053ae24d3b962afb8df1972f2 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 22 Nov 2024 14:36:15 +0100 Subject: [PATCH 740/825] Polish "Update compatibility range for AI integration" See gh-1648 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3ee64a857a..05bec8a09a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -81,7 +81,7 @@ initializr: artifactId: spring-ai-bom versionProperty: spring-ai.version mappings: - - compatibilityRange: "[3.3.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.5.0-M1)" version: 1.0.0-M4 repositories: spring-milestones spring-cloud: From cb4e7d0dddac30a788654ebc089b996f60ec69cc Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 22 Nov 2024 14:43:00 +0100 Subject: [PATCH 741/825] Update Spring Boot version in tests for Spring AI See gh-1648 --- .../CassandraProjectGenerationConfigurationTests.java | 4 +--- .../ElasticsearchProjectGenerationConfigurationTests.java | 4 +--- .../oracle/OracleProjectGenerationConfigurationTests.java | 4 +--- .../PgVectorProjectGenerationConfigurationTests.java | 2 +- .../redis/RedisStackProjectGenerationConfigurationTests.java | 2 +- .../SpringAiChromaProjectGenerationConfigurationTests.java | 2 +- ...ingAiDockerComposeProjectGenerationConfigurationTests.java | 2 +- .../SpringAiOllamaProjectGenerationConfigurationTests.java | 2 +- .../SpringAiQdrantProjectGenerationConfigurationTests.java | 2 +- ...ngAiTestcontainersProjectGenerationConfigurationTests.java | 2 +- .../SpringAiWeaviateProjectGenerationConfigurationTests.java | 2 +- 11 files changed, 11 insertions(+), 17 deletions(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java index f6a1df5b48..88ca962b60 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/cassandra/CassandraProjectGenerationConfigurationTests.java @@ -18,7 +18,6 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -55,8 +54,7 @@ void createsCassandraServiceWhenReactive() { @Test void createsCassandraServiceWhenSpringAiIsSelected() { - ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, "docker-compose", - "spring-ai-vectordb-cassandra"); + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-cassandra"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/cassandra.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java index adabe1284d..7bd55b1a60 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/elasticsearch/ElasticsearchProjectGenerationConfigurationTests.java @@ -18,7 +18,6 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -49,8 +48,7 @@ void createsElasticsearchService() { @Test void createsElasticsearchServiceWhenSpringAiModuleIsSelected() { - ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, "docker-compose", - "spring-ai-vectordb-elasticsearch"); + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-elasticsearch"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/elasticsearch.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java index 9a1bb34062..c89ad6a9ab 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java @@ -18,7 +18,6 @@ import io.spring.initializr.generator.test.project.ProjectStructure; import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.SupportedBootVersion; import io.spring.start.site.extension.AbstractExtensionTests; import org.junit.jupiter.api.Test; @@ -49,8 +48,7 @@ void createsOracleFreeService() { @Test void createsOracleFreeServiceSpringAi() { - ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, "docker-compose", - "spring-ai-vectordb-oracle"); + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-oracle"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/oracle-free.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java index 37ac410633..76fc1aacf9 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/postgresql/PgVectorProjectGenerationConfigurationTests.java @@ -34,7 +34,7 @@ */ class PgVectorProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void doesNothingWithoutDockerCompose() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java index 826253c519..3e276a6893 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/redis/RedisStackProjectGenerationConfigurationTests.java @@ -33,7 +33,7 @@ */ class RedisStackProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void doesNothingWithoutDockerCompose() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java index d88c91f0b1..e72143f9fe 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiChromaProjectGenerationConfigurationTests.java @@ -33,7 +33,7 @@ */ class SpringAiChromaProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void doesNothingWithoutDockerCompose() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java index 3e3efb0361..4bd16c2ecc 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiDockerComposeProjectGenerationConfigurationTests.java @@ -35,7 +35,7 @@ */ class SpringAiDockerComposeProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @ParameterizedTest @MethodSource("supportedDockerComposeSpringAiEntriesBuild") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java index e1fa66067a..ba08828c41 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiOllamaProjectGenerationConfigurationTests.java @@ -33,7 +33,7 @@ */ class SpringAiOllamaProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void doesNothingWithoutDockerCompose() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java index 51432ff95d..385f61d970 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiQdrantProjectGenerationConfigurationTests.java @@ -33,7 +33,7 @@ */ class SpringAiQdrantProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void doesNothingWithoutDockerCompose() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java index 4851ea8351..dbaabdb4cc 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiTestcontainersProjectGenerationConfigurationTests.java @@ -35,7 +35,7 @@ */ class SpringAiTestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @ParameterizedTest @MethodSource("supportedTestcontainersSpringAiEntriesBuild") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java index 75dac79c68..d2ffbd2e18 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiWeaviateProjectGenerationConfigurationTests.java @@ -33,7 +33,7 @@ */ class SpringAiWeaviateProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void doesNothingWithoutDockerCompose() { From fb45e3d41385e57d1cc06f7c1b632a16a1871635 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Mon, 25 Nov 2024 11:35:16 +0100 Subject: [PATCH 742/825] Upgrade to Netflix DGS 9.2.0 DGS 9.2 is also compatible with Spring Boot 3.4, so this commit expands the compatibility range accordingly. Closes gh-1589 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 05bec8a09a..47068cf362 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -53,8 +53,8 @@ initializr: artifactId: graphql-dgs-platform-dependencies versionProperty: netflix-dgs.version mappings: - - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 9.1.3 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 9.2.0 sentry: groupId: io.sentry artifactId: sentry-bom From 9351fc6e16ae47e08712d3c0773b01355871f142 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Mon, 25 Nov 2024 14:27:06 +0100 Subject: [PATCH 743/825] Upgrade Spring Modulith to 1.3.0 See gh-1651 --- start-site/src/main/resources/application.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 47068cf362..ac1a7cec91 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -126,8 +126,7 @@ initializr: - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 1.2.4 - compatibilityRange: "[3.4.0,3.5.0-M1)" - version: 1.3.0-M3 - repositories: spring-milestones + version: 1.3.0 spring-shell: groupId: org.springframework.shell artifactId: spring-shell-dependencies From 5f87e399f3e28fc8a4b9c8d50211bc6467bf56d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Ko=CC=88ninger?= Date: Mon, 25 Nov 2024 12:32:39 +0100 Subject: [PATCH 744/825] Upgrade Spring Boot Admin to 3.3.6 and 3.4.0 See gh-1650 --- start-site/src/main/resources/application.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ac1a7cec91..b7e55a20b2 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -47,7 +47,9 @@ initializr: versionProperty: spring-boot-admin.version mappings: - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.3.5 + version: 3.3.6 + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 3.4.0 netflix-dgs: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-platform-dependencies @@ -913,7 +915,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-client description: Required for your application to register with a Codecentric's Spring Boot Admin Server instance. - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -923,7 +925,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-server description: A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints. - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference From 7ce7116266a046ad05a94ee0e4c37e5db89ae80c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Tue, 26 Nov 2024 08:45:00 +0100 Subject: [PATCH 745/825] Widen Timefold Solver's compatibility to include Boot 3.4 See gh-1653 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b7e55a20b2..c4d2e1013b 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -141,7 +141,7 @@ initializr: artifactId: timefold-solver-bom versionProperty: timefold-solver.version mappings: - - compatibilityRange: "[3.3.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.5.0-M1)" version: 1.16.0 vaadin: groupId: com.vaadin From 1b608e526a2c7002ff9b7c3c66601f04cbe7dd71 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 26 Nov 2024 08:53:44 +0200 Subject: [PATCH 746/825] Widen Vaadin's compatibility range to include Boot 3.4 See gh-1652 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c4d2e1013b..b548bd355c 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -148,7 +148,7 @@ initializr: artifactId: vaadin-bom versionProperty: vaadin.version mappings: - - compatibilityRange: "[3.3.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.5.0-M1)" version: 24.5.5 platform: compatibilityRange: "3.3.0" From b25f96be98b0db06a27b3b9dd9bbb708e1c07cb5 Mon Sep 17 00:00:00 2001 From: Kazuki Shimizu Date: Thu, 28 Nov 2024 00:53:39 +0900 Subject: [PATCH 747/825] Upgrade to MyBatis Spring Boot Starter 3.0.4 See gh-1655 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b548bd355c..8281980423 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -513,13 +513,13 @@ initializr: description: R2DBC Homepage - name: MyBatis Framework id: mybatis - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" description: Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. groupId: org.mybatis.spring.boot artifactId: mybatis-spring-boot-starter mappings: - - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.0.3 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 3.0.4 links: - rel: guide href: https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start From 94fbfd305aca2d2080dc55f5bfee8f6cf04ca3cd Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 2 Dec 2024 09:56:46 +0100 Subject: [PATCH 748/825] Remove @ConditionalOnGradleVersion --- .../dependency/DependencyProjectGenerationConfiguration.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java index 62a456c9e2..bc152085c6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java @@ -22,7 +22,6 @@ import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.generator.spring.build.gradle.ConditionalOnGradleVersion; import io.spring.initializr.metadata.InitializrMetadata; import io.spring.start.site.extension.dependency.liquibase.LiquibaseProjectContributor; import io.spring.start.site.extension.dependency.lombok.LombokGradleBuildCustomizer; @@ -87,7 +86,6 @@ public SpringBatchTestBuildCustomizer batchTestBuildCustomizer() { } @Bean - @ConditionalOnGradleVersion({ "6", "7", "8" }) @ConditionalOnBuildSystem(GradleBuildSystem.ID) @ConditionalOnRequestedDependency("lombok") public LombokGradleBuildCustomizer lombokGradleBuildCustomizer() { From 4ff4c15448a89eb04e36ecb4041eb0151dc69eaa Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 2 Dec 2024 10:53:35 +0100 Subject: [PATCH 749/825] Explicitly enable the Lombok annotation processor on Java 23 Closes gh-1654 --- ...endencyProjectGenerationConfiguration.java | 9 ++ .../lombok/LombokMavenBuildCustomizer.java | 84 +++++++++++++++++++ .../LombokMavenBuildCustomizerTests.java | 72 ++++++++++++++++ 3 files changed, 165 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizer.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java index bc152085c6..d0119c0d14 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java @@ -17,6 +17,7 @@ package io.spring.start.site.extension.dependency; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; @@ -25,6 +26,7 @@ import io.spring.initializr.metadata.InitializrMetadata; import io.spring.start.site.extension.dependency.liquibase.LiquibaseProjectContributor; import io.spring.start.site.extension.dependency.lombok.LombokGradleBuildCustomizer; +import io.spring.start.site.extension.dependency.lombok.LombokMavenBuildCustomizer; import io.spring.start.site.extension.dependency.mybatis.MyBatisTestBuildCustomizer; import io.spring.start.site.extension.dependency.okta.OktaHelpDocumentCustomizer; import io.spring.start.site.extension.dependency.reactor.ReactorTestBuildCustomizer; @@ -92,6 +94,13 @@ public LombokGradleBuildCustomizer lombokGradleBuildCustomizer() { return new LombokGradleBuildCustomizer(this.metadata); } + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + @ConditionalOnRequestedDependency("lombok") + public LombokMavenBuildCustomizer lombokMavenBuildCustomizer(ProjectDescription projectDescription) { + return new LombokMavenBuildCustomizer(this.metadata, projectDescription); + } + @Bean @ConditionalOnRequestedDependency("session") public SpringSessionBuildCustomizer springSessionBuildCustomizer() { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizer.java new file mode 100644 index 0000000000..53ae2d211a --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizer.java @@ -0,0 +1,84 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.lombok; + +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.language.java.JavaLanguage; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.metadata.InitializrMetadata; + +/** + * {@link BuildCustomizer} for Lombok when using Maven. + * + * @author Moritz Halbritter + */ +public class LombokMavenBuildCustomizer implements BuildCustomizer { + + private final InitializrMetadata metadata; + + private final ProjectDescription projectDescription; + + public LombokMavenBuildCustomizer(InitializrMetadata metadata, ProjectDescription projectDescription) { + this.metadata = metadata; + this.projectDescription = projectDescription; + } + + @Override + public void customize(MavenBuild build) { + if (isAtLeastJava(23)) { + configureAnnotationProcessor(build); + } + } + + private void configureAnnotationProcessor(MavenBuild build) { + Dependency lombok = this.metadata.getDependencies().get("lombok"); + build.plugins().add("org.apache.maven.plugins", "maven-compiler-plugin", (plugin) -> { + plugin.configuration((configuration) -> { + configuration.add("annotationProcessorPaths", (annotationProcessorPaths) -> { + annotationProcessorPaths.add("path", (path) -> { + path.add("groupId", lombok.getGroupId()); + path.add("artifactId", lombok.getArtifactId()); + }); + }); + }); + }); + } + + private boolean isAtLeastJava(int version) { + if (!isJava()) { + return false; + } + return getJavaVersion() >= version; + } + + private int getJavaVersion() { + String javaVersion = this.projectDescription.getLanguage().jvmVersion(); + try { + return Integer.parseInt(javaVersion); + } + catch (NumberFormatException ex) { + return -1; + } + } + + private boolean isJava() { + return this.projectDescription.getLanguage().id().equals(JavaLanguage.ID); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizerTests.java new file mode 100644 index 0000000000..78e33c100a --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizerTests.java @@ -0,0 +1,72 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.lombok; + +import io.spring.initializr.generator.language.groovy.GroovyLanguage; +import io.spring.initializr.generator.language.kotlin.KotlinLanguage; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link LombokMavenBuildCustomizer}. + * + * @author Moritz Halbritter + */ +class LombokMavenBuildCustomizerTests extends AbstractExtensionTests { + + @ParameterizedTest + @ValueSource(ints = { 23, 24 }) + void shouldAddAnnotationProcessorsOnJava23AndUp(int javaVersion) { + ProjectRequest request = createProjectRequest("lombok"); + request.setJavaVersion(Integer.toString(javaVersion)); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + + """); + } + + @ParameterizedTest + @ValueSource(ints = { 17, 18, 19, 20, 21, 22 }) + void shouldNotAddAnnotationProcessorsOnJavaBelow23(int javaVersion) { + ProjectRequest request = createProjectRequest("lombok"); + request.setJavaVersion(Integer.toString(javaVersion)); + assertThat(mavenPom(request)).doesNotContain(""); + } + + @ParameterizedTest + @ValueSource(strings = { GroovyLanguage.ID, KotlinLanguage.ID }) + void shouldNotAddAnnotationProcessorsOnNonJavaProjects(String language) { + ProjectRequest request = createProjectRequest("lombok"); + request.setJavaVersion("23"); + request.setLanguage(language); + assertThat(mavenPom(request)).doesNotContain(""); + } + +} From 5245302f1a6433759fd46e4cdc9a52cd4a556c46 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 3 Dec 2024 08:37:55 +0100 Subject: [PATCH 750/825] Upgrade to Spring Cloud 2023.0.4 Closes gh-1657 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8281980423..6e2cd7a167 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -93,7 +93,7 @@ initializr: order: 50 mappings: - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 2023.0.3 + version: 2023.0.4 - compatibilityRange: "[3.4.0,3.5.0-M1)" version: 2024.0.0-RC1 repositories: spring-milestones From f652cb5cb0cc8df134d87aeda262ff92f8d294b6 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Tue, 3 Dec 2024 10:07:27 +0100 Subject: [PATCH 751/825] fix: Sass warnings --- start-client/src/styles/_main.scss | 12 +++++------- start-client/src/styles/_mixins.scss | 22 +++++++++------------- start-client/src/styles/explore.scss | 2 +- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/start-client/src/styles/_main.scss b/start-client/src/styles/_main.scss index 85065d29d7..a64f3badfa 100644 --- a/start-client/src/styles/_main.scss +++ b/start-client/src/styles/_main.scss @@ -98,9 +98,9 @@ body { cursor: pointer; width: $size + 12px; height: $size + 12px; - @include transition(color $spring-transition-duration); border: 0 none; background: none; + @include transition(color $spring-transition-duration); .icon-history { width: 30px; margin-top: 6px; @@ -148,11 +148,11 @@ body { h1.logo { max-width: 320px; padding: 2rem 0; + display: block; a { - @include outline; - display: block; margin-left: -6px; color: $light-color; + @include outline; .logo-content { display: block; outline: none; @@ -253,8 +253,6 @@ hr.divider { padding-right: 1rem; } } - .right { - } } .col-sticky { @@ -428,10 +426,10 @@ button.button { margin-right: 1rem; cursor: pointer; background: transparent; - @include transition(all calc($spring-transition-duration / 2)); z-index: 1; background: $light-background; font-family: $spring-font-family; + @include transition(all calc($spring-transition-duration / 2)); &:focus { outline: none; box-shadow: 0 0 0 4px $light-border; @@ -463,8 +461,8 @@ button.button { bottom: 0; width: 100%; opacity: 0; - @include transition(all calc($spring-transition-duration / 2)); z-index: -1; + @include transition(all calc($spring-transition-duration / 2)); } &:hover, &:disabled { diff --git a/start-client/src/styles/_mixins.scss b/start-client/src/styles/_mixins.scss index 53edd8fc31..f5d8960cfa 100644 --- a/start-client/src/styles/_mixins.scss +++ b/start-client/src/styles/_mixins.scss @@ -1,21 +1,17 @@ @mixin transition($args...) { - -webkit-transition: $args; - -moz-transition: $args; - -ms-transition: $args; - -o-transition: $args; - transition: $args; -} - -@mixin clearfix { - &:after { - content: ''; - display: table; - clear: both; + & { + -webkit-transition: $args; + -moz-transition: $args; + -ms-transition: $args; + -o-transition: $args; + transition: $args; } } @mixin outline { - outline: 1px dotted transparent; + & { + outline: 1px dotted transparent; + } &:focus { outline: 1px dotted $light-outline; // outline: none; diff --git a/start-client/src/styles/explore.scss b/start-client/src/styles/explore.scss index 083d1953e3..e26e7e4084 100644 --- a/start-client/src/styles/explore.scss +++ b/start-client/src/styles/explore.scss @@ -225,6 +225,7 @@ color: $light-color; word-wrap: normal; white-space: nowrap; + outline: 1px dotted transparent; .item-content { box-shadow: none; outline: none; @@ -256,7 +257,6 @@ width: 16px; } - outline: 1px dotted transparent; &:focus { outline: 1px dotted darken($light-background-seconday, 10); } From 0797e075f1b6a5dd8dabce549d18000887ef93af Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 3 Dec 2024 11:06:43 +0100 Subject: [PATCH 752/825] Upgrade to Spring Cloud 2024.0.0 Closes gh-1658 --- start-site/src/main/resources/application.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 6e2cd7a167..8f714d9ffa 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -95,8 +95,7 @@ initializr: - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 2023.0.4 - compatibilityRange: "[3.4.0,3.5.0-M1)" - version: 2024.0.0-RC1 - repositories: spring-milestones + version: 2024.0.0 spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies From 706532f87aa0fa3f2362d9784bef8ff6e88bd2d6 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 3 Dec 2024 13:36:23 +0100 Subject: [PATCH 753/825] Automatically register configuration processors on the Maven compiler plugin Closes gh-1659 --- .../MavenProjectGenerationConfiguration.java | 9 +- ...rAnnotationProcessorsBuildCustomizer.java} | 57 +++++----- ...endencyProjectGenerationConfiguration.java | 9 -- ...otationProcessorsBuildCustomizerTests.java | 106 ++++++++++++++++++ .../LombokMavenBuildCustomizerTests.java | 72 ------------ 5 files changed, 142 insertions(+), 111 deletions(-) rename start-site/src/main/java/io/spring/start/site/extension/{dependency/lombok/LombokMavenBuildCustomizer.java => build/maven/RegisterAnnotationProcessorsBuildCustomizer.java} (57%) create mode 100644 start-site/src/test/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizerTests.java delete mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java index aa2ad70e2e..d14e02808d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ * {@link ProjectGenerationConfiguration} for generation of projects that depend on Maven. * * @author Stephane Nicoll + * @author Moritz Halbritter */ @ProjectGenerationConfiguration @ConditionalOnBuildSystem(MavenBuildSystem.ID) @@ -44,4 +45,10 @@ AnnotationProcessorExclusionBuildCustomizer annotationProcessorExclusionBuildCus return new AnnotationProcessorExclusionBuildCustomizer(metadata); } + @Bean + RegisterAnnotationProcessorsBuildCustomizer registerAnnotationProcessorsBuildCustomizer(InitializrMetadata metadata, + ProjectDescription projectDescription) { + return new RegisterAnnotationProcessorsBuildCustomizer(metadata, projectDescription); + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizer.java similarity index 57% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizer.java rename to start-site/src/main/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizer.java index 53ae2d211a..8285940191 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizer.java @@ -14,67 +14,66 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.lombok; +package io.spring.start.site.extension.build.maven; +import java.util.List; + +import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.language.java.JavaLanguage; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; /** - * {@link BuildCustomizer} for Lombok when using Maven. + * Register annotation processor dependencies on the Maven compiler plugin. * * @author Moritz Halbritter */ -public class LombokMavenBuildCustomizer implements BuildCustomizer { +class RegisterAnnotationProcessorsBuildCustomizer implements BuildCustomizer { private final InitializrMetadata metadata; private final ProjectDescription projectDescription; - public LombokMavenBuildCustomizer(InitializrMetadata metadata, ProjectDescription projectDescription) { + RegisterAnnotationProcessorsBuildCustomizer(InitializrMetadata metadata, ProjectDescription projectDescription) { this.metadata = metadata; this.projectDescription = projectDescription; } @Override public void customize(MavenBuild build) { - if (isAtLeastJava(23)) { - configureAnnotationProcessor(build); + if (!isJava()) { + return; + } + List annotationProcessors = build.dependencies() + .ids() + .filter(this::isAnnotationProcessor) + .map((id) -> build.dependencies().get(id)) + .toList(); + if (annotationProcessors.isEmpty()) { + return; } - } - - private void configureAnnotationProcessor(MavenBuild build) { - Dependency lombok = this.metadata.getDependencies().get("lombok"); build.plugins().add("org.apache.maven.plugins", "maven-compiler-plugin", (plugin) -> { plugin.configuration((configuration) -> { configuration.add("annotationProcessorPaths", (annotationProcessorPaths) -> { - annotationProcessorPaths.add("path", (path) -> { - path.add("groupId", lombok.getGroupId()); - path.add("artifactId", lombok.getArtifactId()); - }); + for (Dependency annotationProcessor : annotationProcessors) { + annotationProcessorPaths.add("path", (path) -> { + path.add("groupId", annotationProcessor.getGroupId()); + path.add("artifactId", annotationProcessor.getArtifactId()); + }); + + } }); }); }); - } - private boolean isAtLeastJava(int version) { - if (!isJava()) { - return false; - } - return getJavaVersion() >= version; } - private int getJavaVersion() { - String javaVersion = this.projectDescription.getLanguage().jvmVersion(); - try { - return Integer.parseInt(javaVersion); - } - catch (NumberFormatException ex) { - return -1; - } + private boolean isAnnotationProcessor(String id) { + io.spring.initializr.metadata.Dependency dependency = this.metadata.getDependencies().get(id); + return (dependency != null) + && io.spring.initializr.metadata.Dependency.SCOPE_ANNOTATION_PROCESSOR.equals(dependency.getScope()); } private boolean isJava() { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java index d0119c0d14..bc152085c6 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java @@ -17,7 +17,6 @@ package io.spring.start.site.extension.dependency; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; -import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; @@ -26,7 +25,6 @@ import io.spring.initializr.metadata.InitializrMetadata; import io.spring.start.site.extension.dependency.liquibase.LiquibaseProjectContributor; import io.spring.start.site.extension.dependency.lombok.LombokGradleBuildCustomizer; -import io.spring.start.site.extension.dependency.lombok.LombokMavenBuildCustomizer; import io.spring.start.site.extension.dependency.mybatis.MyBatisTestBuildCustomizer; import io.spring.start.site.extension.dependency.okta.OktaHelpDocumentCustomizer; import io.spring.start.site.extension.dependency.reactor.ReactorTestBuildCustomizer; @@ -94,13 +92,6 @@ public LombokGradleBuildCustomizer lombokGradleBuildCustomizer() { return new LombokGradleBuildCustomizer(this.metadata); } - @Bean - @ConditionalOnBuildSystem(MavenBuildSystem.ID) - @ConditionalOnRequestedDependency("lombok") - public LombokMavenBuildCustomizer lombokMavenBuildCustomizer(ProjectDescription projectDescription) { - return new LombokMavenBuildCustomizer(this.metadata, projectDescription); - } - @Bean @ConditionalOnRequestedDependency("session") public SpringSessionBuildCustomizer springSessionBuildCustomizer() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizerTests.java new file mode 100644 index 0000000000..61a1b503da --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/RegisterAnnotationProcessorsBuildCustomizerTests.java @@ -0,0 +1,106 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.build.maven; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link RegisterAnnotationProcessorsBuildCustomizer}. + * + * @author Moritz Halbritter + */ +class RegisterAnnotationProcessorsBuildCustomizerTests extends AbstractExtensionTests { + + @Test + void shouldNotAddCompilerPluginWhenNoAnnotationProcessorsAreSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("maven-compiler-plugin"); + } + + @Test + void shouldRegisterLombok() { + ProjectRequest request = createProjectRequest("lombok"); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + + """); + } + + @Test + void shouldRegisterSpringBootConfigurationProcessor() { + ProjectRequest request = createProjectRequest("configuration-processor"); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.springframework.boot + spring-boot-configuration-processor + + + + """); + } + + @Test + void shouldRegisterMultiple() { + ProjectRequest request = createProjectRequest("lombok", "configuration-processor"); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + org.springframework.boot + spring-boot-configuration-processor + + + + """); + } + + @ParameterizedTest + @ValueSource(strings = { "groovy", "kotlin" }) + void shouldDoNothingIfLanguageIsNotJava(String language) { + ProjectRequest request = createProjectRequest("configuration-processor"); + request.setLanguage(language); + assertThat(mavenPom(request)).doesNotContain("maven-compiler-plugin"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizerTests.java deleted file mode 100644 index 78e33c100a..0000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/lombok/LombokMavenBuildCustomizerTests.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2012-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.lombok; - -import io.spring.initializr.generator.language.groovy.GroovyLanguage; -import io.spring.initializr.generator.language.kotlin.KotlinLanguage; -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link LombokMavenBuildCustomizer}. - * - * @author Moritz Halbritter - */ -class LombokMavenBuildCustomizerTests extends AbstractExtensionTests { - - @ParameterizedTest - @ValueSource(ints = { 23, 24 }) - void shouldAddAnnotationProcessorsOnJava23AndUp(int javaVersion) { - ProjectRequest request = createProjectRequest("lombok"); - request.setJavaVersion(Integer.toString(javaVersion)); - assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" - - org.apache.maven.plugins - maven-compiler-plugin - - - - org.projectlombok - lombok - - - - """); - } - - @ParameterizedTest - @ValueSource(ints = { 17, 18, 19, 20, 21, 22 }) - void shouldNotAddAnnotationProcessorsOnJavaBelow23(int javaVersion) { - ProjectRequest request = createProjectRequest("lombok"); - request.setJavaVersion(Integer.toString(javaVersion)); - assertThat(mavenPom(request)).doesNotContain(""); - } - - @ParameterizedTest - @ValueSource(strings = { GroovyLanguage.ID, KotlinLanguage.ID }) - void shouldNotAddAnnotationProcessorsOnNonJavaProjects(String language) { - ProjectRequest request = createProjectRequest("lombok"); - request.setJavaVersion("23"); - request.setLanguage(language); - assertThat(mavenPom(request)).doesNotContain(""); - } - -} From c63661c3bca23638c7ec3b028f44637838efc743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 3 Oct 2024 12:52:41 -0600 Subject: [PATCH 754/825] Generate test app when Spring AI MongoDB Atlas is selected See gh-1660 --- .../SimpleDockerServiceResolver.java | 8 +++ ...DbAtlasProjectGenerationConfiguration.java | 56 +++++++++++++++++++ .../TestcontainersModuleRegistry.java | 3 +- .../main/resources/META-INF/spring.factories | 1 + ...asProjectGenerationConfigurationTests.java | 48 ++++++++++++++++ ...rsProjectGenerationConfigurationTests.java | 1 + .../test/resources/compose/mongodb-atlas.yaml | 5 ++ 7 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfiguration.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfigurationTests.java create mode 100644 start-site/src/test/resources/compose/mongodb-atlas.yaml diff --git a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java index 5d158a9e0e..bd9342b5c3 100644 --- a/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java +++ b/start-site/src/main/java/io/spring/start/site/container/SimpleDockerServiceResolver.java @@ -46,6 +46,7 @@ public SimpleDockerServiceResolver() { this.dockerServices.put("mariaDb", mariaDb()); this.dockerServices.put("milvus", milvus()); this.dockerServices.put("mongoDb", mongoDb()); + this.dockerServices.put("mongoDbAtlas", mongoDbAtlas()); this.dockerServices.put("mysql", mysql()); this.dockerServices.put("neo4j", neo4j()); this.dockerServices.put("ollama", ollama()); @@ -141,6 +142,13 @@ private static DockerService mongoDb() { return DockerService.withImageAndTag("mongo").website("https://hub.docker.com/_/mongo").ports(27017).build(); } + private static DockerService mongoDbAtlas() { + return DockerService.withImageAndTag("mongodb/mongodb-atlas-local") + .website("https://hub.docker.com/r/mongodb/mongodb-atlas-local") + .ports(27017) + .build(); + } + private static DockerService mysql() { return DockerService.withImageAndTag("mysql").website("https://hub.docker.com/_/mysql").ports(3306).build(); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfiguration.java new file mode 100644 index 0000000000..6f6bde95e6 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfiguration.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.start.site.container.ComposeFileCustomizer; +import io.spring.start.site.container.DockerServiceResolver; +import io.spring.start.site.container.ServiceConnections.ServiceConnection; +import io.spring.start.site.container.ServiceConnectionsCustomizer; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on MongoDb Atlas. + * + * @author Eddú Meléndez + */ +@ProjectGenerationConfiguration +@ConditionalOnPlatformVersion("3.4.0") +@ConditionalOnRequestedDependency("spring-ai-vectordb-mongodb-atlas") +class SpringAiMongoDbAtlasProjectGenerationConfiguration { + + private static final String TESTCONTAINERS_CLASS_NAME = "org.testcontainers.mongodb.MongoDBAtlasLocalContainer"; + + @Bean + @ConditionalOnRequestedDependency("testcontainers") + ServiceConnectionsCustomizer mongodbAtlasServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) { + return (serviceConnections) -> serviceResolver.doWith("mongoDbAtlas", + (service) -> serviceConnections.addServiceConnection( + ServiceConnection.ofContainer("mongoDbAtlas", service, TESTCONTAINERS_CLASS_NAME, false))); + } + + @Bean + @ConditionalOnRequestedDependency("docker-compose") + ComposeFileCustomizer mongodbAtlasComposeFileCustomizer(DockerServiceResolver serviceResolver) { + return (composeFile) -> serviceResolver.doWith("mongoDbAtlas", + (service) -> composeFile.services().add("mongodbatlas", service)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java index 858ed5206b..dcfc7156ac 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersModuleRegistry.java @@ -59,7 +59,8 @@ static Iterable create(Version platformVersion) { builders.add(onDependencies("data-elasticsearch", "spring-ai-vectordb-elasticsearch") .customizeBuild(addModule("elasticsearch")) .customizeHelpDocument(addReferenceLink("Elasticsearch Container", "elasticsearch/"))); - builders.add(onDependencies("data-mongodb", "data-mongodb-reactive").customizeBuild(addModule("mongodb")) + builders.add(onDependencies("data-mongodb", "data-mongodb-reactive", "spring-ai-vectordb-mongodb-atlas") + .customizeBuild(addModule("mongodb")) .customizeHelpDocument(addReferenceLink("MongoDB Module", "databases/mongodb/"))); builders.add(onDependencies("data-neo4j", "spring-ai-vectordb-neo4j").customizeBuild(addModule("neo4j")) .customizeHelpDocument(addReferenceLink("Neo4j Module", "databases/neo4j/"))); diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 4d5022e73e..d4480adf3f 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -31,6 +31,7 @@ io.spring.start.site.extension.dependency.solace.SolaceProjectGenerationConfigur io.spring.start.site.extension.dependency.springai.SpringAiChromaProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springai.SpringAiDockerComposeProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springai.SpringAiMilvusProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springai.SpringAiMongoDbAtlasProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springai.SpringAiOllamaProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springai.SpringAiQdrantProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springai.SpringAiTestcontainersProjectGenerationConfiguration,\ diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..76d7589f36 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springai/SpringAiMongoDbAtlasProjectGenerationConfigurationTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springai; + +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAiMongoDbAtlasProjectGenerationConfiguration} + * + * @author Eddú Meléndez + */ +class SpringAiMongoDbAtlasProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void doesNothingWithoutDockerCompose() { + ProjectRequest request = createProjectRequest("web", "spring-ai-vectordb-mongodb-atlas"); + ProjectStructure structure = generateProject(request); + assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist(); + } + + @Test + void createsMongoDbAtlasService() { + ProjectRequest request = createProjectRequest("docker-compose", "spring-ai-vectordb-mongodb-atlas"); + assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/mongodb-atlas.yaml")); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 774c0b7595..9521353576 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -79,6 +79,7 @@ static Stream supportedTestcontainersActiveMQEntriesBuild() { static Stream supportedTestcontainersSpringAiEntriesBuild() { return Stream.of(Arguments.arguments("spring-ai-vectordb-chroma", "chromadb"), Arguments.arguments("spring-ai-vectordb-milvus", "milvus"), + Arguments.arguments("spring-ai-vectordb-mongodb-atlas", "mongodb"), Arguments.arguments("spring-ai-vectordb-qdrant", "qdrant"), Arguments.arguments("spring-ai-vectordb-weaviate", "weaviate")); } diff --git a/start-site/src/test/resources/compose/mongodb-atlas.yaml b/start-site/src/test/resources/compose/mongodb-atlas.yaml new file mode 100644 index 0000000000..e50a9727fa --- /dev/null +++ b/start-site/src/test/resources/compose/mongodb-atlas.yaml @@ -0,0 +1,5 @@ +services: + mongodbatlas: + image: 'mongodb/mongodb-atlas-local:latest' + ports: + - '27017' From 6cfa07f6063b339453919d0aba78c1519fe84d80 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 4 Dec 2024 13:06:37 +0100 Subject: [PATCH 755/825] Upgrade to Spring Cloud Services 4.2.0 Closes gh-1662 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8f714d9ffa..369f563c84 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -117,8 +117,8 @@ initializr: versionProperty: spring-cloud-services.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 4.1.5 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 4.2.0 spring-modulith: groupId: org.springframework.modulith artifactId: spring-modulith-bom @@ -1288,7 +1288,7 @@ initializr: href: https://docs.spring.io/spring-cloud-stream/reference/ - name: VMware Tanzu Application Service bom: spring-cloud-services - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Config Client (TAS) id: scs-config-client From 2a83089df8fcf89607d70278fe6d31a0cbc0efac Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 4 Dec 2024 13:09:12 +0100 Subject: [PATCH 756/825] Update compatibility range for Netflix DGS See gh-1589 --- start-site/src/main/resources/application.yml | 2 +- .../site/extension/dependency/dgs/DgsBuildCustomizerTests.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 369f563c84..dc0cd48d98 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -337,7 +337,7 @@ initializr: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-spring-graphql-starter description: Build GraphQL applications with Netflix DGS and Spring for GraphQL. - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" bom: netflix-dgs links: - rel: reference diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java index 65b466e2d4..ba50f8598c 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java @@ -27,7 +27,7 @@ class DgsBuildCustomizerTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); private Dependency dgsTest; From 7ad63e96c83fcbbe6adba5d7392bbcbcaf70077b Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Wed, 4 Dec 2024 15:23:18 +0100 Subject: [PATCH 757/825] fix: Logo margin --- start-client/src/styles/_main.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/start-client/src/styles/_main.scss b/start-client/src/styles/_main.scss index a64f3badfa..3151915409 100644 --- a/start-client/src/styles/_main.scss +++ b/start-client/src/styles/_main.scss @@ -150,6 +150,7 @@ body { padding: 2rem 0; display: block; a { + display: block; margin-left: -6px; color: $light-color; @include outline; From 16c7f232b1d7afdffd31eeadbb66b2ced6063b55 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Wed, 4 Dec 2024 15:24:08 +0100 Subject: [PATCH 758/825] fix: Duplicate module --- start-client/src/components/Application.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/start-client/src/components/Application.js b/start-client/src/components/Application.js index 9a240ca4a2..0add014ec4 100644 --- a/start-client/src/components/Application.js +++ b/start-client/src/components/Application.js @@ -176,15 +176,7 @@ export default function Application() { open={exploreOpen || false} onClose={onEscape} /> - - - ) From a0c90907a241727d3446318123361bbb68ee389f Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 4 Dec 2024 15:24:32 +0100 Subject: [PATCH 759/825] Update to Camel 4.9.0 See gh-1663 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index dc0cd48d98..52a5cb81af 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -814,10 +814,10 @@ initializr: href: https://rsocket.io/ - name: Apache Camel id: camel - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.4.0,3.5.0-M1)" mappings: - - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 4.8.1 + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 4.9.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. groupId: org.apache.camel.springboot artifactId: camel-spring-boot-starter From 730dc8af50662dbbddfb8587b06158b1259d5a0e Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 5 Dec 2024 09:49:11 +0100 Subject: [PATCH 760/825] Polish "Update to Camel 4.9.0" See gh-1663 --- start-site/src/main/resources/application.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 52a5cb81af..01edc2d8d0 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -814,8 +814,10 @@ initializr: href: https://rsocket.io/ - name: Apache Camel id: camel - compatibilityRange: "[3.4.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" mappings: + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 4.8.1 - compatibilityRange: "[3.4.0,3.5.0-M1)" version: 4.9.0 description: Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. From 84dfeffe8512b4b7cbcda8b9c56b2ba51f10aa27 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Thu, 5 Dec 2024 11:17:34 +0100 Subject: [PATCH 761/825] Add ability to bookmark projects See gh-1664 --- start-client/dev/api.mock.json | 5 +- start-client/src/components/Application.js | 18 +- .../src/components/common/builder/Fields.js | 56 ++++- .../src/components/common/builder/Loading.js | 5 +- .../src/components/common/favorite/Add.js | 185 ++++++++++++++++ .../components/common/favorite/Favorite.js | 26 +++ .../src/components/common/favorite/Modal.js | 191 +++++++++++++++++ .../src/components/common/favorite/Utils.js | 16 ++ .../src/components/common/favorite/index.js | 1 + .../src/components/common/form/Button.js | 7 +- .../src/components/common/history/Modal.js | 24 ++- .../src/components/common/icons/Icons.js | 66 ++++++ .../src/components/common/icons/index.js | 3 + .../src/components/common/layout/SideLeft.js | 53 +++-- start-client/src/components/reducer/App.js | 73 ++++++- start-client/src/styles/_dark.scss | 26 ++- start-client/src/styles/_main.scss | 23 +- start-client/src/styles/_responsive.scss | 2 +- start-client/src/styles/favorite.scss | 197 ++++++++++++++++++ start-client/src/styles/history.scss | 31 +++ start-client/webpack.common.js | 11 +- start-client/webpack.prod.js | 2 +- 22 files changed, 985 insertions(+), 36 deletions(-) create mode 100644 start-client/src/components/common/favorite/Add.js create mode 100644 start-client/src/components/common/favorite/Favorite.js create mode 100644 start-client/src/components/common/favorite/Modal.js create mode 100644 start-client/src/components/common/favorite/Utils.js create mode 100644 start-client/src/components/common/favorite/index.js create mode 100644 start-client/src/styles/favorite.scss diff --git a/start-client/dev/api.mock.json b/start-client/dev/api.mock.json index de9d03c893..da16d3ef3e 100644 --- a/start-client/dev/api.mock.json +++ b/start-client/dev/api.mock.json @@ -1388,7 +1388,10 @@ "packaging": { "type": "single-select", "default": "jar", - "values": [{ "id": "jar", "name": "Jar" }, { "id": "war", "name": "War" }] + "values": [ + { "id": "jar", "name": "Jar" }, + { "id": "war", "name": "War" } + ] }, "javaVersion": { "type": "single-select", diff --git a/start-client/src/components/Application.js b/start-client/src/components/Application.js index 0add014ec4..594035c058 100644 --- a/start-client/src/components/Application.js +++ b/start-client/src/components/Application.js @@ -25,6 +25,7 @@ const Explore = lazy(() => import('./common/explore/Explore')) const Share = lazy(() => import('./common/share/Share')) const History = lazy(() => import('./common/history/History')) const HotKeys = lazy(() => import('./common/builder/HotKeys')) +const Favorite = lazy(() => import('./common/favorite/Favorite')) export default function Application() { const { @@ -34,6 +35,9 @@ export default function Application() { share: shareOpen, explore: exploreOpen, history: historyOpen, + favorite: favoriteOpen, + favoriteAdd: favoriteAddOpen, + favoriteOptions, list, dependencies, } = useContext(AppContext) @@ -73,7 +77,9 @@ export default function Application() { share: false, explore: false, nav: false, - history: false, + history: favoriteOptions.back === 'history', + favorite: favoriteOptions.back === 'favorite', + favoriteAdd: false, }, }) } @@ -120,6 +126,10 @@ export default function Application() { dispatch({ type: 'UPDATE', payload: { share: true } }) } + const onFavoriteAdd = () => { + dispatch({ type: 'UPDATE', payload: { favoriteAdd: true } }) + } + return ( <> @@ -157,6 +167,7 @@ export default function Application() { onSubmit={onSubmit} onShare={onShare} onExplore={onExplore} + onFavoriteAdd={onFavoriteAdd} refExplore={buttonExplore} refSubmit={buttonSubmit} refDependency={buttonDependency} @@ -177,6 +188,11 @@ export default function Application() { onClose={onEscape} /> + ) diff --git a/start-client/src/components/common/builder/Fields.js b/start-client/src/components/common/builder/Fields.js index 9b94940eca..76cc16f147 100644 --- a/start-client/src/components/common/builder/Fields.js +++ b/start-client/src/components/common/builder/Fields.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types' import get from 'lodash/get' -import React, { useContext } from 'react' +import React, { useContext, useRef, useState, useEffect } from 'react' import Actions from './Actions' import Control from './Control' @@ -18,12 +18,15 @@ function Fields({ onSubmit, onExplore, onShare, + onFavoriteAdd, refExplore, refSubmit, refDependency, generating, }) { + const wrapper = useRef(null) const windowsUtils = useWindowsUtils() + const [dropdown, setDropdown] = useState(false) const { config, dispatch, dependencies } = useContext(AppContext) const { values, @@ -34,6 +37,19 @@ function Fields({ dispatchInitializr({ type: 'UPDATE', payload: args }) } + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + setDropdown(false) + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, []) + return ( <>

    @@ -183,9 +199,40 @@ function Fields({ > Explore - + + + + {dropdown && ( +
    + + +
    + )} +
    ) @@ -196,6 +243,7 @@ Fields.propTypes = { onSubmit: PropTypes.func.isRequired, onExplore: PropTypes.func.isRequired, onShare: PropTypes.func.isRequired, + onFavoriteAdd: PropTypes.func.isRequired, refExplore: PropTypes.oneOfType([ PropTypes.func, PropTypes.shape({ current: PropTypes.instanceOf(Element) }), diff --git a/start-client/src/components/common/builder/Loading.js b/start-client/src/components/common/builder/Loading.js index e61fee269e..8b8222a96b 100644 --- a/start-client/src/components/common/builder/Loading.js +++ b/start-client/src/components/common/builder/Loading.js @@ -12,8 +12,9 @@ export default function Loading() {
    - - + + +
    diff --git a/start-client/src/components/common/favorite/Add.js b/start-client/src/components/common/favorite/Add.js new file mode 100644 index 0000000000..b36f080c22 --- /dev/null +++ b/start-client/src/components/common/favorite/Add.js @@ -0,0 +1,185 @@ +import PropTypes from 'prop-types' +import get from 'lodash/get' +import React, { useEffect, useRef, useContext, useState } from 'react' +import { CSSTransition, TransitionGroup } from 'react-transition-group' +import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' +import queryString from 'query-string' +import { toast } from 'react-toastify' +import FieldInput from '../builder/FieldInput' +import { Button } from '../form' +import { AppContext } from '../../reducer/App' +import { InitializrContext } from '../../reducer/Initializr' +import { + getLabelFromList, + getLabelFromDepsList, + getBookmarkDefaultName, +} from './Utils' + +function FavoriteItem({ value }) { + const { config } = useContext(AppContext) + const params = queryString.parse(value) + const deps = get(params, 'dependencies', '') + .split(',') + .filter(dep => !!dep) + return ( +
    + + + Project{' '} + + {getLabelFromList( + get(config, 'lists.project'), + get(params, 'type') + )} + + {`, `} + Language{' '} + + {getLabelFromList( + get(config, 'lists.language'), + get(params, 'language') + )} + + {`, `} + Spring Boot{' '} + + {getLabelFromList( + get(config, 'lists.boot'), + get(params, 'platformVersion') + )} + + + + {deps.length === 0 && 'No dependency'} + {deps.length > 0 && ( + <> + Dependencies:{' '} + + {deps + .map(dep => + getLabelFromDepsList(get(config, 'lists.dependencies'), dep) + ) + .join(', ')} + + + )} + + +
    + ) +} + +FavoriteItem.propTypes = { + value: PropTypes.string.isRequired, +} + +function Add({ open, onClose }) { + const wrapper = useRef(null) + const { share } = useContext(InitializrContext) + const { dispatch, favoriteOptions } = useContext(AppContext) + const [name, setName] = useState() + const input = useRef(null) + + const title = get(favoriteOptions, 'title', '') || 'Bookmark' + const button = get(favoriteOptions, 'button', '') || 'Save' + const value = get(favoriteOptions, 'favorite.value', '') || share + const nameFav = get(favoriteOptions, 'favorite.name', '') + + useEffect(() => { + setName(nameFav || `${getBookmarkDefaultName()}`) + }, [setName, open, nameFav]) + + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + onClose() + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, [onClose]) + + useEffect(() => { + if (get(wrapper, 'current') && open) { + disableBodyScroll(get(wrapper, 'current')) + } + if (get(input, 'current')) { + get(input, 'current').focus() + } + return () => { + clearAllBodyScrollLocks() + } + }, [wrapper, open]) + + const onSubmit = e => { + e.preventDefault() + if (!get(favoriteOptions, 'button', '')) { + dispatch({ type: 'ADD_FAVORITE', payload: { values: value, name } }) + toast.success('Project bookmarked') + } else { + dispatch({ + type: 'UPDATE_FAVORITE', + payload: { name, favorite: favoriteOptions.favorite }, + }) + } + onClose() + } + + return ( + + {open && ( + +
    +
    +
    +
    +

    {title}

    +
    +
    + + { + setName(`${event.target.value}`) + }} + /> +
    +
    + + +
    +
    +
    +
    +
    + )} +
    + ) +} + +Add.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Add diff --git a/start-client/src/components/common/favorite/Favorite.js b/start-client/src/components/common/favorite/Favorite.js new file mode 100644 index 0000000000..2116f98dfb --- /dev/null +++ b/start-client/src/components/common/favorite/Favorite.js @@ -0,0 +1,26 @@ +import '../../../styles/favorite.scss' + +import PropTypes from 'prop-types' +import React from 'react' + +import Modal from './Modal' +import Add from './Add' +import { Overlay } from '../form' + +function Favorite({ open, add, onClose }) { + return ( + <> + + + + + ) +} + +Favorite.propTypes = { + open: PropTypes.bool.isRequired, + add: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Favorite diff --git a/start-client/src/components/common/favorite/Modal.js b/start-client/src/components/common/favorite/Modal.js new file mode 100644 index 0000000000..a587c6c8dd --- /dev/null +++ b/start-client/src/components/common/favorite/Modal.js @@ -0,0 +1,191 @@ +import PropTypes from 'prop-types' +import get from 'lodash/get' +import React, { useEffect, useRef, useContext } from 'react' +import { CSSTransition, TransitionGroup } from 'react-transition-group' +import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' +import queryString from 'query-string' +import { AppContext } from '../../reducer/App' +import { getLabelFromList, getLabelFromDepsList } from './Utils' +import { IconEdit, IconDelete } from '../icons' + +function FavoriteItem({ name, value, onClose, onRemove, onUpdate }) { + const { config } = useContext(AppContext) + const params = queryString.parse(value) + const deps = get(params, 'dependencies', '') + .split(',') + .filter(dep => !!dep) + return ( +
  • + { + onClose() + }} + > + {name} + + + Project{' '} + + {getLabelFromList( + get(config, 'lists.project'), + get(params, 'type') + )} + + {`, `} + Language{' '} + + {getLabelFromList( + get(config, 'lists.language'), + get(params, 'language') + )} + + {`, `} + Spring Boot{' '} + + {getLabelFromList( + get(config, 'lists.boot'), + get(params, 'platformVersion') + )} + + + + {deps.length === 0 && 'No dependency'} + {deps.length > 0 && ( + <> + Dependencies:{' '} + + {deps + .map(dep => + getLabelFromDepsList( + get(config, 'lists.dependencies'), + dep + ) + ) + .join(', ')} + + + )} + + + + + +
  • + ) +} + +FavoriteItem.propTypes = { + name: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired, + onRemove: PropTypes.func.isRequired, + onUpdate: PropTypes.func.isRequired, +} + +function Modal({ open, onClose }) { + const wrapper = useRef(null) + const { favorites, dispatch } = useContext(AppContext) + + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + onClose() + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, [onClose]) + + useEffect(() => { + if (get(wrapper, 'current') && open) { + disableBodyScroll(get(wrapper, 'current')) + } + return () => { + clearAllBodyScrollLocks() + } + }, [wrapper, open]) + + const onRemove = favorite => { + dispatch({ type: 'REMOVE_FAVORITE', payload: favorite }) + } + + const onUpdate = favorite => { + dispatch({ + type: 'UPDATE', + payload: { + favorite: false, + favoriteAdd: true, + favoriteOptions: { + title: 'Edit bookmark', + button: 'Update', + back: 'favorite', + favorite, + }, + }, + }) + } + + return ( + + {open && ( + +
    +
    +
    +

    Bookmarks

    +
    +
    +
    + {favorites.map(favorite => ( + { + onRemove(favorite) + }} + onUpdate={() => { + onUpdate(favorite) + }} + /> + ))} +
    +
    + +
    +
    +
    + )} +
    + ) +} + +Modal.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Modal diff --git a/start-client/src/components/common/favorite/Utils.js b/start-client/src/components/common/favorite/Utils.js new file mode 100644 index 0000000000..624bc782e0 --- /dev/null +++ b/start-client/src/components/common/favorite/Utils.js @@ -0,0 +1,16 @@ +import { DateTime } from 'luxon' + +export function getLabelFromList(list, key) { + return list.find(item => item.key === key)?.text || key +} + +export function getLabelFromDepsList(list, key) { + return list.find(item => item.id === key)?.name || key +} + +export function getBookmarkDefaultName() { + const date = DateTime.now() + return `Bookmark ${date.toLocaleString( + DateTime.DATE_SHORT + )} ${date.toLocaleString(DateTime.TIME_24_SIMPLE)}` +} diff --git a/start-client/src/components/common/favorite/index.js b/start-client/src/components/common/favorite/index.js new file mode 100644 index 0000000000..ab8695c9c6 --- /dev/null +++ b/start-client/src/components/common/favorite/index.js @@ -0,0 +1 @@ +export { default as Favorite } from './Favorite' diff --git a/start-client/src/components/common/form/Button.js b/start-client/src/components/common/form/Button.js index 20b08218b6..f70e2a5dbd 100644 --- a/start-client/src/components/common/form/Button.js +++ b/start-client/src/components/common/form/Button.js @@ -6,13 +6,16 @@ function Button({ onClick, children, variant, + className, hotkey, refButton, disabled, }) { return ( ) } diff --git a/start-client/src/components/common/icons/Icons.js b/start-client/src/components/common/icons/Icons.js index 9318ca56f1..60db8713f5 100644 --- a/start-client/src/components/common/icons/Icons.js +++ b/start-client/src/components/common/icons/Icons.js @@ -399,3 +399,69 @@ export function IconHistory() { ) } + +export function IconFavorite() { + return ( + + ) +} + +export function IconDelete() { + return ( + + ) +} + +export function IconEdit() { + return ( + + ) +} diff --git a/start-client/src/components/common/icons/index.js b/start-client/src/components/common/icons/index.js index 7fa600b408..8ae64b986c 100644 --- a/start-client/src/components/common/icons/index.js +++ b/start-client/src/components/common/icons/index.js @@ -17,5 +17,8 @@ export { IconMoon } from './Icons' export { IconRemove } from './Icons' export { IconEnter } from './Icons' export { IconHistory } from './Icons' +export { IconFavorite } from './Icons' +export { IconEdit } from './Icons' +export { IconDelete } from './Icons' export { IconSpring } from './IconSpring' diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index 12596f1eda..b20e9a454b 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -5,14 +5,14 @@ import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' import Header from './Header' import { AppContext } from '../../reducer/App' -import { IconGithub, IconHistory } from '../icons' +import { IconGithub, IconHistory, IconFavorite } from '../icons' function SideLeft() { const [isOpen, setIsOpen] = useState(false) const [lock, setLock] = useState(false) const wrapper = useRef(null) - const { nav, histories, dispatch } = useContext(AppContext) + const { nav, histories, dispatch, favorites } = useContext(AppContext) useEffect(() => { if (get(wrapper, 'current') && nav) { @@ -61,20 +61,43 @@ function SideLeft() { - {!isOpen && !lock && histories.length > 0 && ( + {!isOpen && !lock && ( <> -
    - + {favorites.length > 0 && ( + <> +
    + + + )} + {histories.length > 0 && ( + <> +
    + + + )} )}
    diff --git a/start-client/src/components/reducer/App.js b/start-client/src/components/reducer/App.js index 6f5763ff8e..fb36a5f153 100644 --- a/start-client/src/components/reducer/App.js +++ b/start-client/src/components/reducer/App.js @@ -13,6 +13,8 @@ export const defaultAppContext = { explore: false, share: false, history: false, + favorite: false, + favoriteAdd: false, nav: false, list: false, theme: 'light', @@ -22,7 +24,14 @@ export const defaultAppContext = { list: [], groups: [], }, + favoriteOptions: { + title: '', + button: '', + favorite: null, + back: '', + }, histories: [], + favorites: [], } const localStorage = @@ -80,6 +89,14 @@ export function reducer(state, action) { if (key === 'theme') { localStorage.setItem('springtheme', value) } + if (key === 'favoriteAdd' && !value) { + newState.favoriteOptions = { + title: '', + button: '', + favorite: null, + back: '', + } + } return key }) return newState @@ -110,7 +127,18 @@ export function reducer(state, action) { const histories = localStorage.getItem('histories') ? JSON.parse(localStorage.getItem('histories')) : [] - return { ...state, complete: true, config: json, dependencies, histories } + + const favorites = localStorage.getItem('favorites') + ? JSON.parse(localStorage.getItem('favorites')) + : [] + return { + ...state, + complete: true, + config: json, + dependencies, + histories, + favorites, + } } case 'ADD_HISTORY': { const newHistory = get(action, 'payload') @@ -128,6 +156,49 @@ export function reducer(state, action) { localStorage.setItem('histories', JSON.stringify([])) return { ...state, histories: [] } } + case 'ADD_FAVORITE': { + const favorites = [ + { + date: new Date().toISOString(), + name: get(action, 'payload.name'), + value: get(action, 'payload.values'), + }, + ...state.favorites, + ] + localStorage.setItem('favorites', JSON.stringify(favorites)) + return { ...state, favorites } + } + case 'UPDATE_FAVORITE': { + const favoriteToUpdate = get(action, 'payload.favorite') + const favorites = state.favorites.map(item => { + if ( + item.name === favoriteToUpdate.name && + item.date === favoriteToUpdate.date && + item.value === favoriteToUpdate.value + ) { + return { + ...item, + name: get(action, 'payload.name'), + } + } + return item + }) + localStorage.setItem('favorites', JSON.stringify(favorites)) + return { ...state, favorites } + } + case 'REMOVE_FAVORITE': { + const favoriteToRemove = get(action, 'payload') + const favorites = state.favorites.filter( + item => + !( + item.name === favoriteToRemove.name && + item.date === favoriteToRemove.date && + item.value === favoriteToRemove.value + ) + ) + localStorage.setItem('favorites', JSON.stringify(favorites)) + return { ...state, favorites } + } default: return state } diff --git a/start-client/src/styles/_dark.scss b/start-client/src/styles/_dark.scss index 6b00b3cfb0..91d96ae387 100644 --- a/start-client/src/styles/_dark.scss +++ b/start-client/src/styles/_dark.scss @@ -401,16 +401,34 @@ body.dark { background: $dark-background; } - .modal-share .modal-header { - background: $dark-background; - border-bottom: 1px solid $dark-border; + .modal-share, + .modal-add-favorite, + .modal-favorite { + .modal-header { + background: $dark-background; + border-bottom: 1px solid $dark-border; + } } - .modal-history-container { + .modal-history-container, + .modal-favorite-container, + .modal-add-favorite-container { border: 1px solid $dark-border; } .modal-content { background: $dark-background; } + .modal-add-favorite .favorite-desc { + background: $dark-background-secondary; + color: $dark-color; + } + .modal-favorite button.edit, + .modal-favorite button.remove, + .modal-share .modal-content button.favorite { + color: white; + } + .actions .button.clicked { + color: #000; + } .modal-content .list a.item { background: $dark-background-secondary; color: $dark-color; diff --git a/start-client/src/styles/_main.scss b/start-client/src/styles/_main.scss index 3151915409..7b21087917 100644 --- a/start-client/src/styles/_main.scss +++ b/start-client/src/styles/_main.scss @@ -582,13 +582,32 @@ button.button { span { padding: 0.9rem 1.5rem 0.8rem; } + &.clicked { + color: white; + &:before { + opacity: 1; + } + } &:focus { box-shadow: 0 0 0 4px darken($light-border, 6); } - &:last-child { + &.last-child { margin-right: 0; } } + .dropdown { + position: relative; + .dropdown-items { + position: absolute; + bottom: 35px; + left: -50px; + text-align: center; + .button { + margin: 4px 0; + width: 160px; + } + } + } } .colset-main { @@ -1320,7 +1339,7 @@ ul.dependencies-list { width: 249.42px; } &-share { - width: 119px; + width: 62.3px; } &-dep { width: 241.8px; diff --git a/start-client/src/styles/_responsive.scss b/start-client/src/styles/_responsive.scss index 3ebe0d3953..827ac116dc 100644 --- a/start-client/src/styles/_responsive.scss +++ b/start-client/src/styles/_responsive.scss @@ -244,7 +244,7 @@ width: 88.55px; } .placeholder-button-share { - width: 82.77px; + width: 33px; } .placeholder-button-download { width: 108.73px; diff --git a/start-client/src/styles/favorite.scss b/start-client/src/styles/favorite.scss new file mode 100644 index 0000000000..ba82f2002d --- /dev/null +++ b/start-client/src/styles/favorite.scss @@ -0,0 +1,197 @@ +@import 'variables'; +@import 'mixins'; + +$w_arrow: 12px; +$w: 1000px; +$w2: 500px; + +.modal-add-favorite, +.modal-favorite { + z-index: 10000; + position: fixed; + top: 50px; + left: 0; + right: 0; + + .modal-favorite-container, + .modal-add-favorite-container { + max-width: $w; + margin: 0 auto; + background: white; + } + + .modal-add-favorite-container { + max-width: $w2; + } + + @include transition(all $spring-transition-duration); + &:before { + $h: 60px; + content: ' '; + height: $h; + width: $w; + position: absolute; + bottom: -$h; + left: 0; + } + .modal-content { + padding: $spring-8points * 3; + padding-top: $spring-8points; + padding-bottom: $spring-8points * 2; + max-height: 70vh; + overflow: auto; + .list { + .name { + font-weight: bold; + display: block; + } + ul { + padding: 0; + margin: 0 0 10px; + } + li { + position: relative; + list-style: none; + padding: 1px 0; + margin: 0; + } + a.item { + display: block; + position: relative; + background: $light-background-seconday; + border-radius: 3px; + text-decoration: none; + padding: 5px 10px; + color: $light-color; + padding-right: 80px; + &:hover { + background: lighten($light-background-seconday, 2); + a { + opacity: 1; + } + } + } + .time { + width: 80px; + } + .time, + .desc, + .main, + .deps { + display: block; + } + } + } + .modal-header { + position: relative; + padding: 6px $spring-8points * 2 2px; + border-bottom: 1px solid #ebebeb; + h1 { + font-size: $spring-8points * 2.5; + line-height: $spring-8points * 2.5; + font-weight: 600; + } + .button { + position: absolute; + top: 11px; + right: 11px; + font-size: $spring-font-size - 3; + line-height: 0.7rem; + margin-right: 0; + } + } + .modal-action { + text-align: center; + border-top: 1px solid $light-border; + padding: 16px 0 8px; + } + button.remove, + button.edit { + $size: 38px; + display: block; + position: absolute; + width: $size; + right: 10px; + top: 50%; + margin-top: -(calc($size / 2)); + border: 0 none; + cursor: pointer; + background: transparent; + opacity: 0.4; + @include outline; + @include transition(all 150ms); + .a-content { + display: block; + outline: none; + box-shadow: none; + padding: 8px; + } + svg { + display: block; + } + &:hover { + opacity: 0.8; + } + &:focus { + opacity: 1; + } + } + button.edit { + $size: 32px; + right: 45px; + width: $size; + margin-top: -(calc($size / 2)); + svg { + .st0 { + fill: #000; + } + } + } +} + +.modal-enter { + opacity: 0; +} + +.modal-enter-active { + opacity: 1; + transition: all 300ms; +} + +.modal-exit { + opacity: 1; +} + +.modal-exit-active { + opacity: 0; + transition: all 300ms; +} + +.modal-add-favorite { + .control-inline { + flex: none; + display: block; + label { + text-align: left; + flex: none; + display: block; + } + .input { + margin: 0; + } + } + .modal-action { + padding: 16px 0 16px; + } + .favorite-desc { + background: $light-background-seconday; + padding: 8px; + margin: 8px 0; + border-radius: 3px; + .deps { + display: block; + } + } +} + +@import 'responsive'; diff --git a/start-client/src/styles/history.scss b/start-client/src/styles/history.scss index 9d1ace6786..cfde1e9156 100644 --- a/start-client/src/styles/history.scss +++ b/start-client/src/styles/history.scss @@ -46,6 +46,7 @@ $w: 1000px; list-style: none; padding: 1px 0; margin: 0; + position: relative; } a.item { position: relative; @@ -73,6 +74,36 @@ $w: 1000px; display: block; } } + button.favorite { + $size: 42px; + display: block; + position: absolute; + width: $size; + right: 10px; + top: 50%; + margin-top: -(calc($size / 2)-4); + border: 0 none; + cursor: pointer; + background: transparent; + opacity: 0.4; + @include outline; + @include transition(all 150ms); + .a-content { + display: block; + outline: none; + box-shadow: none; + padding: 8px; + } + svg { + display: block; + } + &:hover { + opacity: 0.8; + } + &:focus { + opacity: 1; + } + } } .modal-header { position: relative; diff --git a/start-client/webpack.common.js b/start-client/webpack.common.js index aed7ad0ac7..582bf9f0bc 100644 --- a/start-client/webpack.common.js +++ b/start-client/webpack.common.js @@ -50,7 +50,16 @@ const config = { }, { test: /\.s[ac]ss$/i, - use: ['style-loader', 'css-loader', 'sass-loader'], + use: [ + 'style-loader', + 'css-loader', + { + loader: 'sass-loader', + options: { + warnRuleAsWarning: false, + }, + }, + ], }, { test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/, diff --git a/start-client/webpack.prod.js b/start-client/webpack.prod.js index e255d8e928..15c96637ac 100644 --- a/start-client/webpack.prod.js +++ b/start-client/webpack.prod.js @@ -25,7 +25,7 @@ const config = { plugins: [ new BundleAnalyzerPlugin({ analyzerMode: 'static', - openAnalyzer: true, + openAnalyzer: false, generateStatsFile: true, statsFilename: '../analysis/stats.json', reportFilename: '../analysis/bundle-analyzer.html', From a8222b2b636b3c7d6cff95ed2281dd44089139c0 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 10 Dec 2024 08:41:10 +0100 Subject: [PATCH 762/825] Upgrade to Spring Cloud GCP 5.9.0 Closes gh-1665 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 01edc2d8d0..cc887eda02 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -110,7 +110,7 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 5.8.0 + version: 5.9.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 7ef74dd08d48ee02353ddf67bbd62c79e77590b6 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 10 Dec 2024 14:10:09 +0100 Subject: [PATCH 763/825] Update yarn lockfile --- start-client/yarn.lock | 494 +++++++++++++++++++++-------------------- 1 file changed, 251 insertions(+), 243 deletions(-) diff --git a/start-client/yarn.lock b/start-client/yarn.lock index 062f165b3e..d063940431 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -20,9 +20,9 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.25.9.tgz#51036166fd0e9cfb26eee1b9ddc264a0d6d5f843" - integrity sha512-I+02IfrTiSanpxJBlZQYb18qCxB6c2Ih371cVpfgIrPQrjAYkf45XxomTJOG8JBWX5GY35/+TmhCMdJ4ZPkL8Q== + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.26.4.tgz#4101ff8ee5de8447a6c395397a97921056411d20" + integrity sha512-+mORf3ezU3p3qr+82WvJSnQNE1GAYeoCfEv4fik6B5/2cvKZ75AX8oawWQdXtM9MmndooQj15Jr9kelRFWsuRw== dependencies: "@jridgewell/trace-mapping" "^0.3.25" commander "^6.2.0" @@ -35,7 +35,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.6.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -45,9 +45,9 @@ picocolors "^1.0.0" "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" - integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": version "7.26.0" @@ -79,13 +79,13 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" - integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== +"@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== dependencies: - "@babel/parser" "^7.26.2" - "@babel/types" "^7.26.0" + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -97,14 +97,6 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9" - integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" @@ -130,12 +122,12 @@ semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26" - integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz#5169756ecbe1d95f7866b90bb555b022595302a0" + integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== dependencies: "@babel/helper-annotate-as-pure" "^7.25.9" - regexpu-core "^6.1.1" + regexpu-core "^6.2.0" semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3": @@ -204,14 +196,6 @@ "@babel/helper-optimise-call-expression" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/helper-simple-access@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739" - integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" @@ -252,12 +236,12 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2", "@babel/parser@^7.7.0": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" - integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3", "@babel/parser@^7.7.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== dependencies: - "@babel/types" "^7.26.0" + "@babel/types" "^7.26.3" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -696,11 +680,10 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-exponentiation-operator@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f" - integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-export-namespace-from@^7.25.9": @@ -764,13 +747,12 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-modules-commonjs@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686" - integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== dependencies: - "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-simple-access" "^7.25.9" "@babel/plugin-transform-modules-systemjs@^7.25.9": version "7.25.9" @@ -1102,9 +1084,9 @@ esutils "^2.0.2" "@babel/preset-react@^7.13.13": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.25.9.tgz#5f473035dc2094bcfdbc7392d0766bd42dce173e" - integrity sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.26.3.tgz#7c5e028d623b4683c1f83a0bd4713b9100560caa" + integrity sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw== dependencies: "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-validator-option" "^7.25.9" @@ -1130,22 +1112,22 @@ "@babel/types" "^7.25.9" "@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.25.9", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/types" "^7.26.3" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -2117,9 +2099,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz#3c9997ae9d00bc236e45c6374e84f2596458d9db" - integrity sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA== + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz#812d2871e5eea17fb0bd5214dda7a7b748c0e12a" + integrity sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2259,11 +2241,11 @@ "@types/node" "*" "@types/node@*": - version "22.9.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.1.tgz#bdf91c36e0e7ecfb7257b2d75bf1b206b308ca71" - integrity sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg== + version "22.10.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766" + integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== dependencies: - undici-types "~6.19.8" + undici-types "~6.20.0" "@types/node@16.9.1": version "16.9.1" @@ -2281,9 +2263,9 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@^15.0.0": - version "15.7.13" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" - integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== + version "15.7.14" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== "@types/qs@*": version "6.9.17" @@ -2433,11 +2415,11 @@ eslint-visitor-keys "^3.3.0" "@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" + integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.12.1": +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== @@ -2503,7 +2485,7 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== -"@webassemblyjs/wasm-edit@^1.12.1": +"@webassemblyjs/wasm-edit@^1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== @@ -2538,7 +2520,7 @@ "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.12.1": +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== @@ -3336,16 +3318,23 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + set-function-length "^1.2.2" call-me-maybe@^1.0.1: version "1.0.2" @@ -3404,9 +3393,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001669: - version "1.0.30001683" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz#7f026a2d5d319a9cf8915a1451173052caaadc81" - integrity sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q== + version "1.0.30001687" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz#d0ac634d043648498eedf7a3932836beba90ebae" + integrity sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ== caseless@~0.12.0: version "0.12.0" @@ -3921,9 +3910,9 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: ms "2.0.0" debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" @@ -4184,6 +4173,15 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dunder-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.0.tgz#c2fce098b3c8f8899554905f4377b6d85dabaa80" + integrity sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -4210,9 +4208,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.5.41: - version "1.5.63" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz#69444d592fbbe628d129866c2355691ea93eda3e" - integrity sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA== + version "1.5.72" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz#a732805986d3a5b5fedd438ddf4616c7d78ac2df" + integrity sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw== emittery@^0.10.2: version "0.10.2" @@ -4298,7 +4296,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5: version "1.23.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb" integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ== @@ -4350,12 +4348,10 @@ es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23 unbox-primitive "^1.0.2" which-typed-array "^1.1.15" -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" @@ -4412,13 +4408,13 @@ es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: hasown "^2.0.0" es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" @@ -4841,9 +4837,9 @@ expect@^28.1.3: jest-util "^28.1.3" express@^4.17.3: - version "4.21.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" - integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" @@ -4864,7 +4860,7 @@ express@^4.17.3: methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.10" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" qs "6.13.0" range-parser "~1.2.1" @@ -5335,16 +5331,19 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.5.tgz#dfe7dd1b30761b464fe51bf4bb00ac7c37b681e7" + integrity sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg== dependencies: + call-bind-apply-helpers "^1.0.0" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" es-errors "^1.3.0" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" @@ -5478,7 +5477,7 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globalthis@^1.0.3, globalthis@^1.0.4: +globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== @@ -5532,12 +5531,10 @@ globule@^1.0.0: lodash "^4.17.21" minimatch "~3.0.2" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.1.0, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" @@ -5584,7 +5581,7 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-bigints@^1.0.1, has-bigints@^1.0.2: +has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -5606,15 +5603,17 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== +has-proto@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" @@ -6119,12 +6118,12 @@ is-async-function@^2.0.0: dependencies: has-tostringtag "^1.0.0" -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: - has-bigints "^1.0.1" + has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" @@ -6133,13 +6132,13 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.0.tgz#9743641e80a62c094b5941c5bb791d66a88e497a" + integrity sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" is-buffer@^1.1.5: version "1.1.6" @@ -6158,7 +6157,7 @@ is-builtin-module@^3.0.0: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -6191,7 +6190,7 @@ is-data-view@^1.0.1: dependencies: is-typed-array "^1.1.13" -is-date-object@^1.0.1, is-date-object@^1.0.5: +is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -6241,12 +6240,12 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== +is-finalizationregistry@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz#d74a7d0c5f3578e34a20729e69202e578d495dc2" + integrity sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -6316,12 +6315,13 @@ is-negative-zero@^2.0.3: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +is-number-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.0.tgz#5a867e9ecc3d294dda740d9f127835857af7eb05" + integrity sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw== dependencies: - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" is-number@^3.0.0: version "3.0.0" @@ -6368,12 +6368,14 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: isobject "^3.0.1" is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.0.tgz#41b9d266e7eb7451312c64efc37e8a7d453077cf" + integrity sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + gopd "^1.1.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" is-regexp@^1.0.0: version "1.0.0" @@ -6402,19 +6404,22 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-string@^1.0.7, is-string@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.0.tgz#8cb83c5d57311bf8058bc6c8db294711641da45d" + integrity sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g== dependencies: - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.4, is-symbol@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.0.tgz#ae993830a56d4781886d39f9f0a46b3e89b7b60b" + integrity sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A== dependencies: - has-symbols "^1.0.2" + call-bind "^1.0.7" + has-symbols "^1.0.3" + safe-regex-test "^1.0.3" is-typed-array@^1.1.13: version "1.1.13" @@ -7963,9 +7968,9 @@ nan@^2.13.2: integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== nanomatch@^1.2.9: version "1.2.13" @@ -8056,9 +8061,9 @@ node-int64@^0.4.0: integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== node-sass@^7.0.1: version "7.0.3" @@ -8533,10 +8538,10 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path-type@^3.0.0: version "3.0.0" @@ -8813,9 +8818,9 @@ proxy-addr@~2.0.7: ipaddr.js "1.9.1" psl@^1.1.28: - version "1.11.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.11.0.tgz#56fed2560dcb74a9c374f8e6f6596b328b26699c" - integrity sha512-pjFdcBXT4g061k/SQkzNCRnav+1RdIOgrcX8hs5eL3CEQcFZP9qT8T1RWYxGKT11rH1DdIW+kJRfCYykBJuerQ== + version "1.15.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== dependencies: punycode "^2.3.1" @@ -9079,18 +9084,19 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== +reflect.getprototypeof@^1.0.4, reflect.getprototypeof@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz#c58afb17a4007b4d1118c07b92c23fca422c5d82" + integrity sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" define-properties "^1.2.1" - es-abstract "^1.23.1" + dunder-proto "^1.0.0" + es-abstract "^1.23.5" es-errors "^1.3.0" get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" + gopd "^1.2.0" + which-builtin-type "^1.2.0" regenerate-unicode-properties@^10.2.0: version "10.2.0" @@ -9144,15 +9150,15 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac" - integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw== +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.2.0" regjsgen "^0.8.0" - regjsparser "^0.11.0" + regjsparser "^0.12.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" @@ -9161,10 +9167,10 @@ regjsgen@^0.8.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== -regjsparser@^0.11.0: - version "0.11.2" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.2.tgz#7404ad42be00226d72bcf1f003f1f441861913d8" - integrity sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA== +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: jsesc "~3.0.2" @@ -9458,9 +9464,9 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.81.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.81.0.tgz#a9010c0599867909dfdbad057e4a6fbdd5eec941" - integrity sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA== + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.82.0.tgz#30da277af3d0fa6042e9ceabd0d984ed6d07df70" + integrity sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q== dependencies: chokidar "^4.0.0" immutable "^5.0.2" @@ -9605,7 +9611,7 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.2.1: +set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -9684,9 +9690,9 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" @@ -10321,9 +10327,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.36.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e" - integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== + version "5.37.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" + integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10590,9 +10596,9 @@ typed-array-byte-length@^1.0.1: is-typed-array "^1.1.13" typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz#3fa9f22567700cc86aaf86a1e7176f74b59600f2" + integrity sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw== dependencies: available-typed-arrays "^1.0.7" call-bind "^1.0.7" @@ -10600,18 +10606,19 @@ typed-array-byte-offset@^1.0.2: gopd "^1.0.1" has-proto "^1.0.3" is-typed-array "^1.1.13" + reflect.getprototypeof "^1.0.6" typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-proto "^1.0.3" is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typescript@^4.7.3: version "4.9.5" @@ -10628,10 +10635,10 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici-types@~6.19.8: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" @@ -11045,15 +11052,15 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.96.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.96.1.tgz#3676d1626d8312b6b10d0c18cc049fba7ac01f0c" - integrity sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA== + version "5.97.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.97.1.tgz#972a8320a438b56ff0f1d94ade9e82eac155fa58" + integrity sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.6" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" acorn "^8.14.0" browserslist "^4.24.0" chrome-trace-event "^1.0.2" @@ -11105,26 +11112,27 @@ whatwg-url@^7.0.0: webidl-conversions "^4.0.2" which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz#2d850d6c4ac37b95441a67890e19f3fda8b6c6d9" + integrity sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + is-bigint "^1.1.0" + is-boolean-object "^1.2.0" + is-number-object "^1.1.0" + is-string "^1.1.0" + is-symbol "^1.1.0" -which-builtin-type@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" - integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== +which-builtin-type@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.0.tgz#58042ac9602d78a6d117c7e811349df1268ba63c" + integrity sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA== dependencies: + call-bind "^1.0.7" function.prototype.name "^1.1.6" has-tostringtag "^1.0.2" is-async-function "^2.0.0" is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" + is-finalizationregistry "^1.1.0" is-generator-function "^1.0.10" is-regex "^1.1.4" is-weakref "^1.0.2" @@ -11149,9 +11157,9 @@ which-module@^2.0.0: integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + version "1.1.16" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.16.tgz#db4db429c4706feca2f01677a144278e4a8c216b" + integrity sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ== dependencies: available-typed-arrays "^1.0.7" call-bind "^1.0.7" From d4d1b6e272b18db57b88b02524026711c317ca13 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 10 Dec 2024 14:29:20 +0200 Subject: [PATCH 764/825] Upgrade to Vaadin 24.5.8 See gh-1666 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index cc887eda02..47ab7fca77 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -148,7 +148,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.3.0,3.5.0-M1)" - version: 24.5.5 + version: 24.5.8 platform: compatibilityRange: "3.3.0" dependencies: From 9534d8c895bab18c532719779c421f2a14432447 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 10 Dec 2024 17:00:40 +0100 Subject: [PATCH 765/825] Fix compatibility range for Vaadin --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 47ab7fca77..ac601e0dbc 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -325,7 +325,7 @@ initializr: artifactId: vaadin-spring-boot-starter description: The full-stack web app platform for Spring. Build views fully in Java with Flow, or in React using Hilla. bom: vaadin - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" links: - rel: guide href: https://spring.io/guides/gs/crud-with-vaadin/ From b3750984ede54fd3c5445dbef2a894496dc94e5d Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 11 Dec 2024 09:16:15 +0100 Subject: [PATCH 766/825] Upgrade to Spring Shell 3.4.0 --- start-site/src/main/resources/application.yml | 6 +++--- .../springshell/SpringShellTestBuildCustomizerTests.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ac601e0dbc..af1adf0c57 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -133,8 +133,8 @@ initializr: artifactId: spring-shell-dependencies versionProperty: spring-shell.version mappings: - - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.3.3 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 3.4.0 timefold-solver: groupId: ai.timefold.solver artifactId: timefold-solver-bom @@ -885,7 +885,7 @@ initializr: id: spring-shell groupId: org.springframework.shell artifactId: spring-shell-starter - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" description: Build command line applications with spring. bom: spring-shell links: diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java index deebee7752..085df995c1 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springshell/SpringShellTestBuildCustomizerTests.java @@ -32,7 +32,7 @@ */ class SpringShellTestBuildCustomizerTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void shellTestIsAddedWithSpringShell() { From 16192d2e5c7cb9ff7a62d99436fc538e9e76ffec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Tue, 10 Dec 2024 16:01:06 +0100 Subject: [PATCH 767/825] Upgrade Timefold Solver to 1.17.0 See gh-1667 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index af1adf0c57..e65ff6563e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -141,7 +141,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.3.0,3.5.0-M1)" - version: 1.16.0 + version: 1.17.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From 60689d8d18797b7bb34ff548cfe85516c37504c0 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 11 Dec 2024 12:57:00 +0100 Subject: [PATCH 768/825] Simplify and speed up verification tests --- .../spring/start/site/DependencyResolver.java | 65 ++++++++++++++----- .../start/site/MetadataVerificationTests.java | 11 ++-- .../ProjectGenerationIntegrationTests.java | 35 ++++------ .../io/spring/start/testsupport/Homes.java | 46 +++---------- .../spring/start/testsupport/HomesTests.java | 18 +++-- 5 files changed, 83 insertions(+), 92 deletions(-) diff --git a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java index fae4953711..1157b64983 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java +++ b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java @@ -49,14 +49,21 @@ import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; import org.eclipse.aether.spi.connector.transport.TransporterFactory; import org.eclipse.aether.spi.locator.ServiceLocator; +import org.eclipse.aether.transfer.AbstractTransferListener; +import org.eclipse.aether.transfer.TransferEvent; +import org.eclipse.aether.transfer.TransferResource; import org.eclipse.aether.transport.http.HttpTransporterFactory; import org.eclipse.aether.util.artifact.JavaScopes; import org.eclipse.aether.util.filter.DependencyFilterUtils; import org.eclipse.aether.util.graph.visitor.FilteringDependencyVisitor; import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; final class DependencyResolver { + private static final Logger LOGGER = LoggerFactory.getLogger(DependencyResolver.class); + static final RemoteRepository mavenCentral = createRemoteRepository("central", "https://repo1.maven.org/maven2", false); @@ -70,12 +77,14 @@ final class DependencyResolver { try { ServiceLocator serviceLocator = createServiceLocator(); DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); + session.setTransferListener(new Slf4jTransferListener()); session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(false, false)); LocalRepository localRepository = new LocalRepository(localRepositoryLocation.toFile()); this.repositorySystem = serviceLocator.getService(RepositorySystem.class); session .setLocalRepositoryManager(this.repositorySystem.newLocalRepositoryManager(session, localRepository)); session.setUserProperties(System.getProperties()); + session.setIgnoreArtifactDescriptorRepositories(true); session.setReadOnly(); this.repositorySystemSession = session; } @@ -98,24 +107,18 @@ static RemoteRepository createRemoteRepository(String id, String url, boolean sn static List resolveDependencies(Homes homes, String groupId, String artifactId, String version, List boms, List repositories) { - Path home = homes.acquire(); + DependencyResolver resolver = new DependencyResolver(homes.get().resolve("repository")); + List managedDependencies = resolver.getManagedDependencies(boms, repositories); + Dependency aetherDependency = new Dependency(new DefaultArtifact(groupId, artifactId, "pom", + resolver.getVersion(groupId, artifactId, version, managedDependencies)), "compile"); + CollectRequest collectRequest = new CollectRequest(aetherDependency, repositories); + collectRequest.setManagedDependencies(managedDependencies); try { - DependencyResolver instance = new DependencyResolver(home.resolve("repository")); - List managedDependencies = instance.getManagedDependencies(boms, repositories); - Dependency aetherDependency = new Dependency(new DefaultArtifact(groupId, artifactId, "pom", - instance.getVersion(groupId, artifactId, version, managedDependencies)), "compile"); - CollectRequest collectRequest = new CollectRequest(aetherDependency, repositories); - collectRequest.setManagedDependencies(managedDependencies); - try { - CollectResult result = instance.collectDependencies(collectRequest); - return DependencyCollector.collect(result.getRoot(), RuntimeTransitiveOnlyDependencyFilter.INSTANCE); - } - catch (DependencyCollectionException ex) { - throw new RuntimeException(ex); - } + CollectResult result = resolver.collectDependencies(collectRequest); + return DependencyCollector.collect(result.getRoot(), RuntimeTransitiveOnlyDependencyFilter.INSTANCE); } - finally { - homes.release(home); + catch (DependencyCollectionException ex) { + throw new RuntimeException(ex); } } @@ -149,6 +152,7 @@ private List resolveManagedDependencies(String groupId, String artif } private CollectResult collectDependencies(CollectRequest dependencyRequest) throws DependencyCollectionException { + LOGGER.info("Resolving {} from {}", dependencyRequest.getRoot(), dependencyRequest.getRepositories()); return this.repositorySystem.collectDependencies(this.repositorySystemSession, dependencyRequest); } @@ -210,4 +214,33 @@ public boolean accept(DependencyNode node, List parents) { } + private static final class Slf4jTransferListener extends AbstractTransferListener { + + @Override + public void transferStarted(TransferEvent event) { + LOGGER.info("Started downloading {}", resourceToString(event.getResource())); + } + + @Override + public void transferCorrupted(TransferEvent event) { + LOGGER.warn("Found corrupted download {}", resourceToString(event.getResource())); + } + + @Override + public void transferSucceeded(TransferEvent event) { + LOGGER.info("Done downloading {} bytes for {}", event.getTransferredBytes(), + resourceToString(event.getResource())); + } + + @Override + public void transferFailed(TransferEvent event) { + LOGGER.info("Failed downloading {}", resourceToString(event.getResource())); + } + + private String resourceToString(TransferResource resource) { + return resource.getRepositoryUrl() + resource.getResourceName(); + } + + } + } diff --git a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java index b170aae24f..6c61d2be19 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java +++ b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; +import java.util.regex.Pattern; import java.util.stream.Stream; import io.spring.initializr.generator.version.Version; @@ -60,6 +61,8 @@ @ActiveProfiles("test") class MetadataVerificationTests { + private static final Pattern MILESTONE_PATTERN = Pattern.compile("M\\d+"); + private final InitializrMetadata metadata; MetadataVerificationTests(@Autowired InitializrMetadataProvider metadataProvider) { @@ -138,11 +141,11 @@ private List getRepositories(Dependency dependency, Version bo } if (bootVersion.getQualifier() != null) { String qualifier = bootVersion.getQualifier().getId(); - if (!qualifier.equals("RELEASE")) { + if (qualifier.contains("SNAPSHOT")) { + repositories.computeIfAbsent("spring-snapshots", this::repositoryForId); + } + else if (MILESTONE_PATTERN.matcher(qualifier).matches()) { repositories.computeIfAbsent("spring-milestones", this::repositoryForId); - if (qualifier.contains("SNAPSHOT")) { - repositories.computeIfAbsent("spring-snapshots", this::repositoryForId); - } } } return new ArrayList<>(repositories.values()); diff --git a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java index d72450a873..ebf358a1cd 100644 --- a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java @@ -130,37 +130,24 @@ void projectBuilds(Version bootVersion, Packaging packaging, Language language, request.setApplicationName("DemoApplication"); request.setDependencies(Arrays.asList("devtools", "configuration-processor")); Path project = this.invoker.invokeProjectStructureGeneration(request).getRootDirectory(); - Path home = acquireHome(buildSystem); - try { - ProcessBuilder processBuilder = createProcessBuilder(project, buildSystem, home); - Path output = TemporaryFiles.newTemporaryDirectory("ProjectGenerationIntegrationTests-projectBuilds") - .resolve("output.log"); - processBuilder.redirectError(output.toFile()); - processBuilder.redirectOutput(output.toFile()); - assertThat(processBuilder.start().waitFor()).describedAs(String.join("\n", Files.readAllLines(output))) - .isEqualTo(0); - } - finally { - releaseHome(buildSystem, home); - } + Path home = getHome(buildSystem); + ProcessBuilder processBuilder = createProcessBuilder(project, buildSystem, home); + Path output = TemporaryFiles.newTemporaryDirectory("ProjectGenerationIntegrationTests-projectBuilds") + .resolve("output.log"); + processBuilder.redirectError(output.toFile()); + processBuilder.redirectOutput(output.toFile()); + assertThat(processBuilder.start().waitFor()).describedAs(String.join("\n", Files.readAllLines(output))) + .isEqualTo(0); } - private Path acquireHome(BuildSystem buildSystem) { + private Path getHome(BuildSystem buildSystem) { return switch (buildSystem.id()) { - case MavenBuildSystem.ID -> Homes.MAVEN.acquire(); - case GradleBuildSystem.ID -> Homes.GRADLE.acquire(); + case MavenBuildSystem.ID -> Homes.MAVEN.get(); + case GradleBuildSystem.ID -> Homes.GRADLE.get(); default -> throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); }; } - private void releaseHome(BuildSystem buildSystem, Path home) { - switch (buildSystem.id()) { - case MavenBuildSystem.ID -> Homes.MAVEN.release(home); - case GradleBuildSystem.ID -> Homes.GRADLE.release(home); - default -> throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); - } - } - private ProcessBuilder createProcessBuilder(Path directory, BuildSystem buildSystem, Path home) { if (buildSystem.id().equals(MavenBuildSystem.ID)) { String command = (isWindows()) ? "mvnw.cmd" : "mvnw"; diff --git a/test-support/src/main/java/io/spring/start/testsupport/Homes.java b/test-support/src/main/java/io/spring/start/testsupport/Homes.java index a13f24dabb..fec5435da4 100644 --- a/test-support/src/main/java/io/spring/start/testsupport/Homes.java +++ b/test-support/src/main/java/io/spring/start/testsupport/Homes.java @@ -20,13 +20,6 @@ import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Queue; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicInteger; - -import org.springframework.util.Assert; /** * Manages Maven and Gradle home directories. @@ -48,46 +41,23 @@ public class Homes { */ public static final Homes GRADLE = new Homes("gradle-home"); - private final Set homes = ConcurrentHashMap.newKeySet(); - - private final Queue freeHomes = new ConcurrentLinkedQueue<>(); - - private final AtomicInteger counter = new AtomicInteger(); + private final Path path; - private final String prefix; - - public Homes(String prefix) { - this.prefix = prefix; + Homes(String name) { + this.path = createTempDirectory(name); } /** - * Acquires a path to the home. Callers are responsible to call {@link #release(Path)} - * when done. + * Returns the path to the home. * @return the path to the home */ - public Path acquire() { - Path home = this.freeHomes.poll(); - if (home == null) { - home = createTempDirectory(); - this.homes.add(home); - } - return home; - } - - /** - * Releases a path to the home. - * @param home the path to the home - */ - public void release(Path home) { - Assert.state(this.homes.contains(home), "Invalid home '%s'".formatted(home)); - this.freeHomes.add(home); + public Path get() { + return this.path; } - private Path createTempDirectory() { + private static Path createTempDirectory(String name) { try { - Path path = TemporaryFiles.getTempDir() - .resolve("homes") - .resolve(this.prefix + "-" + this.counter.getAndIncrement()); + Path path = TemporaryFiles.getTempDir().resolve("homes").resolve(name); Files.createDirectories(path); return path; } diff --git a/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java b/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java index 3411d61ad4..6a52f48ab5 100644 --- a/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java +++ b/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java @@ -16,8 +16,6 @@ package io.spring.start.testsupport; -import java.nio.file.Path; - import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -30,14 +28,14 @@ class HomesTests { @Test - void shouldAcquireNewHome() { - Homes homes = new Homes("test"); - Path home1 = homes.acquire(); - Path home2 = homes.acquire(); - assertThat(home1).isNotEqualTo(home2); - homes.release(home1); - Path home3 = homes.acquire(); - assertThat(home3).isEqualTo(home1); + void shouldGetNewHome() { + Homes test1 = new Homes("test1"); + Homes test1Again = new Homes("test1"); + Homes test2 = new Homes("test2"); + assertThat(test1.get()).isEmptyDirectory(); + assertThat(test1.get()).isEqualTo(test1.get()); + assertThat(test1.get()).isEqualTo(test1Again.get()); + assertThat(test1.get()).isNotEqualTo(test2.get()); } } From 9f5d4b5ca2035c598b3e69a0a1efbe8c847bddf3 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 11 Dec 2024 13:10:57 +0100 Subject: [PATCH 769/825] Bust the repository cache on CI --- .github/workflows/build-and-deploy.yml | 6 +++--- .github/workflows/verification.yml | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index c638a90103..19d720f6c3 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -25,14 +25,14 @@ jobs: - name: Cache Maven/Gradle repositories for tests uses: actions/cache@v4 with: - path: /tmp/start-spring-io-cache + path: /tmp/start-spring-io-cache-2024-12-11 # See https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache key: test-repositories-${{ runner.os }}-${{ github.run_id }} - restore-keys: test-repositories-${{ runner.os }}- + restore-keys: test-repositories-${{ runner.os }} - name: Build with Maven env: - START_SPRING_IO_TMPDIR: /tmp/start-spring-io-cache + START_SPRING_IO_TMPDIR: /tmp/start-spring-io-cache-2024-12-11 run: ./mvnw --batch-mode --update-snapshots verify - name: Set up Azure diff --git a/.github/workflows/verification.yml b/.github/workflows/verification.yml index bd450497f9..cceb291f72 100644 --- a/.github/workflows/verification.yml +++ b/.github/workflows/verification.yml @@ -22,14 +22,14 @@ jobs: - name: Cache Maven/Gradle repositories for tests uses: actions/cache@v4 with: - path: /tmp/start-spring-io-cache + path: /tmp/start-spring-io-cache-2024-12-11 # See https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache - key: test-repositories-ubuntu-latest-${{ github.run_id }} - restore-keys: test-repositories-ubuntu-latest + key: test-repositories-${{ runner.os }}-${{ github.run_id }} + restore-keys: test-repositories-${{ runner.os }} - name: Build with Maven env: - START_SPRING_IO_TMPDIR: /tmp/start-spring-io-cache + START_SPRING_IO_TMPDIR: /tmp/start-spring-io-cache-2024-12-11 run: ./mvnw --batch-mode --update-snapshots --activate-profiles verification verify - name: Send notification From d74b626e0ba55cfd3b2efb45eaac99e3b999e2be Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 11 Dec 2024 13:34:14 +0100 Subject: [PATCH 770/825] Cache node_modules --- .github/workflows/build-and-deploy.yml | 6 ++++++ .github/workflows/verification.yml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 19d720f6c3..367e7fa8cf 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -30,6 +30,12 @@ jobs: key: test-repositories-${{ runner.os }}-${{ github.run_id }} restore-keys: test-repositories-${{ runner.os }} + - name: Cache node_modules + uses: actions/cache@v4 + with: + path: start-client/node_modules + key: node-modules-${{ hashFiles('start-client/yarn.lock') }} + - name: Build with Maven env: START_SPRING_IO_TMPDIR: /tmp/start-spring-io-cache-2024-12-11 diff --git a/.github/workflows/verification.yml b/.github/workflows/verification.yml index cceb291f72..7f50db9ca4 100644 --- a/.github/workflows/verification.yml +++ b/.github/workflows/verification.yml @@ -19,6 +19,12 @@ jobs: distribution: 'liberica' cache: 'maven' + - name: Cache node_modules + uses: actions/cache@v4 + with: + path: start-client/node_modules + key: node-modules-${{ hashFiles('start-client/yarn.lock') }} + - name: Cache Maven/Gradle repositories for tests uses: actions/cache@v4 with: From ac838fa75d335043b9eb85cefcd61c9158b85e0e Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 12 Dec 2024 04:22:34 -0600 Subject: [PATCH 771/825] Upgrade to Netflix DGS 9.2.2 See gh-1670 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e65ff6563e..a79a153408 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -56,7 +56,7 @@ initializr: versionProperty: netflix-dgs.version mappings: - compatibilityRange: "[3.3.0,3.5.0-M1)" - version: 9.2.0 + version: 9.2.2 sentry: groupId: io.sentry artifactId: sentry-bom From 895d7457e238884a01d6594f6a2cf2a6bdc16df3 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Thu, 12 Dec 2024 04:18:26 -0600 Subject: [PATCH 772/825] Upgrade Spring Boot Admin to 3.4.1 See gh-1669 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index a79a153408..aae4ac7623 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -49,7 +49,7 @@ initializr: - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 3.3.6 - compatibilityRange: "[3.4.0,3.5.0-M1)" - version: 3.4.0 + version: 3.4.1 netflix-dgs: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-platform-dependencies From 7dff2ac1db028ee0033738236b987d307b94dab6 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 17 Dec 2024 08:51:04 +0100 Subject: [PATCH 773/825] Upgrade to Spring Cloud Azure 5.19.0 Closes gh-1674 --- start-site/src/main/resources/application.yml | 6 +++--- ...ureDockerComposeProjectGenerationConfigurationTests.java | 2 +- .../SpringAzureProjectGenerationConfigurationTests.java | 2 +- ...reTestcontainersProjectGenerationConfigurationTests.java | 2 +- .../SpringCloudFunctionHelpDocumentCustomizerTests.java | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index aae4ac7623..fd9bfc88e7 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -101,8 +101,8 @@ initializr: artifactId: spring-cloud-azure-dependencies versionProperty: spring-cloud-azure.version mappings: - - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 5.18.0 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 5.19.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies @@ -1310,7 +1310,7 @@ initializr: href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - name: Microsoft Azure bom: spring-cloud-azure - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Azure Support id: azure-support diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java index c976bc74ef..b81e45a30f 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureDockerComposeProjectGenerationConfigurationTests.java @@ -33,7 +33,7 @@ */ class SpringAzureDockerComposeProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void doesNothingWithoutDockerCompose() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java index bda785d2bc..97b1a9f311 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java @@ -38,7 +38,7 @@ */ class SpringAzureProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @ParameterizedTest @MethodSource("azureDependencies") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java index 1f5bffe02c..228040f513 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureTestcontainersProjectGenerationConfigurationTests.java @@ -30,7 +30,7 @@ */ class SpringAzureTestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void springAzureTestcontainersDependencyIsAdded() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java index c5e62c9810..dc6fba6029 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,7 @@ */ class SpringCloudFunctionHelpDocumentCustomizerTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); private static final String AZURE_SECTION_TITLE = "## Running Spring Cloud Function applications on Microsoft Azure"; From 0eefa6faf9d5e836ab55d94b446093439333155b Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 17 Dec 2024 10:07:30 +0100 Subject: [PATCH 774/825] Upgrade to Spring Boot 3.4.0 Closes gh-1672 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index b123c2657e..ac8d0bff56 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.6 + 3.4.0 io.spring.start start-parent @@ -88,7 +88,7 @@ com.azure.spring spring-cloud-azure-dependencies - 5.13.0 + 5.19.0 pom import From 3a28aa788a7db0e89c62bbc7b045fb38110493f5 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 17 Dec 2024 11:06:42 +0100 Subject: [PATCH 775/825] Add entry for spring-projects-experimental/spring-grpc Closes gh-1673 --- .../AbstractGrpcGradleBuildCustomizer.java | 51 +++++ ...AdditionalDependenciesBuildCustomizer.java | 37 ++++ .../GrpcGradleGroovyBuildCustomizer.java | 45 +++++ .../GrpcGradleKotlinBuildCustomizer.java | 48 +++++ .../springgrpc/GrpcMavenBuildCustomizer.java | 87 +++++++++ .../springgrpc/GrpcProjectContributor.java | 38 ++++ .../springgrpc/GrpcVersionResolver.java | 47 +++++ ...ingGrpcProjectGenerationConfiguration.java | 80 ++++++++ .../dependency/springgrpc/package-info.java | 20 ++ .../main/resources/META-INF/spring.factories | 1 + start-site/src/main/resources/application.yml | 21 +++ ...pcProjectGenerationConfigurationTests.java | 175 ++++++++++++++++++ 12 files changed, 650 insertions(+) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/AbstractGrpcGradleBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcAdditionalDependenciesBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleGroovyBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleKotlinBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcProjectContributor.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcVersionResolver.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfiguration.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/package-info.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/AbstractGrpcGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/AbstractGrpcGradleBuildCustomizer.java new file mode 100644 index 0000000000..8717c165d4 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/AbstractGrpcGradleBuildCustomizer.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.buildsystem.gradle.GradleExtensionContainer; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * Abstract base class for {@link BuildCustomizer} to deal withj Gradle based gRPC + * projects. + * + * @author Moritz Halbritter + */ +abstract class AbstractGrpcGradleBuildCustomizer implements BuildCustomizer { + + private static final String GRPC_PLUGIN_VERSION = "0.9.4"; + + private final char quote; + + AbstractGrpcGradleBuildCustomizer(char quote) { + this.quote = quote; + } + + @Override + public void customize(GradleBuild build) { + build.plugins().add("com.google.protobuf", (plugin) -> plugin.setVersion(GRPC_PLUGIN_VERSION)); + customizeExtensions(build.extensions()); + } + + protected abstract void customizeExtensions(GradleExtensionContainer extensions); + + protected String quote(String value) { + return this.quote + value + this.quote; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcAdditionalDependenciesBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcAdditionalDependenciesBuildCustomizer.java new file mode 100644 index 0000000000..0b4f1a8e64 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcAdditionalDependenciesBuildCustomizer.java @@ -0,0 +1,37 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} to add additional dependencies for Spring gRPC. + * + * @author Moritz Halbritter + */ +class GrpcAdditionalDependenciesBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + build.dependencies().add("grpc-services", "io.grpc", "grpc-services", DependencyScope.COMPILE); + build.dependencies() + .add("spring-grpc-test", "org.springframework.grpc", "spring-grpc-test", DependencyScope.TEST_COMPILE); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleGroovyBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleGroovyBuildCustomizer.java new file mode 100644 index 0000000000..f3f4f120b8 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleGroovyBuildCustomizer.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.gradle.GradleExtensionContainer; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} to customize the Groovy DSL Gradle build to build gRPC + * projects. + * + * @author Moritz Halbritter + */ +class GrpcGradleGroovyBuildCustomizer extends AbstractGrpcGradleBuildCustomizer { + + GrpcGradleGroovyBuildCustomizer() { + super('\''); + } + + @Override + protected void customizeExtensions(GradleExtensionContainer extensions) { + extensions.customize("protobuf", (protobuf) -> { + protobuf.nested("protoc", (protoc) -> protoc.attribute("artifact", quote("com.google.protobuf:protoc"))); + protobuf.nested("plugins", (plugins) -> plugins.nested("grpc", + (grpc) -> grpc.attribute("artifact", quote("io.grpc:protoc-gen-grpc-java")))); + protobuf.nested("generateProtoTasks", (generateProtoTasks) -> generateProtoTasks.nested("all()*.plugins", + (plugins) -> plugins.nested("grpc", (grpc) -> grpc.invoke("option", quote("jakarta_omit"))))); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleKotlinBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleKotlinBuildCustomizer.java new file mode 100644 index 0000000000..faf2dc4b5a --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleKotlinBuildCustomizer.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.gradle.GradleExtensionContainer; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} to customize the Kotlin DSL Gradle build to build gRPC + * projects. + * + * @author Moritz Halbritter + */ +class GrpcGradleKotlinBuildCustomizer extends AbstractGrpcGradleBuildCustomizer { + + GrpcGradleKotlinBuildCustomizer() { + super('\"'); + } + + @Override + protected void customizeExtensions(GradleExtensionContainer extensions) { + extensions.customize("protobuf", (protobuf) -> { + protobuf.nested("protoc", (protoc) -> protoc.attribute("artifact", quote("com.google.protobuf:protoc"))); + protobuf.importType("com.google.protobuf.gradle.id"); + protobuf.nested("plugins", (plugins) -> plugins.nested("id(\"grpc\")", + (grpc) -> grpc.attribute("artifact", quote("io.grpc:protoc-gen-grpc-java")))); + protobuf.nested("generateProtoTasks", + (generateProtoTasks) -> generateProtoTasks.nested("all().forEach", + (forEach) -> forEach.nested("it.plugins", (plugins) -> plugins.nested("id(\"grpc\")", + (grpc) -> grpc.invoke("option", quote("jakarta_omit")))))); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java new file mode 100644 index 0000000000..b0304b1321 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java @@ -0,0 +1,87 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.PropertyContainer; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.buildsystem.maven.MavenPluginContainer; +import io.spring.initializr.generator.spring.build.BuildCustomizer; +import io.spring.initializr.generator.version.VersionProperty; + +/** + * {@link BuildCustomizer} to customize the Maven build to build gRPC projects. + * + * @author Moritz Halbritter + */ +class GrpcMavenBuildCustomizer implements BuildCustomizer { + + private static final String OS_PLUGIN_VERSION = "1.7.1"; + + private static final String PROTOBUF_PLUGIN_VERSION = "0.6.1"; + + private final String protobufJavaVersion; + + private final String grpcVersion; + + GrpcMavenBuildCustomizer(String protobufJavaVersion, String grpcVersion) { + this.protobufJavaVersion = protobufJavaVersion; + this.grpcVersion = grpcVersion; + } + + @Override + public void customize(MavenBuild build) { + VersionProperty protobufJava = VersionProperty.of("protobuf-java.version"); + VersionProperty grpc = VersionProperty.of("grpc.version"); + addVersionProperties(build.properties(), protobufJava, grpc); + addOsPlugin(build.plugins()); + addProtobufPlugin(build.plugins(), protobufJava, grpc); + } + + private void addVersionProperties(PropertyContainer properties, VersionProperty protobufJava, + VersionProperty grpc) { + properties.version(protobufJava, this.protobufJavaVersion); + properties.version(grpc, this.grpcVersion); + } + + private void addOsPlugin(MavenPluginContainer plugins) { + plugins.add("kr.motd.maven", "os-maven-plugin", (plugin) -> { + plugin.version(OS_PLUGIN_VERSION); + plugin.execution("initialize", (execution) -> { + execution.phase("initialize"); + execution.goal("detect"); + }); + }); + } + + private void addProtobufPlugin(MavenPluginContainer plugins, VersionProperty protobufJava, VersionProperty grpc) { + plugins.add("org.xolstice.maven.plugins", "protobuf-maven-plugin", (plugin) -> { + plugin.version(PROTOBUF_PLUGIN_VERSION); + plugin.configuration((configuration) -> { + configuration.add("protocArtifact", "com.google.protobuf:protoc:${%s}:exe:${os.detected.classifier}" + .formatted(protobufJava.toStandardFormat())); + configuration.add("pluginId", "grpc-java"); + configuration.add("pluginArtifact", "io.grpc:protoc-gen-grpc-java:${%s}:exe:${os.detected.classifier}" + .formatted(grpc.toStandardFormat())); + }); + plugin.execution("compile", (execution) -> { + execution.goal("compile").goal("compile-custom"); + execution.configuration((configuration) -> configuration.add("pluginParameter", "jakarta_omit")); + }); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcProjectContributor.java new file mode 100644 index 0000000000..13a3cdfb34 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcProjectContributor.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import io.spring.initializr.generator.project.contributor.ProjectContributor; + +/** + * A {@link ProjectContributor} that creates the "src/main/proto" directory. + * + * @author Moritz Halbritter + */ +class GrpcProjectContributor implements ProjectContributor { + + @Override + public void contribute(Path projectRoot) throws IOException { + Path protoDirectory = projectRoot.resolve("src/main/proto"); + Files.createDirectories(protoDirectory); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcVersionResolver.java new file mode 100644 index 0000000000..992c6c304b --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcVersionResolver.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import java.util.Map; + +import io.spring.initializr.versionresolver.MavenVersionResolver; + +import org.springframework.util.function.SingletonSupplier; + +/** + * Resolves dependency versions from 'org.springframework.grpc:spring-grpc-dependencies'. + * + * @author Moritz Halbritter + */ +class GrpcVersionResolver { + + private final SingletonSupplier> versions; + + GrpcVersionResolver(MavenVersionResolver versionResolver, String springGrpcVersion) { + this.versions = SingletonSupplier.of(() -> versionResolver.resolveDependencies("org.springframework.grpc", + "spring-grpc-dependencies", springGrpcVersion)); + } + + String resolveProtobufJavaVersion() { + return this.versions.obtain().get("com.google.protobuf:protobuf-java"); + } + + String resolveGrpcVersion() { + return this.versions.obtain().get("io.grpc:grpc-core"); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfiguration.java new file mode 100644 index 0000000000..f9f0047843 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfiguration.java @@ -0,0 +1,80 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; +import io.spring.initializr.metadata.InitializrMetadata; +import io.spring.initializr.versionresolver.MavenVersionResolver; + +import org.springframework.context.annotation.Bean; + +/** + * Configuration for generation of projects that depend on Spring gRPC. + * + * @author Moritz Halbritter + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("spring-grpc") +class SpringGrpcProjectGenerationConfiguration { + + @Bean + GrpcVersionResolver grpcVersionResolver(ProjectDescription description, InitializrMetadata metadata, + MavenVersionResolver versionResolver) { + String springGrpcVersion = metadata.getConfiguration() + .getEnv() + .getBoms() + .get("spring-grpc") + .resolve(description.getPlatformVersion()) + .getVersion(); + return new GrpcVersionResolver(versionResolver, springGrpcVersion); + } + + @Bean + GrpcAdditionalDependenciesBuildCustomizer grpcAdditionalDependenciesBuildCustomizer() { + return new GrpcAdditionalDependenciesBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) + GrpcGradleGroovyBuildCustomizer grpcGradleGroovyBuildCustomizer() { + return new GrpcGradleGroovyBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) + GrpcGradleKotlinBuildCustomizer grpcGradleKotlinBuildCustomizer() { + return new GrpcGradleKotlinBuildCustomizer(); + } + + @Bean + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + GrpcMavenBuildCustomizer grpcMavenBuildCustomizer(GrpcVersionResolver versionResolver) { + return new GrpcMavenBuildCustomizer(versionResolver.resolveProtobufJavaVersion(), + versionResolver.resolveGrpcVersion()); + } + + @Bean + GrpcProjectContributor grpcProjectContributor() { + return new GrpcProjectContributor(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/package-info.java new file mode 100644 index 0000000000..6735fc2e50 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that depend on Spring gRPC. + */ +package io.spring.start.site.extension.dependency.springgrpc; diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index d4480adf3f..864a5e907f 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -43,6 +43,7 @@ io.spring.start.site.extension.dependency.springazure.SpringAzureTestcontainersP io.spring.start.site.extension.dependency.springboot.SpringBootProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springcloud.SpringCloudProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springdata.SpringDataProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.springgrpc.SpringGrpcProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springintegration.SpringIntegrationProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springkafka.SpringKafkaProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springmodulith.SpringModulithProjectGenerationConfiguration,\ diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index fd9bfc88e7..a4ce25083f 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -119,6 +119,14 @@ initializr: mappings: - compatibilityRange: "[3.3.0,3.5.0-M1)" version: 4.2.0 + spring-grpc: + groupId: org.springframework.grpc + artifactId: spring-grpc-dependencies + versionProperty: spring-grpc.version + mappings: + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 0.3.0-SNAPSHOT + repositories: spring-snapshots spring-modulith: groupId: org.springframework.modulith artifactId: spring-modulith-bom @@ -891,6 +899,19 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-shell/reference/index.html + - name: Spring gRPC [Experimental] + id: spring-grpc + groupId: org.springframework.grpc + artifactId: spring-grpc-spring-boot-starter + compatibilityRange: "[3.4.0,3.5.0-M1)" + description: Experimental support for gRPC, a high performance, open source universal RPC framework. + bom: spring-grpc + links: + - rel: reference + href: https://docs.spring.io/spring-grpc/reference/index.html + - rel: sample + href: https://github.com/spring-projects-experimental/spring-grpc/tree/main/samples + description: Various sample apps using Spring gRPC - name: Ops content: - name: Spring Boot Actuator diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java new file mode 100644 index 0000000000..a4dbc8c0b9 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java @@ -0,0 +1,175 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springgrpc; + +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringGrpcProjectGenerationConfiguration}. + * + * @author Moritz Halbritter + */ +class SpringGrpcProjectGenerationConfigurationTests extends AbstractExtensionTests { + + private static final String SPRING_GRPC = "spring-grpc"; + + @Test + void shouldDoNothingIfSpringGrpcIsntSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotHaveDependency("io.grpc", "grpc-services") + .doesNotHaveDependency("org.springframework.grpc", "spring-grpc-test") + .doesNotContain("os-maven-plugin") + .doesNotContain("protobuf-maven-plugin") + .doesNotHaveProperty("grpc.version") + .doesNotHaveProperty("protobuf-java.version"); + assertThat(generateProject(request)).doesNotContainDirectories("src/main/proto"); + } + + @Test + void shouldAddAdditionalDependenciesForMaven() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + assertThat(mavenPom(request)).hasDependency("io.grpc", "grpc-services", null, Dependency.SCOPE_COMPILE) + .hasDependency("org.springframework.grpc", "spring-grpc-test", null, Dependency.SCOPE_TEST); + } + + @Test + void shouldAddAdditionalDependenciesForGradle() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + request.setType("gradle-project"); + assertThat(gradleBuild(request)).contains("implementation 'io.grpc:grpc-services'") + .contains("testImplementation 'org.springframework.grpc:spring-grpc-test'"); + } + + @Test + void shouldAddGrpcPluginAndConfigurationForGradleGroovy() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + request.setType("gradle-project"); + assertThat(gradleBuild(request)).hasPlugin("com.google.protobuf", "0.9.4").containsIgnoringWhitespaces(""" + protobuf { + protoc { + artifact = 'com.google.protobuf:protoc' + } + plugins { + grpc { + artifact = 'io.grpc:protoc-gen-grpc-java' + } + } + generateProtoTasks { + all()*.plugins { + grpc { + option 'jakarta_omit' + } + } + } + } + """); + } + + @Test + void shouldAddGrpcPluginAndConfigurationForGradleKotlin() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + request.setType("gradle-project-kotlin"); + assertThat(gradleKotlinDslBuild(request)).hasPlugin("com.google.protobuf", "0.9.4") + .contains("import com.google.protobuf.gradle.id") + .containsIgnoringWhitespaces(""" + protobuf { + protoc { + artifact = "com.google.protobuf:protoc" + } + plugins { + id("grpc") { + artifact = "io.grpc:protoc-gen-grpc-java" + } + } + generateProtoTasks { + all().forEach { + it.plugins { + id("grpc") { + option("jakarta_omit") + } + } + } + } + } + """); + } + + @Test + void shouldAddOsPluginForMaven() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + kr.motd.maven + os-maven-plugin + 1.7.1 + + + initialize + initialize + + detect + + + + + """); + } + + @Test + void shouldAddProtobufPluginForMaven() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + assertThat(mavenPom(request)).hasProperty("grpc.version", "1.63.2") + .hasProperty("protobuf-java.version", "3.25.5") + .containsIgnoringWhitespaces( + """ + + org.xolstice.maven.plugins + protobuf-maven-plugin + 0.6.1 + + com.google.protobuf:protoc:${protobuf-java.version}:exe:${os.detected.classifier} + grpc-java + io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} + + + + compile + + compile + compile-custom + + + jakarta_omit + + + + + """); + } + + @Test + void shouldCreateSrcMainProtoDirectory() { + ProjectRequest request = createProjectRequest(SPRING_GRPC); + assertThat(generateProject(request)).containsDirectories("src/main/proto"); + } + +} From 28e76bbeaa49c98703b52c99292d7c6fb7621b05 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 17 Dec 2024 14:33:02 +0100 Subject: [PATCH 776/825] Remove logging in tests --- .../src/test/java/io/spring/start/site/DependencyResolver.java | 1 - 1 file changed, 1 deletion(-) diff --git a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java index 1157b64983..b52007e4c6 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java +++ b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java @@ -152,7 +152,6 @@ private List resolveManagedDependencies(String groupId, String artif } private CollectResult collectDependencies(CollectRequest dependencyRequest) throws DependencyCollectionException { - LOGGER.info("Resolving {} from {}", dependencyRequest.getRoot(), dependencyRequest.getRepositories()); return this.repositorySystem.collectDependencies(this.repositorySystemSession, dependencyRequest); } From 101ae2386cac86a1a05e2cc6f01d6ac98da6edb1 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 18 Dec 2024 10:17:46 +0200 Subject: [PATCH 777/825] Upgrade to Vaadin 24.6.0 See gh-1678 --- start-site/src/main/resources/application.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index a4ce25083f..2a4ce33830 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -155,8 +155,10 @@ initializr: artifactId: vaadin-bom versionProperty: vaadin.version mappings: - - compatibilityRange: "[3.3.0,3.5.0-M1)" + - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 24.5.8 + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 24.6.0 platform: compatibilityRange: "3.3.0" dependencies: From d99115e2d4590914058091de3747db64e7c4b99c Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 18 Dec 2024 14:19:44 +0100 Subject: [PATCH 778/825] Upgrade to htmx 4.0.1 Closes gh-1680 --- start-site/src/main/resources/application.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2a4ce33830..6fd7762e25 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -359,8 +359,10 @@ initializr: groupId: io.github.wimdeblauwe artifactId: htmx-spring-boot description: Build modern user interfaces with the simplicity and power of hypertext. - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 3.5.0 + compatibilityRange: "[3.4.0,3.5.0-M1)" + mappings: + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 4.0.1 links: - rel: reference href: https://github.com/wimdeblauwe/htmx-spring-boot From 9ccccbb021eb91bae5344c3f2c2b4c6bd7894edb Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 18 Dec 2024 15:32:47 +0100 Subject: [PATCH 779/825] Fix tests --- .../extension/dependency/htmx/HtmxBuildCustomizerTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java index 33426cb95e..3bbbe774b1 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java @@ -31,7 +31,7 @@ */ class HtmxBuildCustomizerTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); private final Dependency htmx = Dependency.withId("htmx", "io.github.wimdeblauwe", "htmx-spring-boot"); From 9ad5adabc2fd521311d2873bc8a817e93fc306b4 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Wed, 18 Dec 2024 12:01:48 -0600 Subject: [PATCH 780/825] Upgrade to Solace Cloud 4.6.0 See gh-1683 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 6fd7762e25..c5cb9bdf68 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -77,7 +77,7 @@ initializr: versionProperty: solace-spring-cloud.version mappings: - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 4.5.0 + version: 4.6.0 spring-ai: groupId: org.springframework.ai artifactId: spring-ai-bom From 6e2be02077815ba0009d59d562bbf9973dcf1744 Mon Sep 17 00:00:00 2001 From: David Ankin Date: Tue, 17 Dec 2024 13:43:55 -0500 Subject: [PATCH 781/825] Use @generated=omit when configuring gRPC plugins See gh-1682 --- .../springgrpc/GrpcGradleGroovyBuildCustomizer.java | 5 ++++- .../springgrpc/GrpcGradleKotlinBuildCustomizer.java | 9 +++++---- .../dependency/springgrpc/GrpcMavenBuildCustomizer.java | 1 + .../SpringGrpcProjectGenerationConfigurationTests.java | 3 +++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleGroovyBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleGroovyBuildCustomizer.java index f3f4f120b8..080c63de77 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleGroovyBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleGroovyBuildCustomizer.java @@ -38,7 +38,10 @@ protected void customizeExtensions(GradleExtensionContainer extensions) { protobuf.nested("plugins", (plugins) -> plugins.nested("grpc", (grpc) -> grpc.attribute("artifact", quote("io.grpc:protoc-gen-grpc-java")))); protobuf.nested("generateProtoTasks", (generateProtoTasks) -> generateProtoTasks.nested("all()*.plugins", - (plugins) -> plugins.nested("grpc", (grpc) -> grpc.invoke("option", quote("jakarta_omit"))))); + (plugins) -> plugins.nested("grpc", (grpc) -> { + grpc.invoke("option", quote("jakarta_omit")); + grpc.invoke("option", quote("@generated=omit")); + }))); }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleKotlinBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleKotlinBuildCustomizer.java index faf2dc4b5a..123643a64b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleKotlinBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcGradleKotlinBuildCustomizer.java @@ -38,10 +38,11 @@ protected void customizeExtensions(GradleExtensionContainer extensions) { protobuf.importType("com.google.protobuf.gradle.id"); protobuf.nested("plugins", (plugins) -> plugins.nested("id(\"grpc\")", (grpc) -> grpc.attribute("artifact", quote("io.grpc:protoc-gen-grpc-java")))); - protobuf.nested("generateProtoTasks", - (generateProtoTasks) -> generateProtoTasks.nested("all().forEach", - (forEach) -> forEach.nested("it.plugins", (plugins) -> plugins.nested("id(\"grpc\")", - (grpc) -> grpc.invoke("option", quote("jakarta_omit")))))); + protobuf.nested("generateProtoTasks", (generateProtoTasks) -> generateProtoTasks.nested("all().forEach", + (forEach) -> forEach.nested("it.plugins", (plugins) -> plugins.nested("id(\"grpc\")", (grpc) -> { + grpc.invoke("option", quote("jakarta_omit")); + grpc.invoke("option", quote("@generated=omit")); + })))); }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java index b0304b1321..d5e2fad0e1 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java @@ -80,6 +80,7 @@ private void addProtobufPlugin(MavenPluginContainer plugins, VersionProperty pro plugin.execution("compile", (execution) -> { execution.goal("compile").goal("compile-custom"); execution.configuration((configuration) -> configuration.add("pluginParameter", "jakarta_omit")); + execution.configuration((configuration) -> configuration.add("pluginParameter", "@generated=omit")); }); }); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java index a4dbc8c0b9..2a51965895 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java @@ -77,6 +77,7 @@ void shouldAddGrpcPluginAndConfigurationForGradleGroovy() { all()*.plugins { grpc { option 'jakarta_omit' + option '@generated=omit' } } } @@ -105,6 +106,7 @@ void shouldAddGrpcPluginAndConfigurationForGradleKotlin() { it.plugins { id("grpc") { option("jakarta_omit") + option("@generated=omit") } } } @@ -159,6 +161,7 @@ void shouldAddProtobufPluginForMaven() { jakarta_omit + @generated=omit From 3f286a882e2a798931832136b21e3aeea2b6bd0a Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 19 Dec 2024 08:42:39 +0100 Subject: [PATCH 782/825] Polish "Use @generated=omit when configuring gRPC plugins" See gh-1682 --- .../dependency/springgrpc/GrpcMavenBuildCustomizer.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java index d5e2fad0e1..a7a021c727 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java @@ -79,8 +79,10 @@ private void addProtobufPlugin(MavenPluginContainer plugins, VersionProperty pro }); plugin.execution("compile", (execution) -> { execution.goal("compile").goal("compile-custom"); - execution.configuration((configuration) -> configuration.add("pluginParameter", "jakarta_omit")); - execution.configuration((configuration) -> configuration.add("pluginParameter", "@generated=omit")); + execution.configuration((configuration) -> { + configuration.add("pluginParameter", "jakarta_omit"); + configuration.add("pluginParameter", "@generated=omit"); + }); }); }); } From a587d368db873cafd6a25f46a27d54dd66c0e3d5 Mon Sep 17 00:00:00 2001 From: Muyao Date: Wed, 18 Dec 2024 15:23:47 +0800 Subject: [PATCH 783/825] Add help section and Maven plugin when azure-support is selected See gh-1676 --- .../SpringAzureMavenBuildCustomizer.java | 64 +++++++++++++++++++ .../SpringAzureModuleRegistry.java | 28 +++++++- ...ngAzureProjectGenerationConfiguration.java | 8 +++ .../SpringAzureMavenBuildCustomizerTests.java | 40 ++++++++++++ ...reProjectGenerationConfigurationTests.java | 6 ++ 5 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java create mode 100644 start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java new file mode 100644 index 0000000000..7d1b49816a --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * A {@link BuildCustomizer} that adds a maven plugin when azure-support is selected. + * + * @author Muyao Feng + */ +class SpringAzureMavenBuildCustomizer implements BuildCustomizer { + + private final ProjectDescription projectDescription; + + SpringAzureMavenBuildCustomizer(ProjectDescription projectDescription) { + this.projectDescription = projectDescription; + } + + @Override + public void customize(MavenBuild build) { + build.plugins().add("com.microsoft.azure", "azure-container-apps-maven-plugin", (plugin) -> { + plugin.version("0.1.0"); + plugin.configuration((configuration) -> { + configuration.add("subscriptionId", "your-subscription-id"); + configuration.add("resourceGroup", "your-resource-group"); + configuration.add("appEnvironmentName", "your-app-environment-name"); + configuration.add("region", "your-region"); + configuration.add("appName", this.projectDescription.getName()); + configuration.add("containers", (containers) -> { + containers.add("container", (container) -> { + container.add("type", "code"); + container.add("directory", "${project.basedir}"); + }); + }); + configuration.add("ingress", (ingress) -> { + ingress.add("external", "true"); + ingress.add("targetPort", "8080"); + }); + configuration.add("scale", (scale) -> { + scale.add("minReplicas", "0"); + scale.add("maxReplicas", "10"); + }); + }); + }); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java index 095d60c5a7..cac73cda77 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java @@ -37,7 +37,7 @@ abstract class SpringAzureModuleRegistry { static Iterable createSpringBootRegistry() { - return create( + return create(onDependencies("azure-support").customizeHelpDocument(addDeploySection()), onDependencies("actuator").customizeBuild(addDependency("spring-cloud-azure-starter-actuator")) .customizeHelpDocument(addReferenceLink("actuator", "Azure Actuator")), onDependencies("integration", "azure-storage") @@ -81,4 +81,30 @@ private static Consumer addReferenceLink(String id, String descrip }; } + private static Consumer addDeploySection() { + return (helpDocument) -> { + helpDocument.addSection((writer) -> { + writer.println("### Deploy to Azure"); + writer.println(); + writer.println("This project can be deployed to Azure with maven support."); + writer.println(); + writer.println( + "In your `pom.xml`, replace the following placeholder variables with your specific Azure details:"); + writer.println("- `subscriptionId`"); + writer.println("- `resourceGroup`"); + writer.println("- `appEnvironmentName`"); + writer.println("- `region`"); + writer.println(); + writer.println("Deploy with:"); + writer.println(""" + ```bash + mvn azure-container-apps:deploy + ``` + """); + writer.println( + "Learn more about [Java on Azure Container Apps](https://learn.microsoft.com/azure/container-apps/java-overview)."); + }); + }; + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java index ddf690a22c..f8357c469f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java @@ -17,6 +17,8 @@ package io.spring.start.site.extension.dependency.springazure; import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.start.site.support.implicit.ImplicitDependency; import io.spring.start.site.support.implicit.ImplicitDependencyBuildCustomizer; @@ -50,4 +52,10 @@ ImplicitDependencyHelpDocumentCustomizer azureDependencyHelpDocumentCustomizer(B return new ImplicitDependencyHelpDocumentCustomizer(this.azureDependencies, build); } + @Bean + @ConditionalOnRequestedDependency("azure-support") + SpringAzureMavenBuildCustomizer azureDependencyMavenBuildCustomizer(ProjectDescription projectDescription) { + return new SpringAzureMavenBuildCustomizer(projectDescription); + } + } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java new file mode 100644 index 0000000000..2b20a7393e --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springazure; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringAzureMavenBuildCustomizer}. + * + * @author Muyao Feng + */ +class SpringAzureMavenBuildCustomizerTests extends AbstractExtensionTests { + + @Test + void azureContainerAppsMavenPluginAddedWhenAzureSupportPresent() { + ProjectRequest request = createProjectRequest("azure-support"); + assertThat(mavenPom(request)).hasText("/project/build/plugins/plugin[1]/groupId", "com.microsoft.azure"); + assertThat(mavenPom(request)).hasText("/project/build/plugins/plugin[1]/artifactId", + "azure-container-apps-maven-plugin"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java index 97b1a9f311..405b5e06db 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java @@ -118,6 +118,12 @@ void azureJdbcWithPostgresql() { .doesNotContain("https://aka.ms/spring/msdocs/mysql"); } + @Test + void DeploytoAzureSectionAddedWhenAzureSupportPresent() { + ProjectStructure project = generateProject("azure-support"); + assertThatHelpDocumentOf(project).contains("Deploy to Azure"); + } + private static Stream azureDependencies() { return Stream.of(Arguments.of("azure-active-directory"), Arguments.of("azure-keyvault"), Arguments.of("azure-storage"), Arguments.of("azure-support")); From 32ba6e1ad42daff43cacc75c8f1d1c05e037b570 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 19 Dec 2024 09:00:46 +0100 Subject: [PATCH 784/825] Polish "Add help section and Maven plugin when azure-support is selected" See gh-1676 --- .../springazure/SpringAzureMavenBuildCustomizer.java | 6 ++++-- .../springazure/SpringAzureModuleRegistry.java | 9 +++++---- .../SpringAzureProjectGenerationConfiguration.java | 5 ++++- .../SpringAzureMavenBuildCustomizerTests.java | 12 +++++++++--- ...ringAzureProjectGenerationConfigurationTests.java | 2 +- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java index 7d1b49816a..1cc42bae4b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizer.java @@ -21,12 +21,14 @@ import io.spring.initializr.generator.spring.build.BuildCustomizer; /** - * A {@link BuildCustomizer} that adds a maven plugin when azure-support is selected. + * A {@link BuildCustomizer} that adds a Maven plugin when azure-support is selected. * * @author Muyao Feng */ class SpringAzureMavenBuildCustomizer implements BuildCustomizer { + private static final String PLUGIN_VERSION = "0.1.0"; + private final ProjectDescription projectDescription; SpringAzureMavenBuildCustomizer(ProjectDescription projectDescription) { @@ -36,7 +38,7 @@ class SpringAzureMavenBuildCustomizer implements BuildCustomizer { @Override public void customize(MavenBuild build) { build.plugins().add("com.microsoft.azure", "azure-container-apps-maven-plugin", (plugin) -> { - plugin.version("0.1.0"); + plugin.version(PLUGIN_VERSION); plugin.configuration((configuration) -> { configuration.add("subscriptionId", "your-subscription-id"); configuration.add("resourceGroup", "your-resource-group"); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java index cac73cda77..c208fc57ab 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureModuleRegistry.java @@ -86,19 +86,20 @@ private static Consumer addDeploySection() { helpDocument.addSection((writer) -> { writer.println("### Deploy to Azure"); writer.println(); - writer.println("This project can be deployed to Azure with maven support."); + writer.println("This project can be deployed to Azure with Maven."); writer.println(); writer.println( - "In your `pom.xml`, replace the following placeholder variables with your specific Azure details:"); + "To get started, replace the following placeholder in your `pom.xml` with your specific Azure details:"); + writer.println(); writer.println("- `subscriptionId`"); writer.println("- `resourceGroup`"); writer.println("- `appEnvironmentName`"); writer.println("- `region`"); writer.println(); - writer.println("Deploy with:"); + writer.println("Now you can deploy your application:"); writer.println(""" ```bash - mvn azure-container-apps:deploy + ./mvnw azure-container-apps:deploy ``` """); writer.println( diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java index f8357c469f..edb867178d 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ package io.spring.start.site.extension.dependency.springazure; import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; @@ -54,6 +56,7 @@ ImplicitDependencyHelpDocumentCustomizer azureDependencyHelpDocumentCustomizer(B @Bean @ConditionalOnRequestedDependency("azure-support") + @ConditionalOnBuildSystem(MavenBuildSystem.ID) SpringAzureMavenBuildCustomizer azureDependencyMavenBuildCustomizer(ProjectDescription projectDescription) { return new SpringAzureMavenBuildCustomizer(projectDescription); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java index 2b20a7393e..c0740ba3a1 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureMavenBuildCustomizerTests.java @@ -26,15 +26,21 @@ * Tests for {@link SpringAzureMavenBuildCustomizer}. * * @author Muyao Feng + * @author Moritz Halbritter */ class SpringAzureMavenBuildCustomizerTests extends AbstractExtensionTests { + @Test + void shouldDoNothingIfAzureSupportIsntSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("azure-container-apps-maven-plugin"); + } + @Test void azureContainerAppsMavenPluginAddedWhenAzureSupportPresent() { ProjectRequest request = createProjectRequest("azure-support"); - assertThat(mavenPom(request)).hasText("/project/build/plugins/plugin[1]/groupId", "com.microsoft.azure"); - assertThat(mavenPom(request)).hasText("/project/build/plugins/plugin[1]/artifactId", - "azure-container-apps-maven-plugin"); + assertThat(mavenPom(request)).hasText("/project/build/plugins/plugin[1]/groupId", "com.microsoft.azure") + .hasText("/project/build/plugins/plugin[1]/artifactId", "azure-container-apps-maven-plugin"); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java index 405b5e06db..1d71361684 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java @@ -121,7 +121,7 @@ void azureJdbcWithPostgresql() { @Test void DeploytoAzureSectionAddedWhenAzureSupportPresent() { ProjectStructure project = generateProject("azure-support"); - assertThatHelpDocumentOf(project).contains("Deploy to Azure"); + assertThatHelpDocumentOf(project).contains("### Deploy to Azure"); } private static Stream azureDependencies() { From 7f436b34f784d825969520c638c2b8035034744b Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 20 Dec 2024 08:48:48 +0100 Subject: [PATCH 785/825] Fix gRPC Maven configuration Adding multiple pluginParameter tags doesn't work, the options need to be separated by comma. Closes gh-1686 --- .../dependency/springgrpc/GrpcMavenBuildCustomizer.java | 6 ++---- .../SpringGrpcProjectGenerationConfigurationTests.java | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java index a7a021c727..3534cde4f9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springgrpc/GrpcMavenBuildCustomizer.java @@ -79,10 +79,8 @@ private void addProtobufPlugin(MavenPluginContainer plugins, VersionProperty pro }); plugin.execution("compile", (execution) -> { execution.goal("compile").goal("compile-custom"); - execution.configuration((configuration) -> { - configuration.add("pluginParameter", "jakarta_omit"); - configuration.add("pluginParameter", "@generated=omit"); - }); + execution.configuration( + (configuration) -> configuration.add("pluginParameter", "jakarta_omit,@generated=omit")); }); }); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java index 2a51965895..2ba473321d 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java @@ -160,8 +160,7 @@ void shouldAddProtobufPluginForMaven() { compile-custom - jakarta_omit - @generated=omit + jakarta_omit,@generated=omit From 54953899c7956c36a73a6f4432ddac5a5c5ec899 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 20 Dec 2024 13:58:54 +0100 Subject: [PATCH 786/825] Update to Spring Boot 3.4.1 Closes gh-1685 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ac8d0bff56..fb00631473 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.0 + 3.4.1 io.spring.start start-parent From 811c1dbf2a64f960dc9adbae4fdf10e19b9abe5c Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:51:06 +0200 Subject: [PATCH 787/825] Upgrade to Vaadin 24.5.9 See gh-1689 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c5cb9bdf68..b34d20b610 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -156,7 +156,7 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 24.5.8 + version: 24.5.9 - compatibilityRange: "[3.4.0,3.5.0-M1)" version: 24.6.0 platform: From 7ce8b8d959463d5b24f1fce95dcd96b77cfb8ab8 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Mon, 23 Dec 2024 11:11:55 -0600 Subject: [PATCH 788/825] Upgrade to Modulith 1.3.1 See gh-1690 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index c5cb9bdf68..af83ac331b 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -135,7 +135,7 @@ initializr: - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 1.2.4 - compatibilityRange: "[3.4.0,3.5.0-M1)" - version: 1.3.0 + version: 1.3.1 spring-shell: groupId: org.springframework.shell artifactId: spring-shell-dependencies From b36b56c541128e625313eeabf5f39a9f69411ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Tue, 24 Dec 2024 14:40:37 +0100 Subject: [PATCH 789/825] Upgrade to Modulith 1.2.7 See gh-1690 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index af83ac331b..93bf53029b 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -133,7 +133,7 @@ initializr: versionProperty: spring-modulith.version mappings: - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 1.2.4 + version: 1.2.7 - compatibilityRange: "[3.4.0,3.5.0-M1)" version: 1.3.1 spring-shell: From 9551c3c0777e6aa48e1fca5a9506b3e420edda9a Mon Sep 17 00:00:00 2001 From: pbakker Date: Wed, 18 Dec 2024 11:29:17 -0800 Subject: [PATCH 790/825] Upgrade DGS to 10.0.1 and DGS codegen to 7.0.3 Closes gh-1684 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 5e0eb50727..cbccbc2e01 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -56,7 +56,7 @@ initializr: versionProperty: netflix-dgs.version mappings: - compatibilityRange: "[3.3.0,3.5.0-M1)" - version: 9.2.2 + version: 10.0.1 sentry: groupId: io.sentry artifactId: sentry-bom @@ -174,7 +174,7 @@ initializr: id: dgs-codegen groupId: com.netflix.graphql.dgs.codegen artifactId: graphql-dgs-codegen-gradle - version: 6.2.1 + version: 7.0.3 description: Generate data types and type-safe APIs for querying GraphQL APIs by parsing schema files. starter: false - name: Spring Boot DevTools From b48bad489ef23697caa64f084ee8389e9ebdb1a3 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Tue, 7 Jan 2025 10:36:05 +0100 Subject: [PATCH 791/825] Update Dark theme Fix divider color on the sidebar left --- start-client/src/styles/_dark.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/start-client/src/styles/_dark.scss b/start-client/src/styles/_dark.scss index 91d96ae387..ffe3101c81 100644 --- a/start-client/src/styles/_dark.scss +++ b/start-client/src/styles/_dark.scss @@ -23,6 +23,9 @@ body.dark { opacity: 0.7; } } + #side-left .navigation-divider { + border-color: $dark-border; + } #side-right .side-container { border-color: $dark-border; From c04cbb141c71acad89040b694272b14c52dded27 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 7 Jan 2025 11:14:17 +0100 Subject: [PATCH 792/825] Fix tests to use newer gRPC version Spring gRPC has updated the grpc core version in the snapshot. --- .../SpringGrpcProjectGenerationConfigurationTests.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java index 2ba473321d..a4224130d2 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springgrpc/SpringGrpcProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -139,7 +139,7 @@ void shouldAddOsPluginForMaven() { @Test void shouldAddProtobufPluginForMaven() { ProjectRequest request = createProjectRequest(SPRING_GRPC); - assertThat(mavenPom(request)).hasProperty("grpc.version", "1.63.2") + assertThat(mavenPom(request)).hasProperty("grpc.version", "1.69.0") .hasProperty("protobuf-java.version", "3.25.5") .containsIgnoringWhitespaces( """ From 24131ac0cc7a547603822974a0b3c4fbd5b97857 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Tue, 7 Jan 2025 11:33:11 +0100 Subject: [PATCH 793/825] Update label style --- start-client/src/styles/_main.scss | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/start-client/src/styles/_main.scss b/start-client/src/styles/_main.scss index 7b21087917..b30c760a3b 100644 --- a/start-client/src/styles/_main.scss +++ b/start-client/src/styles/_main.scss @@ -913,10 +913,11 @@ button.button { background: $light-primary; color: #fff; font-size: $spring-font-size - 2; - padding: 4px 0.6rem 1px; + padding: 2px 0.4rem 1px; line-height: 18px; margin-left: 0.6rem; text-transform: uppercase; + border-radius: 4px; } strong { font-size: $spring-font-size + 2; @@ -996,7 +997,8 @@ button.button { background: $light-primary; color: #fff; font-size: $spring-font-size - 2; - padding: 4px 0.6rem 1px; + padding: 2px 0.4rem 1px; + border-radius: 4px; line-height: 18px; margin-left: 0.6rem; text-transform: uppercase; @@ -1089,11 +1091,12 @@ ul.dependencies-list { display: inline-block; background: $light-primary; font-size: $spring-font-size - 2; - padding: 4px 0.6rem 1px; + padding: 2px 0.4rem 1px; line-height: 18px; margin-left: 0.6rem; text-transform: uppercase; color: #fff; + border-radius: 4px; } span.invalid { color: #d60000; From f97ba27b335fda5ad45da4b444d0cd118aa309f8 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Tue, 7 Jan 2025 15:18:30 +0100 Subject: [PATCH 794/825] Improve Sidebar left styles Update hover/animation on sidebar left Minor changes on explore/share --- .../src/components/common/layout/SideLeft.js | 98 +++++++++++-------- start-client/src/styles/_dark.scss | 27 +++-- start-client/src/styles/_hamburgers.scss | 44 ++++++++- start-client/src/styles/_main.scss | 20 ++++ start-client/src/styles/explore.scss | 2 +- start-client/src/styles/share.scss | 1 + 6 files changed, 143 insertions(+), 49 deletions(-) diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index b20e9a454b..810904bc35 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -10,6 +10,7 @@ import { IconGithub, IconHistory, IconFavorite } from '../icons' function SideLeft() { const [isOpen, setIsOpen] = useState(false) const [lock, setLock] = useState(false) + const [status, setStatus] = useState('close') const wrapper = useRef(null) const { nav, histories, dispatch, favorites } = useContext(AppContext) @@ -25,8 +26,10 @@ function SideLeft() { const onEnter = () => { setLock(true) + setStatus('opening') setTimeout(() => { setIsOpen(true) + setStatus('open') }, 350) } const onEntered = () => { @@ -36,13 +39,20 @@ function SideLeft() { const onEnded = () => { setLock(true) setIsOpen(false) + setStatus('closing') } const onExited = () => { setLock(false) + setStatus('close') } return ( <> -
    +
    - {!isOpen && !lock && ( - <> - {favorites.length > 0 && ( - <> -
    - - - )} - {histories.length > 0 && ( - <> -
    - - - )} - - )} + + + {(status === 'close' || status === 'closing') && ( + +
    + {favorites.length > 0 && ( + <> +
    + + + )} + {histories.length > 0 && ( + <> +
    + + + )} +
    + + )} +
    Date: Wed, 8 Jan 2025 09:18:19 +0100 Subject: [PATCH 795/825] Update explore wording --- start-client/src/components/common/explore/Explore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-client/src/components/common/explore/Explore.js b/start-client/src/components/common/explore/Explore.js index 06cef0da5f..49ff1e76e5 100644 --- a/start-client/src/components/common/explore/Explore.js +++ b/start-client/src/components/common/explore/Explore.js @@ -62,7 +62,7 @@ function Explore({ open, onClose, projectName, blob }) { const onCopy = () => { setButton('Copied!') setTimeout(() => { - setButton('Copy!') + setButton('Copy') }, 3000) } From a642253e8afff0e46be70c1872a21b0eb6ebcad6 Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 8 Jan 2025 12:15:49 +0200 Subject: [PATCH 796/825] Upgrade to Vaadin 24.6.1 See gh-1694 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index cbccbc2e01..892a34978b 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -158,7 +158,7 @@ initializr: - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 24.5.9 - compatibilityRange: "[3.4.0,3.5.0-M1)" - version: 24.6.0 + version: 24.6.1 platform: compatibilityRange: "3.3.0" dependencies: From 51139459dd8cea30b3a5c998836c963c6123d232 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 10 Jan 2025 10:55:20 -0500 Subject: [PATCH 797/825] Upgrade to Spring Cloud 2023.0.5 See gh-1696 --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 892a34978b..f087310eca 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -93,7 +93,7 @@ initializr: order: 50 mappings: - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 2023.0.4 + version: 2023.0.5 - compatibilityRange: "[3.4.0,3.5.0-M1)" version: 2024.0.0 spring-cloud-azure: From 3adfe3d0c2f1efd4ac7c439a548910035edab695 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 13 Jan 2025 09:36:16 +0100 Subject: [PATCH 798/825] Disable DCO checks for organizational members --- .github/dco.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .github/dco.yml diff --git a/.github/dco.yml b/.github/dco.yml new file mode 100644 index 0000000000..0c4b142e9a --- /dev/null +++ b/.github/dco.yml @@ -0,0 +1,2 @@ +require: + members: false From bcf8956465f5b32f96eec132805e09103cad6544 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 13 Jan 2025 09:38:40 +0100 Subject: [PATCH 799/825] Add DCO paragraph to contribution guidelines --- CONTRIBUTING.adoc | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index 2b98592fcc..facd77ff45 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -21,13 +21,9 @@ We use GitHub issues to track bugs and enhancements. If you have a general usage please ask on https://stackoverflow.com[Stack Overflow] or join us on the https://gitter.im/spring-io/initializr[Gitter channel]. -== Sign the Contributor License Agreement -Before we accept a non-trivial patch or pull request we will need you to -https://cla.pivotal.io/sign/spring[sign the Contributor License Agreement]. -Signing the contributor's agreement does not grant anyone commit rights to the main -repository, but it does mean that we can accept your contributions, and you will get an -author credit if we do. Active contributors might be asked to join the core team, and -given the ability to merge pull requests. +== Include a Signed Off By Trailer +All commits must include a __Signed-off-by__ trailer at the end of each commit message to indicate that the contributor agrees to the Developer Certificate of Origin. +For additional details, please refer to the blog post https://spring.io/blog/2025/01/06/hello-dco-goodbye-cla-simplifying-contributions-to-spring[Hello DCO, Goodbye CLA: Simplifying Contributions to Spring]. == Code Conventions and Housekeeping None of these is essential for a pull request, but they will all help. They can also be From 8a982d89f3c0ffc5aa8bf2c53208e971425b0525 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 14 Jan 2025 13:30:51 +0100 Subject: [PATCH 800/825] Customize the Buildpacks builder when using kafka-streams If kafka-streams is selected, the builder is set to 'paketobuildpacks/builder-jammy-base:latest'. Closes gh-1695 --- ...ngKafkaProjectGenerationConfiguration.java | 27 +++++++++++- ...ringKafkaStreamsGradleBuildCustomizer.java | 44 +++++++++++++++++++ ...pringKafkaStreamsMavenBuildCustomizer.java | 38 ++++++++++++++++ ...kaProjectGenerationConfigurationTests.java | 39 +++++++++++++++- 4 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsGradleBuildCustomizer.java create mode 100644 start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsMavenBuildCustomizer.java diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java index 3431c1bf67..32f57f6580 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,9 @@ package io.spring.start.site.extension.dependency.springkafka; import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; +import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; +import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; @@ -33,6 +36,7 @@ * * @author Stephane Nicoll * @author Eddú Meléndez + * @author Moritz Halbritter */ @ProjectGenerationConfiguration class SpringKafkaProjectGenerationConfiguration { @@ -73,6 +77,27 @@ ServiceConnectionsCustomizer kafkaServiceConnectionsCustomizer(Build build, Dock }; } + @Bean + @ConditionalOnRequestedDependency("kafka-streams") + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + SpringKafkaStreamsMavenBuildCustomizer springKafkaStreamsMavenBuildCustomizer() { + return new SpringKafkaStreamsMavenBuildCustomizer(); + } + + @Bean + @ConditionalOnRequestedDependency("kafka-streams") + @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) + SpringKafkaStreamsGradleBuildCustomizer springKafkaStreamsGradleBuildCustomizer() { + return new SpringKafkaStreamsGradleBuildCustomizer('\''); + } + + @Bean + @ConditionalOnRequestedDependency("kafka-streams") + @ConditionalOnBuildSystem(id = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) + SpringKafkaStreamsGradleBuildCustomizer springKafkaStreamsGradleKotlinBuildCustomizer() { + return new SpringKafkaStreamsGradleBuildCustomizer('\"'); + } + private boolean isKafkaEnabled(Build build) { return build.dependencies().has("kafka") || build.dependencies().has("kafka-streams"); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsGradleBuildCustomizer.java new file mode 100644 index 0000000000..0436f0d87f --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsGradleBuildCustomizer.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springkafka; + +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} for Gradle builds to configure the buildpack builder. + * + * @author Moritz Halbritter + */ +class SpringKafkaStreamsGradleBuildCustomizer implements BuildCustomizer { + + private static final String BUILDER = "paketobuildpacks/builder-jammy-base:latest"; + + private final char quote; + + SpringKafkaStreamsGradleBuildCustomizer(char quote) { + this.quote = quote; + } + + @Override + public void customize(GradleBuild build) { + build.tasks() + .customize("bootBuildImage", + (bootBuildImage) -> bootBuildImage.attribute("builder", this.quote + BUILDER + this.quote)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsMavenBuildCustomizer.java new file mode 100644 index 0000000000..1e04863486 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaStreamsMavenBuildCustomizer.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.springkafka; + +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} for Maven builds to configure the buildpack builder. + * + * @author Moritz Halbritter + */ +class SpringKafkaStreamsMavenBuildCustomizer implements BuildCustomizer { + + private static final String BUILDER = "paketobuildpacks/builder-jammy-base:latest"; + + @Override + public void customize(MavenBuild build) { + build.plugins() + .add("org.springframework.boot", "spring-boot-maven-plugin", (plugin) -> plugin.configuration( + (configuration) -> configuration.configure("image", (image) -> image.add("builder", BUILDER)))); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfigurationTests.java index cbf3adb08c..8642bda14e 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springkafka/SpringKafkaProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ * * @author Wonwoo Lee * @author Stephane Nicoll + * @author Moritz Halbritter */ class SpringKafkaProjectGenerationConfigurationTests extends AbstractExtensionTests { @@ -49,4 +50,40 @@ void springKafkaTestIsNotAddedWithoutKafka() { .hasDependenciesSize(2); } + @Test + void customizesBuildpacksBuilderWhenUsingMavenAndKafkaStreams() { + ProjectRequest request = createProjectRequest("kafka-streams"); + assertThat(mavenPom(request)).containsIgnoringWhitespaces(""" + + org.springframework.boot + spring-boot-maven-plugin + + + paketobuildpacks/builder-jammy-base:latest + + + + """); + } + + @Test + void customizesBuildpacksBuilderWhenUsingGradleGroovyAndKafkaStreams() { + ProjectRequest request = createProjectRequest("kafka-streams"); + assertThat(gradleBuild(request)).containsIgnoringWhitespaces(""" + tasks.named('bootBuildImage') { + builder = 'paketobuildpacks/builder-jammy-base:latest' + } + """); + } + + @Test + void customizesBuildpacksBuilderWhenUsingGradleKotlinAndKafkaStreams() { + ProjectRequest request = createProjectRequest("kafka-streams"); + assertThat(gradleKotlinDslBuild(request)).containsIgnoringWhitespaces(""" + tasks.bootBuildImage { + builder = "paketobuildpacks/builder-jammy-base:latest" + } + """); + } + } From e681c4256e85c77220ac593fc3650b35af01b5bf Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Tue, 14 Jan 2025 15:59:54 +0200 Subject: [PATCH 801/825] Upgrade to Vaadin 24.6.2 and 24.5.10 See gh-1697 Signed-off-by: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index f087310eca..55265a4d6a 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -156,9 +156,9 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 24.5.9 + version: 24.5.10 - compatibilityRange: "[3.4.0,3.5.0-M1)" - version: 24.6.1 + version: 24.6.2 platform: compatibilityRange: "3.3.0" dependencies: From e1b6fb3ece00ccf8608d3a296be67e40fbe3e56f Mon Sep 17 00:00:00 2001 From: Fred Date: Wed, 15 Jan 2025 14:55:24 -0300 Subject: [PATCH 802/825] Upgrade Timefold Solver to 1.18.0 See gh-1698 Signed-off-by: Fred --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 55265a4d6a..94327f83f8 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -149,7 +149,7 @@ initializr: versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.3.0,3.5.0-M1)" - version: 1.17.0 + version: 1.18.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom From c3b83ad0bcb8bc1cc3e892cb062a646c10b489d0 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 17 Jan 2025 08:25:47 +0100 Subject: [PATCH 803/825] Enable milestone repositories for Boot snapshot versions --- .../java/io/spring/start/site/MetadataVerificationTests.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java index 6c61d2be19..d3265ef04d 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java +++ b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -143,6 +143,7 @@ private List getRepositories(Dependency dependency, Version bo String qualifier = bootVersion.getQualifier().getId(); if (qualifier.contains("SNAPSHOT")) { repositories.computeIfAbsent("spring-snapshots", this::repositoryForId); + repositories.computeIfAbsent("spring-milestones", this::repositoryForId); } else if (MILESTONE_PATTERN.matcher(qualifier).matches()) { repositories.computeIfAbsent("spring-milestones", this::repositoryForId); From 50b25905d14d50822381ebafffca309785e755f8 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 17 Jan 2025 14:01:21 +0100 Subject: [PATCH 804/825] Upgrade to Spring gRPC 0.3.0 Closes gh-1703 --- start-site/src/main/resources/application.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 94327f83f8..8613ebed49 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -125,8 +125,7 @@ initializr: versionProperty: spring-grpc.version mappings: - compatibilityRange: "[3.4.0,3.5.0-M1)" - version: 0.3.0-SNAPSHOT - repositories: spring-snapshots + version: 0.3.0 spring-modulith: groupId: org.springframework.modulith artifactId: spring-modulith-bom From dffa97c1168c965a74be243ea2f4f46310060855 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Fri, 17 Jan 2025 14:22:07 -0500 Subject: [PATCH 805/825] update spring-cloud-gcp to 5.10.0 See gh-1704 Signed-off-by: Min Zhu --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 8613ebed49..a0c20c83b2 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -110,7 +110,7 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 5.9.0 + version: 5.10.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From b848e2a6cfd85a6fd63d1a951de5ffd6ccdebf28 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 20 Jan 2025 08:48:16 +0100 Subject: [PATCH 806/825] Add Spring Cloud 2025.0-SNAPSHOT See gh-1705 --- start-site/src/main/resources/application.yml | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index a0c20c83b2..4a75252c14 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -96,6 +96,10 @@ initializr: version: 2023.0.5 - compatibilityRange: "[3.4.0,3.5.0-M1)" version: 2024.0.0 + - compatibilityRange: "[3.5.0-SNAPSHOT,3.6.0-M1)" + version: 2025.0.0-SNAPSHOT + repositories: + - spring-snapshots spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies @@ -1082,7 +1086,7 @@ initializr: href: https://java.testcontainers.org/ - name: Contract Verifier bom: spring-cloud - compatibilityRange: "[3.3.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.6.0-M1)" id: cloud-contract-verifier description: Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development. groupId: org.springframework.cloud @@ -1093,7 +1097,7 @@ initializr: href: https://docs.spring.io/spring-cloud-contract/reference/ - name: Contract Stub Runner bom: spring-cloud - compatibilityRange: "[3.3.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.6.0-M1)" id: cloud-contract-stub-runner description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests. groupId: org.springframework.cloud @@ -1114,7 +1118,7 @@ initializr: href: https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.ldap.embedded - name: Spring Cloud bom: spring-cloud - compatibilityRange: "[3.3.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Cloud Bootstrap id: cloud-starter @@ -1146,7 +1150,7 @@ initializr: href: https://docs.spring.io/spring-cloud-task/reference/ - name: Spring Cloud Config bom: spring-cloud - compatibilityRange: "[3.3.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Config Client id: cloud-config-client @@ -1193,7 +1197,7 @@ initializr: href: https://docs.spring.io/spring-cloud-consul/reference/ - name: Spring Cloud Discovery bom: spring-cloud - compatibilityRange: "[3.3.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Eureka Discovery Client id: cloud-eureka @@ -1235,7 +1239,7 @@ initializr: href: https://docs.spring.io/spring-cloud-consul/reference/discovery.html - name: Spring Cloud Routing bom: spring-cloud - compatibilityRange: "[3.3.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Gateway id: cloud-gateway @@ -1282,7 +1286,7 @@ initializr: href: https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html - name: Spring Cloud Circuit Breaker bom: spring-cloud - compatibilityRange: "[3.3.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Resilience4J id: cloud-resilience4j @@ -1294,7 +1298,7 @@ initializr: href: https://docs.spring.io/spring-cloud-circuitbreaker/reference/spring-cloud-circuitbreaker-resilience4j.html - name: Spring Cloud Messaging bom: spring-cloud - compatibilityRange: "[3.3.0,3.5.0-M1)" + compatibilityRange: "[3.3.0,3.6.0-M1)" content: - name: Cloud Bus id: cloud-bus From 65ba01a8e30c099f0d03508b6167d9c17160c447 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 20 Jan 2025 09:39:54 +0100 Subject: [PATCH 807/825] Adapt to new gateway starter names Closes gh-1705 --- start-site/src/main/resources/application.yml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4a75252c14..1e0e7db641 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1243,16 +1243,26 @@ initializr: content: - name: Gateway id: cloud-gateway - groupId: org.springframework.cloud - artifactId: spring-cloud-starter-gateway-mvc + mappings: + - compatibility-range: "[3.3.0,3.5.0-M1)" + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-gateway-mvc + - compatibility-range: "[3.5.0-SNAPSHOT,3.6.0-M1)" + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-gateway-server-webmvc description: Provides a simple, yet effective way to route to APIs in Servlet-based applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. links: - rel: reference href: https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway-server-mvc.html - name: Reactive Gateway id: cloud-gateway-reactive - groupId: org.springframework.cloud - artifactId: spring-cloud-starter-gateway + mappings: + - compatibility-range: "[3.3.0,3.5.0-M1)" + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-gateway + - compatibility-range: "[3.5.0-SNAPSHOT,3.6.0-M1)" + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-gateway-server-webflux description: Provides a simple, yet effective way to route to APIs in reactive applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. facets: - reactive From 86d9f339ebf74d10d1f76b660d457b7b3032fa2f Mon Sep 17 00:00:00 2001 From: Ilayaperumal Gopinathan Date: Tue, 21 Jan 2025 17:55:48 +0000 Subject: [PATCH 808/825] Add Spring AI 1.0.0-M5 Add MariaDB, Oracle Coherence and Azure Cosmos DB Vector Store starters. See gh-1707 --- start-site/src/main/resources/application.yml | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 1e0e7db641..b82b0c8fab 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -84,7 +84,7 @@ initializr: versionProperty: spring-ai.version mappings: - compatibilityRange: "[3.3.0,3.5.0-M1)" - version: 1.0.0-M4 + version: 1.0.0-M5 repositories: spring-milestones spring-cloud: groupId: org.springframework.cloud @@ -1653,6 +1653,36 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/vectordbs/redis.html + - name: MariaDB Vector Database + id: spring-ai-vectordb-mariadb + group-id: org.springframework.ai + artifact-id: spring-ai-mariadb-store-spring-boot-starter + description: MariaDB Vector Store support is part of MariaDB 11.7. It provides efficient vector similarity search capabilities using vector indexes, supporting both cosine similarity and Euclidean distance metrics. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/mariadb.html + - name: Oracle Coherence Vector Database + id: spring-ai-vectordb-coherence + group-id: org.springframework.ai + artifact-id: spring-ai-coherence-store-spring-boot-starter + description: Oracle Coherence Vector Store is a key-value store with optional persistence, offering fault-tolerant automatic sharding, polyglot and REST interfaces, querying, transactions, eventing, and in-place processing, as well as change data capture, multi-site federation, messaging, and integrations with popular frameworks. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs.html + - name: Azure Cosmos DB + id: spring-ai-vectordb-azurecosmosdb + group-id: org.springframework.ai + artifact-id: spring-ai-azure-cosmos-db-store-spring-boot-starter + description: Azure Cosmos DB is Microsoft’s globally distributed cloud-native database service designed for mission-critical applications. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/azure-cosmos-db.html - name: Stability AI id: spring-ai-stabilityai group-id: org.springframework.ai From 88026c9a36f3efc15cb125eacfcf3ad6e48f5067 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 22 Jan 2025 09:22:04 +0100 Subject: [PATCH 809/825] Polish "Add Spring AI 1.0.0-M5" See gh-1707 --- start-site/src/main/resources/application.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b82b0c8fab..6c3860e118 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1657,7 +1657,7 @@ initializr: id: spring-ai-vectordb-mariadb group-id: org.springframework.ai artifact-id: spring-ai-mariadb-store-spring-boot-starter - description: MariaDB Vector Store support is part of MariaDB 11.7. It provides efficient vector similarity search capabilities using vector indexes, supporting both cosine similarity and Euclidean distance metrics. + description: Spring AI support for MariaDB. MariaDB Vector Store support is part of MariaDB 11.7. It provides efficient vector similarity search capabilities using vector indexes, supporting both cosine similarity and Euclidean distance metrics. bom: spring-ai starter: true links: @@ -1667,17 +1667,17 @@ initializr: id: spring-ai-vectordb-coherence group-id: org.springframework.ai artifact-id: spring-ai-coherence-store-spring-boot-starter - description: Oracle Coherence Vector Store is a key-value store with optional persistence, offering fault-tolerant automatic sharding, polyglot and REST interfaces, querying, transactions, eventing, and in-place processing, as well as change data capture, multi-site federation, messaging, and integrations with popular frameworks. + description: Spring AI support for Oracle Coherence. Oracle Coherence Vector Store is a key-value store with optional persistence, offering fault-tolerant automatic sharding, polyglot and REST interfaces, querying, transactions, eventing, and in-place processing, as well as change data capture, multi-site federation, messaging, and integrations with popular frameworks. bom: spring-ai starter: true links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/vectordbs.html - - name: Azure Cosmos DB + - name: Azure Cosmos DB Vector Store id: spring-ai-vectordb-azurecosmosdb group-id: org.springframework.ai artifact-id: spring-ai-azure-cosmos-db-store-spring-boot-starter - description: Azure Cosmos DB is Microsoft’s globally distributed cloud-native database service designed for mission-critical applications. + description: Spring AI support for Azure Cosmos DB. Azure Cosmos DB is Microsoft’s globally distributed cloud-native database service designed for mission-critical applications. bom: spring-ai starter: true links: From 05eff1a1ac82a0db97587d99bdcc3adcfee02299 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 24 Jan 2025 09:00:38 +0100 Subject: [PATCH 810/825] Fix milestone handling in MetadataVerificationTests --- .../java/io/spring/start/site/MetadataVerificationTests.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java index d3265ef04d..81a46c6fb6 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java +++ b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; -import java.util.regex.Pattern; import java.util.stream.Stream; import io.spring.initializr.generator.version.Version; @@ -61,8 +60,6 @@ @ActiveProfiles("test") class MetadataVerificationTests { - private static final Pattern MILESTONE_PATTERN = Pattern.compile("M\\d+"); - private final InitializrMetadata metadata; MetadataVerificationTests(@Autowired InitializrMetadataProvider metadataProvider) { @@ -145,7 +142,7 @@ private List getRepositories(Dependency dependency, Version bo repositories.computeIfAbsent("spring-snapshots", this::repositoryForId); repositories.computeIfAbsent("spring-milestones", this::repositoryForId); } - else if (MILESTONE_PATTERN.matcher(qualifier).matches()) { + else if (qualifier.equals("M")) { repositories.computeIfAbsent("spring-milestones", this::repositoryForId); } } From 0df672f164a29c1e7251e59b321c02df0c47110c Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 24 Jan 2025 09:01:01 +0100 Subject: [PATCH 811/825] Enable Cloud 2025.0.0-SNAPSHOT for Boot 3.5.0-M1 --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 6c3860e118..3dca39fbba 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -96,7 +96,7 @@ initializr: version: 2023.0.5 - compatibilityRange: "[3.4.0,3.5.0-M1)" version: 2024.0.0 - - compatibilityRange: "[3.5.0-SNAPSHOT,3.6.0-M1)" + - compatibilityRange: "[3.5.0-M1,3.6.0-M1)" version: 2025.0.0-SNAPSHOT repositories: - spring-snapshots @@ -1247,7 +1247,7 @@ initializr: - compatibility-range: "[3.3.0,3.5.0-M1)" groupId: org.springframework.cloud artifactId: spring-cloud-starter-gateway-mvc - - compatibility-range: "[3.5.0-SNAPSHOT,3.6.0-M1)" + - compatibility-range: "[3.5.0-M1,3.6.0-M1)" groupId: org.springframework.cloud artifactId: spring-cloud-starter-gateway-server-webmvc description: Provides a simple, yet effective way to route to APIs in Servlet-based applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. @@ -1260,7 +1260,7 @@ initializr: - compatibility-range: "[3.3.0,3.5.0-M1)" groupId: org.springframework.cloud artifactId: spring-cloud-starter-gateway - - compatibility-range: "[3.5.0-SNAPSHOT,3.6.0-M1)" + - compatibility-range: "[3.5.0-M1,3.6.0-M1)" groupId: org.springframework.cloud artifactId: spring-cloud-starter-gateway-server-webflux description: Provides a simple, yet effective way to route to APIs in reactive applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. From be3766fff2ae4deeb4ce75ea93d87040880e20e7 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 24 Jan 2025 09:51:01 +0100 Subject: [PATCH 812/825] Upgrade to Spring Boot 3.4.2 Closes gh-1709 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fb00631473..04ab55f9ec 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.1 + 3.4.2 io.spring.start start-parent From 6341f2c9eff97bf885638c161f319ce33db4c76a Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 24 Jan 2025 10:08:24 +0100 Subject: [PATCH 813/825] Fix maximum parallelism on Windows See gh-1688 --- .github/workflows/build-on-windows.yml | 2 ++ .../JunitMaxParallelismStrategy.java | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-on-windows.yml b/.github/workflows/build-on-windows.yml index 9f849db818..e17dee30ad 100644 --- a/.github/workflows/build-on-windows.yml +++ b/.github/workflows/build-on-windows.yml @@ -24,3 +24,5 @@ jobs: - name: Build with Maven run: ./mvnw.cmd --batch-mode --update-snapshots --no-transfer-progress verify + env: + JUNIT_MAX_PARALLELISM: "1" diff --git a/test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java b/test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java index 9b0e22f19f..171fb0527f 100644 --- a/test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java +++ b/test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,8 @@ import org.junit.platform.engine.support.hierarchical.ParallelExecutionConfiguration; import org.junit.platform.engine.support.hierarchical.ParallelExecutionConfigurationStrategy; +import org.springframework.util.StringUtils; + /** * A parallel execution strategy for JUnit, which limits the maximum number of * parallelism. @@ -31,17 +33,26 @@ */ public class JunitMaxParallelismStrategy implements ParallelExecutionConfigurationStrategy { - private static final int MAX_PARALLELISM = 4; + private static final int DEFAULT_MAX_PARALLELISM = Integer.MAX_VALUE; @Override public ParallelExecutionConfiguration createConfiguration(ConfigurationParameters configurationParameters) { + int maxParallelism = getMaxParallelism(); int parallelism = Runtime.getRuntime().availableProcessors(); - if (parallelism > MAX_PARALLELISM) { - parallelism = MAX_PARALLELISM; + if (parallelism > maxParallelism) { + parallelism = maxParallelism; } return new FixedParallelExecutionConfiguration(parallelism); } + private int getMaxParallelism() { + String maxParallelism = System.getenv("JUNIT_MAX_PARALLELISM"); + if (StringUtils.hasText(maxParallelism)) { + return Integer.parseInt(maxParallelism); + } + return DEFAULT_MAX_PARALLELISM; + } + private static final class FixedParallelExecutionConfiguration implements ParallelExecutionConfiguration { private final int processors; From 9f834056ac2bcbbc0f6a87d64b02f05166cfad01 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 29 Jan 2025 09:32:21 +0100 Subject: [PATCH 814/825] Enable solace-spring-boot for Spring Boot 3.4.0 See gh-1711 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3dca39fbba..47a25e7163 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -69,7 +69,7 @@ initializr: artifactId: solace-spring-boot-bom versionProperty: solace-spring-boot.version mappings: - - compatibilityRange: "[3.3.0,3.4.0-M1)" + - compatibilityRange: "[3.3.0,3.5.0-M1)" version: 2.2.0 solace-spring-cloud: groupId: com.solace.spring.cloud @@ -845,7 +845,7 @@ initializr: - name: Solace PubSub+ bom: solace-spring-boot id: solace - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" description: Connect to a Solace PubSub+ Advanced Event Broker to publish, subscribe, request/reply and store/replay messages groupId: com.solace.spring.boot artifactId: solace-spring-boot-starter From ba46dbd17bb0204222d020d0958701276ae75f73 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 29 Jan 2025 09:32:54 +0100 Subject: [PATCH 815/825] Upgrade solace-spring-cloud to 4.7.0 Also enables it for Spring Boot 3.4.0 Closes gh-1711 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 47a25e7163..818dc42237 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -76,8 +76,8 @@ initializr: artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 4.6.0 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 4.7.0 spring-ai: groupId: org.springframework.ai artifactId: spring-ai-bom From a77f6622559a25fc83cefb15adbe60a029b0808d Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:56:07 +0200 Subject: [PATCH 816/825] Upgrade to Vaadin 24.6.3 See gh-1712 Signed-off-by: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 818dc42237..3c6ad444eb 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -161,7 +161,7 @@ initializr: - compatibilityRange: "[3.3.0,3.4.0-M1)" version: 24.5.10 - compatibilityRange: "[3.4.0,3.5.0-M1)" - version: 24.6.2 + version: 24.6.3 platform: compatibilityRange: "3.3.0" dependencies: From 22d3e1535663b8440098f965cb4be822dcc9b04a Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Wed, 29 Jan 2025 12:00:21 +0100 Subject: [PATCH 817/825] Bump Sentry to 8.0.0 and update compatibility range See gh-1713 Signed-off-by: Alexander Dinauer --- start-site/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 3c6ad444eb..b036a00a0c 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -62,8 +62,8 @@ initializr: artifactId: sentry-bom versionProperty: sentry.version mappings: - - compatibilityRange: "[3.3.0,3.3.0-M1)" - version: 7.14.0 + - compatibilityRange: "[3.3.0,3.5.0-M1)" + version: 8.0.0 solace-spring-boot: groupId: com.solace.spring.boot artifactId: solace-spring-boot-bom @@ -963,7 +963,7 @@ initializr: id: sentry bom: sentry description: Application performance monitoring and error tracking that help software teams see clearer, solve quicker, and learn continuously. - compatibilityRange: "[3.3.0,3.3.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" groupId: io.sentry artifactId: sentry-spring-boot-starter-jakarta links: From 8f5859fb63ab07846999563c293f31850236e59d Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 31 Jan 2025 08:24:21 +0100 Subject: [PATCH 818/825] Upgrade to Spring Cloud 2025.0.0-M1 Closes gh-1714 --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index b036a00a0c..128365b236 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -97,9 +97,9 @@ initializr: - compatibilityRange: "[3.4.0,3.5.0-M1)" version: 2024.0.0 - compatibilityRange: "[3.5.0-M1,3.6.0-M1)" - version: 2025.0.0-SNAPSHOT + version: 2025.0.0-M1 repositories: - - spring-snapshots + - spring-milestones spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies From 87120b58a63b9838f9985781c54b2ab479a981fd Mon Sep 17 00:00:00 2001 From: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> Date: Fri, 31 Jan 2025 08:47:29 +0200 Subject: [PATCH 819/825] Upgrade to Vaadin 24.5.11 and 24.6.4 See gh-1715 Signed-off-by: Zhe Sun <31067185+ZheSun88@users.noreply.github.com> --- start-site/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 128365b236..4c4575f9d8 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -159,9 +159,9 @@ initializr: versionProperty: vaadin.version mappings: - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 24.5.10 + version: 24.5.11 - compatibilityRange: "[3.4.0,3.5.0-M1)" - version: 24.6.3 + version: 24.6.4 platform: compatibilityRange: "3.3.0" dependencies: From 5afc515063b10af81a3a94968aa2e3919cab8a55 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Fri, 31 Jan 2025 03:08:12 -0600 Subject: [PATCH 820/825] Upgrade DGS to 10.0.3 See gh-1716 Signed-off-by: ferclager <17533449+ferclager@users.noreply.github.com> --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 4c4575f9d8..ce035ddf7e 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -56,7 +56,7 @@ initializr: versionProperty: netflix-dgs.version mappings: - compatibilityRange: "[3.3.0,3.5.0-M1)" - version: 10.0.1 + version: 10.0.3 sentry: groupId: io.sentry artifactId: sentry-bom From 84b182aa3b32e98dcbaed87aac72239e965d2d52 Mon Sep 17 00:00:00 2001 From: ferclager <17533449+ferclager@users.noreply.github.com> Date: Fri, 31 Jan 2025 03:20:33 -0600 Subject: [PATCH 821/825] Upgrade Sentry to 8.1.0 See gh-1717 Signed-off-by: ferclager <17533449+ferclager@users.noreply.github.com> --- start-site/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index ce035ddf7e..2a64bb8d96 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -63,7 +63,7 @@ initializr: versionProperty: sentry.version mappings: - compatibilityRange: "[3.3.0,3.5.0-M1)" - version: 8.0.0 + version: 8.1.0 solace-spring-boot: groupId: com.solace.spring.boot artifactId: solace-spring-boot-bom From 054f7fa3a459324aadf57dba7134262cd8152766 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 3 Feb 2025 09:43:29 +0100 Subject: [PATCH 822/825] Use Spring AI 1.0.0-M5 from Maven Central Closes gh-1718 --- start-site/src/main/resources/application.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 2a64bb8d96..a3a893fa3d 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -85,7 +85,6 @@ initializr: mappings: - compatibilityRange: "[3.3.0,3.5.0-M1)" version: 1.0.0-M5 - repositories: spring-milestones spring-cloud: groupId: org.springframework.cloud artifactId: spring-cloud-dependencies From bb9302dffba833cdfa51b94ca18525fe057032ec Mon Sep 17 00:00:00 2001 From: Diego Marquez Date: Thu, 6 Feb 2025 14:11:07 -0500 Subject: [PATCH 823/825] Update Spring Cloud GCP to 5.11.0 and 6.0.0 See gh-1719 Signed-off-by: Diego Marquez --- start-site/src/main/resources/application.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index a3a893fa3d..e1538ffcff 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -113,7 +113,9 @@ initializr: additionalBoms: [ spring-cloud ] mappings: - compatibilityRange: "[3.3.0,3.4.0-M1)" - version: 5.10.0 + version: 5.11.0 + - compatibilityRange: "[3.4.0,3.5.0-M1)" + version: 6.0.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies From 1b2be234615675be5ed7894684417c939a996b70 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 7 Feb 2025 08:43:24 +0100 Subject: [PATCH 824/825] Polish "Update Spring Cloud GCP to 5.11.0 and 6.0.0" See gh-1719 --- start-site/src/main/resources/application.yml | 2 +- ...TestcontainersProjectGenerationConfigurationTests.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index e1538ffcff..30097d2e20 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -1427,7 +1427,7 @@ initializr: description: Azure Storage Sample - name: Google Cloud bom: spring-cloud-gcp - compatibilityRange: "[3.3.0,3.4.0-M1)" + compatibilityRange: "[3.3.0,3.5.0-M1)" content: - name: Google Cloud Support id: cloud-gcp diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index 9521353576..ca982c02de 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -416,21 +416,21 @@ fun contextLoads() { @Test void shouldAddHelpSection() { assertHelpDocument("testcontainers", "data-mongodb", "postgresql").contains( - "https://docs.spring.io/spring-boot/3.3.0/reference/testing/testcontainers.html#testing.testcontainers") + "https://docs.spring.io/spring-boot/3.4.0/reference/testing/testcontainers.html#testing.testcontainers") .contains( - "https://docs.spring.io/spring-boot/3.3.0/reference/features/dev-services.html#features.dev-services.testcontainers") + "https://docs.spring.io/spring-boot/3.4.0/reference/features/dev-services.html#features.dev-services.testcontainers") .contains("mongo:latest") .contains("postgres:latest"); } private ProjectStructure generateProject(String... dependencies) { - ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, dependencies); + ProjectRequest request = createProjectRequest(SupportedBootVersion.latest(), dependencies); request.setType("maven-build"); return generateProject(request); } private TextAssert assertHelpDocument(String... dependencyIds) { - ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, dependencyIds); + ProjectRequest request = createProjectRequest(SupportedBootVersion.latest(), dependencyIds); return assertThat(helpDocument(request)); } From 0d3a2ac340915cb351dfc7e8354036c17b16dd73 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 7 Feb 2025 09:02:18 +0100 Subject: [PATCH 825/825] Use Spring Boot 3.4.0 in tests --- .../dependency/mybatis/MyBatisTestBuildCustomizerTests.java | 4 ++-- .../neo4j/Neo4jProjectGenerationConfigurationTests.java | 4 ++-- .../dependency/solace/SolaceBinderBuildCustomizerTests.java | 4 ++-- .../dependency/vaadin/VaadinMavenBuildCustomizerTests.java | 4 ++-- .../vaadin/VaadinProjectGenerationConfigurationTests.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java index f253ebb021..1dcd640cf6 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,7 @@ */ class MyBatisTestBuildCustomizerTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void mybatisIsAddedWithSecurity() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java index 05ca1a0f03..cf270239a9 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/neo4j/Neo4jProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,7 +48,7 @@ void createsNeo4jService() { @Test void createsNeo4jServiceWhenSpringAiModuleIsSelected() { - ProjectRequest request = createProjectRequest(SupportedBootVersion.V3_3, "docker-compose", + ProjectRequest request = createProjectRequest(SupportedBootVersion.latest(), "docker-compose", "spring-ai-vectordb-neo4j"); assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/neo4j.yaml")); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java index 5502381cc0..e9e6a40189 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,7 @@ */ class SolaceBinderBuildCustomizerTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void binderNotAddedWhenSolaceNotSelected() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java index 48db9ddf45..64bbed1609 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,7 @@ class VaadinMavenBuildCustomizerTests extends AbstractExtensionTests { @Test void shouldAddProductionProfile() { - ProjectRequest projectRequest = createProjectRequest(SupportedBootVersion.V3_3, "vaadin", "web"); + ProjectRequest projectRequest = createProjectRequest(SupportedBootVersion.latest(), "vaadin", "web"); assertThat(mavenPom(projectRequest)).hasProfile("production").lines().containsSequence( // @formatter:off " ", diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java index 89de609587..e3c3397133 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,7 @@ */ class VaadinProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.V3_3; + private static final SupportedBootVersion BOOT_VERSION = SupportedBootVersion.latest(); @Test void mavenBuildWithVaadinAddProductionProfileWithoutProductionModeFlag() {

    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 z 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