From 912247b9703a755f55c1b8c7f606bcf4d1f968c6 Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Mon, 15 Apr 2024 13:04:58 -0700 Subject: [PATCH 01/34] [DOC-10087] Update v24.1, v23.2, and Cloud examples to use curl rather than wget (#18477) --- .../prod-deployment/insecure-scale-cluster.md | 5 ++--- .../prod-deployment/secure-scale-cluster.md | 7 +++---- .../prod-deployment/insecure-scale-cluster.md | 13 ++++++------ .../prod-deployment/secure-scale-cluster.md | 17 +++++++-------- .../provision-a-cluster-with-terraform.md | 9 ++++---- src/current/v23.2/migrate-from-geojson.md | 2 +- src/current/v23.2/migrate-from-geopackage.md | 2 +- .../v23.2/migrate-from-openstreetmap.md | 2 +- src/current/v23.2/migrate-from-shapefiles.md | 2 +- .../monitor-cockroachdb-with-prometheus.md | 21 +++++++++---------- src/current/v24.1/migrate-from-geojson.md | 2 +- src/current/v24.1/migrate-from-geopackage.md | 2 +- .../v24.1/migrate-from-openstreetmap.md | 2 +- src/current/v24.1/migrate-from-shapefiles.md | 2 +- .../monitor-cockroachdb-with-prometheus.md | 21 +++++++++---------- 15 files changed, 51 insertions(+), 58 deletions(-) diff --git a/src/current/_includes/v23.2/prod-deployment/insecure-scale-cluster.md b/src/current/_includes/v23.2/prod-deployment/insecure-scale-cluster.md index d68e1bdf0fc..8f081ebed38 100644 --- a/src/current/_includes/v23.2/prod-deployment/insecure-scale-cluster.md +++ b/src/current/_includes/v23.2/prod-deployment/insecure-scale-cluster.md @@ -16,8 +16,7 @@ For each additional node you want to add to the cluster, complete the following {% include_cached copy-clipboard.html %} ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-{{ page.release_info.version }}.linux-amd64.tgz \ - | tar -xz + curl -o cockroach-{{ page.release_info.version }}.linux-amd64.tgz; tar xzvf cockroach-{{ page.release_info.version }}.linux-amd64.tgz ~~~ 1. Copy the binary into the `PATH`: @@ -94,7 +93,7 @@ For each additional node you want to add to the cluster, complete the following {% include_cached copy-clipboard.html %} ~~~ shell - $ wget -qO- https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/{{ page.version.version }}/prod-deployment/insecurecockroachdb.service + curl -o insecurecockroachdb.service https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/{{ page.version.version }}/prod-deployment/insecurecockroachdb.service ~~~ Alternatively, you can create the file yourself and copy the script into it: diff --git a/src/current/_includes/v23.2/prod-deployment/secure-scale-cluster.md b/src/current/_includes/v23.2/prod-deployment/secure-scale-cluster.md index 87ef8dbd104..f47e7a184b2 100644 --- a/src/current/_includes/v23.2/prod-deployment/secure-scale-cluster.md +++ b/src/current/_includes/v23.2/prod-deployment/secure-scale-cluster.md @@ -16,8 +16,7 @@ For each additional node you want to add to the cluster, complete the following {% include_cached copy-clipboard.html %} ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-{{ page.release_info.version }}.linux-amd64.tgz \ - | tar -xz + curl -o cockroach-{{ page.release_info.version }}.linux-amd64.tgz https://binaries.cockroachdb.com/cockroach-{{ page.release_info.version }}.linux-amd64.tgz; tar xzvf cockroach-{{ page.release_info.version }}.linux-amd64.tgz ~~~ 1. Copy the binary into the `PATH`: @@ -101,7 +100,7 @@ For each additional node you want to add to the cluster, complete the following {% include_cached copy-clipboard.html %} ~~~ shell - $ wget -qO- https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/{{ page.version.version }}/prod-deployment/securecockroachdb.service + curl -o securecockroachdb.service https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/{{ page.version.version }}/prod-deployment/securecockroachdb.service ~~~ Alternatively, you can create the file yourself and copy the script into it: @@ -118,7 +117,7 @@ For each additional node you want to add to the cluster, complete the following Specify values for the following flags in the sample configuration template: {% include {{ page.version.version }}/prod-deployment/advertise-addr-join.md %} - + 1. Repeat these steps for each additional node that you want in your cluster. diff --git a/src/current/_includes/v24.1/prod-deployment/insecure-scale-cluster.md b/src/current/_includes/v24.1/prod-deployment/insecure-scale-cluster.md index d68e1bdf0fc..aaf0e5f7688 100644 --- a/src/current/_includes/v24.1/prod-deployment/insecure-scale-cluster.md +++ b/src/current/_includes/v24.1/prod-deployment/insecure-scale-cluster.md @@ -56,15 +56,14 @@ For each additional node you want to add to the cluster, complete the following {% include_cached copy-clipboard.html %} ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-{{ page.release_info.version }}.linux-amd64.tgz \ - | tar -xz + curl -o cockroach-{{ page.release_info.version }}.linux-amd64.tgz; tar xzvf cockroach-{{ page.release_info.version }}.linux-amd64.tgz ~~~ 1. Copy the binary into the `PATH`: {% include_cached copy-clipboard.html %} ~~~ shell - $ cp -i cockroach-{{ page.release_info.version }}.linux-amd64/cockroach /usr/local/bin/ + cp -i cockroach-{{ page.release_info.version }}.linux-amd64/cockroach /usr/local/bin/ ~~~ If you get a permissions error, prefix the command with `sudo`. @@ -73,28 +72,28 @@ For each additional node you want to add to the cluster, complete the following {% include_cached copy-clipboard.html %} ~~~ shell - $ mkdir /var/lib/cockroach + mkdir /var/lib/cockroach ~~~ 1. Create a Unix user named `cockroach`: {% include_cached copy-clipboard.html %} ~~~ shell - $ useradd cockroach + useradd cockroach ~~~ 1. Change the ownership of the `cockroach` directory to the user `cockroach`: {% include_cached copy-clipboard.html %} ~~~ shell - $ chown cockroach /var/lib/cockroach + chown cockroach /var/lib/cockroach ~~~ 1. Download the [sample configuration template](https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/{{ page.version.version }}/prod-deployment/insecurecockroachdb.service): {% include_cached copy-clipboard.html %} ~~~ shell - $ wget -qO- https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/{{ page.version.version }}/prod-deployment/insecurecockroachdb.service + curl -o insecurecockroachdb.service https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/{{ page.version.version }}/prod-deployment/insecurecockroachdb.service ~~~ Alternatively, you can create the file yourself and copy the script into it: diff --git a/src/current/_includes/v24.1/prod-deployment/secure-scale-cluster.md b/src/current/_includes/v24.1/prod-deployment/secure-scale-cluster.md index 87ef8dbd104..8c980b018a3 100644 --- a/src/current/_includes/v24.1/prod-deployment/secure-scale-cluster.md +++ b/src/current/_includes/v24.1/prod-deployment/secure-scale-cluster.md @@ -56,15 +56,14 @@ For each additional node you want to add to the cluster, complete the following {% include_cached copy-clipboard.html %} ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-{{ page.release_info.version }}.linux-amd64.tgz \ - | tar -xz + curl -o cockroach-{{ page.release_info.version }}.linux-amd64.tgz https://binaries.cockroachdb.com/cockroach-{{ page.release_info.version }}.linux-amd64.tgz; tar xzvf cockroach-{{ page.release_info.version }}.linux-amd64.tgz ~~~ 1. Copy the binary into the `PATH`: {% include_cached copy-clipboard.html %} ~~~ shell - $ cp -i cockroach-{{ page.release_info.version }}.linux-amd64/cockroach /usr/local/bin/ + cp -i cockroach-{{ page.release_info.version }}.linux-amd64/cockroach /usr/local/bin/ ~~~ If you get a permissions error, prefix the command with `sudo`. @@ -73,35 +72,35 @@ For each additional node you want to add to the cluster, complete the following {% include_cached copy-clipboard.html %} ~~~ shell - $ mkdir /var/lib/cockroach + mkdir /var/lib/cockroach ~~~ 1. Create a Unix user named `cockroach`: {% include_cached copy-clipboard.html %} ~~~ shell - $ useradd cockroach + useradd cockroach ~~~ 1. Move the `certs` directory to the `cockroach` directory. {% include_cached copy-clipboard.html %} ~~~ shell - $ mv certs /var/lib/cockroach/ + mv certs /var/lib/cockroach/ ~~~ 1. Change the ownership of the `cockroach` directory to the user `cockroach`: {% include_cached copy-clipboard.html %} ~~~ shell - $ chown -R cockroach /var/lib/cockroach + chown -R cockroach /var/lib/cockroach ~~~ 1. Download the [sample configuration template](https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/{{ page.version.version }}/prod-deployment/securecockroachdb.service): {% include_cached copy-clipboard.html %} ~~~ shell - $ wget -qO- https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/{{ page.version.version }}/prod-deployment/securecockroachdb.service + curl -o securecockroachdb.service https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/{{ page.version.version }}/prod-deployment/securecockroachdb.service ~~~ Alternatively, you can create the file yourself and copy the script into it: @@ -118,7 +117,7 @@ For each additional node you want to add to the cluster, complete the following Specify values for the following flags in the sample configuration template: {% include {{ page.version.version }}/prod-deployment/advertise-addr-join.md %} - + 1. Repeat these steps for each additional node that you want in your cluster. diff --git a/src/current/cockroachcloud/provision-a-cluster-with-terraform.md b/src/current/cockroachcloud/provision-a-cluster-with-terraform.md index d2e44e2c6ff..94fd26fe304 100644 --- a/src/current/cockroachcloud/provision-a-cluster-with-terraform.md +++ b/src/current/cockroachcloud/provision-a-cluster-with-terraform.md @@ -23,7 +23,6 @@ Watch a demo where we use Terraform to create a CockroachDB Serverless cluster h Before you start this tutorial, you must - [Install Terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli). -- Install the [`wget` command line utility](https://www.gnu.org/software/wget/). - Create a [service account]({% link cockroachcloud/managing-access.md %}#manage-service-accounts) and [API key]({% link cockroachcloud/managing-access.md %}#api-access) in the [CockroachDB Cloud Console](https://cockroachlabs.cloud), and assign `admin` privilege or Cluster Creator / Cluster Admin role at the organization scope. Refer to: [Service Accounts]({% link cockroachcloud/authorization.md %}#service-accounts) ## Create the Terraform configuration files @@ -34,11 +33,11 @@ Terraform uses a infrastructure-as-code approach to managing resources. Terrafor In this tutorial, you will create a CockroachDB {{ site.data.products.serverless }} cluster. -1. In a terminal create a new directory and use `wget` to download the CockroachDB {{ site.data.products.serverless }} `main.tf` example file: +1. In a terminal create a new directory and use `curl` to download the CockroachDB {{ site.data.products.serverless }} `main.tf` example file: {% include_cached copy-clipboard.html %} ~~~ shell - wget https://raw.githubusercontent.com/cockroachdb/terraform-provider-cockroach/main/examples/workflows/cockroach_serverless_cluster/main.tf + curl -o main.tf https://raw.githubusercontent.com/cockroachdb/terraform-provider-cockroach/main/examples/workflows/cockroach_serverless_cluster/main.tf ~~~ 1. In a text editor create a new file `terraform.tfvars` with the following settings: @@ -79,11 +78,11 @@ In this tutorial, you will create a CockroachDB {{ site.data.products.serverless In this tutorial, you will create a CockroachDB {{ site.data.products.dedicated }} cluster -1. In a terminal create a new directory and use `wget` to download the CockroachDB {{ site.data.products.dedicated }} `main.tf` example file: +1. In a terminal create a new directory and use `curl` to download the CockroachDB {{ site.data.products.dedicated }} `main.tf` example file: {% include_cached copy-clipboard.html %} ~~~ shell - wget https://raw.githubusercontent.com/cockroachdb/terraform-provider-cockroach/main/examples/workflows/cockroach_dedicated_cluster/main.tf + curl -o main.tf https://raw.githubusercontent.com/cockroachdb/terraform-provider-cockroach/main/examples/workflows/cockroach_dedicated_cluster/main.tf ~~~ 1. In a text editor create a new file `terraform.tfvars` with the following settings: diff --git a/src/current/v23.2/migrate-from-geojson.md b/src/current/v23.2/migrate-from-geojson.md index dc27add32b0..6c83c906215 100644 --- a/src/current/v23.2/migrate-from-geojson.md +++ b/src/current/v23.2/migrate-from-geojson.md @@ -27,7 +27,7 @@ First, download the storage tank GeoJSON data: {% include_cached copy-clipboard.html %} ~~~ shell -wget -O tanks.geojson https://geodata.vermont.gov/datasets/986155613c5743239e7b1980b45bbf36_162.geojson +curl -o tanks.geojson https://geodata.vermont.gov/datasets/986155613c5743239e7b1980b45bbf36_162.geojson ~~~ ## Step 2. Convert the GeoJSON data to SQL diff --git a/src/current/v23.2/migrate-from-geopackage.md b/src/current/v23.2/migrate-from-geopackage.md index 0eaffa746ae..8be52473601 100644 --- a/src/current/v23.2/migrate-from-geopackage.md +++ b/src/current/v23.2/migrate-from-geopackage.md @@ -27,7 +27,7 @@ To follow along with the example below, you will need the following prerequisite {% include_cached copy-clipboard.html %} ~~~ shell - wget https://resources.gisdata.mn.gov/pub/gdrs/data/pub/us_mn_state_dnr/env_mn_springs_inventory/gpkg_env_mn_springs_inventory.zip + curl -o gpkg_env_mn_springs_inventory.zip https://resources.gisdata.mn.gov/pub/gdrs/data/pub/us_mn_state_dnr/env_mn_springs_inventory/gpkg_env_mn_springs_inventory.zip ~~~ 1. Unzip the file: diff --git a/src/current/v23.2/migrate-from-openstreetmap.md b/src/current/v23.2/migrate-from-openstreetmap.md index 27e4012bf91..db717368941 100644 --- a/src/current/v23.2/migrate-from-openstreetmap.md +++ b/src/current/v23.2/migrate-from-openstreetmap.md @@ -24,7 +24,7 @@ First, download the OSM data: {% include_cached copy-clipboard.html %} ~~~ shell -wget https://download.geofabrik.de/australia-oceania/australia-latest.osm.pbf +curl -o australia-oceania/australia-latest.osm.pbf https://download.geofabrik.de/australia-oceania/australia-latest.osm.pbf ~~~ ## Step 2. Prepare the database diff --git a/src/current/v23.2/migrate-from-shapefiles.md b/src/current/v23.2/migrate-from-shapefiles.md index 0e9d9e2befe..bfc3cc7fa34 100644 --- a/src/current/v23.2/migrate-from-shapefiles.md +++ b/src/current/v23.2/migrate-from-shapefiles.md @@ -36,7 +36,7 @@ To follow along with the example below, you will need the following prerequisite {% include_cached copy-clipboard.html %} ~~~ shell - wget http://web.archive.org/web/20201018170120/https://www.spc.noaa.gov/gis/svrgis/zipped/1950-2018-torn-initpoint.zip + curl -o 1950-2018-torn-initpoint.zip http://web.archive.org/web/20201018170120/https://www.spc.noaa.gov/gis/svrgis/zipped/1950-2018-torn-initpoint.zip ~~~ 1. Unzip the data file: diff --git a/src/current/v23.2/monitor-cockroachdb-with-prometheus.md b/src/current/v23.2/monitor-cockroachdb-with-prometheus.md index c59763f8648..8401aa6fa3c 100644 --- a/src/current/v23.2/monitor-cockroachdb-with-prometheus.md +++ b/src/current/v23.2/monitor-cockroachdb-with-prometheus.md @@ -43,8 +43,7 @@ This tutorial explores the CockroachDB {{ site.data.products.core }} integration {% include_cached copy-clipboard.html %} ~~~ shell - $ wget https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/prometheus.yml \ - -O prometheus.yml + curl -o prometheus.yml https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/prometheus.yml ~~~ When you examine the configuration file, you'll see that it is set up to scrape the time series metrics of a single, insecure local node every 10 seconds: @@ -65,22 +64,22 @@ This tutorial explores the CockroachDB {{ site.data.products.core }} integration {% include_cached copy-clipboard.html %} ~~~ shell - $ mkdir rules + mkdir rules ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ cd rules + cd rules ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ wget -P rules https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/rules/aggregation.rules.yml + curl -o rules/aggregation.rules.yml https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/rules/aggregation.rules.yml ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ wget -P rules https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/rules/alerts.rules.yml + curl -o rules/alerts-rules.yml https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/rules/alerts.rules.yml ~~~ ## Step 3. Start Prometheus @@ -178,25 +177,25 @@ Although Prometheus lets you graph metrics, [Grafana](https://grafana.com/) is a {% include_cached copy-clipboard.html %} ~~~ shell - $ wget https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/runtime.json + curl -o runtime.json https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/runtime.json # runtime dashboard: node status, including uptime, memory, and cpu. ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ wget https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/storage.json + curl -o storage.json https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/storage.json # storage dashboard: storage availability. ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ wget https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/sql.json + curl -o sql.json https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/sql.json # sql dashboard: sql queries/transactions. ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ wget https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/replication.json + curl -o replication.json https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/replication.json # replicas dashboard: replica information and operations. ~~~ @@ -214,4 +213,4 @@ When storage of time-series metrics is disabled, the cluster continues to expose - [Metrics]({% link {{ page.version.version }}/metrics.md %}) - [Essential Metrics for CockroachDB {{ site.data.products.core }} Deployments]({% link {{ page.version.version }}/essential-metrics-self-hosted.md %}) - [Essential Metrics for CockroachDB {{ site.data.products.dedicated }} Deployments]({% link {{ page.version.version }}/essential-metrics-dedicated.md %}) -- [Differences in Metrics between Third-Party Monitoring Integrations and DB Console]({% link {{ page.version.version }}/differences-in-metrics-between-third-party-monitoring-integrations-and-db-console.md %}) \ No newline at end of file +- [Differences in Metrics between Third-Party Monitoring Integrations and DB Console]({% link {{ page.version.version }}/differences-in-metrics-between-third-party-monitoring-integrations-and-db-console.md %}) diff --git a/src/current/v24.1/migrate-from-geojson.md b/src/current/v24.1/migrate-from-geojson.md index dc27add32b0..6c83c906215 100644 --- a/src/current/v24.1/migrate-from-geojson.md +++ b/src/current/v24.1/migrate-from-geojson.md @@ -27,7 +27,7 @@ First, download the storage tank GeoJSON data: {% include_cached copy-clipboard.html %} ~~~ shell -wget -O tanks.geojson https://geodata.vermont.gov/datasets/986155613c5743239e7b1980b45bbf36_162.geojson +curl -o tanks.geojson https://geodata.vermont.gov/datasets/986155613c5743239e7b1980b45bbf36_162.geojson ~~~ ## Step 2. Convert the GeoJSON data to SQL diff --git a/src/current/v24.1/migrate-from-geopackage.md b/src/current/v24.1/migrate-from-geopackage.md index 0eaffa746ae..8be52473601 100644 --- a/src/current/v24.1/migrate-from-geopackage.md +++ b/src/current/v24.1/migrate-from-geopackage.md @@ -27,7 +27,7 @@ To follow along with the example below, you will need the following prerequisite {% include_cached copy-clipboard.html %} ~~~ shell - wget https://resources.gisdata.mn.gov/pub/gdrs/data/pub/us_mn_state_dnr/env_mn_springs_inventory/gpkg_env_mn_springs_inventory.zip + curl -o gpkg_env_mn_springs_inventory.zip https://resources.gisdata.mn.gov/pub/gdrs/data/pub/us_mn_state_dnr/env_mn_springs_inventory/gpkg_env_mn_springs_inventory.zip ~~~ 1. Unzip the file: diff --git a/src/current/v24.1/migrate-from-openstreetmap.md b/src/current/v24.1/migrate-from-openstreetmap.md index 27e4012bf91..931f5d24e7b 100644 --- a/src/current/v24.1/migrate-from-openstreetmap.md +++ b/src/current/v24.1/migrate-from-openstreetmap.md @@ -24,7 +24,7 @@ First, download the OSM data: {% include_cached copy-clipboard.html %} ~~~ shell -wget https://download.geofabrik.de/australia-oceania/australia-latest.osm.pbf +curl -o australia-latest.osm.pbf https://download.geofabrik.de/australia-oceania/australia-latest.osm.pbf ~~~ ## Step 2. Prepare the database diff --git a/src/current/v24.1/migrate-from-shapefiles.md b/src/current/v24.1/migrate-from-shapefiles.md index 0e9d9e2befe..bfc3cc7fa34 100644 --- a/src/current/v24.1/migrate-from-shapefiles.md +++ b/src/current/v24.1/migrate-from-shapefiles.md @@ -36,7 +36,7 @@ To follow along with the example below, you will need the following prerequisite {% include_cached copy-clipboard.html %} ~~~ shell - wget http://web.archive.org/web/20201018170120/https://www.spc.noaa.gov/gis/svrgis/zipped/1950-2018-torn-initpoint.zip + curl -o 1950-2018-torn-initpoint.zip http://web.archive.org/web/20201018170120/https://www.spc.noaa.gov/gis/svrgis/zipped/1950-2018-torn-initpoint.zip ~~~ 1. Unzip the data file: diff --git a/src/current/v24.1/monitor-cockroachdb-with-prometheus.md b/src/current/v24.1/monitor-cockroachdb-with-prometheus.md index c59763f8648..ae54f6a7d4b 100644 --- a/src/current/v24.1/monitor-cockroachdb-with-prometheus.md +++ b/src/current/v24.1/monitor-cockroachdb-with-prometheus.md @@ -43,8 +43,7 @@ This tutorial explores the CockroachDB {{ site.data.products.core }} integration {% include_cached copy-clipboard.html %} ~~~ shell - $ wget https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/prometheus.yml \ - -O prometheus.yml + curl -o prometheus.yml https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/prometheus.yml ~~~ When you examine the configuration file, you'll see that it is set up to scrape the time series metrics of a single, insecure local node every 10 seconds: @@ -65,22 +64,22 @@ This tutorial explores the CockroachDB {{ site.data.products.core }} integration {% include_cached copy-clipboard.html %} ~~~ shell - $ mkdir rules + mkdir rules ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ cd rules + cd rules ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ wget -P rules https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/rules/aggregation.rules.yml + curl -o rules/aggregation.rules.yml https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/rules/aggregation.rules.yml ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ wget -P rules https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/rules/alerts.rules.yml + curl -o rules/alerts.rules.yml https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/rules/alerts.rules.yml ~~~ ## Step 3. Start Prometheus @@ -178,25 +177,25 @@ Although Prometheus lets you graph metrics, [Grafana](https://grafana.com/) is a {% include_cached copy-clipboard.html %} ~~~ shell - $ wget https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/runtime.json + curl -o runtime.json https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/runtime.json # runtime dashboard: node status, including uptime, memory, and cpu. ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ wget https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/storage.json + curl -o storage.json https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/storage.json # storage dashboard: storage availability. ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ wget https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/sql.json + curl -o sql.json https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/sql.json # sql dashboard: sql queries/transactions. ~~~ {% include_cached copy-clipboard.html %} ~~~ shell - $ wget https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/replication.json + curl -o replication.json https://raw.githubusercontent.com/cockroachdb/cockroach/master/monitoring/grafana-dashboards/by-cluster/replication.json # replicas dashboard: replica information and operations. ~~~ @@ -214,4 +213,4 @@ When storage of time-series metrics is disabled, the cluster continues to expose - [Metrics]({% link {{ page.version.version }}/metrics.md %}) - [Essential Metrics for CockroachDB {{ site.data.products.core }} Deployments]({% link {{ page.version.version }}/essential-metrics-self-hosted.md %}) - [Essential Metrics for CockroachDB {{ site.data.products.dedicated }} Deployments]({% link {{ page.version.version }}/essential-metrics-dedicated.md %}) -- [Differences in Metrics between Third-Party Monitoring Integrations and DB Console]({% link {{ page.version.version }}/differences-in-metrics-between-third-party-monitoring-integrations-and-db-console.md %}) \ No newline at end of file +- [Differences in Metrics between Third-Party Monitoring Integrations and DB Console]({% link {{ page.version.version }}/differences-in-metrics-between-third-party-monitoring-integrations-and-db-console.md %}) From a6b44c6ac3d83d564c17d710d7e00bb026d18085 Mon Sep 17 00:00:00 2001 From: Rich Loveland Date: Wed, 17 Apr 2024 10:39:32 -0400 Subject: [PATCH 02/34] Update Dedicated transactions per second (TPS) #s (#18464) * Update Dedicated transactions per second (TPS) #s Fixes DOC-10069 --- src/current/cockroachcloud/create-your-cluster.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/current/cockroachcloud/create-your-cluster.md b/src/current/cockroachcloud/create-your-cluster.md index 566c22eaa88..08cf4640f5b 100644 --- a/src/current/cockroachcloud/create-your-cluster.md +++ b/src/current/cockroachcloud/create-your-cluster.md @@ -102,7 +102,7 @@ The choice of hardware per node determines the [cost](#step-2-select-the-cloud-p Factor | Description ----------|------------ - Transactions per second | Each vCPU can handle around 1000 transactions per second. For example, 2 vCPUs can handle 2000 transactions per second and 4 vCPUs can handle 4000 transactions per second. + Transactions per second | Each vCPU can handle approximately 400 transactions per second, depending on the workload. Read-heavy workloads can be expected to perform better. Scaling | When scaling up your cluster, it is generally more effective to increase node size up to 16 vCPUs before adding more nodes. For most production applications, we recommend **at least 4 to 8 vCPUs per node**. {{site.data.alerts.callout_info}} From 8a63a2ea155ff1f62f257c9966752b807a446706 Mon Sep 17 00:00:00 2001 From: Rich Loveland Date: Wed, 17 Apr 2024 10:44:21 -0400 Subject: [PATCH 03/34] Add docs for SHOW DEFAULT SESSION VARIABLES FOR ROLE (#18422) * Add SHOW DEFAULT SESSION VARIABLES FOR ROLE docs Fixes: - DOC-9603 - DOC-9693 --- .../_includes/v24.1/sidebar-data/sql.json | 8 +- ...show-default-session-variables-for-role.md | 1 + src/current/v24.1/alter-database.md | 4 + src/current/v24.1/alter-role.md | 9 + src/current/v24.1/information-schema.md | 2 + src/current/v24.1/reset-vars.md | 1 + src/current/v24.1/session-variables.md | 13 +- src/current/v24.1/set-cluster-setting.md | 1 + src/current/v24.1/set-vars.md | 1 + src/current/v24.1/show-cluster-setting.md | 1 + ...show-default-session-variables-for-role.md | 157 ++++++++++++++++++ src/current/v24.1/show-vars.md | 1 + src/current/v24.1/sql-statements.md | 1 + 13 files changed, 198 insertions(+), 2 deletions(-) create mode 100644 src/current/_includes/v24.1/sql/show-default-session-variables-for-role.md create mode 100644 src/current/v24.1/show-default-session-variables-for-role.md diff --git a/src/current/_includes/v24.1/sidebar-data/sql.json b/src/current/_includes/v24.1/sidebar-data/sql.json index 8e77564e4b3..6177e068a89 100644 --- a/src/current/_includes/v24.1/sidebar-data/sql.json +++ b/src/current/_includes/v24.1/sidebar-data/sql.json @@ -604,6 +604,12 @@ "/${VERSION}/show-default-privileges.html" ] }, + { + "title": "SHOW DEFAULT SESSION VARIABLES FOR ROLE", + "urls": [ + "/${VERSION}/show-default-session-variables-for-role.html" + ] + }, { "title": "SHOW ENUMS", "urls": [ @@ -1227,4 +1233,4 @@ ] } ] - } \ No newline at end of file + } diff --git a/src/current/_includes/v24.1/sql/show-default-session-variables-for-role.md b/src/current/_includes/v24.1/sql/show-default-session-variables-for-role.md new file mode 100644 index 00000000000..d88debb088b --- /dev/null +++ b/src/current/_includes/v24.1/sql/show-default-session-variables-for-role.md @@ -0,0 +1 @@ +For a list of the session variables that have been updated from default values, see [`SHOW DEFAULT SESSION VARIABLES FOR ROLE`]({% link {{ page.version.version }}/show-default-session-variables-for-role.md %}). diff --git a/src/current/v24.1/alter-database.md b/src/current/v24.1/alter-database.md index 0cf5d457111..635984ca4f0 100644 --- a/src/current/v24.1/alter-database.md +++ b/src/current/v24.1/alter-database.md @@ -347,6 +347,8 @@ For usage, see [Synopsis](#synopsis). `ALTER DATABASE ... RESET {session variable}` resets a [session variable]({% link {{ page.version.version }}/set-vars.md %}#supported-variables) for a database to its default value for the client session. +{% include {{page.version.version}}/sql/show-default-session-variables-for-role.md %} + #### Required privileges No [privileges]({% link {{ page.version.version }}/security-reference/authorization.md %}#managing-privileges) are required to reset a session setting. @@ -369,6 +371,8 @@ In CockroachDB, the following are aliases for `ALTER DATABASE ... RESET {session `ALTER DATABASE ... SET {session variable}` sets the default value of a [session variable]({% link {{ page.version.version }}/set-vars.md %}#supported-variables) for all future sessions on the database. This command does **not** alter the session setting of the current session. +{% include {{page.version.version}}/sql/show-default-session-variables-for-role.md %} + #### Required privileges To set the `role` session variable, the current user must be a member of the `admin` role, or a member of the target role. diff --git a/src/current/v24.1/alter-role.md b/src/current/v24.1/alter-role.md index c650418ee31..206f5f82088 100644 --- a/src/current/v24.1/alter-role.md +++ b/src/current/v24.1/alter-role.md @@ -148,6 +148,8 @@ max@:26257/defaultdb> SHOW timezone; (1 row) ~~~ +{% include {{page.version.version}}/sql/show-default-session-variables-for-role.md %} + ### Set default session variable values for a role in a specific database In the following example, the `root` user creates a role named `max` and a database named `movr`, and sets the default value of the `statement_timeout` [session variable]({% link {{ page.version.version }}/set-vars.md %}#supported-variables) for the `max` role in the `movr` database. @@ -194,6 +196,8 @@ max@:26257/movr> SHOW statement_timeout; (1 row) ~~~ +{% include {{page.version.version}}/sql/show-default-session-variables-for-role.md %} + ### Set default session variable values for a specific database In the following example, the `root` user creates a database named `movr`, and sets the default value of the `timezone` [session variable]({% link {{ page.version.version }}/set-vars.md %}#supported-variables) for all roles in that database. @@ -236,6 +240,8 @@ root@:26257/movr> SHOW timezone; (1 row) ~~~ +{% include {{page.version.version}}/sql/show-default-session-variables-for-role.md %} + ### Set default session variable values for all users To set a default value for all users for any [session variable]({% link {{ page.version.version }}/set-vars.md %}) that applies during login, issue a statement like the following: @@ -251,6 +257,8 @@ ALTER ROLE {% include {{page.version.version}}/sql/sql-defaults-cluster-settings-deprecation-notice.md %} +{% include {{page.version.version}}/sql/show-default-session-variables-for-role.md %} + ## See also - [`DROP ROLE`]({% link {{ page.version.version }}/drop-role.md %}) @@ -260,3 +268,4 @@ ALTER ROLE - [`cockroach cert`]({% link {{ page.version.version }}/cockroach-cert.md %}) - [SQL Statements]({% link {{ page.version.version }}/sql-statements.md %}) - [Authorization Best Practices]({% link {{ page.version.version }}/security-reference/authorization.md %}#authorization-best-practices) +- [`SHOW DEFAULT SESSION VARIABLES FOR ROLE`]({% link {{ page.version.version }}/show-default-session-variables-for-role.md %}) diff --git a/src/current/v24.1/information-schema.md b/src/current/v24.1/information-schema.md index 868b9a94ed8..cf09b16b7cf 100644 --- a/src/current/v24.1/information-schema.md +++ b/src/current/v24.1/information-schema.md @@ -310,6 +310,8 @@ Column | Description For a list of the session variables, see [supported variables]({% link {{ page.version.version }}/show-vars.md %}#supported-variables). +{% include {{page.version.version}}/sql/show-default-session-variables-for-role.md %} + ### statistics `statistics` identifies table [indexes]({% link {{ page.version.version }}/indexes.md %}). diff --git a/src/current/v24.1/reset-vars.md b/src/current/v24.1/reset-vars.md index ae575de93e0..275c2c77ebf 100644 --- a/src/current/v24.1/reset-vars.md +++ b/src/current/v24.1/reset-vars.md @@ -87,3 +87,4 @@ No [privileges]({% link {{ page.version.version }}/security-reference/authorizat - [`SET {session variable}`]({% link {{ page.version.version }}/set-vars.md %}) - [`SHOW {session variable}`]({% link {{ page.version.version }}/show-vars.md %}) +- [`SHOW DEFAULT SESSION VARIABLES FOR ROLE`]({% link {{ page.version.version }}/show-default-session-variables-for-role.md %}) diff --git a/src/current/v24.1/session-variables.md b/src/current/v24.1/session-variables.md index 977cb562346..d9c37767033 100644 --- a/src/current/v24.1/session-variables.md +++ b/src/current/v24.1/session-variables.md @@ -11,4 +11,15 @@ CockroachDB supports setting session variables for the duration of a single tran ## Supported variables -{% include {{ page.version.version }}/misc/session-vars.md %} \ No newline at end of file +{% include {{ page.version.version }}/misc/session-vars.md %} + +## See also + +- [`SET {session variable}`]({% link {{ page.version.version }}/set-vars.md %}) +- [`SET TRANSACTION`]({% link {{ page.version.version }}/set-transaction.md %}) +- [`SET CLUSTER SETTING`]({% link {{ page.version.version }}/set-cluster-setting.md %}) +- [`SHOW {session variable}`]({% link {{ page.version.version }}/show-vars.md %}) +- [The `TIMESTAMP` and `TIMESTAMPTZ` data types.]({% link {{ page.version.version }}/timestamp.md %}) +- [`SHOW TRACE FOR SESSION`]({% link {{ page.version.version }}/show-trace.md %}) +- [`pg_catalog`]({% link {{ page.version.version }}/pg-catalog.md %}) +- [`SHOW DEFAULT SESSION VARIABLES FOR ROLE`]({% link {{ page.version.version }}/show-default-session-variables-for-role.md %}) diff --git a/src/current/v24.1/set-cluster-setting.md b/src/current/v24.1/set-cluster-setting.md index 0de3351d5a3..44e1e3418d4 100644 --- a/src/current/v24.1/set-cluster-setting.md +++ b/src/current/v24.1/set-cluster-setting.md @@ -122,3 +122,4 @@ To opt out of [automatic diagnostic reporting]({% link {{ page.version.version } - [`SET {session variable}`]({% link {{ page.version.version }}/set-vars.md %}) - [`SHOW CLUSTER SETTING`]({% link {{ page.version.version }}/show-cluster-setting.md %}) - [Cluster settings]({% link {{ page.version.version }}/cluster-settings.md %}) +- [`SHOW DEFAULT SESSION VARIABLES FOR ROLE`]({% link {{ page.version.version }}/show-default-session-variables-for-role.md %}) diff --git a/src/current/v24.1/set-vars.md b/src/current/v24.1/set-vars.md index 1db4ca8c47a..ca6c6c3d76f 100644 --- a/src/current/v24.1/set-vars.md +++ b/src/current/v24.1/set-vars.md @@ -465,3 +465,4 @@ When setting a time zone, note the following: - [The `TIMESTAMP` and `TIMESTAMPTZ` data types.]({% link {{ page.version.version }}/timestamp.md %}) - [`SHOW TRACE FOR SESSION`]({% link {{ page.version.version }}/show-trace.md %}) - [`pg_catalog`]({% link {{ page.version.version }}/pg-catalog.md %}) +- [`SHOW DEFAULT SESSION VARIABLES FOR ROLE`]({% link {{ page.version.version }}/show-default-session-variables-for-role.md %}) diff --git a/src/current/v24.1/show-cluster-setting.md b/src/current/v24.1/show-cluster-setting.md index 88c1b197db2..6c399a5a14d 100644 --- a/src/current/v24.1/show-cluster-setting.md +++ b/src/current/v24.1/show-cluster-setting.md @@ -141,3 +141,4 @@ Field | Description - [`SHOW GRANTS`]({% link {{ page.version.version }}/show-grants.md %}) - [`SHOW INDEX`]({% link {{ page.version.version }}/show-index.md %}) - [`SHOW USERS`]({% link {{ page.version.version }}/show-users.md %}) +- [`SHOW DEFAULT SESSION VARIABLES FOR ROLE`]({% link {{ page.version.version }}/show-default-session-variables-for-role.md %}) diff --git a/src/current/v24.1/show-default-session-variables-for-role.md b/src/current/v24.1/show-default-session-variables-for-role.md new file mode 100644 index 00000000000..eb2c42d5a4b --- /dev/null +++ b/src/current/v24.1/show-default-session-variables-for-role.md @@ -0,0 +1,157 @@ +--- +title: SHOW DEFAULT SESSION VARIABLES FOR ROLE +summary: The SHOW DEFAULT SESSION VARIABLES FOR ROLE statement lists the default values for session variables applied to a given user. +keywords: reflection +toc: true +docs_area: reference.sql +--- + +The `SHOW DEFAULT SESSION VARIABLES FOR ROLE` [statement]({% link {{ page.version.version }}/sql-statements.md %}) lists the values for updated [session variables]({% link {{ page.version.version }}/set-vars.md %}) that are applied to a given [user or role]({% link {{ page.version.version }}/security-reference/authorization.md %}#roles). + +The results returned only include the values of session variables that are changed from the defaults. When no session variables have been changed from the defaults for a given role, the statement [returns no values](#output-when-no-session-variables-have-been-changed). + +## Synopsis + +
+{% remote_include https://raw.githubusercontent.com/cockroachdb/generated-diagrams/{{ page.release_info.crdb_branch_name }}/grammar_svg/show_default_session_variables_for_role.html %} +
+ +## Parameters + +Parameter | Description +----------|------------ +`FOR {role_or_group_or_user}` | The [user, group, or role]({% link {{ page.version.version }}/security-reference/authorization.md %}#roles) whose updated [session variables]({% link {{ page.version.version }}/session-variables.md %}) should be displayed. +`FOR ROLE ALL` | Denotes that changes to default [session variables]({% link {{ page.version.version }}/session-variables.md %}) across all [roles]({% link {{ page.version.version }}/security-reference/authorization.md %}#roles) should be displayed. +`FOR USER ALL` | Alias for `FOR ROLE ALL`. + +## Response + +Column | Description +------|------------ +`session_variables` | The name of the [session variable]({% link {{ page.version.version }}/session-variables.md %}) that has had its default value changed. +`default_values` | The updated value of the [session variable]({% link {{ page.version.version }}/session-variables.md %}). +`database` | The [database]({% link {{ page.version.version }}/show-databases.md %}) where the change to the session variable will be applied. +`inherited_globally` | Whether the change to the variable's value is applied to all users. For more information, see [`ALTER ROLE ALL`]({% link {{page.version.version}}/alter-role.md%}#set-default-session-variable-values-for-all-users). + +## Required Privileges + +The [user]({% link {{ page.version.version }}/security-reference/authorization.md %}#sql-users) issuing this statement must have at least one of the following [privileges]({% link {{ page.version.version }}/security-reference/authorization.md %}#privileges): + +- `CREATEROLE` +- `MODIFYCLUSTERSETTING` +- `MODIFYSQLCLUSTERSETTING` + +## Examples + +### Output when no session variables have been changed + +When no session variables have been changed from the defaults for a given role, the statement returns no values: + +{% include_cached copy-clipboard.html %} +~~~ sql +SHOW DEFAULT SESSION VARIABLES FOR ROLE public; +~~~ + +~~~ +SHOW DEFAULT SESSION VARIABLES FOR ROLE 0 +~~~ + +Another way of confirming zero rows of output: + +{% include_cached copy-clipboard.html %} +~~~ sql +SELECT * FROM [SHOW DEFAULT SESSION VARIABLES FOR ROLE public]; +~~~ + +~~~ + session_variables | default_values | database | inherited_globally +--------------------+----------------+----------+--------------------- +(0 rows) +~~~ + +### Show changed session variables that apply to a user + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE USER movr_auditor; +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER ROLE ALL SET application_name = 'movr'; +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +SHOW DEFAULT SESSION VARIABLES FOR ROLE movr_auditor; +~~~ + +~~~ + session_variables | default_values | database | inherited_globally +--------------------+----------------+----------+--------------------- + application_name | movr | NULL | t +(1 row) +~~~ + +### Show changed session variables that apply to a user in different databases + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE DATABASE movr_audit; +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER ROLE ALL IN DATABASE movr_audit SET application_name = 'movr_audit'; +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +SHOW DEFAULT SESSION VARIABLES FOR ROLE movr_auditor; +~~~ + +~~~ + session_variables | default_values | database | inherited_globally +--------------------+----------------+------------+--------------------- + application_name | movr_audit | movr_audit | t + application_name | movr | NULL | t +(2 rows) +~~~ + +### Show updated default session variables that apply to all users + +{% include_cached copy-clipboard.html %} +~~~ sql +SHOW DEFAULT SESSION VARIABLES FOR ROLE ALL; +~~~ + +~~~ + session_variables | default_values | database +--------------------+----------------+------------- + application_name | movr_audit | movr_audit + application_name | movr | NULL +(2 rows) +~~~ + +### Get inline help in the SQL shell + +{% include_cached copy-clipboard.html %} +~~~ sql +\h SHOW DEFAULT SESSION VARIABLES FOR ROLE +~~~ + +~~~ +Command: SHOW DEFAULT SESSION VARIABLES FOR ROLE +Description: list default session variables for role +Category: privileges and security +Syntax: +SHOW DEFAULT SESSION VARIABLES FOR ROLE +~~~ + +## See also + +- [`ALTER ROLE ALL`]({% link {{page.version.version}}/alter-role.md%}#set-default-session-variable-values-for-all-users) +- [Session Variables]({% link {{ page.version.version }}/session-variables.md %}) +- [`SHOW {session variable}`]({% link {{ page.version.version }}/show-vars.md %}) +- [SQL Statements]({% link {{ page.version.version }}/sql-statements.md %}) +- [Default Privileges]({% link {{ page.version.version }}/security-reference/authorization.md %}#default-privileges) diff --git a/src/current/v24.1/show-vars.md b/src/current/v24.1/show-vars.md index 28648332eb6..f341d856afd 100644 --- a/src/current/v24.1/show-vars.md +++ b/src/current/v24.1/show-vars.md @@ -87,3 +87,4 @@ Special syntax cases supported for compatibility: - [`SHOW GRANTS`]({% link {{ page.version.version }}/show-grants.md %}) - [`SHOW INDEX`]({% link {{ page.version.version }}/show-index.md %}) - [`SHOW USERS`]({% link {{ page.version.version }}/show-users.md %}) +- [`SHOW DEFAULT SESSION VARIABLES FOR ROLE`]({% link {{ page.version.version }}/show-default-session-variables-for-role.md %}) diff --git a/src/current/v24.1/sql-statements.md b/src/current/v24.1/sql-statements.md index c7a4979e09c..4a3fdbf71d4 100644 --- a/src/current/v24.1/sql-statements.md +++ b/src/current/v24.1/sql-statements.md @@ -50,6 +50,7 @@ Statement | Usage [`SHOW CONSTRAINTS`]({% link {{ page.version.version }}/show-constraints.md %}) | List constraints on a table. [`SHOW CREATE`]({% link {{ page.version.version }}/show-create.md %}) | View the `CREATE` statement for a database, function, sequence, table, or view. [`SHOW DATABASES`]({% link {{ page.version.version }}/show-databases.md %}) | List databases in the cluster. +[`SHOW DEFAULT SESSION VARIABLES FOR ROLE`]({% link {{ page.version.version }}/show-default-session-variables-for-role.md %}) | List the values for updated [session variables]({% link {{ page.version.version }}/set-vars.md %}) that are applied to a given [user or role]({% link {{ page.version.version }}/security-reference/authorization.md %}#roles). [`SHOW ENUMS`]({% link {{ page.version.version }}/show-enums.md %}) | List user-defined, [enumerated data types]({% link {{ page.version.version }}/enum.md %}) in a database. [`SHOW FULL TABLE SCANS`]({% link {{ page.version.version }}/show-full-table-scans.md %}) | List recent queries that used a full table scan. [`SHOW INDEX`]({% link {{ page.version.version }}/show-index.md %}) | View index information for a table or database. From 88fb9839a10b74c048b84585f95487ac6918f041 Mon Sep 17 00:00:00 2001 From: Ryan Kuo <8740013+taroface@users.noreply.github.com> Date: Wed, 17 Apr 2024 13:24:42 -0400 Subject: [PATCH 04/34] refactor Known Limitations docs (#18475) * refactor Known Limitations docs --------- Co-authored-by: Matt Linville (he/him) --- .../_includes/v24.1/cdc/avro-udt-composite.md | 2 +- .../_includes/v24.1/cdc/csv-udt-composite.md | 2 +- .../alter-changefeed-limitations.md | 9 + .../alter-type-limitations.md | 1 + ...-materialized-views-inside-transactions.md | 2 +- .../v24.1/known-limitations/cdc-queries.md | 6 +- .../_includes/v24.1/known-limitations/cdc.md | 10 +- .../v24.1/known-limitations/copy-syntax.md | 12 +- .../drop-column-partial-index.md | 1 + .../drop-owned-by-limitations.md | 13 + .../drop-owned-by-role-limitations.md | 9 - .../dropping-renaming-during-upgrade.md | 10 - .../expression-index-limitations.md | 43 + .../full-text-search-unsupported.md | 14 + .../import-into-limitations.md | 11 + .../known-limitations/jsonb-limitations.md | 1 + ...cality-optimized-search-limited-records.md | 0 ...timized-search-virtual-computed-columns.md | 2 +- .../known-limitations/logging-limitations.md | 1 + .../materialized-views-no-stats.md | 4 +- .../multiple-arbiter-indexes.md | 1 + .../plpgsql-datatype-limitations.md | 7 + .../plpgsql-feature-limitations.md | 11 + .../read-committed-limitations.md | 6 + .../restore-multiregion-match.md | 2 + .../restore-tables-non-multi-reg.md | 2 +- .../v24.1/known-limitations/restore-udf.md | 2 +- .../select-for-update-limitations.md | 0 .../set-transaction-no-rollback.md | 2 +- ...ow-backup-locality-incremental-location.md | 1 - .../v24.1/known-limitations/sql-cursors.md | 14 +- .../srid-4326-limitations.md | 1 + .../stats-refresh-upgrade.md | 4 +- .../trigram-unsupported-syntax.md | 4 +- .../known-limitations/udf-limitations.md | 3 - .../udf-stored-proc-limitations.md | 13 + .../userfile-upload-non-recursive.md | 1 - .../vectorized-engine-limitations.md | 2 + ...dexes-cannot-reference-computed-columns.md | 3 - .../sql/expressions-as-on-conflict-targets.md | 40 - .../_includes/v24.1/sql/jsonb-comparison.md | 13 - src/current/v24.1/alter-changefeed.md | 11 +- src/current/v24.1/alter-table.md | 2 +- src/current/v24.1/alter-type.md | 2 +- src/current/v24.1/aws-dms.md | 40 +- src/current/v24.1/configure-logs.md | 2 +- src/current/v24.1/cost-based-optimizer.md | 6 +- src/current/v24.1/create-table.md | 2 +- src/current/v24.1/drop-owned-by.md | 3 +- src/current/v24.1/expression-indexes.md | 5 +- src/current/v24.1/full-text-search.md | 15 +- src/current/v24.1/import-into.md | 10 +- src/current/v24.1/jsonb.md | 12 +- src/current/v24.1/known-limitations.md | 853 ++++++++---------- src/current/v24.1/partial-indexes.md | 11 +- src/current/v24.1/plpgsql.md | 17 +- src/current/v24.1/postgresql-compatibility.md | 4 +- src/current/v24.1/read-committed.md | 13 +- src/current/v24.1/restore.md | 2 +- src/current/v24.1/select-for-update.md | 2 +- src/current/v24.1/srid-4326.md | 4 +- src/current/v24.1/stored-procedures.md | 7 +- src/current/v24.1/trigram-indexes.md | 4 +- src/current/v24.1/user-defined-functions.md | 44 +- src/current/v24.1/vectorized-execution.md | 10 +- src/current/v24.1/views.md | 4 +- 66 files changed, 612 insertions(+), 758 deletions(-) create mode 100644 src/current/_includes/v24.1/known-limitations/alter-changefeed-limitations.md create mode 100644 src/current/_includes/v24.1/known-limitations/alter-type-limitations.md rename src/current/_includes/v24.1/{sql => known-limitations}/cannot-refresh-materialized-views-inside-transactions.md (94%) create mode 100644 src/current/_includes/v24.1/known-limitations/drop-column-partial-index.md create mode 100644 src/current/_includes/v24.1/known-limitations/drop-owned-by-limitations.md delete mode 100644 src/current/_includes/v24.1/known-limitations/drop-owned-by-role-limitations.md delete mode 100644 src/current/_includes/v24.1/known-limitations/dropping-renaming-during-upgrade.md create mode 100644 src/current/_includes/v24.1/known-limitations/expression-index-limitations.md create mode 100644 src/current/_includes/v24.1/known-limitations/full-text-search-unsupported.md create mode 100644 src/current/_includes/v24.1/known-limitations/import-into-limitations.md create mode 100644 src/current/_includes/v24.1/known-limitations/jsonb-limitations.md rename src/current/_includes/v24.1/{sql => known-limitations}/locality-optimized-search-limited-records.md (100%) rename src/current/_includes/v24.1/{sql => known-limitations}/locality-optimized-search-virtual-computed-columns.md (85%) create mode 100644 src/current/_includes/v24.1/known-limitations/logging-limitations.md rename src/current/_includes/v24.1/{sql => known-limitations}/materialized-views-no-stats.md (58%) create mode 100644 src/current/_includes/v24.1/known-limitations/multiple-arbiter-indexes.md create mode 100644 src/current/_includes/v24.1/known-limitations/plpgsql-datatype-limitations.md create mode 100644 src/current/_includes/v24.1/known-limitations/plpgsql-feature-limitations.md create mode 100644 src/current/_includes/v24.1/known-limitations/read-committed-limitations.md rename src/current/_includes/v24.1/{sql => known-limitations}/select-for-update-limitations.md (100%) delete mode 100644 src/current/_includes/v24.1/known-limitations/show-backup-locality-incremental-location.md create mode 100644 src/current/_includes/v24.1/known-limitations/srid-4326-limitations.md rename src/current/_includes/v24.1/{sql => known-limitations}/trigram-unsupported-syntax.md (88%) delete mode 100644 src/current/_includes/v24.1/known-limitations/udf-limitations.md create mode 100644 src/current/_includes/v24.1/known-limitations/udf-stored-proc-limitations.md delete mode 100644 src/current/_includes/v24.1/known-limitations/userfile-upload-non-recursive.md create mode 100644 src/current/_includes/v24.1/known-limitations/vectorized-engine-limitations.md delete mode 100644 src/current/_includes/v24.1/sql/expression-indexes-cannot-reference-computed-columns.md delete mode 100644 src/current/_includes/v24.1/sql/expressions-as-on-conflict-targets.md delete mode 100644 src/current/_includes/v24.1/sql/jsonb-comparison.md diff --git a/src/current/_includes/v24.1/cdc/avro-udt-composite.md b/src/current/_includes/v24.1/cdc/avro-udt-composite.md index 33e621169a2..7a34fbd3253 100644 --- a/src/current/_includes/v24.1/cdc/avro-udt-composite.md +++ b/src/current/_includes/v24.1/cdc/avro-udt-composite.md @@ -1 +1 @@ -A changefeed in [Avro format]({% link {{ page.version.version }}/changefeed-messages.md %}#avro) will not be able to serialize [user-defined composite (tuple) types](create-type.html). [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/102903) \ No newline at end of file +A changefeed in [Avro format]({% link {{ page.version.version }}/changefeed-messages.md %}#avro) will not be able to serialize [user-defined composite (tuple) types](create-type.html). [#102903](https://github.com/cockroachdb/cockroach/issues/102903) \ No newline at end of file diff --git a/src/current/_includes/v24.1/cdc/csv-udt-composite.md b/src/current/_includes/v24.1/cdc/csv-udt-composite.md index 1cf920220d0..834bddd8366 100644 --- a/src/current/_includes/v24.1/cdc/csv-udt-composite.md +++ b/src/current/_includes/v24.1/cdc/csv-udt-composite.md @@ -1 +1 @@ -A changefeed emitting [CSV]({% link {{ page.version.version }}/changefeed-messages.md %}#csv) will include `AS` labels in the message format when the changefeed serializes a [user-defined composite type]({% link {{ page.version.version }}/create-type.md %}). [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/102905) \ No newline at end of file +A changefeed emitting [CSV]({% link {{ page.version.version }}/changefeed-messages.md %}#csv) will include `AS` labels in the message format when the changefeed serializes a [user-defined composite type]({% link {{ page.version.version }}/create-type.md %}). [#102905](https://github.com/cockroachdb/cockroach/issues/102905) \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/alter-changefeed-limitations.md b/src/current/_includes/v24.1/known-limitations/alter-changefeed-limitations.md new file mode 100644 index 00000000000..e31f9b096c8 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/alter-changefeed-limitations.md @@ -0,0 +1,9 @@ +- It is necessary to [`PAUSE`]({% link {{ page.version.version }}/pause-job.md %}) the changefeed before performing any [`ALTER CHANGEFEED`]({% link {{ page.version.version }}/alter-changefeed.md %}) statement. [#77171](https://github.com/cockroachdb/cockroach/issues/77171) +- You cannot alter a changefeed that uses [CDC queries]({% link {{ page.version.version }}/cdc-queries.md %}). [#83033](https://github.com/cockroachdb/cockroach/issues/83033) +- CockroachDB does not keep track of the [`initial_scan`]({% link {{ page.version.version }}/create-changefeed.md %}#initial-scan) option applied to tables when it is set to `yes` or `only`. For example: + + ~~~ sql + ALTER CHANGEFEED {job_ID} ADD table WITH initial_scan = 'yes'; + ~~~ + + This will trigger an initial scan of the table and the changefeed will track `table`. The changefeed will **not** track `initial_scan` specified as an option, so it will not display in the output or after a `SHOW CHANGEFEED JOB` statement. \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/alter-type-limitations.md b/src/current/_includes/v24.1/known-limitations/alter-type-limitations.md new file mode 100644 index 00000000000..33550cec5b5 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/alter-type-limitations.md @@ -0,0 +1 @@ +- When running the [`ALTER TYPE`]({% link {{ page.version.version }}/alter-type.md %}) statement, you can only reference a user-defined type from the database that contains the type. \ No newline at end of file diff --git a/src/current/_includes/v24.1/sql/cannot-refresh-materialized-views-inside-transactions.md b/src/current/_includes/v24.1/known-limitations/cannot-refresh-materialized-views-inside-transactions.md similarity index 94% rename from src/current/_includes/v24.1/sql/cannot-refresh-materialized-views-inside-transactions.md rename to src/current/_includes/v24.1/known-limitations/cannot-refresh-materialized-views-inside-transactions.md index c78308152f6..b0aaf728177 100644 --- a/src/current/_includes/v24.1/sql/cannot-refresh-materialized-views-inside-transactions.md +++ b/src/current/_includes/v24.1/known-limitations/cannot-refresh-materialized-views-inside-transactions.md @@ -24,4 +24,4 @@ SQLSTATE: 25000 ~~~ - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/66008) + [#66008](https://github.com/cockroachdb/cockroach/issues/66008) diff --git a/src/current/_includes/v24.1/known-limitations/cdc-queries.md b/src/current/_includes/v24.1/known-limitations/cdc-queries.md index 95b6cb1cca4..e1e8e7a3e09 100644 --- a/src/current/_includes/v24.1/known-limitations/cdc-queries.md +++ b/src/current/_includes/v24.1/known-limitations/cdc-queries.md @@ -1,8 +1,8 @@ - You can only apply CDC queries on a single table in each statement. - Some [stable functions]({% link {{ page.version.version }}/functions-and-operators.md %}#built-in-functions), notably functions that return MVCC timestamps, are overridden to return the MVCC timestamp of the event, e.g., `transaction_timestamp` or `statement_timestamp`. Additionally, some [time-based functions]({% link {{ page.version.version }}/functions-and-operators.md %}#date-and-time-functions), such as `now()` are not supported. We recommend using the `transaction_timestamp()` function or the {% if page.name == "cdc-queries.md" %} `crdb_internal_mvcc_timestamp` {% else %}[`crdb_internal_mvcc_timestamp`]({% link {{ page.version.version }}/cdc-queries.md %}#crdb-internal-mvcc-timestamp) {% endif %} column instead. -- You cannot [alter]({% link {{ page.version.version }}/alter-changefeed.md %}) a changefeed that uses CDC queries. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/83033) +- You cannot [alter]({% link {{ page.version.version }}/alter-changefeed.md %}) a changefeed that uses CDC queries. [#83033](https://github.com/cockroachdb/cockroach/issues/83033) - The following are not permitted in CDC queries: - [Volatile functions]({% link {{ page.version.version }}/functions-and-operators.md %}#function-volatility). - Sub-select queries. - - [Aggregate]({% link {{ page.version.version }}/functions-and-operators.md %}#aggregate-functions) and [window functions]({% link {{ page.version.version }}/window-functions.md %}) (i.e., functions operating over many rows). [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/98237) -- `delete` changefeed events will only contain the [primary key]({% link {{ page.version.version }}/primary-key.md %}). All other columns will emit as `NULL`. See [Capture delete messages]({% link {{ page.version.version }}/cdc-queries.md %}#capture-delete-messages) for detail on running a CDC query that emits the deleted values. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/83835) + - [Aggregate]({% link {{ page.version.version }}/functions-and-operators.md %}#aggregate-functions) and [window functions]({% link {{ page.version.version }}/window-functions.md %}) (i.e., functions operating over many rows). [#98237](https://github.com/cockroachdb/cockroach/issues/98237) +- `delete` changefeed events will only contain the [primary key]({% link {{ page.version.version }}/primary-key.md %}). All other columns will emit as `NULL`. See [Capture delete messages]({% link {{ page.version.version }}/cdc-queries.md %}#capture-delete-messages) for detail on running a CDC query that emits the deleted values. [#83835](https://github.com/cockroachdb/cockroach/issues/83835) diff --git a/src/current/_includes/v24.1/known-limitations/cdc.md b/src/current/_includes/v24.1/known-limitations/cdc.md index c8769c4cbaa..f5477e11647 100644 --- a/src/current/_includes/v24.1/known-limitations/cdc.md +++ b/src/current/_includes/v24.1/known-limitations/cdc.md @@ -1,9 +1,9 @@ -- Changefeed target options are limited to tables and [column families]({% link {{ page.version.version }}/changefeeds-on-tables-with-column-families.md %}). [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/73435) +- Changefeed target options are limited to tables and [column families]({% link {{ page.version.version }}/changefeeds-on-tables-with-column-families.md %}). [#73435](https://github.com/cockroachdb/cockroach/issues/73435) - {% include {{page.version.version}}/cdc/kafka-vpc-limitation.md %} -- Webhook sinks only support HTTPS. Use the [`insecure_tls_skip_verify`]({% link {{ page.version.version }}/create-changefeed.md %}#tls-skip-verify) parameter when testing to disable certificate verification; however, this still requires HTTPS and certificates. [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/73431) -- Formats for changefeed messages are not supported by all changefeed sinks. Refer to the [Changefeed Sinks]({% link {{ page.version.version }}/changefeed-sinks.md %}) page for details on compatible formats with each sink and the [`format`]({% link {{ page.version.version }}/create-changefeed.md %}) option to specify a changefeed message format. [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/73432) -- Using the [`split_column_families`]({% link {{ page.version.version }}/create-changefeed.md %}#split-column-families) and [`resolved`]({% link {{ page.version.version }}/create-changefeed.md %}#resolved-option) options on the same changefeed will cause an error when using the following [sinks](changefeed-sinks.html): Kafka and Google Cloud Pub/Sub. Instead, use the individual `FAMILY` keyword to specify column families when creating a changefeed. [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/79452) -- Changefeed [metrics labels]({% link {{ page.version.version }}/monitor-and-debug-changefeeds.md %}#using-changefeed-metrics-labels) are not supported as tags in [Datadog]({% link {{ page.version.version }}/datadog.md %}). [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/104616) +- Webhook sinks only support HTTPS. Use the [`insecure_tls_skip_verify`]({% link {{ page.version.version }}/create-changefeed.md %}#tls-skip-verify) parameter when testing to disable certificate verification; however, this still requires HTTPS and certificates. [#73431](https://github.com/cockroachdb/cockroach/issues/73431) +- Formats for changefeed messages are not supported by all changefeed sinks. Refer to the [Changefeed Sinks]({% link {{ page.version.version }}/changefeed-sinks.md %}) page for details on compatible formats with each sink and the [`format`]({% link {{ page.version.version }}/create-changefeed.md %}) option to specify a changefeed message format. [#73432](https://github.com/cockroachdb/cockroach/issues/73432) +- Using the [`split_column_families`]({% link {{ page.version.version }}/create-changefeed.md %}#split-column-families) and [`resolved`]({% link {{ page.version.version }}/create-changefeed.md %}#resolved-option) options on the same changefeed will cause an error when using the following [sinks](changefeed-sinks.html): Kafka and Google Cloud Pub/Sub. Instead, use the individual `FAMILY` keyword to specify column families when creating a changefeed. [#79452](https://github.com/cockroachdb/cockroach/issues/79452) +- Changefeed [metrics labels]({% link {{ page.version.version }}/monitor-and-debug-changefeeds.md %}#using-changefeed-metrics-labels) are not supported as tags in [Datadog]({% link {{ page.version.version }}/datadog.md %}). [#104616](https://github.com/cockroachdb/cockroach/issues/104616) - {% include {{page.version.version}}/cdc/types-udt-composite-general.md %} The following limitations apply: - {% include {{page.version.version}}/cdc/avro-udt-composite.md %} - {% include {{page.version.version}}/cdc/csv-udt-composite.md %} \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/copy-syntax.md b/src/current/_includes/v24.1/known-limitations/copy-syntax.md index 0c6c89299df..e64a075dcac 100644 --- a/src/current/_includes/v24.1/known-limitations/copy-syntax.md +++ b/src/current/_includes/v24.1/known-limitations/copy-syntax.md @@ -1,11 +1,5 @@ CockroachDB does not yet support the following `COPY` syntax: -- Various `COPY` options (`FORMAT`, `FREEZE`, `QUOTE`, etc.). - - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/85572) - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/85573) - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/85574) - -- `COPY ... FROM ... WHERE `. - - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/54580) + - `COPY ... WITH FREEZE`. [#85573](https://github.com/cockroachdb/cockroach/issues/85573) + - `COPY ... WITH QUOTE`. [#85574](https://github.com/cockroachdb/cockroach/issues/85574) + - `COPY ... FROM ... WHERE `. [#54580](https://github.com/cockroachdb/cockroach/issues/54580) diff --git a/src/current/_includes/v24.1/known-limitations/drop-column-partial-index.md b/src/current/_includes/v24.1/known-limitations/drop-column-partial-index.md new file mode 100644 index 00000000000..9fd1811cc43 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/drop-column-partial-index.md @@ -0,0 +1 @@ +CockroachDB prevents a column from being dropped using [`ALTER TABLE ... DROP COLUMN`]({% link {{ page.version.version }}/alter-table.md %}#drop-column) if it is referenced by a partial index predicate. To drop such a column, the partial indexes need to be dropped first using [`DROP INDEX`]({% link {{ page.version.version }}/drop-index.md %}). [#97813](https://github.com/cockroachdb/cockroach/issues/97813). \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/drop-owned-by-limitations.md b/src/current/_includes/v24.1/known-limitations/drop-owned-by-limitations.md new file mode 100644 index 00000000000..95685f6adf1 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/drop-owned-by-limitations.md @@ -0,0 +1,13 @@ +- [`ENUM`]({% link {{ page.version.version }}/enum.md %}) types are not dropped. +- [`DROP OWNED BY`]({% link {{ page.version.version }}/drop-owned-by.md %}) drops all owned objects as well as any [grants]({% link {{ page.version.version }}/grant.md %}) on objects not owned by the [role]({% link {{ page.version.version }}/security-reference/authorization.md %}#roles). +- If the [role]({% link {{ page.version.version }}/security-reference/authorization.md %}#roles) for which you are trying to `DROP OWNED BY` was granted a [system-level privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) (i.e., using the [`GRANT SYSTEM ...`]({% link {{ page.version.version }}/grant.md %}#grant-system-level-privileges-on-the-entire-cluster) statement), the following error will be signalled: + + ~~~ + ERROR: cannot perform drop owned by if role has synthetic privileges; foo has entries in system.privileges + SQLSTATE: 0A000 + HINT: perform REVOKE SYSTEM ... for the relevant privileges foo has in system.privileges + ~~~ + + The phrase "synthetic privileges" in the error message refers to [system-level privileges]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges). + + The workaround is to use [`SHOW SYSTEM GRANTS FOR {role}`](show-system-grants.html) and then use [`REVOKE SYSTEM ...`](revoke.html#revoke-system-level-privileges-on-the-entire-cluster) for each privilege in the result. [#88149](https://github.com/cockroachdb/cockroach/issues/88149) \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/drop-owned-by-role-limitations.md b/src/current/_includes/v24.1/known-limitations/drop-owned-by-role-limitations.md deleted file mode 100644 index cfa718d4e2d..00000000000 --- a/src/current/_includes/v24.1/known-limitations/drop-owned-by-role-limitations.md +++ /dev/null @@ -1,9 +0,0 @@ -- If the [role]({% link {{ page.version.version }}/security-reference/authorization.md %}#roles) for which you are trying to `DROP OWNED BY` was granted a [system-level privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) (i.e., using the [`GRANT SYSTEM ...`]({% link {{ page.version.version }}/grant.md %}#grant-system-level-privileges-on-the-entire-cluster) statement), the error shown below will be signalled. The workaround is to use [`SHOW SYSTEM GRANTS FOR {role}`](show-system-grants.html) and then use [`REVOKE SYSTEM ...`](revoke.html#revoke-system-level-privileges-on-the-entire-cluster) for each privilege in the result. For more information about this known limitation, see [cockroachdb/cockroach#88149](https://github.com/cockroachdb/cockroach/issues/88149). - - ~~~ - ERROR: cannot perform drop owned by if role has synthetic privileges; foo has entries in system.privileges - SQLSTATE: 0A000 - HINT: perform REVOKE SYSTEM ... for the relevant privileges foo has in system.privileges - ~~~ - -Note that the phrase "synthetic privileges" in the above error message refers to [system-level privileges]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges). \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/dropping-renaming-during-upgrade.md b/src/current/_includes/v24.1/known-limitations/dropping-renaming-during-upgrade.md deleted file mode 100644 index 52afe60c01f..00000000000 --- a/src/current/_includes/v24.1/known-limitations/dropping-renaming-during-upgrade.md +++ /dev/null @@ -1,10 +0,0 @@ -When upgrading from v20.1.x to v20.2.0, as soon as any node of the cluster has run v20.2.0, it is important to avoid dropping, renaming, or truncating tables, views, sequences, or databases on the v20.1 nodes. This is true even in cases where nodes were upgraded to v20.2.0 and then rolled back to v20.1. - -In this case, avoid running the following operations against v20.1 nodes: - -- [`DROP TABLE`]({% link {{ page.version.version }}/drop-table.md %}), [`TRUNCATE TABLE`]({% link {{ page.version.version }}/truncate.md %}), [`RENAME TABLE`]({% link {{ page.version.version }}/alter-table.md %}#rename-to) -- [`DROP VIEW`]({% link {{ page.version.version }}/drop-view.md %}) -- [`DROP SEQUENCE`]({% link {{ page.version.version }}/drop-sequence.md %}), [`RENAME SEQUENCE`]({% link {{ page.version.version }}/rename-sequence.md %}) -- [`DROP DATABASE`]({% link {{ page.version.version }}/drop-database.md %}), [`ALTER DATABASE ... RENAME TO`]({% link {{ page.version.version }}/alter-database.md %}#rename-to) - -Running any of these operations against v19.2 nodes will result in inconsistency between two internal tables, `system.namespace` and `system.namespace2`. This inconsistency will prevent you from being able to recreate the dropped or renamed objects; the returned error will be `ERROR: relation already exists`. In the case of a dropped or renamed database, [`SHOW DATABASES`]({% link {{ page.version.version }}/show-databases.md %}) will also return an error: `ERROR: internal error: "" is not a database`. diff --git a/src/current/_includes/v24.1/known-limitations/expression-index-limitations.md b/src/current/_includes/v24.1/known-limitations/expression-index-limitations.md new file mode 100644 index 00000000000..c0e94185948 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/expression-index-limitations.md @@ -0,0 +1,43 @@ +- The expression cannot reference columns outside the index's table. +- Functional expression output must be determined by the input arguments. For example, you can't use the [volatile function]({% link {{ page.version.version }}/functions-and-operators.md %}#function-volatility) `now()` to create an index because its output depends on more than just the function arguments. +- CockroachDB does not allow {% if page.name == "expression-indexes.md" %} expression indexes {% else %} [expression indexes]({% link {{ page.version.version }}/expression-indexes.md %}) {% endif %} to reference [computed columns]({% link {{ page.version.version }}/computed-columns.md %}). [#67900](https://github.com/cockroachdb/cockroach/issues/67900) +- CockroachDB does not support expressions as `ON CONFLICT` targets. This means that unique {% if page.name == "expression-indexes.md" %} expression indexes {% else %} [expression indexes]({% link {{ page.version.version }}/expression-indexes.md %}) {% endif %} cannot be selected as arbiters for [`INSERT .. ON CONFLICT`]({% link {{ page.version.version }}/insert.md %}#on-conflict-clause) statements. For example: + + {% include_cached copy-clipboard.html %} + ~~~ sql + CREATE TABLE t (a INT, b INT, UNIQUE INDEX ((a + b))); + ~~~ + + ~~~ + CREATE TABLE + ~~~ + + {% include_cached copy-clipboard.html %} + ~~~ sql + INSERT INTO t VALUES (1, 2) ON CONFLICT ((a + b)) DO NOTHING; + ~~~ + + ~~~ + invalid syntax: statement ignored: at or near "(": syntax error + SQLSTATE: 42601 + DETAIL: source SQL: + INSERT INTO t VALUES (1, 2) ON CONFLICT ((a + b)) DO NOTHING + ^ + HINT: try \h INSERT + ~~~ + + {% include_cached copy-clipboard.html %} + ~~~ sql + INSERT INTO t VALUES (1, 2) ON CONFLICT ((a + b)) DO UPDATE SET a = 10; + ~~~ + + ~~~ + invalid syntax: statement ignored: at or near "(": syntax error + SQLSTATE: 42601 + DETAIL: source SQL: + INSERT INTO t VALUES (1, 2) ON CONFLICT ((a + b)) DO UPDATE SET a = 10 + ^ + HINT: try \h INSERT + ~~~ + + [#67893](https://github.com/cockroachdb/cockroach/issues/67893) diff --git a/src/current/_includes/v24.1/known-limitations/full-text-search-unsupported.md b/src/current/_includes/v24.1/known-limitations/full-text-search-unsupported.md new file mode 100644 index 00000000000..7b5a83f2cae --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/full-text-search-unsupported.md @@ -0,0 +1,14 @@ +- Aspects of [text search configurations]({% link {{ page.version.version }}/full-text-search.md %}#text-search-configuration) other than the specified dictionary. +- `websearch_to_tsquery()` built-in function. +- `tsquery_phrase()` built-in function. +- `ts_rank_cd()` built-in function. +- `setweight()` built-in function. +- Inverted joins on `TSVECTOR` values. +- `tsvector || tsvector` comparisons. +- `tsquery || tsquery` comparisons. +- `tsquery && tsquery` comparisons. +- `tsquery <-> tsquery` comparisons. +- `!! tsquery` comparisons. +- `tsquery @> tsquery` and `tsquery <@ tsquery` comparisons. + +[#41288](https://github.com/cockroachdb/cockroach/issues/41288) \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/import-into-limitations.md b/src/current/_includes/v24.1/known-limitations/import-into-limitations.md new file mode 100644 index 00000000000..6a7cce6f727 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/import-into-limitations.md @@ -0,0 +1,11 @@ +[`IMPORT INTO`]({% link {{ page.version.version }}/import-into.md %}) has the following limitations: + +- While importing into an existing table, the table is taken offline. +- After importing into an existing table, [constraints]({% link {{ page.version.version }}/constraints.md %}) will be un-validated and need to be [re-validated]({% link {{ page.version.version }}/alter-table.md %}#validate-constraint). +- Imported rows must not conflict with existing rows in the table or any unique secondary indexes. +- `IMPORT INTO` works for only a single existing table. +- `IMPORT INTO` can sometimes fail with a "context canceled" error, or can restart itself many times without ever finishing. If this is happening, it is likely due to a high amount of disk contention. This can be mitigated by setting the `kv.bulk_io_write.max_rate` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) to a value below your max disk write speed. For example, to set it to 10MB/s, execute: + {% include_cached copy-clipboard.html %} + ~~~ sql + SET CLUSTER SETTING kv.bulk_io_write.max_rate = '10MB'; + ~~~ \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/jsonb-limitations.md b/src/current/_includes/v24.1/known-limitations/jsonb-limitations.md new file mode 100644 index 00000000000..81f2da52861 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/jsonb-limitations.md @@ -0,0 +1 @@ +- You cannot use [primary key]({% link {{ page.version.version }}/primary-key.md %}), [foreign key]({% link {{ page.version.version }}/foreign-key.md %}), and [unique]({% link {{ page.version.version }}/unique.md %}) [constraints]({% link {{ page.version.version }}/constraints.md %}) on `JSONB` values. \ No newline at end of file diff --git a/src/current/_includes/v24.1/sql/locality-optimized-search-limited-records.md b/src/current/_includes/v24.1/known-limitations/locality-optimized-search-limited-records.md similarity index 100% rename from src/current/_includes/v24.1/sql/locality-optimized-search-limited-records.md rename to src/current/_includes/v24.1/known-limitations/locality-optimized-search-limited-records.md diff --git a/src/current/_includes/v24.1/sql/locality-optimized-search-virtual-computed-columns.md b/src/current/_includes/v24.1/known-limitations/locality-optimized-search-virtual-computed-columns.md similarity index 85% rename from src/current/_includes/v24.1/sql/locality-optimized-search-virtual-computed-columns.md rename to src/current/_includes/v24.1/known-limitations/locality-optimized-search-virtual-computed-columns.md index c016103b1e1..d6acf418aa8 100644 --- a/src/current/_includes/v24.1/sql/locality-optimized-search-virtual-computed-columns.md +++ b/src/current/_includes/v24.1/known-limitations/locality-optimized-search-virtual-computed-columns.md @@ -1 +1 @@ -- {% if page.name == "cost-based-optimizer.md" %} Locality optimized search {% else %} [Locality optimized search]({% link {{ page.version.version }}/cost-based-optimizer.md %}#locality-optimized-search-in-multi-region-clusters) {% endif %} does not work for queries that use [partitioned unique indexes]({% link {{ page.version.version }}/partitioning.md %}#partition-using-a-secondary-index) on [virtual computed columns](computed-columns.html#virtual-computed-columns). A workaround for computed columns is to make the virtual computed column a [stored computed column](computed-columns.html#stored-computed-columns). Locality optimized search does not work for queries that use partitioned unique [expression indexes](expression-indexes.html). [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/68129) +- {% if page.name == "cost-based-optimizer.md" %} Locality optimized search {% else %} [Locality optimized search]({% link {{ page.version.version }}/cost-based-optimizer.md %}#locality-optimized-search-in-multi-region-clusters) {% endif %} does not work for queries that use [partitioned unique indexes]({% link {{ page.version.version }}/partitioning.md %}#partition-using-a-secondary-index) on [virtual computed columns](computed-columns.html#virtual-computed-columns). A workaround for computed columns is to make the virtual computed column a [stored computed column](computed-columns.html#stored-computed-columns). Locality optimized search does not work for queries that use partitioned unique [expression indexes](expression-indexes.html). [#68129](https://github.com/cockroachdb/cockroach/issues/68129) diff --git a/src/current/_includes/v24.1/known-limitations/logging-limitations.md b/src/current/_includes/v24.1/known-limitations/logging-limitations.md new file mode 100644 index 00000000000..78c70d14234 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/logging-limitations.md @@ -0,0 +1 @@ +Log files can only be accessed in the DB Console if they are stored in the same directory as the file sink for the `DEV` channel. diff --git a/src/current/_includes/v24.1/sql/materialized-views-no-stats.md b/src/current/_includes/v24.1/known-limitations/materialized-views-no-stats.md similarity index 58% rename from src/current/_includes/v24.1/sql/materialized-views-no-stats.md rename to src/current/_includes/v24.1/known-limitations/materialized-views-no-stats.md index e4d262b56ea..02f2bd787c4 100644 --- a/src/current/_includes/v24.1/sql/materialized-views-no-stats.md +++ b/src/current/_includes/v24.1/known-limitations/materialized-views-no-stats.md @@ -1,3 +1 @@ -- The optimizer may not select the most optimal query plan when querying materialized views because CockroachDB does not [collect statistics]({% link {{ page.version.version }}/cost-based-optimizer.md %}#table-statistics) on materialized views. - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/78181). +- The optimizer may not select the most optimal query plan when querying materialized views because CockroachDB does not [collect statistics]({% link {{ page.version.version }}/cost-based-optimizer.md %}#table-statistics) on materialized views. [#78181](https://github.com/cockroachdb/cockroach/issues/78181). diff --git a/src/current/_includes/v24.1/known-limitations/multiple-arbiter-indexes.md b/src/current/_includes/v24.1/known-limitations/multiple-arbiter-indexes.md new file mode 100644 index 00000000000..c9861623314 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/multiple-arbiter-indexes.md @@ -0,0 +1 @@ +CockroachDB does not currently support multiple arbiter indexes for [`INSERT ON CONFLICT DO UPDATE`]({% link {{ page.version.version }}/insert.md %}#on-conflict-clause), and will return an error if there are multiple unique or exclusion constraints matching the `ON CONFLICT DO UPDATE` specification. [#53170](https://github.com/cockroachdb/cockroach/issues/53170) \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/plpgsql-datatype-limitations.md b/src/current/_includes/v24.1/known-limitations/plpgsql-datatype-limitations.md new file mode 100644 index 00000000000..229120607e2 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/plpgsql-datatype-limitations.md @@ -0,0 +1,7 @@ +- `RECORD` parameters and variables are not supported in [user-defined functions]({% link {{ page.version.version }}/user-defined-functions.md %}). [#105713](https://github.com/cockroachdb/cockroach/issues/105713) +- Variable shadowing (e.g., declaring a variable with the same name in an inner block) is not supported in PL/pgSQL. [#117508](https://github.com/cockroachdb/cockroach/issues/117508) +- Syntax for accessing members of composite types without parentheses is not supported. [#114687](https://github.com/cockroachdb/cockroach/issues/114687) +- `NOT NULL` variable declarations are not supported. [#105243](https://github.com/cockroachdb/cockroach/issues/105243) +- Cursors opened in PL/pgSQL execute their queries on opening, affecting performance and resource usage. [#111479](https://github.com/cockroachdb/cockroach/issues/111479) +- Cursors in PL/pgSQL cannot be declared with arguments. [#117746](https://github.com/cockroachdb/cockroach/issues/117746) +- `OPEN FOR EXECUTE` is not supported for opening cursors. [#117744](https://github.com/cockroachdb/cockroach/issues/117744) \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/plpgsql-feature-limitations.md b/src/current/_includes/v24.1/known-limitations/plpgsql-feature-limitations.md new file mode 100644 index 00000000000..076b86d0aa5 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/plpgsql-feature-limitations.md @@ -0,0 +1,11 @@ +- PL/pgSQL blocks cannot be nested. [#114775](https://github.com/cockroachdb/cockroach/issues/114775) +- PL/pgSQL arguments cannot be referenced with ordinals (e.g., `$1`, `$2`). [#114701](https://github.com/cockroachdb/cockroach/issues/114701) +- `FOR` loops, including `FOR` cursor loops, `FOR` query loops, and `FOREACH` loops, are not supported. [#105246](https://github.com/cockroachdb/cockroach/issues/105246) +- `RETURN NEXT` and `RETURN QUERY` statements are not supported. [#117744](https://github.com/cockroachdb/cockroach/issues/117744) +- `EXIT` and `CONTINUE` labels and conditions are not supported. [#115271](https://github.com/cockroachdb/cockroach/issues/115271) +- `CASE` statements are not supported. [#117744](https://github.com/cockroachdb/cockroach/issues/117744) +- `PERFORM`, `EXECUTE`, `GET DIAGNOSTICS`, and `NULL` statements are not supported for PL/pgSQL. [#117744](https://github.com/cockroachdb/cockroach/issues/117744) +- PL/pgSQL exception blocks cannot catch [transaction retry errors]({% link {{ page.version.version }}/transaction-retry-error-reference.md %}). [#111446](https://github.com/cockroachdb/cockroach/issues/111446) +- `RAISE` statements cannot be annotated with names of schema objects related to the error (i.e., using `COLUMN`, `CONSTRAINT`, `DATATYPE`, `TABLE`, or `SCHEMA`). [#106237](https://github.com/cockroachdb/cockroach/issues/106237) +- `RAISE` statements message the client directly, and do not produce log output. [#117750](https://github.com/cockroachdb/cockroach/issues/117750) +- `ASSERT` debugging checks are not supported. [#117744](https://github.com/cockroachdb/cockroach/issues/117744) \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/read-committed-limitations.md b/src/current/_includes/v24.1/known-limitations/read-committed-limitations.md new file mode 100644 index 00000000000..e9d4c899293 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/read-committed-limitations.md @@ -0,0 +1,6 @@ +- Schema changes (e.g., [`CREATE TABLE`]({% link {{ page.version.version }}/create-table.md %}), [`CREATE SCHEMA`]({% link {{ page.version.version }}/create-schema.md %}), [`CREATE INDEX`]({% link {{ page.version.version }}/create-index.md %})) cannot be performed within explicit `READ COMMITTED` transactions, and will cause transactions to abort. As a workaround, [set the transaction's isolation level]({% link {{ page.version.version }}/read-committed.md %}#set-the-current-transaction-to-read-committed) to `SERIALIZABLE`. [#114778](https://github.com/cockroachdb/cockroach/issues/114778) +- `READ COMMITTED` transactions performing `INSERT`, `UPDATE`, or `UPSERT` cannot access [`REGIONAL BY ROW`]({% link {{ page.version.version }}/table-localities.md %}#regional-by-row-tables) tables in which [`UNIQUE`]({% link {{ page.version.version }}/unique.md %}) and [`PRIMARY KEY`]({% link {{ page.version.version }}/primary-key.md %}) constraints exist, the region is not included in the constraint, and the region cannot be computed from the constraint columns. +- Multi-column-family checks during updates are not supported under `READ COMMITTED` isolation. [#112488](https://github.com/cockroachdb/cockroach/issues/112488) +- Because locks acquired by [foreign key]({% link {{ page.version.version }}/foreign-key.md %}) checks, [`SELECT FOR UPDATE`]({% link {{ page.version.version }}/select-for-update.md %}), and [`SELECT FOR SHARE`]({% link {{ page.version.version }}/select-for-update.md %}) are fully replicated under `READ COMMITTED` isolation, some queries experience a delay for Raft replication. +- [Foreign key]({% link {{ page.version.version }}/foreign-key.md %}) checks are not performed in parallel under `READ COMMITTED` isolation. +- [`SELECT FOR UPDATE` and `SELECT FOR SHARE`]({% link {{ page.version.version }}/select-for-update.md %}) statements are less optimized under `READ COMMITTED` isolation than under `SERIALIZABLE` isolation. Under `READ COMMITTED` isolation, `SELECT FOR UPDATE` and `SELECT FOR SHARE` usually perform an extra lookup join for every locked table when compared to the same queries under `SERIALIZABLE`. In addition, some optimization steps (such as de-correlation of correlated [subqueries]({% link {{ page.version.version }}/subqueries.md %})) are not currently performed on these queries. \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/restore-multiregion-match.md b/src/current/_includes/v24.1/known-limitations/restore-multiregion-match.md index 38ee6d5446e..20ddbb0c930 100644 --- a/src/current/_includes/v24.1/known-limitations/restore-multiregion-match.md +++ b/src/current/_includes/v24.1/known-limitations/restore-multiregion-match.md @@ -46,3 +46,5 @@ ~~~ sql ALTER DATABASE destination_database SET PRIMARY REGION "us-east1"; ~~~ + + [#71071](https://github.com/cockroachdb/cockroach/issues/71071) \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/restore-tables-non-multi-reg.md b/src/current/_includes/v24.1/known-limitations/restore-tables-non-multi-reg.md index 360f93f796f..5390f2d09ee 100644 --- a/src/current/_includes/v24.1/known-limitations/restore-tables-non-multi-reg.md +++ b/src/current/_includes/v24.1/known-limitations/restore-tables-non-multi-reg.md @@ -1 +1 @@ -Restoring [`GLOBAL`]({% link {{ page.version.version }}/table-localities.md %}#global-tables) and [`REGIONAL BY TABLE`]({% link {{ page.version.version }}/table-localities.md %}#regional-tables) tables into a **non**-multi-region database is not supported. [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/71502) +Restoring [`GLOBAL`]({% link {{ page.version.version }}/table-localities.md %}#global-tables) and [`REGIONAL BY TABLE`]({% link {{ page.version.version }}/table-localities.md %}#regional-tables) tables into a **non**-multi-region database is not supported. [#71502](https://github.com/cockroachdb/cockroach/issues/71502) diff --git a/src/current/_includes/v24.1/known-limitations/restore-udf.md b/src/current/_includes/v24.1/known-limitations/restore-udf.md index 053a3b90df7..a4a4bc080fe 100644 --- a/src/current/_includes/v24.1/known-limitations/restore-udf.md +++ b/src/current/_includes/v24.1/known-limitations/restore-udf.md @@ -1 +1 @@ -`RESTORE` will not restore a table that references a [UDF]({% link {{ page.version.version }}/user-defined-functions.md %}), unless you skip restoring the function with the {% if page.name == "restore.md" %} [`skip_missing_udfs`](#skip-missing-udfs) {% else %} [`skip_missing_udfs`]({% link {{ page.version.version }}/restore.md %}#skip-missing-udfs) {% endif %} option. Alternatively, take a [database-level backup]({% link {{ page.version.version }}/backup.md %}#back-up-a-database) to include everything needed to restore the table. [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/118195) \ No newline at end of file +`RESTORE` will not restore a table that references a [UDF]({% link {{ page.version.version }}/user-defined-functions.md %}), unless you skip restoring the function with the {% if page.name == "restore.md" %} [`skip_missing_udfs`](#skip-missing-udfs) {% else %} [`skip_missing_udfs`]({% link {{ page.version.version }}/restore.md %}#skip-missing-udfs) {% endif %} option. Alternatively, take a [database-level backup]({% link {{ page.version.version }}/backup.md %}#back-up-a-database) to include everything needed to restore the table. [#118195](https://github.com/cockroachdb/cockroach/issues/118195) \ No newline at end of file diff --git a/src/current/_includes/v24.1/sql/select-for-update-limitations.md b/src/current/_includes/v24.1/known-limitations/select-for-update-limitations.md similarity index 100% rename from src/current/_includes/v24.1/sql/select-for-update-limitations.md rename to src/current/_includes/v24.1/known-limitations/select-for-update-limitations.md diff --git a/src/current/_includes/v24.1/known-limitations/set-transaction-no-rollback.md b/src/current/_includes/v24.1/known-limitations/set-transaction-no-rollback.md index c2e78c7d78a..414cbac6282 100644 --- a/src/current/_includes/v24.1/known-limitations/set-transaction-no-rollback.md +++ b/src/current/_includes/v24.1/known-limitations/set-transaction-no-rollback.md @@ -14,4 +14,4 @@ timezone 3 ~~~ -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/69396) +[#69396](https://github.com/cockroachdb/cockroach/issues/69396) diff --git a/src/current/_includes/v24.1/known-limitations/show-backup-locality-incremental-location.md b/src/current/_includes/v24.1/known-limitations/show-backup-locality-incremental-location.md deleted file mode 100644 index 428a78c0da0..00000000000 --- a/src/current/_includes/v24.1/known-limitations/show-backup-locality-incremental-location.md +++ /dev/null @@ -1 +0,0 @@ -{% if page.name == "show-backup.md" %}`SHOW BACKUP`{% else %}[`SHOW BACKUP`]({% link {{ page.version.version }}/show-backup.md %}){% endif %} can display backups taken with the `incremental_location` option **or** for [locality-aware backups]({% link {{ page.version.version }}/take-and-restore-locality-aware-backups.md %}). It will not display backups for locality-aware backups taken with the `incremental_location` option. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/82912). \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/sql-cursors.md b/src/current/_includes/v24.1/known-limitations/sql-cursors.md index d1c42749661..4c047aa9603 100644 --- a/src/current/_includes/v24.1/known-limitations/sql-cursors.md +++ b/src/current/_includes/v24.1/known-limitations/sql-cursors.md @@ -1,9 +1,9 @@ CockroachDB implements SQL {% if page.name == "known-limitations.md" %} [cursor]({% link {{ page.version.version }}/cursors.md %}) {% else %} cursor {% endif %} support with the following limitations: -- `DECLARE` only supports forward cursors. Reverse cursors created with `DECLARE SCROLL` are not supported. [cockroachdb/cockroach#77102](https://github.com/cockroachdb/cockroach/issues/77102) -- `FETCH` supports forward, relative, and absolute variants, but only for forward cursors. [cockroachdb/cockroach#77102](https://github.com/cockroachdb/cockroach/issues/77102) -- `BINARY CURSOR`, which returns data in the Postgres binary format, is not supported. [cockroachdb/cockroach#77099](https://github.com/cockroachdb/cockroach/issues/77099) -- `WITH HOLD`, which allows keeping a cursor open for longer than a transaction by writing its results into a buffer, is accepted as valid syntax within a single transaction but is not supported. It acts as a no-op and does not actually perform the function of `WITH HOLD`, which is to make the cursor live outside its parent transaction. Instead, if you are using `WITH HOLD`, you will be forced to close that cursor within the transaction it was created in. [cockroachdb/cockroach#77101](https://github.com/cockroachdb/cockroach/issues/77101) +- `DECLARE` only supports forward cursors. Reverse cursors created with `DECLARE SCROLL` are not supported. [#77102](https://github.com/cockroachdb/cockroach/issues/77102) +- `FETCH` supports forward, relative, and absolute variants, but only for forward cursors. [#77102](https://github.com/cockroachdb/cockroach/issues/77102) +- `BINARY CURSOR`, which returns data in the Postgres binary format, is not supported. [#77099](https://github.com/cockroachdb/cockroach/issues/77099) +- `WITH HOLD`, which allows keeping a cursor open for longer than a transaction by writing its results into a buffer, is accepted as valid syntax within a single transaction but is not supported. It acts as a no-op and does not actually perform the function of `WITH HOLD`, which is to make the cursor live outside its parent transaction. Instead, if you are using `WITH HOLD`, you will be forced to close that cursor within the transaction it was created in. [#77101](https://github.com/cockroachdb/cockroach/issues/77101) - This syntax is accepted (but does not have any effect): {% include_cached copy-clipboard.html %} ~~~ sql @@ -19,6 +19,6 @@ CockroachDB implements SQL {% if page.name == "known-limitations.md" %} [cursor] DECLARE test_cur CURSOR WITH HOLD FOR SELECT * FROM foo ORDER BY bar; COMMIT; -- This will fail with an error because CLOSE test_cur was not called inside the transaction. ~~~ -- Scrollable cursor (also known as reverse `FETCH`) is not supported. [cockroachdb/cockroach#77102](https://github.com/cockroachdb/cockroach/issues/77102) -- [`SELECT ... FOR UPDATE`]({% link {{ page.version.version }}/select-for-update.md %}) with a cursor is not supported. [cockroachdb/cockroach#77103](https://github.com/cockroachdb/cockroach/issues/77103) -- Respect for [`SAVEPOINT`s]({% link {{ page.version.version }}/savepoint.md %}) is not supported. Cursor definitions do not disappear properly if rolled back to a `SAVEPOINT` from before they were created. [cockroachdb/cockroach#77104](https://github.com/cockroachdb/cockroach/issues/77104) +- Scrollable cursor (also known as reverse `FETCH`) is not supported. [#77102](https://github.com/cockroachdb/cockroach/issues/77102) +- [`SELECT ... FOR UPDATE`]({% link {{ page.version.version }}/select-for-update.md %}) with a cursor is not supported. [#77103](https://github.com/cockroachdb/cockroach/issues/77103) +- Respect for [`SAVEPOINT`s]({% link {{ page.version.version }}/savepoint.md %}) is not supported. Cursor definitions do not disappear properly if rolled back to a `SAVEPOINT` from before they were created. [#77104](https://github.com/cockroachdb/cockroach/issues/77104) diff --git a/src/current/_includes/v24.1/known-limitations/srid-4326-limitations.md b/src/current/_includes/v24.1/known-limitations/srid-4326-limitations.md new file mode 100644 index 00000000000..b556a9fbecd --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/srid-4326-limitations.md @@ -0,0 +1 @@ +Defining a custom SRID by inserting rows into [`spatial_ref_sys`]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial_ref_sys) is not currently supported. [#55903](https://github.com/cockroachdb/cockroach/issues/55903) \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/stats-refresh-upgrade.md b/src/current/_includes/v24.1/known-limitations/stats-refresh-upgrade.md index 1382d8199bb..68fdb2ce246 100644 --- a/src/current/_includes/v24.1/known-limitations/stats-refresh-upgrade.md +++ b/src/current/_includes/v24.1/known-limitations/stats-refresh-upgrade.md @@ -1,3 +1 @@ -The [automatic statistics refresher]({% link {{ page.version.version }}/cost-based-optimizer.md %}#control-statistics-refresh-rate) automatically checks whether it needs to refresh statistics for every table in the database upon startup of each node in the cluster. If statistics for a table have not been refreshed in a while, this will trigger collection of statistics for that table. If statistics have been refreshed recently, it will not force a refresh. As a result, the automatic statistics refresher does not necessarily perform a refresh of statistics after an [upgrade]({% link {{ page.version.version }}/upgrade-cockroach-version.md %}). This could cause a problem, for example, if the upgrade moves from a version without [histograms]({% link {{ page.version.version }}/cost-based-optimizer.md %}#control-histogram-collection) to a version with histograms. To refresh statistics manually, use [`CREATE STATISTICS`](create-statistics.html). - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/54816) +The [automatic statistics refresher]({% link {{ page.version.version }}/cost-based-optimizer.md %}#control-statistics-refresh-rate) automatically checks whether it needs to refresh statistics for every table in the database upon startup of each node in the cluster. If statistics for a table have not been refreshed in a while, this will trigger collection of statistics for that table. If statistics have been refreshed recently, it will not force a refresh. As a result, the automatic statistics refresher does not necessarily perform a refresh of statistics after an [upgrade]({% link {{ page.version.version }}/upgrade-cockroach-version.md %}). This could cause a problem, for example, if the upgrade moves from a version without [histograms]({% link {{ page.version.version }}/cost-based-optimizer.md %}#control-histogram-collection) to a version with histograms. To refresh statistics manually, use [`CREATE STATISTICS`](create-statistics.html). [#54816](https://github.com/cockroachdb/cockroach/issues/54816) diff --git a/src/current/_includes/v24.1/sql/trigram-unsupported-syntax.md b/src/current/_includes/v24.1/known-limitations/trigram-unsupported-syntax.md similarity index 88% rename from src/current/_includes/v24.1/sql/trigram-unsupported-syntax.md rename to src/current/_includes/v24.1/known-limitations/trigram-unsupported-syntax.md index 629afa89119..494730c7ae8 100644 --- a/src/current/_includes/v24.1/sql/trigram-unsupported-syntax.md +++ b/src/current/_includes/v24.1/known-limitations/trigram-unsupported-syntax.md @@ -4,4 +4,6 @@ - `<<%` and `%>>` comparisons and acceleration. - `<->`, `<<->`, `<->>`, `<<<->`, and `<->>>` comparisons. - Acceleration on [regex string matching]({% link {{ page.version.version }}/scalar-expressions.md %}#string-matching-using-posix-regular-expressions). -- `%` comparisons, `show_trgm`, and trigram index creation on [collated strings]({% link {{ page.version.version }}/collate.md %}). \ No newline at end of file +- `%` comparisons, `show_trgm`, and trigram index creation on [collated strings]({% link {{ page.version.version }}/collate.md %}). + +[#41285](https://github.com/cockroachdb/cockroach/issues/41285) \ No newline at end of file diff --git a/src/current/_includes/v24.1/known-limitations/udf-limitations.md b/src/current/_includes/v24.1/known-limitations/udf-limitations.md deleted file mode 100644 index c944edfa13b..00000000000 --- a/src/current/_includes/v24.1/known-limitations/udf-limitations.md +++ /dev/null @@ -1,3 +0,0 @@ -- Expressions (column, index, constraint) in tables. -- Views. -- Other user-defined functions. diff --git a/src/current/_includes/v24.1/known-limitations/udf-stored-proc-limitations.md b/src/current/_includes/v24.1/known-limitations/udf-stored-proc-limitations.md new file mode 100644 index 00000000000..120ddc3b95f --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/udf-stored-proc-limitations.md @@ -0,0 +1,13 @@ +{% if page.name != "stored-procedures.md" %} +- User-defined functions are not currently supported in: + - Expressions (column, index, constraint) in tables. [#87699](https://github.com/cockroachdb/cockroach/issues/87699) + - Views. [#87699](https://github.com/cockroachdb/cockroach/issues/87699) + - Other user-defined functions. [#93049](https://github.com/cockroachdb/cockroach/issues/93049) +- [Common table expressions]({% link {{ page.version.version }}/common-table-expressions.md %}) (CTE), recursive or non-recursive, are not supported in [user-defined functions]({% link {{ page.version.version }}/user-defined-functions.md %}) (UDF). That is, you cannot use a `WITH` clause in the body of a UDF. [#92961](https://github.com/cockroachdb/cockroach/issues/92961) +- The `setval` function cannot be resolved when used inside UDF bodies. [#110860](https://github.com/cockroachdb/cockroach/issues/110860) +{% endif %} + +{% if page.name != "user-defined-functions.md" %} +{% endif %} + +- DDL statements (e.g., `CREATE TABLE`, `CREATE INDEX`) are not allowed within UDFs or stored procedures. [#110080](https://github.com/cockroachdb/cockroach/issues/110080) diff --git a/src/current/_includes/v24.1/known-limitations/userfile-upload-non-recursive.md b/src/current/_includes/v24.1/known-limitations/userfile-upload-non-recursive.md deleted file mode 100644 index 19db5fde6a4..00000000000 --- a/src/current/_includes/v24.1/known-limitations/userfile-upload-non-recursive.md +++ /dev/null @@ -1 +0,0 @@ -- `cockroach userfile upload` does not not currently allow for recursive uploads from a directory. This feature will be present with the `--recursive` flag in future versions. [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/pull/65307) diff --git a/src/current/_includes/v24.1/known-limitations/vectorized-engine-limitations.md b/src/current/_includes/v24.1/known-limitations/vectorized-engine-limitations.md new file mode 100644 index 00000000000..daea59ebf88 --- /dev/null +++ b/src/current/_includes/v24.1/known-limitations/vectorized-engine-limitations.md @@ -0,0 +1,2 @@ +- The vectorized engine does not support queries containing a join filtered with an [`ON` expression]({% link {{ page.version.version }}/joins.md %}#supported-join-conditions). [#38018](https://github.com/cockroachdb/cockroach/issues/38018) +- The vectorized engine does not support [working with spatial data]({% link {{ page.version.version }}/export-spatial-data.md %}). Queries with [geospatial functions]({% link {{ page.version.version }}/functions-and-operators.md %}#spatial-functions) or [spatial data]({% link {{ page.version.version }}/export-spatial-data.md %}) will revert to the row-oriented execution engine. diff --git a/src/current/_includes/v24.1/sql/expression-indexes-cannot-reference-computed-columns.md b/src/current/_includes/v24.1/sql/expression-indexes-cannot-reference-computed-columns.md deleted file mode 100644 index 64d80e31fa3..00000000000 --- a/src/current/_includes/v24.1/sql/expression-indexes-cannot-reference-computed-columns.md +++ /dev/null @@ -1,3 +0,0 @@ -CockroachDB does not allow {% if page.name == "expression-indexes.md" %} expression indexes {% else %} [expression indexes]({% link {{ page.version.version }}/expression-indexes.md %}) {% endif %} to reference [computed columns]({% link {{ page.version.version }}/computed-columns.md %}). - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/67900) diff --git a/src/current/_includes/v24.1/sql/expressions-as-on-conflict-targets.md b/src/current/_includes/v24.1/sql/expressions-as-on-conflict-targets.md deleted file mode 100644 index 882dd905b1d..00000000000 --- a/src/current/_includes/v24.1/sql/expressions-as-on-conflict-targets.md +++ /dev/null @@ -1,40 +0,0 @@ -CockroachDB does not support expressions as `ON CONFLICT` targets. This means that unique {% if page.name == "expression-indexes.md" %} expression indexes {% else %} [expression indexes]({% link {{ page.version.version }}/expression-indexes.md %}) {% endif %} cannot be selected as arbiters for [`INSERT .. ON CONFLICT`]({% link {{ page.version.version }}/insert.md %}#on-conflict-clause) statements. For example: - -{% include_cached copy-clipboard.html %} -~~~ sql -CREATE TABLE t (a INT, b INT, UNIQUE INDEX ((a + b))); -~~~ - -~~~ -CREATE TABLE -~~~ - -{% include_cached copy-clipboard.html %} -~~~ sql -INSERT INTO t VALUES (1, 2) ON CONFLICT ((a + b)) DO NOTHING; -~~~ - -~~~ -invalid syntax: statement ignored: at or near "(": syntax error -SQLSTATE: 42601 -DETAIL: source SQL: -INSERT INTO t VALUES (1, 2) ON CONFLICT ((a + b)) DO NOTHING - ^ -HINT: try \h INSERT -~~~ - -{% include_cached copy-clipboard.html %} -~~~ sql -INSERT INTO t VALUES (1, 2) ON CONFLICT ((a + b)) DO UPDATE SET a = 10; -~~~ - -~~~ -invalid syntax: statement ignored: at or near "(": syntax error -SQLSTATE: 42601 -DETAIL: source SQL: -INSERT INTO t VALUES (1, 2) ON CONFLICT ((a + b)) DO UPDATE SET a = 10 - ^ -HINT: try \h INSERT -~~~ - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/67893) diff --git a/src/current/_includes/v24.1/sql/jsonb-comparison.md b/src/current/_includes/v24.1/sql/jsonb-comparison.md deleted file mode 100644 index 7b4435d6fcc..00000000000 --- a/src/current/_includes/v24.1/sql/jsonb-comparison.md +++ /dev/null @@ -1,13 +0,0 @@ -You cannot use comparison operators (such as `<` or `>`) on [`JSONB`]({% link {{ page.version.version }}/jsonb.md %}) elements. For example, the following query does not work and returns an error: - - {% include_cached copy-clipboard.html %} - ~~~ sql - SELECT '{"a": 1}'::JSONB -> 'a' < '{"b": 2}'::JSONB -> 'b'; - ~~~ - - ~~~ - ERROR: unsupported comparison operator: < - SQLSTATE: 22023 - ~~~ - - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/49144) diff --git a/src/current/v24.1/alter-changefeed.md b/src/current/v24.1/alter-changefeed.md index 34a462e3feb..7fed4dd370c 100644 --- a/src/current/v24.1/alter-changefeed.md +++ b/src/current/v24.1/alter-changefeed.md @@ -232,16 +232,7 @@ For further discussion on using the `FAMILY` keyword and `split_column_families` ## Known limitations -- It is necessary to [`PAUSE`]({% link {{ page.version.version }}/pause-job.md %}) the changefeed before performing any `ALTER CHANGEFEED` statement. [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/77171) -- `ALTER CHANGEFEED` will accept duplicate targets without sending an error. [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/78285) -- You cannot alter a changefeed that uses [CDC queries]({% link {{ page.version.version }}/cdc-queries.md %}). [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/83033) -- CockroachDB does not keep track of the [`initial_scan`]({% link {{ page.version.version }}/create-changefeed.md %}#initial-scan) option applied to tables when it is set to `yes` or `only`. For example: - - ~~~ sql - ALTER CHANGEFEED {job_ID} ADD table WITH initial_scan = 'yes'; - ~~~ - - This will trigger an initial scan of the table and the changefeed will track `table`. The changefeed will **not** track `initial_scan` specified as an option, so it will not display in the output or after a `SHOW CHANGEFEED JOB` statement. +{% include {{ page.version.version }}/known-limitations/alter-changefeed-limitations.md %} ## See also diff --git a/src/current/v24.1/alter-table.md b/src/current/v24.1/alter-table.md index 6002120ce2c..70d38ca99a8 100644 --- a/src/current/v24.1/alter-table.md +++ b/src/current/v24.1/alter-table.md @@ -262,7 +262,7 @@ For examples, see [Drop columns](#drop-columns). #### Known limitations -- CockroachDB prevents a column from being dropped if it is referenced by a [partial index]({% link {{ page.version.version }}/partial-indexes.md %}) predicate. To drop such a column, the partial indexes need to be dropped first using [`DROP INDEX`]({% link {{ page.version.version }}/drop-index.md %}). See [tracking issue](https://github.com/cockroachdb/cockroach/issues/97813). +{% include {{ page.version.version }}/known-limitations/drop-column-partial-index.md %} #### Required privileges diff --git a/src/current/v24.1/alter-type.md b/src/current/v24.1/alter-type.md index 443a40845ab..d8cbdd60fd7 100644 --- a/src/current/v24.1/alter-type.md +++ b/src/current/v24.1/alter-type.md @@ -44,7 +44,7 @@ on the type. ## Known limitations -- You can only reference a user-defined type from the database that contains the type. +{% include {{ page.version.version }}/known-limitations/alter-type-limitations.md %} ## Example diff --git a/src/current/v24.1/aws-dms.md b/src/current/v24.1/aws-dms.md index a1e7092a8d4..fdc22c8e8d7 100644 --- a/src/current/v24.1/aws-dms.md +++ b/src/current/v24.1/aws-dms.md @@ -59,7 +59,7 @@ Complete the following items before starting the DMS migration: - If the output of [`SHOW SCHEDULES`]({% link {{ page.version.version }}/show-schedules.md %}) shows any backup schedules, run [`ALTER BACKUP SCHEDULE {schedule_id} SET WITH revision_history = 'false'`]({% link {{ page.version.version }}/alter-backup-schedule.md %}) for each backup schedule. - If the output of `SHOW SCHEDULES` does not show backup schedules, [contact Support](https://support.cockroachlabs.com) to disable revision history for cluster backups. -- If you are migrating to CockroachDB {{ site.data.products.dedicated }}, enable [CockroachDB log export to Amazon CloudWatch]({% link cockroachcloud/export-logs.md %}) **before** starting the DMS migration. This makes CockroachDB logs accessible for [troubleshooting](#troubleshooting-common-issues). You will also need to select [**Enable CloudWatch logs** in your DMS task settings](#step-2-2-task-settings). +- If you are migrating to CockroachDB {{ site.data.products.dedicated }}, enable [CockroachDB log export to Amazon CloudWatch]({% link cockroachcloud/export-logs.md %}) **before** starting the DMS migration. This makes CockroachDB logs accessible for [troubleshooting](#troubleshoot-common-issues). You will also need to select [**Enable CloudWatch logs** in your DMS task settings](#step-2-2-task-settings). #### Supported database technologies @@ -227,26 +227,7 @@ The `BatchApplyEnabled` setting can improve replication performance and is recom `BatchApplyEnabled` does not work when using **Drop tables on target** as a target table preparation mode. Thus, all schema-related changes must be manually copied over if using `BatchApplyEnabled`. {{site.data.alerts.end}} -## Known limitations - -- When using **Truncate** or **Do nothing** as a target table preparation mode, you cannot include tables with any hidden columns. You can verify which tables contain hidden columns by executing the following SQL query: - - {% include_cached copy-clipboard.html %} - ~~~ sql - > SELECT table_catalog, table_schema, table_name, column_name FROM information_schema.columns WHERE is_hidden = 'YES'; - ~~~ - -- If you are migrating from PostgreSQL, are using a [`STRING`]({% link {{ page.version.version }}/string.md %}) as a [`PRIMARY KEY`]({% link {{ page.version.version }}/primary-key.md %}), and have selected **Enable validation** in your [task settings](#step-2-2-task-settings), validation can fail due to a difference in how CockroachDB handles case sensitivity in strings. - - To prevent this error, use `COLLATE "C"` on the relevant columns in PostgreSQL or a [collation]({% link {{ page.version.version }}/collate.md %}) such as `COLLATE "en_US"` in CockroachDB. - -- An AWS DMS migration can fail if the target schema has hidden columns. This includes databases with [hash-sharded indexes]({% link {{ page.version.version }}/hash-sharded-indexes.md %}) and [multi-region clusters]({% link {{ page.version.version }}/multiregion-overview.md %}) with [regional by row tables]({% link {{ page.version.version }}/table-localities.md %}). This is because the `COPY` statement used by DMS is unable to process hidden columns. - - To prevent this error, set the [`expect_and_ignore_not_visible_columns_in_copy` session variable]({% link {{ page.version.version }}/session-variables.md %}#expect-and-ignore-not-visible-columns-in-copy) in the DMS [target endpoint configuration](#step-1-create-a-target-endpoint-pointing-to-cockroachdb). Under **Endpoint settings**, add an **AfterConnectScript** setting with the value `SET expect_and_ignore_not_visible_columns_in_copy=on`. - - AWS-DMS-Endpoint-Settings - -## Troubleshooting common issues +## Troubleshoot common issues - For visibility into migration problems: @@ -281,6 +262,23 @@ The `BatchApplyEnabled` setting can improve replication performance and is recom This will likely cause high latency and [transaction retries]({% link {{ page.version.version }}/transaction-retry-error-reference.md %}) due to [lock contention]({% link {{ page.version.version }}/performance-best-practices-overview.md %}#transaction-contention). Try raising the value of the [`kv.transaction_max_intents_bytes` cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}#setting-kv-transaction-max-intents-bytes) to configure CockroachDB to use more memory for quick intent resolution. Note that this memory limit is applied **per-transaction**. To prevent unexpected memory usage at higher workload concurrencies, you should also have proper memory accounting. +- When using **Truncate** or **Do nothing** as a target table preparation mode, you cannot include tables with any hidden columns. You can verify which tables contain hidden columns by executing the following SQL query: + + {% include_cached copy-clipboard.html %} + ~~~ sql + > SELECT table_catalog, table_schema, table_name, column_name FROM information_schema.columns WHERE is_hidden = 'YES'; + ~~~ + +- If you are migrating from PostgreSQL, are using a [`STRING`]({% link {{ page.version.version }}/string.md %}) as a [`PRIMARY KEY`]({% link {{ page.version.version }}/primary-key.md %}), and have selected **Enable validation** in your [task settings](#step-2-2-task-settings), validation can fail due to a difference in how CockroachDB handles case sensitivity in strings. + + To prevent this error, use `COLLATE "C"` on the relevant columns in PostgreSQL or a [collation]({% link {{ page.version.version }}/collate.md %}) such as `COLLATE "en_US"` in CockroachDB. + +- An AWS DMS migration can fail if the target schema has hidden columns. This includes databases with [hash-sharded indexes]({% link {{ page.version.version }}/hash-sharded-indexes.md %}) and [multi-region clusters]({% link {{ page.version.version }}/multiregion-overview.md %}) with [regional by row tables]({% link {{ page.version.version }}/table-localities.md %}). This is because the `COPY` statement used by DMS is unable to process hidden columns. + + To prevent this error, set the [`expect_and_ignore_not_visible_columns_in_copy` session variable]({% link {{ page.version.version }}/session-variables.md %}#expect-and-ignore-not-visible-columns-in-copy) in the DMS [target endpoint configuration](#step-1-create-a-target-endpoint-pointing-to-cockroachdb). Under **Endpoint settings**, add an **AfterConnectScript** setting with the value `SET expect_and_ignore_not_visible_columns_in_copy=on`. + + AWS-DMS-Endpoint-Settings + - The following error in the CockroachDB [logs]({% link {{ page.version.version }}/logging-overview.md %}) indicates that AWS DMS is unable to copy into a table with a [computed column]({% link {{ page.version.version }}/computed-columns.md %}): ~~~ diff --git a/src/current/v24.1/configure-logs.md b/src/current/v24.1/configure-logs.md index e8e6166227e..34688ca3662 100644 --- a/src/current/v24.1/configure-logs.md +++ b/src/current/v24.1/configure-logs.md @@ -188,7 +188,7 @@ The files generated for a group named `default` are named after the pattern `coc #### Known limitations -Log files can only be accessed in the DB Console if they are stored in the same directory as the file sink for the `DEV` channel. +{% include {{ page.version.version }}/known-limitations/logging-limitations.md %} ### Output to Fluentd-compatible network collectors diff --git a/src/current/v24.1/cost-based-optimizer.md b/src/current/v24.1/cost-based-optimizer.md index cfb59914ce6..c2e2e2c3d07 100644 --- a/src/current/v24.1/cost-based-optimizer.md +++ b/src/current/v24.1/cost-based-optimizer.md @@ -260,9 +260,9 @@ Locality optimized search is supported for scans that are guaranteed to return 1 ### Limitations -{% include {{page.version.version}}/sql/locality-optimized-search-limited-records.md %} +{% include {{ page.version.version }}/known-limitations/locality-optimized-search-limited-records.md %} -{% include {{page.version.version}}/sql/locality-optimized-search-virtual-computed-columns.md %} +{% include {{page.version.version}}/known-limitations/locality-optimized-search-virtual-computed-columns.md %} ## Control whether queries are limited to a single region @@ -450,7 +450,7 @@ If you have an index named `FORCE_ZIGZAG` and use the hint `table@{FORCE_ZIGZAG} ## Known limitations -* {% include {{page.version.version}}/known-limitations/stats-refresh-upgrade.md %} +- {% include {{page.version.version}}/known-limitations/stats-refresh-upgrade.md %} ## See also diff --git a/src/current/v24.1/create-table.md b/src/current/v24.1/create-table.md index 31c58d8a463..88c4883d59e 100644 --- a/src/current/v24.1/create-table.md +++ b/src/current/v24.1/create-table.md @@ -155,7 +155,7 @@ If you use `GENERATED BY DEFAULT AS IDENTITY` to define the identity column, any Note the following limitations of identity columns: -- `GENERATED ALWAYS AS IDENTITY`/`GENERATED BY DEFAULT AS IDENTITY` is supported in [`ALTER TABLE ... ADD COLUMN`]({% link {{ page.version.version }}/alter-table.md %}#add-column) statements only when the table being altered is empty, as [CockroachDB does not support back-filling sequential column data]({% link {{ page.version.version }}/known-limitations.md %}#adding-a-column-with-sequence-based-default-values). For more information, see the [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/42508). +- `GENERATED ALWAYS AS IDENTITY`/`GENERATED BY DEFAULT AS IDENTITY` is supported in [`ALTER TABLE ... ADD COLUMN`]({% link {{ page.version.version }}/alter-table.md %}#add-column) statements only when the table being altered is empty, as [CockroachDB does not support back-filling sequential column data]({% link {{ page.version.version }}/known-limitations.md %}#adding-a-column-with-sequence-based-default-values). For more information, see [#42508](https://github.com/cockroachdb/cockroach/issues/42508). - Unlike PostgreSQL, CockroachDB does not support using the `OVERRIDING SYSTEM VALUE` clause in `INSERT`/`UPDATE`/`UPSERT` statements to overwrite `GENERATED ALWAYS AS IDENTITY` identity column values. For an example of an identity column, see [Create a table with an identity column](#create-a-table-with-an-identity-column). diff --git a/src/current/v24.1/drop-owned-by.md b/src/current/v24.1/drop-owned-by.md index eebdfbb4031..e1653f8c8d7 100644 --- a/src/current/v24.1/drop-owned-by.md +++ b/src/current/v24.1/drop-owned-by.md @@ -29,8 +29,7 @@ The [role]({% link {{ page.version.version }}/security-reference/authorization.m ## Known limitations -- [Enum]({% link {{ page.version.version }}/enum.md %}) types are not dropped. -{% include {{page.version.version}}/known-limitations/drop-owned-by-role-limitations.md %} +{% include {{page.version.version}}/known-limitations/drop-owned-by-limitations.md %} ## Examples diff --git a/src/current/v24.1/expression-indexes.md b/src/current/v24.1/expression-indexes.md index ca2ccd8824a..2a3a04b5dfd 100644 --- a/src/current/v24.1/expression-indexes.md +++ b/src/current/v24.1/expression-indexes.md @@ -169,10 +169,7 @@ As shown in this example, for an expression index to be used to service a query, Expression indexes have the following limitations: -- The expression cannot reference columns outside the index's table. -- Functional expression output must be determined by the input arguments. For example, you can't use the [volatile function]({% link {{ page.version.version }}/functions-and-operators.md %}#function-volatility) `now()` to create an index because its output depends on more than just the function arguments. -- {% include {{page.version.version}}/sql/expression-indexes-cannot-reference-computed-columns.md %} -- {% include {{page.version.version}}/sql/expressions-as-on-conflict-targets.md %} +{% include {{ page.version.version }}/known-limitations/expression-index-limitations.md %} ## See also diff --git a/src/current/v24.1/full-text-search.md b/src/current/v24.1/full-text-search.md index 5b93835d9c3..5efc1e5bc35 100644 --- a/src/current/v24.1/full-text-search.md +++ b/src/current/v24.1/full-text-search.md @@ -447,20 +447,7 @@ CREATE INDEX ON t USING GIN (b); Some PostgreSQL syntax and features are unsupported. These include, but are not limited to: -- Aspects of [text search configurations](#text-search-configuration) other than the specified dictionary. -- `websearch_to_tsquery()` built-in function. -- `tsquery_phrase()` built-in function. -- `ts_rank_cd()` built-in function. -- `setweight()` built-in function. -- Inverted joins on `TSVECTOR` values. -- `tsvector || tsvector` comparisons. -- `tsquery || tsquery` comparisons. -- `tsquery && tsquery` comparisons. -- `tsquery <-> tsquery` comparisons. -- `!! tsquery` comparisons. -- `tsquery @> tsquery` and `tsquery <@ tsquery` comparisons. - -For full details, see the [tracking issue](https://github.com/cockroachdb/cockroach/issues/41288). +{% include {{ page.version.version }}/known-limitations/full-text-search-unsupported.md %} ## See also diff --git a/src/current/v24.1/import-into.md b/src/current/v24.1/import-into.md index e6d6960dcbf..4e73d7be587 100644 --- a/src/current/v24.1/import-into.md +++ b/src/current/v24.1/import-into.md @@ -285,15 +285,7 @@ For more information about importing data from Avro, including examples, see [Mi ## Known limitations -- While importing into an existing table, the table is taken offline. -- After importing into an existing table, [constraints]({% link {{ page.version.version }}/constraints.md %}) will be un-validated and need to be [re-validated]({% link {{ page.version.version }}/alter-table.md %}#validate-constraint). -- Imported rows must not conflict with existing rows in the table or any unique secondary indexes. -- `IMPORT INTO` works for only a single existing table. -- `IMPORT INTO` can sometimes fail with a "context canceled" error, or can restart itself many times without ever finishing. If this is happening, it is likely due to a high amount of disk contention. This can be mitigated by setting the `kv.bulk_io_write.max_rate` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) to a value below your max disk write speed. For example, to set it to 10MB/s, execute: - {% include_cached copy-clipboard.html %} - ~~~ sql - > SET CLUSTER SETTING kv.bulk_io_write.max_rate = '10MB'; - ~~~ +{% include {{ page.version.version }}/known-limitations/import-into-limitations.md %} ## See also diff --git a/src/current/v24.1/jsonb.md b/src/current/v24.1/jsonb.md index 221e075ee1d..dabf2afe98c 100644 --- a/src/current/v24.1/jsonb.md +++ b/src/current/v24.1/jsonb.md @@ -83,17 +83,7 @@ To [index]({% link {{ page.version.version }}/indexes.md %}) a `JSONB` column yo ## Known limitations -- You cannot use [primary key]({% link {{ page.version.version }}/primary-key.md %}), [foreign key]({% link {{ page.version.version }}/foreign-key.md %}), and [unique]({% link {{ page.version.version }}/unique.md %}) [constraints]({% link {{ page.version.version }}/constraints.md %}) on `JSONB` values. - -- {% include {{page.version.version}}/sql/jsonb-comparison.md %} - -- You cannot [order]({% link {{ page.version.version }}/order-by.md %}) queries using `JSONB` and `JSON`-typed columns. - - [Tracking issue](https://github.com/cockroachdb/cockroach/issues/35706) - -- If the execution of a [join]({% link {{ page.version.version }}/joins.md %}) query exceeds the limit set for [memory-buffering operations]({% link {{ page.version.version }}/vectorized-execution.md %}#disk-spilling-operations) (i.e., the value set for the `sql.distsql.temp_storage.workmem` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %})), CockroachDB will spill the intermediate results of computation to disk. If the join operation spills to disk, and at least one of the columns is of type `JSON`, CockroachDB returns the error `unable to encode table key: *tree.DJSON`. If the memory limit is not reached, then the query will be processed without error. - - [Tracking issue](https://github.com/cockroachdb/cockroach/issues/35706) +{% include {{ page.version.version }}/known-limitations/jsonb-limitations.md %} ## Examples diff --git a/src/current/v24.1/known-limitations.md b/src/current/v24.1/known-limitations.md index 8713492b76b..c3db00d4ca7 100644 --- a/src/current/v24.1/known-limitations.md +++ b/src/current/v24.1/known-limitations.md @@ -6,185 +6,465 @@ keywords: gin, gin index, gin indexes, inverted index, inverted indexes, acceler docs_area: releases --- -This page describes newly identified limitations in the CockroachDB {{page.release_info.version}} release as well as unresolved limitations identified in earlier releases. +{% assign previous_version = site.data.versions | where_exp: "previous_version", "previous_version.major_version == page.version.version" | map: "previous_version" | first %} -## New limitations +## New limitations in {{ page.version.version }} -### PL/pgSQL Limitations +This section describes newly identified limitations in CockroachDB {{ page.version.version }}. -#### Support for PL/pgSQL features +{{site.data.alerts.callout_info}} +Limitations will be added as they are discovered. +{{site.data.alerts.end}} -- PL/pgSQL blocks cannot be nested. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/114775) -- PL/pgSQL arguments cannot be referenced with ordinals (e.g., `$1`, `$2`). [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/114701) -- `FOR` loops, including `FOR` cursor loops, `FOR` query loops, and `FOREACH` loops, are not supported. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/105246) -- `RETURN NEXT` and `RETURN QUERY` statements are not supported. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/117744) -- `EXIT` and `CONTINUE` labels and conditions are not supported. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/115271) -- `CASE` statements are not supported. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/117744) -- `PERFORM`, `EXECUTE`, `GET DIAGNOSTICS`, and `NULL` statements are not supported for PL/pgSQL. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/117744) +## Limitations from {{ previous_version }} and earlier -#### Type Handling and Variable Declarations +This section describes limitations from previous CockroachDB versions that still impact {{ page.version.version }}. -- `RECORD` parameters and variables are not supported. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/105713) -- Variable shadowing (e.g., declaring a variable with the same name in an inner block) is not supported in PL/pgSQL. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/117508) -- Syntax for accessing members of composite types without parentheses is not supported. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/114687) -- The `STRICT` option for the PL/pgSQL `INTO` statement is not supported. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/107854) -- `NOT NULL` variable declarations are not supported. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/105243) +### SQL statements -#### Cursor Functionality +#### Syntax and behavior differences from PostgreSQL -- Cursors opened in PL/pgSQL execute their queries on opening, affecting performance and resource usage. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/111479) -- `OPEN FOR EXECUTE` is not supported for opening cursors. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/117744) +CockroachDB supports the [PostgreSQL wire protocol](https://www.postgresql.org/docs/current/protocol.html) and the majority of its syntax. For a list of known differences in syntax and behavior between CockroachDB and PostgreSQL, see [Features that differ from PostgreSQL]({% link {{ page.version.version }}/postgresql-compatibility.md %}#features-that-differ-from-postgresql). -#### Exception Handling +#### `AS OF SYSTEM TIME` does not support placeholders -- PL/pgSQL exception blocks cannot catch [transaction retry errors]({% link {{ page.version.version }}/transaction-retry-error-reference.md %}). [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/111446) -- `RAISE` statements cannot be annotated with names of schema objects related to the error (i.e., using `COLUMN`, `CONSTRAINT`, `DATATYPE`, `TABLE`, or `SCHEMA`). [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/106237) -- `RAISE` statements message the client directly, and do not produce log output. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/117750) -- `ASSERT` debugging checks are not supported. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/117744) +CockroachDB does not support placeholders in [`AS OF SYSTEM TIME`]({% link {{ page.version.version }}/as-of-system-time.md %}). The time value must be embedded in the SQL string. [#30955](https://github.com/cockroachdb/cockroach/issues/30955) -### Limitations in User-Defined Functions (UDFs) and Stored Procedures +#### `COPY` syntax not supported by CockroachDB -- Transactions cannot be run within stored procedures. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/115294) -- UDFs and stored procedures cannot call other UDFs or stored procedures from within their bodies. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/88198) -- DDL statements (e.g., `CREATE TABLE`, `CREATE INDEX`) are not allowed within UDFs or procedures. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/110080) -- UDF and stored procedure definitions do not support `OUT` and `INOUT` argument modes. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/100405) -- The `setval` function cannot be resolved when used inside UDF bodies. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/110860) +{% include {{ page.version.version }}/known-limitations/copy-syntax.md %} + +#### `IMPORT INTO` limitations -### SQL Optimizer and Read Committed Isolation +{% include {{ page.version.version }}/known-limitations/import-into-limitations.md %} -#### Optimizer and Locking Behavior +#### Row-Level TTL limitations + +{% include {{page.version.version}}/known-limitations/row-level-ttl-limitations.md %} -- The SQL optimizer has limitations under certain isolation levels: - - The new implementation of `SELECT FOR UPDATE` is not yet the default setting under `SERIALIZABLE` isolation. It can be used under `SERIALIZABLE` isolation by setting the `optimizer_use_lock_op_for_serializable` [session setting]({% link {{ page.version.version }}/session-variables.md %}) to `true`. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/114737) - - `SELECT FOR UPDATE` does not lock completely-`NULL` column families in multi-column-family tables. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/116836) +#### `CAST` expressions containing a subquery with an `ENUM` target are not supported -#### Read Committed Isolation Limitations +Casting subqueries to ENUMs in views and UDFs is not supported. [#108184](https://github.com/cockroachdb/cockroach/issues/108184) -- Several capabilities are not yet supported with [Read Committed isolation](https://www.cockroachlabs.com/docs/v23.2/read-committed): - - Schema changes (e.g., [`CREATE TABLE`]({% link {{ page.version.version }}/create-table.md %}), [`CREATE SCHEMA`]({% link {{ page.version.version }}/create-schema.md %}), [`CREATE INDEX`]({% link {{ page.version.version }}/create-index.md %})) cannot be performed within explicit `READ COMMITTED` transactions, and will cause transactions to abort. As a workaround, [set the transaction's isolation level]({% link {{ page.version.version }}/read-committed.md %}#set-the-current-transaction-to-read-committed) to `SERIALIZABLE`. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/114778) - - `READ COMMITTED` transactions performing `INSERT`, `UPDATE`, or `UPSERT` cannot access [`REGIONAL BY ROW`]({% link {{ page.version.version }}/table-localities.md %}#regional-by-row-tables) tables in which [`UNIQUE`]({% link {{ page.version.version }}/unique.md %}) and [`PRIMARY KEY`]({% link {{ page.version.version }}/primary-key.md %}) constraints exist, the region is not included in the constraint, and the region cannot be computed from the constraint columns. - - [Shared locks]({% link {{ page.version.version }}/read-committed.md %}#locking-reads) cannot yet be promoted to exclusive locks. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/110435) - - [`SKIP LOCKED`]({% link {{ page.version.version }}/select-for-update.md %}#wait-policies) requests do not check for [replicated locks]({% link {{ page.version.version }}/architecture/transaction-layer.md %}#unreplicated-locks), which can be acquired by `READ COMMITTED` transactions. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/110743) - - Multi-column-family checks during updates are not supported under `READ COMMITTED` isolation. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/112488) +#### Statements containing multiple modification subqueries of the same table are disallowed -### `CAST` expressions containing a subquery with an `ENUM` target are not supported +Statements containing multiple modification subqueries mutating the same row could cause corruption. These statements are disallowed by default, but you can enable multiple modification subqueries with one the following: -- Casting subqueries to ENUMs in views and UDFs is not supported. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/108184) +- Set the `sql.multiple_modifications_of_table.enabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) to `true`. +- Use the `enable_multiple_modifications_of_table` [session variable]({% link {{ page.version.version }}/set-vars.md %}). -## Unresolved limitations +If multiple mutations inside the same statement affect different tables with [`FOREIGN KEY`]({% link {{ page.version.version }}/foreign-key.md %}) relations and `ON CASCADE` clauses between them, the results will be different from what is expected in PostgreSQL. [#70731](https://github.com/cockroachdb/cockroach/issues/70731) -### Limitations for user-defined functions (UDFs) +#### Using `default_int_size` session variable in batch of statements -#### Limitations on use of UDFs +When setting the `default_int_size` [session variable]({% link {{ page.version.version }}/set-vars.md %}) in a batch of statements such as `SET default_int_size='int4'; SELECT 1::IN`, the `default_int_size` variable will not take effect until the next statement. Statement parsing is asynchronous with statement execution. -[User-defined functions]({% link {{ page.version.version }}/user-defined-functions.md %}) are not currently supported in: +As a workaround, set `default_int_size` via your database driver, or ensure that `SET default_int_size` is in its own statement. [#32846](https://github.com/cockroachdb/cockroach/issues/32846) -- Expressions (column, index, constraint) in tables. +#### Overload resolution for collated strings - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/87699) +Many string operations are not properly overloaded for [collated strings]({% link {{ page.version.version }}/collate.md %}), for example: -- Views. +{% include_cached copy-clipboard.html %} +~~~ sql +> SELECT 'string1' || 'string2'; +~~~ - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/87699) +~~~ + ?column? +------------------ + string1string2 +(1 row) +~~~ -- Other user-defined functions. +{% include_cached copy-clipboard.html %} +~~~ sql +> SELECT ('string1' collate en) || ('string2' collate en); +~~~ - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/93049) +~~~ +pq: unsupported binary operator: || +~~~ -#### Limitations on expressions allowed within UDFs +[#10679](https://github.com/cockroachdb/cockroach/issues/10679) -The following are not currently allowed within the body of a [UDF]({% link {{ page.version.version }}/user-defined-functions.md %}): +#### Current sequence value not checked when updating min/max value -- [Common table expressions]({% link {{ page.version.version }}/common-table-expressions.md %}) (CTE), recursive or non-recursive, are not supported in [user-defined functions]({% link {{ page.version.version }}/user-defined-functions.md %}) (UDF). That is, you cannot use a `WITH` clause in the body of a UDF. +Altering the minimum or maximum value of a series does not check the current value of a series. This means that it is possible to silently set the maximum to a value less than, or a minimum value greater than, the current value. [#23719](https://github.com/cockroachdb/cockroach/issues/23719) - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/92961) +#### `null_ordered_last` does not produce correct results with tuples -- References to other user-defined functions. +By default, CockroachDB orders `NULL`s before all other values. For compatibility with PostgreSQL, the `null_ordered_last` [session variable]({% link {{ page.version.version }}/set-vars.md %}) was added, which changes the default to order `NULL` values after all other values. This works in most cases, due to some transformations CockroachDB makes in the optimizer to add extra ordering columns. However, it does not work when the ordering column is a tuple. [#93558](https://github.com/cockroachdb/cockroach/issues/93558) - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/93049) +### Functions and procedures -### Table-level restore will not restore user-defined functions +#### PL/pgSQL feature support -{% include {{ page.version.version }}/known-limitations/restore-udf.md %} +{% include {{ page.version.version }}/known-limitations/plpgsql-feature-limitations.md %} -### Incorrect query plans for partitions with `NULL` values +#### PL/pgSQL data types -In cases where the partition definition includes a comparison with `NULL` and a query constraint, incorrect query plans are returned. However, this case uses non-standard partitioning which defines partitions which could never hold values, so it is not likely to occur in production environments. +{% include {{ page.version.version }}/known-limitations/plpgsql-datatype-limitations.md %} -[Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/82774) +#### UDF and stored procedure support -### `null_ordered_last` does not produce correct results with tuples +{% include {{ page.version.version }}/known-limitations/udf-stored-proc-limitations.md %} -By default, CockroachDB orders `NULL`s before all other values. For compatibility with PostgreSQL, the `null_ordered_last` [session variable]({% link {{ page.version.version }}/set-vars.md %}) was added, which changes the default to order `NULL`s after all other values. This works in most cases, due to some transformations CockroachDB makes in the optimizer to add extra ordering columns. However, it is broken when the ordering column is a tuple. +### Transactions -[Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/93558) +#### Read Committed features and performance -### Limitations for `DROP OWNED BY` +[Read Committed isolation]({% link {{ page.version.version }}/read-committed.md %}) has the following limitations: -[`DROP OWNED BY`]({% link {{ page.version.version }}/drop-owned-by.md %}) drops all owned objects as well as any [grants]({% link {{ page.version.version }}/grant.md %}) on objects not owned by the [role]({% link {{ page.version.version }}/security-reference/authorization.md %}#roles). +{% include {{ page.version.version }}/known-limitations/read-committed-limitations.md %} -#### `DROP OWNED BY` is not supported where role has system-level privileges +#### `SELECT FOR UPDATE` locks are dropped on lease transfers and range splits/merges -{% include {{page.version.version}}/known-limitations/drop-owned-by-role-limitations.md %} +{% include {{page.version.version}}/known-limitations/select-for-update-limitations.md %} -### Spatial features disabled for ARM Macs +#### `SET` does not `ROLLBACK` in a transaction -[Spatial features]({% link {{ page.version.version }}/spatial-data-overview.md %}) are disabled due to an issue with macOS code signing for the [GEOS](https://libgeos.org/) libraries. Users needing spatial features on an ARM Mac may instead [use Rosetta](https://developer.apple.com/documentation/virtualization/running_intel_binaries_in_linux_vms_with_rosetta) to [run the Intel binary]({% link {{ page.version.version }}/install-cockroachdb-mac.md %}#install-binary) or use the [Docker image]({% link {{ page.version.version }}/install-cockroachdb-mac.md %}#use-docker) distribution. This is expected to be resolved in an upcoming 22.2 patch release. +{% include {{page.version.version}}/known-limitations/set-transaction-no-rollback.md %} -[GitHub tracking issue](https://github.com/cockroachdb/cockroach/issues/93161) +#### `ROLLBACK TO SAVEPOINT` in high-priority transactions containing DDL +1 +Transactions with [priority `HIGH`]({% link {{ page.version.version }}/transactions.md %}#transaction-priorities) that contain DDL and `ROLLBACK TO SAVEPOINT` are not supported, as they could result in a deadlock. For example: -### Limited SQL cursor support +~~~ sql +> BEGIN PRIORITY HIGH; SAVEPOINT s; CREATE TABLE t(x INT); ROLLBACK TO SAVEPOINT s; +~~~ + +~~~ +ERROR: unimplemented: cannot use ROLLBACK TO SAVEPOINT in a HIGH PRIORITY transaction containing DDL +SQLSTATE: 0A000 +HINT: You have attempted to use a feature that is not yet implemented. +See: https://github.com/cockroachdb/cockroach/issues/46414 +~~~ + +[#46414](https://github.com/cockroachdb/cockroach/issues/46414) + +#### SQL cursor support {% include {{page.version.version}}/known-limitations/sql-cursors.md %} -### `SELECT FOR UPDATE` locks are dropped on lease transfers and range splits/merges +#### Materialized views inside transactions + +{% include {{page.version.version}}/known-limitations/cannot-refresh-materialized-views-inside-transactions.md %} + +### Schemas and indexes + +#### Schema changes within transactions + +{% include {{ page.version.version }}/known-limitations/schema-changes-within-transactions.md %} + +#### Adding a column with sequence-based `DEFAULT` values + +It is currently not possible to [add a column]({% link {{ page.version.version }}/alter-table.md %}#add-column) to a table when the column uses a [sequence]({% link {{ page.version.version }}/create-sequence.md %}) as the [`DEFAULT`]({% link {{ page.version.version }}/default-value.md %}) value, for example: + +{% include_cached copy-clipboard.html %} +~~~ sql +> CREATE TABLE t (x INT); +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +> INSERT INTO t(x) VALUES (1), (2), (3); +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +> CREATE SEQUENCE s; +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +> ALTER TABLE t ADD COLUMN y INT DEFAULT nextval('s'); +~~~ + +~~~ +ERROR: nextval(): unimplemented: cannot evaluate scalar expressions containing sequence operations in this context +SQLSTATE: 0A000 +~~~ + +[#42508](https://github.com/cockroachdb/cockroach/issues/42508) + +#### Dropping a column referenced by a partial index + +{% include {{ page.version.version }}/known-limitations/drop-column-partial-index.md %} + +#### Schema change DDL statements inside a multi-statement transaction can fail while other statements succeed + +{% include {{ page.version.version }}/known-limitations/schema-change-ddl-inside-multi-statement-transactions.md %} + +#### Schema changes between executions of prepared statements + +{% include {{ page.version.version }}/known-limitations/schema-changes-between-prepared-statements.md %} + +#### Declarative schema changer does not track rows in `system.privileges` + +The [declarative schema changer]({% link {{ page.version.version }}/online-schema-changes.md %}#declarative-schema-changer) does not track rows in the `system.privileges` table, which prevents the declarative schema changer from successfully running the [`DROP OWNED BY`]({% link {{ page.version.version }}/drop-owned-by.md %}) statement. [#88149](https://github.com/cockroachdb/cockroach/issues/88149) + +#### New values generated by `DEFAULT` expressions during `ALTER TABLE ADD COLUMN` + +When executing an [`ALTER TABLE ADD COLUMN`]({% link {{ page.version.version }}/alter-table.md %}#add-column) statement with a [`DEFAULT`]({% link {{ page.version.version }}/default-value.md %}) expression, new values generated: + +- use the default [search path]({% link {{ page.version.version }}/sql-name-resolution.md %}#search-path) regardless of the search path configured in the current session via `SET SEARCH_PATH`. +- use the UTC time zone regardless of the time zone configured in the current session via [`SET TIME ZONE`]({% link {{ page.version.version }}/set-vars.md %}). +- have no default database regardless of the default database configured in the current session via [`SET DATABASE`]({% link {{ page.version.version }}/set-vars.md %}), so you must specify the database of any tables they reference. +- use the transaction timestamp for the `statement_timestamp()` function regardless of the time at which the `ALTER` statement was issued. + +#### Some column-dropping schema changes do not roll back properly + +Some [schema changes]({% link {{ page.version.version }}/online-schema-changes.md %}) that [drop columns]({% link {{ page.version.version }}/alter-table.md %}#drop-column) cannot be [rolled back]({% link {{ page.version.version }}/rollback-transaction.md %}) properly. -{% include {{page.version.version}}/sql/select-for-update-limitations.md %} +In some cases, the rollback will succeed, but the column data might be partially or totally missing, or stale due to the asynchronous nature of the schema change. [#46541](https://github.com/cockroachdb/cockroach/issues/46541) -### Unsupported trigram syntax +In other cases, the rollback will fail in such a way that will never be cleaned up properly, leaving the table descriptor in a state where no other schema changes can be run successfully. [#47712](https://github.com/cockroachdb/cockroach/issues/47712) + +To reduce the chance that a column drop will roll back incorrectly: + +- Perform column drops in transactions separate from other schema changes. This ensures that other schema change failures will not cause the column drop to be rolled back. + +- Drop all [constraints]({% link {{ page.version.version }}/constraints.md %}) (including [unique indexes]({% link {{ page.version.version }}/unique.md %})) on the column in a separate transaction, before dropping the column. + +- Drop any [default values]({% link {{ page.version.version }}/default-value.md %}) or [computed expressions]({% link {{ page.version.version }}/computed-columns.md %}) on a column before attempting to drop the column. This prevents conflicts between constraints and default/computed values during a column drop rollback. + +If you think a rollback of a column-dropping schema change has occurred, check the [jobs table]({% link {{ page.version.version }}/show-jobs.md %}). Schema changes with an error prefaced by `cannot be reverted, manual cleanup may be required` might require manual intervention. + +#### Remove a `UNIQUE` index created as part of `CREATE TABLE` + +{% include {{ page.version.version }}/known-limitations/drop-unique-index-from-create-table.md %} + +#### Max size of a single column family + +When creating or updating a row, if the combined size of all values in a single [column family]({% link {{ page.version.version }}/column-families.md %}) exceeds the [max range size]({% link {{ page.version.version }}/configure-replication-zones.md %}#range-max-bytes) for the table, the operation may fail, or cluster performance may suffer. + +As a workaround, you can either [manually split a table's columns into multiple column families]({% link {{ page.version.version }}/column-families.md %}#manual-override), or you can [create a table-specific zone configuration]({% link {{ page.version.version }}/configure-replication-zones.md %}#create-a-replication-zone-for-a-table) with an increased max range size. + +#### Dropping a single partition + +{% include {{ page.version.version }}/known-limitations/drop-single-partition.md %} + +#### Placeholders in `PARTITION BY` + +{% include {{ page.version.version }}/known-limitations/partitioning-with-placeholders.md %} [#19464](https://github.com/cockroachdb/cockroach/issues/19464) + +#### Unsupported trigram syntax The following PostgreSQL syntax and features are currently unsupported for [trigrams]({% link {{ page.version.version }}/trigram-indexes.md %}): -{% include {{ page.version.version }}/sql/trigram-unsupported-syntax.md %} +{% include {{ page.version.version }}/known-limitations/trigram-unsupported-syntax.md %} -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/41285) +#### Unsupported full-text search features -### Statements containing multiple modification subqueries of the same table are disallowed +The following PostgreSQL syntax and features are currently unsupported for [full-text search]({% link {{ page.version.version }}/full-text-search.md %}): -Statements containing multiple modification subqueries mutating the same row could cause corruption. These statements are disallowed by default, but you can enable multiple modification subqueries with one the following: +{% include {{ page.version.version }}/known-limitations/full-text-search-unsupported.md %} -- Set the `sql.multiple_modifications_of_table.enabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) to `true`. -- Use the `enable_multiple_modifications_of_table` [session variable]({% link {{ page.version.version }}/set-vars.md %}). +#### CockroachDB does not allow inverted indexes with `STORING` -Note that if multiple mutations inside the same statement affect different tables with [`FOREIGN KEY`]({% link {{ page.version.version }}/foreign-key.md %}) relations and `ON CASCADE` clauses between them, the results will be different from what is expected in PostgreSQL. +CockroachDB does not allow inverted indexes with a [`STORING` column]({% link {{ page.version.version }}/create-index.md %}#store-columns). [#88278](https://github.com/cockroachdb/cockroach/issues/88278) -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/70731) +#### Multiple arbiter indexes for `INSERT ON CONFLICT DO UPDATE` -### `transaction_rows_read_err` and `transaction_rows_written_err` do not halt query execution +{% include {{ page.version.version }}/known-limitations/multiple-arbiter-indexes.md %} -The `transaction_rows_read_err` and `transaction_rows_written_err` [session settings]({% link {{ page.version.version }}/set-vars.md %}) limit the number of rows read or written by a single [transaction]({% link {{ page.version.version }}/transactions.md %}#limit-the-number-of-rows-written-or-read-in-a-transaction). These session settings will fail the transaction with an error, but not until the current query finishes executing and the results have been returned to the client. +#### Expression index limitations -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/70473) +{% include {{ page.version.version }}/known-limitations/expression-index-limitations.md %} -### `sql.guardrails.max_row_size_err` misses indexed virtual computed columns +### Data types -The `sql.guardrails.max_row_size_err` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) misses large rows caused by indexed virtual computed columns. This is because the guardrail only checks the size of primary key rows, not secondary index rows. +#### Spatial support limitations -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/69540) +CockroachDB supports efficiently storing and querying [spatial data]({% link {{ page.version.version }}/export-spatial-data.md %}), with the following limitations: -### CockroachDB does not allow inverted indexes with `STORING` +- Not all [PostGIS spatial functions](https://postgis.net/docs/reference.html) are supported. [#49203](https://github.com/cockroachdb/cockroach/issues/49203) -CockroachDB does not allow inverted indexes with a [`STORING` column]({% link {{ page.version.version }}/create-index.md %}#store-columns). +- The `AddGeometryColumn` [spatial function]({% link {{ page.version.version }}/functions-and-operators.md %}#spatial-functions) only allows constant arguments. [#49402](https://github.com/cockroachdb/cockroach/issues/49402) -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/88278) +- The `AddGeometryColumn` spatial function only allows the `true` value for its `use_typmod` parameter. [#49448](https://github.com/cockroachdb/cockroach/issues/49448) -### `AS OF SYSTEM TIME` does not support placeholders +- CockroachDB does not support the `@` operator. Instead of using `@` in spatial expressions, we recommend using the inverse, with `~`. For example, instead of `a @ b`, use `b ~ a`. [#56124](https://github.com/cockroachdb/cockroach/issues/56124) -CockroachDB does not support placeholders in [`AS OF SYSTEM TIME`]({% link {{ page.version.version }}/as-of-system-time.md %}). The time value must be embedded in the SQL string. +- CockroachDB does not yet support [`INSERT`]({% link {{ page.version.version }}/insert.md %})s into the [`spatial_ref_sys` table]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial-system-tables). This limitation also blocks the [`ogr2ogr -f PostgreSQL` file conversion command](https://gdal.org/programs/ogr2ogr.html#cmdoption-ogr2ogr-f). [#55903](https://github.com/cockroachdb/cockroach/issues/55903) -[Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/30955) +- CockroachDB does not yet support [k-nearest neighbors](https://wikipedia.org/wiki/K-nearest_neighbors_algorithm). [#55227](https://github.com/cockroachdb/cockroach/issues/55227) -### CockroachDB does not properly optimize some left and anti joins with GIN indexes +- CockroachDB does not support using [schema name prefixes]({% link {{ page.version.version }}/sql-name-resolution.md %}#how-name-resolution-works) to refer to [data types]({% link {{ page.version.version }}/data-types.md %}) with type modifiers (e.g., `public.geometry(linestring, 4326)`). Instead, use fully-unqualified names to refer to data types with type modifiers (e.g., `geometry(linestring,4326)`). [#56492](https://github.com/cockroachdb/cockroach/issues/56492) + +- {% include {{ page.version.version }}/known-limitations/srid-4326-limitations.md %} + +#### Limitations for composite types + +- {% include {{page.version.version}}/cdc/types-udt-composite-general.md %} The following limitations apply: + - {% include {{page.version.version}}/cdc/avro-udt-composite.md %} + - {% include {{page.version.version}}/cdc/csv-udt-composite.md %} + +- Updating subfields of composite types using dot syntax results in a syntax error. [#102984](https://github.com/cockroachdb/cockroach/issues/102984) + +#### `ALTER TYPE` limitations + +{% include {{ page.version.version }}/known-limitations/alter-type-limitations.md %} + +#### `JSONB` limitations + +{% include {{ page.version.version }}/known-limitations/jsonb-limitations.md %} + +### Security and privileges + +#### `DROP OWNED BY` limitations + +{% include {{page.version.version}}/known-limitations/drop-owned-by-limitations.md %} + +#### Privileges for `DELETE` and `UPDATE` + +Every [`DELETE`]({% link {{ page.version.version }}/delete.md %}) or [`UPDATE`]({% link {{ page.version.version }}/update.md %}) statement constructs a `SELECT` statement, even when no `WHERE` clause is involved. As a result, the user executing `DELETE` or `UPDATE` requires both the `DELETE` and `SELECT` or `UPDATE` and `SELECT` [privileges]({% link {{ page.version.version }}/security-reference/authorization.md %}#managing-privileges) on the table. + +### Deployment and operations + +#### CockroachDB does not test for all connection failure scenarios + +CockroachDB servers rely on the network to report when a TCP connection fails. In most scenarios when a connection fails, the network immediately reports a connection failure, resulting in a `Connection refused` error. + +However, if there is no host at the target IP address, or if a firewall rule blocks traffic to the target address and port, a TCP handshake can linger while the client network stack waits for a TCP packet in response to network requests. To work around this kind of scenario, we recommend the following: + +- When migrating a node to a new machine, keep the server listening at the previous IP address until the cluster has completed the migration. +- Configure any active network firewalls to allow node-to-node traffic. +- Verify that orchestration tools (e.g., Kubernetes) are configured to use the correct network connection information. + +[#53410](https://github.com/cockroachdb/cockroach/issues/53410) + +#### No guaranteed state switch from `DECOMMISSIONING` to `DECOMMISSIONED` if `node decommission` is interrupted + +There is no guaranteed state switch from `DECOMMISSIONING` to `DECOMMISSIONED` if [`node decommission`]({% link {{ page.version.version }}/cockroach-node.md %}) is interrupted in one of the following ways: + +- The `cockroach node decommission --wait-all` command was run and then interrupted +- The `cockroach node decommission --wait=none` command was run + +This is because the state flip is effected by the CLI program at the end. Only the CLI (or its underlying API call) is able to finalize the "decommissioned" state. If the command is interrupted, or `--wait=none` is used, the state will only flip to "decommissioned" when the CLI program is run again after decommissioning has done all its work. [#94430](https://github.com/cockroachdb/cockroach/issues/94430) + +#### Simultaneous client connections and running queries on a single node + +When a node has both a high number of client connections and running queries, the node may crash due to memory exhaustion. This is due to CockroachDB not accurately limiting the number of clients and queries based on the amount of available RAM on the node. + +To prevent memory exhaustion, monitor each node's memory usage and ensure there is some margin between maximum CockroachDB memory usage and available system RAM. For more details about memory usage in CockroachDB, see [this blog post](https://www.cockroachlabs.com/blog/memory-usage-cockroachdb/). + +{% include {{page.version.version}}/sql/server-side-connection-limit.md %} This may be useful in addition to your memory monitoring. + +#### Load-based lease rebalancing in uneven latency deployments + +When nodes are started with the [`--locality`]({% link {{ page.version.version }}/cockroach-start.md %}#flags) flag, CockroachDB attempts to place the replica lease holder (the replica that client requests are forwarded to) on the node closest to the source of the request. This means as client requests move geographically, so too does the replica lease holder. + +However, you might see increased latency caused by a consistently high rate of lease transfers between datacenters in the following case: + +- Your cluster runs in datacenters which are very different distances away from each other. +- Each node was started with a single tier of `--locality`, e.g., `--locality=datacenter=a`. +- Most client requests get sent to a single datacenter because that's where all your application traffic is. + +To detect if this is happening, open the [DB Console]({% link {{ page.version.version }}/ui-overview.md %}), select the **Queues** dashboard, hover over the **Replication Queue** graph, and check the **Leases Transferred / second** data point. If the value is consistently larger than 0, you should consider stopping and restarting each node with additional tiers of locality to improve request latency. + +For example, let's say that latency is 10ms from nodes in datacenter A to nodes in datacenter B but is 100ms from nodes in datacenter A to nodes in datacenter C. To ensure A's and B's relative proximity is factored into lease holder rebalancing, you could restart the nodes in datacenter A and B with a common region, `--locality=region=foo,datacenter=a` and `--locality=region=foo,datacenter=b`, while restarting nodes in datacenter C with a different region, `--locality=region=bar,datacenter=c`. + +#### Size limits on statement input from SQL clients + +CockroachDB imposes a hard limit of 16MiB on the data input for a single statement passed to CockroachDB from a client (including the SQL shell). We do not recommend attempting to execute statements from clients with large input. + +#### Using `\|` to perform a large input in the SQL shell + +In the [built-in SQL shell]({% link {{ page.version.version }}/cockroach-sql.md %}), using the [`\|`]({% link {{ page.version.version }}/cockroach-sql.md %}#commands) operator to perform a large number of inputs from a file can cause the server to close the connection. This is because `\|` sends the entire file as a single query to the server, which can exceed the upper bound on the size of a packet the server can accept from any client (16MB). + +As a workaround, [execute the file from the command line]({% link {{ page.version.version }}/cockroach-sql.md %}#execute-sql-statements-from-a-file) with `cat data.sql | cockroach sql` instead of from within the interactive shell. + +#### Spatial features disabled for ARM Macs + +[Spatial features]({% link {{ page.version.version }}/spatial-data-overview.md %}) are disabled due to an issue with macOS code signing for the [GEOS](https://libgeos.org/) libraries. Users needing spatial features on an ARM Mac may instead [use Rosetta](https://developer.apple.com/documentation/virtualization/running_intel_binaries_in_linux_vms_with_rosetta) to [run the Intel binary]({% link {{ page.version.version }}/install-cockroachdb-mac.md %}#install-binary) or use the [Docker image]({% link {{ page.version.version }}/install-cockroachdb-mac.md %}#use-docker) distribution. [GitHub tracking issue](https://github.com/cockroachdb/cockroach/issues/93161) + +#### Logging system limitations + +{% include {{ page.version.version }}/known-limitations/logging-limitations.md %} + +### Observability + +#### DB Console may become inaccessible for secure clusters + +Accessing the DB Console for a secure cluster now requires login information (i.e., username and password). This login information is stored in a system table that is replicated like other data in the cluster. If a majority of the nodes with the replicas of the system table data go down, users will be locked out of the DB Console. + +#### Available capacity metric in the DB Console + +{% include {{ page.version.version }}/misc/available-capacity-metric.md %} + +### Disaster recovery + +#### Physical cluster replication + +{% include {{ page.version.version }}/known-limitations/physical-cluster-replication.md %} + +#### Table-level restore will not restore user-defined functions + +{% include {{ page.version.version }}/known-limitations/restore-udf.md %} + +#### Enterprise `BACKUP` does not capture database/table/column comments + +The [`COMMENT ON`]({% link {{ page.version.version }}/comment-on.md %}) statement associates comments to databases, tables, or columns. However, the internal table (`system.comments`) in which these comments are stored is not captured by a [`BACKUP`]({% link {{ page.version.version }}/backup.md %}) of a table or database. + +As a workaround, take a cluster backup instead, as the `system.comments` table is included in cluster backups. [#44396](https://github.com/cockroachdb/cockroach/issues/44396) + +#### Using `RESTORE` with multi-region table localities + +- {% include {{ page.version.version }}/known-limitations/restore-tables-non-multi-reg.md %} + +- {% include {{ page.version.version }}/known-limitations/restore-multiregion-match.md %} + +### Change data capture + +Change data capture (CDC) provides efficient, distributed, row-level changefeeds into Apache Kafka for downstream processing such as reporting, caching, or full-text indexing. It has the following known limitations: + +{% include {{ page.version.version }}/known-limitations/cdc.md %} +{% include {{ page.version.version }}/known-limitations/cdc-queries.md %} + +#### `ALTER CHANGEFEED` limitations + +{% include {{ page.version.version }}/known-limitations/alter-changefeed-limitations.md %} + +### Performance optimization + +#### Optimizer and locking behavior + +The SQL optimizer has limitations under certain isolation levels: + +- The new implementation of `SELECT FOR UPDATE` is not yet the default setting under `SERIALIZABLE` isolation. It can be used under `SERIALIZABLE` isolation by setting the `optimizer_use_lock_op_for_serializable` [session setting]({% link {{ page.version.version }}/session-variables.md %}) to `true`. [#114737](https://github.com/cockroachdb/cockroach/issues/114737) +- `SELECT FOR UPDATE` does not lock completely-`NULL` column families in multi-column-family tables. [#116836](https://github.com/cockroachdb/cockroach/issues/116836) + +#### Automatic statistics refresher may not refresh after upgrade + +{% include {{page.version.version}}/known-limitations/stats-refresh-upgrade.md %} + +#### Incorrect query plans for partitions with `NULL` values + +In cases where the partition definition includes a comparison with `NULL` and a query constraint, incorrect query plans are returned. However, this case uses non-standard partitioning which defines partitions which could never hold values, so it is not likely to occur in production environments. [#82774](https://github.com/cockroachdb/cockroach/issues/82774) + +#### Vectorized engine limitations + +{% include {{ page.version.version }}/known-limitations/vectorized-engine-limitations.md %} + +#### `transaction_rows_read_err` and `transaction_rows_written_err` do not halt query execution + +The `transaction_rows_read_err` and `transaction_rows_written_err` [session settings]({% link {{ page.version.version }}/set-vars.md %}) limit the number of rows read or written by a single [transaction]({% link {{ page.version.version }}/transactions.md %}#limit-the-number-of-rows-written-or-read-in-a-transaction). These session settings will fail the transaction with an error, but not until the current query finishes executing and the results have been returned to the client. [#70473](https://github.com/cockroachdb/cockroach/issues/70473) + +#### `sql.guardrails.max_row_size_err` misses indexed virtual computed columns + +The `sql.guardrails.max_row_size_err` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) misses large rows caused by indexed virtual computed columns. This is because the guardrail only checks the size of primary key rows, not secondary index rows. [#69540](https://github.com/cockroachdb/cockroach/issues/69540) + +#### Using `LIKE...ESCAPE` in `WHERE` and `HAVING` constraints + +CockroachDB tries to optimize most comparisons operators in `WHERE` and `HAVING` clauses into constraints on SQL indexes by only accessing selected rows. This is done for `LIKE` clauses when a common prefix for all selected rows can be determined in the search pattern (e.g., `... LIKE 'Joe%'`). However, this optimization is not yet available if the `ESCAPE` keyword is also used. [#30192](https://github.com/cockroachdb/cockroach/issues/30192) + +#### Import with a high amount of disk contention + +{% include {{ page.version.version }}/known-limitations/import-high-disk-contention.md %} + +#### CockroachDB does not properly optimize some left and anti joins with GIN indexes [Left joins]({% link {{ page.version.version }}/joins.md %}#left-outer-joins) and anti joins involving [`JSONB`]({% link {{ page.version.version }}/jsonb.md %}), [`ARRAY`]({% link {{ page.version.version }}/array.md %}), or [spatial-typed]({% link {{ page.version.version }}/export-spatial-data.md %}) columns with a multi-column or [partitioned]({% link {{ page.version.version }}/alter-index.md %}#partition-by) [GIN index](inverted-indexes.html) will not take advantage of the index if the prefix columns of the index are unconstrained, or if they are constrained to multiple, constant values. @@ -333,372 +613,17 @@ UNION ALL SELECT * FROM t1 LEFT JOIN t2 ON st_contains(t1.geom, t2.geom) AND t2. (54 rows) ``` -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/59649) - -### Inverted join for `tsvector` and `tsquery` types is not supported - -CockroachDB cannot index-accelerate queries with `@@` predicates when both sides of the operator are variables. - -[Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/102731) - -### Using `RESTORE` with multi-region table localities - -- {% include {{ page.version.version }}/known-limitations/restore-tables-non-multi-reg.md %} - -- {% include {{ page.version.version }}/known-limitations/restore-multiregion-match.md %} - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/71071) - -### `SET` does not `ROLLBACK` in a transaction +[#59649](https://github.com/cockroachdb/cockroach/issues/59649) -{% include {{page.version.version}}/known-limitations/set-transaction-no-rollback.md %} - -### `JSONB`/`JSON` comparison operators are not implemented - -{% include {{page.version.version}}/sql/jsonb-comparison.md %} - -### Locality-optimized search works only for queries selecting a limited number of records - -{% include {{ page.version.version }}/sql/locality-optimized-search-limited-records.md %} - -### Expression indexes cannot reference computed columns - -{% include {{page.version.version}}/sql/expression-indexes-cannot-reference-computed-columns.md %} - -### Materialized view limitations - -{% include {{page.version.version}}/sql/materialized-views-no-stats.md %} - -{% include {{page.version.version}}/sql/cannot-refresh-materialized-views-inside-transactions.md %} - -### CockroachDB cannot plan locality optimized searches that use partitioned unique indexes on virtual computed columns - -{% include {{page.version.version}}/sql/locality-optimized-search-virtual-computed-columns.md %} - -### Expressions as `ON CONFLICT` targets are not supported - -{% include {{page.version.version}}/sql/expressions-as-on-conflict-targets.md %} - -### Automatic statistics refresher may not refresh after upgrade - -{% include {{page.version.version}}/known-limitations/stats-refresh-upgrade.md %} - -### Collection of statistics for virtual computed columns - -CockroachDB does not collect statistics for [virtual computed columns]({% link {{ page.version.version }}/computed-columns.md %}). This can prevent the [optimizer]({% link {{ page.version.version }}/cost-based-optimizer.md %}) from accurately calculating the cost of scanning an index on a virtual column, and, transitively, the cost of scanning an [expression index]({% link {{ page.version.version }}/expression-indexes.md %}). - -[Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/68254) - -### Differences in syntax and behavior between CockroachDB and PostgreSQL - -CockroachDB supports the [PostgreSQL wire protocol](https://www.postgresql.org/docs/current/protocol.html) and the majority of its syntax. However, CockroachDB does not support some of the PostgreSQL features or behaves differently from PostgreSQL because not all features can be easily implemented in a distributed system. - -For a list of known differences in syntax and behavior between CockroachDB and PostgreSQL, see [Features that differ from PostgreSQL]({% link {{ page.version.version }}/postgresql-compatibility.md %}#features-that-differ-from-postgresql). - -### Multiple arbiter indexes for `INSERT ON CONFLICT DO UPDATE` - -CockroachDB does not currently support multiple arbiter indexes for [`INSERT ON CONFLICT DO UPDATE`]({% link {{ page.version.version }}/insert.md %}#on-conflict-clause), and will return an error if there are multiple unique or exclusion constraints matching the `ON CONFLICT DO UPDATE` specification. - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/53170) - -### Spatial support limitations - -CockroachDB supports efficiently storing and querying [spatial data]({% link {{ page.version.version }}/export-spatial-data.md %}), with the following limitations: - -- Not all [PostGIS spatial functions](https://postgis.net/docs/reference.html) are supported. - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/49203) - -- The `AddGeometryColumn` [spatial function]({% link {{ page.version.version }}/functions-and-operators.md %}#spatial-functions) only allows constant arguments. - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/49402) - -- The `AddGeometryColumn` spatial function only allows the `true` value for its `use_typmod` parameter. - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/49448) - -- CockroachDB does not support the `@` operator. Instead of using `@` in spatial expressions, we recommend using the inverse, with `~`. For example, instead of `a @ b`, use `b ~ a`. - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/56124) - -- CockroachDB does not yet support [`INSERT`]({% link {{ page.version.version }}/insert.md %})s into the [`spatial_ref_sys` table]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial-system-tables). This limitation also blocks the [`ogr2ogr -f PostgreSQL` file conversion command](https://gdal.org/programs/ogr2ogr.html#cmdoption-ogr2ogr-f). - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/55903) - -- CockroachDB does not yet support [k-nearest neighbors](https://wikipedia.org/wiki/K-nearest_neighbors_algorithm). - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/55227) - -- CockroachDB does not support using [schema name prefixes]({% link {{ page.version.version }}/sql-name-resolution.md %}#how-name-resolution-works) to refer to [data types]({% link {{ page.version.version }}/data-types.md %}) with type modifiers (e.g., `public.geometry(linestring, 4326)`). Instead, use fully-unqualified names to refer to data types with type modifiers (e.g., `geometry(linestring,4326)`). - - Note that, in [`IMPORT PGDUMP`]({% link {{ page.version.version }}/migrate-from-postgres.md %}) output, [`GEOMETRY` and `GEOGRAPHY`]({% link {{ page.version.version }}/export-spatial-data.md %}) data type names are prefixed by `public.`. If the type has a type modifier, you must remove the `public.` from the type name in order for the statements to work in CockroachDB. - - [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/56492) - -### Limitations for composite types - -- {% include {{page.version.version}}/cdc/types-udt-composite-general.md %} The following limitations apply: - - {% include {{page.version.version}}/cdc/avro-udt-composite.md %} - - {% include {{page.version.version}}/cdc/csv-udt-composite.md %} - -- Updating subfields of composite types using dot syntax results in a syntax error. [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/102984) - -### Enterprise `BACKUP` does not capture database/table/column comments - -The [`COMMENT ON`]({% link {{ page.version.version }}/comment-on.md %}) statement associates comments to databases, tables, or columns. However, the internal table (`system.comments`) in which these comments are stored is not captured by a [`BACKUP`]({% link {{ page.version.version }}/backup.md %}) of a table or database. - -As a workaround, take a cluster backup instead, as the `system.comments` table is included in cluster backups. - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/44396) - -### DB Console may become inaccessible for secure clusters - -Accessing the DB Console for a secure cluster now requires login information (i.e., username and password). This login information is stored in a system table that is replicated like other data in the cluster. If a majority of the nodes with the replicas of the system table data go down, users will be locked out of the DB Console. - -### Using `LIKE...ESCAPE` in `WHERE` and `HAVING` constraints - -CockroachDB tries to optimize most comparisons operators in `WHERE` and `HAVING` clauses into constraints on SQL indexes by only accessing selected rows. This is done for `LIKE` clauses when a common prefix for all selected rows can be determined in the search pattern (e.g., `... LIKE 'Joe%'`). However, this optimization is not yet available if the `ESCAPE` keyword is also used. - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/30192) - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/35706) - -### Current sequence value not checked when updating min/max value +#### Locality optimized search limitations -Altering the minimum or maximum value of a series does not check the current value of a series. This means that it is possible to silently set the maximum to a value less than, or a minimum value greater than, the current value. +{% include {{page.version.version}}/known-limitations/locality-optimized-search-virtual-computed-columns.md %} +{% include {{ page.version.version }}/known-limitations/locality-optimized-search-limited-records.md %} -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/23719) +#### Query plans for materialized views -### Using `default_int_size` session variable in batch of statements +{% include {{page.version.version}}/known-limitations/materialized-views-no-stats.md %} -When setting the `default_int_size` [session variable]({% link {{ page.version.version }}/set-vars.md %}) in a batch of statements such as `SET default_int_size='int4'; SELECT 1::IN`, the `default_int_size` variable will not take affect until the next statement. This happens because statement parsing takes place asynchronously from statement execution. +#### Inverted join for `tsvector` and `tsquery` types is not supported -As a workaround, set `default_int_size` via your database driver, or ensure that `SET default_int_size` is in its own statement. - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/32846) - -### `COPY` syntax not supported by CockroachDB - -{% include {{ page.version.version }}/known-limitations/copy-syntax.md %} - -### Import with a high amount of disk contention - -{% include {{ page.version.version }}/known-limitations/import-high-disk-contention.md %} - -### Placeholders in `PARTITION BY` - -{% include {{ page.version.version }}/known-limitations/partitioning-with-placeholders.md %} - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/19464) - -### Dropping a single partition - -{% include {{ page.version.version }}/known-limitations/drop-single-partition.md %} - -### Adding a column with sequence-based `DEFAULT` values - -It is currently not possible to [add a column]({% link {{ page.version.version }}/alter-table.md %}#add-column) to a table when the column uses a [sequence]({% link {{ page.version.version }}/create-sequence.md %}) as the [`DEFAULT`]({% link {{ page.version.version }}/default-value.md %}) value, for example: - -{% include_cached copy-clipboard.html %} -~~~ sql -> CREATE TABLE t (x INT); -~~~ - -{% include_cached copy-clipboard.html %} -~~~ sql -> INSERT INTO t(x) VALUES (1), (2), (3); -~~~ - -{% include_cached copy-clipboard.html %} -~~~ sql -> CREATE SEQUENCE s; -~~~ - -{% include_cached copy-clipboard.html %} -~~~ sql -> ALTER TABLE t ADD COLUMN y INT DEFAULT nextval('s'); -~~~ - -~~~ -ERROR: nextval(): unimplemented: cannot evaluate scalar expressions containing sequence operations in this context -SQLSTATE: 0A000 -~~~ - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/42508) - -### Available capacity metric in the DB Console - -{% include {{ page.version.version }}/misc/available-capacity-metric.md %} - -### Schema changes within transactions - -{% include {{ page.version.version }}/known-limitations/schema-changes-within-transactions.md %} - -### Schema change DDL statements inside a multi-statement transaction can fail while other statements succeed - -{% include {{ page.version.version }}/known-limitations/schema-change-ddl-inside-multi-statement-transactions.md %} - -### Schema changes between executions of prepared statements - -{% include {{ page.version.version }}/known-limitations/schema-changes-between-prepared-statements.md %} - -### Declarative schema changer does not track rows in `system.privileges` - -The [declarative schema changer]({% link {{ page.version.version }}/online-schema-changes.md %}#declarative-schema-changer) does not track rows in the `system.privileges` table, which prevents the declarative schema changer from successfully running the [`DROP OWNED BY`]({% link {{ page.version.version }}/drop-owned-by.md %}) statement. - -[Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/88149) - -### Size limits on statement input from SQL clients - -CockroachDB imposes a hard limit of 16MiB on the data input for a single statement passed to CockroachDB from a client (including the SQL shell). We do not recommend attempting to execute statements from clients with large input. - -### Using `\|` to perform a large input in the SQL shell - -In the [built-in SQL shell]({% link {{ page.version.version }}/cockroach-sql.md %}), using the [`\|`]({% link {{ page.version.version }}/cockroach-sql.md %}#commands) operator to perform a large number of inputs from a file can cause the server to close the connection. This is because `\|` sends the entire file as a single query to the server, which can exceed the upper bound on the size of a packet the server can accept from any client (16MB). - -As a workaround, [execute the file from the command line]({% link {{ page.version.version }}/cockroach-sql.md %}#execute-sql-statements-from-a-file) with `cat data.sql | cockroach sql` instead of from within the interactive shell. - -### New values generated by `DEFAULT` expressions during `ALTER TABLE ADD COLUMN` - -When executing an [`ALTER TABLE ADD COLUMN`]({% link {{ page.version.version }}/alter-table.md %}#add-column) statement with a [`DEFAULT`]({% link {{ page.version.version }}/default-value.md %}) expression, new values generated: - -- use the default [search path]({% link {{ page.version.version }}/sql-name-resolution.md %}#search-path) regardless of the search path configured in the current session via `SET SEARCH_PATH`. -- use the UTC time zone regardless of the time zone configured in the current session via [`SET TIME ZONE`]({% link {{ page.version.version }}/set-vars.md %}). -- have no default database regardless of the default database configured in the current session via [`SET DATABASE`]({% link {{ page.version.version }}/set-vars.md %}), so you must specify the database of any tables they reference. -- use the transaction timestamp for the `statement_timestamp()` function regardless of the time at which the `ALTER` statement was issued. - -### Load-based lease rebalancing in uneven latency deployments - -When nodes are started with the [`--locality`]({% link {{ page.version.version }}/cockroach-start.md %}#flags) flag, CockroachDB attempts to place the replica lease holder (the replica that client requests are forwarded to) on the node closest to the source of the request. This means as client requests move geographically, so too does the replica lease holder. - -However, you might see increased latency caused by a consistently high rate of lease transfers between datacenters in the following case: - -- Your cluster runs in datacenters which are very different distances away from each other. -- Each node was started with a single tier of `--locality`, e.g., `--locality=datacenter=a`. -- Most client requests get sent to a single datacenter because that's where all your application traffic is. - -To detect if this is happening, open the [DB Console]({% link {{ page.version.version }}/ui-overview.md %}), select the **Queues** dashboard, hover over the **Replication Queue** graph, and check the **Leases Transferred / second** data point. If the value is consistently larger than 0, you should consider stopping and restarting each node with additional tiers of locality to improve request latency. - -For example, let's say that latency is 10ms from nodes in datacenter A to nodes in datacenter B but is 100ms from nodes in datacenter A to nodes in datacenter C. To ensure A's and B's relative proximity is factored into lease holder rebalancing, you could restart the nodes in datacenter A and B with a common region, `--locality=region=foo,datacenter=a` and `--locality=region=foo,datacenter=b`, while restarting nodes in datacenter C with a different region, `--locality=region=bar,datacenter=c`. - -### Overload resolution for collated strings - -Many string operations are not properly overloaded for [collated strings]({% link {{ page.version.version }}/collate.md %}), for example: - -{% include_cached copy-clipboard.html %} -~~~ sql -> SELECT 'string1' || 'string2'; -~~~ - -~~~ - ?column? ------------------- - string1string2 -(1 row) -~~~ - -{% include_cached copy-clipboard.html %} -~~~ sql -> SELECT ('string1' collate en) || ('string2' collate en); -~~~ - -~~~ -pq: unsupported binary operator: || -~~~ - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/10679) - -### Max size of a single column family - -When creating or updating a row, if the combined size of all values in a single [column family]({% link {{ page.version.version }}/column-families.md %}) exceeds the [max range size]({% link {{ page.version.version }}/configure-replication-zones.md %}#range-max-bytes) for the table, the operation may fail, or cluster performance may suffer. - -As a workaround, you can either [manually split a table's columns into multiple column families]({% link {{ page.version.version }}/column-families.md %}#manual-override), or you can [create a table-specific zone configuration]({% link {{ page.version.version }}/configure-replication-zones.md %}#create-a-replication-zone-for-a-table) with an increased max range size. - -### Simultaneous client connections and running queries on a single node - -When a node has both a high number of client connections and running queries, the node may crash due to memory exhaustion. This is due to CockroachDB not accurately limiting the number of clients and queries based on the amount of available RAM on the node. - -To prevent memory exhaustion, monitor each node's memory usage and ensure there is some margin between maximum CockroachDB memory usage and available system RAM. For more details about memory usage in CockroachDB, see [this blog post](https://www.cockroachlabs.com/blog/memory-usage-cockroachdb/). - -{% include {{page.version.version}}/sql/server-side-connection-limit.md %} This may be useful in addition to your memory monitoring. - -### Privileges for `DELETE` and `UPDATE` - -Every [`DELETE`]({% link {{ page.version.version }}/delete.md %}) or [`UPDATE`]({% link {{ page.version.version }}/update.md %}) statement constructs a `SELECT` statement, even when no `WHERE` clause is involved. As a result, the user executing `DELETE` or `UPDATE` requires both the `DELETE` and `SELECT` or `UPDATE` and `SELECT` [privileges]({% link {{ page.version.version }}/security-reference/authorization.md %}#managing-privileges) on the table. - -### `ROLLBACK TO SAVEPOINT` in high-priority transactions containing DDL - -Transactions with [priority `HIGH`]({% link {{ page.version.version }}/transactions.md %}#transaction-priorities) that contain DDL and `ROLLBACK TO SAVEPOINT` are not supported, as they could result in a deadlock. For example: - -~~~ sql -> BEGIN PRIORITY HIGH; SAVEPOINT s; CREATE TABLE t(x INT); ROLLBACK TO SAVEPOINT s; -~~~ - -~~~ -ERROR: unimplemented: cannot use ROLLBACK TO SAVEPOINT in a HIGH PRIORITY transaction containing DDL -SQLSTATE: 0A000 -HINT: You have attempted to use a feature that is not yet implemented. -See: https://github.com/cockroachdb/cockroach/issues/46414 -~~~ - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/46414) - -### CockroachDB does not test for all connection failure scenarios - -CockroachDB servers rely on the network to report when a TCP connection fails. In most scenarios when a connection fails, the network immediately reports a connection failure, resulting in a `Connection refused` error. - -However, if there is no host at the target IP address, or if a firewall rule blocks traffic to the target address and port, a TCP handshake can linger while the client network stack waits for a TCP packet in response to network requests. To work around this kind of scenario, we recommend the following: - -- When migrating a node to a new machine, keep the server listening at the previous IP address until the cluster has completed the migration. -- Configure any active network firewalls to allow node-to-node traffic. -- Verify that orchestration tools (e.g., Kubernetes) are configured to use the correct network connection information. - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/53410) - -### Some column-dropping schema changes do not roll back properly - -Some [schema changes]({% link {{ page.version.version }}/online-schema-changes.md %}) that [drop columns]({% link {{ page.version.version }}/alter-table.md %}#drop-column) cannot be [rolled back]({% link {{ page.version.version }}/rollback-transaction.md %}) properly. - -In some cases, the rollback will succeed, but the column data might be partially or totally missing, or stale due to the asynchronous nature of the schema change. - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/46541) - -In other cases, the rollback will fail in such a way that will never be cleaned up properly, leaving the table descriptor in a state where no other schema changes can be run successfully. - -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/47712) - -To reduce the chance that a column drop will roll back incorrectly: - -- Perform column drops in transactions separate from other schema changes. This ensures that other schema change failures will not cause the column drop to be rolled back. - -- Drop all [constraints]({% link {{ page.version.version }}/constraints.md %}) (including [unique indexes]({% link {{ page.version.version }}/unique.md %})) on the column in a separate transaction, before dropping the column. - -- Drop any [default values]({% link {{ page.version.version }}/default-value.md %}) or [computed expressions]({% link {{ page.version.version }}/computed-columns.md %}) on a column before attempting to drop the column. This prevents conflicts between constraints and default/computed values during a column drop rollback. - -If you think a rollback of a column-dropping schema change has occurred, check the [jobs table]({% link {{ page.version.version }}/show-jobs.md %}). Schema changes with an error prefaced by `cannot be reverted, manual cleanup may be required` might require manual intervention. - -### No guaranteed state switch from `DECOMMISSIONING` to `DECOMMISSIONED` if `node decommission` is interrupted - -There is no guaranteed state switch from `DECOMMISSIONING` to `DECOMMISSIONED` if [`node decommission`]({% link {{ page.version.version }}/cockroach-node.md %}) is interrupted in one of the following ways: - -- The `cockroach node decommission --wait-all` command was run and then interrupted -- The `cockroach node decommission --wait=none` command was run - -This is because the state flip is effected by the CLI program at the end. Only the CLI (or its underlying API call) is able to finalize the "decommissioned" state. If the command is interrupted, or `--wait=none` is used, the state will only flip to "decommissioned" when the CLI program is run again after decommissioning has done all its work. - -[Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/94430) - -### Remove a `UNIQUE` index created as part of `CREATE TABLE` - -{% include {{ page.version.version }}/known-limitations/drop-unique-index-from-create-table.md %} - -### Row-Level TTL limitations - -{% include {{page.version.version}}/known-limitations/row-level-ttl-limitations.md %} - -### Change data capture limitations - -Change data capture (CDC) provides efficient, distributed, row-level changefeeds into Apache Kafka for downstream processing such as reporting, caching, or full-text indexing. It has the following known limitations: - -{% include {{ page.version.version }}/known-limitations/cdc.md %} -{% include {{ page.version.version }}/known-limitations/cdc-queries.md %} +CockroachDB cannot index-accelerate queries with `@@` predicates when both sides of the operator are variables. [#102731](https://github.com/cockroachdb/cockroach/issues/102731) \ No newline at end of file diff --git a/src/current/v24.1/partial-indexes.md b/src/current/v24.1/partial-indexes.md index ba2b096d089..30b7c466310 100644 --- a/src/current/v24.1/partial-indexes.md +++ b/src/current/v24.1/partial-indexes.md @@ -86,12 +86,6 @@ When [inserted values]({% link {{ page.version.version }}/insert.md %}) conflict You can force queries [to use a specific partial index]({% link {{ page.version.version }}/table-expressions.md %}#force-index-selection) (also known as "index hinting"), like you can with full indexes. However, unlike full indexes, partial indexes cannot be used to satisfy all queries. If a query's filter implies the partial index predicate expression, the partial index will be used in the query plan. If not, an error will be returned. -## Known limitations - -- CockroachDB does not currently support [`IMPORT`]({% link {{ page.version.version }}/import.md %}) statements on tables with partial indexes. See [tracking issue](https://github.com/cockroachdb/cockroach/issues/50225). -- CockroachDB does not currently support multiple arbiter indexes for `INSERT ON CONFLICT DO UPDATE`, and will return an error if there are multiple unique or exclusion constraints matching the `ON CONFLICT DO UPDATE` specification. See [tracking issue](https://github.com/cockroachdb/cockroach/issues/53170). -- CockroachDB prevents a column from being dropped using [`ALTER TABLE ... DROP COLUMN`]({% link {{ page.version.version }}/alter-table.md %}#drop-column) if it is referenced by a partial index predicate. To drop such a column, the partial indexes need to be dropped first using [`DROP INDEX`]({% link {{ page.version.version }}/drop-index.md %}). See [tracking issue](https://github.com/cockroachdb/cockroach/issues/97813). - ## Examples ### Setup @@ -459,6 +453,11 @@ Because the unique partial index predicate only implies the rows where `city='ne INSERT 1 ~~~ +## Known limitations + +- {% include {{ page.version.version }}/known-limitations/drop-column-partial-index.md %} +- {% include {{ page.version.version }}/known-limitations/multiple-arbiter-indexes.md %} + ## See also - [Indexes]({% link {{ page.version.version }}/indexes.md %}) diff --git a/src/current/v24.1/plpgsql.md b/src/current/v24.1/plpgsql.md index b99bc8c7872..82b1b176f0d 100644 --- a/src/current/v24.1/plpgsql.md +++ b/src/current/v24.1/plpgsql.md @@ -423,21 +423,8 @@ BEGIN ## Known limitations -- PL/pgSQL blocks cannot be nested. -- Cursors used in PL/pgSQL execute their queries on opening. This can affect performance and resource usage. -- Cursors cannot be declared with parameters. -- `RECORD` and `ROW`-type variables cannot be declared in PL/pgSQL. -- `NOT NULL` variables cannot be declared in PL/pgSQL. -- PL/pgSQL arguments cannot be referenced with ordinals (e.g., `$1`, `$2`). -- PL/pgSQL `EXCEPTION` blocks cannot catch [transaction retry errors]({% link {{ page.version.version }}/transaction-retry-error-reference.md %}). -- `FOR` loops (including `FOR` cursor loops and `FOR` query loops) and `FOREACH` loops are not supported. -- `RETURN NEXT` and `RETURN QUERY` statements are not supported. -- `CASE` statements are not supported. -- `EXIT` and `CONTINUE` labels and conditions are not supported. -- Variable shadowing (e.g., declaring a variable with the same name in an inner block) is not supported in PL/pgSQL. -- When using the `RAISE` statement, schema objects related to the error cannot be named using `COLUMN`, `CONSTRAINT`, `DATATYPE`, `TABLE`, and `SCHEMA`. -- The `INTO` statement in PL/pgSQL does not support the `STRICT` option. -- `PERFORM`, `EXECUTE`, `GET DIAGNOSTICS`, and `NULL` statements are not supported for PL/pgSQL. +{% include {{ page.version.version }}/known-limitations/plpgsql-feature-limitations.md %} +{% include {{ page.version.version }}/known-limitations/plpgsql-datatype-limitations.md %} ## See also diff --git a/src/current/v24.1/postgresql-compatibility.md b/src/current/v24.1/postgresql-compatibility.md index 319e81338f0..15eff6fdc35 100644 --- a/src/current/v24.1/postgresql-compatibility.md +++ b/src/current/v24.1/postgresql-compatibility.md @@ -181,7 +181,7 @@ An `x` value less than `1` would result in the following error: pq: check constraint violated ~~~ -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/35370) +[#35370](https://github.com/cockroachdb/cockroach/issues/35370) ### Column name from an outer column inside a subquery @@ -207,7 +207,7 @@ PostgreSQL: 1 ~~~ -[Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/46563) +[#46563](https://github.com/cockroachdb/cockroach/issues/46563) ### SQL Compatibility diff --git a/src/current/v24.1/read-committed.md b/src/current/v24.1/read-committed.md index f34d1facbd2..c7ef15c200b 100644 --- a/src/current/v24.1/read-committed.md +++ b/src/current/v24.1/read-committed.md @@ -920,18 +920,7 @@ SELECT * FROM schedules ## Known limitations -The following are not yet supported with `READ COMMITTED`: - -- Schema changes (e.g., [`CREATE TABLE`]({% link {{ page.version.version }}/create-table.md %}), [`CREATE SCHEMA`]({% link {{ page.version.version }}/create-schema.md %}), [`CREATE INDEX`]({% link {{ page.version.version }}/create-index.md %})) cannot be performed within explicit `READ COMMITTED` transactions, and will cause transactions to abort. As a workaround, [set the transaction's isolation level](#set-the-current-transaction-to-read-committed) to `SERIALIZABLE`. -- `READ COMMITTED` transactions performing `INSERT`, `UPDATE`, or `UPSERT` cannot access [`REGIONAL BY ROW`]({% link {{ page.version.version }}/table-localities.md %}#regional-by-row-tables) tables in which [`UNIQUE`]({% link {{ page.version.version }}/unique.md %}) and [`PRIMARY KEY`]({% link {{ page.version.version }}/primary-key.md %}) constraints exist, the region is not included in the constraint, and the region cannot be computed from the constraint columns. -- [Shared locks](#locking-reads) cannot yet be promoted to exclusive locks. -- [`SKIP LOCKED`]({% link {{ page.version.version }}/select-for-update.md %}#wait-policies) requests do not check for [replicated locks]({% link {{ page.version.version }}/architecture/transaction-layer.md %}#unreplicated-locks), which can be acquired by `READ COMMITTED` transactions. - -The following affect the performance of `READ COMMITTED` transactions: - -- Because locks acquired by [foreign key]({% link {{ page.version.version }}/foreign-key.md %}) checks, [`SELECT FOR UPDATE`]({% link {{ page.version.version }}/select-for-update.md %}), and [`SELECT FOR SHARE`]({% link {{ page.version.version }}/select-for-update.md %}) are fully replicated under `READ COMMITTED` isolation, some queries experience a delay for Raft replication. -- [Foreign key]({% link {{ page.version.version }}/foreign-key.md %}) checks are not performed in parallel under `READ COMMITTED` isolation. -- [`SELECT FOR UPDATE` and `SELECT FOR SHARE`]({% link {{ page.version.version }}/select-for-update.md %}) statements are less optimized under `READ COMMITTED` isolation than under `SERIALIZABLE` isolation. Under `READ COMMITTED` isolation, `SELECT FOR UPDATE` and `SELECT FOR SHARE` usually perform an extra lookup join for every locked table when compared to the same queries under `SERIALIZABLE`. In addition, some optimization steps (such as de-correlation of correlated [subqueries]({% link {{ page.version.version }}/subqueries.md %})) are not currently performed on these queries. +{% include {{ page.version.version }}/known-limitations/read-committed-limitations.md %} ## See also diff --git a/src/current/v24.1/restore.md b/src/current/v24.1/restore.md index a1725bdae19..36d4295b84f 100644 --- a/src/current/v24.1/restore.md +++ b/src/current/v24.1/restore.md @@ -578,8 +578,8 @@ For more detail on using this option with `BACKUP`, see [Incremental backups wit ## Known limitations -- To successfully [restore a table into a multi-region database](#restoring-to-multi-region-databases), it is necessary for the order and regions to match between the source and destination database. See the [Known Limitations]({% link {{ page.version.version }}/known-limitations.md %}#using-restore-with-multi-region-table-localities) page for detail on ordering and matching regions. [Tracking GitHub Issue](https://github.com/cockroachdb/cockroach/issues/71071) - {% include {{ page.version.version }}/known-limitations/restore-tables-non-multi-reg.md %} +- {% include {{ page.version.version }}/known-limitations/restore-multiregion-match.md %} - {% include {{ page.version.version }}/known-limitations/restore-udf.md %} ## See also diff --git a/src/current/v24.1/select-for-update.md b/src/current/v24.1/select-for-update.md index c3f84436d28..61e2ff8e2ab 100644 --- a/src/current/v24.1/select-for-update.md +++ b/src/current/v24.1/select-for-update.md @@ -63,7 +63,7 @@ Shared locks are not enabled by default for `SERIALIZABLE` transactions. To enab #### Lock behavior under `SERIALIZABLE` isolation -{% include {{page.version.version}}/sql/select-for-update-limitations.md %} +{% include {{page.version.version}}/known-limitations/select-for-update-limitations.md %} ### Wait policies diff --git a/src/current/v24.1/srid-4326.md b/src/current/v24.1/srid-4326.md index 99d11d4c5cb..3e343a87c53 100644 --- a/src/current/v24.1/srid-4326.md +++ b/src/current/v24.1/srid-4326.md @@ -113,9 +113,7 @@ ERROR: st_contains(): operation on mixed SRIDs forbidden: (Point, 0) != (Point, ## Known limitations -{{site.data.alerts.callout_info}} -Defining a custom SRID by inserting rows into [`spatial_ref_sys`]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial_ref_sys) is not currently supported. For more information, see the tracking issue [cockroachdb/cockroach#55903](https://github.com/cockroachdb/cockroach/issues/55903). -{{site.data.alerts.end}} +{% include {{ page.version.version }}/known-limitations/srid-4326-limitations.md %} ## See also diff --git a/src/current/v24.1/stored-procedures.md b/src/current/v24.1/stored-procedures.md index 280d8fc9861..1e71464da3e 100644 --- a/src/current/v24.1/stored-procedures.md +++ b/src/current/v24.1/stored-procedures.md @@ -49,10 +49,9 @@ ALTER PROCEDURE delete_earliest_histories RENAME TO delete_histories; ## Known limitations -- Stored procedures cannot call other stored procedures or [user-defined functions]({% link {{ page.version.version }}/user-defined-functions.md %}). -- Stored procedures do not support `OUT` and `INOUT` argument modes. -- [DDL statements]({% link {{ page.version.version }}/sql-statements.md %}#data-definition-statements) (e.g., `CREATE TABLE`, `CREATE INDEX`) cannot be used within a stored procedure body. -- [Transactions]({% link {{ page.version.version }}/transactions.md %}) cannot be run within stored procedures. +Stored procedures have the following limitations: + +{% include {{ page.version.version }}/known-limitations/udf-stored-proc-limitations.md %} Also refer to the [PL/pgSQL known limitations]({% link {{ page.version.version }}/plpgsql.md %}#known-limitations). diff --git a/src/current/v24.1/trigram-indexes.md b/src/current/v24.1/trigram-indexes.md index 3464b89560c..9ef98a40819 100644 --- a/src/current/v24.1/trigram-indexes.md +++ b/src/current/v24.1/trigram-indexes.md @@ -345,9 +345,9 @@ CREATE INDEX ON t USING GIN ((json_col->>'json_text_field')) ## Unsupported features -The following PostgreSQL syntax and features are currently unsupported. For details, see the [tracking issue](https://github.com/cockroachdb/cockroach/issues/41285). +The following PostgreSQL syntax and features are currently unsupported. -{% include {{ page.version.version }}/sql/trigram-unsupported-syntax.md %} +{% include {{ page.version.version }}/known-limitations/trigram-unsupported-syntax.md %} ## See also diff --git a/src/current/v24.1/user-defined-functions.md b/src/current/v24.1/user-defined-functions.md index 3504b849b82..b426f28e65e 100644 --- a/src/current/v24.1/user-defined-functions.md +++ b/src/current/v24.1/user-defined-functions.md @@ -292,49 +292,11 @@ For a deep-dive demo on UDFs, watch the following video: ## Known limitations -### Limitations on use of UDFs +User-defined functions have the following limitations: -User-defined functions are not currently supported in: +{% include {{ page.version.version }}/known-limitations/udf-stored-proc-limitations.md %} -- Expressions (column, index, constraint) in tables. - - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/87699) - -- Views. - - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/87699) - -- Other user-defined functions. - - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/93049) - -### Limitations on UDF creation - -The following cannot be used in UDF definitions: - -- `OUT` and `INOUT` argument modes. - - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/100405) - -- `RECORD` input arguments. - - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/105713) - -### Limitations on expressions allowed within UDFs - -The following are not currently allowed within the body of a UDF: - -- CTEs (common table expressions). - - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/92961) - -- References to other user-defined functions. - - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/93049) - -- [DDL statements]({% link {{ page.version.version }}/sql-statements.md %}#data-definition-statements) (e.g., `CREATE TABLE`, `CREATE INDEX`). - - [Tracking GitHub issue](https://github.com/cockroachdb/cockroach/issues/110080) +Also refer to the [PL/pgSQL known limitations]({% link {{ page.version.version }}/plpgsql.md %}#known-limitations). ## See also diff --git a/src/current/v24.1/vectorized-execution.md b/src/current/v24.1/vectorized-execution.md index f8ab08de50b..d9dee407d07 100644 --- a/src/current/v24.1/vectorized-execution.md +++ b/src/current/v24.1/vectorized-execution.md @@ -65,15 +65,7 @@ You can also configure a node's total budget for in-memory query processing with ## Known limitations -### Unsupported queries - -The vectorized engine does not support queries containing: - -- A join filtered with an [`ON` expression]({% link {{ page.version.version }}/joins.md %}#supported-join-conditions). See [tracking issue](https://github.com/cockroachdb/cockroach/issues/38018). - -### Spatial features - -The vectorized engine does not support [working with spatial data]({% link {{ page.version.version }}/export-spatial-data.md %}). Queries with [geospatial functions]({% link {{ page.version.version }}/functions-and-operators.md %}#spatial-functions) or [spatial data]({% link {{ page.version.version }}/export-spatial-data.md %}) will revert to the row-oriented execution engine. +{% include {{ page.version.version }}/known-limitations/vectorized-engine-limitations.md %} ## See also diff --git a/src/current/v24.1/views.md b/src/current/v24.1/views.md index 89357fb6d52..1b703728bcf 100644 --- a/src/current/v24.1/views.md +++ b/src/current/v24.1/views.md @@ -625,9 +625,9 @@ To speed up queries on materialized views, you can add an [index]({% link {{ pag ### Known limitations -{% include {{page.version.version}}/sql/materialized-views-no-stats.md %} +{% include {{page.version.version}}/known-limitations/materialized-views-no-stats.md %} -{% include {{page.version.version}}/sql/cannot-refresh-materialized-views-inside-transactions.md %} +{% include {{page.version.version}}/known-limitations/cannot-refresh-materialized-views-inside-transactions.md %} ## Temporary views From c9fea8f5502c06a49794dd480aefd4932e0f9db1 Mon Sep 17 00:00:00 2001 From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com> Date: Wed, 17 Apr 2024 13:43:25 -0400 Subject: [PATCH 05/34] v24.1.0-beta.1 release notes (#18478) --- src/current/_data/releases.yml | 27 +++++++++ .../releases/v24.1/v24.1.0-beta.1.md | 56 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/current/_includes/releases/v24.1/v24.1.0-beta.1.md diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index aa1c5e453e6..c0bfcb1cd76 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5816,3 +5816,30 @@ docker_arm_limited_access: false source: true previous_release: v23.2.3 + +- release_name: v24.1.0-beta.1 + major_version: v24.1 + release_date: '2024-04-17' + release_type: Testing + go_version: go1.22.0 + sha: 0f6788a58b110053e2f30e5ee3ee249ea3821005 + has_sql_only: true + has_sha256sum: true + mac: + mac_arm: true + mac_arm_experimental: true + mac_arm_limited_access: true + windows: true + linux: + linux_arm: true + linux_arm_experimental: false + linux_arm_limited_access: false + linux_intel_fips: true + linux_arm_fips: false + docker: + docker_image: cockroachdb/cockroach-unstable + docker_arm: true + docker_arm_experimental: false + docker_arm_limited_access: false + source: true + previous_release: v24.1.0-alpha.5 diff --git a/src/current/_includes/releases/v24.1/v24.1.0-beta.1.md b/src/current/_includes/releases/v24.1/v24.1.0-beta.1.md new file mode 100644 index 00000000000..5b59305b6c2 --- /dev/null +++ b/src/current/_includes/releases/v24.1/v24.1.0-beta.1.md @@ -0,0 +1,56 @@ +## v24.1.0-beta.1 + +Release Date: April 17, 2024 + +{% include releases/release-downloads-docker-image.md release=include.release %} + +

SQL language changes

+ +- [`SHOW JOBS`]({% link v24.1/show-jobs.md %}) no longer displays some internal retry counter columns (`last_run`, `next_run`, `num_runs`) and now only shows the `statement`, `trace_id`, and `execution_errors` columns when inspecting a specific job ID or IDs. [#121286][#121286] +- [`SHOW JOBS`]({% link v24.1/show-jobs.md %}) now shortens long job descriptions to 100 characters to make the table easier to read while the full description and statement can be inspected using `SHOW JOB` or `SHOW JOBS` on specific job IDs. [#121286][#121286] +- Extended [`pg_depend`]({% link v24.1/pg-catalog.md %}) to include dependencies between UDFs. [#121313][#121313] +- With [`sql_safe_updates`]({% link v24.1/session-variables.md %}) set to `true`, [`SELECT FOR UPDATE` and `SELECT FOR SHARE`]({% link v24.1/select-for-update.md %}) statements now return an error if they do not contain either a `WHERE` clause or a `LIMIT` clause. Also, `UPDATE` and `DELETE` statements without `WHERE` clauses but with `LIMIT` clauses now bypass `sql_safe_updates`, which better matches MySQL behavior. [#121466][#121466] +- Added support for [PL/pgSQL]({% link v24.1/plpgsql.md %}) `CALL` statements. It is now possible to call a stored procedure from a PL/pgSQL routine. [#121743][#121743] +- `DEFAULT` expressions for input parameters of [user-defined functions]({% link v24.1/user-defined-functions.md %}) and stored procedures are now supported. [#121811][#121811] + +

Command-line changes

+ +- The [`--enterprise-encryption`]({% link v24.1/encryption.md %}#starting-a-node-with-encryption) flag now accepts the special value `path=*` to apply the specified keys to all stores. [#121111][#121111] + +

DB Console changes

+ +- The **Commit Latency** chart in the [**Changefeeds** dashboard]({% link v24.1/ui-cdc-dashboard.md %}) now aggregates by max instead of by sum for multi-node [changefeeds]({% link v24.1/change-data-capture-overview.md %}). This more accurately reflects the amount of time for events to be acknowledged by the downstream sink. [#120787][#120787] +- Introduced a license expiration message in the [DB Console]({% link v24.1/ui-overview.md %}) in the top-right corner of the primary header. This message indicates the remaining days before license expiration for clusters with an {{ site.data.products.enterprise }} or trial license. [#120830][#120830] +- The [**Jobs** table]({% link v24.1/ui-jobs-page.md %}#jobs-table) page no longer includes two columns related to a deprecated internal implementation detail (last execution time and execution count). [#121286][#121286] +- The timeseries graphs shown on the [**SQL Activity**]({% link v24.1/ui-overview.md %}#sql-activity) statement details page in the DB Console will now render properly, after fixing a bug related to setting the time range of the charts. [#121461][#121461] +- [Index recommendations]({% link v24.1/ui-databases-page.md %}#index-recommendations) in the DB Console will now function properly for indexes on tables or columns whose names contain quotation marks or whitespace. For example: `CREATE INDEX ON "my table" ("my col");`. [#122120][#122120] + +

Bug fixes

+ +- Sequence options for `NO MINVALUE` and `NO MAXVALUE` now match PostgreSQL behavior. Sequence `MINVALUE` and `MAXVALUE` automatically adjust to new types bounds mirroring behavior of PostgreSQL. [#121310][#121310] +- CockroachDB could previously "leak" reported memory usage as accounted by the internal memory accounting system, the limit for which is configured with the `--max-sql-memory` flag, on long-running sessions that issue many (hundreds of thousands or more) transactions. This, in turn, could result in `"root: memory budget exceeded"` errors for other queries. This bug was present in versions v23.1.17 and v23.2.3 and is now fixed. [#121873][#121873] +- CockroachDB could previously incorrectly evaluate `IN` expressions that had `INT2` or `INT4` type on the left side and values outside of the range of the left side on the right side. The bug has been present since at least v21.1 and is now fixed. [#121954][#121954] +- Fixed a slow memory leak in the deprecated [Pub/Sub changefeeds]({% link v24.1/changefeed-sinks.md %}), which can accumulate when restarting or canceling many deprecated Pub/Sub changefeeds. The bug had been present since the deprecated Pub/Sub changefeed was introduced in a testing release of v22.1. [#121867][#121867] + +
+ +

Contributors

+ +This release includes 134 merged PRs by 36 authors. + +
+ +[#120787]: https://github.com/cockroachdb/cockroach/pull/120787 +[#120830]: https://github.com/cockroachdb/cockroach/pull/120830 +[#121111]: https://github.com/cockroachdb/cockroach/pull/121111 +[#121286]: https://github.com/cockroachdb/cockroach/pull/121286 +[#121310]: https://github.com/cockroachdb/cockroach/pull/121310 +[#121313]: https://github.com/cockroachdb/cockroach/pull/121313 +[#121461]: https://github.com/cockroachdb/cockroach/pull/121461 +[#121466]: https://github.com/cockroachdb/cockroach/pull/121466 +[#121743]: https://github.com/cockroachdb/cockroach/pull/121743 +[#121811]: https://github.com/cockroachdb/cockroach/pull/121811 +[#121867]: https://github.com/cockroachdb/cockroach/pull/121867 +[#121873]: https://github.com/cockroachdb/cockroach/pull/121873 +[#121954]: https://github.com/cockroachdb/cockroach/pull/121954 +[#122120]: https://github.com/cockroachdb/cockroach/pull/122120 From bd3f991a3763db78c3e614f25f59f6dfdc159df2 Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Wed, 17 Apr 2024 11:56:49 -0700 Subject: [PATCH 06/34] [DOC-10001] Add upgrade content for 24.1 pre-production previews (#18427) * [DOC-10001] Add upgrade content for 24.1 pre-production previews --- src/current/_data/cloud_releases.csv | 1 + .../_includes/releases/cloud/2024-04-17.md | 5 + .../v23.2/sidebar-data/cloud-deployments.json | 6 + .../v24.1/sidebar-data/cloud-deployments.json | 6 + .../cockroachcloud/upgrade-to-v23.2.md | 6 +- .../cockroachcloud/upgrade-to-v24.1.md | 170 ++++++++++++++++++ 6 files changed, 190 insertions(+), 4 deletions(-) create mode 100644 src/current/_includes/releases/cloud/2024-04-17.md create mode 100644 src/current/cockroachcloud/upgrade-to-v24.1.md diff --git a/src/current/_data/cloud_releases.csv b/src/current/_data/cloud_releases.csv index 8efbb9039a5..c70b232e03b 100644 --- a/src/current/_data/cloud_releases.csv +++ b/src/current/_data/cloud_releases.csv @@ -82,3 +82,4 @@ date,sha 2024-03-19,null 2024-03-20,null 2024-04-09,null +2024-04-17,null diff --git a/src/current/_includes/releases/cloud/2024-04-17.md b/src/current/_includes/releases/cloud/2024-04-17.md new file mode 100644 index 00000000000..bb356824449 --- /dev/null +++ b/src/current/_includes/releases/cloud/2024-04-17.md @@ -0,0 +1,5 @@ +## April 17, 2024 + +

General updates

+ +- [CockroachDB v24.1.0-beta.1](https://www.cockroachlabs.com/docs/releases/v24.1#v24-1-0-beta-1) is available to CockroachDB {{ site.data.products.dedicated }} clusters as a Pre-Production Preview release for testing and experimentation. An [Org Administrator]({% link cockroachcloud/authorization.md %}#org-administrator) can upgrade your CockroachDB {{ site.data.products.dedicated }} cluster from the CockroachDB {{ site.data.products.cloud }} Console. To learn more, refer to [Upgrade to v24.1 Pre-Production Preview]({% link cockroachcloud/upgrade-to-v24.1.md %}) and the [CockroachDB {{ site.data.products.cloud }} Upgrade Policy]({% link cockroachcloud/upgrade-policy.md %}). diff --git a/src/current/_includes/v23.2/sidebar-data/cloud-deployments.json b/src/current/_includes/v23.2/sidebar-data/cloud-deployments.json index 3004807679d..e91fec82150 100644 --- a/src/current/_includes/v23.2/sidebar-data/cloud-deployments.json +++ b/src/current/_includes/v23.2/sidebar-data/cloud-deployments.json @@ -437,6 +437,12 @@ "/cockroachcloud/upgrade-policy.html" ] }, + { + "title": "Upgrade to v24.1", + "urls": [ + "/cockroachcloud/upgrade-to-v24.1.html" + ] + }, { "title": "Upgrade to v23.2", "urls": [ diff --git a/src/current/_includes/v24.1/sidebar-data/cloud-deployments.json b/src/current/_includes/v24.1/sidebar-data/cloud-deployments.json index 3004807679d..e91fec82150 100644 --- a/src/current/_includes/v24.1/sidebar-data/cloud-deployments.json +++ b/src/current/_includes/v24.1/sidebar-data/cloud-deployments.json @@ -437,6 +437,12 @@ "/cockroachcloud/upgrade-policy.html" ] }, + { + "title": "Upgrade to v24.1", + "urls": [ + "/cockroachcloud/upgrade-to-v24.1.html" + ] + }, { "title": "Upgrade to v23.2", "urls": [ diff --git a/src/current/cockroachcloud/upgrade-to-v23.2.md b/src/current/cockroachcloud/upgrade-to-v23.2.md index 154ea05e795..84828cc4f56 100644 --- a/src/current/cockroachcloud/upgrade-to-v23.2.md +++ b/src/current/cockroachcloud/upgrade-to-v23.2.md @@ -71,8 +71,6 @@ Before starting the upgrade, complete the following steps. Your cluster will be unavailable while its single node is stopped and restarted with {{ page.page_version }}. Prepare your application for this brief downtime, typically a few minutes. -Your cluster will be unavailable while its single node is stopped and restarted with v23.1. Prepare your application for this brief downtime, typically a few minutes. - The [**SQL Users**]({% link cockroachcloud/managing-access.md %}#create-a-sql-user) and [**Tools**]({% link cockroachcloud/tools-page.md %}) tabs in the CockroachDB {{ site.data.products.cloud }} Console will also be disabled during this time. @@ -90,7 +88,7 @@ Review the backward-incompatible changes and deprecated features announced in th ### Reset SQL statistics -Before upgrading to CockroachDB {{ page.page_version }}, it is recommended to reset the cluster's SQL statistics. Otherwise, it may take longer for the upgrade to complete on a cluster with large statement or transaction statistics tables. This is due to the addition of a new column and a new index to these tables. To reset SQL statistics, issue the following SQL command: +Before upgrading to CockroachDB {{ page.page_version }}, it is recommended to reset the cluster's [SQL statistics]({% link {{ page.page_version }}/cost-based-optimizer.md %}#table-statistics). Otherwise, it may take longer for the upgrade to complete on a cluster with large statement or transaction statistics tables. This is due to the addition of a new column and a new index to these tables. To reset SQL statistics, issue the following SQL command: {% include_cached copy-clipboard.html %} ~~~ sql @@ -117,7 +115,7 @@ Your cluster will be upgraded one node at a time without interrupting the cluste Your single-node cluster will be unavailable for a few minutes while the node is stopped and restarted with CockroachDB {{ page.page_version }}. -After it is started, an upgrade cannot be cancelled. Instead, you can wait for the upgrade to finish, then [roll it back back](#roll-back-the-upgrade) for up to 72 hours, after which time it will be finalized and cannot be rolled back. +After it is started, an upgrade cannot be cancelled. Instead, you can wait for the upgrade to finish, then [roll it back](#roll-back-the-upgrade) for up to 72 hours, after which time it will be finalized and cannot be rolled back. ## Step 6. Monitor the upgrade diff --git a/src/current/cockroachcloud/upgrade-to-v24.1.md b/src/current/cockroachcloud/upgrade-to-v24.1.md new file mode 100644 index 00000000000..39d4f3516f7 --- /dev/null +++ b/src/current/cockroachcloud/upgrade-to-v24.1.md @@ -0,0 +1,170 @@ +--- +title: Upgrade to CockroachDB v24.1 Pre-Production Preview +summary: Learn how to upgrade a cluster in CockroachDB Cloud to v24.1 Pre-Production Preview +toc: true +docs_area: manage +page_version: v24.1 +prev_version: v23.2 +pre_production_preview: true +pre_production_preview_version: v24.1.0-beta.1 +--- + +{% if page.pre_production_preview == true %} +[CockroachDB {{ page.pre_production_preview_version }}](https://www.cockroachlabs.com/docs/releases/{{ page.page_version }}#{{ page.pre_production_preview_version | replace: ".","-"}}) is available to CockroachDB {{ site.data.products.dedicated }} clusters for testing and experimentation. + +{{site.data.alerts.callout_danger}} +This [testing release]({% link releases/index.md %}#release-naming) is not qualified for production environments and not eligible for support or uptime SLA commitments. +{{site.data.alerts.end}} + +An [Org Administrator]({% link cockroachcloud/authorization.md %}#org-administrator) can upgrade your CockroachDB {{ site.data.products.dedicated }} cluster from the CockroachDB {{ site.data.products.cloud }} Console. This page shows how to upgrade a CockroachDB {{ site.data.products.dedicated }} cluster to {{ page.pre_production_preview_version }} for testing and experimentation. + +{{site.data.alerts.callout_success}} +Upgrading from {{ page.prev_version }} to {{ page.pre_production_preview_version }} is a major-version upgrade. Upgrading a CockroachDB {{ site.data.products.dedicated }} cluster to a new major version is opt-in. Before proceeding, review the CockroachDB {{ site.data.products.cloud }} [CockroachDB Cloud Upgrade Policy](https://cockroachlabs.com/docs/cockroachcloud/upgrade-policy#pre-production-preview). After a cluster is upgraded to a Pre-Production Preview release, it is automatically upgraded to all subsequent releases within the same major version—including additional beta and RC releases, the GA release, and subsequent patch releases after GA, as patch version upgrades. To learn more, refer to [Patch Version Upgrades]({% link cockroachcloud/upgrade-policy.md %}#patch-version-upgrades). +{{site.data.alerts.end}} + +{% else %} +Now that [CockroachDB {{ page.page_version }}](https://www.cockroachlabs.com/docs/releases/ {{ page.page_version }}) is available, an [Org Administrator]({% link cockroachcloud/authorization.md %}#org-administrator) can upgrade your CockroachDB {{ site.data.products.dedicated }} cluster from the CockroachDB {{ site.data.products.cloud }} Console. This page shows how to upgrade a cluster in CockroachDB Cloud to {{ page.page_version }}. + +{{site.data.alerts.callout_success}} +Upgrading a CockroachDB {{ site.data.products.dedicated }} cluster to a new major version is opt-in. Before proceeding, review the CockroachDB {{ site.data.products.cloud }} [CockroachDB Cloud Upgrade Policy](https://cockroachlabs.com/docs/cockroachcloud/upgrade-policy). +{{site.data.alerts.end}} + +{% endif %} + +## Step 1. Verify that you can upgrade + +To upgrade to CockroachDB {{ page.page_version}}, you must be running {{ page.prev_version }}. If you are not running {{ page.prev_version }}, first [upgrade to {{ page.prev_version }}]({% link cockroachcloud/upgrade-to-{{ page.prev_version }}.md %}). Then return to this page and continue to [Step 2](#step-2-select-your-cluster-size). + +## Step 2. Select your cluster size + +The upgrade process depends on the number of nodes in your cluster. Select whether your cluster has multiple nodes or a single node: + +
+
+ +## Step 3. Understand the upgrade process + +
+In a multi-node cluster, the upgrade does not interrupt the cluster's overall health and availability. CockroachDB {{ site.data.products.cloud }} stops one node at a time and restarts it with the new version, waits a few minutes to observe the upgraded node's behavior, then moves on to the next node. This "rolling upgrade" takes approximately 4-5 minutes per node and is enabled by CockroachDB's [multi-active availability](https://www.cockroachlabs.com/docs/{{site.current_cloud_version}}/multi-active-availability) design. + +Approximately 72 hours after all nodes are running {{ page.page_version }}, the upgrade will be automatically finalized. This enables certain [features and performance improvements introduced in {{ page.page_version }}](#expect-temporary-limitations). Finalization also removes the ability to roll back to {{ page.prev_version }}, so it's important to monitor your applications during this 72-hour window and, if you see unexpected behavior, [roll back the upgrade](#roll-back-the-upgrade) from the CockroachDB {{ site.data.products.cloud }} Console. +
+ +
+When you start the upgrade, the cluster will be unavailable for a few minutes while the node is stopped and restarted with {{ page.page_version }}. + +Approximately 72 hours after the node has been restarted, the upgrade will be automatically finalized. This enables certain [features and performance improvements introduced in {{ page.page_version }}](#expect-temporary-limitations). Finalization also removes the ability to roll back to {{ page.prev_version }}, so it's important to monitor your applications during this 72-hour window and, if you see unexpected behavior, [roll back the upgrade](#roll-back-the-upgrade) from the CockroachDB {{ site.data.products.cloud }} Console. +
+ +{{site.data.alerts.callout_danger}} +If you choose to roll back a major version upgrade, your cluster will be rolled back to the latest patch release of {{ page.prev_version }}, which may differ from the patch release you were running before you initiated the upgrade. To learn more, refer to [CockroachDB Cloud Upgrade Policy]({% link cockroachcloud/upgrade-policy.md %}). +{{site.data.alerts.end}} + +## Step 4. Prepare to upgrade + +Before starting the upgrade, complete the following steps. + +
+ +### Prepare for brief unavailability + +Your cluster will be unavailable while its single node is stopped and restarted with {{ page.page_version }}. Prepare your application for this brief downtime, typically a few minutes. + +The [**SQL Users**]({% link cockroachcloud/managing-access.md %}#create-a-sql-user) and [**Tools**]({% link cockroachcloud/tools-page.md %}) tabs in the CockroachDB {{ site.data.products.cloud }} Console will also be disabled during this time. + +
+ +### Review breaking changes + +{% comment %} Be careful with this logic and the page-level variable page_version {% endcomment %} +{% assign rd = site.data.versions | where_exp: "rd", "rd.major_version == page.page_version" | first %} + +{% if page.pre_production_preview == true %} +Review the backward-incompatible changes and deprecated features announced in each {{ page.page_version }} testing release. If any affect your applications, make the necessary changes before proceeding. +{% else %} +Review the backward-incompatible changes and deprecated features announced in the [{{ page.page_version }} release notes](https://www.cockroachlabs.com/docs/releases/{{ page.page_version }}) +{% endif %} + +### Reset SQL statistics + +Before upgrading to CockroachDB {{ page.page_version }}, it is recommended to reset the cluster's [SQL statistics]({% link {{ page.page_version }}/cost-based-optimizer.md %}#table-statistics). Otherwise, it may take longer for the upgrade to complete on a cluster with large statement or transaction statistics tables. This is due to the addition of a new column and a new index to these tables. To reset SQL statistics, issue the following SQL command: + +{% include_cached copy-clipboard.html %} +~~~ sql +SELECT crdb_internal.reset_sql_stats(); +~~~ + +## Step 5. Start the upgrade + +To start the upgrade process: + +1. [Sign in](https://cockroachlabs.cloud/) to your CockroachDB {{ site.data.products.cloud }} account. + +1. In the **Clusters** list, select the cluster you want to upgrade. + +1. Select **Actions > Upgrade {% if page.pre_production_preview == true %}to Pre-Production Preview{% else %}major version{% endif %}**. + +1. In the **Upgrade your cluster** dialog, review the pre-upgrade message and then click {% if page.pre_production_preview == true %}to Pre-Production Preview{% else %}major version{% endif %}. + +
+Your cluster will be upgraded one node at a time without interrupting the cluster's overall health and availability. This "rolling upgrade" will take approximately 4-5 minutes per node. +
+ +
+Your single-node cluster will be unavailable for a few minutes while the node is stopped and restarted with CockroachDB {{ page.page_version }}. +
+ +After it is started, an upgrade cannot be cancelled. Instead, you can wait for the upgrade to finish, then [roll it back](#roll-back-the-upgrade) for up to 72 hours, after which time it will be finalized and cannot be rolled back. + +## Step 6. Monitor the upgrade + +Once your cluster is running CockroachDB {{ page.page_version }}, you will have approximately 72 hours before the upgrade is automatically finalized. During this time, it is important to [monitor your applications](#monitor-your-application) and [expect temporary limitations](#expect-temporary-limitations). + +If you see unexpected behavior, you can [roll back](#roll-back-the-upgrade) to {{ page.prev_version }} during the 72-hour window. + +### Monitor your application + +Use the [DB Console]({% link cockroachcloud/tools-page.md %}) or your own tooling to monitor your application for any unexpected behavior. + +- If everything looks good, you can wait for the upgrade to automatically finalize or you can [manually trigger finalization](#finalize-the-upgrade). + +- If you see unexpected behavior, you can [roll back to the latest patch release of {{ page.prev_version }}](#roll-back-the-upgrade) during the 72-hour window. + +### Expect temporary limitations + +Most {{ page.page_version }} features can be used right away, but some will be enabled only after the upgrade has been finalized. Attempting to use these features before finalization will result in errors. {% comment %}TODO: List of temporary limitations for GA{% endcomment %} + +For an expanded list of features included in {{ page.page_version }}, temporary limitations, backward-incompatible changes, and deprecated features in the [{{ page.page_version }} release notes](https://www.cockroachlabs.com/docs/releases/{{ page.page_version }}). + +### Roll back the upgrade + +If you see unexpected behavior, you can roll back the upgrade during the 72-hour window. + +To stop the upgrade and roll back to {{ page.prev_version }}, click **Roll back** in the banner at the top of the CockroachDB {{ site.data.products.cloud }} Console, and then click **Roll back upgrade**. + +
+During rollback, nodes will be reverted to the latest production patch release of {{ page.prev_version }} one at a time without interrupting the cluster's health and availability. +
+ +
+Because your cluster contains a single node, the cluster will be briefly unavailable while the node is stopped and restarted with the latest production patch release of {{ page.prev_version }}. Be sure to [prepare for this brief unavailability](#prepare-for-brief-unavailability) before starting the rollback. +
+ +## Step 7. Complete the upgrade + +If everything looks good, you can wait for the upgrade to automatically finalize, or you can manually finalize the upgrade to lift the [temporary limitations](#expect-temporary-limitations) on the cluster more quickly. + +### Finalize the upgrade + +The upgrade is automatically finalized after 72 hours. + +To manually finalize the upgrade, click **Finalize** in the banner at the top of the CockroachDB {{ site.data.products.cloud }} Console, and then click **Finalize upgrade**. + +After finalization, all [temporary limitations](#expect-temporary-limitations) will be lifted and all {{ page.page_version }} features will be available for use. However, it will no longer be possible to roll back to {{ page.prev_version }}. If you see unexpected behavior after the upgrade has been finalized, [contact support](https://support.cockroachlabs.com/hc/requests/new). + +## See also + +- [CockroachDB Cloud Upgrade Policy](https://cockroachlabs.com/docs/cockroachcloud/upgrade-policy) +- [CockroachDB {{ page.page_version }} Release Notes](https://www.cockroachlabs.com/docs/releases/{{ page.page_version }}) From 0cbb5236e3827f65982abd4c95aa54c10e626b49 Mon Sep 17 00:00:00 2001 From: Mike Lewis <76072290+mikeCRL@users.noreply.github.com> Date: Thu, 18 Apr 2024 12:49:48 -0400 Subject: [PATCH 07/34] Add v23.1.19 release notes (#18484) Compile and revise release notes for v23.1.19. --- src/current/_data/releases.yml | 27 +++++++++++++++++++ .../_includes/releases/v23.1/v23.1.19.md | 10 +++++++ 2 files changed, 37 insertions(+) create mode 100644 src/current/_includes/releases/v23.1/v23.1.19.md diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index c0bfcb1cd76..3d38d1c4849 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5843,3 +5843,30 @@ docker_arm_limited_access: false source: true previous_release: v24.1.0-alpha.5 + +- release_name: v23.1.19 + major_version: v23.1 + release_date: '2024-04-18' + release_type: Production + go_version: go1.22.0 + sha: 1bca2adcbc1deb23067e28369f8b24c99194f2bb + has_sql_only: true + has_sha256sum: true + mac: + mac_arm: true + mac_arm_experimental: true + mac_arm_limited_access: false + windows: true + linux: + linux_arm: true + linux_arm_experimental: false + linux_arm_limited_access: false + linux_intel_fips: true + linux_arm_fips: false + docker: + docker_image: cockroachdb/cockroach + docker_arm: true + docker_arm_experimental: false + docker_arm_limited_access: false + source: true + previous_release: v23.1.18 diff --git a/src/current/_includes/releases/v23.1/v23.1.19.md b/src/current/_includes/releases/v23.1/v23.1.19.md new file mode 100644 index 00000000000..1aca1134d2d --- /dev/null +++ b/src/current/_includes/releases/v23.1/v23.1.19.md @@ -0,0 +1,10 @@ +## v23.1.19 + +Release Date: April 18, 2024 + +{% include releases/release-downloads-docker-image.md release=include.release %} + +

Bug fixes

+ +- Reintroduced [cluster setting]({% link v23.1/cluster-settings.md %}) `sql.auth.modify_cluster_setting_applies_to_all.enabled` so that mixed-version clusters can migrate off of this setting, which is deprecated in favor of the privilege [`MODIFYSQLCLUSTERSETTING`]({% link v23.1/set-cluster-setting.md %}#required-privileges). [#122455][#122455] +[#122455]: https://github.com/cockroachdb/cockroach/pull/122455 From dab3822ba1a2d635499e8f82ef50d09000d53cf1 Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Thu, 18 Apr 2024 10:07:15 -0700 Subject: [PATCH 08/34] [DOC-9332] Document new regions on Azure (Part 2 of N, CC-25999) (#18430) * [DOC-9332] Document new regions on Azure (Part 2 of N, CC-25999) --- src/current/_data/cloud_releases.csv | 1 + .../_includes/releases/cloud/2024-04-18.md | 20 +++++++++++++++++++ src/current/cockroachcloud/regions.md | 16 +++++++++++++-- 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 src/current/_includes/releases/cloud/2024-04-18.md diff --git a/src/current/_data/cloud_releases.csv b/src/current/_data/cloud_releases.csv index c70b232e03b..ed44c6e7aee 100644 --- a/src/current/_data/cloud_releases.csv +++ b/src/current/_data/cloud_releases.csv @@ -83,3 +83,4 @@ date,sha 2024-03-20,null 2024-04-09,null 2024-04-17,null +2024-04-18,null diff --git a/src/current/_includes/releases/cloud/2024-04-18.md b/src/current/_includes/releases/cloud/2024-04-18.md new file mode 100644 index 00000000000..7c20a0a7d4d --- /dev/null +++ b/src/current/_includes/releases/cloud/2024-04-18.md @@ -0,0 +1,20 @@ +## April 18, 2024 + +

General updates

+ +- CockroachDB {{ site.data.products.dedicated }} clusters on Azure can now be created in the following [regions]({% link cockroachcloud/regions.md %}): + + Geographic Area | Region Name | Location + -----------------|----------------------|--------- + Africa | `southafricanorth` | Johannesburg + Asia Pacific | `japaneast` | Tokyo + | `koreacentral` | Seoul + Middle East | `qatarcentral` | Doha + | `uaenorth` | Dubai + | `southcentralus` | Texas + | `westus3` | Washington + Western Europe | `francecentral` | Paris + | `norwayeast` | Oslo + | `polandcentral` | Warsaw + | `swedencentral` | Gävle + | `switzerlandnorth` | Zürich diff --git a/src/current/cockroachcloud/regions.md b/src/current/cockroachcloud/regions.md index 9ccb92ef50e..42f7ae0f47e 100644 --- a/src/current/cockroachcloud/regions.md +++ b/src/current/cockroachcloud/regions.md @@ -82,17 +82,29 @@ CockroachDB {{ site.data.products.cloud }} clusters can be deployed in the follo Geographic Area | Region Name | Location ----------------|----------------------|--------- +Africa | `southafricanorth` | Johannesburg Asia Pacific | `australiaeast` | New South Wales + | `japaneast` | Tokyo + | `koreacentral` | Seoul | `centralindia` | Pune | `eastasia` | Hong Kong | `southeastasia` | Singapore -North America | `centralcanada` | Toronto +Middle East | `qatarcentral` | Doha + | `uaenorth` | Dubai +North America | `canadacentral` | Toronto | `centralus` | Iowa | `eastus` | Virginia | `eastus2` | Virginia + | `southcentralus` | Texas | `westus2` | Washington -Western Europe | `germanywestcentral` | Frankfurt + | `westus3` | Washington +Western Europe | `francecentral` | Paris + | `germanywestcentral` | Frankfurt | `northeurope` | Ireland + | `norwayeast` | Oslo + | `polandcentral` | Warsaw + | `swedencentral` | Gävle + | `switzerlandnorth` | Zürich | `uksouth` | London | `westeurope` | Netherlands From c5eab64c8eccf5224c7c43ade62ebe7006609dbf Mon Sep 17 00:00:00 2001 From: Rich Loveland Date: Fri, 19 Apr 2024 15:23:27 -0400 Subject: [PATCH 09/34] Update kv.snapshot_recovery.max_rate removal note (#18468) * Update kv.snapshot_recovery.max_rate removal note Fixes DOC-10070 Co-authored-by: Florence Morris --- src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md index cf6204d3787..785b56990ef 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md @@ -503,7 +503,9 @@ When cluster virtualization is enabled: - `cockroach debug pebble` commands now work correctly with encrypted stores which don't use the default `cockroach-data` path without having to also pass `--store`. [#110150][#110150] - Fixed a bug where `CREATE INDEX` for [partial indexes]({% link v23.2/partial-indexes.md %}) could fail with `ERROR: duplicate key value violates unique constraint` if concurrent inserts happened simultaneously. [#110216][#110216] - Observability pages no longer crash when they encounter zeros (e.g., a session with no memory allocated). [#108752][#108752] -- Removed the user configurable setting `kv.snapshot_recovery.max_rate`. Guidance to customers has been to always set this equal to `kv.snapshot_rebalance.max_rate` and CockroachDB will use that setting for all snapshots. If you previously set `kv.snapshot_recovery.max_rate` it will be cleared and future attempts to set it will fail with: `ERROR: unknown cluster setting 'kv.snapshot_recovery.max_rate'` [#102596][#102596] +- Removed the [cluster setting]({% link v23.2/cluster-settings.md %}) `kv.snapshot_recovery.max_rate`: + - In v23.2, this setting is disabled; it is a no-op. If you previously set `kv.snapshot_recovery.max_rate` on a cluster running v23.1 and upgraded to v23.2, the setting is ignored, and the [`kv.snapshot_rebalance.max_rate`]({% link v23.2/cluster-settings.md %}#setting-kv-snapshot-rebalance-max-rate ) setting is used instead. + - In v24.1 and later, this setting is removed entirely. If you had previously set `kv.snapshot_recovery.max_rate` prior to upgrade, it will be cleared, and any attempts to set it will fail with the error message: `ERROR: unknown cluster setting 'kv.snapshot_recovery.max_rate'`. [#102596][#102596] - Fixed a bug in which a `CREATE FUNCTION` may produce a syntax error if the UDF body wrapped in tagged dollar quotes (e.g., `$func$`), contains two consecutive dollar signs `$$`. If the UDF body is known to contain dollar signs, then the caller should use tagged dollar quotes or single quotes when defining the UDF. For example: {% include_cached copy-clipboard.html %} From c8f5755a555396dd2b27349b0fc52d90bd1bd8f6 Mon Sep 17 00:00:00 2001 From: Rich Loveland Date: Fri, 19 Apr 2024 16:56:56 -0400 Subject: [PATCH 10/34] Fix broken external link to Cloud Console (#18493) --- src/current/cockroachcloud/create-your-cluster.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/current/cockroachcloud/create-your-cluster.md b/src/current/cockroachcloud/create-your-cluster.md index 08cf4640f5b..45c26bc2fd6 100644 --- a/src/current/cockroachcloud/create-your-cluster.md +++ b/src/current/cockroachcloud/create-your-cluster.md @@ -7,7 +7,7 @@ docs_area: deploy {% include cockroachcloud/filter-tabs/create-cluster-cloud.md %} -This page walks you through the process of creating a CockroachDB {{ site.data.products.dedicated }} cluster using the [Cloud Console](httrps://cockroachlabs.cloud). To use the Cloud API instead, refer to [Create a New Cluster]({% link cockroachcloud/cloud-api.md %}#create-a-new-cluster). +This page walks you through the process of creating a CockroachDB {{ site.data.products.dedicated }} cluster using the [Cloud Console](https://cockroachlabs.cloud). To use the Cloud API instead, refer to [Create a New Cluster]({% link cockroachcloud/cloud-api.md %}#create-a-new-cluster). Only [CockroachDB {{ site.data.products.cloud }} Org Administrators]({% link cockroachcloud/authorization.md %}#org-administrator) or users with Cluster Creator / Cluster Admin roles assigned at organization scope can create clusters. If you need to create a cluster and do not have one of the required roles, contact your CockroachDB {{ site.data.products.cloud }} Administrator. From 3bf980709eb9969d1138f6c5b2c38be7401b936d Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Mon, 22 Apr 2024 15:00:54 -0400 Subject: [PATCH 11/34] (1) In ui-sql-dashboard.md, (a) modified description of Full Table/Index Scans to specify non-negative rate, (b) added link to Statements page filter, (c) fixed typo in description for the Connection Latency. (#18491) --- src/current/v24.1/ui-sql-dashboard.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/current/v24.1/ui-sql-dashboard.md b/src/current/v24.1/ui-sql-dashboard.md index 6a28d5a9acd..da0f6f30fd7 100644 --- a/src/current/v24.1/ui-sql-dashboard.md +++ b/src/current/v24.1/ui-sql-dashboard.md @@ -83,11 +83,11 @@ The statement contention metric is a counter that represents the number of state ## Full Table/Index Scans -- In the node view, the graph shows the total number of full table and index scans on that node. +- In the node view, the graph shows the total number of full table and index scans per second on that node. This is a non-negative rate. -- In the cluster view, the graph shows the total number of full table and index scans across all nodes in the cluster. +- In the cluster view, the graph shows the total number of full table and index scans per second across all nodes in the cluster. This is a non-negative rate. -[Examine the statements]({% link {{ page.version.version }}/sql-tuning-with-explain.md %}) that result in full table scans and consider adding [secondary indexes]({% link {{ page.version.version }}/schema-design-indexes.md %}#create-a-secondary-index). +You can [identify the specific statements]({% link {{ page.version.version }}/ui-statements-page.md %}#filter) that result in full table scans by filtering for them on the **Statements** page. [Examine these statements]({% link {{ page.version.version }}/sql-tuning-with-explain.md %}) that result in full table scans and consider adding [secondary indexes]({% link {{ page.version.version }}/schema-design-indexes.md %}#create-a-secondary-index). ## Active Flows for Distributed SQL Statements @@ -101,7 +101,7 @@ Connection latency is calculated as the time in nanoseconds between when the clu - In the node view, the graph shows the 99th [percentile](https://wikipedia.org/wiki/Percentile#The_normal_distribution_and_percentiles) of connection latency for the node. Over the last minute this node established 99% of connections within this time, not including network latency between the node and the client. -- In the cluster view, the graph shows the 99th [percentile](https://wikipedia.org/wiki/Percentile#The_normal_distribution_and_percentiles) of service latency across all nodes in the cluster. There are lines for each node in the cluster. Over the last minute the cluster established 99% of connections within this time, not including network latency between the node and the client. +- In the cluster view, the graph shows the 99th [percentile](https://wikipedia.org/wiki/Percentile#The_normal_distribution_and_percentiles) of connection latency across all nodes in the cluster. There are lines for each node in the cluster. Over the last minute the cluster established 99% of connections within this time, not including network latency between the node and the client. ## Connection Latency: 90th Percentile From df1ccb06a74886bbc2bd2b69bbc6fb13b1d84158 Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Mon, 22 Apr 2024 16:36:51 -0400 Subject: [PATCH 12/34] DOC-10062 clarify why SQL activity page % of runtime column does not equal 100% (#18459) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * In statements-table.md include file, added note to explain how % of All Runtime values may not sum to 100%. * Incorporated Ryan’s feedback. --- src/current/_includes/v23.1/ui/statements-filter.md | 2 +- src/current/_includes/v23.1/ui/statements-table.md | 2 +- src/current/_includes/v23.2/ui/statements-filter.md | 2 +- src/current/_includes/v23.2/ui/statements-table.md | 2 +- src/current/_includes/v24.1/ui/statements-filter.md | 2 +- src/current/_includes/v24.1/ui/statements-table.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/current/_includes/v23.1/ui/statements-filter.md b/src/current/_includes/v23.1/ui/statements-filter.md index 3a5d178793d..add3bc3727f 100644 --- a/src/current/_includes/v23.1/ui/statements-filter.md +++ b/src/current/_includes/v23.1/ui/statements-filter.md @@ -4,7 +4,7 @@ The statement fingerprints returned are determined by the selected **Search Crit ### Search Criteria ### -By default, the **Top** `100` statement fingerprints **By** `% of All Runtime` for the `Past Hour` are returned. +By default, the **Top** `100` statement fingerprints **By** [`% of All Runtime`](#percent-of-all-runtime) for the `Past Hour` are returned. 1. To change the number of results returned, select `25`, `50`, `100`, or `500` from the **Top** dropdown. To return a larger number, select `More` and choose an option: `1000`, `5000`, `10000`. 1. To change the sort column, from the **By** dropdown, select a commonly sorted column: `% of All Runtime`, `CPU Time`, `Contention Time`, `Execution Count`, `P99 Latency`, `Statement Time`. To sort by other columns, select `More` from the dropdown and choose an option: `Last Execution Time`, `Max Latency`,`Max Memory`, `Min Latency`, `Network`, `P50 Latency`, `P90 Latency`, `Retries`, `Rows Processed`. diff --git a/src/current/_includes/v23.1/ui/statements-table.md b/src/current/_includes/v23.1/ui/statements-table.md index 4486ded8c4b..ea89ec91e6d 100644 --- a/src/current/_includes/v23.1/ui/statements-table.md +++ b/src/current/_includes/v23.1/ui/statements-table.md @@ -11,7 +11,7 @@ Execution Count | Cumulative number of executions of statements with this finger Database | The database in which the statement was executed. Application Name | The name specified by the [`application_name`]({{ link_prefix }}show-vars.html#supported-variables) session setting. Statement Time | Average [planning and execution time]({{ link_prefix }}architecture/sql-layer.html#sql-parser-planner-executor) of statements with this statement fingerprint within the time interval.

The gray bar indicates the mean latency. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values. -% of All Runtime | How much time this statement fingerprint took to execute compared to all other statements that were executed within the time period. It is expressed as a percentage. The runtime is the mean execution latency multiplied by the execution count. +% of All Runtime | The percentage of execution time taken by this statement fingerprint compared to all other statements executed within the time period, including those not displayed. Runtime is calculated as the mean execution latency multiplied by the execution count.

Note: The sum of the values in this column may not equal 100%. Each fingerprint's percentage is calculated by dividing the fingerprint's runtime by the sum of the runtimes for all statement fingerprints in the time interval. "All statement fingerprints" means all user statement fingerprints (not only those displayed by the [search criteria](#search-criteria)), as well as internal statement fingerprints that are never included in the displayed result set. The search criteria are applied after the `% of All Runtime` calculation. Contention Time | Average time statements with this fingerprint were [in contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention) with other transactions within the time interval.

The gray bar indicates mean contention time. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values. CPU Time | Average CPU time spent executing within the specified time interval. The gray bar indicates mean CPU time. The blue bar indicates one standard deviation from the mean.

The CPU time includes time spent in the [SQL layer]({{ link_prefix }}architecture/sql-layer.html). It does not include time spent in the [storage layer]({{ link_prefix }}architecture/storage-layer.html). P50 Latency | The 50th latency percentile for sampled statement executions with this fingerprint. diff --git a/src/current/_includes/v23.2/ui/statements-filter.md b/src/current/_includes/v23.2/ui/statements-filter.md index fd432fc6994..e6ed6ea06e4 100644 --- a/src/current/_includes/v23.2/ui/statements-filter.md +++ b/src/current/_includes/v23.2/ui/statements-filter.md @@ -4,7 +4,7 @@ The statement fingerprints returned are determined by the selected **Search Crit ### Search Criteria ### -By default, the **Top** `100` statement fingerprints **By** `% of All Runtime` for the `Past Hour` are returned. +By default, the **Top** `100` statement fingerprints **By** [`% of All Runtime`](#percent-of-all-runtime) for the `Past Hour` are returned. 1. To change the number of results returned, select `25`, `50`, `100`, or `500` from the **Top** dropdown. To return a larger number, select `More` and choose an option: `1000`, `5000`, `10000`. 1. To change the sort column, from the **By** dropdown, select a commonly sorted column: `% of All Runtime`, `CPU Time`, `Contention Time`, `Execution Count`, `P99 Latency`, `Statement Time`. To sort by other columns, select `More` from the dropdown and choose an option: `Last Execution Time`, `Max Latency`,`Max Memory`, `Min Latency`, `Network`, `P50 Latency`, `P90 Latency`, `Retries`, `Rows Processed`. diff --git a/src/current/_includes/v23.2/ui/statements-table.md b/src/current/_includes/v23.2/ui/statements-table.md index 4486ded8c4b..ea89ec91e6d 100644 --- a/src/current/_includes/v23.2/ui/statements-table.md +++ b/src/current/_includes/v23.2/ui/statements-table.md @@ -11,7 +11,7 @@ Execution Count | Cumulative number of executions of statements with this finger Database | The database in which the statement was executed. Application Name | The name specified by the [`application_name`]({{ link_prefix }}show-vars.html#supported-variables) session setting. Statement Time | Average [planning and execution time]({{ link_prefix }}architecture/sql-layer.html#sql-parser-planner-executor) of statements with this statement fingerprint within the time interval.

The gray bar indicates the mean latency. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values. -% of All Runtime | How much time this statement fingerprint took to execute compared to all other statements that were executed within the time period. It is expressed as a percentage. The runtime is the mean execution latency multiplied by the execution count. +% of All Runtime | The percentage of execution time taken by this statement fingerprint compared to all other statements executed within the time period, including those not displayed. Runtime is calculated as the mean execution latency multiplied by the execution count.

Note: The sum of the values in this column may not equal 100%. Each fingerprint's percentage is calculated by dividing the fingerprint's runtime by the sum of the runtimes for all statement fingerprints in the time interval. "All statement fingerprints" means all user statement fingerprints (not only those displayed by the [search criteria](#search-criteria)), as well as internal statement fingerprints that are never included in the displayed result set. The search criteria are applied after the `% of All Runtime` calculation. Contention Time | Average time statements with this fingerprint were [in contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention) with other transactions within the time interval.

The gray bar indicates mean contention time. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values. CPU Time | Average CPU time spent executing within the specified time interval. The gray bar indicates mean CPU time. The blue bar indicates one standard deviation from the mean.

The CPU time includes time spent in the [SQL layer]({{ link_prefix }}architecture/sql-layer.html). It does not include time spent in the [storage layer]({{ link_prefix }}architecture/storage-layer.html). P50 Latency | The 50th latency percentile for sampled statement executions with this fingerprint. diff --git a/src/current/_includes/v24.1/ui/statements-filter.md b/src/current/_includes/v24.1/ui/statements-filter.md index 139258e1cf8..d5a34084385 100644 --- a/src/current/_includes/v24.1/ui/statements-filter.md +++ b/src/current/_includes/v24.1/ui/statements-filter.md @@ -4,7 +4,7 @@ The statement fingerprints returned are determined by the selected **Search Crit ### Search Criteria ### -By default, the **Top** `100` statement fingerprints **By** `% of All Runtime` for the `Past Hour` are returned. +By default, the **Top** `100` statement fingerprints **By** [`% of All Runtime`](#percent-of-all-runtime) for the `Past Hour` are returned. 1. To change the number of results returned, select `25`, `50`, `100`, or `500` from the **Top** dropdown. To return a larger number, select `More` and choose an option: `1000`, `5000`, `10000`. 1. To change the sort column, from the **By** dropdown, select a commonly sorted column: `% of All Runtime`, `CPU Time`, `Contention Time`, `Execution Count`, `P99 Latency`, `Statement Time`. To sort by other columns, select `More` from the dropdown and choose an option: `Last Execution Time`, `Max Latency`,`Max Memory`, `Min Latency`, `Network`, `P50 Latency`, `P90 Latency`, `Retries`, `Rows Processed`. diff --git a/src/current/_includes/v24.1/ui/statements-table.md b/src/current/_includes/v24.1/ui/statements-table.md index 4486ded8c4b..ea89ec91e6d 100644 --- a/src/current/_includes/v24.1/ui/statements-table.md +++ b/src/current/_includes/v24.1/ui/statements-table.md @@ -11,7 +11,7 @@ Execution Count | Cumulative number of executions of statements with this finger Database | The database in which the statement was executed. Application Name | The name specified by the [`application_name`]({{ link_prefix }}show-vars.html#supported-variables) session setting. Statement Time | Average [planning and execution time]({{ link_prefix }}architecture/sql-layer.html#sql-parser-planner-executor) of statements with this statement fingerprint within the time interval.

The gray bar indicates the mean latency. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values. -% of All Runtime | How much time this statement fingerprint took to execute compared to all other statements that were executed within the time period. It is expressed as a percentage. The runtime is the mean execution latency multiplied by the execution count. +% of All Runtime | The percentage of execution time taken by this statement fingerprint compared to all other statements executed within the time period, including those not displayed. Runtime is calculated as the mean execution latency multiplied by the execution count.

Note: The sum of the values in this column may not equal 100%. Each fingerprint's percentage is calculated by dividing the fingerprint's runtime by the sum of the runtimes for all statement fingerprints in the time interval. "All statement fingerprints" means all user statement fingerprints (not only those displayed by the [search criteria](#search-criteria)), as well as internal statement fingerprints that are never included in the displayed result set. The search criteria are applied after the `% of All Runtime` calculation. Contention Time | Average time statements with this fingerprint were [in contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention) with other transactions within the time interval.

The gray bar indicates mean contention time. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values. CPU Time | Average CPU time spent executing within the specified time interval. The gray bar indicates mean CPU time. The blue bar indicates one standard deviation from the mean.

The CPU time includes time spent in the [SQL layer]({{ link_prefix }}architecture/sql-layer.html). It does not include time spent in the [storage layer]({{ link_prefix }}architecture/storage-layer.html). P50 Latency | The 50th latency percentile for sampled statement executions with this fingerprint. From 3603c6483f35f02d93bac4fcdf8c70253d9c2d95 Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Mon, 22 Apr 2024 21:40:57 -0400 Subject: [PATCH 13/34] DOC-10047 update service account roles for log export and audit logs (on main branch) (#18451) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * In export-logs.md and cloud-org-audit-logs.md, listed the role(s) a service account needs. * incorporated Ryan and Matt’s feedback. --- .../cockroachcloud/cloud-org-audit-logs.md | 2 +- src/current/cockroachcloud/export-logs.md | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/current/cockroachcloud/cloud-org-audit-logs.md b/src/current/cockroachcloud/cloud-org-audit-logs.md index 2b64aebeabb..a70aaa2759b 100644 --- a/src/current/cockroachcloud/cloud-org-audit-logs.md +++ b/src/current/cockroachcloud/cloud-org-audit-logs.md @@ -6,7 +6,7 @@ docs_area: manage cloud: true --- -CockroachDB {{ site.data.products.cloud }} captures audit logs when many types of events occur, such as when a cluster is created or when a user is added to or removed from an organization. Any user in an organization with an admin-level service account can export these audit logs using the [`auditlogevents` endpoint]({% link cockroachcloud/cloud-api.md %}#cloud-audit-logs) of the [Cloud API]({% link cockroachcloud/cloud-api.md %}). +CockroachDB {{ site.data.products.cloud }} captures audit logs when many types of events occur, such as when a cluster is created or when a user is added to or removed from an organization. Any user in an organization with a [service account]({% link cockroachcloud/managing-access.md %}#manage-service-accounts) assigned the [Org Administrator role]({% link cockroachcloud/authorization.md %}#org-administrator) can export these audit logs using the [`auditlogevents` endpoint]({% link cockroachcloud/cloud-api.md %}#cloud-audit-logs) of the [Cloud API]({% link cockroachcloud/cloud-api.md %}). This page provides some examples of exporting CockroachDB {{ site.data.products.cloud }} organization audit logs. For details about each parameter and its defaults, refer to the API specification for the [`auditlogevents` endpoint]({% link cockroachcloud/cloud-api.md %}#cloud-audit-logs). diff --git a/src/current/cockroachcloud/export-logs.md b/src/current/cockroachcloud/export-logs.md index 3b1357fa37d..c01a1d532d1 100644 --- a/src/current/cockroachcloud/export-logs.md +++ b/src/current/cockroachcloud/export-logs.md @@ -17,17 +17,19 @@ To configure and manage log export for your CockroachDB {{ site.data.products.de https://cockroachlabs.cloud/api/v1/clusters/{your_cluster_id}/logexport ~~~ -Access to the `logexport` endpoint requires a valid CockroachDB {{ site.data.products.cloud }} [service account]({% link cockroachcloud/managing-access.md %}#manage-service-accounts) with the appropriate permissions (`admin` privilege or Cluster Admin role). +Access to the `logexport` endpoint requires a valid CockroachDB {{ site.data.products.cloud }} [service account]({% link cockroachcloud/managing-access.md %}#manage-service-accounts) assigned one of the following [roles]({% link cockroachcloud/managing-access.md %}#edit-roles-on-a-service-account): -The following methods are available for use with the `logexport` endpoint, and require the listed service account permissions: +- [Org Administrator]({% link cockroachcloud/authorization.md %}#org-administrator) +- [Cluster Administrator]({% link cockroachcloud/authorization.md %}#cluster-administrator) +- [Cluster Operator]({% link cockroachcloud/authorization.md %}#cluster-operator) -Method | Required permissions | Description ---- | --- | --- -`GET` | `ADMIN`, `EDIT`, or `READ` | Returns the current status of the log export configuration. -`POST` | `ADMIN` or `EDIT` | Enables log export, or updates an existing log export configuration. -`DELETE` | `ADMIN` | Disables log export, halting all log export to AWS CloudWatch or GCP Cloud Logging. +The following methods are available for use with the `logexport` endpoint: -See [Service accounts]({% link cockroachcloud/managing-access.md %}#manage-service-accounts) for instructions on configuring a CockroachDB {{ site.data.products.cloud }} service account with these required permissions. +Method | Description +-------|------------ +`GET` | Returns the current status of the log export configuration. +`POST` | Enables log export, or updates an existing log export configuration. +`DELETE` | Disables log export, halting all log export to AWS CloudWatch or GCP Cloud Logging. ## Log name format From cba8e365fe02ed5c8984b7c770f8fd3f4ca6eb68 Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Tue, 23 Apr 2024 16:00:25 -0400 Subject: [PATCH 14/34] In v24.1.0-alpha.5.md, fixed formatting of 2 release notes. (#18497) --- src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md index 774b76620c9..b8f0b770c62 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md @@ -51,7 +51,8 @@ Release Date: April 1, 2024 - `distsender.rpc.proxy.forward.sent` - `distsender.rpc.proxy.forward.err` - Cockroach Labs recommends monitoring and alerting on `distsender.rpc.proxy.sent`, because it indicates a possible network partition. [#120239][#120239] + Cockroach Labs recommends monitoring and alerting on `distsender.rpc.proxy.sent`, because it indicates a possible network partition. [#120239][#120239] + - The `provisioned-rate` field of a node's store specification can no longer be used to add constraints for the disk name or bandwidth. By default, bandwidth is constrained according to the [cluster setting]({% link v24.1/cluster-settings.md %}) `kv.store.admission.provisioned_bandwidth`. To override this setting for a specific node, the storage specification must contain `provisioned-rate=bandwidth={bandwidth-bytes/s}`. [#120895][#120895] - Removal of the [cluster setting]({% link v24.1/cluster-settings.md %}) `kv.rangefeed.scheduler.enabled`, which was announced in [v24.1.0-alpha.1](https://www.cockroachlabs.com/docs/releases/v24.1.html#v24-1-0-alpha-1), has been reverted, and the cluster setting is reinstated. [#121164][#121164] From b0458a53d28a01e1403cf606e119982024ecfb84 Mon Sep 17 00:00:00 2001 From: Amruta Ranade <11484018+Amruta-Ranade@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:12:00 -0400 Subject: [PATCH 15/34] v24.1.0 beta.2 Release Notes (#18494) * Initial commit * Edits * removed a non-user-impacting note * Worked on feedback --- src/current/_data/releases.yml | 27 +++++++++++++++++++ src/current/_data/versions.csv | 2 +- .../releases/v24.1/v24.1.0-beta.2.md | 24 +++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/current/_includes/releases/v24.1/v24.1.0-beta.2.md diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index 3d38d1c4849..eb92170f17f 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5870,3 +5870,30 @@ docker_arm_limited_access: false source: true previous_release: v23.1.18 + +- release_name: v24.1.0-beta.2 + major_version: v24.1 + release_date: '2024-04-24' + release_type: Testing + go_version: go1.22.0 + sha: 12af023ec2182c66a6e2cae940205536b3ead55c + has_sql_only: true + has_sha256sum: true + mac: + mac_arm: true + mac_arm_experimental: true + mac_arm_limited_access: true + windows: true + linux: + linux_arm: true + linux_arm_experimental: false + linux_arm_limited_access: false + linux_intel_fips: true + linux_arm_fips: false + docker: + docker_image: cockroachdb/cockroach-unstable + docker_arm: true + docker_arm_experimental: false + docker_arm_limited_access: false + source: true + previous_release: v24.1.0-beta.1 diff --git a/src/current/_data/versions.csv b/src/current/_data/versions.csv index 88f1f7cad56..3bc76b54574 100644 --- a/src/current/_data/versions.csv +++ b/src/current/_data/versions.csv @@ -13,4 +13,4 @@ v22.1,2022-05-24,2023-05-24,2023-11-24,v21.2,release-22.1 v22.2,2022-12-05,2023-12-05,2024-06-05,v22.1,release-22.2 v23.1,2023-05-15,2024-05-15,2024-11-15,v22.2,release-23.1 v23.2,2024-02-05,2025-02-05,2025-08-05,v23.1,release-23.2 -v24.1,N/A,N/A,N/A,v23.2,master +v24.1,N/A,N/A,N/A,v23.2,release-24.1 diff --git a/src/current/_includes/releases/v24.1/v24.1.0-beta.2.md b/src/current/_includes/releases/v24.1/v24.1.0-beta.2.md new file mode 100644 index 00000000000..6f5a9f0a481 --- /dev/null +++ b/src/current/_includes/releases/v24.1/v24.1.0-beta.2.md @@ -0,0 +1,24 @@ +## v24.1.0-beta.2 + +Release Date: April 24, 2024 + +{% include releases/release-downloads-docker-image.md release=include.release %} + +

Security updates

+ +- Added the [cluster setting]({% link v24.1/cluster-settings.md %}) `security.client_cert.subject_required.enabled` that enforces a mandatory requirement for the client certificate's role subject to be set. The subject can be defined through either the subject role option or by specifying the `root-cert-distinguished-name` and `node-cert-distinguished-name` properties. This setting applies to both RPC access and login via authCert. [#122368][#122368] + +

Bug fixes

+ +- Fixed a bug where table statistics were sometimes not collected on tables that have virtual [computed columns]({% link v24.1/computed-columns.md %}) of a user-defined type when the `sql.stats.virtual_computed_columns.enabled` cluster setting is enabled. The setting was introduced in v23.2.4 and is disabled by default. Only clusters running v23.2.4 with the non-default setting are affected. [#122320][#122320] + +
+ +

Contributors

+ +This release includes 52 merged PRs by 28 authors. + +
+ +[#122320]: https://github.com/cockroachdb/cockroach/pull/122320 +[#122368]: https://github.com/cockroachdb/cockroach/pull/122368 From dcab056a1bae5338479fbab8218140d4c0eba5ab Mon Sep 17 00:00:00 2001 From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com> Date: Fri, 26 Apr 2024 11:33:26 -0400 Subject: [PATCH 16/34] Remove config profile flags from pcr and update responses from show virtual cluster (#18488) --- .../interface-virtual-cluster.md | 2 +- .../interface-virtual-cluster.md | 4 +- .../show-virtual-cluster-data-state.md | 2 +- .../show-virtual-cluster-responses.md | 7 +- src/current/v23.2/create-virtual-cluster.md | 2 +- src/current/v23.2/cutover-replication.md | 14 +- ...physical-cluster-replication-monitoring.md | 2 +- .../physical-cluster-replication-overview.md | 4 +- .../set-up-physical-cluster-replication.md | 24 +-- src/current/v23.2/show-virtual-cluster.md | 2 +- .../v23.2/work-with-virtual-clusters.md | 4 +- src/current/v24.1/alter-virtual-cluster.md | 8 +- src/current/v24.1/create-virtual-cluster.md | 14 +- src/current/v24.1/cutover-replication.md | 44 +++--- src/current/v24.1/drop-virtual-cluster.md | 4 +- ...physical-cluster-replication-monitoring.md | 19 ++- .../physical-cluster-replication-overview.md | 18 +-- .../set-up-physical-cluster-replication.md | 144 ++++++++---------- src/current/v24.1/show-virtual-cluster.md | 33 +++- .../v24.1/work-with-virtual-clusters.md | 9 +- 20 files changed, 184 insertions(+), 176 deletions(-) diff --git a/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md b/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md index 96c5ddd74ab..8fb43c6ee1c 100644 --- a/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md +++ b/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md @@ -1,2 +1,2 @@ -- The system virtual cluster manages the cluster's control plane and the replication of the cluster's data. Admins connect to the system virtual cluster to configure and manage the underlying CockroachDB cluster, set up physical cluster replication, create and manage a virtual clusters, and observe metrics and logs for the CockroachDB cluster and each virtual cluster. +- The system virtual cluster manages the cluster's control plane and the replication of the cluster's data. Admins connect to the system virtual cluster to configure and manage the underlying CockroachDB cluster, set up physical cluster replication, create and manage a virtual cluster, and observe metrics and logs for the CockroachDB cluster and each virtual cluster. - Each other virtual cluster manages its own data plane. Users connect to a virtual cluster by default, rather than the system virtual cluster. To connect to the system virtual cluster, the connection string must be modified. Virtual clusters contain user data and run application workloads. When physical cluster replication is enabled, the non-system virtual cluster on both primary and secondary clusters is named `application`. diff --git a/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md b/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md index 96c5ddd74ab..aaca2fd0cb0 100644 --- a/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md +++ b/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md @@ -1,2 +1,2 @@ -- The system virtual cluster manages the cluster's control plane and the replication of the cluster's data. Admins connect to the system virtual cluster to configure and manage the underlying CockroachDB cluster, set up physical cluster replication, create and manage a virtual clusters, and observe metrics and logs for the CockroachDB cluster and each virtual cluster. -- Each other virtual cluster manages its own data plane. Users connect to a virtual cluster by default, rather than the system virtual cluster. To connect to the system virtual cluster, the connection string must be modified. Virtual clusters contain user data and run application workloads. When physical cluster replication is enabled, the non-system virtual cluster on both primary and secondary clusters is named `application`. +- The system virtual cluster manages the cluster's control plane and the replication of the cluster's data. Admins connect to the system virtual cluster to configure and manage the underlying CockroachDB cluster, set up physical cluster replication, create and manage a virtual cluster, and observe metrics and logs for the CockroachDB cluster and each virtual cluster. +- Each other virtual cluster manages its own data plane. Users connect to a virtual cluster by default, rather than the system virtual cluster. To connect to the system virtual cluster, the connection string must be modified. Virtual clusters contain user data and run application workloads. When physical cluster replication is enabled, the non-system virtual cluster on both primary and secondary clusters is named `main`. diff --git a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md index a39bef0fe3e..c0a3163e8f3 100644 --- a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md +++ b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md @@ -5,5 +5,5 @@ State | Description `replicating` | The replication job has started and is replicating data. `replication paused` | The replication job is paused due to an error or a manual request with [`ALTER VIRTUAL CLUSTER ... PAUSE REPLICATION`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}). `replication pending cutover` | The replication job is running and the cutover time has been set. Once the the replication reaches the cutover time, the cutover will begin automatically. -`replication cutting over` | The job has started cutting over. The cutover time can no longer be changed. Once cutover is complete, A virtual cluster will be available for use with [`ALTER VIRTUAL CLUSTER ... START SHARED SERVICE`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}). +`replication cutting over` | The job has started cutting over. The cutover time can no longer be changed. Once cutover is complete, a virtual cluster will be available for use with [`ALTER VIRTUAL CLUSTER ... START SHARED SERVICE`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}). `replication error` | An error has occurred. You can find more detail in the error message and the logs. diff --git a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md index a537bc94939..545fc73058c 100644 --- a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md +++ b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md @@ -3,12 +3,13 @@ Field | Response `id` | The ID of a virtual cluster. `name` | The name of the standby (destination) virtual cluster. `data_state` | The state of the data on a virtual cluster. This can show one of the following: `initializing replication`, `ready`, `replicating`, `replication paused`, `replication pending cutover`, `replication cutting over`, `replication error`. Refer to [Data state](#data-state) for more detail on each response. -`service_mode` | The service mode shows whether a virtual cluster is ready to accept SQL requests. This can show one `none` or `shared`. When `shared`, a virtual cluster's SQL connections will be served by the same nodes that are serving the system virtual cluster. +`service_mode` | The service mode shows whether a virtual cluster is ready to accept SQL requests. This can show `none` or `shared`. When `shared`, a virtual cluster's SQL connections will be served by the same nodes that are serving the system virtual cluster. `source_tenant_name` | The name of the primary (source) virtual cluster. `source_cluster_uri` | The URI of the primary (source) cluster. The standby cluster connects to the primary cluster using this URI when [starting a replication stream]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#step-4-start-replication). -`replication_job_id` | The ID of the replication job. -`replicated_time` | The latest timestamp at which the standby cluser has consistent data — that is, the latest time you can cut over to. This time advances automatically as long as the replication proceeds without error. `replicated_time` is updated periodically (every `30s`). +`replicated_time` | The latest timestamp at which the standby cluster has consistent data — that is, the latest time you can cut over to. This time advances automatically as long as the replication proceeds without error. `replicated_time` is updated periodically (every `30s`). `retained_time` | The earliest timestamp at which the standby cluster has consistent data — that is, the earliest time you can cut over to. +`replication_lag` | The time between the most up-to-date replicated time and the actual time. Refer to the [Technical Overview]({% link {{ page.version.version }}/physical-cluster-replication-technical-overview.md %}) for more detail. `cutover_time` | The time at which the cutover will begin. This can be in the past or the future. Refer to [Cut over to a point in time]({% link {{ page.version.version }}/cutover-replication.md %}#cut-over-to-a-point-in-time). +`status` | The status of the replication stream. This can show one of the following: `initializing replication`, `ready`, `replicating`, `replication paused`, `replication pending cutover`, `replication cutting over`, `replication error`. Refer to [Data state](#data-state) for more detail on each response. `capability_name` | The [capability]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) name. `capability_value` | Whether the [capability]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) is enabled for a virtual cluster. diff --git a/src/current/v23.2/create-virtual-cluster.md b/src/current/v23.2/create-virtual-cluster.md index 52a9214901c..377a280cf4a 100644 --- a/src/current/v23.2/create-virtual-cluster.md +++ b/src/current/v23.2/create-virtual-cluster.md @@ -57,7 +57,7 @@ When you [initiate a replication stream]({% link {{ page.version.version }}/set- {% include_cached copy-clipboard.html %} ~~~ -'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt' +'postgresql://{replication user}:{password}@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt' ~~~ To form a connection string similar to the example, include the following values and query parameters. Replace values in `{...}` with the appropriate values for your configuration: diff --git a/src/current/v23.2/cutover-replication.md b/src/current/v23.2/cutover-replication.md index b6da91cf3de..1f767452159 100644 --- a/src/current/v23.2/cutover-replication.md +++ b/src/current/v23.2/cutover-replication.md @@ -44,9 +44,9 @@ SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; {% include_cached copy-clipboard.html %} ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ------+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------- - 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL + id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time +-----+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------- + 5 | application | replicating | none | application | postgresql://user:redacted@host?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL ~~~ Run the following from the standby cluster's SQL shell to start the cutover: @@ -82,7 +82,7 @@ The `retained_time` response provides the earliest time to which you can cut ove ~~~ id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- -3 | application | replicating | none | application | postgresql://{user}:redacted@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL +3 | application | replicating | none | application | postgresql://{user}:redacted@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL (1 row) ~~~ @@ -117,9 +117,9 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; ~~~ ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time - -----+---------------------+-----------------------------+--------------+--------------------+-------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------------------------- - 4 | application | replication pending cutover | none | application | postgresql://user:redacted@3ip:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 903895265809498113 | 2023-09-28 17:41:18.03092+00 | 2023-09-28 16:09:04.327473+00 | 1695922878030920020.0000000000 + id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time + -----+---------------------+-----------------------------+--------------+--------------------+---------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------------------------- + 4 | application | replication pending cutover | none | application | postgresql://{user}:{password}@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 903895265809498113 | 2023-09-28 17:41:18.03092+00 | 2023-09-28 16:09:04.327473+00 | 1695922878030920020.0000000000 (1 row) ~~~ diff --git a/src/current/v23.2/physical-cluster-replication-monitoring.md b/src/current/v23.2/physical-cluster-replication-monitoring.md index bf0c8075833..a99e1b6547c 100644 --- a/src/current/v23.2/physical-cluster-replication-monitoring.md +++ b/src/current/v23.2/physical-cluster-replication-monitoring.md @@ -35,7 +35,7 @@ Refer to [Responses](#responses) for a description of each field. ~~~ id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- -3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL +3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL (1 row) ~~~ diff --git a/src/current/v23.2/physical-cluster-replication-overview.md b/src/current/v23.2/physical-cluster-replication-overview.md index 5f90783055e..4c904174d4c 100644 --- a/src/current/v23.2/physical-cluster-replication-overview.md +++ b/src/current/v23.2/physical-cluster-replication-overview.md @@ -91,14 +91,14 @@ To connect to a virtualized cluster using the SQL shell: {% include_cached copy-clipboard.html %} ~~~ shell - cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs" + cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs" ~~~ - For the application virtual cluster, include the `options=-ccluster=application` parameter in the `postgresql` connection URL: {% include_cached copy-clipboard.html %} ~~~ shell - cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" --certs-dir "certs" + cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=application&sslmode=verify-full" --certs-dir "certs" ~~~ {{site.data.alerts.callout_info}} diff --git a/src/current/v23.2/set-up-physical-cluster-replication.md b/src/current/v23.2/set-up-physical-cluster-replication.md index 4259f4d5a19..1d97e29a142 100644 --- a/src/current/v23.2/set-up-physical-cluster-replication.md +++ b/src/current/v23.2/set-up-physical-cluster-replication.md @@ -78,7 +78,7 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`] {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -147,7 +147,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi {% include_cached copy-clipboard.html %} ~~~ shell - cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" + cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" ~~~ Replace `{node_advertise_address}` and `{node_advertise_port}` with a node's [`--advertise-addr`]({% link {{ page.version.version }}/cockroach-start.md %}#flags-advert-addr) IP address or hostname and port. @@ -165,7 +165,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi {% include_cached copy-clipboard.html %} ~~~ shell - cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" + cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" ~~~ 1. To connect to the primary cluster's application virtual cluster, use the `ccluster=application` parameter: @@ -173,7 +173,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=application&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -219,7 +219,7 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`] {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -310,7 +310,7 @@ The system virtual cluster in the standby cluster initiates and controls the rep ~~~ sql CREATE VIRTUAL CLUSTER application LIKE template FROM REPLICATION OF application - ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt'; + ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt'; ~~~ {% include {{ page.version.version }}/physical-replication/like-description.md %} @@ -356,9 +356,9 @@ The system virtual cluster in the standby cluster initiates and controls the rep {% include_cached copy-clipboard.html %} ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time - ---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- - 3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL + id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time + ---+--------------------+--------------------+--------------+--------------------+---------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- + 3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL (1 row)s ~~~ @@ -372,9 +372,9 @@ For additional detail on the standard CockroachDB connection parameters, refer t Cluster | Interface | Usage | URL and Parameters --------+-----------+-------+------------+---- -Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. -Primary | Application | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`

{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:

  • `options=-ccluster=application`
  • `sslmode=verify-full`
  • `sslrootcert={path}/certs/ca.crt`
  • `sslcert={path}/certs/client.root.crt`
  • `sslkey={path}/certs/client.root.key`
-Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. +Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. +Primary | Application | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`

{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:

  • `options=-ccluster=application`
  • `sslmode=verify-full`
  • `sslrootcert={path}/certs/ca.crt`
  • `sslcert={path}/certs/client.root.crt`
  • `sslkey={path}/certs/client.root.key`
+Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. ## What's next diff --git a/src/current/v23.2/show-virtual-cluster.md b/src/current/v23.2/show-virtual-cluster.md index 761c3f2ae41..a10395705a9 100644 --- a/src/current/v23.2/show-virtual-cluster.md +++ b/src/current/v23.2/show-virtual-cluster.md @@ -77,7 +77,7 @@ SHOW VIRTUAL CLUSTER application; ~~~ id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time -----+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------- - 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL + 5 | application | replicating | none | application | postgresql://user:redacted@host?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL ~~~ ### Show replication status diff --git a/src/current/v23.2/work-with-virtual-clusters.md b/src/current/v23.2/work-with-virtual-clusters.md index 8ec5cc4409f..972b00508b7 100644 --- a/src/current/v23.2/work-with-virtual-clusters.md +++ b/src/current/v23.2/work-with-virtual-clusters.md @@ -34,7 +34,7 @@ For example: {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ -"postgresql://root@{node IP or hostname}:26257/?options=-options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \ +"postgresql://root@{node IP or hostname}:26257?options=-options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -58,7 +58,7 @@ For example, to connect to the system virtual cluster using the `cockroach sql` {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ -"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ +"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ diff --git a/src/current/v24.1/alter-virtual-cluster.md b/src/current/v24.1/alter-virtual-cluster.md index 3253008dc52..8c63dbf8632 100644 --- a/src/current/v24.1/alter-virtual-cluster.md +++ b/src/current/v24.1/alter-virtual-cluster.md @@ -60,7 +60,7 @@ To start the [cutover]({% link {{ page.version.version }}/cutover-replication.md {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO {cutover time specification}; +ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO {cutover time specification}; ~~~ You can use either: @@ -74,7 +74,7 @@ You can change the retention window to protect data from [garbage collection]({% {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application SET REPLICATION RETENTION = '24h'; +ALTER VIRTUAL CLUSTER main SET REPLICATION RETENTION = '24h'; ~~~ {% include {{ page.version.version }}/physical-replication/retention.md %} @@ -85,14 +85,14 @@ When a virtual cluster is [`ready`]({% link {{ page.version.version }}/show-virt {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application START SHARED SERVICE; +ALTER VIRTUAL CLUSTER main START SHARED SERVICE; ~~~ To stop the `shared` service for a virtual cluster and prevent it from accepting SQL connections: {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application STOP SERVICE; +ALTER VIRTUAL CLUSTER main STOP SERVICE; ~~~ ## See also diff --git a/src/current/v24.1/create-virtual-cluster.md b/src/current/v24.1/create-virtual-cluster.md index 44b989c75a5..1f886e276f3 100644 --- a/src/current/v24.1/create-virtual-cluster.md +++ b/src/current/v24.1/create-virtual-cluster.md @@ -57,7 +57,7 @@ When you [initiate a replication stream]({% link {{ page.version.version }}/set- {% include_cached copy-clipboard.html %} ~~~ -'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt' +'postgresql://{replication user}:{password}@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt' ~~~ To form a connection string similar to the example, include the following values and query parameters. Replace values in `{...}` with the appropriate values for your configuration: @@ -77,20 +77,20 @@ Value | Description Cockroach Labs does not recommend changing the default capabilities of created virtual clusters. {{site.data.alerts.end}} -_Capabilities_ control what a virtual cluster can do. The [configuration profile]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#start-the-standby-cluster) included at startup creates the `template` virtual cluster with the same set of capabilities per CockroachDB version. When you start a replication stream, you can specify the `template` VC with `LIKE` to ensure other virtual clusters on the standby cluster will work in the same way. `LIKE` will refer to a virtual cluster on the CockroachDB cluster you're running the statement from. +_Capabilities_ control what a virtual cluster can do. When you start a replication stream, you can specify a virtual cluster with `LIKE` to ensure other virtual clusters on the standby cluster will work in the same way. `LIKE` will refer to a virtual cluster on the CockroachDB cluster you're running the statement from. ## Examples ### Start a replication stream -To start a replication stream to the standby of the primary's application virtual cluster: +To start a replication stream to the standby of the primary's virtual cluster: {% include_cached copy-clipboard.html %} ~~~ sql -CREATE VIRTUAL CLUSTER application LIKE template FROM REPLICATION OF application ON 'postgresql://{connection string to primary}'; +CREATE VIRTUAL CLUSTER main FROM REPLICATION OF main ON 'postgresql://{connection string to primary}'; ~~~ -This will create a virtual cluster in the standby cluster that is based on the `template` virtual cluster, which is created during [cluster startup with `--config-profile`]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#start-the-primary-cluster). The standby's system virtual cluster will connect to the primary cluster to initiate the replication stream job. For detail on the replication stream, refer to the [Responses]({% link {{ page.version.version }}/show-virtual-cluster.md %}#responses) for `SHOW VIRTUAL CLUSTER`. +This will create a `main` virtual cluster in the standby cluster. The standby's system virtual cluster will connect to the primary cluster to initiate the replication stream job. For detail on the replication stream, refer to the [Responses]({% link {{ page.version.version }}/show-virtual-cluster.md %}#responses) for `SHOW VIRTUAL CLUSTER`. ### Specify a retention window for a replication stream @@ -98,10 +98,10 @@ When you initiate a replication stream, you can specify a retention window to pr {% include_cached copy-clipboard.html %} ~~~ sql -CREATE VIRTUAL CLUSTER application LIKE template FROM REPLICATION OF application ON 'postgresql://{connection string to primary}' WITH RETENTION '36h'; +CREATE VIRTUAL CLUSTER main FROM REPLICATION OF main ON 'postgresql://{connection string to primary}' WITH RETENTION '36h'; ~~~ -This will initiate a replication stream from the primary cluster into the standby cluster's new `standbyapplication` virtual cluster. The `RETENTION` option allows you to specify a timestamp in the past for cutover to the standby cluster. After cutover, the `standbyapplication` will be transactionally consistent to any timestamp within that retention window. +This will initiate a replication stream from the primary cluster into the standby cluster's new `main` virtual cluster. The `RETENTION` option allows you to specify a timestamp in the past for cutover to the standby cluster. After cutover, the standby `main` virtual cluster will be transactionally consistent to any timestamp within that retention window. {% include {{ page.version.version }}/physical-replication/retention.md %} diff --git a/src/current/v24.1/cutover-replication.md b/src/current/v24.1/cutover-replication.md index 0ead39ad859..c29b1b1c8b5 100644 --- a/src/current/v24.1/cutover-replication.md +++ b/src/current/v24.1/cutover-replication.md @@ -39,21 +39,22 @@ To view the current replication timestamp, use: {% include_cached copy-clipboard.html %} ~~~ sql -SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; +SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; ~~~ {% include_cached copy-clipboard.html %} ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ------+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------- - 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL + id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status +-----+------+--------------------+-------------------------------------------------+---------------------------------+------------------------+-----------------+--------------+-------------- + 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2024-04-18 10:07:45.000001+00 | 2024-04-18 14:07:45+00 | 00:00:19.602682 | NULL | replicating +(1 row) ~~~ Run the following from the standby cluster's SQL shell to start the cutover: {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO LATEST; +ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO LATEST; ~~~ The `cutover_time` is the timestamp at which the replicated data is consistent. The cluster will revert any data above this timestamp: @@ -73,16 +74,15 @@ To select a [specific time]({% link {{ page.version.version }}/as-of-system-time {% include_cached copy-clipboard.html %} ~~~ sql -SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; +SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; ~~~ The `retained_time` response provides the earliest time to which you can cut over. -{% include_cached copy-clipboard.html %} ~~~ -id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ----+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- -3 | application | replicating | none | application | postgresql://{user}:redacted@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL + id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status +-----+------+--------------------+-------------------------------------------------+-------------------------------+------------------------+-----------------+--------------+-------------- + 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2024-04-18 10:07:45.000001+00 | 2024-04-18 14:07:45+00 | 00:00:19.602682 | NULL | replicating (1 row) ~~~ @@ -90,7 +90,7 @@ Specify a timestamp: {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO SYSTEM TIME '-1h'; +ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO SYSTEM TIME '-1h'; ~~~ Refer to [Using different timestamp formats]({% link {{ page.version.version }}/as-of-system-time.md %}#using-different-timestamp-formats) for more information. @@ -99,13 +99,16 @@ Similarly, to cut over to a specific time in the future: {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO SYSTEM TIME '+5h'; +ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO SYSTEM TIME '+5h'; ~~~ A future cutover will proceed once the replicated data has reached the specified time. {{site.data.alerts.callout_info}} -To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER ... WITH REPLICATION STATUS`]({% link {{ page.version.version }}/show-virtual-cluster.md %}) to find the replication stream's `replication_job_id`, which you can pass to `SHOW JOB WHEN COMPLETE job_id` as the `job_id`. Refer to the `SHOW JOBS` page for [details]({% link {{ page.version.version }}/show-jobs.md %}#parameters) and an [example]({% link {{ page.version.version }}/show-jobs.md %}#show-job-when-complete). +To monitor for when the replication stream completes, do the following: + +1. Find the replication stream's `job_id` using `SELECT * FROM [SHOW JOBS] WHERE job_type = 'REPLICATION STREAM INGESTION';` +1. Run `SHOW JOB WHEN COMPLETE job_id`. Refer to the `SHOW JOBS` page for [details]({% link {{ page.version.version }}/show-jobs.md %}#parameters) and an [example]({% link {{ page.version.version }}/show-jobs.md %}#show-job-when-complete). {{site.data.alerts.end}} ## Step 2. Complete the cutover @@ -114,12 +117,12 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER {% include_cached copy-clipboard.html %} ~~~ sql - SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; + SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; ~~~ ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time - -----+---------------------+-----------------------------+--------------+--------------------+-------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------------------------- - 4 | application | replication pending cutover | none | application | postgresql://user:redacted@3ip:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 903895265809498113 | 2023-09-28 17:41:18.03092+00 | 2023-09-28 16:09:04.327473+00 | 1695922878030920020.0000000000 + id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status + ---+------+--------------------+-------------------------------------------------+-------------------------------+------------------------------+-----------------+--------------------------------+-------------- + 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2023-09-28 16:09:04.327473+00 | 2023-09-28 17:41:18.03092+00 | 00:00:19.602682 | 1695922878030920020.0000000000 | replication pending cutover (1 row) ~~~ @@ -129,15 +132,14 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER {% include_cached copy-clipboard.html %} ~~~ sql - ALTER VIRTUAL CLUSTER application START SERVICE SHARED; + ALTER VIRTUAL CLUSTER main START SERVICE SHARED; ~~~ ~~~ id | name | data_state | service_mode -----+---------------------+--------------------+--------------- 1 | system | ready | shared - 2 | template | ready | none - 3 | application | ready | shared + 3 | main | ready | shared (3 rows) ~~~ @@ -145,7 +147,7 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER {% include_cached copy-clipboard.html %} ~~~ sql - SET CLUSTER SETTING server.controller.default_target_cluster='application'; + SET CLUSTER SETTING server.controller.default_target_cluster='main'; ~~~ At this point, the primary and standby clusters are entirely independent. You will need to use your own network load balancers, DNS servers, or other network configuration to direct application traffic to the standby (now primary). To enable physical cluster replication again, from the new primary to the original primary (or a completely different cluster), refer to [Cut back to the primary cluster](#cut-back-to-the-primary-cluster). diff --git a/src/current/v24.1/drop-virtual-cluster.md b/src/current/v24.1/drop-virtual-cluster.md index 03bb7a7de7f..f9471bb839e 100644 --- a/src/current/v24.1/drop-virtual-cluster.md +++ b/src/current/v24.1/drop-virtual-cluster.md @@ -55,7 +55,7 @@ To remove a virtual cluster from a CockroachDB cluster: {% include_cached copy-clipboard.html %} ~~~ sql -DROP VIRTUAL CLUSTER IF EXISTS application; +DROP VIRTUAL CLUSTER IF EXISTS main; ~~~ ### Remove a virtual cluster without waiting for garbage collection @@ -64,7 +64,7 @@ Use `IMMEDIATE` to drop a virtual cluster instead of waiting for data to be garb {% include_cached copy-clipboard.html %} ~~~ sql -DROP VIRTUAL CLUSTER IF EXISTS application IMMEDIATE; +DROP VIRTUAL CLUSTER IF EXISTS main IMMEDIATE; ~~~ ## See also diff --git a/src/current/v24.1/physical-cluster-replication-monitoring.md b/src/current/v24.1/physical-cluster-replication-monitoring.md index 2a3c4e62d0b..c4dd13f4082 100644 --- a/src/current/v24.1/physical-cluster-replication-monitoring.md +++ b/src/current/v24.1/physical-cluster-replication-monitoring.md @@ -26,16 +26,15 @@ In the standby cluster's SQL shell, you can query `SHOW VIRTUAL CLUSTER ... WITH {% include_cached copy-clipboard.html %} ~~~ sql -SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; +SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; ~~~ Refer to [Responses](#responses) for a description of each field. -{% include_cached copy-clipboard.html %} ~~~ -id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ----+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- -3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL +id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status +---+------+--------------------+-------------------------------------------------+-------------------------------+------------------------------+-----------------+--------------------------------+-------------- +3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2023-09-28 16:09:04.327473+00 | 2023-09-28 17:41:18.03092+00 | 00:00:19.602682 | 1695922878030920020.0000000000 | replicating (1 row) ~~~ @@ -109,7 +108,7 @@ To verify that the data at a certain point in time is correct on the standby clu {% include_cached copy-clipboard.html %} ~~~ sql - SELECT replicated_time FROM [SHOW VIRTUAL CLUSTER standbyapplication WITH REPLICATION STATUS]; + SELECT replicated_time FROM [SHOW VIRTUAL CLUSTER standbymain WITH REPLICATION STATUS]; ~~~ ~~~ replicated_time @@ -124,12 +123,12 @@ To verify that the data at a certain point in time is correct on the standby clu {% include_cached copy-clipboard.html %} ~~~ sql - SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER application] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00'; + SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER main] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00'; ~~~ ~~~ tenant_name | end_ts | fingerprint ------------+--------------------------------+---------------------- - application | 1704816945291575000.0000000000 | 2646132238164576487 + main | 1704816945291575000.0000000000 | 2646132238164576487 (1 row) ~~~ @@ -139,12 +138,12 @@ To verify that the data at a certain point in time is correct on the standby clu {% include_cached copy-clipboard.html %} ~~~ sql - SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER standbyapplication] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00'; + SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER standbymain] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00'; ~~~ ~~~ tenant_name | end_ts | fingerprint --------------------+--------------------------------+---------------------- - standbyapplication | 1704816945291575000.0000000000 | 2646132238164576487 + standbymain | 1704816945291575000.0000000000 | 2646132238164576487 (1 row) ~~~ diff --git a/src/current/v24.1/physical-cluster-replication-overview.md b/src/current/v24.1/physical-cluster-replication-overview.md index 80b1ac8550a..47f10380a97 100644 --- a/src/current/v24.1/physical-cluster-replication-overview.md +++ b/src/current/v24.1/physical-cluster-replication-overview.md @@ -23,7 +23,7 @@ You can use physical cluster replication in a disaster recovery plan to: - Meet your RTO (Recovery Time Objective) and RPO (Recovery Point Objective) requirements. Physical cluster replication provides lower RTO and RPO than [backup and restore]({% link {{ page.version.version }}/backup-and-restore-overview.md %}). - Automatically replicate everything in your primary cluster to recover quickly from a control plane or full cluster failure. -- Protect against region failure when you cannot use individual [multi-region clusters]({% link {{ page.version.version }}/multiregion-overview.md %}) — for example, if you have a two-datacenter architecture and do not have access to three regions; or, you need low-write latency in a single region. Physical cluster replication allows for an active-passive (primary-standby) structure across two clusters with the passive cluster in different region. +- Protect against region failure when you cannot use individual [multi-region clusters]({% link {{ page.version.version }}/multiregion-overview.md %}) — for example, if you have a two-datacenter architecture and do not have access to three regions; or, you need low-write latency in a single region. Physical cluster replication allows for an active-passive (primary-standby) structure across two clusters with the passive cluster in a different region. - Avoid conflicts in data after recovery; the replication completes to a transactionally consistent state as of a certain point in time. ## Features @@ -56,18 +56,18 @@ For more comprehensive guides, refer to: ### Start clusters -To initiate physical cluster replication on clusters, you must [start]({% link {{ page.version.version }}/cockroach-start.md %}) the primary and standby CockroachDB clusters with the `--config-profile` flag. This enables [cluster virtualization]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}) and sets up each cluster ready for replication. +To use physical cluster replication on clusters, you must [initialize]({% link {{ page.version.version }}/cockroach-start.md %}) the primary and standby CockroachDB clusters with the `--virtualized` and `--virtualized-empty` flags respectively. This enables [cluster virtualization]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}) and sets up each cluster ready for replication. The active primary cluster that serves application traffic: ~~~shell -cockroach start ... --config-profile replication-source +cockroach init ... --virtualized ~~~ The passive standby cluster that will ingest the replicated data: ~~~shell -cockroach start ... --config-profile replication-target +cockroach init ... --virtualized-empty ~~~ The node topology of the two clusters does not need to be the same. For example, you can provision the standby cluster with fewer nodes. However, consider that: @@ -91,14 +91,14 @@ To connect to a virtualized cluster using the SQL shell: {% include_cached copy-clipboard.html %} ~~~ shell - cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs" + cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs" ~~~ -- For the application virtual cluster, include the `options=-ccluster=application` parameter in the `postgresql` connection URL: +- For the virtual cluster, include the `options=-ccluster=main` parameter in the `postgresql` connection URL: {% include_cached copy-clipboard.html %} ~~~ shell - cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" --certs-dir "certs" + cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=main&sslmode=verify-full" --certs-dir "certs" ~~~ {{site.data.alerts.callout_info}} @@ -122,11 +122,11 @@ Statement | Action ### Cluster versions and upgrades -The standby cluster host will need to be at the same major version as, or one version ahead of, the primary's application virtual cluster at the time of cutover. +The standby cluster host will need to be at the same major version as, or one version ahead of, the primary's virtual cluster at the time of cutover. To [upgrade]({% link {{ page.version.version }}/upgrade-cockroach-version.md %}) a virtualized cluster, you must carefully and manually apply the upgrade. For details, refer to [Upgrades]({% link {{ page.version.version }}/work-with-virtual-clusters.md %}#upgrade-a-cluster) in the [Cluster Virtualization Overview]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}). -When physical cluster replication is enabled, we recommend following this procedure on the standby cluster first, before upgrading the primary cluster. It is preferable to avoid a situation in which the application virtual cluster, which is being replicated, is a version higher than what the standby cluster can serve if you were to cut over. +When physical cluster replication is enabled, we recommend following this procedure on the standby cluster first, before upgrading the primary cluster. It is preferable to avoid a situation in which the virtual cluster, which is being replicated, is a version higher than what the standby cluster can serve if you were to cut over. ## Demo video diff --git a/src/current/v24.1/set-up-physical-cluster-replication.md b/src/current/v24.1/set-up-physical-cluster-replication.md index 03b30fca72e..f3b6fe0f8db 100644 --- a/src/current/v24.1/set-up-physical-cluster-replication.md +++ b/src/current/v24.1/set-up-physical-cluster-replication.md @@ -34,7 +34,7 @@ The high-level steps in this tutorial are: {% include enterprise-feature.md %} - Two separate CockroachDB clusters (primary and standby) with a minimum of three nodes each, and each using the same CockroachDB {{page.version.version}} version. - - To set up each cluster, you can follow [Deploy CockroachDB on Premises]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}). When you start each node in your cluster with the `cockroach start` command, you **must** pass the `--config-profile` flag with a `replication` value. Refer to cluster creation steps for the [primary cluster](#start-the-primary-cluster) and for the [standby cluster](#start-the-standby-cluster) for details. + - To set up each cluster, you can follow [Deploy CockroachDB on Premises]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}). When you initialize the cluster with the [`cockroach init`]({% link {{ page.version.version }}/cockroach-init.md %}) command, you **must** pass the `--virtualized` or `--virtualized-empty` flag. Refer to the cluster creation steps for the [primary cluster](#initialize-the-primary-cluster) and for the [standby cluster](#initialize-the-standby-cluster) for details. - The [Deploy CockroachDB on Premises]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}) tutorial creates a self-signed certificate for each {{ site.data.products.core }} cluster. To create certificates signed by an external certificate authority, refer to [Create Security Certificates using OpenSSL]({% link {{ page.version.version }}/create-security-certificates-openssl.md %}). - All nodes in each cluster will need access to the Certificate Authority for the other cluster. Refer to [Copy certificates](#step-3-copy-certificates). - An [{{ site.data.products.enterprise }} license]({% link {{ page.version.version }}/enterprise-licensing.md %}) on the primary **and** standby clusters. You must use the system virtual cluster on the primary and standby clusters to enable your {{ site.data.products.enterprise }} license. @@ -42,29 +42,17 @@ The high-level steps in this tutorial are: ## Step 1. Create the primary cluster -### Start the primary cluster +### Initialize the primary cluster -To enable physical cluster replication, it is necessary to start each node with the appropriate _configuration profile_ set with the `--config-profile` flag. A configuration profile applies a custom configuration to the server at initialization time. When using physical cluster replication, the `replication-source` and `replication-target` configuration profiles are used to create a virtualized cluster with a system virtual cluster and an application virtual cluster. +To enable physical cluster replication, it is necessary to initialize the CockroachDB cluster with the appropriate flag to create the appropriate virtual clusters on the primary and standby cluster. -The primary cluster requires the following value: +When initializing the [primary cluster](#initialize-the-primary-cluster), you pass the `--virtualized` flag to create a [_virtualized cluster_]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}) with a `system` virtual cluster and a `main` virtual cluster. When initializing the [standby cluster](#initialize-the-standby-cluster), you pass the `--virtualized-empty` flag to create a virtualized standby cluster that contains a `system` virtual cluster. -{% include_cached copy-clipboard.html %} -~~~ shell ---config-profile replication-source -~~~ - -For example, a `cockroach start` command according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes): +For example, the `cockroach init` command to initialize the primary cluster (according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes)): {% include_cached copy-clipboard.html %} ~~~ shell -cockroach start \ ---certs-dir=certs \ ---advertise-addr= \ ---join=,, \ ---cache=.25 \ ---max-sql-memory=.25 \ ---background \ ---config-profile replication-source +cockroach init --certs-dir=certs --host={address of any node on --join list} --virtualized ~~~ Ensure that you follow the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-4-initialize-the-cluster) to initialize your cluster before continuing to set up physical cluster replication. @@ -78,14 +66,14 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`] {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ The prompt will include `system` when you are connected to the system virtual cluster. {{site.data.alerts.callout_info}} - You should only connect to the system virtual cluster for cluster administration. To work with databases, tables, or workloads, connect to the application virtual cluster. + You should only connect to the system virtual cluster for cluster administration. To work with databases, tables, or workloads, connect to a virtual cluster. {{site.data.alerts.end}} 1. Add your cluster organization and [{{ site.data.products.enterprise }} license]({% link {{ page.version.version }}/enterprise-licensing.md %}) to the cluster: @@ -99,6 +87,13 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`] SET CLUSTER SETTING enterprise.license = 'your enterprise license'; ~~~ +1. Set the `kv.rangefeed.enabled` cluster setting to `true`. The replication job connects to a long-lived request, a _rangefeed_, which pushes changes as they happen: + + {% include_cached copy-clipboard.html %} + ~~~ sql + SET CLUSTER SETTING kv.rangefeed.enabled = true; + ~~~ + 1. Confirm the status of your virtual cluster: {% comment %}Link to SQL ref page here{% endcomment %} {% include_cached copy-clipboard.html %} @@ -106,18 +101,17 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`] SHOW VIRTUAL CLUSTERS; ~~~ - The output will include the `system` interface and the `application` virtual cluster: + The output will include the `system` virtual cluster and the `main` virtual cluster: ~~~ - id | name | data_state | service_mode - ---+-------------+------------+--------------- - 1 | system | ready | shared - 2 | template | ready | none - 3 | application | ready | shared - (3 rows) + id | name | data_state | service_mode + -----+--------+------------+--------------- + 1 | system | ready | shared + 3 | main | ready | shared + (2 rows) ~~~ - Because this is the primary cluster rather than the standby cluster, `data_state` of all rows is `ready`, rather than `replicating` or another status.{% comment %}link to SQL reference or monitoring page here{% endcomment %} + Because this is the primary cluster rather than the standby cluster, the `data_state` of all rows is `ready`, rather than `replicating` or another [status]({% link {{ page.version.version }}/physical-cluster-replication-monitoring.md %}). ### Create a replication user and password @@ -130,7 +124,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi CREATE USER {your username} WITH PASSWORD '{your password}'; ~~~ -1. Grant the [`REPLICATION` system privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) to your user: {% comment %}Link to detail on replication system privilege{% endcomment %} +1. Grant the [`REPLICATION` system privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) to your user: {% include_cached copy-clipboard.html %} ~~~ sql @@ -141,19 +135,19 @@ The standby cluster connects to the primary cluster's system virtual cluster usi ### Connect to the primary virtual cluster (optional) -1. If you would like to run a sample workload on the primary's application virtual cluster, open a new terminal window and use [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}) to run the workload. +1. If you would like to run a sample workload on the primary's virtual cluster, open a new terminal window and use [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}) to run the workload. For example, to initiate the [`movr`]({% link {{ page.version.version }}/movr.md %}) workload: {% include_cached copy-clipboard.html %} ~~~ shell - cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" + cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=main&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" ~~~ Replace `{node_advertise_address}` and `{node_advertise_port}` with a node's [`--advertise-addr`]({% link {{ page.version.version }}/cockroach-start.md %}#flags-advert-addr) IP address or hostname and port. {% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need: - - `options=-ccluster=application` + - `options=-ccluster=main` - `sslmode=verify-full` - `sslrootcert={path}/certs/ca.crt`: the path to the CA certificate. - `sslcert={path}/certs/client.root.crt`: the path to the client certificate. @@ -165,21 +159,21 @@ The standby cluster connects to the primary cluster's system virtual cluster usi {% include_cached copy-clipboard.html %} ~~~ shell - cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" + cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=main&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" ~~~ -1. To connect to the primary cluster's application virtual cluster, use the `ccluster=application` parameter: +1. To connect to the primary cluster's virtual cluster, use the `options=-ccluster={virtual_cluster_name}` parameter: {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=main&sslmode=verify-full" \ --certs-dir "certs" ~~~ - The prompt will include `application` when you are connected to the application virtual cluster. + The prompt will include `main` when you are connected to the virtual cluster. -1. Create a user for your primary cluster's application virtual cluster: +1. Create a user for your primary cluster's `main` virtual cluster: {% include_cached copy-clipboard.html %} ~~~ sql @@ -190,22 +184,15 @@ The standby cluster connects to the primary cluster's system virtual cluster usi ## Step 2. Create the standby cluster -### Start the standby cluster +### Initialize the standby cluster -Similarly to the primary cluster, each node on the standby cluster must be started with the `--config-profile` flag set to `replication-target`. This creates a _virtualized cluster_ with a system virtual cluster and an application virtual cluster, and sets up all the required configuration for starting a replication stream. +Similarly to the primary cluster, you must initialize the standby cluster with the `--virtualized-empty` flag. This creates a _virtualized cluster_ with a system virtual cluster. -For example, a `cockroach start` command according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes): +For example, the `cockroach init` command to initialize the standby cluster (according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes)): {% include_cached copy-clipboard.html %} ~~~ shell -cockroach start \ ---certs-dir=certs \ ---advertise-addr= \ ---join=,, \ ---cache=.25 \ ---max-sql-memory=.25 \ ---background \ ---config-profile replication-target +cockroach init --certs-dir=certs --host={address of any node on --join list} --virtualized-empty ~~~ Ensure that you follow the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-4-initialize-the-cluster) to initialize your cluster before continuing to set up physical cluster replication. @@ -219,7 +206,7 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`] {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -236,6 +223,15 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`] SET CLUSTER SETTING enterprise.license = 'your enterprise license'; ~~~ +1. Set the `kv.rangefeed.enabled` cluster setting to `true`. The replication job connects to a long-lived request, a _rangefeed_, which pushes changes as they happen: + + {% include_cached copy-clipboard.html %} + ~~~ sql + SET CLUSTER SETTING kv.rangefeed.enabled = true; + ~~~ + + {% comment %}While not strictly needed, it is necessary if a user then replicates from the promoted standby to the original primary. Add a note on this once the fast cutback work is published.{% endcomment %} + 1. Confirm the status of your virtual cluster: {% include_cached copy-clipboard.html %} @@ -243,18 +239,15 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`] SHOW VIRTUAL CLUSTERS; ~~~ - The output will show the `system` interface, but no `application` virtual cluster: + The output will show the `system` virtual cluster, but no `main` virtual cluster: ~~~ id | name | data_state | service_mode ---+----------+------------+--------------- 1 | system | ready | shared - 2 | template | ready | none - (2 rows) + (1 rows) ~~~ - {% include {{ page.version.version }}/physical-replication/template-description.md %} - ### Create a user for the standby cluster If you would like to access the [DB Console]({% link {{ page.version.version }}/ui-overview.md %}) to observe your replication, you will need to create a user: @@ -308,13 +301,11 @@ The system virtual cluster in the standby cluster initiates and controls the rep {% include_cached copy-clipboard.html %} ~~~ sql - CREATE VIRTUAL CLUSTER application LIKE template - FROM REPLICATION OF application - ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt'; + CREATE VIRTUAL CLUSTER main + FROM REPLICATION OF main + ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt'; ~~~ - {% include {{ page.version.version }}/physical-replication/like-description.md %} - Once the standby cluster has made a connection to the primary cluster, the standby will pull the topology of the primary cluster and will distribute the replication work across all nodes in the primary and standby. 1. To view all virtual clusters on the standby, run: @@ -324,15 +315,14 @@ The system virtual cluster in the standby cluster initiates and controls the rep SHOW VIRTUAL CLUSTERS; ~~~ - The standby cluster will show the `application` virtual cluster is in a `replicating` state. + The standby cluster will show the `main` virtual cluster is in a `replicating` state. ~~~ - id | name | data_state | service_mode - ---+--------------------+--------------------+--------------- - 1 | system | ready | shared - 2 | template | ready | none - 3 | application | replicating | none - (3 rows) + id | name | data_state | service_mode + -----+--------+-------------+--------------- + 1 | system | ready | shared + 3 | main | replicating | none + (2 rows) ~~~ The standby cluster's virtual cluster is offline while the replication stream is running. To bring it online, you must explicitly [start its service after cutover]({% link {{ page.version.version }}/cutover-replication.md %}#step-2-complete-the-cutover). @@ -341,25 +331,25 @@ The system virtual cluster in the standby cluster initiates and controls the rep {% include_cached copy-clipboard.html %} ~~~ sql - ALTER VIRTUAL CLUSTER application PAUSE REPLICATION; + ALTER VIRTUAL CLUSTER main PAUSE REPLICATION; ~~~ {% include_cached copy-clipboard.html %} ~~~ sql - ALTER VIRTUAL CLUSTER application RESUME REPLICATION; + ALTER VIRTUAL CLUSTER main RESUME REPLICATION; ~~~ {% include_cached copy-clipboard.html %} ~~~ sql - SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; + SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; ~~~ {% include_cached copy-clipboard.html %} ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time - ---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- - 3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL - (1 row)s + id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status + ---+------+--------------------+--------------------------------------------------------+-------------------------------+------------------------+-----------------+--------------+-------------- + 3 | main | main | postgresql://user@{node IP or hostname}:26257?redacted | 2024-04-17 20:14:31.952783+00 | 2024-04-17 20:18:50+00 | 00:00:08.738176 | NULL | replicating + (1 row) ~~~ With the replication stream running, you can monitor the job via the DB Console, SQL shell, or Prometheus. You can also verify data is correct on the standby cluster at a specific point in time. For more detail, refer to [Physical Cluster Replication Monitoring]({% link {{ page.version.version }}/physical-cluster-replication-monitoring.md %}). @@ -370,11 +360,11 @@ This table outlines the connection strings you will need for this setup tutorial For additional detail on the standard CockroachDB connection parameters, refer to [Client Connection Parameters]({% link {{ page.version.version }}/connection-parameters.md %}#connect-using-a-url). -Cluster | Interface | Usage | URL and Parameters +Cluster | Virtual Cluster | Usage | URL and Parameters --------+-----------+-------+------------+---- -Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. -Primary | Application | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`

{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:

  • `options=-ccluster=application`
  • `sslmode=verify-full`
  • `sslrootcert={path}/certs/ca.crt`
  • `sslcert={path}/certs/client.root.crt`
  • `sslkey={path}/certs/client.root.key`
-Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. +Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. +Primary | Main | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}?options=-ccluster=main&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`

{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:

  • `options=-ccluster={virtual_cluster_name}`
  • `sslmode=verify-full`
  • `sslrootcert={path}/certs/ca.crt`
  • `sslcert={path}/certs/client.root.crt`
  • `sslkey={path}/certs/client.root.key`
+Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. ## What's next diff --git a/src/current/v24.1/show-virtual-cluster.md b/src/current/v24.1/show-virtual-cluster.md index 185bc876e20..a257fd92887 100644 --- a/src/current/v24.1/show-virtual-cluster.md +++ b/src/current/v24.1/show-virtual-cluster.md @@ -49,8 +49,19 @@ This table lists all possible responses from the different `SHOW VIRTUAL CLUSTER {% include {{ page.version.version }}/physical-replication/show-virtual-cluster-responses.md %} +{{site.data.alerts.callout_success}} +To find the job ID for the replication stream, use the [`SHOW JOBS`]({% link {{ page.version.version }}/show-jobs.md %}) statement. For example: + +{% include_cached copy-clipboard.html %} +~~~ sql +SELECT * FROM [SHOW JOBS] WHERE job_type = 'REPLICATION STREAM INGESTION'; +~~~ +{{site.data.alerts.end}} + ### Data state +The `data_state` and `status` fields show the current state of a virtual cluster's data and progress of the replication stream job. + {% include {{ page.version.version }}/physical-replication/show-virtual-cluster-data-state.md %} ## Examples @@ -66,22 +77,22 @@ SHOW VIRTUAL CLUSTERS; ### Show a virtual cluster -To show more details about the `application` virtual cluster: +To show more details about the `main` virtual cluster: {% include_cached copy-clipboard.html %} ~~~ sql -SHOW VIRTUAL CLUSTER application; +SHOW VIRTUAL CLUSTER main; ~~~ {% include_cached copy-clipboard.html %} ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ------+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------- - 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL + id | name | data_state | service_mode +-----+------+-------------+--------------- + 3 | main | replicating | none +(1 row) ~~~ ### Show replication status -{% comment %}this code block and output could be in an include. This is in several place e.g., cutover page, monitoring{% endcomment %} To show the replication status of all virtual clusters: @@ -90,11 +101,17 @@ To show the replication status of all virtual clusters: SHOW VIRTUAL CLUSTERS WITH REPLICATION STATUS; ~~~ -To show the replication status of the `application` virtual cluster: +To show the replication status of the `main` virtual cluster: {% include_cached copy-clipboard.html %} ~~~ sql -SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; +SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; +~~~ +~~~ + id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status +-----+------+--------------------+-----------------------------------------------+-------------------------------+------------------------+-----------------+--------------+-------------- + 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2024-04-18 10:07:45.000001+00 | 2024-04-18 14:07:45+00 | 00:00:19.602682 | NULL | replicating +(1 row) ~~~ ## See also diff --git a/src/current/v24.1/work-with-virtual-clusters.md b/src/current/v24.1/work-with-virtual-clusters.md index 8ec5cc4409f..d047f0bb0e7 100644 --- a/src/current/v24.1/work-with-virtual-clusters.md +++ b/src/current/v24.1/work-with-virtual-clusters.md @@ -16,7 +16,7 @@ docs_area: deploy This section shows how to use [SQL clients](#sql-clients) or the [DB Console](#db-console) to connect to a virtual cluster. {% capture pcr_application_cluster_note %} -When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the virtual cluster is named `application`. +When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the virtual cluster is named `main`. {% endcapture %} {{ pcr_application_cluster_note }} @@ -25,7 +25,7 @@ When [Physical Cluster Replication]({% link {{ page.version.version }}/physical- This section shows how to connect using [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}) when cluster virtualization is enabled. -Unless you specify which virtual cluster to connect to, when you connect using a SQL client, you are logged into the default virtual cluster. When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the default virtual cluster is named `application`. +Unless you specify which virtual cluster to connect to, when you connect using a SQL client, you are logged into the default virtual cluster. When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the default virtual cluster is named `main`. To connect to a specific virtual cluster, add the `GET` URL parameter `options=-ccluster={virtual_cluster_name}` to the connection URL. Replace `{virtual_cluster_name}` with the name of the virtual cluster. You must use `--url` rather than `--host`. @@ -34,7 +34,7 @@ For example: {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ -"postgresql://root@{node IP or hostname}:26257/?options=-options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \ +"postgresql://root@{node IP or hostname}:26257?options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -58,7 +58,7 @@ For example, to connect to the system virtual cluster using the `cockroach sql` {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ -"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ +"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -70,7 +70,6 @@ Unless you specify which virtual cluster to connect to, when you connect using t To connect to a specific virtual cluster, add the `GET` URL parameter `options=-ccluster={virtual_cluster_name}` to the DB Console URL. Replace `{virtual_cluster_name}` with the name of the virtual cluster. - If the same SQL user has the `admin` role on the system virtual cluster and also has roles on other virtual clusters, that user can switch among them from the top of the DB Console. #### Connect to the system virtual cluster From b378dba5c6d6e8381a0dbc99fc8c399b34054d02 Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Fri, 26 Apr 2024 13:50:00 -0400 Subject: [PATCH 17/34] DOC-9892 PR #120490 - ui: show license expiration alert in Db Console (#18501) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (1) In ui-overview.md, added a section for License expiration message. (2) In licensing-faqs.md, updated Monitor for license expiry section with a link to the new License expiration message section. * Incorporated David’s feedback. * Incorporated Ryan’s feedback. --- src/current/v24.1/licensing-faqs.md | 5 ++++- src/current/v24.1/ui-overview.md | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/current/v24.1/licensing-faqs.md b/src/current/v24.1/licensing-faqs.md index 97fce8eafa6..1b9bd2a5abd 100644 --- a/src/current/v24.1/licensing-faqs.md +++ b/src/current/v24.1/licensing-faqs.md @@ -139,7 +139,10 @@ I171116 18:11:48.279604 1514 sql/event_log.go:102 [client=[::1]:56357,user=root ## Monitor for license expiry -You can monitor the time until your license expires with [Prometheus]({% link {{ page.version.version }}/monitor-cockroachdb-with-prometheus.md %}). The `seconds_until_enterprise_license_expiry` metric reports the number of seconds until the Enterprise license on a cluster expires. It will report 0 if there is no license or a negative number if the license has already expired. For more information, see [Monitoring and Alerting]({% link {{ page.version.version }}/monitoring-and-alerting.md %}). +You can monitor the time until your license expires in two ways: + +1. [DB console]({% link {{ page.version.version }}/ui-overview.md %}): The [license expiration message]({% link {{ page.version.version }}/ui-overview.md %}#license-expiration-message) displays the number of days until the expiration date or the days since the expiration date. +1. [Prometheus]({% link {{ page.version.version }}/monitor-cockroachdb-with-prometheus.md %}): The `seconds_until_enterprise_license_expiry` metric reports the number of seconds until the enterprise license on a cluster expires. It will report `0` if there is no license, and a negative number if the license has already expired. For more information, see [Monitoring and Alerting]({% link {{ page.version.version }}/monitoring-and-alerting.md %}). ## Renew an expired license diff --git a/src/current/v24.1/ui-overview.md b/src/current/v24.1/ui-overview.md index 6ccc7f48b8a..1d1f144d077 100644 --- a/src/current/v24.1/ui-overview.md +++ b/src/current/v24.1/ui-overview.md @@ -146,6 +146,10 @@ The DB Console stores temporary data in a time-series database in order to gener By default, the DB Console shares anonymous usage details with Cockroach Labs. For information about the details shared and how to opt-out of reporting, see [Diagnostics Reporting]({% link {{ page.version.version }}/diagnostics-reporting.md %}). +## License expiration message + +If you have [set a license]({% link {{ page.version.version }}/licensing-faqs.md %}#set-a-license) to use [enterprise features]({% link {{ page.version.version }}/enterprise-licensing.md %}), a license expiration message is displayed at the top-right of the DB Console. While the license is valid, the message will read `License expires in X days`, where `X` is the number of days. If the license is no longer valid, the message will read `License expired X days ago`. Hovering over either message displays a tooltip with the expiration date of the license. + ## See also - [Troubleshooting Overview]({% link {{ page.version.version }}/troubleshooting-overview.md %}) From 2be4c42018dcd923cd0fa7617c71fafc5df5b436 Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Mon, 29 Apr 2024 09:47:29 -0400 Subject: [PATCH 18/34] DOC-9004 Create a physical cluster replication metrics dashboard page when PCR goes GA (#18489) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (1) Added ui-physical-cluster-replication-dashboard.md, moved content from DB Console section of physical-cluster-replication-monitoring.md. (2) In physical-cluster-replication-monitoring.md, ui-overview.md and self-hosted-deployments.json, added links to ui-physical-cluster-replication-dashboard.md. (3) In ui-replication-dashboard.md, added callout regarding ui-physical-cluster-replication-dashboard.md. * Incorporated Kathryn’s feedback. * Incorporated Ryan’s feedback. --- .../sidebar-data/self-hosted-deployments.json | 6 ++ ...physical-cluster-replication-monitoring.md | 38 +----------- src/current/v24.1/ui-overview.md | 1 + ...-physical-cluster-replication-dashboard.md | 59 +++++++++++++++++++ src/current/v24.1/ui-replication-dashboard.md | 6 +- 5 files changed, 73 insertions(+), 37 deletions(-) create mode 100644 src/current/v24.1/ui-physical-cluster-replication-dashboard.md diff --git a/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json b/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json index a357aab89dd..883cf637457 100644 --- a/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json +++ b/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json @@ -459,6 +459,12 @@ "/${VERSION}/ui-ttl-dashboard.html" ] }, + { + "title": "Physical Cluster Replication Dashboard", + "urls": [ + "/${VERSION}/ui-physical-cluster-replication-dashboard.html" + ] + }, { "title": "Custom Chart", "urls": [ diff --git a/src/current/v24.1/physical-cluster-replication-monitoring.md b/src/current/v24.1/physical-cluster-replication-monitoring.md index c4dd13f4082..e7aacd012ea 100644 --- a/src/current/v24.1/physical-cluster-replication-monitoring.md +++ b/src/current/v24.1/physical-cluster-replication-monitoring.md @@ -12,7 +12,7 @@ docs_area: manage You can monitor a physical cluster replication stream using: - [`SHOW VIRTUAL CLUSTER ... WITH REPLICATION STATUS`](#sql-shell) in the SQL shell. -- The [Physical Replication dashboard](#db-console) on the DB Console. +- The [**Physical Cluster Replication** dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}) on the [DB Console](#db-console). - [Prometheus and Alertmanager](#prometheus) to track and alert on replication metrics. - [`SHOW EXPERIMENTAL_FINGERPRINTS`](#data-verification) to verify data at a point in time is correct on the standby cluster. @@ -48,41 +48,7 @@ id | name | source_tenant_name | source_cluster_uri ## DB Console -You can access the [DB Console]({% link {{ page.version.version }}/ui-overview.md %}) for your standby cluster at `https://{your IP or hostname}:8080/`. Select the **Metrics** page from the left-hand navigation bar, and then select **Physical Cluster Replication** from the **Dashboard** dropdown. The user that accesses the DB Console must have `admin` privileges to view this dashboard. - -{% include {{ page.version.version }}/ui/ui-metrics-navigation.md %} - -{{site.data.alerts.callout_info}} -The **Physical Cluster Replication** dashboard tracks metrics related to physical cluster replication jobs. This is distinct from the [**Replication** dashboard]({% link {{ page.version.version }}/ui-replication-dashboard.md %}), which tracks metrics related to how data is replicated across the cluster, e.g., range status, replicas per store, and replica quiescence. -{{site.data.alerts.end}} - -The **Physical Cluster Replication** dashboard contains graphs for monitoring: - -### Logical bytes - -DB Console Logical Bytes graph showing results over the past hour - -The **Logical Bytes** graph shows you the throughput of the replicated bytes. - -Hovering over the graph displays: - -- The date and time. -- The number of logical bytes replicated in MiB. - -{{site.data.alerts.callout_info}} -When you [start a replication stream]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#step-4-start-replication), the **Logical Bytes** graph will record a spike of throughput as the initial scan completes. {% comment %}link to technical details here{% endcomment %} -{{site.data.alerts.end}} - -### SST bytes - -DB Console SST bytes graph showing results over the past hour - -The **SST Bytes** graph shows you the rate at which all [SST]({% link {{ page.version.version }}/architecture/storage-layer.md %}#ssts) bytes are sent to the [KV layer]({% link {{ page.version.version }}/architecture/storage-layer.md %}) by physical cluster replication jobs. - -Hovering over the graph displays: - -- The date and time. -- The number of SST bytes replicated in MiB. +You can use the [**Physical Cluster Replication** dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}) of the [DB Console]({% link {{ page.version.version }}/ui-overview.md %}) to monitor [logical bytes]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}#logical-bytes) and [SST bytes]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}#sst-bytes) on the standby cluster. ## Prometheus diff --git a/src/current/v24.1/ui-overview.md b/src/current/v24.1/ui-overview.md index 1d1f144d077..5d83e9a805c 100644 --- a/src/current/v24.1/ui-overview.md +++ b/src/current/v24.1/ui-overview.md @@ -51,6 +51,7 @@ The Metrics page provides dashboards for all types of CockroachDB metrics. - [Changefeeds dashboard]({% link {{ page.version.version }}/ui-cdc-dashboard.md %}) has metrics about the [changefeeds]({% link {{ page.version.version }}/change-data-capture-overview.md %}) created across your cluster. - [Overload dashboard]({% link {{ page.version.version }}/ui-overload-dashboard.md %}) has metrics about the performance of the parts of your cluster relevant to the cluster's [admission control system]({% link {{ page.version.version }}/admission-control.md %}). - [TTL dashboard]({% link {{ page.version.version }}/ui-ttl-dashboard.md %}) has metrics about the progress and performance of [batch deleting expired data using Row-Level TTL]({% link {{ page.version.version }}/row-level-ttl.md %}) from your cluster. +- [Physical Cluster Replication dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}) has metrics about the [physical cluster replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) streams between a primary and standby cluster. ### Databases diff --git a/src/current/v24.1/ui-physical-cluster-replication-dashboard.md b/src/current/v24.1/ui-physical-cluster-replication-dashboard.md new file mode 100644 index 00000000000..936a499e1eb --- /dev/null +++ b/src/current/v24.1/ui-physical-cluster-replication-dashboard.md @@ -0,0 +1,59 @@ +--- +title: Physical Cluster Replication Dashboard +summary: The Physical Cluster Replication Dashboard lets you monitor and observe replication streams between a primary and standby cluster. +toc: true +docs_area: reference.db_console +--- + +{{site.data.alerts.callout_info}} +{% include feature-phases/preview.md %} +{{site.data.alerts.end}} + +The **Physical Cluster Replication** dashboard in the DB Console lets you monitor the [physical cluster replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) streams between a primary and standby cluster. + +To view this dashboard, [access the DB Console]({% link {{ page.version.version }}/ui-overview.md %}#db-console-access) for your standby cluster, click **Metrics** on the left-hand navigation bar, and select **Physical Cluster Replication** from the **Dashboard** dropdown. + +{{site.data.alerts.callout_info}} +The **Physical Cluster Replication** dashboard is distinct from the [**Replication** dashboard]({% link {{ page.version.version }}/ui-replication-dashboard.md %}), which tracks metrics related to how data is replicated across the cluster, e.g., range status, replicas per store, and replica quiescence. +{{site.data.alerts.end}} + +## Dashboard navigation + +{% include {{ page.version.version }}/ui/ui-metrics-navigation.md %} + +The **Physical Cluster Replication** dashboard displays the following time-series graphs: + +## Logical bytes + +DB Console Logical Bytes graph showing results over the past hour + +The **Logical Bytes** graph displays the throughput of the replicated bytes. The graph displays the rate at which the logical bytes (sum of keys + values) are ingested by all replication jobs. + +Hovering over the graph displays: + +- The date and time. +- The number of logical bytes replicated. + +{{site.data.alerts.callout_info}} +When you [start a replication stream]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#step-4-start-replication), the **Logical Bytes** graph will record a spike of throughput as the initial scan completes. {% comment %}link to technical details here{% endcomment %} +{{site.data.alerts.end}} + +## SST bytes + +DB Console SST bytes graph showing results over the past hour + +The **SST Bytes** graph displays the rate at which all [SST]({% link {{ page.version.version }}/architecture/storage-layer.md %}#ssts) bytes are sent to the [KV layer]({% link {{ page.version.version }}/architecture/storage-layer.md %}) by physical cluster replication jobs. + +Hovering over the graph displays: + +- The date and time. +- The number of SST bytes replicated. + +{% include {{ page.version.version }}/ui/ui-summary-events.md %} + +## See also + +- [Physical Cluster Replication Overview]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) +- [Physical Cluster Replication Monitoring]({% link {{ page.version.version }}/physical-cluster-replication-monitoring.md %}) +- [Troubleshooting Overview]({% link {{ page.version.version }}/troubleshooting-overview.md %}) +- [Support Resources]({% link {{ page.version.version }}/support-resources.md %}) diff --git a/src/current/v24.1/ui-replication-dashboard.md b/src/current/v24.1/ui-replication-dashboard.md index 1f1c1006af2..a7682c2b769 100644 --- a/src/current/v24.1/ui-replication-dashboard.md +++ b/src/current/v24.1/ui-replication-dashboard.md @@ -5,10 +5,14 @@ toc: true docs_area: reference.db_console --- -The **Replication** dashboard in the DB Console lets you monitor the replication metrics for your cluster. +The **Replication** dashboard in the DB Console lets you monitor the replication metrics for your cluster, such as range status, replicas per store, and replica quiescence. To view this dashboard, [access the DB Console]({% link {{ page.version.version }}/ui-overview.md %}#db-console-access), click **Metrics** in the left-hand navigation, and select **Dashboard** > **Replication**. +{{site.data.alerts.callout_info}} +The **Replication** dashboard is distinct from the [**Physical Cluster Replication** dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}), which tracks metrics related to physical cluster replication jobs. +{{site.data.alerts.end}} + ## Review of CockroachDB terminology - **Range**: CockroachDB stores all user data and almost all system data in a giant sorted map of key-value pairs. This keyspace is divided into "ranges", contiguous chunks of the keyspace, so that every key can always be found in a single range. From 0fef87eb57a8d4150db815cfee435425356f769f Mon Sep 17 00:00:00 2001 From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:22:55 -0400 Subject: [PATCH 19/34] v24.1.0-beta.3 release notes (#18504) --- src/current/_data/releases.yml | 27 +++++++++ .../releases/v24.1/v24.1.0-beta.3.md | 60 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/current/_includes/releases/v24.1/v24.1.0-beta.3.md diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index eb92170f17f..216aeb7598a 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5897,3 +5897,30 @@ docker_arm_limited_access: false source: true previous_release: v24.1.0-beta.1 + +- release_name: v24.1.0-beta.3 + major_version: v24.1 + release_date: '2024-04-30' + release_type: Testing + go_version: go1.22.0 + sha: aea98c134a954d4dbba4916bb22aa6ad23f81004 + has_sql_only: true + has_sha256sum: true + mac: + mac_arm: true + mac_arm_experimental: true + mac_arm_limited_access: true + windows: true + linux: + linux_arm: true + linux_arm_experimental: false + linux_arm_limited_access: false + linux_intel_fips: true + linux_arm_fips: false + docker: + docker_image: cockroachdb/cockroach-unstable + docker_arm: true + docker_arm_experimental: false + docker_arm_limited_access: false + source: true + previous_release: v24.1.0-beta.2 diff --git a/src/current/_includes/releases/v24.1/v24.1.0-beta.3.md b/src/current/_includes/releases/v24.1/v24.1.0-beta.3.md new file mode 100644 index 00000000000..0852831e401 --- /dev/null +++ b/src/current/_includes/releases/v24.1/v24.1.0-beta.3.md @@ -0,0 +1,60 @@ +## v24.1.0-beta.3 + +Release Date: April 30, 2024 + +{% include releases/release-downloads-docker-image.md release=include.release %} + +

SQL language changes

+ +- Updated the [`SHOW GRANTS`]({% link v24.1/show-grants.md %}) responses to display the `object_type` and `object_name`, which has replaced the `relation_name` column. [#122823][#122823] +- Added [external connection]({% link v24.1/create-external-connection.md %}) granted privileges to the [`SHOW GRANTS`]({% link v24.1/show-grants.md %}) command. [#122823][#122823] +- Introduced three new [cluster settings]({% link v24.1/cluster-settings.md %}) for controlling table statistics forecasting: + - [`sql.stats.forecasts.min_observations`]({% link v24.1/cluster-settings.md %}#setting-sql-stats-forecasts-min-observations) is the minimum number of observed statistics required to produce a forecast. + - [`sql.stats.forecasts.min_goodness_of_fit`]({% link v24.1/cluster-settings.md %}#setting-sql-stats-forecasts-min-goodness-of-fit) is the minimum R² (goodness of fit) measurement required from all predictive models to use a forecast. + - [`sql.stats.forecasts.max_decrease`]({% link v24.1/cluster-settings.md %}#setting-sql-stats-forecasts-max-decrease) is the most a prediction can decrease, expressed as the minimum ratio of the prediction to the lowest prior observation. [#122459][#122459] + +

Bug fixes

+ +- Fixed a bug that could lead to descriptors having privileges to roles that no longer exist. Added an automated clean up for [dropped roles]({% link v24.1/drop-role.md %}) inside descriptors. [#122701][#122701] +- Fixed a bug where [client certificate authentication]({% link v24.1/authentication.md %}#client-authentication) combined with [identity maps]({% link v24.1/sso-sql.md %}#identity-map-configuration) (`server.identity_map.configuration`) did not work since v23.1. For the feature to work correctly, the client must specify a valid db user in the [connection string]({% link v24.1/connection-parameters.md %}). [#122738][#122738] +- Fixed a bug where the [row-based execution engine]({% link v24.1/architecture/sql-layer.md %}#query-execution) could drop a [`LIMIT`]({% link v24.1/limit-offset.md %}) clause when there was an [`ORDER BY`]({% link v24.1/order-by.md %}) clause, and the ordering was partially provided by an input operator. For example, this bug could occur with an ordering such as `ORDER BY a, b` when the scanned index was only ordered on column `a`. The impact of this bug was that more rows may have been returned than specified by the `LIMIT` clause. This bug is only present when not using the [vectorized execution engine]({% link v24.1/architecture/sql-layer.md %}#vectorized-query-execution). That is, when running with `SET vectorize = off;`. This bug has existed since CockroachDB v22.1. [#122837][#122837] +- Previously, CockroachDB could run into an internal error when evaluating [PL/pgSQL]({% link v24.1/plpgsql.md %}) routines with nested blocks. The bug is only present in 24.1.0-beta versions. This bug is now fixed. [#122939][#122939] +- Fixed a bug where [`UPDATE`]({% link v24.1/update.md %}) and [`UPSERT`]({% link v24.1/upsert.md %}) queries with a subquery were sometimes inappropriately using implicit [`FOR UPDATE`]({% link v24.1/select-for-update.md %}) locking within the subquery. This bug has existed since implicit `FOR UPDATE` locking was introduced in v20.1. [#121391][#121391] +- [Dropping]({% link v24.1/alter-table.md %}#drop-column) and [adding]({% link v24.1/alter-table.md %}#add-column) a column with the same name no longer results in a `"column already exists error"`. [#122631][#122631] +- Fixed a bug that could cause an internal error of the form `invalid datum type given: ..., expected ...` when a `RECORD`-returning [user-defined function]({% link v24.1/user-defined-functions.md %}), used as a data source, was supplied a column definition list with mismatched types. This bug has existed since v23.1. [#122305][#122305] +- Fixed a bug that could result in an internal error when attempting to create a [PL/pgSQL]({% link v24.1/plpgsql.md %}) routine using the (unsupported) `%ROWTYPE` syntax for a variable declaration. Now, an expected syntax error is returned instead. [#122966][#122966] +- Fixed a bug that could result in an assertion error during evaluation of [PL/pgSQL]({% link v24.1/plpgsql.md %}) routines that invoke procedures while using `DEFAULT` arguments. The bug was present in v24.1.0-beta releases and is now fixed. [#122943][#122943] +- Previously, privileges granted for [external connections]({% link v24.1/create-external-connection.md %}) were displaying in `SHOW SYSTEM GRANTS` with no associated object name. Now these privileges are no longer displayed. Instead, the statement `SHOW GRANTS ON EXTERNAL CONNECTION` should be used to view external connection privileges with their associated object name. [#122857][#122857] +- Statistics forecasts of zero rows can cause suboptimal [query plans]({% link v24.1/cost-based-optimizer.md %}). Forecasting will now avoid predicting zero rows for most downward-trending statistics. [#122459][#122459] +- Fixed a bug introduced in v23.2 that could cause a [PL/pgSQL]({% link v24.1/plpgsql.md %}) variable assignment to not be executed if the variable was never referenced after the assignment. [#123045][#123045] + +

Performance improvements

+ +- More efficient [query plans]({% link v24.1/cost-based-optimizer.md %}) are now generated for queries with text similarity filters, for example, `text_col % 'foobar'`. These plans are generated if the `optimizer_use_trigram_similarity_optimization` [session setting]({% link v24.1/set-vars.md %}) is enabled. It is disabled by default. [#122838][#122838] +- The [optimizer]({% link v24.1/cost-based-optimizer.md %}) now costs `distinct-on` operators more accurately. It may produce more efficient query plans in some cases. [#122850][#122850] +- Improved the speed for optimization of some statements using `GROUP BY` or `DISTINCT` or `ON CONFLICT` by skipping the [optimizer]({% link v24.1/cost-based-optimizer.md %}) rule `SplitGroupByScanIntoUnionScans` when it is not needed. [#123034][#123034] + +
+ +

Contributors

+ +This release includes 56 merged PRs by 25 authors. + +
+ +[#121391]: https://github.com/cockroachdb/cockroach/pull/121391 +[#122305]: https://github.com/cockroachdb/cockroach/pull/122305 +[#122459]: https://github.com/cockroachdb/cockroach/pull/122459 +[#122631]: https://github.com/cockroachdb/cockroach/pull/122631 +[#122701]: https://github.com/cockroachdb/cockroach/pull/122701 +[#122738]: https://github.com/cockroachdb/cockroach/pull/122738 +[#122823]: https://github.com/cockroachdb/cockroach/pull/122823 +[#122837]: https://github.com/cockroachdb/cockroach/pull/122837 +[#122838]: https://github.com/cockroachdb/cockroach/pull/122838 +[#122850]: https://github.com/cockroachdb/cockroach/pull/122850 +[#122857]: https://github.com/cockroachdb/cockroach/pull/122857 +[#122939]: https://github.com/cockroachdb/cockroach/pull/122939 +[#122943]: https://github.com/cockroachdb/cockroach/pull/122943 +[#122966]: https://github.com/cockroachdb/cockroach/pull/122966 +[#123034]: https://github.com/cockroachdb/cockroach/pull/123034 +[#123045]: https://github.com/cockroachdb/cockroach/pull/123045 From a550b11937c1173c5978121430019266ada821ef Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Tue, 30 Apr 2024 13:10:59 -0400 Subject: [PATCH 20/34] DOC-9399 PR #116411 - ui: update label "CPU" to "SQL CPU" (#18505) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * In ui-statements-page.md, replaced CPU Time with SQL CPU Time in text and images. * Incorporated Ryan’s feedback. --- .../_includes/v24.1/ui/statement-details.md | 4 ++-- .../_includes/v24.1/ui/statements-filter.md | 2 +- .../_includes/v24.1/ui/statements-table.md | 2 +- .../v24.1/ui_statement_fingerprint_charts.png | Bin 153982 -> 288755 bytes .../ui_statement_fingerprint_overview.png | Bin 255261 -> 423110 bytes 5 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/current/_includes/v24.1/ui/statement-details.md b/src/current/_includes/v24.1/ui/statement-details.md index 690cc701eaa..2155d1c685b 100644 --- a/src/current/_includes/v24.1/ui/statement-details.md +++ b/src/current/_includes/v24.1/ui/statement-details.md @@ -30,7 +30,7 @@ The **Overview** section also displays the SQL statement fingerprint statistics |**Execution Retries** | The number of [retries]({{ link_prefix }}transactions.html#transaction-retries). | |**Execution Count** | The total number of executions. It is calculated as the sum of first attempts and retries. | |**Contention Time** | The amount of time spent waiting for resources. For more information about contention, see [Understanding and avoiding transaction contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention). | -|**CPU Time** | The amount of CPU time spent executing the statement. The CPU time represents the time spent and work done within SQL execution operators. | +|**SQL CPU Time** | The amount of SQL CPU time spent executing the statement. The SQL CPU time represents the time spent and work done within SQL execution operators. It does not include SQL planning time or KV execution time. | |**Client Wait Time** | The time spent waiting for the client to send the statement while holding the transaction open. A high wait time indicates that you should revisit the entire transaction and [batch your statements]({{ link_prefix }}transactions.html#batched-statements). | The following screenshot shows the statement fingerprint of the query described in [Use the right index]({{ link_prefix }}apply-statement-performance-rules.html#rule-2-use-the-right-index): @@ -60,7 +60,7 @@ Charts following the execution attributes display statement fingerprint statisti |**Execution Retries** | The number of [retries]({{ link_prefix }}transactions.html#transaction-retries). | |**Execution Count** | The total number of executions. It is calculated as the sum of first attempts and retries. | |**Contention Time** | The amount of time spent waiting for resources. For more information about contention, see [Understanding and avoiding transaction contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention). | -|**CPU Time** | The amount of CPU time spent executing the statement. The CPU time represents the time spent and work done within SQL execution operators. | +|**SQL CPU Time** | The amount of SQL CPU time spent executing the statement. The SQL CPU time represents the time spent and work done within SQL execution operators. It does not include SQL planning time or KV execution time. | |**Client Wait Time** | The time spent waiting for the client to send the statement while holding the transaction open. A high wait time indicates that you should revisit the entire transaction and [batch your statements]({{ link_prefix }}transactions.html#batched-statements). | The following charts summarize the executions of the statement fingerprint illustrated in [Overview](#overview): diff --git a/src/current/_includes/v24.1/ui/statements-filter.md b/src/current/_includes/v24.1/ui/statements-filter.md index d5a34084385..c750a860614 100644 --- a/src/current/_includes/v24.1/ui/statements-filter.md +++ b/src/current/_includes/v24.1/ui/statements-filter.md @@ -7,7 +7,7 @@ The statement fingerprints returned are determined by the selected **Search Crit By default, the **Top** `100` statement fingerprints **By** [`% of All Runtime`](#percent-of-all-runtime) for the `Past Hour` are returned. 1. To change the number of results returned, select `25`, `50`, `100`, or `500` from the **Top** dropdown. To return a larger number, select `More` and choose an option: `1000`, `5000`, `10000`. -1. To change the sort column, from the **By** dropdown, select a commonly sorted column: `% of All Runtime`, `CPU Time`, `Contention Time`, `Execution Count`, `P99 Latency`, `Statement Time`. To sort by other columns, select `More` from the dropdown and choose an option: `Last Execution Time`, `Max Latency`,`Max Memory`, `Min Latency`, `Network`, `P50 Latency`, `P90 Latency`, `Retries`, `Rows Processed`. +1. To change the sort column, from the **By** dropdown, select a commonly sorted column: `% of All Runtime`, `SQL CPU Time`, `Contention Time`, `Execution Count`, `P99 Latency`, `Statement Time`. To sort by other columns, select `More` from the dropdown and choose an option: `Last Execution Time`, `Max Latency`,`Max Memory`, `Min Latency`, `Network`, `P50 Latency`, `P90 Latency`, `Retries`, `Rows Processed`. {{site.data.alerts.callout_info}} The `More` options may increase the page loading time and are not generally recommended. {{site.data.alerts.end}} diff --git a/src/current/_includes/v24.1/ui/statements-table.md b/src/current/_includes/v24.1/ui/statements-table.md index ea89ec91e6d..321d3f06f80 100644 --- a/src/current/_includes/v24.1/ui/statements-table.md +++ b/src/current/_includes/v24.1/ui/statements-table.md @@ -13,7 +13,7 @@ Application Name | The name specified by the [`application_name`]({{ link_prefix Statement Time | Average [planning and execution time]({{ link_prefix }}architecture/sql-layer.html#sql-parser-planner-executor) of statements with this statement fingerprint within the time interval.

The gray bar indicates the mean latency. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values. % of All Runtime | The percentage of execution time taken by this statement fingerprint compared to all other statements executed within the time period, including those not displayed. Runtime is calculated as the mean execution latency multiplied by the execution count.

Note: The sum of the values in this column may not equal 100%. Each fingerprint's percentage is calculated by dividing the fingerprint's runtime by the sum of the runtimes for all statement fingerprints in the time interval. "All statement fingerprints" means all user statement fingerprints (not only those displayed by the [search criteria](#search-criteria)), as well as internal statement fingerprints that are never included in the displayed result set. The search criteria are applied after the `% of All Runtime` calculation. Contention Time | Average time statements with this fingerprint were [in contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention) with other transactions within the time interval.

The gray bar indicates mean contention time. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values. -CPU Time | Average CPU time spent executing within the specified time interval. The gray bar indicates mean CPU time. The blue bar indicates one standard deviation from the mean.

The CPU time includes time spent in the [SQL layer]({{ link_prefix }}architecture/sql-layer.html). It does not include time spent in the [storage layer]({{ link_prefix }}architecture/storage-layer.html). +SQL CPU Time | Average SQL CPU time spent executing within the specified time interval. It does not include SQL planning time or KV execution time. The gray bar indicates mean SQL CPU time. The blue bar indicates one standard deviation from the mean.

The SQL CPU time includes time spent in the [SQL layer]({{ link_prefix }}architecture/sql-layer.html). It does not include time spent in the [storage layer]({{ link_prefix }}architecture/storage-layer.html). P50 Latency | The 50th latency percentile for sampled statement executions with this fingerprint. P90 Latency | The 90th latency percentile for sampled statement executions with this fingerprint. P99 Latency | The 99th latency percentile for sampled statement executions with this fingerprint. diff --git a/src/current/images/v24.1/ui_statement_fingerprint_charts.png b/src/current/images/v24.1/ui_statement_fingerprint_charts.png index fd65961ceb81fe0a5f33451dc2b96b49178c762f..5ab63bfe0fb3fb14ef7b04a13b8cd9f706bfe9cf 100644 GIT binary patch literal 288755 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 sj-5~XDZ$XUXu+4R>_?RcxoBIgFg3Tb#@2tS# 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 literal 153982 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�gGW~HF$<3%kK?FIPkDe+x;HWM?D`yP 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
    ={+(ydOgs5 zr?c};6Tq$Jd%dWf9QcN99ydNYi&|ajV*SXHrk`EhN$zWwE@C;;$n`=gX#~nW5AWi^ zdX%+h(dgRfs7B;)`tVJu>V_1o=q+xhEqz5=av9bns3lTXM`B@VuhCFWK`w}n!Jpq% zL%UYV!n-gX@7lu!QZk?oc1_k#v@K?6E{T_)kc{0S-Lpt`W{=Qpsgq{Mw=;@=lZdiG z`C(fX7!~)oq>5f_qjAu@*~=q3a9v#8OvU)k%*}polUB)_s9-54(4_ol$On3zf(G>{ zK5i_t<~2$6DHZMXO?&sw2bPu`l%tZZQq$5mn17Eg6YD{t5G3wx;=f%1f2`&+;vXjz z(Tq6o?+FUZ>s^019FF2A0sosp4sW1T8wZhHvj5HV{r@lZ4;S_Si?OdHSEn?tcdB0>b{R%rGBV-p7|1k&pJwwp7~yJbWso z@HwO!XY?=iDOkW)h_nXty=|m~Nl3p7x%R~VmLnxn16_)ATnobPa6!SWz{gDkUX*LE zhG1x0`|nhR=khY*AzaX$yRnr$2G+^I=wJXS1c4DH$703C*VC}VxoV3x8^UJx$-K0f zJ+JN2cZloL1r0w9fwogtD?{OS+?qmPLgCuj+TF`WarE4*rHIzJXPxZ|LRH%&TxqFQ zI-e;Fvwk}a4pL@d_3%>+lcrvh3A@=2;g3la=E~ZqC%d8gzh3RMz5t=n>W-4m8k@$oXGn(E9dQLT?L6LGIB?hukCRCVxyk^rK} zglaj39wtxW??%~c&pZ1nIt?G@mii<^2O@v{W>~s|OwGK-)24==xSja&P%6<9zwyOEt8 zQ$PlA871ONeaP>ZrQa)3yKw(lr2pk*e~42<@d|M+<6HbnaF0py8_BKy%&uiU6N+1U z9CFc=vjL+c;olT`b}=n2Q9&{2&`2v^r(UW=wS!tfP#!Y3MDkW8KRmoCqKunmeg0gK z7EhU|hHkLBzE(=XOaOnj3R5^&l`pHHuP~6_o$*4<-kum*a)ty3%NGm=(|`rYm*9U4 z4Sj)vf*V(*aA#LcNNR4WK*zzLm|#(S!P)nSHWZLTF~{vA72G25Nc+c~SkouWoOzky zf^et~$DN7NNVc#Ngh%zdZ}H212`!MBq)5Bp?CzP2GK;@73dOQo*f9%D-+%BehXCebq=w5Nq~h-=xtS2d|L z?c1)fRPCg)MdRY3-NI!pKw54mq+~P+oi73=pI>*igtTsK?nj=+`G$2Qd3DdI;uB?P z?^|=eMB&lmkJI6o)WlcEgT0bWKZUqcw*{n*)r&|;QQ!DJFc}cczY}^+iO*3PPyNM> z`0d7SJRpNqV6B7Vo07LQxJ71s=MI^}xAyx;KuVoOi~BgpQBSh}iXg1{$!UY@AY{|l z-5bg0KjJI@7BqOghJH=Y*VMmmLrY*WIx$+_1CbMc$bJ0SfKgqNHykJIA2zpUUC2-e zzs48ib-lE{!kr2kTt&vqz=QVj%G1R!EefV%5Z5#u98u_hOxdcro}wyIKL4!O;!#Ap ze-Rk0U7J7?5YLD_P~s6{tyV;zTf$a)3mm5c1~QjIV|E7!qJVl;b2JSOw5}k%;||^D zenHhEtt2?S$1M5gq9;;2w`*YnT{vexPIL;fOVZ7ZT3sKgTWG>m+mTX7k~r0As^UF3 zG?Y>u1B&KFLjFa)ZMM_3Fe(>Y2x0OByk}2~kE_#7-1}vPCljssgTdE8Ovf6ZtI7}o zbM3+;sSr*`(!EmWeW_hV1>??>Z7DDb&H_mnel0vTPaahvn;n@7_$SLJup)z?U+$0G zQgW`Ny?;E@F{QA;I?w?$$8$Z%sO>alx(LPp4#rPPqF6HfM4`3|(HLDSX-Gn6Hy8fv z#J~&nABO|sdqxE;#$?NWMrZ|Po-v(8G7>6s10`kuR_Xm%zUYbt%cQ?e3dWTXW z`aQ`J1XTNzVh~DRfLKl64#D1d`>C_zxr?ZeHJ{vrhv|$hmdoeK{+ zG&QO*Qk#68UsnJyDQ~lue#0b~mVEp1 z7)lbfD(R&6skwWiyYrYr(`tez{qge&+7zJ#OwYDavp-RWI+RjHS~yU}VM>%NEPNA?4;u4 zp$xWbn_20sNn~rlsJ{1B!lJ8krJlAgb4|@TkNXK429ZGc>CH)StCFW6SExRUMO5eC zMIGzL(4b?-IH$d}&ptj?BqXZ6f~itpFt$;;LZmfSFd_9>ejK5?_eaOpM7<&ja>@MW z-goJ<#pLJsJH+w|I~UGW+|s*R`z|*it-g97ajI&mIhRJcCqa%7mJ0(Jk}m&plOODp zLBgrJ<2F z`}9dJlN^TWfo zf)*bxa_+FudjJSNBM>zDMp$GDGGRF>wD=~)Odztc)yzK+?p=7jyGy(3uGtb^v)4Cc zGHr1^<}f%~MfH8a5UD>L4@48oy0hv2$$GZ zQmt;sMjZG>iE+(!LWvEsPPW%PJd|i3EJl9xA9Bgf_o{(^zOVaEPsri_x4CR$F{o)I zhRC+&lJU#F*_r*RhRf~5yV!W(syU93em;sVpt5H*kAGbKG>pmW*;jVPqD~}hWmTP= zC!r7=EEdWv2E~@;RFVaJnjQG5KmJ1EW)apG>|5;%kI(zC|8U`PwSV=sa$gnKJWm=i^zq@5Q*(q0qiwB4J@-JHxOfJ<1iTPj|*2nplLS#+=2M0 zbOAdu>**2K7^*Wr;8|@MDHGUqP zT{+He6fvY#<@v1~oMDzn76E5aB2fP_{kFdGXSZ$SbgmITks#==8oIo~8qx@x=)+zT zG7NIJxRw?%Ql$L$?S~G1lSGKV#F|0UMDgKktEr@zcNYFVUu4@iXlJAtDPNo3(gZRq z%{b7_sMMZs%u-p-mY@$MgTtdV$MP=2Z)gv9qp`jVr{zTv#6CU}A$}x!jq_{JjJkg) zCGV#%OD*`ln5b$juak+|#P!as$K_A%^^KFShE|fRKy{6dM%~WK7Q=$C*a!px$*Qz1gRH`zYt5zKBvFb zS#x7!1BStd;b^Im1d1XjA252JUEOq58&~~WkK{}H0Duy+(@;|M9DhNOp~{P|+6|8> zQnc9LV&R1(P)KcVra+snx0V&L6z;wR3Y-G#6+t|r4+}VZ};dwO3(r7b$eEzobt-*;I0VxPeLDiFrii;S-o>?Zg zJs`swJ71~u8JdxS^bJmFXDp=hVfQfN^Cv7_1b+98RqOI`Z10Z;?u($``Ux9Pg$A-zum{=cHhSd z$GfR&yhe`^d2l0&PbOD4ET}X&I5OYAH<6xSSlC?eI<0Zqq0bU<#V~Fh-9Ih^R#60y z$oKS6%U}^Djbucw{57LoU>VAk5?H=0mS#avuxAM|4i!deDNo9i|2?Vx`9(C%ly862 z$hcCM;Hf#1c}!L^P0y#v6DGA?7$(=D4TZ&>1U_sHawS=Kc9L%H=zQ~t8p!Oa`l|;q zAK+p&*NoE_M-m3;FbI!Q>Pe=XsSr) zjMdwPLM2=zBLG4?eviTM`Yn(poPmbwZm{{~_4QhN2Pc+>|+wsFvY-PL*YC_?g4-m1SHw5p3dds-T z?q@%j3aP0qYM2iSMHx^vvfv2)Th#I&e+mHqd}H90Yh0IHNU|BS?Y7z84>9^^9s)Fg z-#|c8wxIorK*;C9)I#531Av=M*F+K$E7Y6zq8Z*j61^UBMb*J+XQ_y~hl=)~Q_AH* z@WH zr5uT2N*(vOF(m%jCzY%IqEPRGQ%Bx4>C$qkl%`J!w^$cxrRg(Vy$w(zug*47DcPF2 zGwI3ExuL&)n8u%b--N~ZYkZ~!o8!C|8WA6E4)Mv|^TX-H!9pLcS_h)4>W8;@Y0)k9 zHYPI{A<)kA5vKkAv!XceReC&p-bNDzyd`Q6Z_Uii!YiEpNF_ljX11Qq@vr1V{Y=<1 z#;;1hH92y_ zrv4sFMq%l6hTJyQ-2wjg7|8ttY6#m&Me-73=_}8umsga>Q$t~jJIcEz9yxUY1AJ-T zFx0%%(WA8xCg%;K-oM_GsuH{Gvjbg3z;)bxLhVyLL45ggAS0(VjM>sdV|r1N;c+wg zXf*OI+lJM<%f|7Rxr!kV3dO(mIpnzSV22Up!w87!3Wwq)ZR5u;^ZbXe7|O2g)}~el z(a=`N!t;_zVFLrmRSR5#I0{Jf0R_P>ktpa z>(5MWZ)mQ?nMi+q56nkvR7B11Zrh)X1iItvD;bYOpn?jctFis>6AR^63Cq9QB%h+JEQ{q(JLbZVue;gdHspNY04zqkP$9Q?Yl(3Hb#-{dS9Xz zmz2~>&b~dl-!WYgF-P!eVtPn2e)HzSgZM;byg$%9#Y{eKJj_AIVL)Hh;<-w|czN1(wsQG`ro)8SJ(h3=`Lf-M40{6!Ik@4w4 zlGN2B-Uc!sf|PEtyV@=^_0 zv>hC8aZy%e)mqUfKF*Xn#Qh|jm!P8!?2qx7#qub78^fFAX0H=O8SAI`k~hOd8fE*24Ys+*?Q?O(*_Y5hn%CWbXKGBN-o zGNdaaryI&1-XXBTd8@sG@}7*}en9%1olVf;fvA0^eCGAYp9--sCGP$kv3RwAcTe@;$8PC7r(O);HEGVhcVU?6y|^FP5{7>fdT1%XfgxvHCy9ycvkfo}Qv5yQl zcoiio$uasH1)Hh-e3ZnemHLebxkQ@yZk7U0kTG%u zAx&~bI(2Kx@cQ<-(IzHNSqxQ~oqf&6L8P=nfEFM~vUz$Rw-X_vL$DK!&A;{FfUV;0 zR0uVV9vLtD>G0E0_+kK$$!J#Iz@IYNXe?iCkNL!g5@?7e;i?e=z}C=KiC8S16vr5U zJt&>mf5U#0|1tQU$!u1ha$3aWhE+{HSqH0vy!Defp*-GlefH0bT}Jp$B_LoHq~(FU zc`vp~q+Y5N$WEWZ%CJRlz9TQ`DWIpPuUe}H`c-Z)x#n=2O9ho&wZze0h&>gKRTg_7 zWcw^U!X-`E;(3G{MZ5kIIehaboYjV{I_p@2{G#qDOQYNJZb zJ+rOfXSQ-JnDXB?RaO57({z>9BqD2xVExgm^LWDXN~w4BeUEy*Eru z9VP=Qk3lqneY1VDDBNmDAV84T+mo_-f&XdUkae< z+G$^q%a-Ug|9;1;Rc<|N=`Z>yg4DG^MVb0z$aK_S&sFt zg+(qLL>QYV^=-DvvDDW^6vnZU-HxxX<190UgDRb*4KW~BfYc1k4$2!7^V!m2yRT={#0(a&8iYI1cBpFw{X&6PRvBf`Gk5NXu?=kxJllel$~HarpVW_I z1=)%CX(7^|#o|6r#|IY$<6%*5Mn|GE_RI}sI){Z?pHE^XS2hyt6i%5e9cuk-KX9Qh zlg+BSq%yr2@nP6xHLN9t2OWhff1ux3#7bi)A1?mJ{j)@u->gm}0sJB9N^&bv(Tt=u z?1&06J+a7Opz9o4UDV0atJJ7;L^!tAbhu}8b2@@!C*|>S9AQHDkusGnJ#Mz-wbS*X zlk1T{L}4_oGrAc$>szvn2ur5o7*fs{>-ShS`@|?>iB55x-^|xS7F82cUXhiaLAcq5 zGW`@H;v{k&e%EEs5dZq26Z?cPUC#*+nr)8Ffze`Phfh+DK|G{J1Y9BqySzHsoQB_}@nv$Ldn#YiVP(E%zc=|1${l^jIlpB0I z1OF72cl;0rYoXa0NXwgN`h(YQq)i`9oSA8+Ure5xT-kJ8shZRWsJQoO+6T-LLUHzq zH_|g^YlCdYL3Gss|n8M)VxXgysi4%p=?~* zsBbw-++fejk$7Yd}VS9+m}mRonAvFPnDaO=V(oaz`rj3ScV6h-w}-|jW_@_reqmF zLDo8*7ijhqq(eOQXy()%MFxQha4?W0zo@2bzsGFxn7%+$s2E7svIb!&j4AHNuTe+@ zm(D8wTTJl3SF2}T<^w3L-ASWS`QO8d|97F$|1LBUR)xFlfA&}Zq8ATZ1OolDA=P=& z|M2yK1D`D*U4G%XzCig3{lCIL|NX%Kg_+i3{}ydB=}!;E{{lMwj~`_UY)|+a1@zd? z|C06}-uvLc$C3YUk+CQLbejAhp|}5fgfsD1%x!C-!4>*y{{is(-%tPl|3!v2zo{|^ zEh(Yb%RVu-vkU!^t!HL_(A(Fy+Sz`r zqXEvyvo{dss&jU@`PF_SV7z1HfG&+JgpW^1BSMR;Ri%eOwbb4;y~6o#-z2Cd{QbG( z=DKgiZIMSEDQuMiYNmb=zrM5SYzXxDb~(b%)WNnq_@mhn5qAEv#vq(SVTa>&H__PD z-q-E=4;NFrcJfuF{mVG(6?%0~{~!WRno^1pI;$?lC`oHg3aU@EZY`2CG~_njV#;RZV?km`DIDl^i`mBA0%8by9ynPNc#LxC{@_z<{Tp zNBJDj_XY+_Uu-|fQ`gB$EwB|s-sZCjqAB<0Q*C~X$ea1vFu z|D3%ygY5UM&%})a`ENVMoNnB?x@}>degvW5C@$W?qc}f z)TXV@|L2>v&IfyDYbd`hf)BfT)L`!dVe8%9kZ$57s~~Gu;$$6(g-cCfSq^K10ZT#e zpt%lMdH)qF*OeEhjiOOVR0;jc8s(r=2y6XQ9C-|M9_}DWq~W6>PB!pC_q)Fi zYi}nL2ZoqDwm2>QnOA}#Y4QXOZn_;V{)!Wz%yd3=WQmd{(5~1I2relKW-A2dNu49m za(G`efdTrYwN6gy+z)I&w7Ia&#}>uC_Z!c1yAkC0LoQWWDi}{70)}o8w;$>X% z6T#9>QcD>uAqBQy`T2gl{PXF%COqGqaKqaMxIgWma`pYU;v_q5t7Fv=2sL@<4pH>` zCwrm6Bf}t>tb%`6WT9ez52Baek7>a1zP8R-Op_v$f5?0^zG+j=GcSVf^2b`paiX{_ zv3G4<1rkUjzs}BUhtUrgH@64~^i2+~(>1}H*)*c`sC=3V`CGj7g4Ag=G2P)rg({8)_%!z6nrD2Qky21AkG$c^lA=1t51Z65(Q^>QfQ5_-Q9 zd-TPh|NaRiC56<{(FvV}rPX*oXQ7}}#Qh+bGYqJ26*mV2By){tm7#Yb0LlMrPLh7Citi zoD~U}*RlBwMCEkybQ}8a*(Tw0rQdkJe#_~wpaDbDC|Hu_JjYu8p;IM07A>-9NxVOq z6MFK)R^Ywh&bws$m8N4PMk4f7*E+7v?tpoEej;hTE=O{>x@EY2S|r?eESeg;n(I}; zCU>PX38V7Ve2I!bQ~!6zPD}mY+l*!GqS)+;$tZpEJF2D|V7jO`))$S+VMv6y_GfLi zAY)ZBd6p2p_p!~X9YN}h9&qX&lERa~S5=7(@dHL=VpRqjX8fFowdj0jw}jLbM1E;T zy)IV_mW^jZ%-?+dCD5xwsIMZJSw9&4k5@oD@k6|;68mNI8@f<>zDw4yI8PGO^g|Pg zZGfmKmWa>IU?gn;^xCZ$<7)9s5}l%_kAS*@Koon|9fD#OFUZ7%3$Dly%&6`Rfj4~N z)@V=7cCB;RHTA}Y@@5xmC|h=Tc~rK_(Xv?&HvgiMI{J{svUb-_ahh?6>z=7Lj84q!Eb#c`mzbIw zxHq1k#bExWH)t@O%b0GshoV(&_z< zzK$1qbtQq&-Au&xIZDt$q08E7cy67f;2>_N(kq(NXzLy1>H#*9Q4b%)o+-L?n&w+e zr2M;9@tODE`^6uL$6>4$4up52?z*<(Ysco#4 z&=beEU?mQw!hY^+Nwtb0;Um%)axCBxn+CJ4)Y#Dz0?Fd@FWrnke%!w-+4Z#CrsVnY z@D3Q3C-GqU-2hMj643V8D0~r~T1QQ&U|Cbwz;l{}D;vtX+b0%JqLorsI)QM+=}zzDStz4F={C^?qL&zaiH@c^!iSQ#>EN7Q)9#Pw zBomkNu&NfpWN)ct|4cO&I+9Vh8Frf_Dl3MTF09()v$5sAxVfLYfiBMy_0Mc`dPM!< z%q`-YdKuq_Zao$w7KH@>&rqHDK#C~kOvmL+Tesd%t4e%UVG5b5_h#CoKsK2HZdWxl zmU6x|d4#89QOY+y@i-15!itN@aD3@s(%%K{ei=_GM*N6rbuN37iQ3t_HV?i#mMOHX4J zY%sGrh4bdl>Ah2evx$X4X6wrVH|UJ*D0noDeNjcoE@$7lWbIhhFZek;U< zw&TRsZVAg8^WAjdghONyv;UA?tJv>LK!e>Trrl?;7>BMqETLxqh@LuLh2JCR!?IQC z6Kc8Y%Mc$L;N>fL%z2)`%wdMILK{&$xfroe!|H}aQv6GD4x zbyL~+WI#p=C+ow744qLNFb3!Jlqg!9bZ3F)m1Q_v0bZOWM*$g+~Et~ zU{Hh1hOQc?@7B?QJz<@>tRdl4GA@%kz9f|0eeC^PN`o5<97DnY^BMi7fpoJjhVOzpJ4Lge0`fvBwjH^C?;bnIb)G{CF^F2tw{ya21c9m5 zNA%KTWV*M`j!rcolZG{+qc*=>e7O!Lk`XRmcG*N4YFeVuZ>o>S&7%~W_Iq2~Rz8ZN zi3a2A_72HiB|~MG5EDYykD*{2qI#1o=I4(+i8;=>ofPAGgO+OUxCUC-VgnHCc>Q8!-xA>Oc zVMY>Os3t60!mKKa-Wx>!y&66h!`F8=TIxAal^dfnKghVVmk_PxBo7z&Vu%_lI9w_5 zRMz5F_7}?wEdwi$8SP9}pR&D2*DTp)Llvd5g$lML$~d2nbi+WYkBoVBic%&t@yUV= zSrea{W~wkAJ18=IX&<5va!+ozu1+Rtt7rr@a~lQj60(p3qFRIcR6dzGXG=1*`QxP~ zl_&Q$Wc{EMOw*g#pI#(}x2w*o3&(fNJx|}yfZh=4$^mK<`wVm2H)}EIMt|(4c6Kn61@fA}W#s_fvU)}P42@Sgy zGg5mGw_$UF{=_+1zIxp!j@3WkUMS0#7`k74BJS#6h>1we*f05pTqi)(aqFED^Q4FQ9{sg#IjiY{Sbp0yL<;Hbjv7n_&5Z*6Q%3+3x=N}@G4N)KsHKpb)rgtFqr z1zDT$q3DJR^WArrh_6X<%f;duYAtD3<8V(l*sG*9n%UvNC$ZgMwVj?#2SyF{>!hNh z2IR^39k*wsC-=_SzOOoh#_~mWKzqCR2$;i0_Cb@wNn3iwE`0w>!fK^~bL{)5qIxWojDmWultQIHot&+1b|SeiubP6Kaz*W&c)5C@9CC5q`ke}3oE1+(JNQP zg;eZxIdUQ1y>Cw0<3ms5U9jWcIbJHt11!gHtT)P;f@Sk zUTLYan>*A}{ZYc73Qb;!T*Mz2*?%KkqWi=oNr@ND5C3GT8z0RB``7o-icjAYapXHP zT(b+440ZXq2)?W7UmM{n=e%!BkJz-)&DR(r_{}G|rl6LE8TO~>16Km^$^dK1n+bSPuJauxJQkrWm*e+{hxFN%Z z!)oMbk|Ys3Jh*Y2#3!jHMaEA`hp_l%3I?{uBEdAS(K zt0zc9te%yWT43=Jz_Y5j7JO%Nyt0Xb{NCVLNyoD_FCGVH_8{h8`$5$N;?op^C(UX3 z*m!8O0Hl+(J9?yBAHtIHdC4!{e6x6S&@<%mnTk*H5{rT8KTYx>DxYy?O#8zWiN(AV zWG6-}c0y(7Gzqn~dqTHAN+5Ay7IOcvv)%fDDn6DBxyo*7@nqF)dzB@2_ePVi=|{3! z#FDU2_M^3sT*{>-YPp{Jiqxz)A?s%(WqwQH+sCU%1zc;^t(~2q_=U>;p9mrQEik1)&FFRKA_=?(0EHh5R65U`_a>u`7a>Prba(t7!5V|%01>q*&T`x zPeZ0h+Rz}pH`l$LLDDE!!D6HGM?poEZPA|r4HSnQy7Jg+P&9s--%5%8^VTIxtb>>{ z%oLA;BKTCd%Q!Q#87J`BaVyVv>#Xn2ZCk(~mj{y_gX-fEvW0JGxC}cxh7STZpTkGa zT>!V1B$v?}3_iR2H?(2bQk8A7HU9nHo?c$~DO@{##rO%GiS$aw0}(SQqE0xX&r=LX zk}JnOmy(>@)K;^P#uL7~nEjRM-O#oA1D^p&=_0M_-0W#kNi^LIeT}VR>glMlxHK1o z0%f@Uw0n`ljzuwPqO5aW29`vx>76rxj2FFR9H|apv5KUKMfrV#26hn=(v(p;eKkOPW=r$o0ai7wp!{&hfNMrQgZ+aB~|h zL_|+W0Eg9@N@rS52wN&7th9Sjy>D``1GYR22bUWJi(@BCElDP)oA#R}jg)IEWbz>9 zIXp#7TVtkbjC0pT7s&vPFPPL@g%>*7-@xax^ufNgK{8a`cka!JgKh3-R%be_ZE)}l z$UNV+gwC?e{VcLno-@#m%W7a@WJE?(kkDzrd99Ek(014!X#E~=aim@EPeAE&omgl( zG978M+T|x^IPr8S~li4(V@R*+|7^3y}p`#Qr9o0YPHX;RR&MFiQ04KI=^k z1-?Gg&C%FXBfRH<>oB1c6!`kVg;Q)!Mv#czaNnecAZQHC2S9JtJ2Y&tLfy#Zgv%Hf zORr5s;ltost2&+h`(o7pLWo?6m1nh;OMD+)oTwSJa=%d~80STrHy7 zy-WJ2cRT`XW5dA0=|0QhHXn3V>geJIkTr31Z`!4~N4h?rCm>*1l%o3%H#ht9TBCaE z8U<)&X=Xv4J<9v+?+?9pE!#4Utv`@pGKlF(d}7R?+p(S%u{W+dhsZ)owHdttH1_LjPM`G9ExdSR5%NW2sknBr3JWL67bquWfwKBh{UGT7l-7T zm1ecn7@)fk0O<^j*)}^Q7+#_0C(fp9(Adg4GwatOeX^gf@{E5wy zLBD?%h>%lI#C~{JCLfrqn8j!O;oRQLODwfgJMKeia>N_@q>u@mL~tCX(BK^>nq{2+ zmS?MD2NPamZE`SXA27GCdGnm9*5REg zgHxIHTw}OZPSNY#&J7ju&{<5)%kp z6||*Pdc5~i086cV!MHQ>`{slsOUr^r>nopHUIN4R@6seoAP^1i>UF&wOe!jdGnB>9 z=+w+vkU3LtsLPsRHV3BZP#jkz3)f43KW*&wCwPi*hI0~Sy-_cX0un&EJb zv4j_!Z2k75QxdMa7RH>Dsg&uTvB7Q}eP3aHM^PAxsCGBODWzSst$&)loFd<306qRoB`y#k)TpZkd{$JJrhySVp);!PXc21B!OAQ#HqkcD!l4~FWkaT!yROAi+m-ZtL`y`1H+1yVa zUj^U0@Af&pC)(;`M(|sohh#V!GtKI&dH}h0$K`i184>MyXkCqVWY>MpjL}pGiRRFm+J3;|CDXLZrib39YL2pxa9>6gZ>?D+Uvf@O zO~Dci$4%oKIF1CI6rimsis{7=-F*9$ONBp<1JS#~bs>`?rButy%a0R?j5=7yzrH0i zTny$|ON+fca;Hw@p}uhOYFkuLf`|fWab(aYU>Cbv1704GL)qj*=gz}Ro1h6-43hT^ zOdrEK=myQH#<4~h>h>h8K#4T8v~zUCcFzqmu8DUil9BuM(@lNDTKn~E?q@KJ@zm~N z4I&%iJIF2=ywV@+!Uqv&!ZSvq;iN`#QpNGyv6e;8jF|<0#ue;NWz~sGIc_S@>HGp_ zLMqakW2o8Y-Ji&a2jEFb*5r^Lp#+AOAon7$hs#t$wzx2p3S}ZBQanhWG6k46-tFgXN`H9Y;vBhFr{P=!G zfAN3t(j_17a!qSOf>Mjmu8;n7ki3>vj4XKk)T}Abur8qT&qR298KZggKd?Jwqu;+! zL3=-zG!u&;2kqxK?*N>XHwq!n`)e83V`h3$N@3yZGgoFtYXi{$eQC)s>=%(kmS~-+zJWsao=h2*HjoUb3at$pi`{_y} z_jIb>F2*>^w?k*V*M;H#bISbx+4_1shBwzQtI3jHR*?i(mepMaBX83lBbXILYnwg# zN>9IY_)QtXZH9@yWsuYq5#y2(#B59}_azvxbL$uW1NRA)dLjCZ9|@#D%DN7^EcEyuOI;6jFq7RF z%4AMAM(6!Ch%hwoy!!=b+TFVYLZ1H$i}E2G9U90`TVR*fgd$3S$R5DBw5*+UtTU0@ zOzii7%|R0>q7yyB;XL6fsV{8cOd)hW#RH!I(@`A5QU+2O{@96u-_Oh z;F)H8muFktLq8d}*5lkiTNv*n!te%|9niX@*p&$KZIxEDWtwg=nfmeoe)e006Ia_?WB3$NLYK8JqT9V-1b>Cx`KyF8@~UTXv$$9X=S^2hQdD19^?yj+!c zO~jSu1QX?+z=Yq6&P86vR?4#6C4V5QSB4}dGsc;6A;#ukHfmQfmKE#sUrD9QsHvD> zn7X}<#^yi$@I94{$wZ~jIA~~Ra2(njPWG128P+zQvhOLR^4t~$Zb>*6y&W8kP?zcw zbiN*-k|biEl9qj!*=>dBeRF0yt0yiF%=g;$scx5|Ke;#VlwC`l71M39=Z^%|ump!^ z^7mx&erGBbG}>fGh7QnT8+cGc*W-~@f=dGGMvN{B2h&At&~AP5U2c`qIkxF(A(EXnjsS95(y&V#O|~_9 z?p(ObD9V>W;Dld=kmXJv>_S@htY5MH4<2Me{(U7%Z zn7N{MKOVx}{gjN)e-*5uGA%rPjY6DP%_uxPGp7DoSa zugzyl%vAr%@=b3GxjW=pt@SMuzI(dD_R*112wG4pFRRp4O-O7b{Z1WPjsG89o`9O# z*2?if))y3Kx?bZtEZw8ODO zBZ>X#T)QzM_%&Uy9hPJ+I*O@cqhF1>L>ei%Y<~ak1yH3o1Fq0%bVg)|qYC}(M!EyJ zcmi8upYE#P7?GZ&hyQk217iY&cW<*;mQxvPX zBN2>g^$f~)6X-iT(;bB$N!9|i|2(S+KWppCQEPf0SGKZ#yg{orT$E8ElAx*e-18N_ zx=!Br(vh@2YLs=T$-8)*`aCsjmZOa}63802lQVClfXYk)J3Q2eOB7k>G>RKEQe}fO zIqZqYG=KD4!UJmXAB6p0*FG0{Ftu^;hMKm!UeG86*wHX+RYr?XC5xvfBsqWdTJvas zp-;JEaFNgbbmw659?x8pH7g#O%JvIxg+F^+#1i9lLxj897+ZLxnid|@AOt>|hcR_3x$xic~{U`NA#hqJX5V_I#YU{e=0JfMC)! zcCp6mDV%j(J?=6rShjb$>57cUr$!JLFWFw#l@tBJHb5LhT_>Fm@9<1!D1iPC3P>K` zk#gU%Og*W#tty=VMN?ZIQ1J_<_hYjos!$$}7FWU3i$)We6V0U%g_8*4<8~KrV#<)2 zV(rVGfW&^`eSLA4Cgi}{Rzo#~)r8XRO3JdKAFnhm9LqCRjfkFRGBu&KMW&rH9TSX0 z5W_SmNu3d}+H~5&(Dn};!Arb6cPi?Z#H5N0XDI@f(FEA9F0ZuX#uLQ{m@%kUx{Jvd zA&VRN!gE>T3CIUpRf5V%GG^$gsCzC@`VIX~Qe&qhsB=kr(tm8hyj>+%JZ7AzoZr1nyLob*Fnxo&a(4ORymn!$Xc&bN%LM zIs*y;Lt1QqthcuuW)VF z&(ET{{%x;A!LL$D>ca87F7bDZN9yUOJrQnobeG{tGs-h%(u^8EKF9az5gzCQJD!4T ztoz%U#_P<=v`MYr$}@q&!krb!6WF+7^rB`L2uhzH%T}wexRH;=bRzdBv({By0ZJHc z&kvUD<8^NSZ8?b`yNoX`oDkyD$?R}{g@m@T^S&)^wYKtJyAtZBvZvXre@RCG_XLRl zIXqRqu${eW(PCs zdhm9x-T(1c2&ktT!pMrQQpVgV^v2=~xIoyS$m@F=g<0((XjE#f7PrZ~`uNrGElm;o zcBJL^XP1)bsode<*kh8ro`nTcqAAM3YWsd&r$BcU%$jQD-A1Ax4QXh z3YPIM^#1dkNvrCIY%E-O#c!@@X6)S`7AssP^o8qb2Y-&8&S_VN!9K#u@$3;XBwX5& zdVQ94YP_%>T zMI?wDdlJUZ>AqEx=un3MVr+VpT9Fi{r;k@==%H`ZTwpZx+qWZyE8`Ibl33awG$AHJp`^7aW_!;btCi6}F;!Po) zB}ex6fZGaSY7-Dzp$^*RbsQmfJ>JM+11`uuFZmxSsa__(#-e&3LjBrXg`q+sLng@x z?jrh$4))0v?kQ73H2hS`Gm)qN3A#~rSm!vyHId6X69G&LF_8o?y!umcNJBI6r!X3P zMDnvb9&m*3dqY0uVjo3JZ_4^Ul;EJGBkflKyVz#rJPV;?Ohr~PSe|CBITD4w zTRGsa^KeIe#{5r33Ng1c3NwctJ%GLl@}A$@g}X5NS|GG=92sB#^SX@dc0CD^8|9n@ z8;^5B%*CI=ag!*ZvdABNb1r}B5D>@ukpNyQQ@hG@f+EeNq(-Zp>fVEh50miZ#}6u) z$@^E|59>(x##8#c@&b&HiWtBkIh!pHewJc1w=CKo`yHX@C*zOY$e|YaP>v8#p^V=6KZw|A({f(Tmd-x zqQ!@oueL}d$}+_Qog^$saU{L121EYJJcVZ}#{%fu6tcPSg2OSkgF1M{B_w7JyH?88 zt2sf*uV_nI_3nYWK3zicy=ErEaWpd^!V!^y>aKv-RGVs^ne?B= zz^KJcM$z)Dv9m?D?;xd&TWW{a6S^%yCE?z*Y-~C7iW|e{eL%W|x?GNA zB9n8Owc~uHkqpm(T#CAsnP|T{9pv0vwWe%_LR4C_w7RUO(h67Ty7e@Wa7W|nr!QRk zdZgN#$Wm;>gFD7|M;;%Yd~XKrdF*FV;GWakO}3!`9GB@%MNb6=JpH(xXa_(aPY1TF zETB2(kfu=O@UAGG(?-;Qm@|8n1fm!%NqFzj5NWo(V>>>p_VBX;WSXj0F?}~QE8N^N z`X`5J8Im+#2y!U$sviQAvvOYSrPX}76W7>wo8zw2v1h*3`WDOzf;xJ*anZ;Sj{gFi z9DP$3UAM*6hj)cT(}uc3(#vJIQ%N$GEq;`^CQdA#O}p{a^et3^N+Q23wC3%6q@Kza zj@bJyCSImAo$f5zoeI4CSdB1kI#!$pchHFAwGkVD_I7UV8@~R=xqK3cLYfvZ=Ry)7 z`yv}7yM55~7|HWMb^_h_2T9Hr|$gih3tPkZPWe50b#?V3@#JFyPg0D>pq)KSX@UJw>(>C z^F2ijB`0y?Z_%${u&bHbsLS0k!zg1?1YIO&l7`D~7`uQgEAifV+VJ4GvFB;y(bAtu z;2Wg-MEFcMy(XDF?JJ0dFk@DdCXY?030IvlhUe-7UBg>B$8*01L^~?4C0|CiLXGQ{ z;-e00Tn2U0-=mjixw&Vs{bL8FVBx5Ixmy}mx{QZ_rzs};f)Ozi!8^xo;o9cLpzmd3 z3mwhbr!3>RDi2VrV+$$pxLG$>y)$f$;PJgy6uWbDcW6oRp}=J>&6?T8^VPw0iHasz zfbPm=aQ03Cw=Ld0=`#J&1axtZvXNc?6AT6_wvmewb zvJlXQ;X)V-w3g4yO`fSI6wDv98H47-&(&+s$PKl1<-3?|UU9$HgC z(;Qt}1jf$q{V-|?WT)-5+$Y7J;xsAnb*0_I0raLr2U^VYmJ%lv-YYY?DxD7OvjXC? zbCrY_4~)0EPu3Q?WMk&$Pgi-HgP!k~L?H+(ckU^LP_XbKx|2*3^BpDUOahl2%4Y`Zf%(pxj z#n<6VNJ#iPyz2207AoP4(&l;|uf@=5A_*2B!_;lEWntErET}NfsbDRtp8;34x*l;M zVGu{{hP!87LCj(4vgN9sVTrC?tA8*T0&0@-K8ug3^9GccSYL%Eyq)lIsUWv+LXa3X z8H!n)Y@ugl+#S84aJ*2%#fyp>qw(@-Q6Ux#a-#|eTd@0_b+9rsgOkPQ7xdiOR_MC? z8=nI$MuFaCq8NQJn}0Ev(+7}yyfFyXuCtgg^8_ssJi91s z+c~{+$T~0_i)Vw>!&Ztp*ABv^SDO1e1RZ)dr->}JyUIp)*N>`mSX-Y*oYYm4N99N| zbYSj_K;Nc2Q!rY^*Fz}JituH&&o(qNPxYG`;>pI7$V#(MIYh6ADEHZZ|Kae~ntzev zdeLE2O|2NWx|UVcbF!_{YObv$Tt4!z7r*y?8DCV`iwMlh;?LaJ%tW6dbaZ#_J?j+WyfgjRLg0 zow$=F(3rHe`^G!Vf6c(@i8^13`Oi~AuN!!LuVLVLZKNf z3W>FY)KTQpSX4%<9V2zT9l|0pw(n#K$1`BgLWR*0xFA&i4BP7BF9KHwpLZ3p?XPJb z*tSj`lu=8V%=e_E*AKZ-scRu|#lq+eWFp4J;o+3_pVXfJV8P%Yy(hKuQu_$Oc_9%yK77Bun)+ zccsIf0mMAjK4KL^CPcXD*BNY{#+;!+gj0=c>MTIDS|}_Z!rStK0MG2qdukX4j?rwM z-yw*KZbZDxO0j8%CqAKtT1-?542yG~?V*yt7Q2eEyjnhzNfi|p1qb2+l24@M)LxNi z*y4Lr6aCL~HUA3W4UX0vSB>B(%!LPGR1cG2|tCY;c-Y^~%xTipJcD`RtQYhB(mOjbE<>xnD zG9K@IggdVFh}GAzS!&OT7tMWB6nReMG=kmaBTOW#=~%A6Vb(lWkN>2y>3^M7_>n}H zzSJV%`!uiRYdAvpx z6(n-mAx-?D8(C^3R+X-p2x5v)NN^y2XRqff7n4MqjE+lgKKU!0-Jl{yNfS!~i6tp$ z44^QkR3_&&S0EUe)a`GVQh8kG73>Pc9f~C9>OL=C)671V;H-n<`4Fa?wxd!!=z)VT z1MUZ)Kcdl?Sc0^4`?o6;7WmzI1yE}4i86!Q!;H*zx)2yysqFpM>ffp#8GrquG?VNY{2Dr z#R@H=h%n%qB5j}i1jttQrBmi1UJsCKi`eboXyVkD?0lO49S^`G||-WVcm6 z72T_=?)f?=%_8E*NqeUNDuon|)5eHr6)qjDjl8vmO0|7vO8LFzSoTlm4NCX$3UWS$ zepjV%Mk=UnE{xEkC#EMcb}7hY=VR{>2k%IDLnP`OnV7Y-1*zP}&le!m{5N?eL8KWN z1hk<8nia>Ze6&K$Us)(-P0v#EKRlXhS4$~ioKquXRNoy^(fVeFDBL1xKo({;(%%a&N5PRYO3D%n=ErX`<7u%cLX_BRTvPO`XpPKunOyiLitm;jr`_M zgn9hgM#JiQ@i?TeSiV|_b#&vej=W5Ns$57$_gPbz`R$(GfcPY-sce)7M^V2S=q8?+#jjSihX4eAZ2ywM!(s5q2vUvv-lo)`R!9!)a zISX9y`x*SmMr?>0i7j%Dhi89pkKNevQ^-0JujK1`!}DG$MG@(}jIm0W$76`e$kIHm zBevBl#30yr>NnGKZJreqNnQ)qq}&QZIFQ^N3CJaplVS(GoG`C@6_e!npFEfUT-^jr z|2pnqjVDWfIrj3cRVNGzd#*Z0DZ9bBf^`k1r!s#cBg>8VMcMWGfRlcPQ=YEo&>Da_pLx9>4S+H|Fv~%+7 zFI*7Ed8fsJ%OQkT{C*$AZWvNh)kNf)D&Q2xXQ8mR=(9(4`Q9*?+wwFj-RJs`CM5ly zdYBeJ#GlFr=NZJKc9Kvy(W8FwR4v{(D>_pmlYg~!qud#i%!}R7Jm2ri0pQ&rQ{p2v zqPIv%r*dj+LlE0UVCz8qEuR~evN@0`b-=h0cGa5H)MNf4@u0@9h|FkY6Rrw4&MV+B z+lxhB8OQ_TjW2+7Ko?$B{!*pU*8jK>@h+L)4o5CYpVP?A2dSh*r<8fk_&D=E_)@>& zrbm#~-~IYXibokwxf7L8$Q1i~%2!fiB57G?UXlPdm?4ubqn6NjXc@(_nf5cPwBT(> zBH+}f_=f{4l}vIU>?t!J*rW)`y?}&K@#PWrS0Ucw4TQeq+>3pVin$ifMlWc=xGxu{ zSGOzS>1-d0NB4$`1>XQvA4NMEwx%0o%jD(kUM{`hbJWob=lQ0*p)9Wj_lbBB2Zx6c zvRgMkJ?fuv!Yr*6yjWQQXcvceQ2{cc-&9M&qR;?w$%@7R>0pf?De5;n3as_zsQXY& zB{s9=&It-7d~c*!ACi6?r$nKg4?Me^!!7q6O_OIIScWo>*a~gDV51P`G6nWPCp z?xni#_#00&ZB7i!q_<~EgtdKN=6;QfzyeqDhqO=1$IP7T^k_#Fs|`csSI+p|I#rSd zyZ|@WNx#%%lKj^j0-R1xx>YHKKfV|UUFg`eOtz5%2}L@5wUPF`zp&of#UfM?i{Mt$ zt^CN;qCTf7zIr84#&gB%u+CC?+@NpCOLQ#Dn|3^=GF{=YCJ1^-mD@wu`c3+wH!1GL z7G}kABu|U1Ap{QtkGdC%>ym1fHY+}{E#>|Gsb08V=f6$YUt`}d{i|Z0Libu8zgLPJ zz3yWXdKu&J+ng$v5y4|XXEpFv-g6z@u+|NO;@ba-S(xm(RX>wa9KJ%G9RxL^Guv0e(WnPMZ0Wh{qY4)2-5woiqhSM z%LI#wk#oDY)y84J(+>oX)@4#s#fiJ3EA{Qj`KzGTZDN9NjvS-B4b z_+F))!W%&Gz{s^tjcS=-G$IhtB^aMCi-u@rRtzfLoCF<9mWNAcRw~^p(QctF2T^|t zT-J$TF&i6q-fI&fmfZW8tgC2jrr>4XGe0StSnkVW z5ZN*(Y!pX*VP06?YVYkCIPiGjG&h>i9%YDFPdYz`0HMbE@k&GkvWI1Tc)wdri`cuD@2*rLOKN%RS51@&dSOVFexV{5s7xyu~A@^nMoPR8)~oA{YIQv z=XHZj&mf(U>p2$8`h0QbD%i*2FT{hdl8NZ3BOBQ24dtax#vmcd9OM9ID@V^BpV`#W z;|Ri6%xV>HAi=^E)e6<5!vhdy(XKPCTQU-QJhr0%tmxg-X}Qe`Im#h^nrE?-o}}!VSrAuS>LfTe%;}M)P=`HwchZL z9_LwZ9qn1oruPIVU*`#EEB`FQ^dIAW(EZO#a^RmhjfdvzlQq=x`QJorvKxf9R_%+C zX`)4A@|cCTzwV0WFs^w0Q{6WT2Nalhv) zSIBA{|5qZmtzM}*%$739%E=X!Z-*IRqSvz+MVG|}6=Xf~I;Hd2l429_7HuE++czjB znnZE>P!g8kR1J&RyzgH>n^tpT0O=q&T*zKY8E;B|XNfLiOfyU*sAli4OSnp(_gm<{ z>X{#zAuy&V2xN}US5!)D?(;|pi$=YVsAJ?}rs?Brhe=$x2Un#e-80u@0UAgx`#zx< zo4Yf$PK9U(Vk_LUIV4Ql9Dn*=XX0pbZQPcNwcoTaYP8ReHKWb@DpW{aqQ^3!8Sz0p z%F>1|DR4^f7O=x1=6)ZVjp_q_C`5YwSQy!uJp2qjGB>J&P~e#H4)(T_y|s${kv~4e ziT2fFc;QD4s1dhNF4mf0_7wic$-e&6Sr?vp$p?e~yl{kxkY`y7Qq-MY-RoXV3-DC@ z7y=aQ-K?OUM`_wD&-8B^S-0HVI=z+O>b0qXCi|R*Aq3z<`th}JpP2Bi(P952H zh{kl4)~~D1&U817yn-mEyc{2eQVUMP#0PGh=am*)=3?#-S{&!fI^GQ5sq5;O)kF}I zyW}wr&_p-=Zi@Q~aNs?QV_S-9O6M4f7qzC6Qub;)+kX|7$IPUDLwT6w}H;kav*od2?c&yd6L zA9b|s0Z+t8+`)YkUa*kN|Mi$2g|S3LrCBDWWNm<$X&iCP0fIinZe?0^VV zZ7)Bh0yK(haS1`EY$NyotESE7eq73|`PhEE{$vYSSul_~;fBwax z+_KOAabWeo(8jGsvd9Kf!-w);#s9U8{J*Kl*TN*og|#GpJL~b^KI;D#UeC+@b5loR zsHA=WZ;kc;1!4~H|Nr@)?49(Y))oEovbwycN^W?Aqjzwyo9vN6W1V~Fi_n>W+_SCx zpFi(rE-N86+KJ~Eo1)FGjjiSXEbQNu3KOd&@>DSSuSX(xkry#8P7!?(T_rsuxe(`w# z>!%{vFeroLzkgrnS^j<1R4~3f^UHZ6*;pY}K|wd{%pACSGc&?p89A+>hIAQG%p%6BH6^rPl;J>B zP?xt>WcFFMr_;QD9i&_BNuZqgGbRslo+fG7JsFT6D+_s+b2{vC22wZ_65jag z(YEjyNGtoNeBc1;EkEgR6$|{-6JQGx5)$g|tM;vVZ0RK0n=kic0N+S7`^KNjR13+8 z*pxEHT$8J&eYrfC14u~FmFSeUC9gaX=~m*5fx$Dlc7A{SSvFCk!Fvo|Vo-dJMsD5o z44N{K>rald_>-5u4vR7{q)znHyGa!Tuf!iFf!iaK5_JKhTR3B02N|U!JBGqT{AJ@U zjY9po*FW~t2YeHwvhs&KDkbM;r(KOadYepQY#Zv#ni<9@Y~vL@Y<)8moBA;oO#UN( zMjWiWwj#HtOHtcZSm5R>)QjL0*G4)L0Xsj28KXfC8uyp}E3#TG}v!n`KU>nzpJn_630}EV@7<_wX>t zZwZ}I6eRr!aJunwWX)c+rg;*!?WFVHKimyIV+!N*9YkxqKYe}p$|N+b5VQGq*TBtt zR}(Ga#~}VXZI$M|4Ixn<%V|5d_+$YpvhW5rOu=H+TZ=Ty7{w*gGh+}@kNX%;xLJAy zOsjyADq*Su1^VWV!TIa59kCv{;6#Cb)*TlcXz^StPq}!03GJEQVVZv*&yCvb+&^R+ z@ex~oh39nAmztU?qE1KP6jDLPe1Fg9c6du%Fp}PPgOK6tA=1>;EP7vzr<{=cB_Z8! zYOuKRf(JyV*ff*6IxLu-EX|UWDc${v`xRiiv3ZB^&iwe~a z1xwGt&ymIF8$@ZHf@cK}15IKrG~h=9L!P4#pVbssrUq}9h+7Aq=ohC?m!97o1?UBx zK3ug_ruUqH&tMgNP#fo;-Y6zSSmC!l7=8-I*cqW(R6;f*xB8^tN71aa@9FkI-VG& ziLefkPqlTt51T}R=gl{N7uJu{W^I)<$1_P;r;aC-QkSR`CF6K{bs&@^kQ*tVdK_D& z=)IJIff%h=9Yb#SCt0GAIL{(u6+BNDJZ;kCK|mjGqkJ%W-62?bagEr#{IZI$;-DnD z{Nyy4V%%mv-RK2%CByiVepu??U1lzcu5=!n1$2TPVC+bXUL*@cv-IdU;!5`Z`-L#n zaRmS~@n})sXWd`U1Slx?_zejhI_AzT^fjEMwIVZXt92IJi&awALn(HiU7ejP$mo%_ zl=0Ey(@$}qx1MHXLbbINbC}0Q?OszLolvN@#l^`|PS3f!S=%#qKu`D!NkRo+s{+{* zM)4~{o9o-_<<1I=WU(^`QXV5RkZmF&y5-}y^bDkO{gA!>iav1m(=H=)~It5!l6~zccn*wf4 z$C7aG4>MQ4M{KJ}o>J{%Lnq0ZYi`LqUp{JyV^aCc4AV)Ty(INc;u1q(pSIT#{{>J& zf{do+nsVWl*4woT+qnn>}Mhozy2v{-mhF z7DPDi{@g+7h%-kFTdG7%rco$TCystc@D#&WrI5=WBBtc6G&CHHJ8sMxl^*7r|B?~> z3gs-RDcY!^rbC$b4{%Y@=lp+NlK$TbU;Y&Tu3y|^{wvVDPT9_oTnIK*R0Yon?^DU` zQMG>zyzI&x5J5qEQ`eNy$j}dBh$l^79kal-3$32dOn396_vU#PUM(&eb(l2*WrU>#B7Pj5)6x zR|3C<3oiMl6TAqrG87$UkwW!@wn{IlY{!EFQp`Brv7S-!@%mzWYG633_vL>?c;rRX0wKw$Ym* zk%E0{5`T&CCb9F$y`GpN7)qqwS;tJH(&NogkU7 zhN3L&?P-y!4jiUzzT?w=ozjr4*|!j3hNPD3ofm=x-7bA&r42SsU)zet3Q<; z6_m=rj5)s$=%Cm=_qVGr>Y|E=pmVP*T3SPc(eH7G4F`uyvv~Ib7Oo=jIbkmf0>8qq zklY~m-#R@zyXXvO_9=H6(D|^K!$M3XKBq_*!=pa*$oFP zBzh^$&n8{A7-A%1aom5$3Up*EKRH+%8oP219kh>V*Hb208veIl)fB z4>}V4aM!;4$e!bC<^^8YWdR&qHLQXk;1Ba>e!N727avS7%*^3#UkOF=;02^X`!@GTcSI=+HxFQG9b zj{v!q_O7q<{E^8v*LURnH0_mr_2wOK22I2<-hCH9?(Smco|84TW$!KGw~0w;!c|6B z<|nF0=8~&#QJ3x;(Mu+|O~0#x3TEdwL+kC0wQ+jCy?|3E4O?R=*#fjlB3`uxX$3W9 zL@Vi6_?q5;@>4ihQR@_{5IEWt`|}6z4AMl8RJL)T>>&{-xBLa8c>s~&^*%1d1>TXB z?*!;jUkN$<%xg942F-wRJIwu3=+%qhUeuAJ(6PZ}4v`Jb8uT%)SS8a89#K(gd4CDt z64iPJ_urCsC0aW?nB@rI_(@f1K6#%FbB1FXcEm zU<`uw^aS{G0~fxMuR&o+2p=2>~I~fg!G*0(zFt*H8%;!Z_r_=T* zsttyt97hqqb3*&sO8g=AdPPwVBBSmWAzG_}sc(3lH$4O!<+!X1!DV{B7}y9XccF&7 z^S41b)j*+(-@wXS6ywa{#Jm^J+nRBaO=@#c1;le@Z#BQsh3Rc6wlGTyH#Ed$a~>)F z{OGtcL@Zp5fPleOswP8efnV+IaiZ&zO!R8&>ltsPAh9kvZ;4%2C^K!B7;@PIEv*Zn zhVd>DuF15+!-wody5x?fhnr4t=wb>#nu+fPUq7NGsLJNjY#?Gy-mP!2zcmB~O*c7_ ze+%zp+DjVbQnH#k-f;E3J8+%&d4+b%E1?q1MMWrzf~uTT6jr0>*PhGGn7Ehf%k3JS zr~dik;T7HiKb$k&$?o%F?FA|%d2$ZM4d{nyB)3V1hGu|A5;YTKWGRTA)LaO-^+ah1 z((STs2bh(0ea3+OwPQI2wj_-;A51UgeN zyDLi*VS5R6EZH{4koEtMO{jZ^f2G5m#?vRl%EHbUWPaFJOG_^-Fx6#>zg5B_!dqK) zki*p><6mBl!Y>gep~0QHjV&7%)Rat=C#Sx@{MYpyQ5sDDc84T4dlFPT-3Eo@CaO+{ zLqpft@~GR`|i$pF?}nyeHF%?}J+!jl0^| zJ8mO!8KrDY`SSCyk}4Ya`x9o2m=75qst*_rb$z$g{fHl?ooN!7{xVtNpEZUT@NH^A zO`exEwJq;S;^U5QgiH9m-aj?k;kF!O7nv#xlO;0XWa(Tx5mBs;RcU5hVqarkr=a1) zkF`%kY!@lgE<8onS+@Ss(ahIE1}Z7@yo6LL zDyhjG7xSCW2X=igmz=gwc}T6q(#;(k));dN@}KGd z1Dr z(knp@i7o?qzg$4~;&0Rs6o&2$R#OV++D4Wr05qSGo(MWq5AGDhrCQcF3hp_X` zfuOs#r6t0-nkVJr648DgCwsK`B3We??7riZ-^}A;t$j?U@h^OKz%M5`1D1oN*2YI# zq{j^?;T{#*hs={5$wSbw`lxMissws|je8iJCgno>?bL?dplrLkxtL2<-QXRv&Bcjy$Y zgQ4EibdhpkRAa@*Izk_1BSz4{8v!0``EyqIr*7*r`eD`+p-vX~m}fWo>$v~?;_YB( zq6#APl{;l<8&8wctraYG>~r-L+}yz+cc4EM4U20*dbVsi)jP(NlDIY8b`m-2Yt2Wp>5|2> z(%MC-SW`AEj~#z~Sfp}_)^9};mJ@x$SLJuv_r)$TiF0L6Whs;#u5WwrSr5L+U$C-n zwBCxtNr|=N;F$@Z=F+wRik-mxY_}8hWJw2NBp)|G00$L-Q(ISOu~2`Z`zG7!?`aqN z?uM!;Y$K9A40%m|Jsx^hiA}(nB0%9VE9q#7Z97g@zy)h;w_bT*QQ`IJo@0Mkib1Sr z+)e9iq9v0jJKC$m`c1pgX0XaqMvs`by@R>jeTcg8WRu4Fhs7yN{q?m-&~pYDtR;{I zm-U-wZfIz3S{jGSSRRs(K(h4t3Uwp$1dDz1%Q-}4HyoG|oFNhD7o?CohdWZmW6WwM zBlJ5Tp~~8`8^++*y8I}i5opVSgvQIm$_1`3{rX80fJwNJ$7F#|lKN7U)JWg%KJ&OP zmfUPgdV26DJ7LrQP94>qjO1xg&l?Q$#r-~Zljd|KtCRC{fgfcW5wPe;{>so_vLYdw z5@9{`j_uX&*BXbV-@bWS3Z!UrRmS}EaVn5bj#+73(FRn?IgA9!s4wUHb-+DA>m{8EPWNCDPtlMN^*U!wo?2$POKv$eVe^6sH5m737asY zz${<#xWE+i3k#}V%qha*;oZU^RTr&lGgJz^o4yiZ;0pTWcXVkylZNJu25~ieCyXF`R}d?VGETcx<#+XF@{wTe_S6(ooLW?d;BYI_;FO zYgY>mhwdY(8i0Br3)^!1r?U$Cu7)CcCbmestc`M*8qVG9*y*NKw$DJBD zXJ7`(cCvZ?JUu8bJ-#@`f$)D=0BJ&2)cV0J*&sQ)P-=Ybd-m#dA2orB_D56B0%b+ zOmHm}tB9P;QW2kB#?WZmu2|yBp zD@HiIJ4j=`P}0{BFnhljITutp^3sG8RSr;+z09cF9Ys@oUlHhAW;6GNYRd=(xPzov)G7cbbZmz8dtgfB5=BLbEA` z9*qj(c&A=KT7HP-pk?Wt3w^2^sj|p0#6i^iT;!GH9IDWal8DbOmaz}Ca%U-lBT>uP zHCmA-@MLYHg!iK&4=IOUNTn<}im!yr>b9|O^MQ|m-K4k%H&GIA6eFLhfd{&otY2xTmEvY zHh!@=9qPJBPwICoh4-gR#6+Ez4#rhp*qfZxN__j05O1q+WIiWang4$r&E3oVt4qRK zp9*6y+&;;$$76RBWW=f++%ke#o|hpr+!@q)&izl`6@+*?kB`y&KvtFQ?2TOp5g4zW z-GuWKLyHWq_y&E?EDGL`Mxq3yQeWLr0yn1bO}25{4~xyJJN&j(s2VuZ&=e9Jp|W4x1-ap%|lWrdL9HLvyd zn_r*vB4-ei17N!N&1hNKb#&SCAM%f5a+opuox@Uo%LS!jN>0eS9SxqE7|7!{J-8mg zSp_#)-mEze167d32PAUs0oZw8yeoOv1vL^&0meeJ&Dh@$F2M*CVrcUxzP3gCc{two zWXm)tENlM||NgEl<~^a1@K}H%+d-Cn*lHJQ-#QMtrkke?$~e%KL_+ol5m7#@30LyQ znTfiB6M`cbNNRjFz$3M$B}>|ss{CO-k1roXB~XS_E=h>gD94-xPTO%Fp#=R?W#fTE zU5zE?|9o%Csq;}rVYI02!Ly)48$r^T!WkFbr(Iy)*G^TWyJ3vR&t$U`X7^_$r4XL{ z^~-X6VTIdF7%V&nX*m(gzR3LvVio~+tucBxPGBOd$ z6@&~Z2bo@rg?BF82y|c-WEny%!Ed~7Cu|Ga8m;48hciTjlfqg8i^o|{(>W6ll-qUY zn%j%VZIF=_WCFHhoiIjQTdHJ1DEa1)cTe7AYd6uw?&82vBu#zOwfOh9iIu7|2>w+K zarPHm9o)-rbdyE6on1cJXbpQH(=9(Fp4qAp6_5abcS$k+>D2`I!_v>^Vlw0A7*jMkOD~WoeuV^Sv`;^=M$>2uxC*E~tsxWYhxhiT$_Ry7XMR}SAs2BTlKciHg-xS18W{&Nx_w;#>!*{aQd)n&y@CmCapp-P&&1ZxhnCE2F}>BNL-S{7qRb zUDf7KZhbA0hL#C9*(wrGx6?*Bk{h{&@TkhiTQU) zK%`%N{us+Ly77L>roggGAv1d$jE36Kf){$t@(^6=*j%-m9t7FY6%Uzr3ZW*SGb zgcYm$oN0EMRNabKME&HHysNZb;ZN@bJ9&q(o=<)spl|J2rIJa3UbT{W#qi) zjG*9%?&!H%?s~3zJkxKA;MSvWIeK{B6e`~9Dty4V@%Jh^nJKOQv}K*g*HXz9P1qqH z*uU<@oa|j5TxgjVJt2QVzbP+9Vrn^_KyzDpV>jcQP?LuTA&_qwPYdS}dxj(6Fz43R z+w62^tcE4(Pi)YvXQ51Z<8_0~3Ip#h%?;Ym*4KHP?$wl>^cxs~d;~0S5OliWJF$74 zk_xz9US79Vf%dw8Ccdx_3wpuUu@F`rDK<}{PepaUbC%_mset3 zw{O)7*A7>q%&_^;_jkz>4+o6~q&y}ReJ6aOW}GDSUwRuyn(y5kl)m&0_jk94kQy!4 zzpNJ#on>CV=Mx{_kb|TMMOVU`M2M1)C+9q!+Rht&V2H8m0}@izN}`@hNkF}#Z90rM z5i#R|m(PxG30|@2Uq=q=e262^6J=ztsUT^;v5e~7_{_s#{0CW{lz%@?birl9j!(V| zdfrzk^n&pRBz0qiy9tJU7T0Z|$U7-|h3_OXo!(`=*X#OP6dM0@`9Xg@%31u+559jR zI-mZ;&Fj3}cY6dPpSFAEw-UN0s7L|2!`r>1B)aD(7@niKFO*nc-dh@{3EAI}52Xng zB*zC=vh1BcRC#6f;kJBJmREy?!+LTZ3|7N?7zCk5=Q}S3&Fa|qPA;y*G;-wyl?@0W zjCxUg%ou6G36v2s|Fj{tSwHS*2_>f6v4C3CJ7*&`=J*45zGq$a^K);%o*pYW#W|-M+OFe>#y}l(Q4| zMIHiD_QdZb?~g4S+s-rY!<;H`NSlF1-53=_;4Gfa&*HYT_UC(2e_(1H@5?%-&88@f z^ncm+b>{G%9|}{7`Ar8J-Nod*3BkFS%zT}jNXi!%vwB{qB40H7%a-3;d?|he*3;g_ zuvWKKPhD)?5vtDTW=h!1vm=eYeQ(G!m@e4yi$x^a$|Z9rP&Yz_{$6r^7>|Ro9xrpa zQn6V61N^u2Bt4N)C3~1K_e7nH#_x~J%IYl(i^x0q9@LvwF6oi-dR5o6-e)EEca>_t z+En44i|VhA{^&?vyA|gj52jKrL1Zt8$cD#UnNJ4F(v~TDUDZiD{yz*g+5QbR)n@%y zs?zCbiRj(Y4(2Z9S{%z-=f)}QYW$u}3LrNp%A>N>AcEMYFDiU1$-h3(cH^f8$4PG- z4;-18|0xneZtVz`I53A+OyMz8+Ue;dzFZPs0{)xxyjhZao9QFkmckZpK zfGtN-omW;uhV3Dj)muYDWS~Vx-;kjgYiId9PQ2|KW}X~hQx{|~d4jr|lF(|nBGV0_ zm$AD$Mm?byZ6Qx+$H0*2lDqRGztd@|u)Fm~x$6)#xBXMJ0`)A*S&mqmt6LFH196HC zj!E+z7(N&b)_uvIFiO}y0${Ec5lh{RWtfR}@|zE*{##OEBsvA-9#*@=lJdY?&~3Kb z{j~#m(Z{!8^igXcq>WT4%Eehm$B>$la~gi=#060?=SRlHX-8pIUbVU)K-w4-(@S!Z ziOa2RGR`*jp@?{|Z!XN|rmw#w%W#y$YKc<*NekUQ=($CTI?b*>XY_-r%HytjY>a6otIxoKAiKX zi}+z-&d~3zP`rhk2eQm`42(yQG^2fTaSqvv^~f z7kk2{*UQF5#tqrt@XJZ`;WMPE+oj<&evVE@TSr2TwKC;%&zjm|j z8WP=&35Sn8& z_0a=ZkGu^u#_yeN3)yQ)k9KJRN=#LFOsvC!1$aN_D$$MxX%$B|p8I9_Hz7m9`fnS9 z_Mog&4FnHS+p8A7g|?2ceHpW4Cvi#U9zUXsKP4XittXchXp#M&YmcUX zhrf^4la+c^&F}nY@aG<7&mas9SP8n;=3C8K>?XkF6HGDF`CpHor5(>4yD?4ou4w-J zT9ldp#Tm+F^0RYp+&f!3s5<%b7VLN`2H3r(Q9RhJbc%=+1Gi+g~$&-i&Jr z-d_n^daUfq%hJtqVJm0R1ilhSQTI4h>@x=o#~Gd6l}d1K@IR~WMdoG%zmcydGPOL@ z>qN28UzZ$Q_=~+IL$J2T;Qo!ZD`GF4o14^#Tgz={)b1IHQ9%`{RspEuY#zGcjLfp= zim0a~+PtB-Tc#`c?aU4VWw<+J$qK0K0=uWpo>m;N@LpPHI;n>y3TgDMJVho0`Up$M zE|)x3+6pc->t;WT_*wE~e$EzF8HjqF0?ubgGZdPN{KY(&lWTF(MPXvT!8YKs?~H{K zaR&|omb`wFMfoaA?UA?x=Tn2I@r&aO@X9S1IbWVjM^W+<1Yr>J^>K~WLU0)3eld;U znx$kQ`<%-qJT0v|$GV$G4-J*|E}~n!cZQw5lm&FpiJ-CbOlMd-Vbf{0eTvKZ+XJ!?rO z)w!yBUPsvgRog8J8e%no%t$&rYx8Z{Qg64J<7SX6- z9`y{0Mj`_ycv$O!tJXOKeerBACPR~rR#<)uzq44reKf@!0RQ$oem+rT#9%jBRyYrR z=T@xyThe+cb688`iZ2A1Vbwx8%1oja8gaiKh9v^NOi4fEG7#_ea({08JY7X6Ok3@K zJon2s7`DWq42?6r=suU0r-pi*y@~fGT+J?USUIBUwV5>)Q>kjY|EP|@I+dd&F{=I{ zu7;d{DMIpZU3!FQUo|t7k{-&^!)0bENqn%=YD&XmpAM3^>(4H{(5JQ*3-IZ(sDm|8 z3r_Fi+Je(5e>|Csjwb+zlqdffnyz~xij5lF4=i_bDs@yS7FKW5+s9m8CdcF;ZbYM2 z3yJy3B0;MvSs>4qlz;**t>Gf;zx74>+2rVqWJY+T5C0<@|GyR4|Bs@j6Qw@O|{$ zH?Z(dK4c6|;{R=Hd6Qi`G48b%;9fj(b#SL7M@9J~Sn|o5tYC0+v&8PjSJ&UbNO4^) zMI2lTbZR$Tf6^C5$=jTpm?ANH<>5!);6NLbUbOWHshoaq3up8758EoktC34i-W@{-`9m->gXs;W+Zz`E#ZnLsayX-I{$k) z7vgg%R7BeiyKs99Il|tn%NcM-^7!t{VBBq_Mjs^xGs9MEj392s#!X+gD-&~69%Yjv z{>r+gNRMt9_g-g;F<5WDE!~Jy(I5`AkHQ+SQ8!8CiwsH%3wk$KOR!6QQ>hgG6p8s}p3nY~#kB7fxqSV| zRayP1wRHw!mHJqYp85ClkXQ8066^Umy|3R^o7zHWP;H<6WRFW&g2Ww;r2HY-o^8nV zdP-$DWLX{}Hl@Em%#^4aK_0iKw~%nYSNCWnMxh%l^}2FNv%mGt_XqfO^-GDZdUf+` z@&K*ESa3cfQik7dqk?PSoc_P63N8pwt@RT53$Iq2QcSWPGd3ZXO1#9+SFSB*rmrd7GB~ z@=kpBn6O!?Afcc}ki*0Md%v__#F##Y^)F&=G94m|wb^n$jOOV6{wR2R<-M5a2CTq~ z2G$#9_c9gJyXq=uOji&Jt?vYnvt9CyTCtHBapoft9s0rHYdtyU33s~hS-Y^_#G#$8 zsysk;ayW5VHQ}Ql{_bkVPc!EGAW3*%Y_j$O^q^Z*dW=Fs^anTz+%FAEY1J~tqlt2j zdw7=UU%%E|2F!nB}0$p%F>E=QfFGje7@~q1(w-6gRVpT^@BG$+1g{QOqAKUtY);Dc=)A zLlm_~A44KPbV98hJG(3BQXn$YQC^uac4X^2sHRLRRmkC^^0cD9Mz7xRR8pAv)};}` zj-CAYmXx*L)6?6muL1g}C>z0=XH?d{_~zH$>Btg7N+j?d2qU-R5W;8!~uh9k3Y zQbdoDEiCEBgBcG>AOE>fWVpj=3L&pvf$0uF$qnujiQNAM2gq~u;xQq`xfQtzW;1c< z>`-;pyu1SKPGauF6QPWi*hbl;L)4R5j$CBcEiB9b7TbZr=fyj_2`e0h2;0Iz3V86N zHg<_KvgCs5cbv-PhF$SPIYe3h0$1~(=^J`rYpwd;fIcCu`t57DM6&3W(fRghe10Tx zh3n9(D5_b^{22wMh7(hqk?>p}Ra+pE+I}h|M^T&5^D&Xzdpn!FKwzwDhPr-K_)8W?!S~IwlZo%U;~D$g*;!y-(8n>mhQ#t z8<CW&IJef|zwKIhE_p5lEu5}z0s_p4q0=7ksc)*O3FBEmJIvn@6EFxRA z2=*X|biO_OyIB+;{1*Pb;{9k*=LB6i9rp#Zhz2KWOE)9??=HgM+ErgOGpS|KOv|`O zrg)})El?nkU^7jC^f0=4SoZGO)B3F&obJ~!cHLWdg7k)~u0G|Qn?pRQ{Mkkq(ZEQG zP<#TLCSjfM*T8>MF{81Q;imDn`Pn609yk|I#}*^F~Wr1yLE>* zy2JSLU?ud<*M3?+`6CO)@%l!H@;hv~9QF@6-zU8dtZI55;#T znt!%L;sTn$G=y>gq-l0QVq63q_X19BTg;%4qZJ=CmeiB`uMaB$>nGstGwMOsClM+% zktnA)!vUY)IlwWD7K})) zct6VTW#jOd_J)&oU9(8v4mjEE-?Ru4=r)|wK{V=2_+_P?K8lIG61g=2=}|geK7DxM zj#gsjW5Du9RPH}WVy~jYn zxW@zCGM{{}dQqWAhN$wxs5tjju055-{kubIRnlnUNMaes@(@-+rfEq#J2VkDTPBrS zOS=+Cp3L6&Y+3JvJpXPg?RrQU`1J9_3!w*K)+C2J5d>c|LE%JR~1#rbo*a|Y;=b98Q@Bwc4BRDb?3Z=Hh@Sak!9UbZZLSL}H5 z>y3&@gXZ%{d?=z7p=3#!l-e5yh1KB_6C-Br(g>LJ%p}GyoSbL%-nP{@vsDz)ik=)C z-@kPeA^OKEzCezP_@5tYoNzM4yw>%&86;yuCi{EdX{_4H+_@dL58|O44rV=t_Xp=B zowlD{x?Yq|OJNIm1#%8nmDN*2eZM>Z(=~|?2+tuAo zMkA4%B#E#NTm0FnTqDMkzz4}`{T|q z<=XD<*Rrxu5*`y0@254?8)7z#ag|(&@%kuQjT%qN`C8lF&2ST)27-X=Wv|4ux3NZj zkAOiuug6EKS;2*hp?D@9YYi)y#i2&crv>$u)!yS4j(*Tl=6+jTG%9%1q$9kDcrbyr zJva-=PBCwuk389*=+cs1xCd!T-yK0aRqws9!rsc&ZMO{5IrR5s6v&i=*DzjJ@=(>6WA!zJ7^7k1F@CvA7q$A9B0xE1f)kX~;gJkvY4 zl#9&r_z6p^*5lj0ACr4CJqUQu?fJqrFo@Xh+odW;uu`geH^zTeu=0fDd%t*@cP z!(XsxRopG%1)1LCXt15(fGpjG0^Ii7^)2hnpSv0!cRQ`62sE72E*ftoMgABjk`rcP z70F0wnbVCF2@`W*2Q754rAtSyeFjg>0@gb?tTo*zx*ufiJ;%$vW@`DI@7_-2>&TNu zIX&WiJh^TbUE`ZD5~4Jf&pPbr1T=IRp53^NW#jhxS}j$)cPRhVuW^HV)+m=?zqog& zqv6P^@0jLkbN&I`41^LjePK(Xppaolr|&z41a zS>1T$xz2hCWgN4Q=GM#T=WK9~bz_!2{r~pO{~?jKX1BBCExJ`z5ao>pp7nXjx-lJK2z)ZNBO25`n} zH0;tQ=o{_<1{jZrC=Ky+JrNaMB4T`Kux>d(36j^$Dms@odNhO7^>rP(@MI}31r3!}AquRUhQR$5OXvh~yNi`9cVHCW_=5m?7 z|4_GvuIK$s);-2x-l=q+KxkW<;J7H8-T>^R*Kb>hi0p$WzwE1`pPhPA=4syZkT+g=g`aI5 zXH@~Ve68P7XMWArqw@U6KlL6v7#@z`?60)#D-u;6;!Ox>!1j*7au>S`3%SoS_K-J& zOEPn0w#V7q!io{SwJTnc1sQ*kZP}vr7>dgLL;rD17PjTkI~+s$QeJMhv5;Xu-WW<` z^l*@)R3n5Smw}8`(m^2Xe`pu;?`r z7zbWU7gbDYJ~1wZ<5N2{H9UO z48(K{cHvnhI3ckv|05Lmx}T(uqn{1{h*^(Jhtwl5pv^Mhre9x?QnX> z0fgw!m^i+J5GWhHgy(;6!4Y7$Z0!AfVqrC+x!j#2eLT0SqNSR(O1bKt1;=6N5vrX$HA-D10 zRl6lf^~`$)@7`**&i;v;Bw*GNLH;=-$CWpko103}p@64L*IfUWg-oOare1TSB$1d` zih!2>IC`=ElTS2U9!{BA1+>?^GaqzHcpP-;dx&|W6nH}5kmXHp`O`#QZmwp`cRo0J zHgTail4H2kW^2@%qSO5*dtnhoF`hse>XN0i2c_#~q+@-fvK`rRrO$gRsGPhtZsS!_ z&7)7UydV86X!mnw*X=Kr?avDcFuy*uSKaZIxeb**reMhDgW+rmB@3MR~n0HakYERI8^e0tJQxq&nV0w%gh}XUl9TiH1`x{nNNZ$N^QZ?hRZ;W-nsj&m*R8 z6Lws`fgix37ZZvL<(o^AH+w;B8a0KCovwBDBlyf$CU zd5wLUTx`f?w13J`>qCgc4qLWLZ^5jOdVU9Udz5c8u4*;_kr)+*d~UXpVQ(t;Ea@60 zJ`esD8z*+R)_dfd?V#v7XWAZUFN3{BctCR$CfjeYu0(ioJd-+N6P7J0%)*H-8ta&L z>#$?+!1og^&blj02z#1bcc(T@1z0P5R*uF)Wut(Wqrr7mjqZAqC5<32O$qsS$HS>S zt_~$bd#-cbNoiI^)MBj>tZr@H^Qb zt(Q?$tP~Qb%cVHX$Q9003gd#StQ2>cYxB01CQaUbLbJ88Nn%qP`_tI^$N7-%_{Lwb=P;lS?AAgVA!{fZi z{<;)1*>sPZ+OlVGTdRn1_ z`~QS({C{Q$7zhHupR?q5sWTj7aM$dqoCp04k9Q&**dCFG9~GR5jI!~RBl9!{61UBO zypA}?)E{>9LhV-H|B@U3{4@+5r**4u20Dn!0sIRkG;q zb`K$S4i1mbypnmC@{X=}Db>Y(A%uetNNF%6QbZ*)bf$O*ECK+cDFp17}|QONmPWE`8sUtVR0gNPQ7|SI*33xr8R?!guXzyv!c^SrPFme;V)8e@EH`+ z_yQ1o!PBk{oXTEx21Aq816v=nyMSPJ$)v80HpfU~yYtd-=JPcMDM6^7kD)Zt7Ig4a z=E#c$8w$~;SWbB?iAtd`1ay0($;e2@fu#-`&M6UMV@F$Vd6H6s!&|zl;z^3No?0By zK}nvtiE%wJHX;;&W?iGey4bEVx5XG)wdItV76cpna3P3tq4hl|0ye>gMO&{IBPX<^ zp~b|V_NBUssU5KN#y73 zpPHFK-WjIo5&maC>r1DHd?ufuW`1vi9N-izON`9!wGGptAmjbnjb{)qFA%<$nx{Fv zpqbKsZQ|*3=Y}elw0`EgAgx>>fu1l3?@cKYU4wd}2sm0IBTT92Hgr0+!&}R^W5~6H zXJ7x4YvT91V{UnLrf%}2NMbhvYlCoh@5B`8>RmfT-}U8+c6UpZ6KJy6RO&<^jCEuM zB4otthe~<&NA&w2B2D*7plPj6Kc))!fN%h^Af1(prTd$fhb<2>9pbmD6=X05`?-Gi z{$p|SVM9n_!x))a%Ylw~BqA=RQip3PDJ53F53;k^ilA7ipUIj`Lz+%N*6A3?LN?s56Qjxyh_|LA(M`_nC*da1n(uP2Di$Kh@$xtvQsaQLqH z!cy&*JV*b_f)T3DU&8lm+Qo&p5ra2fTCju#=P}`6DAb>;yY%5P-g)Vv zuH#vuTrs(+Vzo@yqi87HI-m1)Hnn>9D%0tR<&yI6WY@lpnFy0Ems^s7z$W2AX9?-F zz5{rHEq|q(^+@>fZZJs;+p}w3;@8B=*tsME2n|0S0@CntKOqa9rO}2j>TG&##K4`qVaMCE=u zb4ND0Ei`qew$;sskIaxJ?Xw(0pMI(TS~FG7r<@C&AAnwS7$d`VV+z10Qudg@#DThI%1W`2`+ zqvDz1LqMJv&<(II)>2-b(Y68_R5RX7whnnq;A+2M@u)G+%mtcS0xbD5Oj%^}0pXW|ZYSARS8%=MG@%lYBCNzR76jcXO1X=FVX*5uMnV|kS- zLtG!!6cUQLHNre7==>6q_E2Yb#9{1~dQj=48!Rus0dqXM+2+Y=W78zxEGxcM@BPsR znYk68Hb=Nb{uIx?)D(%+@f^AyVD#o!`UG!sb+Qq3ODvaRZMt%n0MWm(z%}eGzv!%% z%Rl21%eo{DNTomT?C(eSc__!RjmSizW&>;XPBOaXQ~hnRZuzer7Y=5twW@%Sd*78Q?gZ+f2XZF;3O)nV<~Bl6 zZ`*>k_j9D~mT7J4!^`drFjY*#J7G3YnP-rj1Q7cGrDSacOK0xG^EnUHB5P1;Kk6Ps z{eXtNO_IUAui3wTQB>OmSz6HH%@WERn)=lJdgA0$QxD3+`jdDT6&=ky(%7nG@{Fz`oqjcKonyu&0M?Xts*gf;BDnH=KKE-ZTUj*$8oNuyU zZ`;=E`D3|dMAgmFY#5oFD>9zgFR?Mmv58+fC~+=1EuXLY!JwqaZ{{Ki_^vu0nI+jjYNQ5;F} zP-#8sg3U;b$r>@OQl1zS0n_j?Ye99G?UVSO<;V_%nt7x$tRTLB>Xzn^Md(aF^SRoS z@m#h?!d2!jatJFr%H)>-SCM3o+;;Be(^Ou99PIZ`qWPOTm%%AE%{B zsfUX?q@Q+{_V27)csHGLo^-teiwktl9R^V~dma!i;?c&JPTt;4P#JY?f1C+g;(QhTRW29V<{#zP;_mFPm^M}%9q_=qP zxGj>pLlhMmIj!;kdq121-q26!|8m7#A{ws{0K0E1{Hx6C3#p{wXn#prbC{!r)R<(9 zGc&?k>USTZZf@0t-|u-qnLoX(nr^-U!Y%^gDE9~W4jP6bnTV0qd-6N7wQ`bta7@{; zK7#@%T!o-l&X#YuG+mr&xGq#ykp}cqlt29~J@rQYUooA&@WZ?t;_`XIeg$ak$~VbY z%Ns{~gUJp`xS7Vni8dJ5RM_ra3R;!t|8RX}8w?e#3q?yh{%A>;GWD}P2BwfekVamm z-^40NX0%4oa)p|?aowiSippz{XUp`TMuq=V#k{&A^{>(0La>z&VnuHj&}AT`;3a$y zaPkOtYxhoLo8b2wEZOzNb@>Z!(8-GU*A=AbIwLk+gH)Jpxo-E3u-(S>*X_Z~Im234 zUg5t@&HY1<7-B4m2F@cP-ufSuSBsm8{%^Fk6POz`FA4LTb=G>k&D3ga{;Xgb|NPwK z^y-0%Z+4*^Gg|H}Ri{VA-ky~<_4#ktS?QG;;?UB7?Ardt9l!cKD>!(<7+H-`TG#lt zdx_Grihyy{s5`5!5!uDXh3!uOEce6M`X6i>bcwHZ_t!)Ixuf>(-&4HJvD7OnubH?U zMy#KjuB)l=-o5;f$Jbi^Yqo3+!l5?ewanN5ljmLR3&}(|JWtSn{<**Sxo`S4Lxah| z*4pa-+3S6M&55q$hzR6U|BrwFFJAB6|5b1C&kD3{wCzQYRF6!e4`QN<=&zq;3yiEy zUek(;0}FBiEW$@@N1?p*f3tG`@9+5fgdjd?pAb);eRT*)eh*z)P1$4)o;1?fmoG9< zNT9F#d3Ii2UVFz7rrI{q9X`lTqO0cvgz`txN|Aj;Ngm;loP2alOm^f?<9#xRTe*9x zeTh>MPTP`S5E-b1k$nusO}(hoQfpCO|0c8k2}DM&E%xhMlDXv0!FI^DWpG~|N$#M| zW!IJt60VB1e|?N0W$LgLY$-gp{D@M{xnbSW(M?w`Hz3FkB|7)tcax?{AmC1L1!a@DC zjZL)=!@M6poh+&Uy1yhxsvB%xmpr`T<%!SE&W)#knyC!bFSq~P)g`sDUEO(CN%1Ej z3eXh)F4rVxHx~#Dx;IUK&U`u<(0s)KJse$^4t$X_J+#>M`eUT+{-BP1f|N+(;rqI1=Wk5`f9UxP$sP2sBFtzgwT{R9A30X9iTr8YNWa z029q=Dq1Hp%+k$S&nu%wxJ;9Zkskd1`k;EZfcJej=5ylqF=wW1>ljy9U2*0(!sj1xUFW%r+!Z2^S`6~*zQfj(?TfZKqOrZ4Ay`X zoB~%-0@n|JF&H({+dypx4m)KW1~#^xIg=Q2{(I@}pSC|S>iA^@!} znxF!5F#te$l!;!8=MWo**A~(W@iu({WrpJI?F{7^Yt&jW>MUUZKrFiS#f7hvlpu>A zCyg<8-{VNWiSsWi%KfFGLCYvWQ3Qt1mfIq=tTYqw3x&KB1Ck1Arg~FKclNg_W!(eeIL1jSGo^-04~sNMyZe{YkQDF7k$$A>6-D6pg-tI(>sMOx0 zFFvPS#MFbJZ=z}FhAD$lN4~AS0}CZ{xpQ!|M7==&%g00o@rA0`>v+)Z93apzQ(O*U zj29KxvP75)ZO=NmlA}cIqV-ZJ2w+LX2cDichxs<|e0O{NW3R{9kt4=oDTPQjtI&Rp zY8!1RchYzLW*QOr3^iri$ZDk)v5nGJH0|j+R=QkDiNVYnmkR?*O2r>2XG?^jVVwpi zj`Pmgrc0N$ml$puu)Ol?riP;4Hr{~GJ2fOib^tKUU14f{RVy?rT-M14PGqe3tL!d9 z{pZG{auc9J<~#UkF!2$5c+4S&LB*YhAs2 zh>Xd%FI*mm8#VlP=gdD;lrx~P5rjsqr>v!N&Ez=y-e#r%1raY6sO+bfJ#GHm5eF*7 zL4;rpD*R~O+%#$S9+B8gt~8>+rqp6PlUvh|ZyrdSv27NZo8M@EJijq}QY_TC^6Kh_ z+|rQ#gqAAHbEw{fctoUtOg@0)AIu}j!Zr9Ypw#}l~_nuWpIAYjK zL~_~FwAz35dY3U_Sj7KLo@g8Gvq#}Vc6OKmO01M^2P&cH6c@rw1-BfeCX1O6BWA>M z4N>m!&F#@?cEc{Y=MHKNCB)mJX^J7Ju*L6}%*6rKPnIrFJ_`K+WLz5VO4o3ys<@A;pUP za^&@7{5p#Pjo|#@gUFH%25*5I-{ML2zDY-UFA=53j+M%kvvlErL z%(cfmj_LB{y2K}C3%;>(T=w@oe)R$IxizyEr;?D5#J?z{3q&&8`j*K}F%mke)|f6h zROX}^!_5Y39jg2ADX1b8mrD?g0y8VP1V0de=g#1IIo|yV4mfzoFtcQik+n>DYGKIg zSssSIPTL8_zD``2qp|hXsTcu`(ThNaZ#8w4o8sRZn;XLseimRXCq)-qn)4Gor??n7 zFzgH(k2J`@pC?Jucl|+^evfPaF$Z8FZzuW-J1@`B zX!NFl0~fxbc|^fT$6Lbu9(vPWA&jD^|(u;-~H`Gt)rEYVvTLI535devP9Uiz|mA_8&x;$IyXubeHrVly#TrDvXgleHP> zpX73_FLu z`eX8${&%r{XdyG0JOCIj{vJP?UClN*)J+zJM*R;gm;k(8i^p*x`8>*&$Ep#$iFsN~!{qJPe0 zKuMSsV@mqh!-7uiWeXB4Ea0_`tLC3K4Jx3`er*)4-eTghZgC7L6^V=43S-|sY)Oe< zx0;Tmv&Li;l6uM(oVuvq0SCO^9ZH$qH%*pExSy=;?mB23_pa;z40biYcIW=Y1m+1h z(JiSy`64%Nc{iwGFYANLF?QF)`xp;yU`}>>u_dcM*3Tk%UD7!@Cw$4mIIt-2{>aZL zU@%11O5DxfA6{MIG%hy*{3;5fgy51UL+R3e_WuRI@L z*}1Opcxm&N0)pjbCbO0DH}P=sgEk9awEbYW^wLu^@CBjrDzphIe({&??No}; z(uB@&JionVB5(_BW($Lc7A6GCA4K$-U#}h}=woQYV?LZ$MA4$o{pD7cdAERzDCLe4 zHjl}a1SpD+R_{*$`QZxy(*VmgHx0CmensC!fN1awyNAWdT~S1)MpFnhJFuTATQ&yR z${^YX?TY70jL3FaA?l0m#cDw?wOiq=3)jUxN#LVsE_L*qQ2+1qKLY5L*=;$}qwHs{ z>3U=!xq{v;b~W);#H6y$)^xCnUCmFg8RLJ3jls^OL1hxXQij{>hO^b?{BJ^Ta`5au zsr7n#wuqy6%?*>_pUOYayh-*!RV}_jzH=hY1T|oitWdd7=>(<6f!r@n@R)Tl3@#@> z_iaV1htd!7{%+^}*=ul>n_j5%>j#nSpG9?mtZAJa!MElTTALM-fDw_;0Z+Pg!TyFp zg-J3Hr{oZMZF9q&h6TGXYH(IMSF5qD4U~%Mm{o@@ddFQ|O39EW+6swRR0DkU5gL&{ zj(v(id9pK#SzaSQ1lH)81@=o4j-0XwpJ*32)UKdKG1O}VQ?xe^6A8Nu7ENW&Vkea! z9I2LHfy)iiu$%lCskz%2GTma*jA;(wW?=UkQ?g!a`DjLP*OM*# zN61t{S_a{aBKkw^k-+$VWaccegHsZEa5!6iffJu_`}0&QqzaG3j`C+i-ZYZ%FHn{r!rRhCx_Ktm!#_N)C2L)I#6W!0X*HiNUNZ8 zmtXIKs<9@Uk3~HqibS}Sjvm<@Ni(S>?nvmzdt)?3vvvBfor0OLRck}xaTZLYA zim$D$`lDWt7~k)cpV*Cn5Ft<>&1lS6D83J>)brIp(u{321+!90Ix6Qy;pM50<3CI9 z&gP4zOdh>EcWJ9$ARhZ6`?=0TfEEJX&ut0Fy$~2Po$(D%5~?IONE63X5gYw+Yfxo5 ziO&N#^%wFAV@oBPgtMZ+1a`}x--l7RD2$u$TX8VFJ9$Y~%TjP{T$D{HF$C?^jILIJLCiyM_Ux$5Tglyu0>p>2@v7F+> zZ2BJ~Gal`(pTyBk%Oy|FWe5f`aYBiPCCalUFP$u6KIHV6F{8^ehSM=JlKG)xcWq;7 zn?7cb74^QuM5KU95OYBy;emcR!m!-MnB-tKsOratmmx$<{=p|Q8lkQZSBJ<|77L_% zVDt)++R^6gw~o6Erln27m+F9zS9wqynYW-*v%~}%s4(GDcxU#xx{A^^mok_VFstds@ zkL!xvh;fCh4^myih8mn39OYJAJ{pY%AM>Ws=z zS=(L@7!59{b3Ec6Nc6<1;lYmSI-~HTbMEP0NL({A4mGLoU8unv15pKp)*BzUG{+bj z7w>#BG77l|q~F|%1|}8=o`nu&1F5yOwbRSSTWww95(p9pi4_d4TWAZ_9>pQH@ZQRu zEIzk&g0M{y)4_yqmAUOnQ2yfc7`$_*P-ir(hHz(H&(W0voI~r+n;yh$U;&&cE^}5e z#H47DR8mrs=3N{0?b%jh7m135RIgERFsEQmiDX7ce7WV87y+A}YQfNAoj1n)6}7)# zERv;d4+GSiXQd9}Js8H#^*6rMc)ixWR*9^C1ho0^-l zKo}D_%C2>|e@!S;eeX4TE+T{PceyS z9ni%?V3fhp-f6k7#}7FUq9&M1S$(;z_GF5e_>liaM3f`UdlUNY#`~~tPL@&t3`uJp zrVydMbM&~bjlB%=fOA6PH5z1;GsSp6m{=DQZb$^xLddwONV`Ea=b1b4C_2A`T10P7 z@3o<=F%Ax~qAK%!bg?*L`eF?89vD%7c3oOYJ0%z31q>qGQ!%Yfu+)B0Vc;CE2jiD_ z!C(@vkZcV0iv1Yqb{K9=28Z*K*mDl3@pXUjyhZOvDHx`fP|qY2Wef5Wu}-hXT1N0& z`(_CeOVdBx>rFX!ghA!pQWHQ8GDh-lbE1}tjJ_bydrhc$G6XNYyi6{BGERa*xSF`L zx7NQgZYm_+AI~WxwuF*Oq%Ihpc6xo|`anhi8bYKDlgNd^C3+Q(JHO&$IrV3gfHiY} zxh*8nG<3mt*Wq5MSI~YMW0w5Gxk}=a)R~cnr9Y3oN)3)+4Gj&0&cN{9>2lB;La?7; zEvwiNm>O;?QmRshO!?Gng2}EOGw1j$OgUu+nAqI=4&Ad6y#`>dfW7 zwe@da_g7gEKP`}p2^%5VqBu4zibcrsB%jFlaJ87R&=Dn4t?|p4%J55kMt8Bu1(x;Dq zw^cv9nhQqkRqHAepBW|0EsN%8V2BXLo6ceglXBj80fGwsZDf{*&%=zk!8s{7uzG$U z#+~>pGsZsxM_D3<#%4(*9n=7X%w_*xDQ$yu-E$0>i!6eix@L}9$*Ne3WNC^B!Vzj= z)$GvnU^EA*QX-CAe}!6&I!ipYVk#u{$PO8(+x=#EtDkB9F6Wmnch8GI#O#Fqn;lyl zfCg1*Y+QEtTI!-XMzG8wvhH}#cn2A3#8KDDm*07gW9G1iPn>5mVvv|%W@V1(vlNCi z|L8u}2muXX+{0#-J3P?koslZaXgFE#>gK}<1CSAki zONkYmDLzX zs_PxDjszVe)WGSdCE zZ+OZ3mS=A^gyxfJgP9>O1QVCQ?w)w5ap2x@(pC#KM>;%8l^C^47I9o_IoTbZfgz52 zk-kWG9X&lL3pF;9*TW@a=A#-HM^o}GOmr|53!0uVlCMRTiCIpAX2B6~!ZA~Z=@Pwf zbLR=!rU%o2VF}}Vm&UP52aF`wI4OGrpgr+<$9lbra!nYTIS0qMzOGK|gNy{REaHaM zplSKbNm!rAzXPz$>YD{ABgTFbMI_se*vM2PgGdX3B3f2fGTQvh@qT9Ph+n%a7Th|y zY07=)@0f4Qgq*48F@PwK%nd+#gB@S_B%vG(y2yD32yS&0pr46}_xDGL+w5~RFiq&9 z@mvbd8V!M*R8{sKej#6F1(~bv_fH}tAwpg#bQ9<}QWIDQ2z2!j^4M`nN)Pp*ptwJz zvtD?NiMLAh6%6R&2u-&Z;^ak=;{H%?4`^^4d8-?TnX_Huj~maO4MSMkxT^Bi9O=Qg ze)hD9Zzg{LkDUMhhTl=w1Z?m(e!S||xcc3v4`&_RrjQ!@X6hZZ%Sjjk3t>dSmjBT| z|BLp7$uY8$lI;=TgUpg-zR5N`s910n0ho#;zDMJ0b*PM+s*>i_%FFfR=}L@)^&3JG zREG8W10SVpIzQ$TT0t6=VQNo{l8*J1)x0~*o z+;DypURGV%{zv$JH2aH6v`>=+3Us2_a{2+YM7#QHWoQnOo9Z3_KU$5Mg{5jYE-C3I zWS8@kf&OiVmhncu{O&}v@LkC6c!7(Hp)~`X^_<=Ca1?VaFCG#3fx>0oX8>{33`CZl z`EC*0bEa8UY!M^FUr~Ai%@6f3{k}!&047ghUMWu~ncrAl7Pqr^h})##AO7q9V=n67 zldO)x=Q3(YPVVj5CQ%CS)yEZujklR^e>SQDq|8)sMyJHRFu>p{i(Wjr`0md#f2e6CPL6fIizGCpC&N#hUD<@TR0otbaH;{XI_Y{A z;3=&OPRqD;(oFxo!qT3rDXb6H<#t+rVZAJ(crLG~ID(hy2{h~(?)gZc(~@ER~f0jY-+t=)@$mUj)F`a1u8)-7hK(MuQFDD(uK1d&*x%}nO@_38p}n0L%{0q zQOjmL-L!S{!&^8hG|t%4ETXWGA$>KQu1JzNIy){7c0V|;31`)EEU)RwmrosQ)NW)R z>mF@GJKsShrkM3vNhV4TPG>1^1PY8H>IHdO2%|1TCHN!c{pEa)xjx054@HEH^BHCS zZcKl0>0cq>hvD*%-seDF0NmvI5NAwOwW1Q;UTFT%WwyWmBgBP0s}@GVQL`F|0OmOWq=S^p5$i|ua~_fI73Gp|dk&d7qDnl_{ZMIhphA3Y zn>p%XaNTonXKxpf9Q=0WNIO&+e<53A?AmT)8=X0$9A^u7D$$QlpX;f(VtA?i{R6VU zgnxT~4^ayan_=&~_DSCwi&bjK<-)e{@;Hq~^De=gZE!wvG#CTL_`F85;V|-yO7+bE zab|T}nTUhaGddi7m#0p|2I^z^*($it*wChEr`GjR&b7`xB$pt-FHwP(|0b}dheP@$ zm@W58ahqzKy7jbFKZLdXlw;P#l^kIz6Wnw=xCe~+xAC6*PI$8^4hl)y*e^N%G;xIF zy2I!@>;GDJoQ;EE+-TcoZiXmWG0YDSp$pJ|47#2;kW7?jlSou)rD<>^!v1*k zLs>hFiVM%ihBY`WtmF2a*zRtKpMnTNr_ah3M!`?OZ(sM0l@;4bk5M-c)L>08mggaO zLCTO9dWZPR<`BbKp^lo2V2i|9S=MVZ9By)JaEyQb}tr)6%eenXGoUvkW zb?}C9#AvY6kUl?E;}vsvlA+bWYzI4u0b49PmP%j`nB{5Rpn^04XSRB zR6Oz-=@Q=car&T4aSe$ax(w$Z2* zU-t@X^xJoHZt!)A(*P5l`1016yA%jg$OH!0|&0nvA!%ccJPp zSEBrp)*FN+5ldilJt^Lnpw>N3Fe_~!R`>irvh2oJVhAh+yS)4hpW_Xh7EcL=c7aat zn}5IxBg(m|gmFwNVox|SZKwDJxcJ0u_fT}(zn1jm#7`xc5yw3- zI(w`{nhgtTw$UDr#4Lo6zmw!A??_L_R;O}{7}mwH0EevOo?rvvuzu4EEy*_l>=%1&_1>~M83S*q37G_!TU;8$adZHE>VJQ5_;geQv4zOKg zw=4EsJwnzZQ_(+zrp0C)r&%y8<`g6Yp+?k15r%ga{2Z5T zjo;;z#naU?2R2}mbG|;9VU}$5r5*k0VymfcEFsxzFkeMFTXw2_D@FF*^f6^u^m}Vq zw+4MZxAiE=4BLGNO;Fxh!0ca-GqnF@rm!S#m6E9nFw6aRs!vbGZxOGD9k*-21Zs{o z1Il4k`F3kAxnYpBKSCm4TyYP1@ow1hfoild0^VHh3*4P>(hA%KKizK%PPvSRd233AenJlepdSMG9|~+Uto_f_SGK$lD zY}v91u_TRcO9fhJ#Q4mUW-H=YmHff2QiOxJxx=;-=*mSxGE)-aakH?BgrY-Z{bvsn zo)T0ll*OQGG*xKKc(!aYu%WKea4zh)QX;YF9CZ~H0<^zm2t%~@x6Sh5v_ioDh2vdk z=$2Jgb@>HFj;@%$P#~xB9MH9@KQUg1cdmX!DwjlfA}lSGIVA>v&Xk4ZFy!XT zFe>z^Bqfn`j*Tf_Td{gk3ptYLPg!CK5<4{G?AAXlQ+6Euh@Zj$5 z(&ADq5ZocSLvShX?(S~Ii=Xt}XMf+#Isdo&{@mmyS^2H!S#!-b*BoQa3G2xCpuCyc zn3&_`&r=^z!w}SwcaA4vBO##WNx%HCNc_TmSahJ9cdN<}aS=m`F)@sVR(xg)Sjnc_ z9k(W&_gT`BL{B9Dx`|TgvjsyLOsV@oB2}OIMS`?17H9IuW-NuU6lTwPIeN<1DzqwG z)bEX|3Y~p^kMScD9Bv&tdzfN+dd68&3;C_^hu;krQ)GL>FbD;8SZtP2=uGM#&2(6Y znxaP9>(?3DOYEjg<=joY=X;t)gHzukKWW#cHG5*k#QzkvRK_FEURNkoL-~1?7=%<0 z*pG!W`h8qqoMTly>qTypvtIYR-q%0O=(4SLP%uZoBAoYa%TD^Ggz1|qpk%j64Ioq$l#meFPn+U1|Ji-Xm1!7##sw4&R{-Z> zib6!5p}3wsJE&p!Rda%q@vSYi&gGh36jeJ!BmE1MMb-GL#~Ou(vlrUUS-hC3a;MD? zw*v#&nk!e^Cmt1suMv_)D?*l@5ZRl)+1CxU(Xqagg38i4;*2g88r^Oey;NTtamNi* z&!@AblnLK%UUc3D1nD4}j^J@;Q#&7l3)Ct4mmd(8P02%nBO>Lxv0IT{Ud__8J`E;uzCaY$>NyN38msUEG}qot91mt zn4?=;!>DsS#T1Re3n_{(ZJ(MDYFWVdojx(@{8!@^Uq#$=#1g@IDqy#(3D+VXv+x>5QzE zFuL1S?oad&68?y^$xz-i|5K^q1tc;=rpAzmP%KfBpVf==KdLp^V@V%5w2NYX$r84- zt#uI|D!g3Xr{AHZ*4r4iLC1T1rvlN?r@4NQ-Ii~5=}wc-7%bZu5)p!qVHzb%i4o;W zTflU=?-+e1wGY^ zeH@PI)Hg+C3K?qk*<;>&hSKFG1`B;Z<@%8mtHSu*9IU!I%}mu1MhLw@XjI-vxzT|0 z;|dAgGB7*4ZTQx@<){W@TQcL#EW~;B-Xrd zn{T%eEMo7E_xlaSAGGiFPEuY^tFQ;-^lcfLt;O#=)Lt7?i9$p__@Bn~bO=aRx@B42@D^jABuv(zZVtQ~>MybN!aq+}NiVB{v9 z4W_oIKFwCgTQZteBkN;`qe1qB`e2T9G#m!>JTWP~2^-LE+QfOzAUp1`{vqb+g3Sv~ z-SX+5FUYcgFUTf;${PJJftDhW&kzVu@+w#+_zC(fimVZ@ZN6PH??=9bD1riCDH>;t zb6e#qk>$!MBLp^}r?jP~gb701C9t1UN&2Hq(F^N-j>&=Ousg|^YZNjD#NG=g+-z~$ z+-jqsso+q#-tSVCE_yzblaou$KT8*hcTA9K=$~`I9W9WO<3V}*!w()%F77eGsKY5Y zBm(uSjJheR@1g88>&Dr}Y3Bq>o_03t0(1SFW;UP(-Q?InxJZR0u7FUo_?b3}U?{8r zqO+Nf8LGcY%oIjchy~?JBklVtd5aJuU|n^OyZGV=X!EI}soa7fKcN>z5e3YJXCf-w zaSi^mTKY{|)b^tQeBq%!Ek&t8ktl`q0tiSlO#w54U=87UG9csz715jtZ^fprnUa^8 z+67>f`E~;t-fp2yxHV^TM|MtH;OyBV50l{oHr(bLF?)U|lGh#<4@u-_l8(~%BOB2h z=1&WAZT5$I0U=dWFw0$g?+ejesj3ls#sXXF!Jiu2hl1Sniyn? z#J!A;om@|p5c~-V%QC?9CcaBnT21`NJRQaFNc0Rug(Y2+JRjuer_Y3EKX)0lCVzE$ zL>LSx{xV0!MoX5ne@a6Xd;r%9goI0D@@L*UGF5nS`Rb zW9u&1n~idtX>Qi7O7Dtx&Rgw$;A~HUN2hOx2icyuueRuj&QbrBrG1ZrfJN?6(A~lg zg?`QU%1bs2XFJ`!DzB&*>!U53(Tde2rA(sW-FSQmntgac`C6Y8vMIRq>8_YcOz>av zJ;ZA&L)^N~Xwh2k;y;X@g;qeo$IVmHDT{A+AtH%DdK)KZIjVo$UH|#nAI&!if~Dr? zs+iW8?+~zM@t~fm>7Ojd!2?#Xas@GE4FzQ$DIXcIXmWIgQ{_tJ|6ryRzqb)@q=}O* zP2&G#6oR(=8}08yqP3gM{HtC3Z?3b=Ux$%gwf@fr^}h!`k^bd7k$O7I{GZPC|9i;) z{SN;h7VCelB*!m~D86^7sL^Tfb6|N7sJxW`%s)>;zkdCC7I@}|yF%jTmK}G~tVEp$ zgB1+?GokYP%g3$1drkz9z^D>d5sgvIKp&ly6dF8hnh<=bZ(xSnD|DCe=W9-Xhsz~8 zf0cStQd?)Iuz!N%{e1x;)M3&DSO5%`k{;yYJ(%iW)VgKyzHBJAP>fDUp_s{S8INyB z5BWJF*?nE~sJ*Bj^4#3B4+spFlSY@IHjs@o-X=fJXYM;KR@jZXY+g6|DFN&&ySP3x zv$?G$h%cx>p&uHo&iO5=vroms-X$L{GbGoC4m?}#ZbzcBPc=6`tUx(!#S2Trw`5>2 zy0=%YXJjN>lf$n%zIYmAq6}7RUA^h&!!X`&UN5_fU%x-oR!Q#ocGU znLfyiL$?yN8Gn_}wX!&gwM~^P4!H~J?rI;ORqNJ=-6>cUcIQqXZ{?P<#+*b2TqM)3 z#0Mwf;q__5;fgEVLiyg>E=vQ~t1JHx3-|xBrgQNKprlpTYO=!_5Unyku6X)oH{!T$ zuIOt!1QK<1QR;oN29oBV9l;Wu+_?Rncl~r=ib!(#(YWoVQUIpnaCO6zb7wy$=h<%Kg8P{_DL%tG1NAC?x%438`NR7u)z_8 zYYZklwQwUp|MN6o1W}_GVgD;UOIC6jR(NJi{z;^#r&V0LFG@?_sFgb4?qM6Q{uCx!2X?>2#mp63oI(e^+|y;Y>qF9^@{bqAKq zD{F$1i*OYwF4yPIzxf9Q>0V|1_#RD{0wxr8l@Q3{$+5XmH`qKKF8iSCs4OY^`_1^4 zn!P0E@!fKFEjMm^I~i{A5W{Ab;kR3JjdP1l+tbk2nL#OIN#DVNRTK?hW0PznT^7soFNJIIA9 zZ0nPBUfS;f!^K+S$Lfc~UF&w@PGK9FD@4W1pYgRh!z?g_U=jI~xSYX^I@iASiBO6N zyp4-4gFkD((QF;7$NJcqt}j||YbBLYaLn?LW`v>!8lOQRn5>GLu~5o`Xc`HwOpKB8 z<6rC)uU2rnDgEtIaKy<)DEjs`LzAZVJLcN9c6dv4TV{3kK`II@Ox?2%wg5!Q=+_7# z6}fU^XtCo9DBVnV9>{#}B(lojJ%!}c+L{~&)_NpD1n{CJ&9<_7ynscrzoNEM@cRl| zEbtu2_mm&eGCVaW6p=^%<%^onwJ{SxM*M`#Rj%Zz!aDB9e+?v}ezgW6b{W4z$>v%s z?F8m652lf1yvWMcC;4i5^;G+4U_k!H{*Q;LDJ|FA zwh^Rq-6;h3qJqd8a-5~{J4VxVx|}KSGBv{grBmwuNxYHnxUR9eFCBsw z?qBs#bECAt0hQNf^As9yoFObNl{#Ak z+Hk9JxujrGlC;mS-H)@>;DT=@1`jgQfXF^7Y?UBrbr}i|X{HLTA9)t-_nhPlB;RI4 zdop3he6V}Caaqf1V-8Bm$jsEks zi|pC}(|oqnKpR4D)sL5#lHHyE1)&BvNX0SG*AJ}wgEy$otg;ytVCy_U2c+ef!b`k< zDpCCikdoM`3uQd&&T@Mwb(b~QmH?7#;^DQ)`@c4j&>y3xToQ#1S0Cu0y)pwTn(w?v z2zY3L9NOhk29576+j~PwoYsRO^0D8l%-ifXN0i>>wqI`E2<@`v$NjAO-b+=6E9-4h ze4C)pcwk^*Pymbg<^!@9g9h09Hr7@#9(};ajwiEhDp!8@4wa%=*dME21@6C@F7>6L zo*;}qJEEu>lXAF|I>&UFs{7UFIEyJY8N*hQo=&neHy-B`Ch!b^CcN!%dntB72u}9Y5Hnb`_5)u1qfLXo+=2G#B_+C`qR( z!E*)pR)2>5x%^JqwQ*~@K)^kYX*-FNn6e?E&qZ(l{s%;*TD+J9ck;fN{nnZAlgFR} z^-EwIH4vy>R$CD)VU9X=y#o=~IdWIQ=FE-lWmf&I0DXlw<GPs)Ayh5O`g^|--?u7vB3+w<9OU4P zyvO{BrhFVXec0g8Lbdc5Of$&N^a{kmaKwY+O|iigAs9f{HpPa!?>UVH9q@kh;uI_P z4~y678w`tSaSlDx3Hz^HY$r_j6C#hn-Mf3dw)dUSIdS~T_ML^U**kO@1ci&=aE1k3 zc9&EMkJ6B#P}*sDyCzrAo_2^QsB0vwpJso&9k0aZk7E&cMvx=A>y`NTN9?!g$mlnq zKIFdd(V+>xvB9LA#+3ZzdSAH*yjVH`l=c3BAsLWOrXH=$9sJ^yv-ZK>XL@o5TVDS6 zvjcLUSJm*k9O_qZVd+teDe+SCT9 z$OX1O5p_xt$W3q^$zNA(lYds1Y?uC7d}Hg`>Jbu)G7!M&hqIb`27>>F2^XQRFmyzc z2egg86lw?;3) zbVkA-nWl|xYiq?uH$EcT{K)w}C^V{*&GzFBNz0tl??x~ZWeej;0qFcgU0Gf2Rkd0@ zkgrsx+c$=kz}nOe`IsU)aQcER|0rrn^pIbkdg|&q??J=HBWqR(pW!dGc;9ZAtvXn$ zwV>5EpM_Bvgo634+kaAKqhsH``OC1}(}z~;+FhM7JD%u#a65;JB*ePi^2+o9qZJ>4 zlz@{U^UVIzBi%*C3EbkzX6n78~q{HpI~4DzJqsW3NJFqyv*w?=Eg9vG>`FhUiYT$$8RvFkGZ#T-r=m8`GFOU+?I zuhFtqPtyJ-)W<#reYVd>3ye(jHJ>Uvcz_%9ydO;92@D<0{NJ?zBq89?W~a&lCXskN z39Gq!8=~ByBUBTh#3j!rF<;3t5+As`V|rdzN`ZQWMEIo5>Ecvt*$sij`ul%%#9w^F zQA+gcr$g|}xr2LnXhDTjMSx$hu6JaqepizL4JAaSNvmpSl}b8cStJj=pc#+G!*;zl zoV?nzSR|hJHHX0?M1V%)(2G9tD)p-{#Mi()u%50*Z)zTesfB;6vUsGzu1h4^`fT@P zBo4fyyMK5LSyz%D57Z_YIGKCa6!@xwZQKO_l<}WYB zB8bq(+EG<-w#kK3I{r$xq(fYs64U885Eyf0A&Ujwm)k-s(X6mw#+FByF(Yv$Vac=5 zfI$&T>-;ZRLVJtS5L*&oQ~maKWA;j=<*}BU! zWL!FY|9Tozw35P)LW(m#(%daez2kUyRzE73OhxgG8fio19hc{YSX~3RlzL9=3j8Bh zc6rnr=|r-F`D$iMVQGmE1!6F$Vcd;`v}Csnd8(uJ6C1)MqqM#jpi!#$x;>H}2B8d< z*q46C_mK0dRNM1eWXk(D7p);wLkoJ{#dBOhDjuGglKv--*gV!BaH!9d~pJaLrsm}_-uH{%6_Z6n1QmHBM-99sjx`Ad4w)1g4pYJIp)Ma91Q0%t=wpbKV#$xzxoN zR@+MTN-le?ez(wP6zkl{&2erMP)uY^Yn-2p_Yd&T)jVa+c_XYbsqZ`KK zVJ7j`VP7L6z>~b}jq!kLvzQCg)$K3_?RDTBcm#@P4Rj*=*J3$!KX$(5-hk%u&Gy)F3V#FZTR;l{GiKmsoLKw7VevK8!RfE{+if zhUk(3@&EGtHYCc^)6yLx?!~1gL>%*({&oj>j*yZE4az_jlYo6+`0vXF6xGg}Kp_bT z4w9U&7vjHBuo%zYrv(H_D9YeYmdz=Su(EI=rM{l-dHD70tGXr`m?ES+L71MfRxy4? zfzl!(otM;sRdnjQ<(qHpI42_hxD~$*RxO1+mL^+U1iDJA+*x}-wVm1pM` zc2ymslhgP;-Yc=PCL|GrIU0o7sFZ$NNlT5E+sqyfPT)vew+UffZl@Qxjf^@I0QLL$ zKZ3j4x|oAvN!^1B072`M1w{F36;!Vr(^DuL@*kWY+E8aT`)`9KV4Ij-Ong9vyob73 z&eb(PfZAs(G+O9`+9st0E+j@abP~RI2X%eCXGRh}lmMK2F~62d;Ho19E~4phe58jJ zdOE6S9k?(V92R^3Mt%R??~Sq9xT>old8o&ZXoVom&?e^-LPTX!mO6wPy^QzvpLwFs zG5?7DErSsAyOrE{^5oSAAQRU81+zH^6TMNGB&n$60UiNfe4ayWtcIM@Lm=+#Zo(7*o+y?nuUCfxY%TN%^*M%PZoT_)|EV zPgxyiqSuCx_6U3Sa~wVPr>?nv;0dB9RVBzEAhtP{(fk=Gi6*G(qpu)w_T_4KIaK)_ zw}mFd_?Lni45*|}z7lI%P|)fC74qsDNZBxuVvD}X&Lh#}{C4Tm30MHpAQue7v_o)J zb@lb%8c6h^#J`N}BL@(1-tuZKHp9NizqO>Op!_8_E<$jZAr$uGGxS{fiFQbcay!5B z>rxPVTQ;eWL>9C6hTX%N@CS(sHyqd3CEQogaUmfQQ|2B7cz(Jk2Cb9@x8897ZOx2< z5j|UJ^wC%vAK3#V!G7zadr*BsK~Ojz4+CuOrA{s6*ayrCdt&%vI{r2$PkI0oOu%OO z{XlhC_aw51aty{o%zM@m@07HjDrxlDeDiZ%ef@er)FS`Z+v@^<6sOt4CH_ppSq)LA z`S$YoHZP2^qB2j00+o`27G;HL0nJ5KPCe{%u^K<>$C_b5n50hcW0HT$v0D^HrLtP5 z(t|naofN$K;!8ppsq@~g`cJj5Z%enkT?sJ4T?Ul9N7IzH?$!zdC@7r^F5)Pnq1G#{ z5dc*m2t>!kZms?KX1|iCqAp{mSbTx0R#7Srcv$Ne1x)Q6;O9B>&d}3LF-aU&;~#?M zpWmZ?pnsCYe_-?P+Oz*((3?lkoc-|iixNU6R)Elo?4E`0>OV6OdchMe+jcE=-PSP$ zkP~?|mNjsVpA{zQsDQTZCk#{6ubI$~yP*Z<@DFR=tNGiF3?NHpfQdG!;ypzj-iD0yVQN9$tj zy}p4}1nNS(-ek`E?*ZH`_kRGuCl)N(E5_iMPE?ZD`%VZ;|671D&&7 zol$*Y${$jMmLiui|Q0f{xo_cXQmO{PYBR?ifq1%D9e&w`05Qy zb#y1K{FEBb+=)I05m!bden_q`SPD@(!y>u23hO}SWtjiSaD1!cmGD^^0 zZuu@T>bq~#OS#U36`CCi6XP_u?K|m5u9=+{jBn4LzeN8ZKMDh%3E=XVOdRWWzXTY+ zyFjA7E8NAj1X0!CzBC`Z5Yhhp3&fjvGs%BB-`>*{$|&Y|xD9Hyg)(aOc7d9EYrh2n zQtQkqq~d%^d(zW#u<7^|vb(K7c!aq@$0_iUj4*%)g@#D{`7n_wNKLdL4eoZ+CP?NY zO`HWU!aY$Kqns& z8>JiDaV89=TIgh)PC?5LyC4}a#~fS=V0nF`0d3{c6+LQ0ot;ZA<=#>xF706ZyB{i- zxo%n?;WkrUfcUzD5swF;jJv6=S$Q{YumAkw2acy=R=Jas=oeHpv{`{NnZgnU3vAYB zq(yJmHF)4v&N2bmiStYmPA<@-)H3%mJ@>mKj;T63p^f=Q)gcH10#MIhWD*}dfF+2ILUd)o8sl<;I0<#aDD9idmU3MW2V2O!5A&pt5% z$CYPO73dINn#MFURe@Y#v+4F;tClEIky(NYvhUB3-jM!}AIc2ReHpzq%6iK`TP@dV zse+x8OPd|*vWlT2)1Bd5J7>=3i`6leXZFo;-1S$>gGdB1Vh>WN#cTt)3rbZJlP-?JdDhzBH+THu^N>1;%Y$y(7Bh=75jj!ghHg#D_%4-j%9bsR>9};n?$R<}kc{4#fMEm*Y|R;immHVBk8dFW>&j`C7-ji{vTzjsf|2|I zP*jWs@R`NdM!$Al#y8`Z2kk6THVe~%+$|i(Jx%Q~N;+z#q8Wx-Qn8wOHS|nlN1`&? zK|}*;i(kR5z-d7WWEFV!E-7v9A--e%JyKDW0rV@PcS})NDc?OV9sAm_iDN%Xa}%kI zV!yKm)X|sVOQF#e7d@WgObI?dES#TdYB4cA-ziLX`F^{VS=B{uzsPt9O(_YP$@^rx zu)%N}d$(B0!*n)SPemOD#gz^XrYX@?l$X!=`BU1f^}+*?nNnEyM|QrB&#WwCfU|jc zqLNYtmRC?@UMY#I;~svT{$;LkQ*D%TD_$UeBa#lafzacPALE>x8*PnA9yB1lJ2Jui zsF=X4W7{d|Y&P|ZXJmr8C#6L5wVbk6HqNv!jV8y6S91%ZYh!`7OgtCR$mMzdAYp)r z2Ao)PgC5Yh3A3EFkcc?(jtD5)-|sv&*~>AIyY>WYmdLeui*<;l=C#Z$mlQD(=hyH&wgjQ&QoRS(Y6?Z`)Hr9sSDSm;)SonAB_PGJ2ugsjj&XOT&# zN>~-OS$J$rAnA*7oYn#POx8~HoXf%9&PnZ@$lhGfiqb+{YEvkd4#SPSpEajui3SPG z5YX_4++2OM3*@+$)45ra^k)~Z`RSC~e4Ivwjr>!|eotN!^9?G|1Uv}4_RYA<0RP0L zko$by+P;^7&Qb&2Zl(7I8Ug#UWLc7QFn9${Y_F;N%}nIo48%mUU6N^+<@Y`_j(PA@ zoYlvvgR>fE<>28O(jg+Dyx5xHibBE|l4kI^w%4Q}^--(~I=0f)+Xl7E@S%n2gL^ve zBAEqiZMqaEgeS)kBgx|q;?q5{TZign>*VsfmEmYOrMwE~c0Gc$m+1FS`(wM`XSz%l zEGej*eo|y&N`T!F6XqMA2GKFlO*D?I++iYmOk3-ibaa}pmLE9XuE>J215vTCiAo6A z%x9AtXsLdSmVPtHizLg4qUuXgvzJy%)GR9xl5BoBr zsr6E;al2@YZe@j4d+y=7pQmA*7543n-2E&TwG5u zR_KEAr|+w!Rev@qSJtSA5lw??SH9GL+11yhx%TvGy!Ggsq_N@$86T%Ht8P*C%zv1w z_^yU%uGAdLkf@G-YxiJ&z>k$7^D)J0PlK2J(#q**a;fO?Y^ic&(q$LObu>xG=KRO+ zEj&X?e;h|9ga^ROZ(AEy(o+c&y=i0L0f!#0b6G`PC^L8Iw>{_vm|pB z`|pS9_rG?@pcn-gN2%y1UZ^qLtyeE|Yr~r9-wD6go^Fo0E%3TKrmdm2@Ky0`UO)-SNW9G3|he^l9&s)>LPhHNI`S z`BZ+%#o(7AZ@ofo*VE^KFh}Kx8?l6rI2pPx2bnHY6-&|Dqg&8`DmK0TXRXL!$zo)= z?@WS2#a0S>deJJLciO;|=Crv3mhg`p8g_PeH58e*7cpI2JBJfkHV0dPu<=ik(o+~> zjtU5MAfi)VA%~8K<`Ea$#Qv7f-n_Ta7qc_rEzQg5>I-Q=gO)48;ZbYgQOf{U++|}( z@C$D%O5k1#k>=Bd$+_V^lBoL}HF*@@bTk$++G^8E5?+;H&r}D9qPk`9?6No>Vrx{6 z`!d3_nlI^u>_H%3`rb`nWnK^M(&W-sAsK=%mxUc#otISL*=;Uh!}abNSk)I_Wvjf3P|9Kj&}J9Zxsr>)1IzPW$AAxHRX-L~<{*d}C6n zfnU3w1q59T0%Dr!P+ROEj9(8V%k)Juk#)9PIaQT%QI))kzS++Vp`BnmhSU~*I}^{Pj}f zJB8BP^RD?8qbWXL##HQ?;#78xupB8S;?igiS$S>m(f~~)HskeY%}OO$nOL)Y6BtnK_@6viBui`<(`|s+Q6p%8=w$oO8S7@Czeb!1UO!c6*0Y zU0#FF?7tkh>1i~%7wiX##qy&uZbDMi%YNMxB15svgFvs{*IG=bxLTSYjtuu40K?KL zPGt~w&x3l$6Yn(9l`jg+SGB9OSPYNr4B>SfNNjL+WtVVI;nW44>Cuj=o`aPU>GFQAqmnbZA1?2h{^j8H{u|tBeNvt3Qbc)s zC1N(b8PD)+boNf4w`aZv!D*xYMcXo2tf0D8KCN-@Tq99l9E-5wU|X} zCSs{+T4Z8-(P}M0LK_x8^fBJ-&uYQ`(gD|r)IARXd6CsApYP9aY&J8upHxeHLM2JH zsu2Mw_Vk4Eh{#P|r!K1mDX?f*(NX|Kb!xpJKF@4AW@ECmu!mwcp?QR)INFbjc4XM0 z$55^7y(&gWfav13FL~zlt;y89k^5$d2mCmQsVQS1Ts2(r1%SX(Vlm&L?5kFIQjKC| zfZqO0VYY{LVrhic``Z4`Zqwb{9$=0?hHO^Th~PjSyYNsE2T?-uni%ZeMry-%+~RyJ z%_27QO57gArv)RJG44aQUj{dcXCF6IS0_nnm*Ua`0S$G|97GH+F^F+8-NLrj4zdKi z3wALv33G@vr*{L}YWLDSy89lE3(G9$nnW~ftScm`FQ>{Cgfzowu(7brrw=&^e0qlV zN4M}w?jNOi|MYG&9N!+qrp0aFP*|^6Lw(+2<71a3B;XmDm<+(f=j&O)@mDRg2v2^i zNwW9V0$kni%h*HYP$w}7m!u_$uVrjlO<{HNjI6qtRFca_2$9|Oujs=G`NSD4!HUkr zu0^@?>_L|YalLayb6c)VuIq(ZTWXr*=}giJ(PPsQbd&S%vE4?7xJj5sQ?IWoNT>90 za^^EWMegS=yq2r1Q5=HWjOZAvH1M_tXm8=xdSB(wxpgh8v2HKI0&H5$({uLIm>rx% zM*z*=<@6MOASWmu;t#1rhbvU6{LEs=U!SL-gi)9eZnoW;ExkRG)+lp$Tpj^T*ZuzK z5eN=Qw*;)zl{g>am5s{_yXL6e*G(dE3RSb~W$%lK6^y2NvHzEwFXCSOqmb;|XjkNc zvOW+)M?4srMCD+RwQNFWCPMMSJ-oR*Nvp@0H|Z<`C#&MEMCVabKc22DJJIyxMDoN;%~rzxCFFtLctv0Ra`Fo_0dU{Ig3{ zorA3NVfh&2Y5T%_wGb3;r%5}o7F)6O|37OWVX_(Fi+B!SeEZ4F-4mmXndlo%PaEVIpP5IJgiU5ym$8x+8~^dG7E=^ z#QNAV!&RXYrRHH4ddfBRCiSDfET#5iS^&=>o!?As*7FkTSJ!L2=SHv3BL3@LoAh@c z4(aat&Xyh7Pg{VO<$`6K-xam#=u|Cmyrmd%E-!=sP|UQGEX368A14|>t2V^gOeeML zRUQyo@aLaO2{W%4xIF}daCMTipIUfTnNb%sx_;`zatwEG2W&=95oHFL4gn0EkZcK7 zQ8NqcmhLN}?A-8T^FU;@{?_VRQbG4_*%CRmy!d5LSqYSZCUn7?06kBf+}R4JaM=U5 zg3>zMjMNqM6xQYi* ztHKKaz4)Ap2ux4<6L`j>98_htIb^hzWb?)7c1RmLQ5u)_>o11EovOHRbWUsaFPip= z8L`&bnKsuIQLijAL9hGzhewl7MrQ6vnlch**|nV_#y>T8G+G`W7nM~D zxRuzf4_!;Z=c%9{Zqnce#~O3GgUOQyK4)1k-kXarfX+_!gl)PdcKhJ>+-Jh!MBEx| z=980I$bgIAlXp{JT4F#)6_OmU>qO@6!CUDH9VYo!MU2|{`G=f#Qc-4Cnjbz?_ui{A zc<5XnsSnlujxMr{O^Jrp*bO;OiM)`a`#7g@WZ`hI*RD6x#3F=Hqmy4ZHO6TdEX?dD z@fj4ejhnr#E)-_0TQ9_{Z%w}#R37qv#9(-O}21 zd~h-OkwW32Z9~K{nHz1mmY~wVRUa|)oI9E99zA13q2`p?)0v$?|_xs zfSckJ@%^iG@6($ypMr%9=*)XyS;nu%I9$fx?TjJLyTdvpEh8)0``sSbu_+1WWHCfr zJ#}|9<+{ELTC1N{0^}e*SKdq>A#hrjL=`qFSJi>c%8~2q<9Vt8_1^9P<;SOzG`MRh zC^taT@@s3hPY|<8bQ{5j6^+0rdTuDd+I8u)cMs%N;hqHH*N5Xkjl`njMeZ~hDuph zkpQv7_Yny}7L-tH0Z98K>K(UJq?Z%@CZ+*Hgyaimg|)T$COfyA$B3ZR+|7&B`I<+I zld8{+#zVYiX6X&z)T&c!jV5sJhSHQ4G~oOSoH(2F_YA#%~Ogkl>}d^$VAM<|8Q))hvj%V+L-sowGFO$ zXmdWX9)N$AXh=N}WV9~Dp3|B|h@+LGw<}MEIAhg7afHwS*DI%#(?t80RwkWfjpVj9cUoBG()4PNT$!b0aEnliYo zwsuQa7Wq(9Z^VcS!`-4fjyfp8(1Kf87Z~miCoh4;jzj>JA)s5k`b2klHugFox^eqz zQo4v1%M#>L8~{PI@^&`f?l&Qe4_zz^+rXM-RbEKbn|akcSzI7qX z&OY8E{ZKLM36R!;V&Hb)Jk^dzMHPiAsTm5qtFeDx#ugg@(h7$4S}v}P{je;Rg#b|M zH^8JjzlOP@qB&pvH;e-P+p0VYx+ACZnHKJU|LuRWGZ}(NFTu2(U2Xs1jQ;bJAW6hi zWkPlu{&fI0Ch4vs8RL7=|C$Z@UjWQkWyFl$LwROI{&7Hl)H8wjw{~`)|68X0|K63q zG7&Sf&)=+P{Ko;`0$#ppP!10B`v;ilKhN+UikOiQ<%rY24xpv@HVPBeBK-N^BbfhS z3AXu&84=RDm4^M}0C_Tmx4~Xt*ZuFY{(lVThY;nr(JlEt2k^fRc#AN+0`!^Z#9E43 zs~Nh;$jG$69_eUkmGu;&k&uwQJ)Uv*99;+a-(NA;n2ek*{%8{rcw1p1K}lP~d$T!lfts_wYL-^Rseq-vFclZEEQc>c@(VVr=HOtuKQ9Nk;Uhf99YSD-!MDv*PgY126A#Lx(nXy zv_1%VCHpXJ;o{Kpnl0Io)Qs?wIa}Y`tlaU9tO@<&{A>`5CPojk+Xr4@(CW-2;ne z*8!){i0h?VZ8ex?dz|qT>`$0~07ef#jPF6u)DN%&-k_NL1 zzVV4e|1eY0)%x&K)1`?Q0*L}&Yb!gyIr%r|@GSrtv9S^?pQ!!s1mSFY0mLmn(GmQ& z$|A!4dtItKruUsK=EN%??kbim0@BI$&mo#Bdxxy0)4O^~*xP_wcHu7V-W+k_XX9-al~> zy!*;!{R5$FQjY2?F-ME>Ey{&KV`xh|P+q;G)tek5CJUwq$CqxMNZauqdcMB&6n@^Uw6L9}+ z@mHVy-O|q#Mc$*F-&8Z`!HDZj(js`z3`P9K_MjpTjw`W0%yE3`#w%H_3660E;xlm^ zQBbQgq(a^T&YE3tKO$;2y7P;PAa)gZ8kB5$q2qSt9A4zs648B*WR0B8Mleg0~{x~v#?&x(=3xoV>@ zgB@Z5rwKzR^97Kb_9$g9Z68)aM)|J@`jSUX{c}e$T#l%Z8yzFsGvx{|!93F1|1*^S ze}B8`f^Zo(U{8;9EgZ*0`;&XbwEvUk{=V|Ap)Qn$yTnN$%>B~IappsbQ?#6bO7s?D zMGI8IxwP-HRdF6P`K{DS2o&Je?njCx+O>+n5DPZL_8aJ42)paVwtaSD^-05PCy0HAS4xdg!X`^F; zub*J?kwWHQoDoHnLv5F8arj0BQOhqJ&KRn|k*wpF(5(%Rmj=ubF0avC?t16?`uZYJ zB%?G>vjz?{-0ybRm*?GV?k9e=SQF(fZ;Q!MKmOZkV_W|B_)|IN7zWgaGHRA&Ns0I} zmflL}>Sm0eor7WpO;S}9 zKK+Ng_}`OE`P=slDdh6^o1=bj8|r>AAbc!oOBA{V zvT}ZJxh=2fNR|04=`d}>pD%9R4DP4=6I0ddxJEl$wEb5$f86#;Go*Z&dKL8z>Qp2~ zM$!v_6Jon{$2+E-;n#)g8*%-;(n{gG^Nq9(j;h&IM^GI#OKdIQ*tF#ATooDP=~!gv zhw+SoP5j#Z%O_qKm0c>-V1|yK@oF1azvuNlPshr`>HI*A9i*>40 z2NCWvE5(}dy{yk7&S^!Pg1uYc(ugAj{v}-b@qn=Tx%6RyL+;&-fl`ZlTXA=RANu6v zm%Cm}g?g4|qeko1(e5`>_y~`!U0>5`Y#7U4{4@+`xZta8b18A*~P=OO1I3_%$3z_)q6_pMupInO!# zbF1#HI{#Q$d-m$Jd-dw>)&1*U4kB-L3v~$UeOX zF%QU|FTOa`%Vx29rtaf$?TOvUOw%^-GeUI`dk)5@2ezQ=hJbh33~ z*3}&9g+aVe;nZ~=T}FbUett~)b1%_#Zh84@{G$3PGl8?LLRI%jSqb~-+{m(|K`PPJ^Ipg>94i8L;rLk%kUe8k>oxLKb;u!ijt*nf>B&eh z@s-ZU(XrcB<)Z8JOpVyFWH7Nm__`=qBU1Q6mdHRqf|vgGK-{Uj-Ei$wyyTMJ%A{J1 z7@%p=($I(G#RHX?o96l{Q6A7=zn7hpp0YZA7}sEqMOlFc(#<4j*JL0sIZYY8Jp&{sayQ)$HjY$Nb#*Nw?#mC1-t8VMMk+I1cJZ zl(9ZydXz>q%-01ye(Ak#2SpkPLjc@DtdGf9tp^4bv0c5op#7cp`SUlhxiRff+MeA= zMqYDo8)Eb`h4LoK_|zkh+6>-n`?v)tOakKE0)+ zL4#g#{q%E^@11&2#t0*H9y&s+yXKt~wA%2ZSMibCiJ<&)*HQkKvDZ>-Oy$lod8Dy0 z%4dBddXqfLtan>bLku!>=yagI(tj$$%O$3+!>993Lcr9A zL_LRA;ozV`_eKl;+GWms7ik-t(8XGISwbqZ)c-}nSgE*t3_7Z@s&=Z*uXTuSXn0)W zI3}LpDJcyk0h=uf<|+1hb;plid)9M8-m>l&Po-GqH#gI^ceNF}LevsQH@4P9FQmvA z>CcpLhA7=U4NSOOOhqBg^yWh+@e!iUZpoH`llR5L}XIeh8aV-g$&JA?AyYsn6# zb-W;R>7>XIhRhliv1oQbX{|@j*mN>0`k>6079aY($&s) z()$!VXr@rbPW?_o^y4S_n|m9AxC~v_fT~3-uWeR!qdv(E+ed z!3<*oC^xIF`uch|RA&~4`+5xkPLb5CsF-|YG^cB&9~0;XDzL$;e6l{0XK^hdTU?fx zfwy3%yl9K@a2>?^RH1Fm36aBldw-|05T>f3A~Uk^zWLRi3s@|lT$(f9Sg4Zq+$ehg zli)g^9Y!3bqM(tjLi$)z{#Ek!3Ww#Ys+%OD%y@50F-Vp7Wy590=3PxQRYESRBtKOr z%Lz}NiEFT$c4megwFFx4)%9)f?JS#S_OHsdorQT?0pwgyp1zSB3tP*J_|5jtQrDeQ zy*ABP@G8!=r`#{pTM`B|w>slA9pij|Tb#N*WpYWQ29jeYCaa~x0typu`Xsn^Nktbk zih7cOOGulSiRbh2zyr7NeVesaRHIGGT~eF2uI^&B*G1kwxCHpc-QII~pr!eRC8mP! zKX_Y7AI^e0K>ezUwvifM{O`v|ACMU9hf+hG42C;8w!84llBGU^x>2mqhueWn8y+dzAD%2UB;*BNqr?b_M77Ow}(1FzFDbwa!(8`Dw!uwI)iQ9Rc`bW?ip2;X~e*OtQl1m4l zY`8FhMQqY`^5#VX*nlIZCj!I*^$Z@Ix^c}kFbNMeJf*b-`&s2%eNbb3#&R%$3TJds zyjbARM^N-ETH5eS?6&w1KadEF_8aSyH@kCQT@qdWUF0;Kn-BP- zxm8ZT9$sMc06)oA18i&Vpq+j3g{;?mp+RCGrs+5w97FS;aNIxsGYAAtrAxJ}tVk|6 zp~|xfts`F8U*vP|2qkNsMc>pqIy)c#<6QppiK^Oi0xk70rDi?}=Igb{4~hE-V^fa6-9Ez=T%v zDcJrQ#rU7in0prUH7^|>e|EtMIiAJ7CQ9EeUQp&r&*JE?sJOTb#>M~L1pgEp|92Do zgX87%|G`c06t7aI{8Sj9l5b?a=8exKAEh4~CO2AJyO?s2&zqZ@13usAm;K5_yxbw_jNg4v*6gU@#3Br- z8?kReT_DAK_7h^l?{-X%77{C2R8cD@469+{+<*LWvqw@?Sf!uCbQ+(LYqyeyLiYT;N~hlUH}G3=Z>g+) z_m|wiKmzkW5}BNPbHI93HhiN(HEZXUWN+^`H8$Eem%Q>~>}-S~pa9_fplbwKi|3=Y zoXk6}_K4J|Al(bWznEXqEr^78{WMSdIhwP3B4BD&mWwBz= z8ENih=s}P~Ueh_g-)Kwv_Cm21fd2kA-c^lHO(#r@j787BU{r424V$8H*dk)~eT@$h zJl$@(bwTsfPO|x%Ir5I3?e?yGPjirHUo*q^3;EA~Tpm>Z;is+Rl^!O-a(mEQn3Rj` zf~QeHTqDmCkzsEiT+mMu`cZcll~`>vy_gaEm%s)1^zRz{qYwKpi~eO1))Dw$UG$G< zvwvCi{|1XTz5n>*kJD51>GGxj?enxY;p{@BO8#k!-lxZ1LMT1W;JR=ILjaMO$`851 z)X!2IHC**TH><)cxV|{7bq`LW zhnM0B%jkKA2=OlH$o_Hp5z8I%9@?gYJDnGGUN(UfsSV8q9orj*xWEZKX7*+8n}6i# z{~R-XS;nti!2bQ`Cow>1NjkG!hW*|Jy}I|wczYN0U*8L5-l0Z@F|ZH@T`2Sn%zzr% z!2gdb_kX@ElmQ4e7zT8R(p=2fy9E5)hTvbe|HWbSU$+03z4foOW10VdmCS!*$^Vt1 z{~s$EYLqWaqW-7R5O<@$K-q|Zehj{NIVLheTMT-EI3GV2+9i6^QYnqV0TnG}%;aII zWNJ3Ns}#;6=!YUTo+&HhRai`h^_g?{zwxWp75vEdP7L&M(8@hVFu|Q&R>}QJ3N=wT5Ou5;<+1%?tYW5uwPJeaXBQ>3tpPX zR0d)K`0to-Ks1iHqkDRhE>7)bSmfUe@!Tla34~UOiq3ye8gHlg*6%reBHd4m4{-bT znqYE`VsCo_uZSP+{C1$|7nsc4HTrc3*I$fdepSbWLOtvIbZc$21`0t4b6L$({$c)r z+ir0a??uii$gKdVB+&J!-bDo#CU!gDsgUIHTC7h=u(d5U;f;r% z1N)=Eys$<&xrL4-R(+B*_LcAUI>MyG?xx+7Pnk+SLJbQWye`oNAtG z-}Seh7QTK~nB*I3eEJcW+}8Fwcp#>R5mf#C_k7nv$m~5SR0r;GqCFPk%BO_XM)RI} z5jBj)&QtrG>=dplZ4Z5L2-+zTSlnBEcDs{BS`5xG77i1lOT?|v?y3&HRyM5U2-Vk>jHA)EF6>UCrBxRip zU@_~dKt=;q>YQCNYbRF%$|l7YI-*_y)Y-oo(_=|zDC+7g?01ndMvb`muElF3QHb|- z5Fhz(E__De(e)L(2CO%19$)2y!ppV9-&_aDUA@(UwVs!*2CGv~x)H)gO@$$kuY!Vy z!%$dy<&R4MUcv9^FPxe;^nl~Me6_<0>mBMbAa&bT21z8uN;>)M0ELTTlMQQB*y|Gq zWS-WXnz{9`IsY6W^+3GS2V1Mf-2h0@k;e98eV)%(05TS~wfOKZHmNdzRGz0NH!l{c zS3W=_P>x!_AFIy8=NW@g53RJWnj9|HfFeMRjPz3-90ay=t$Bt6P^*lM$JTuxBYU7V9oG`EWnHuSCA<&mZ~w-Jv+ZUH(qu`rY2yCSE%OM@gRyxj2C#@8C&Iq0;$G(N{|mfu?{6dYQUqg z$b7mbU#!Dc3V>#$CCa}H#vbr*BtR}1STMrR-6`1IumC=}4KWNU#(8pXK#S!VCqm=ON?^bT3-JiamGg1YnD&6F#fLmL^L8RzN$Z>n4Xii#~0D zg>HDo-dF>+S^>N$8Y5ovz}_T{XWHaG$8{`T_*gy$NX6-x$`N9z-Iuxmsh@H7qS&Mm zXQXz~3u{>GKYbMtLvEk_hh$je6{Q1AdgiLh&44xF4IE&JQ*4M$uV5{|AuaGobJ^UE z1&gSrLqw54eExIRb0s;e-6ZtAssl89WT3v2Auau_+adZUl z))jmve%KJsz*Fw_@woCm6#q#bFFfh=P~d=>?Svd~MywOVXnw9w6^x8v7&WNt^!)9{ z42KS-?$~fEWiQm#N`Fxnhs_~kN?;N^kgw)==Ul=f==)PkWBLuLmnkPYi-;A(8=%e0 z`p~`$UbKctt3(MSXhsC*v=kB@ts%A%s95f)_g(1HLhId=0>@zV74>KKM;QB2Dg1{# zYW;#bdDpLxryOn6be!^)m$y`Um!1D4YL%-x<+L}-4WmK>i)oN{YtEt2oVCC&2U+Ed zz6z3;74p}=@jA0Cbi{FqUB9{VWULIOP;e=22jwidvOZ?5w8V>Gl5i=HV%CFQQqyyt zYZQwe*mIhgLbKEb6Iw!2KNxOG34>cHI2qlN41TTt@VU|+L*xHDTH5FM;F!ekH@D&Q z2ma?K^-AUkKU-yzjXURUl0CS#2*>6uM*TNQwZD33$!2|}Rib$4Tr z7MI8bbNt=-Y(h?5d%6sre~_Nv7>4iP^Vga;a+)ns<|tgs5n)h&%DwaB#ZiW%_7if` z*G2)-&A6xAHBi_SkYLyDlDMC(U`j1u!!X2lG|=*3k!^uv9YQKkVIwJ`USahsg>lp= zzl?_`SxzRiJu7n;GFDvdR z#b5g>@8}$qyRAUSKi+%?1>6qvVZuQLz`d!Hyg2nXy!ZXQPCR2K^^U7pvK56(y9H#2 zbw*Y2SM{ddjo$Vvd1OyN)Olla5TMGLD;F=9ub|r;NG!W0pmEOgogTpn+hrIn=8~#% z-ca<46V7}y^HEs9cd6{1pva-+gOb2xX-1DLCCu9J<+YzEm0D9u&ni3UPc$-pa$=)! zQtRd=BK6NlQym4+e&!mLf-P>hnVhyvczZ!jQKhc-<+Fcpo~rZ2cSJCsyZ(tCxif4U_!TGppBfPD@-$dFW*b zDQ~EwalPe@44JC#bi{Tl!P~anw&|A>F6o=wrudOrUKjpB%cFK^0V^^6k~K)qHz+75 zBMVMYAgBUd#`RATb(DNAJ-#g5?3hmY;5vdbcP#l++1dy!ax5)^&7}M`!c*~y`faiN z@$7mU%ATG}6URsMZ_vT%j=|HO^Iae^c8^qn(?f{~?=(yA)^6=LE9Jp>$ zfo=G@sx!2p{F|aL=9MTJtPe8#dwcJDjq`YAFiF;| zZaVswRXKhjLjX|kjDGSdM)0VSPlANQK}OKMI{Veab6!(=jnJkC2{AD&L{K}Kbn*yf%-r!-E3Rqw3aDy_3EXR%UKmgnP<8-%JzRo@M}&Fa2C^WohS%<*Qo zukX~$)vdm??&mf9?`FAd}v#0k3wqN}@8aH-ps zGcsUcBhvzJj&PWxMjGXJt2HZzg+lwfnOLhp!WrE92fJP9Z;Y~l`L^Hj$A!;lO)GV1A}+W z<3#J%wRfpLE5nqbs|{|Yr^P2TS~f1AMld-A1(<&Tm)2{^m!*ao`Le^8AZq z-|!SB|4U=l^3TqnnlKzHCDFG?nb8y}Hf67k2!6FixY!_#18?4$-w!Zub{L$$5rwKs@8@qWG-5 zvhsog!h=xY8^>pK9?{S_)p1&mWD7!I3MwjJkBLxkpYpJWd)1q+A@3%FpejNk7Cm7N>Q zOk5QG0mRT!^G=?)V1|NR)f^-|D;X+UbWVn;Lvekm-_MFW#2gC(4U>_}dH0lb@}Kh? zrIqQp7)SHVOLIyGQ8_HX5YS}hrD;F-)0bsIil`?%{93kA zvGl2ZM2P2+K}q8ZnZ+=;C%1G}HC>_pBiUzJzqu85VekTA=Z0Q`)2O1pd~VGsGLkx= zNqIu*V7pr7`Lns1K|Ya>XVjc=z1E>amwd>zf06mbnN~XLO}rgF9i7@LjD*lcc`Jf9 z=c^z`U(o_n>AZiEC1UlZxr^dN)BBEH6faN@%mc-Tsf{W%s}7n=&_^<_!dXr28+z|~ zT}LMt)as^Ity86Y>~1i4*Neoys;ukcKl<9F3X1bSLCbSkBVKJ4zx8H-NuUD1^tu(> zEh*-iDn=IB-`btYgIkTQk5$+^r#ynMeJ<&STdA*)S2#*FlrNC8A}rA1ykX^T z*?y#czeRsTj3h(0fpM0+NHTH!?{`v}=;`QB@Y@vJ`@UaCP zXwCFxcWo5L%~sd@@jBtBA;%+U!K%Hr!T#==yhNI$Li6cMW=X1d_9%LYhjr5n8{L<8 z`pq@IwQljIpl+zJ}kHf;-jffYw)#Qv*3~4OIW^?E6@<*t`M2 zZ^+-(S!`00f~e5-s>d>~t3E=jJ#@cf=#d5?Wr#{;L~RG9@}8R; z5@#9BI*WD*v6&c+N|w&GE|ej2a5WI|2KCOq6jYea5xVw%kMlZ(DcUJmU92-61|{u(Ka@R8k|JSArvJIu%b{Mn-%TAlHVM@6 zNK|xb&lsK6fg8LwITU=4_6MULOYZbLET4CuCXh z@KJY*)l&bIn*?f|EcIlsM0H~wq*AWn6Y9o^mq-Zc<5{&EJvu3KvrN40V|DT%9_OAV zJug@R3G-kiglpi#+^3PxPhEHFAX5r0asHGqQv-P;$Tb&stK2OXO#&Uo4-6P}Q$N<7 zyd;;Ul^4B@DS06kIOQd>lwdDDi@!ZtEkBs5NzY+w7d!->G)rrYPp#q98}dzpEc=oz zl-ew7$=-K?1|jW2^lZ4_Hg4X2fKL8-%U#N35S9zvsG!N3+Nbp!BY&trO2&~7lJ1sG z$nG1`ZbiG9+bf%3NLk!zuPfp0Dhlph5ArO(a9CJS*Qz8HgSN`8jLllP2X0<05f+2@=;81+NW{>GNW1pX_{$*yCA6EAxqrvRe-!~O*pV>MH14OKaGm;N)t)G=FGG4Y z+}cYi(MEptWF#Xc&1x|8WMXG|3C}@tu1a+-Z z-_PFg)=RU!QiU7}=Ayd>GOp#20IySJ6t_cq_V3of{PkYfed54$IzOvsQ_PBB%8>U4 z(UW&+&__Pad%lsJo2a9d#Hx{B?`bs<>cd~!vGNX9uwhA2y4zaB;uY7}VEZt8cp4TWR(0Mei>`2a|N&8y@d5kcz z=qpdzb=9rAW2>BXbWAB^QMNYpI&H$E8I6fE+Z}gxn{R{cVDwfwQZ~RV#`bTjd^_mX zo}2a6W_2;Ei-Pmba=PGCsUkRdE5)pJeXX`3$l~sk0SngKgO1>Wz7Ro7rh64Zk2Mol z&M-e$&NkrwX-x1PE<^NSd%s9ZEhn2uajgzjYzi6w?6?YX65E_6O*Cta4~Qx2epUCz z%lZ2KeE_*e+6K**xwB+6oddyeTSi8@FrLuh?t*paKB!GqZDx0GWRg(pcPhYM} z>nh-6?rM~;&gSJUQ;uYejA+U1jKOsA1;y;7dudc?&bd3Pgj`?WdQBDww;aTgwN~;X z7tUDDz~`96b+SroyACQ_T_ImrG@N%z@SYrXGhW$mO78G2AcdOLeLFlXp4$2O^`@G) z*#arvX^~lgRZUgWZp+$W6spRx>jB5$whymrMqeAFLh}15+hw20#**o{4M+V1HueD# zsz?+s=`oVaC0-!uG-zcQ3S%Jj*D9#+{nFg@7V&skafJo1@7L*;ykkvD3|%mJVtLoM z^}x66QxU^ypY|Pdsk{$Bd*j1;cu{#h12-oek6>K1*Fc$d2W1G5py(htI@7-ey|?-{ z-+1@uuZk6fa~`0(GIh9V2I}P1K^l8}o<|cQWc)LVaYLqYvJ8OVr29doP=p&iMVaHg z0GI)pH+<%m7 zMj_$*tVt^_7{2l21?S+pI6t5Mcflj+&51$^4lo=S5k@IYiuw|aR>BYxucCq`H^5U5 z7GM+K2N9%hfyBhe;+pzRyf7>2g1%+^n(I_v2*3w}J8#4GTq7+wHuKHhp(g#;Tnjp* z!F!S%1&aL^HB+ZL>(+2{LfrB_*R!Uk3nyci zxX=!E{N1<$yD>|n)qRt@6udRO8_Q;^OM97oztiiIh?$06OoqVg3C{ZV8;fJ>dtOHv z)^0aJT1uK%OHBkW=bXOxKNPRtOHAbNZoe{#%p!2hC0dg8crkh8nz2;s_Twaz1 z1zes_YFAhl!!4|3M1q=DD0A{7A4+@DR)BRTjHbM-Q9n_WT@&t};R^1HA%TJ0V;pmx z+-g;?IxKqT%{S(i$@d)za-y=rmPXxOJ+B4trk>`9JmL38B0Y6gR3c2$U@j1N< zAU)=ql`!12>S99Bo%v9z8nVcGJOmxyXB^9{-1{{6-q(F-k!_ERy{2pBS!eY&dFd|6 zh?^wDn$+8REPf@y_GDr5W1IZGUUSn=tqHm=_rrtX>J<~cwaDz=)?%}$;|vb^vv=a3bl~sU;s!n(({1i2bIZupjox?d$(+P|a>Zdx+yEISa@Hts z7IN)P5d2CDbM|UvstFNDNZRMNJ{O|ylYhG`U*}57X*O3{l@SOxNAsKt)w87sS*wKLm5uc#8XmwCB+4oIrdA2Zdqy zM(Wgwj(%D>QBOt?tAf>Pr(rXB++&743}rUy%kF9`PMK_3qpHZcA+P z;7{(k+LCUzhUJ#el^q`t7mNm;@;fR%uS5p(E1k9_CVIr>1O^|hlvhd{ll5kFQV&`v z)MqX*q~R`fXrZ3SaoaC`&#~Igwf%tS=vf7g=*ZM{>ZnAMm%g2O%&fEX0l(@vGRnJ7 z#c^eLC^6fU(|kRKQ%q6Nn_U+#1liDGEjM)+l(##V$#S@sWwg?Nf*VA^F=EcK<;B|w zCYmG=I97phfvx+MhZP;6#1)T{=VouWd&14O)yQ4<)IATzcwoA(lyEl8RsH_qI z-loVo?+sda3?s`{S%#Ym8}GSK99)>WCL5dw6hsDzLG zPzeEIh{z`}M2&plq??kXCDB8?mVKJyTU7j#A^fMAQjt$Hhm*V&vIg@O;SRg;djpk& zp1J*-Dna)L8mTDgUJXCVYS2D+7Go#cKk?UdXz{$_XkHpX2JSypd#cX4HTv?U9pqC; zLh2~cK)9a(Up4$EX~xXA5N~y1;}3U1N_Tm2`-D$Evn;`P%(YnK9??+k?0xTcYuS15 zyrErOtmeAg?IPW0#cQ5M1v5s&ZgrT#UwS56&VsIxlJa`Dn)u})O2Ou0g^<&VRpPlQ zE|a>|1*pfjte1|}!!WK;ZOVkh>Y(zzUsD?m)+7f>6}_6{v%6!tVEQAL`@PNE?lhpj z>Vzpa_A!(0pgk)*kqf`Nozv~B z%3xKow6%4A=4bb&rzpMQh-otC+k(jDombY! z_FI$I7JM6ry1RQgUy)(?G_{7AcR`aycR^AEyNn60U-nkWi;sJ?El+H$$AaH(Jzr@&LmDh; zH&gW*O-dvkQC&w749yV#nT6C~950PSs5*R$V-iiVj#euGZEWzlkc^e__pKt{eOK=+ zx{~Bo2;8F?f6W~a5kpB+X&90dcyhb)7CC=2mF^HI+>evp3b^bLJ!=fEffm#?@u6-uM{|s!{H)XtMBSZUu5lD3H@ar*2wD-n4-qByYGzPE_9UnC9;s$)#<<}@1H4!6pJ zROa-QNpXZBCm$pZz|N(R4OJm=xF?#9OTf6^5sa*5eu96 z>G=;LiE({yp|YN!)OH+_tL9HCa~nW!C&x21b4h^Q%;~x4{a6>s8&wD$7pD515ukxdC!6Scsx82Z{u9jHdt>u zL{QzOQ_Fc%OV=H`l)3FFy~(%C6IcSjO|qnY$GCSk!{1}+)YjJ<2PG4dEWI0Di3|u1 zn4*G_TV{_7dv0v|8pz9@|6H^$YleB72~XenZJ`!>PR(zmtS`%|z`C7f*!7J@Vz$(&U(dU4$0T8FlVmVgQ3+S!#j&GZ;GKChylQly=O#K5r3PIdsDP{GY0Sub z?hLJVXA7NpoV-YMTQ}lASYtX|hpM{0`+2{#A~TW+uZ@S6RtB^)r$=TpHb};uclt<~ z)N>CL!m}~1?ch`sKCrm5NY-;y+hos!AZJ=U=qIh&tIw*;TDn2pMVitt4>MLa-%}`M zjJ(GM{~j_Kk4e}yjn1U4@|7X(VL@lEg}%=(2oM8e zY~YpDSvORLB%n}eWfmObx?a_NI&`X&=F%PJ+2T8YBnU0LTu;if2Di(E;k2i6bSquoxtEz!>EZ*tLX+fmie<< zmD@vcs@ZQZb$U7{(h2edH#5&Gj6vhfMv@cNe&MOlcTE&M`cPtFl76C9_d4xxJm(te zV1F5kcV}mtbrmudwd&6?#-1V};aGKQg_r)(qK!Z>XP3hns_U299?4brX{UxuU)O}m z@|kw6h;|vOhncHn3l9v0r2A#zdn&6WL5>GTK`QAscVVC^xrw6?MHz>PuHu7;BsYhz zQzXM)SSa0Kx=^4C8lXCUYxFcT3u=E~D4R*-wEX_S3suZdV(w}sRGx1c3iKL1dNHQw zZ2fh>JvA$*cowZvXER|7ZeS}vHTrz=7#Vhm_bx4Qp8{;$b>slU;u~K@{0wzMiC`MG~ybd3@Gi)>vaHY1pJw`F8W_xV^dAuT8Hn z!jQn&iM(U(j1CrX_SR5LtDlLQCOF;s^zNZ)y;3Q7^bJ21($cS53Q=QHaCn;x3gjEX zd!{U);Y`0+5aJCU2}>{1KT$pMcQblH!uuhagJ!Lgvm-^ayth{7C3u+}&?EJ6{E_X^ zL(_z)%+pAEGfr_y)b z=z|nS2t(dWqjqFhFiK@>-VUKZ6A#f%f{`Y<%2TXcrrb=so@=;eK;q%5?(9GnGwY_J zvLnDzw_G)dI$Us0zr+Z-`7w>e<|LStEp-Y&>T!Vs@UI(u9LpAUv!`%f%k zoByy0Z)NOVk*@2z)O`4_537#ziP}>~n{1`!r6H9Q0}VVT;{~(L0Z#<{vxEtQ-ARRI z0eBPR)Bhyob9DRTh^WY6!CauUM;NM2R=4la79f5Gx+a)c%otU&uB7kgiAc*;EG;@M zWfH$d_Ck10ygHY$G{EfO(3Am!eiJZN5J0=V8WG;Hnqfkza$sk4&pH}Db)cXQvMuPc zRsaQhY0;w`{1QM)%c;2_*jJKny-Zueb;S?>mXI9C+f&S1ojJyfKOE!OzS?5VmFv~t zPfX}86ey_oc8a8bXc5hCcW z3t_KpMTOyI1kj@QyhXo<~m~{B94}gq_=j)xFxWsj@rv4Z)esG~< zQrVpjViE`2Kzz$wjyMcYpp&@ke=;S0TVxLJ$`Ks!p7${2yinQ8%HuE!H=rlyfL=H? z@+A-xFn31@iK#GV$AsM8`ao6hY*ira`4e!wS1NhWG8k0BpYgggB6)WaLB%pAL;S-V z6OM`##hC9B&r>^Mf(n%N@zhE!hcpO+Dds~$?~zyO0l_K>Dvye$2HM1YGuOhOw^rx& zblq1`dk&qdV3j&aWlWJl_+xc1F!NKGg|#Jfobekx0nNPODHj#+n9hQf5OAhQSYJ=W z**;a6N(6HlH~nb(A@%%m2P;WW#X+zxqQ(NQW*Mjy`LbCh#quVm+MuQkvsDp<;8i7X zsCmt8f5PS~oBSaDD0gs`-DB;w+X+lw6)N%qQ@zg$w8X;9s|~Vs^|U7(vCk)x4=m*0 zW>hQrY`O9XzfAG7vQh|cFo#RilOUI4)dW3Q9*Ji~yFgiN#9&0erG4S<+GIv|RDQ2} z|IeIJqadU3;AQj!dk4L`!Xa)ZaXdj6adg;M&{0LWTrm=ZqO1Xjq1@3Bbfn>U*+A` zT;R#fZ|~?=OPyF2@XX4 z(J70zN6CU5s5zz7;pQp26Ff)4kZE@=w7fsBJA=~{WnD`*VaQiiqqxgY_XXO!tcT)V z-4+jq^LXrgSg)1qa?7&RzHxS_lmv3E3FTIA-`Xo#{7R=MntA!cDjN}B!EPzU<$1E; zfxogBLFtz6zh1NCRF^&L)39 zyAa)V|zSAJr+Ddg76KQL(Gn^ zpYk;~G9E@9PoA?RJ==F^c;4va2`(1h;=0|4e&dfZ+)s62WOPIdUV5|>yquGXs$iql zjY7vPLkyQn&k&RDk4kTi=b7q9HWLWO5?mG^*=!t8ylZ*qHc^Fr2-?04)-W_mo2`5m zEYMpZ9Bl-grw8pfMTy&!)YGmxs~2aIQUNI`3zMGR<|&M6BeQ(THX`G5{0zzMwhRIO z^`Y3(RgQ(ir9osWg6w6oe|rQAgL*;5%3)V~&IfbD1UK;!)5@+UW-FfLOPpkqF40*A z&4H_tCRy2{UkudJ5Ly0|?&7TS-V)7$MBm@d5BQM|lpS^kk@27C^KUgAxmh4gOKWre z>XH^X`>gkBX$$cB`-TBK9Pu**Q$ zGv^|`mAC$UFn{yfXFA4iZ1+u2!cH_@kgFzaOgGs)lF76`3Kh%goWfILWvD!|JJ7Zu zFXfRb(@6JlINx`d9=HpeOh#+owrFiY%%{B3ew)1NpmgGR$SNSEk#z4nCDHo0PLowM z75wVvI_Bic_4&-(2$RMiYGseiCiv8?BrAhY>!<2;ZkP_nmU?ZaNi77lhx5Yg@_D0p zKONah_n{_sB(1K-qRF|SqJ^nmpXngP+$W`p3EiA{n|Ye>UbjOcHEz7I`L^&Dy%4=~ zVXhnL;y)-Mn7ir*&%VAyqg@=m+xkChHw>aHpD)O{JdqursM_X7C#^7e-2s=s8$bcLuRb)2kmkb3-#*nEz>f09W<+Kp#fU-gn}}6lb*k@MPz$$35txhkQ#DRK z-#5xCr)O+O)DD?T>*s2u#1DSL9kKmD9Of;nb!6KzX0EJL0IE_XZigtg-D@W7^hNus z!&?Rh(sVk_O8q`LZA?N}I1`j>JvbkKXBM7dni(e~i{GiNFw6AS(r7sBdXlnvUx&b3 z!u!;2*d}AJbvAETwW6=BJxNe+miq}PWbYhvTUhV#(VQF%{=+;+c#pu7qSAZCbGc>Sinc&9g(kc5~bP9f+OBG%t?;~J$? z4FKFnerECK*o!{BwHaco=Xd9SdjXVuI6Yi{vr50Gsh}Xa>weS#S}ozxwQHF<*WAx% zjp^;_DTusG`kVU`@>{PLEH{Vhj!esIX};*+=MwvdZ~7>%UaT39-lZZZa0v04m2*U_ zVcX)K_^IpA35%67Y2?ir-~rIUTLXYv_MH%-hj0kSKeHUXb`XUSF4#S5;h%JC-?G|3 zc$9cPJi*L()AMhf9>pu<3iL(woOC zzATE0g+uk($)_IiB%QR#FkCU`N8@27kPdHfA_D!vGsB@OBA;{(qWgFaWLtUVPX(#_ z)A`?Ljd41$F?i=;%=l8uG*L;=SqTw7Rtb?139$`^cRU2|_Cp4~X}O~fP4nY#+F|*G z9*GZwIvxYi)C#m*(-Kg%^pOX<$jfKoM)~yTqnjk89^6X%wEHKbbwD(tSN;7QR%wAy z6wnSb%!rkl{#-H)C~BgA0|2#e`YwGxCwe!iL(yl5bd1HX2iO4ep8(RnO~X1Ed%RI# zJZa9#k@$02RRBg{_!$7<-_l>C#wJB^Mydtc#f?38x3k(3dC)F)ld(}PfK*xSaXfbO zwDb=EDF-1V2o|aL?|}l022bpAt{drR)iNb$!@uYdEtCp862+Z74`l;JF*_?_ki9>8 z^L*s&2KDCIbt$KuGlW=DCN%8=;PxMeP>x}-7AT7WuCiPZwAsflM!WOs8ZctZ`=4~! zpCu%9R?;E*#qpdE2K?720;p4xtRS}d3t~BE|mCJgQT(`Nb4alz-TO61|ShNQpvu(Q^ol1!4j z=W~+4kWYXThZ#Ana;{5P`_5|fcm(e^Vp&e>a}ZwGBZ50fDX0 zGcz+^HqHZ2-wOd%{Poltzy+SZ@JHKZD=56=8Fy^GEDgV90NDG?W4zv)7X< zj+Q6_PJh1M2u=|@$KI63(}`vi#cTQeiU9!us=beKP!IN!w1&1y*q$-+>_+brWj=3S z2U-jC_A=^~HEoqVnt=0@k@)#K)LngezM9V`6tJsyYmlD=1|y4Y&3QV#ZJrV+TF0Nl z%uG3PN6(h0a>i&Z&YQH*!prsc&x9dg9pxcu&CL`8>Qf%j3~6sAwE3U|5LxVBc(q3K zXKANi#akOM)&BOais&1YNQQKjf~aU$D7TsVuaPnuCHK5xxsz&Fl_Eo1zm@DvK*yrW zZsMx7lsW#^#yOfGCx-1UdggIh3}uf?8Vy#eN-wm9k8NPk>qk@;3+<`_yeO{+Nf6~v$7Np-n=|z(0P==of|KFrVkR&aMv>L%bcwvjJv$_w$%1* zK%W~L8!!zLqM{#hiGCHt4nniVOWSiswhLioB_^vwC`LyoCbLGh$Q;)&l3GF8ES0=a z+Q1hrbj@n#)`@|5e}21w-L2tWuKLnL#|^it0Ai-FKG}ZHnkz%S?+)Ya*%t~)2bLEt z94(GkBY2(j9R$}49|Fo^WpKRY7fbohTzB0nv;gu{-Ub|g3pFc#Mc@u;R=>I0pdZ>i zYoGcHM+Ep=W!=)-n!`GY!O97k+er=sqf&YDcwyDvgA{){0gEFYC_Xu7uI1=U&D^rz zz^%k9;qn6gKRd^s{UWq}1o1G}s7pkYR!HIeUg}UQ~~?{kOLrn}fmQj-4b zKpy#QR)XcW?~*%U9q(a|0{;MaM1dJW8(ON&(XWqosRjQ=bPg3flbm% zuzv3py;A1b;f=Y%lZZJTE<8AAN2uqnPM&Vsb68JlJL@^ed?Hv$xz`+MJYFAS2Y}pN zw=%dK+_TnWpSxzSqsDuwg65vaC4?3LDAz^!M$;J_r_grbI$$7I6IqnjQ#^pcU3K^s`bn@ zS5>Jg^X@)?8pm|F|JxUh%AW)dSe)0ot%oA+^VRCB-fWur5{X=TQWX2Pa_X>Rww^uk zF$??2G3KEU9_J)LlTLklv&l?z3t-PNg}5S+rofQDd}68~aG|{@HE!}q^{+KiKtksx zqcw&1Mvzv!O5AajTOyIwG)sf+KcW+c(RR4Dd}>#FTKlOHMt*EeGvHW1sWW2ew(MTj%BsoP~bR-o!l`r zp-8w~KHb!8t{=Y4dTEYr=PMg8e5WJ1TI;&mKjB_bAM;1jglCsLvA$Wt2O~k}yFknJ zh{wRGFENYcB>V`zbj-#him4HT4&$z97DCxMUkv3_zI#7k`S;;W zL>JB0cvpIoz?Xcf`em8 z2B3KPeF}%s&tj$Wq}#`xjC^e`&jenQ)q>`e!z^7Wz~Y4_%!}$cZw9$1A5Y5qcm{uD zy{Cu=L2WeHYf&laIpRW5t|hejSepJ(>|GVw{SC8ZW!2{6&QS^&fA!QL3fq` zqeLqUpdtbP*ciNThT4*0GuCsZA4|I8sFlg*uiz_I8|y9R8s{Oo$P^oYe0!<*d!DsWEO!`0I^_NK;QH5W=vM(lXjT^q$Jm_L zM7;MC8m+fugv)c~@%+Ta<|DQSX>fL78q!0Y8n zrfjuQu_qM0dOuuRE>PX-$CX(;Jl63xm~^riKWk*Nd@r?7uMf5o?S7!bQk6!34;(Lx z)z;V4$fXG8ea14i*1=8&GFBrY@0VWqg=P}F#8A$dxLlIg?U^$8j(L_Ib)UiqPiNEZ!D+VP@#ckU%YqFH_#=5s_#^j|gFHJ!35twK zE!f7!Cwi^(*82G>JJGG$9C4VMrmwUq?6Ti*t^)qb#t_5rDrFHQXM2NDM8`NzJHdomBCucv4EgtwsIb&O7>(GNPcy=7>&O4V$>QGt#r zJ1IME$SZT-dnu*Z+nB_?sE}mM8Pe=>kUN8Pb36Z9*Vrxu~t*bZIr5V z+&#uqsBuH{)?}|f?yr)sHQf|Jt5FjJLUTRbtkfSzV{@5JfGOM?0%R2}*9mRUJB!_F z{bGjV`#JX*;HoWhFGPx4_Dc3IYLmvJ<1wJN*%`}dE--!cxA2$p--%jBnd-l$Wi{L} zXjO|{2|V;(KCqd`qA^~mv{GodwE)%uCDVDfPu&-GByBt|8|En&CxK>@0Do*&vn(*# zp^U&XZ}pf>PiAEa$;@;;3umGJnw#kT@kd0>to~(KK@pz9CXi>|YJ;%(JVr&yl9*_Q z7x!GmU-*#^3dvgUQQE_a=)r<}?JGu?8*nYx^J)9hcwpbUwd9&tWdEdIiZu)P^t^`k z$39Ctavq@Rese4jGX#xFt=4V#&dO{}5Tl{3Wbvp{_J?L)FnDVo;4KN*Ku*H}d#^_N ze`qns$vU~$poPIO^HMvJMs&wh%guVhfz8cVv|*g=GZObhY*;|!xU7^cS-Q`Ay4%>|ega4WZsYO5l07@PcI1Ivt(r&hO6?6+n+9FyAHHk_svRAkI8jyzoq#r z(!5lwm7YF0j_s{Kd2$*vIZXLsKhK#@oNy>s$WByvJl`!7oP@C+$0q~s0?Z#B@BVtR zM7)O-g$IyIa@Lw&u(k5(*BcGH0TG%Tr7_W{6O;>57mJcdAktT#3p^&ae>x`J-lu}D zz%+pUzD)1gXQ(su2pIX?502ACPgl=rg zr#KBMK<(UjkY3Pt%X_DB+*>yM8tX zh?~MvSSH<|QE+jXcI@2waR$zRw!;s+ZviwQ~hdw zV#A&mDD0OteYW;HW-}L6xMhP@TeD2(i13+etw?@Wsf(4TZ@Hq& zMJv1jN^&+O-iOF3Zjg6*>>%nSxOQBjM#Qm|*Eu7@+w`}0={37XnVTbU+SPdWynysz z!ZHfo`z5znsW^*W`+?ux7{bW#%>OL$)^*%*3X9x9cAKr|& z%i~RztG-9d42*TXyoK2boe(L|BC$DGflILKPM>h%@g=~rixPr48hNhVqL!^yr~mTz|GilwfHLIj<* zlQ2_cp^02WF=ggf!k93^5fO=_PB4uV3|w;QGfwR95s|VPs3>Ynz0YXs!T=U3T3lM? zIwO5mZPE4pcuW+LD`6JS)@x;4O$A5cX$5#(zJT9)-1Dxdq-F{LqfyJNoPtm5v;M49c^zX@;)^S7qf_z z$-olUfG9qa1*U*=LVg1^3Ew=rx&z`wPO>w3b@DIfT5kx$((B*B=!taicqTGt$-}w0 zlJ^1+*>$%UXd7)838oD#TAQ71xcfLZ+X=I45801@YCc4S5L>ehr*H@zxHS&VL!1S_ z`~LHvAHp#tl`n%Cjwv@^&peX1P6fGx!3QEu<2ZdidsH27@?W6c{Kz(g&l8L8em>#X*|{l< zqNe?Dwg2nZR=+vj7!nGx5A-vF&YBSip2g8&K(Q2?_}3?2Ovaq-Fc&`46}V`tXR8sT zB~;bSC%x_xEpmi_Ymia6hx;|2(6!wa61~Qcv+^$iR(R?FcYG#2NRi0Q2yMTB-fPyJ zFyarPrT)c)zg#V34#RN9`x086o-kOEM zcNrk$2wcwjMgBih*waYHsY&%O5PqWBiVao$N#u+lE-k1jPODV}C7;NTZP%-ptf#9t z;wG0eR3<)s**xr5Ui@$?1WEe!pC80Mn3lnDVed);Zrcyo&bT2lu9MlOerh?rF`f7a zx3NZ3Qa7bHfmIQ9qn&Q?k& zm{WrAI8Qr!a!qc6vdCP%d1Abbu97e9Bjbic^_nKr*$tGS3?U$SX0GQU`3Y4M$$As6 zaRoRcBdQXWH2|i*%kKQuReR=#s4Vc!T#lkjXM+Xhi^6y3Wk2Md1?H;2v;=$2$t$g5 z0a}el7bM0Uk>Rl}x%%|noCt*mTj(QRyH79F=@@<= zF5|ouMtbrGFNGG4mc2Oumzg19MH{&?H*9P)F-Q~{giQG4$b=C8{P=W;cFa#|Ho3v! zHD7ntYeN61Q4^N!=k;L>ozdB!)1s7PXuxY6a?L03TB?O@BDie)g6j^z)# z^UcSD^Yklv@Lgw{Cv4?(VK15}Y~M?gmj*BQK8dT$ZS!2pdzfId2OCY1Rz#nt zq*gXIL6gyW1bym-h5y6lRSm`VjO9|m44#|b#R8N{r2*w&{1@^N#>i6fA&=l2jcgAb z(xIr2f^H455B=fp8^dx%YEVa9Hn=dGLV^LcRHSSUPFq8<%Wgic@3qj${!%^!^2c}Y zAh`hG@L?|F1DEGD&qBYJ?ZZm$-eO%7ZVTlJeo_02;AcEmh*r@Np`nT|Il{3E*Max8 zu}0ZqH|vF}Ul0HeCczw4WK+lHF}-2%vS^-dxGVAu>vxpx_R#|c?I$*Jy`fz}RdSX;b z*5Wy$4-seR*|QJYatlg365}s)zh;&znJPa_^W6||gcWPo37lpDO97JRvY9^H4<7$1 z*F8=C=i&}t>j|TfRjNJ6)SOS~k<}XRJ+aA9SJd!YbRGKe}=hIzZUXI%goYWB>$d9=_5bosnh966xCvT zz4Pk8Ft%BoA#_NB&~=Pmq2jpb=Cjs1lQWu)PMhe}Mv~##Q0{XmJkogK%vw!yqFZ0q z{4$+0Ka_*wGNy0Ogz%#?_~C<*Hd&BeNd+>WNyge9TnxlBe{|xp)(_Iv?9%<&!h)^T zKYUN4H3yw9ftui!vv-aynwVU(yXhUzO>BBEgt^d68xqnmBhP5@4x_8LY|(kV288$- zv;E^XtU;|Ay;!%&?L|PD$z)X`2LQKo>HU*zwg#2?FIoNmmiH2}RU*oyXCV>mPYa>S zD)@^p<;xFaxgZ-FjaoQFs40qhpCvL{n8n z6T?%TbAl-YdPDHB{O%q7onyM4DheY|um`~~;+4rsOOG~Q92BI?Orhb&GttpRyvO(Iu4t)pD6J>$-_W4 zECD?i;IT*XLY5OSbrcdOmYd!CGDsv-ZjtkIgNr6FgtV9^RbghW#`ps`RJ$J;-!>FZ zq{r3)`Q&=1=7erIAMq?YA4MZh=Q3FD7&YC$Gi9a_aFHc3qp6SjwDIwGX`ggb@VA@| z_w&RD6>ejWYU49UU{-yu*pTT&rAF-U(Lc4Sp_N{%reEPH$t2TJZFBtt9p9l8WF*Ur zgp7})iE83$2FN7QBTq0gdRp-3eLt~WY$A%F({%sb9W*}lqXvL$fh?Lx8BGj0{stz7 z3tw9#=Ua$dtZ->|lIGXo`h^_8qWm+W1P7R3*T~k6L=~s=&4EO7wXWP5?_mPGa;EkR zn|Qn)F>~880{FUqXPGq#unB~oTu})YDr1In zY`%iNS4#U!!I*%)Nre)ndU4^Rn87~#YOubz;8uU8i1e+2pd3)>R?$#5{kf;|Y;RmY zdWY8kyWUR@s)=uo*p3~BjOWLzUSi_BP@T}wC(BWds#ikj4OP6+xzpOadrZ#HdJ4r0 zaJD=o>xbX4CwcfYLe@!LPS+aGhG+|ik1Gd;e$*+zUmnkkNx$#$7#KJF$pMISSncAG zbtqEFhmFY#@>%!PjG&9y9F8xUJ(~oCt2F4sib$%$tfDejSw4NEQDys(pTWJw(J-j| z&)pBa9{Y4ibR6%=N#bgD?;#0Fzk8}QN{_D|Nnu0-IGcvMAbXLmAzWc|HB=P_h=d`2 z$PK(k7frNLqIKx1f5PON>xZ!~Wz*fa}cpvKxGFj^V2QYSUt4tvi-pU&vjvV@Wu-x$?B#GIEC-+NONLO&YLu}bh%dcov5<1uBjNFbB> z{+r*qt89zOH`&180AY#to+-|u^>_xh-_p2dhIw@nT!65o#;<8!dOAC|5Z_N?h3M7Y zWoGfAymt3;ZVIGL3xH`o2dw<_e(HDU+tHxp!|u!(L*jpLjgRjf_&J@|?L3r9P}+*s zP&F6XYuYak`@tns814fc!zt~!%GN7ABa`adu7cBtwcQ;ncu1_`q!zJ$xZnk#H%S*Z zzm%V6;x;J8j7)(>TMk~iQ9)RHz8@N}cQmlScaDy-_ElaqacN@@xs&HxeJK{Bf^tzqKPmwT?Y?}{Mn|>D;yr@UwSVs zL%8aSn-0@BT(QyGOnfDj%X9UDmoUMHVc`MY7)NWXvqOc(4YR?n?&+T^VQ1^$TE3U_ zL2Q>agU#k)l$Y_;LgbJR3h9drBBPL-{$S&`4WeESpf|_*FzH{a^!X~Flixq5WIlz3 z2E_p=)oO+aSHJqY5SL;1BZmaJJGQbF0+os_w9}O2H7Fy46hSz&^cJ$FHp}L>S_((1 z_NGzd$Xw+7YR#;(4Bl;WZBy~*s&`TE9ZUU(kvrK&GN($g zZvXKMEWCB)O+z#!qz85<@zl5fx(oI_WY-9xAPJ=XqwEMPLAh%cgvpmym*{{dn%Hx& zXZOrT2hxgAVbpJ_w9;mWpi}QhzdT}J`m(n(oB`gB9D3WJprgrTr1GS(VDm#U5GksZ zDl9gZ?j#Bq3*nTk_`}@LU?mDG(3zB!KjvkV^yQk)%J#>vpv1Q0pZn$vEphG3s7*@mn*}EVTk?pR{8TCB$?0lYMIDD&eeE}lwz&MrmE^Dd7YC{Z;_-(!m(bnq%DBE!7 z9r2~q6h#)%ueK2TQ;)-6sD6y{U3+o>*4kc3F6a=vU;1`-${u!>dd!*HIug69y5YsQ zeoCH8_DCLty_a0>Jr3*UWRup4Y!j3^|NQJdyGJdupEPMau1feKO-_ zLDQmUgKg?SOhN7CvE>e(hFL}Er!dd-W}V<~g%0Fm_r69wg9OK{(LmO7L&igPD^_9x zi;CsAGlN0-6@z}IDTVTtevT_k^31>A>cRSF^#LCiInXVh(Z^!3G9TntfOiN!6-+9l z6HO`ta(g5~^Wm6v8F=8OGWjUHn&Ki?;N&;6GgybS({`lI?GW#2>04^F)kw8d6*s*V z*Fdl(cGHFY+;j4cLOPkY{#T%M0;j`P<3L7x+L5_=3RGak{9&X)d&%}sRHKfls`|EO z0YdkS!wTSV@`dv7vOB`+fXF$WQ#^mk=F3`Dlg)lWlOq_0+@52Cgyrh_QPu#0c0Aduom^G2|s>!?H(Z*K~)ku8&=80Hv%v1tz0neM*t3Mq}*Z zf10qgM-s)DtW`AjE8Lf?qsJM*Zr5F$uA_>eBe&e?oVm6=S#ot>-WTQP00~FWhGBEh zmufZ)wElJ+*`?L^lZUK6{$j>bwHf6n*UPL)6w7N(RfUGeB++iW99myz4uq(&IcvC| z0lz}d#g(f}5=wuV%$6W9hn_fGbUtS78T8VXdq8JWy+~lBkjb1JV!OM-Hqj#=Fq+t= zw1mfZ^5ka`1XbwPz}q31N{#?VhUxWk$G5_s`ZC#)(%$p4YKyOA=k{s$*ATo74A9&e zEeh5YeY*5f^0U!+}X8o)q;y&WA z;W7m$Ds1&f+n!C3h2ip`TwuTp-c^&?ygWlW9J69F3(HX^8$-&5p9y!qJIiy_*JtYs z!ygepJ79$q%nPBTUAXROdxDN)@X{Dg=Iia9n>ZU*zl8geU>x*@KOME2WNP9yOw zlh+wZJwj9Hjwe%RqVZ18``H&i+S1K)-OM6CihNmf-&hm?k3u*UwE``m}ob6-F0YgBfRd|47$zuK88@S9Z zOsU2bb20mYuQ=I7wt1itTWM&q&gC96Dl>Y8z+%9(5M%9^&Olgm>z&K_(7k1A%3fNP za7NygY@<4HrwT6jXSv!Fp8vG%$7E{`1)PpV^?F|PNoRb!t<<%^DfS(A?#87_ULnX2 z!KgKSd?MI*P&6MOx6XpooMQjFmxEPGAbQ29Q)IhyLC`E=Xvy%)w{v`|$aKH+_c=36$V{K4}6WDpQcS4>-cRqZkE zv_%;O`NtQtI|vO{KkzyRj3b}@=oGn$zT(o|k#p$|^#NaBk!|~w!p3u1IUdVscZ4cS z9ugEs1# zvJj;Ri|*|wGo&OM;W2-9yU&~_nSh$z^{e-fpXll2sQujKF=n1rI%ItDbk~6VE+V5I zN1k}}@PZAxcMW!5`I2y3E&dEXtJg503#q~bB4Gqi600>Qv1oXRZI>HyazkRP*X9oG zhJN?*aa^4WS2tnaM&yxWKA}DLjoc!Qwf!?B~KoZqT!d&SAF}dWu{K+ zG3Yg;5gT@+*rddNp>T))hDIRB26c>MGMPejjLq+QKfL$t(k-32l9r9DT0MGg=Hup17UV<{z0vkzqEXWf<_N17@9nr;8Li53)|FJu>J<%CgO4>Zb6^&>;tkIWLy&oBvBkUa5R8jknVm1(g&?P zeMBPu#fuip2nGZ@LlQXMj!5Y=T7GU)0Ev@a#L1*l3C=cp{G8=v7Jv1oXRz7x0j>!A zAUQpS{d-^|@p)rhrhwhK2Ru$7Ucv&~&h2NZKwNKx zC@luC%W^%aur%n1?s7`w(j;1#h`g+Py*^5%2 zt!i($BH~CnMw?;cwH?<1z`>w&9Gsxqv=E%EH>dqIBzFCtZ)W={xohI~I>I}d zNTo7rouO;Z2@rD_!8i_83`L!zumFZ*%ES8DOgb3bf&tW8`!eK2t%t2n{|WT|4Gz_T zKFoo;K<)0Pi`|}ttn0wrARLNo>fKo?dJ!HlJrp`HG9ymj6e+5E5~@hpR2crldUr5N zP8PBVs#*+D+?*s!u>I$HtHofyzzE`&IpGlW!9dKM4C-Dci`6FRjZsZ;6*1dbB#`)!2;WAaQGBK9@r(dubADW$xh4;p?qcn~<)-$N7@c8UL zH&`tTjOqMYBRLid!Ti>YlE2lLQ|%7ve6kc>y&lEm%Jl0q(vl~_#xFlK?MvNht`g(sdj=XD zwb%ac#i#9VIhPY3#bR9q;2Cru<2Y3)2lM3)U7INFq`P1z0~m&YO4n@=?F~%H6ceW95o|h`P zGPN1lG;UXT0U%*VEsDx3?W;UXGrP~!2SO-3E)34HeMuW_rzz~CbC5=d ztezY+gVx21Ma0;%3aEKh}jEn$d9t+N! zb~fHjLG+yxtxk?_FYj?5lIt8RYucYf?X=>q^iy2`W`DB9BreKwi;rcEo@HaGyUZt? zZxzi6kk;15Le}SlSeuTS&YwQfjZ#UwHPN;{8{Z&RdKTav?=;DT+wVJ9R21Jd3$*-| zTLb?IPOssjM~6N^BaoBAQ0AlxdXDNiJuG5vKdxL)F}pm$9tL5spyxW zuj9hGT6C!4%y+0a(MQgRiT+Ybw9yk5#^~2PpQQ4q`(sXTFAlrcw^=R0N>%A{;ZP(L z3FF9U%t={`j2g^zr}VS^l9I^PFqZrIeR>^Eyyin9pNQ_P&DtVE$Q9)dfOPuLS*=;G zj<(y3f1&(qn?zae?HD&fOipJ|HX0CGqqE%ZcMC)Oz3pi)Y%Eir9s3WK2T$^bV36k| z&ry?-KYc9=Xi4Thm69+UsE=T4fvnb71>|sblNvI!o2l_~u;5Uer7GD@W2zVUNl^e~ zuk$x)PD!gzXZ&Enud^!MHe-A84b2KNV)73D9j;%=BXg7JEHCHNzN6GAZ|iVJ{E+d# zfkkg92xHLhQfQ601K;6c$>5$TsqyOmmy3o2kd&920 zdi5~v_=4FfyA6)w7J%d$^KXuuOY#bE<^n~WM)04B*#GsNQyFBJ`41Q8yWVy*pov6g zEwH&^TW>UWlQAD7B+_<^n0NHYoeynnE^PPDDtRUdoyQd@3p9N2$_p zcxc#U-fTSJ9XQ<@kfjp#FEjoRin0>*A3V(!#Hm1<-&NJ%SR=Fm`S7l&d+ZY)7pm_& zIC5Jc36aaGPJ1lMeU!f8>c6*r@PFEoz<`rA&27ZnT|C1>f>q5;+1AGf*=y*f$nKr+ zQq0vN^5$@Xh~T#PyOLY~W_SD#+2hgq)9gx~_a+Zb3M`}eZ@IyS4@0huX-csu=J=oudylrP(fp4}BihZ49 z6q@x?Z@PRYIk@o`@aaE0Z<>4s3M_aFbfHDeTY~?57YA;<5&lh`eP08;Dz!b4LY?HT zffGWogWGPDJ%#&M-s^w0M*FI@1|0*EH{~Kdb$?YGFN)TiY9aJ#7XTZ@+aLe%O`Ak@ z5WM;uL5D8-+ugVPkK|A+O8=#K_E)R0XLmFGm(lIKj((?9<-aIyCFIpCpD{g}1Z&~##WCaO$bhFXxj&IF#@MH^p9UTTlHP?R;UI?r^ zdWdz=|MK(Z*JTDoJmB=UYmQn&<08 zejp#de$!u{&0hu6PPJX3e@n6sev#LiifQKbZvYIuAD;ftRD0==miKR&-={+i z+`5mw7RQ%2A4evFJ)3W(=|O^IHh315^m|nM6g>5tZr+js{;C!*fU|;PZO*c`JFs^7 zU4m^(hQivQt&8Uvr+dUN^!AQAHV*86_T$LPr znP%9=ESRc4=XwaKet(Jd?wjAUyZ6j&jW|!i<@MoSX6ZVn%F6(s_KAdL97H>PISA=_ zdNn)|>y-JQ&31SP{;WaB%^h-2vY-9Hytk?sHddcD@Cln`k2`#($ouIYPNUUHlMV0( zk-|w*Cl=bfR=$`KnE1ZVSVqMcWM^;_s8?09UuvRUDIc`|v zxuQ?psb0DDxVtGAyYw5Q%grD0dEOy+M}{)!3WUP#w;#G(e0fOIw|2k0Wu((+{Dny5 zOX75-@)3#W7N_c&`xB@BSpDT`7Qoa0Ggc?tlO#C}C2u|rEMN5hU8p+xq`%&fra*Ev zLAOvW8#t2kTvAGJHMO;_47K?CD4^HoM40@m8lw!yY?eyukGGM|pu{n45aB?4~iG+O_AM#Tq@*j|B^ zG_3Kyiu6UTbq=&NK6`j6wVUn;D2gBTKa4&j8-G@u_-Nwy@%C9t_oDUT=IjZ9 ze|>+FqCc6Jd80S@DR6}I>bY`^nkn7A*<-ty@)RAMJyB_Nc!F1=PlW`LW_X)Gy9wLV zYq+H{nyTt+M9_J)e$X2%HO%>ejDjL^Ey847!S1x;lFFxzd6enlvgov0|9A*^xtcXr zdARtXfeKwBGm$Sch{~7XZy!_rl7(cltQV)?9ago;oqL@)t>s=Ri7?bEQCX(EJTzI* zuD5-VIhMcs!$P}3K}{N_8~(jU+s_!ZkX&!z^{LpwRpJcrFzNKKeXxUHv}5%J0v?ak z3c&*m6v1ZT!<1G_bRaFYx+4Terg!IxMuPJ=JfxC{>^j%&2d(;o;9W^wvII)1>&1Zn zoL>lm08)mG?sBpKXmj%{m^SCEsP=$X72DHUAZ!n2@&Qi2qrN!fh_mXLe8LR*UcrfD zFk+u39}t%G(ca>EZg|i zsv%kcBt;;Nr#w_{9M2U$jB&1oUm^djc-&$-uRQIzuuc8XV=F;3A!E8dO- ze|vo~&a>$x)6*-{@^j;qh6eMso8U=c!w^Pf4s~jr~ZAN zs>OUglq!>=(BS8cLfJYVHI}kN@U2r8-Y$3c9Z05`_a9B5ZSQTg=(So%Lm16)Kl?i3 zG!Tj^tzzKfrd?~D>}~_4Ih&2Hn#pd8Zw@avxA>9jQovl2t``5*9Fy#&!s~V!VOEYL zyxj{k>2VCLt3_-Ep%H@RMOd^xz|+dOZo2nVJX#^!5clDm$pyQ!xRIc-UmB% zh{f@iME+)wHghKPSc9AO`H>sS8h{$qBD;V1OHy%2oN9~wZI32(j7Elg`hhQO8+ig( zCt$cao9ZG^b2yvaV4V}KJ@*Z`-%Tqj-IUVrzRLiPdV;|w+MRBn-w||o;?rOEvf4Wr zxnZ!UOCnO)tv9Fkna6}3PL|#uaX6yY4PkV5@TDX2X{a=h)lyq-HiVa@T}5%U5efP` zWbWA9+XPHokA1J*=SI?2?2lYo<|b5&`z}2L8>&oy0D}^L3P*O#DYhuzptYakpBp_m`t`XH=$L0O{v$|mKR*wB;4bC%v`tW^{fuj4 zL%+LkTo=Q^-^=X@Sb+cX#L3;asy5DB{;Y#X8bqyqQ^CY>GlvTmUccS)Qg$8aEeiJS zOejsGYM$^ z=DNEd78uww-xsIy?2&B3_uU*SYzMqcx1r|bEXZ8B$cS{AP;WoWb_R5&6?H{3dYVxT zwS9Q>+VdBU%$ysWk=BNIaLvx~_}FOW*pjV1-aZ4Pa>5e*QmHM2mcLQMmne ztL@YASd+;rjB?H904Z}Bz5R0^O4XJzSe!w5;u`mpCC)TX_wm7u-e5c^z72+0B2P6{ zhd&nTiFDe3Oy|?2lbB#v%jZ9>*76l9HPPe*<%aea%~Yp2tmARI;esiW-2;=mHW$}; zF5QuSs8q4ReM(H~BKeYanumLGZM+`#uG#vBA{ztonBc@@SKVPl)D$(59JuP3UIsy( zVr`NvIMVZe$~2AJ8>Rr5AsW|@6x~hD$aLqm0iU0@?U=pV42tA+zu7!p-)!`{K;P&I zhNPmThw{9gP5KjLx4Et+me2HdQzla#ouJyzmWrt=rykh@+7T3{8}n`}rO zJjNP=UyYn<@dAH_r`8j@*8`(zJO!qTcjPQ=)}xK!GIB5z?MB%O4H}9g8W?ky~Kz4~e-or<=f$aAGuv zEDx#FhQEWUJZGVn%e2jphig1Us{$lmGXsNx7$o@uU{}~3H6pDW%kbm9p!HSZ!I(4z%WJG$iEog<;7WI=)Et7O02rqhdg<7B6 z=@Hdow51jKPha2SXj#cDMkc)mAWYwGm7-g0AA|9l{7mvE>Of5J^2iYS)aehdh_O!g zs<{&6&`%+;*GIgRY}MvY5%xwvy>zdLkP-1+gNe)cD&D7`7ra%`{b9G!rcu2~C3gJY z>G^Tnp4WO7-bXZCqG&7pgdBYU(_n4)PLXhVoj%FGRh5Mw2Q5V|?8LZ`$ACo0!Q{m!|LgR#!;)vulWAv4H>cE)V%GDJ90_CD zz=*qrbBM!p-hYM@V1Dwc3cONbu|z96)L6Z#VXdhaMs$zy*GUEbAMm z^XB$IcZAYAH zNtvw*oX<~cJ!}k#)Q6=_F!%+Avlbc9lwTv`bdM5(V#Qxnhi~{x>$cO*M$+4b&SO$N zguf&K+b#5n-M1^RIw^)pD;Op3amhx2hYfRF_jxzXN2#D~`~z_>R97MPkFmXkc51Gf zW3^^r>axpehvxHjy8Ca@Orn^?ulOtHr!k_Et}aOcsfE-F3_8G22A}=Pl;xDt`Nj}Q zG>^gXM}6c1S_7r>`+)>|muBj-ei^d_&(-*?x|)4dhD z|CuaO*Jd_5BDFub6<`ogf8#~t>^ zR~87bGO1{*6^tkpKnCy`Eo=w` zd~B;_kK+*+8~G(Wr_r0gS39DeXv}AO zOFT8YYoHz(-z{k=$T#bn*Ep{dsgJJnn5KluF7!t=w?rcfle<65Y};$NTaGMT?OY!>le_-`9_?bT zaE4Qs&fVj%ho-~mUAV5aA1WTxn#sTzBj?eZZT(1~rPg%{(+2&q)9gbQ#plBJl(IA$ zPN8R`Njw&ZJ#@A@2I5Esq~()pTX5P=|9%(Cpy(x^<$@MVCCV5}u1;mYcjr8nOtKhV z21-d}-)=X!yQ%j)&Q*dkwhEtbG;G$uaF5jhA1~30)Kz>efa|km58ZT9OQ|#EQw5ruKd!u4Fk*Givc?D z>?yl1J6<)V1%;{a_9UmaKES82sEQ}4h}9$~96#13J-F-f|6Pr;mP@jBM1_FMWfqcH zVkKuxr#Dl+XaN$0hfXTzg~sY0vS`cTnC$-pee?80+y--jPQ%)I|CufQ@jm&RplGV1 zxt9~DDb0zXAKwDZUNBmVlARfy@E-eEV>8fDO%GVNqGo8d?JcW^tFtXE+XNmFS*H*P z!47@^mBj|FswB_4KR*W%P~5A}dat4xK$e*W=k6hEplVhdU-b0<;Vs>YjIE#uE1oj> z5<+Vn{X-9nKABz2KumDZw6UP@Sy6sC?Ho^Bxu2|nIcCGR+kM4*k0VFqb0~o_en*BU zY?MfxBAdn1r*^MgoeaLtI-G{m-8eUGUeEi_sveU$vQH@-_9w)AWoiTu(%M2rX_-OT z5_-5?b_xo5<)6g-nh`SB`?lqU04xE*B(PX${Kw!@#}=EtOT)Y?G15T>Q-ieKGPzJ1 zJ)wk25s6(X8~2}%`;3TQ>GwG{1HQ!asi+7&i{=lboLEK1%DI1&kwLR7M)#0PoVcSeQ-!1m_-dE?E7bw+h@`g`Vx*AKWU!ySHbqki`CJWz@ zvCT-d9OAjd6FHTtB;8;A++8uEAB0_uc!LRgnh3+;K8Ke>7**xq2@XBLBpG?#gO>1) z<Md+*W82i`ad_wtsEfQXgcI34T zPaMTF0NUa3-cM1yvJsf~*vl@$?w68PfWx3eB^LgOQK*2Qc2!th>lY9qkeZ+`TWH{R zc{~okKap3tmk_#~Ej?M@c(+HTG>RL5n`4zN_SuF~`#0Z&G14}?tnI)TamqfKjLwtg zhf1p}U{bpd6ZqU4-JxPN%PT-xm9hn+7)mc{UFh7*imlurXvrHFCBV5sxA@^RE>$sQ zpymHZ*jYf;(QFGk2?@c11_^El4esu8aCZqF+}(l&clY2SxckA~-66r z&CIODVsYrxRlBNoRd;Rq>bsdT$?1jom+#q5s2|l}-0en4Ru~T)e7gQ@djao zD!;eqeqk36G8+V2aC^K&hriLk`G%j}MzjhAKF9F#8{vWOBoX+i)nF?Yr}+@g*+4#` z-RQG<-qYXgFXoqzSAs2>?QhHAzW2F^ide=Ni`R|u;yy2C@{Zkpt2k}!9$idUTQC$_ z_Z!3`&`^-!^BjA%)rxLUoWgr81!Bj6_j8q&Z?A%hhceLWPA0Q|%^>Eib5Lj1F=3X5 zuty7$)cb!t1E*kB81z<#kk6K`3fI#U{d#7m*pkA%85k28xxO5|8P%i*cRa>b7r?k* z6MR)aZ}quZ{3M=vMWMk?(DgH!-e2vHMTi#)|n^qy7M3}JxcX6ziJeo?Zbz;JZiPF85AiTwjaTOACLRa^|VCz7z zc$84G7!9&l-k^=s5R9IUb5xx2LaGkWc>F4a`)IQ@V0m!s`jS{QEa*w7NB=wlPd~MZ z=z)Mppm{EP4HXGHW49WkT7z44+^ErDXbxIR&1olK`6VL$HFvSDQ$es*aqfBb zU?jg7{N*^Yq;o)-Nsivz>iT;2_NebA7qjX7n|-$9n2Ny8jS8qJnVH;JYp!2^1P!%` ziM8Ek>L_dXNHQluYm0uf_ZuB6H4-XPSor2D=8uF44R!B;5is6$^`xY3*Ok=2Gj0^; zff!lO8*Ovi=Q>^+6tbJcnI(9;219wzA3nn<@}9>XDb*Jqh)l_!YIWOtvUiuGsWz1# z{UOb10E2LnRv|YoBHnCj*X*Y>4r)+#p!~EKk{xPq*3qvzT9{w*DAlpSArWo zI%&NyI)m3V>`z%G(y&$AwAcWjko>yeKIM1H0gxiwSZ2=Uh+WMb6usgh-;~VZeOfs@ zsYoQF3&4wwx`K98e8*pDcbQWILG#&1G2=lm+mv>HhZ+7kH`hvHH=HZXbo30MnhLSRM0gZhtmINMb+z~R z8ulyB6fd4=wl-bk(wmGv=WkWo^uwXC%45Vz-K8=bWHc?e*h!SB&6`b#qPn9>GNqx> z9|?N=XMDy<9kR_;yt}Ytwo(9{^j&d)G;`U3om)YsI*5w0Q&gIs11^qfxAHxMc$E4S zn0f%;3PM5oV5p1{lizR7TQt*_<^|DJdJ_v;EoQcj*=99mLT7Eck1Qt-gP_%nlhJUc z%E2G!<&JloO6Gc~(MN3y*63?h)6%`#_`UhjR?V!xPPG(m_w-iQdfXN;=nM3x_l|!nI za}Nbkfk<>-T7OKDKRB@@cfRKOi}7Nt?b;9#YvcoT1!D?0TO${o!nB5EknL{7qAuLP zW>uM%O~E+36nlAC?J8*@@?13E<&rmI8PbpKT)Mw7b8oBkrS5Razz+S#r{>8mlsB;& z+28i>o(?eF->u!GAk2rPTxs9cA1V*zsENQHw5|wAq2A)V7Yvf`5s?UU z>_+1i)n2#my^}hVJxjje7;IJ;@4hX~;C8%{y-lQe&TDWQc0`pEL{7H29ZZD@_ULAv zZZD2%MWXZw4SGjYK!GP)^|(JNb?XHbX?-YGwN2xs%SS6)g&Hz0j=8E*#ei0u3#_8MO4=EJAw3$uScMO7Gu! z;4}ryx-zA1?5|u5*I-2IM?J0sVa&i(*++3j8JRd;>AT{6eHchw=st;ZiBEjKQ(?5s%2j+9Dg-ZP?ATLt09 zH{XMy#~D*jV~rc8wT?m}1y%)ejF4iN0QAMM#Y*j9T2#y8t5eFc7Q-2j&2U_da(Y&) z6}{h)*@quP6FjXWGTCYF7ya_xGqa2j{7q4pyYuRIF9@(;I1OA0LTI0Z$3(n0cCsh( z&B8*{nTz^U>cZxmRzb@9ST7x3a-(iXtyj(`ps^5tsP5{*gc5^enE8HDswk6}vd>~+ zgv^p&Nc**QP_=ZvW?d@d{0AnB#h83_bOQTyew}zK8D^*MgCWNdu5I@Cy9%Q zQfb|>VvL+TG808e|3KGWP>$qF^QAFv6WlwU*snO8E;~WDdY6$vn0yDB^p;?Lw!g7m zu7k;lI)!f1)Qs9#g}H7HB141^cz>T_N^VLCB4^5o&RAiz-lB;hU?w%;&gJ}6$$r)M z7(#mZr9Ee99nmFo0r8KO{p-mv?nr2BS=Wn=oeV@bWM`}jApro~6SLM$p zQ;fH*R5NAneNN*6?-U<(1fF20di+OS?E@&C8QyO+!FRz}=RcBcU_GU`kDyAR;&d^6{0HpkiBy(@?Zd)Bvr-u=#Ut;Ter z_)QO!vK1P$09h5dLuv71sp_XYY*U&*8VH%F1oyKYM-}@!)1)%gO$c&eu&mTR;__k2 zOfvxYNo8M|FL@L*%F&f^qu5i9pw$?;h5T4oT^6;JN+VV8uE_r8|IMjiSf(OO=gZ3YiSPtSwyknSMrLs`tml44l#~1VGWCiT_qOoJ(<&7_?Xe<4u zvWMoTA`tF0cB9K(z9pVW8AxsW9}yTQr>Hh*OP4RY08_7&zU>b>mC~>M31!8U8dvc4 zYFAk@3xp%oluYOh(-1SNx1nBWIb#pW`q!|#$;%!z5e$vGYQ%5DQFHsufdl~e_J|xW zI5&DB#TUe zGF}f-){g0{JMA>Hw0=8dwdA*qqa?b3Gk>1f7HmH|)*=Kob<-SUX}ux{tF2TB`0si; z##RpH>ObM*$bdolNVwekAf4lt20uD#Od;7;L}H(PIGk#$P8ExVW|3T3XM_2NcN0%2 zfPG7<1B)ju*5&$C2ZO^7YJk(!Oq)bzV)8c6mD|DU2siCh){fD{P z84bD9|J^kSAL<}}?b{B2L`prC#z9^h$Z}vX6C9arYTyFPBA7i6@iSqTyx_o!EESky z8UFKpEsjiDga0q6Mq>8_gt><8Fa8{Rq*>a6`ZlW(s8nq62h^Y!fpN3F9iY`Lw@It- zTEuLPj%LAFZ|+^(1=FnPZFbZg za5!)b+?Z>P{NBJ{3Eq3NWwtJ492I_O+&QG=+^;lREX88iqZ~jV@JFen1&$_(05We3 z78}#mF4rwKM%Uqxsw{4=DU>Vm?a;*|#Ze~e!93e7ExJVn!r%M}kmn6wr`SQV0_ z7c_6mzUxJCD7wK0Om7Fg>huk?H=AX&xLey-YnmjvWwQV#q1D8Vex6B-gK^I z*TiC;Dl6HON&It$uF>P$cvU~Z6s|W{d@N5ZD|*Z8kbul(OGE|Q`N;;8c+A_8;!2X& zfx&`2{E1PG?0BWAHkX#RHD2RY zXNM6rXhV)7SLRnZp@8341J{V|X)1)u(TB z*~B65L=TzVkk*2HqGK`JNxUqi2xgC+vqEuItb3m6WzsdEkRpYhim_jPS8lRWyXu5? z=?ahVETA=L?|SM>rB3B)RWFKAYqlft;9iqp&%;7p_?Y`{IM>^oR;M{^ni?@%r?Uf# zrJ1h_e7 z$c{I5@cW_2V!XJCtk&Jr@L)gDxxbhtEIpOOnQ->p#;E-4((H{YO`_vFCs2=dnIsJ{* z(a!2{qNTs=A5(;Y<)sM$S)kBZv$Qj8x;r|i^^(Z7(>r->LC$^ar$)MTc4Z5W^uTZK zomAhoDvBQ>2oSJiRL|><=R!+c0<&DQw06ew8JrGRBI$6Pg#F9gWDzJ9;Qe9}OV>f|h%$+xRSsEuU< z!-36!m~J@26f8{9h*YA~NnQDBIjf7~`F1PFas(|?_jsNl?{7E|>pa6!sv1X&4=>c$ z9QSPo{^}r#6s8(1H#`33AN1g`=xYLAf$f<~xySPmfWETR(=-Y^DDFX9D!~Kcr#D%x z0H1*Wy43Q}rS;M3-CpfMu>ISS4kl$SB?@gUSX8pM32T*s{KuHC_y_|$Z3lxgu*~eI zo`V3jt3$J3T@QGZ(v^;7CTGxyEe~_)bDpD9G@4qy$0epK0bHxZ!Qr3T%0bUd)1#2HbCrj(ia0Pn4KL)ajz)nHIAa3!RlmqfN6zu zfwKgCY3{9e?cg?;-Q#@4%cOWs1Mj zbx}sCY!Z$#79^5+WEnj*2t^znT88Z`+~d$cUL|P`q*dXdKEW7aI|yC7Wda1V6d1Zd z(xa90Uf@NG!Eg^%YG)Q>bMSqviuMRXtsno5uvnsV>U+lsg+Tvc#qCcgLBVsaho}*_ z+WtVg_gd8!Pc(xq?hqCq@(P%zn^&LS1VEz{PQh}(-}LEakdGy85(z;Ex{}GjwEKlj zieVjaI=u{Jqp8@Z*BJ5;Ph`NbGad~idTg45q(wtJ3{99%8i(dc$~ron_BP%cM0K;Z zERy9^jPy!p_<3rwe%i0CIT^kQW}(=db8KO=Uj86t;u+}sA;w_p=h2B&njF9%3C$V& zl!hsmczG^H1OWSL&9|FwOd@CjCz4PwRX8%8nOc`DG67mIBLDmSIVi4DW6Ot=#~+UR zny}=$ktQ=4*>4M{WO4%|0Z&dxZ!i3#n^W~;LZQ;&f{DcYVd~XZl^`sl=KH5chvPtb zMGO-8X0^4QiRYRKG+H1$IR`cQ*au->MXBOkD*y@&c5RwbiWq%sN| ze%oN9c+@06NNXil06HgYz|$_(eSU*pG}FCeuq}5TTKRcZ0#948Xou z*K9*Pu2iVe@gReYX8E5Aexr(vtc)3!$%q4-t19BO%DgjQgYID%Sqy%J{~b8gUxh*B zbkSGIhq&vc;d4_8L`EW~US*0b4+M-CY2t7wA-_V+$A0`O-L?CO8C56lW;mRN4+_EX zwfCD*d6IE{& zrK>Eyf6EnJmp}qif%GZLXCrZWh$;Ysk=n4UC4z3e|BPXtlApxTPlSNqwCV#E^3s{D z5-OH`0|n!chIgS|)nwtPd8d;+pb^K*vXq8AGiA|6vyv^=C&#v=@!E;=0&3N=Q~>`O zlI!3YTOh|_%9St=z^8|mKd8j#(Wo`1_|r6+mYLp=#A_(1P_b=@4?tVQ9{*RU?|+BV zKJmV4yq?I-3Oz$F(*NyRh`{GFD%*{vh)D^a-0Jh9jb0`OI>& zt5sDZOI+wzqe99o=gm+4E%~18j~0s!VpnNzq;@5AlZC`079S*0dujzH5y|ppX{)?C zF;wTW@lk6j1Ub*s{dH_(zRK@yu(kPL4(J(=>XKP;3-zaQc#Cvwax-5)61)is z{NElk(M?Yl4tumD3Qhx5v6nbM-UL}Dc%HZHPSr#fcf;fZIle7j>aX`_tmF0>qhI>+i) zS~!|tpI9wctjahoY1EoK3qDJvET^!P1emO?^bP1W*$;?EC# zfOX6PTZ$vX)2xT-8hwXpRky}F_+eOjc+JOK6Ft4-~jwv7hI~Xw|S?n zz7m>BZE1m|x44ZgCm#R87x5>oX z;ZPANOZ?aIt&X{Vw(Pwz$_2mIHXI>NzL*aIQxt-(QbtGvi{?7oUv-uR9skT2gTs{h06P507+nJ*Ss{evlja%Q}}y1@cF3Li4{;^!vR! z7MaZtw^!`VsIiY~i~PARC1OY4)7>`|>J&wDV>c1#&X}4(qRjmQi>!SHS-;)KU8dH~ zN7XgJ_piWZkR{(BNToNlal71%A&$&DH$RF$KVgrkt%&VpKl}fSCj_SK`2t;u;yh8a z&o;c4M=h1|QRI1a#g!i{?;w9e<7)`oPO~53*be(*h}g7bA`;Y=`Lk8ioD~ z37cAFpC{pI+8^)KeD0H6o6B6!qm&> zn388ju?hEP%%k3|79)-Aiw&O(@}lWU+;z{#bcSDWD8=`90_52@U8x5 zIQxU=E2|N7sx0^|TL_yRp6YctzwZEwPKcrkcZ4f(wk7;8s)UUU%kuj;iNQ%-PCxE7p_0;f1v;RYJQ|I zAC93-IF)Ze7t8Ao3xhqthm14+i0v%T5I`-N;As_O{LwhZh|1V__!0(piB}spj>DQG z_FZW59*e29Lwh7Owtaut6UfbpY3&i#swx>tF91%vLue-(K0?cOHTtI@=A&1=@051X zVjO)i69(HI9!z1ez>g_f%kUr;Br<Q82 z-E{kQcg!;C^->GT8$EZW0w)&v{XNj2N`KwzVT>9>Hqqh4;MsgkGOO5q(y3zZzNVt# zLlSEYNYdDSNZA|`Bb{0|kngx?w7w;KfK?$V_hZJIZk!kk_5z;Hy4s8oh+nI1XumpK zHc@xlo%?DU+7a{ieXrm@lMPOmQ20M~EX>~J(_-^9w@OpylA9}H4vXz&_beNAy=}4B zBbJWO+Po-h1s{6}8I3;O7lsn*L<4TW{%bC;1OVk61(;Um8t=Ae4!IbQI!z}G=9oXs z75X&KSHw$$bML)`B~nKEXz;jhv%*PpbwO6AZyXm7dq5E|7z&Nq)AKq?;9ZRkH%nuhIbY^$)U5~e>Urcd(Ac#Sc z)T(%gb=fwTLf(*h!hEwodAdiA8U0-sA#iT>YuBbx=Kg3p1_e&csE|#`_6&|}Er3lzu`Dt2vjgqy8yF^O+1j#9JI*Da$qbS6}Z_>NP zlpzu6>?Cv~C1X=at3n^iV~tuq?^5mZ8CGjGd5I+qWHC|%TU04T9}edF>eu_hO@)`s8M@N z#N~7tfAV>@($um)ojNdl6o^rjaC-LOU*Xr-%>|<_tkY^&Xqc&b!*3^wW($W?(O|dw zZc|j+O(#}5bvl8QDH4|IsTsEoa%m+J7jRZ5daQ;b*PlT*b!Ou*tA|poZ^pl6Z8Xv6yzp98=yS2oR4e&-MgAmBIvMb0sJ&IF$gT$NiL>0`0JdCexYVlNLM(T7!VXn$b?xEKOg&5 zB4Ox*;phsK0>tVq7=}H)HKD%3U_fjVvmZiI0Fq4Us`NTGy|uiD3yyTy(73{5 z{|E%+2pt?TDunb#Lpv6cWMI5q2ZzTg^&6c|pexipa>cN?YJK3yEr_Gm9;#hD>qMkf z`}T&{91JqM*kKP;1#wOQ2SnAVuv*^AU*R`W5Fj2?SVm*WNS^FJ?{*Z5*KL5&OAAA> zna#=HMm|zW@2e(eEOX9Hi7X((_vDH!TAlST)wnpno%Jr+7>K^~+0VOF`y*vAgW#2o zL$p~ur}%aqws_`|wRjpkL(6$JdeS7z?wG7uJYCpS{xT_;SQdLeYD8x{{w@e*9dvwz zBks=S(8d0N^HEWqF+Vf>*gp>|EH#qR5k=g;mfdm8dV55OD1NaEtUXp5*RI^_&aE@_ zb=rJWx;=&^n(T9)b4`$@w(ZRhtfGu6A!xvF8uxaLj2hooD#90Cy0k<2lrztCxuR}% zT%`9Bq|)3irPxI}sP-PCnB&lvNc?BE&&uaG2l=VBdlvenv*#hkq^?A2vY2%$)x^o4Qm0n6+CvCc zRm!xj6%45jP&=nZ?!(F)(RLWx7&P$DhebyvFndR8*8j*x`&ashP}{IAkwd#y4MUom zMv{=!UwqI{r-gf8W_z6CE3Cx^4~g5UuHe#JH= zBFWqNgXEaL^8h}d_HIA1NBbJ;Ez%;p52t$&sffm=%vOY~8wMuRn39I{iECIq_9;pi zdly{+IH|&an`I5*I6UpAV}o2`9KhxwvXUR`k}bN7{gri^EbKzc+;aEsGFP)w2D~p|@>&0Wf$7}&Vi`ixIlQn0AG-W^>bwl7Fw|bVLCw+YN-~Ja+IhzDa)F$vW14pBkpB;60=Us`w>Pu;`Au;48NP; z9ywq9){N6!_{Gaf9mVnsYBG+!5K`8d;;3N6UcG3S+EV+j@%10}lA*Oh_n(?moTMVn z??cnkY%?3TK)Dt%{sF~{!86Xymo*sIyvz^B?doqrv&Q)JMSt>~`9(Hww*ZNybNLJ< zr1@g2L_K-)PZpPnWKa{CEMxC7I!1|cn%-2JNKq)GK1j*4T4kQ z?-kdgUq;ru7w?^BMd_p8+P#;Vs1d7Tj zhxF{X!N4ol3n5J#^h2{cYSq$#C_Mwx2Y9vUH@6Bd^?CmA1UmY?5#jN8r-uU>ag;F& zR@yk%&5rkxj3z7k0D~4)CBFrRJXT4e#0*qS&q1+2<4MwBw;7jE#!}roj_B~U(P4hO za__vx?mnUw@UzG;=E~BPv6z#du6IX|ew(>-xTOMuaTA(f&n9Yd*o)6If(*L{SnLkw zDWtV67ldBL6fwSEX?iXv1jT6irw%v3CmxzHY7;3pI>1tDP?Y(< zRmAw`@choi0diSW3yv0AWHqYyLGn4m{`Xz<;6$=Ko^PCuQkgB{8Z6d?LV=O7GI%=I zoG^rr(GEv5vNP6Pgo7sGG5Sd+W(^LzaB1jU;A50YkbH4p46CWuK0?*)eQXTKU4IvT zc06U8S`8E0*~7BVrr%@&GHcUtaqnoVl=r=vt2~huoYuB4e)1Mq+X0`~;shbN$)RQLqK_0LX*=9FpO1NyEgNQgP zO%hXBsK8-~+3x$q%GFXnnlKnV^P?rLt*s6|B=RG;^VK*FPKQY9uf-ylo4iGJTNjUm zdIEI{m6h!}U3=<^?~SX99}evIWhQH-;rru=N|q0K-gYUId2vgQJOH+>pbv^GN0<5h zlOW(#JibJ;uJau!XPU(;WIqAi0lGBH{kL`B04pfC>?oa7WeCe@5um~wK4r^pb_K`U z5H-AVPK80`v-(IGrY1Mf*nO%UX|c|<$Ls(k$@<6%c|Eyi9+KN_VCE?VRI0rTN}4n& zvU#wXfJocd7n7dWp7M|%&k?k@y2absv;_yRMl+n<*A!i`1IMgv9^GO?XB0K z%D!FpYWrM;zIa7;z^@6#S6198mYJ=-qf@)~!uJvH8Hn#fNgR>uLNLi|5pX!5JxIh` zd9@FdYLGTB7H>m8Gsz<2avLuDXN!b?1chKmLtmN=%`7tizGhlrN?ULH1Gx3PZR=#L-dR1^uj$-Z`$SvNbn>kUDdbi3ZsFRMYsHZ3sR zxL-fmrV$%CV7HX8dca#n{XPi)pnMGQG%3)AZ3^Vgg~`_#rA zFyCX4h(DH#;!PjHM*uGzk5yjrPP!p9_+;K5a|5K7)^kyTI8p0NA3Y1}%?lb?&DMDG;YTQN_5Mefe$4Pe8_SKrjiORCjKPPfT@4q0gUF&sTJ3%<_@(NGg& zfyNj|DGz%3{$uGsu>~hcC^q&Gzre`;3w8KtVo-B4qP*l;Ztx+>#n-!S^I1LHZZk^l z%I{NOU$iY#%y8^fC!Zf`m6~>P#xS`X9}h32me)U??Z2x%?AP_`B>sv?>X~9Fo~bDf zw=rmH{m`grW58~AkUP{9u91$DK%paUM*J>xCC&N%7a0iz=D}DWOoSG>*Kz zSh`w%B9%4RYLC8TvL@eB6h(xK0RkbQDscZe0zyDG$^0>>is9e_U5f7U_i=g8sqDbG zhPMYzvN)d+b}(UBn61!M^l_+a+0Pd_JgiCPFSu9G;C}^#2w&i$fx;q1R5BbmAk+95 z>t`kFI()F+vt&2+HV`%zC;!v#uv#Le?reyw>+`G`Usr4!yd2UNR)Er-N^-gnoju)FLeX}oDG^KYBBwo9#NJo9uJed>5A z6prb8blAkXaDlzdFSoiGCGb= zHY_0BBYb5}8Jl@0-7+=>Yl`r^RXY~ZKP~iaPj-Y=mXmi@^91dvDX>l?yjub*7G5~wlq?V$NV{xb5*QnllPym7(UyPZJk>%RN1o)e!TcBvaV|P z1=0iIp@NA8o*);Ge}4I2TpX8y*Z3H7Hj9of?bZOWqP?z3ar_bDh_5nQ2XV(!(4I}4 zfi-P4$58<^1eRLWcm2;3kbb|_Y=`oHHXt3563WanuK?vHNt|FInz`=>vejX!{`+Hw>nos}&l97_|Awj{Mec!-+d=K2g$ewh50U@#)sqM0Z)2Oc4GG+6 ze`y+_Pr1Ms!NhV~Ja)LhUfzy+5kNcoOJtMsA7Bn(i}$Y|Zsp&yDL-(t|1)Lp-`CsD zrGUb>Z}-lY{@ya^mvGt{(2n@A|Lqj}?=Sx3`z_jYm(dpZ5C6r#>wX}BmD@S<_8%7d zt7s2(K);-=Hm-1M{td)m)@k-_)Zj^UFAO7~8oxc@t|%7+l>){~t7Gl>8E@cMfCT7PE3HhACh6~{z~nMYFj1Z&l+6K>aG31+z#_w zBVHjo|8-D+5KuzkcHJ*MWPiUM85_9W|10YL-)raJ0mdBFO{Ez8PebZ|b&#wu(68hj z-2;Cw{Y34za2P1me=ogFm*lr_>pd#}m)q%o-yVig_g9qwx`y<3*SzlA`upw3VSvW9 ze>tJ~n@YTZeNgh zJd*>JKWB18ivMj;Pdw0mFJKS|H`iZFFAxWYyZ|OMknG>m{PVX9?e9fGOGhQ+{oi_> zUky-4Nws=7T&TZYZae?2Pusg@XIlTgF8z;_IXd10E$f)t{Q2pxmouP#>&sir=z{;! z&wmUKGV5<;W-Wsk`zv1U9~b{`m)n@c0MSj3Vr<*~ zQR#n4G71NXo)J&oZTr{7m75w+Mpu>6_q~4~vmq2fw&W&5T>8IN{{NG$O7gdC*9*2A zf0a!y7MLh{=Z!W>f4w~V^0(-Ip?!*fdC&p}-u<3Ou!@O(et*2_{`=c58NZd8TU$B< z{;#6{KQy8Z>h-JeZAV1J#V)#|DkLmGxQpi;agNk~X9hmgSk)txBKzw=FP2gWMgbMGvKfMS&{ z^Zw+KAh6@lrz|(r>!aJyG){6~({R#Ya#W5rCi>5a(Xa6Zfw2wz@@vaGpe?rRQ-`3| zmfrfK>d$h;Kc}w?!pjkPd?*TpLnnI;V1@7rJ*(!sInvMI^b{qNO$YTxWJbXmNlJ9y zIc~gx(E-p})S-OZlsK#w2}=$35=FDv67@E}o_v_R&uEv_u8;UA40>dvZ%*|ktH>@v zjsqJirkm73u4gOHI`DX@aDGaJ?-gwC9gin*O~eh>S^pu9O9Jfo`7cj6UcY{b*Ih$x zuJA-(a|Xs5o)WpWL(0>7C6kiG3u7vsR*jx*oM}F~dWoxpfEcsv3YK_54h= zFoxvDF6@Pb&r55`b(wHkgxLppnR2%^@j!w%CufV++aSG;wHPW%Ee@x{Qd})I0EGp< zEQ^qbBAYFJq;*Egiogbi2!~=!yK_4peqc3gzBuN=NXr>KxnAto)L!6@Ck%x@0N4-; zWHQO*V{Zf;Vuzr;lt?#9?fLn?d7SNzP%U!@&5h#Av%{qfpvp zSxu&}r)c`;CCB;~K9Z|QuZ+%6Neu4&W3L<^GaBc1WSaxAc9&LUS4?qavPHb$2)@YS z#t0_L@x!TX;_Jg?ma0($7O)C?tMn@KsNwI!Xb>AOFZ^o_PfsAIpHhW6Q;AA7#@^nh z8Q_iqpsv{-UBG5!)(_49A>U`L;XF}12f9p8Q)_p+t^vWNsj2x!-@jl$+Ca4K+mBF$ z{nA8TH_AD3AL~Ek!G1oA@vjrHMcIlDlMw5dzGpFeKg7qfcYZOz^ZX*2=NfIP>WGen zZ-?qolPwx>e=fK#J^6`k1X^-|B=au-+lNY#BFv?@ZRP!w%)K1J&T7%l(W)YV-~7Pk z)AgN!09-dhAQAB@c%zqw+-Rl4InQf(FKbVk&NqSlHrs!y2UZ(Mt|Mw$!Kaek@_dvLHW zdxl}-j*dU<&J(3wSY95$YtstuOjt{Olj^F$nq^9>E;_#mpgltS*4*ps9QjLh<@LUg zC53~nh2VMd`Q>j{_!#1v@6I)5u7CbvtGd{BC1))_>>(-z0^nNsX%%E+?;Hae1ujKUwSs_6HUF|T__B9Bz4+GQ)nVzz9Kbni)obQM4b79 z)CY6_`oimEDPVBZ4_uXJw4O524Au_DrJPX2t4D7f@*B(Beer>1OWJg?GFY3!20aw| z4hf&eKx`yVqbwnMoCI2;k`z`bZT&XmOR6=`kH=eh%*~tASiohD3w~n|RKB;jHWDC+ zxk`;YFpIeI?lmf><335ztaYrgt&Xod_zU2*RnM2kz7=jqbylkr9Bx56tb%rDUXFm% zZoK~RaS+2Q=33M#sx*DEqhsDc&tY?q<#scXDdvS0lkIxj>U=@{`RV*cK_dI>kzLu; z7Mvw7%v4jxPO-?rP!wXdBG9TQU}v#Ba{S!0xA%2x zKK!~j(<>pZJ5@5dqj00`lu4n)LjJ>@jCCrJ*zMbyGj&jV`wXe9FtvugR z8T05}(^)-c*idcn#e1lSlmKQzC&>L}lFkZAm_xvr5x+T{w#NsaqZ&Arj_k4S@I{Ws zg9p<{;ot*Xc^2W!#AHnceRU)yr)lQ$?ElK7<7`ii7)_b=Hyt@B2XtU6?KR z+5|-5-LZlat&h(hyW{TP5WJm{G0eha*|=%~I*(fI(*nbnt{Y#Mol}st{|6VStxC3S zbyYWiROe%fj=PX(82-mY4YtlS=9p{V@{FvJ0>{#yI{Q_}OGG#3)h9jj7CGPU?iMaL zG2mYxtL}dvGeY#IEn~rZoh4~vIyoIu!6%fW)*o9t1hw#eLQ;o zxa|G}_}M3r7t7Qx^QOLQ=zNW6^YxFQ$!tXXo*^mTU6DTqBIS&n-|9kHwVWp!Uc5|@ zGL03FAq_UV-Mfq-6~ImA@+{7k%DC`Bx(3`X(c2FZ!ou_dek^srkh29N_fIxvm<20{ zQpVP3!+2M_B*@+^2@8az1<^r*ro?AA+kP3S@Wj(fON=9xV6bHb!fHFTdhIAX=9M`j zKy-1hHM;3jI>=u*GJDFV&EX4#;ly&yY*No|+ypD$_})r}7=lUVJ8qnCHDp^?s2b | MAX integer, such as `9223372036854775807` | `80` -`server.cpu_profile.interval` | The period of time after which the [high-water mark](#high-water-mark-threshold) resets to the baseline value. | `5m0s` (5 minutes) | `1m40s` (100 seconds) -`server.cpu_profile.duration` | The length of time a CPU profile is taken. | `10s` (10 seconds) | `1s` or `2s` -`server.cpu_profile.total_dump_size_limit` | Maximum combined disk size for preserving CPU profiles. | `128 MiB` (128 Mebibytes) | - -### Enabling automatic CPU profile capture - -To enable automatic CPU profile capture, you must [set]({% link {{ page.version.version }}/set-cluster-setting.md %}) `server.cpu_profile.cpu_usage_combined_threshold` to a value between `0` and `100`. Preferably, use the [recommended value](#recommended-values). - -### Recommended values +Cluster Setting | Description | Default Value +----------------|-------------|--------------- +`server.cpu_profile.cpu_usage_combined_threshold` | The baseline threshold of CPU usage at which a CPU profile is taken from a node. This value is a percentage.
    • If a value of `0` is set, a profile is taken every time the `server.cpu_profile.interval` has passed or the provided usage is increasing.
    • If a value greater than `0` and less than or equal to `100` is set, the profiler is enabled (default)
    • If a value greater than `100` is set, the profiler is disabled.
    | `65` +`server.cpu_profile.interval` | The period of time after which the [high-water mark](#high-water-mark-threshold) resets to the baseline value. | `20m0s` (20 minutes) +`server.cpu_profile.duration` | The length of time a CPU profile is taken. | `10s` (10 seconds) +`server.cpu_profile.total_dump_size_limit` | Maximum combined disk size for preserving CPU profiles. | `128 MiB` (128 Mebibytes) -- Set `server.cpu_profile.cpu_usage_combined_threshold` to `80` for 80%. -- Set `server.cpu_profile.duration` to a lower value, for example `1s` or `2s`. This minimizes the impact of [overhead](#overhead) on your cluster compared to the current default value. -- Set `server.cpu_profile.interval` to a lower value, for example `1m40s` (1 minute 40 seconds). - -### High-water mark threshold +## High-water mark threshold The Automatic CPU Profiler runs asynchronously in the background. After every second, the Automatic CPU Profiler checks if the CPU usage exceeds the high-water mark threshold. If so, it captures a CPU profile. If a profile capture is already in progress, a second profile is not taken. -The Automatic CPU Profiler uses the configuration options to determine the high-water mark threshold. For example, with `duration` set to `2s` , `interval` set to `1m40s`, and `cpu_usage_combined_threshold` set to `80`: +The Automatic CPU Profiler uses the configuration options to determine the high-water mark threshold. For example, with `duration` set to `10s` , `interval` set to `20m0s`, and `cpu_usage_combined_threshold` set to `65`: -- At `time0` the CPU usage polled is 82 percent which exceeds the baseline threshold of `80`, so a `2s` profile is captured and the high-water mark threshold becomes `82`. -- After the `2s` profile capture, the Automatic CPU Profiler continues to check every second if the CPU usage now exceeds `82` percent. -- At `time1` the CPU usage polled is 85 percent, another profile is taken for `2s` and the high-water mark threshold becomes `85`. -- At `time2`, the `1m40s` interval after `time0`, the high-water mark threshold is reset to the baseline threshold of `80`. -- The Automatic CPU Profiler continues its every second polling and captures profiles when CPU usage exceeds the high-water mark threshold beginning at the `80` percent baseline. +- At `time0` the CPU usage polled is `70` percent. This exceeds the baseline threshold of `65`, so a `10s` profile is captured and the high-water mark threshold becomes `70`. +- After the `10s` profile capture, the Automatic CPU Profiler continues to check every second if the CPU usage now exceeds `70` percent. +- At `time1` the CPU usage polled is `80` percent, another profile is taken for `10s`, and the high-water mark threshold becomes `80`. +- At `time2`, the `20m0s` interval after `time0`, the high-water mark threshold is reset to the baseline threshold of `65`. +- The Automatic CPU Profiler continues to poll every second, and captures a profile whenever CPU usage exceeds the high-water mark threshold. ## Accessing CPU profiles @@ -55,19 +41,7 @@ The Automatic CPU Profiler uses the configuration options to determine the high- Enabling the automatic CPU profile capture on a cluster will add overhead to the cluster in the form of potential increases in latency and CPU usage. -{{site.data.alerts.callout_info}} -The decision to enable this feature should be done when advised by the [Cockroach Labs support team]({% link {{ page.version.version }}/support-resources.md %}). -{{site.data.alerts.end}} - - Monitor the following metrics: - [P99 latency]({% link {{ page.version.version }}/ui-sql-dashboard.md %}#service-latency-sql-99th-percentile) - P50 latency by creating a [custom chart]({% link {{ page.version.version }}/ui-custom-chart-debug-page.md %}) for the `sql.exec.latency-p50` metric - [CPU usage]({% link {{ page.version.version }}/ui-hardware-dashboard.md %}#cpu-percent) -- We anticipate a sub-10% regression on these foreground latency metrics. This overhead to your cluster may be deemed acceptable in order to collect CPU profiles that are necessary to troubleshoot problems in your cluster. Please consult with Cockroach Labs Support. -- Overhead only occurs during profile capture, not when it is idle. If the cluster can tolerate a `server.cpu_profile.duration` (for example, 1 second) increase in latency to capture the CPU profile, consider enabling the Automatic CPU Profiler. - -{{site.data.alerts.callout_danger}} -Do not have the Automatic CPU Profiler enabled by default. - -If you enabled the Automatic CPU Profiler and then notice unacceptable overhead to your cluster, we recommend you immediately disable the Automatic CPU Profiler. -{{site.data.alerts.end}} From df17963ae18ffd68c8f8e26467f1a077c16e8657 Mon Sep 17 00:00:00 2001 From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com> Date: Tue, 30 Apr 2024 14:55:16 -0400 Subject: [PATCH 22/34] Add docs for session/cluster/table cdc filtering for row-level ttl v23.2 & v24.1 (#18496) --- .../releases/v24.1/v24.1.0-alpha.1.md | 2 +- .../releases/v24.1/v24.1.0-alpha.4.md | 20 +++++++------- .../v23.2/cdc/disable-replication-ttl.md | 1 + .../_includes/v23.2/misc/session-vars.md | 1 + .../v24.1/cdc/disable-replication-ttl.md | 26 +++++++++++++++++++ .../_includes/v24.1/misc/session-vars.md | 1 + src/current/v23.2/changefeed-messages.md | 26 +++++++++++++++++++ src/current/v23.2/row-level-ttl.md | 4 ++- src/current/v24.1/changefeed-messages.md | 26 +++++++++++++++++++ src/current/v24.1/create-changefeed.md | 7 +++++ src/current/v24.1/row-level-ttl.md | 7 ++++- 11 files changed, 108 insertions(+), 13 deletions(-) create mode 100644 src/current/_includes/v23.2/cdc/disable-replication-ttl.md create mode 100644 src/current/_includes/v24.1/cdc/disable-replication-ttl.md diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md index 0a81af5176b..2ef2e4e9721 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md @@ -64,7 +64,7 @@ Release Date: March 7, 2024 - `OUT` and `INOUT` parameter classes are now supported in [user-defined functions]({% link v23.2/user-defined-functions.md %}). [#118610][#118610] - Out-of-process SQL servers will now start exporting a new `sql.aggregated_livebytes` [metric]({% link v23.2/metrics.md %}). This metric gets updated once every 60 seconds by default, and its update interval can be configured via the `tenant_global_metrics_exporter_interval` [cluster setting]({% link v23.2/cluster-settings.md %}). [#119140][#119140] - Added support for index hints with [`INSERT`]({% link v23.2/insert.md %}) and [`UPSERT`]({% link v23.2/upsert.md %}) statements. This allows `INSERT ... ON CONFLICT` and `UPSERT` queries to use index hints in the same way they are already supported for [`UPDATE`]({% link v23.2/update.md %}) and [`DELETE`]({% link v23.2/delete.md %}) statements. [#119104][#119104] -- Added a new `ttl_disable_changefeed_replication` table storage parameter that can be used to disable changefeed replication for [row-level TTL]({% link v23.2/row-level-ttl.md %}) on a per-table basis. [#119611][#119611] +- Added a new [`ttl_disable_changefeed_replication`]({% link v24.1/row-level-ttl.md %}#filter-changefeeds-for-tables-using-row-level-ttl) table storage parameter that can be used to disable changefeed replication for [row-level TTL]({% link v23.2/row-level-ttl.md %}) on a per-table basis. [#119611][#119611]

    Operational changes

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md index ece44ea0cf8..bfea86439dc 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md @@ -10,15 +10,15 @@ Release Date: March 25, 2024

    General changes

    -- The following [metrics](../v24.1/metrics.html) were added for observability of per-store disk events: - - `storage.disk.read.count` - - `storage.disk.read.bytes` - - `storage.disk.read.time` - - `storage.disk.write.count` - - `storage.disk.write.bytes` - - `storage.disk.write.time` - - `storage.disk.io.time` - - `storage.disk.weightedio.time` +- The following [metrics](../v24.1/metrics.html) were added for observability of per-store disk events: + - `storage.disk.read.count` + - `storage.disk.read.bytes` + - `storage.disk.read.time` + - `storage.disk.write.count` + - `storage.disk.write.bytes` + - `storage.disk.write.time` + - `storage.disk.io.time` + - `storage.disk.weightedio.time` - `storage.disk.iopsinprogress` The metrics match the definitions of the `sys.host.disk.*` system metrics. [#119885][#119885] @@ -27,7 +27,7 @@ Release Date: March 25, 2024 - `server.controller.default_target_cluster` can now be set to any virtual cluster name by default, including a virtual cluster yet to be created or have service started. [#120080][#120080] - The [`READ COMMITTED`](../v24.1/read-committed.html) isolation level now requires the cluster to have a valid enterprise license. [#120154][#120154] -- The new boolean changefeed option `ignore_disable_changefeed_replication`, when set to `true`, prevents the changefeed from filtering events even if CDC filtering is configured via the `disable_changefeed_replication` [session variable](../v24.1/session-variables.html), `sql.ttl.changefeed_replication.disabled` [cluster setting](../v24.1/cluster-settings.html), or the `ttl_disable_changefeed_replication` [table storage parameter](../v24.1/alter-table.html#table-storage-parameters). [#120255][#120255] +- The new boolean changefeed option [`ignore_disable_changefeed_replication`](../v24.1/create-changefeed.html#ignore-disable-changefeed), when set to `true`, prevents the changefeed from filtering events even if CDC filtering is configured via the `disable_changefeed_replication` [session variable](../v24.1/session-variables.html), `sql.ttl.changefeed_replication.disabled` [cluster setting](../v24.1/cluster-settings.html), or the `ttl_disable_changefeed_replication` [table storage parameter](../v24.1/alter-table.html#table-storage-parameters). [#120255][#120255]

    SQL language changes

    diff --git a/src/current/_includes/v23.2/cdc/disable-replication-ttl.md b/src/current/_includes/v23.2/cdc/disable-replication-ttl.md new file mode 100644 index 00000000000..44f71135ac5 --- /dev/null +++ b/src/current/_includes/v23.2/cdc/disable-replication-ttl.md @@ -0,0 +1 @@ +{% include_cached new-in.html version="v23.2" %} To prevent changefeeds from emitting deletes issued by all TTL jobs on a cluster, set the `sql.ttl.changefeed_replication.disabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) to `true`. \ No newline at end of file diff --git a/src/current/_includes/v23.2/misc/session-vars.md b/src/current/_includes/v23.2/misc/session-vars.md index a0d4d56b65f..7d978c32894 100644 --- a/src/current/_includes/v23.2/misc/session-vars.md +++ b/src/current/_includes/v23.2/misc/session-vars.md @@ -15,6 +15,7 @@ |
    `default_transaction_quality_of_service` | The default transaction quality of service for the current session. The supported options are `regular`, `critical`, and `background`. See [Set quality of service level]({% link {{ page.version.version }}/admission-control.md %}#set-quality-of-service-level-for-a-session). | `regular` | Yes | Yes | | `default_transaction_read_only` | The default transaction access mode for the current session.
    If set to `on`, only read operations are allowed in transactions in the current session; if set to `off`, both read and write operations are allowed. See [`SET TRANSACTION`]({% link {{ page.version.version }}/set-transaction.md %}) for more details. | `off` | Yes | Yes | | `default_transaction_use_follower_reads` | If set to on, all read-only transactions use [`AS OF SYSTEM TIME follower_read_timestamp()`]({% link {{ page.version.version }}/as-of-system-time.md %}) to allow the transaction to use follower reads.
    If set to `off`, read-only transactions will only use follower reads if an `AS OF SYSTEM TIME` clause is specified in the statement, with an interval of at least 4.8 seconds. | `off` | Yes | Yes | +| `disable_changefeed_replication` | When `true`, [changefeeds]({% link {{ page.version.version }}/changefeed-messages.md %}#filtering-changefeed-messages) will not emit messages for any changes (e.g., `INSERT`, `UPDATE`) issued to watched tables during that session. | `false` | Yes | Yes | | `disallow_full_table_scans` | If set to `on`, queries on "large" tables with a row count greater than [`large_full_scan_rows`](#large-full-scan-rows) will not use full table or index scans. If no other query plan is possible, queries will return an error message. This setting does not apply to internal queries, which may plan full table or index scans without checking the session variable. | `off` | Yes | Yes | | `distsql` | The query distribution mode for the session. By default, CockroachDB determines which queries are faster to execute if distributed across multiple nodes, and all other queries are run through the gateway node. | `auto` | Yes | Yes | | `enable_auto_rehoming` | When enabled, the [home regions]({% link {{ page.version.version }}/alter-table.md %}#crdb_region) of rows in [`REGIONAL BY ROW`]({% link {{ page.version.version }}/alter-table.md %}#set-the-table-locality-to-regional-by-row) tables are automatically set to the region of the [gateway node]({% link {{ page.version.version }}/ui-sessions-page.md %}#session-details-gateway-node) from which any [`UPDATE`]({% link {{ page.version.version }}/update.md %}) or [`UPSERT`]({% link {{ page.version.version }}/upsert.md %}) statements that operate on those rows originate. | `off` | Yes | Yes | diff --git a/src/current/_includes/v24.1/cdc/disable-replication-ttl.md b/src/current/_includes/v24.1/cdc/disable-replication-ttl.md new file mode 100644 index 00000000000..27b658a747a --- /dev/null +++ b/src/current/_includes/v24.1/cdc/disable-replication-ttl.md @@ -0,0 +1,26 @@ +{% include_cached new-in.html version="v24.1" %} Use the `ttl_disable_changefeed_replication` table storage parameter to prevent changefeeds from sending `DELETE` messages issued by row-level TTL jobs for a table. Include the storage parameter when you create or alter the table. For example: + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE TABLE tbl ( + id UUID PRIMARY KEY default gen_random_uuid(), + value TEXT +) WITH (ttl_expire_after = '3 weeks', ttl_job_cron = '@daily', ttl_disable_changefeed_replication = 'true'); +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER TABLE events SET (ttl_expire_after = '1 year', ttl_disable_changefeed_replication = 'true'); +~~~ + +You can also widen the scope to the cluster by setting the `sql.ttl.changefeed_replication.disabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) to `true`. This will prevent changefeeds from emitting deletes issued by all TTL jobs on a cluster. + +If you want to have a changefeed ignore the storage parameter or cluster setting that disables changefeed replication, you can set the changefeed option `ignore_disable_changefeed_replication` to `true`: + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE CHANGEFEED FOR TABLE table_name INTO 'external://changefeed-sink' + WITH resolved, ignore_disable_changefeed_replication = true; +~~~ + +This is useful when you have multiple use cases for different changefeeds on the same table. For example, you have a table with a changefeed streaming changes to another database for analytics workflows in which you do not want to reflect row-level TTL deletes. Secondly, you have a changefeed on the same table for audit-logging purposes for which you need to persist every change through the changefeed. \ No newline at end of file diff --git a/src/current/_includes/v24.1/misc/session-vars.md b/src/current/_includes/v24.1/misc/session-vars.md index 8659c3e3c91..4ba32c59e3e 100644 --- a/src/current/_includes/v24.1/misc/session-vars.md +++ b/src/current/_includes/v24.1/misc/session-vars.md @@ -16,6 +16,7 @@ | `default_transaction_quality_of_service` | The default transaction quality of service for the current session. The supported options are `regular`, `critical`, and `background`. See [Set quality of service level]({% link {{ page.version.version }}/admission-control.md %}#set-quality-of-service-level-for-a-session). | `regular` | Yes | Yes | | `default_transaction_read_only` | The default transaction access mode for the current session.
    If set to `on`, only read operations are allowed in transactions in the current session; if set to `off`, both read and write operations are allowed. See [`SET TRANSACTION`]({% link {{ page.version.version }}/set-transaction.md %}) for more details. | `off` | Yes | Yes | | `default_transaction_use_follower_reads` | If set to on, all read-only transactions use [`AS OF SYSTEM TIME follower_read_timestamp()`]({% link {{ page.version.version }}/as-of-system-time.md %}) to allow the transaction to use follower reads.
    If set to `off`, read-only transactions will only use follower reads if an `AS OF SYSTEM TIME` clause is specified in the statement, with an interval of at least 4.8 seconds. | `off` | Yes | Yes | +| `disable_changefeed_replication` | When `true`, [changefeeds]({% link {{ page.version.version }}/changefeed-messages.md %}#filtering-changefeed-messages) will not emit messages for any changes (e.g., `INSERT`, `UPDATE`) issued to watched tables during that session. | `false` | Yes | Yes | | `disallow_full_table_scans` | If set to `on`, queries on "large" tables with a row count greater than [`large_full_scan_rows`](#large-full-scan-rows) will not use full table or index scans. If no other query plan is possible, queries will return an error message. This setting does not apply to internal queries, which may plan full table or index scans without checking the session variable. | `off` | Yes | Yes || `distsql` | The query distribution mode for the session. By default, CockroachDB determines which queries are faster to execute if distributed across multiple nodes, and all other queries are run through the gateway node. | `auto` | Yes | Yes | | `enable_auto_rehoming` | When enabled, the [home regions]({% link {{ page.version.version }}/alter-table.md %}#crdb_region) of rows in [`REGIONAL BY ROW`]({% link {{ page.version.version }}/alter-table.md %}#set-the-table-locality-to-regional-by-row) tables are automatically set to the region of the [gateway node]({% link {{ page.version.version }}/ui-sessions-page.md %}#session-details-gateway-node) from which any [`UPDATE`]({% link {{ page.version.version }}/update.md %}) or [`UPSERT`]({% link {{ page.version.version }}/upsert.md %}) statements that operate on those rows originate. | `off` | Yes | Yes | | `enable_durable_locking_for_serializable` | Indicates whether CockroachDB replicates [`FOR UPDATE` and `FOR SHARE`]({% link {{ page.version.version }}/select-for-update.md %}#lock-strengths) locks via [Raft]({% link {{ page.version.version }}/architecture/replication-layer.md %}#raft), allowing locks to be preserved when leases are transferred. Note that replicating `FOR UPDATE` and `FOR SHARE` locks will add latency to those statements. This setting only affects `SERIALIZABLE` transactions and matches the default `READ COMMITTED` behavior when enabled. | `off` | Yes | Yes | diff --git a/src/current/v23.2/changefeed-messages.md b/src/current/v23.2/changefeed-messages.md index 9edddc161cb..57af36ec66b 100644 --- a/src/current/v23.2/changefeed-messages.md +++ b/src/current/v23.2/changefeed-messages.md @@ -17,6 +17,7 @@ This page describes the format and behavior of changefeed messages. You will fin - [Resolved messages](#resolved-messages): The resolved timestamp option and how to configure it. - [Duplicate messages](#duplicate-messages): The causes of duplicate messages from a changefeed. - [Schema changes](#schema-changes): The effect of schema changes on a changefeed. +- [Filtering changefeed messages](#filtering-changefeed-messages): The settings and syntax to prevent and filter the messages that changefeeds emit. - [Message formats](#message-formats): The limitations and type mapping when creating a changefeed with different message formats. {{site.data.alerts.callout_info}} @@ -478,6 +479,31 @@ Refer to the [`CREATE CHANGEFEED` option table]({% link {{ page.version.version {% include {{ page.version.version }}/cdc/virtual-computed-column-cdc.md %} {{site.data.alerts.end}} +## Filtering changefeed messages + +There are several ways to define messages, filter different types of message, or prevent all changefeed messages from emitting to the sink. The following sections outline configurable settings and SQL syntax to handle different use cases. + +### Prevent changefeeds from emitting row-level TTL deletes + +{% include_cached new-in.html version="v23.2" %} To prevent changefeeds from emitting deletes issued by all [TTL jobs]({% link {{ page.version.version }}/row-level-ttl.md %}) on a cluster, set the `sql.ttl.changefeed_replication.disabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) to `true`. + +### Disable changefeeds from emitting messages + +{% include_cached new-in.html version="v23.2" %} To prevent changefeeds from emitting messages for any changes (e.g., `INSERT`, `UPDATE`) issued to watched tables during that session, set the `disable_changefeed_replication` [session variable]({% link {{ page.version.version }}/session-variables.md %}) to `true`. + +### Define the change data emitted to a sink + +When you create a changefeed, use change data capture queries to define the change data emitted to your sink. + +For example: + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE CHANGEFEED INTO 'scheme://sink-URI' WITH updated AS SELECT column, column FROM table; +~~~ + +For details on syntax and examples, refer to the [Change Data Capture Queries]({% link {{ page.version.version }}/cdc-queries.md %}) page. + ## Message formats {% include {{ page.version.version }}/cdc/message-format-list.md %} diff --git a/src/current/v23.2/row-level-ttl.md b/src/current/v23.2/row-level-ttl.md index 228b8464162..a6278c4f231 100644 --- a/src/current/v23.2/row-level-ttl.md +++ b/src/current/v23.2/row-level-ttl.md @@ -135,7 +135,7 @@ SHOW CREATE TABLE ttl_test_per_table; The settings that control the behavior of Row-Level TTL are provided using [storage parameters]({% link {{ page.version.version }}/sql-grammar.md %}#opt_with_storage_parameter_list). These parameters can be set during table creation using [`CREATE TABLE`](#create-a-table-with-a-ttl_expiration_expression), added to an existing table using the [`ALTER TABLE`](#add-or-update-the-row-level-ttl-for-an-existing-table) statement, or [reset to default values](#reset-a-storage-parameter-to-its-default-value). -| Description | Option | Associated cluster setting | +| Option | Description | Associated cluster setting | |----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------| | `ttl_expiration_expression` | **Recommended in v22.2+**. SQL expression that defines the TTL expiration. Must evaluate to a [`TIMESTAMPTZ`]({% link {{ page.version.version }}/timestamp.md %}). This and/or [`ttl_expire_after`](#param-ttl-expire-after) are required to enable TTL. This parameter is useful when you want to set the TTL for individual rows in the table. For an example, see [Create a table with a `ttl_expiration_expression`](#create-a-table-with-a-ttl_expiration_expression). | N/A | | `ttl_expire_after` | The [interval]({% link {{ page.version.version }}/interval.md %}) when a TTL will expire. This and/or [`ttl_expiration_expression`](#param-ttl-expiration-expression) are required to enable TTL. Minimum value: `'1 microsecond'`. | N/A | @@ -556,6 +556,8 @@ Row-level TTL interacts with [changefeeds]({% link {{ page.version.version }}/cr - When expired rows are deleted, a [changefeed delete message]({% link {{ page.version.version }}/changefeed-messages.md %}#delete-messages) is emitted. +{% include {{ page.version.version }}/cdc/disable-replication-ttl.md %} + For guidance on how to filter changefeed messages to emit row-level TTL deletes only, refer to [Change Data Capture Queries]({% link {{ page.version.version }}/cdc-queries.md %}#reference-ttl-in-a-cdc-query). ## Backup and restore diff --git a/src/current/v24.1/changefeed-messages.md b/src/current/v24.1/changefeed-messages.md index 489481a3142..67492e0b81e 100644 --- a/src/current/v24.1/changefeed-messages.md +++ b/src/current/v24.1/changefeed-messages.md @@ -17,6 +17,7 @@ This page describes the format and behavior of changefeed messages. You will fin - [Resolved messages](#resolved-messages): The resolved timestamp option and how to configure it. - [Duplicate messages](#duplicate-messages): The causes of duplicate messages from a changefeed. - [Schema changes](#schema-changes): The effect of schema changes on a changefeed. +- [Filtering changefeed messages](#filtering-changefeed-messages): The settings and syntax to prevent and filter the messages that changefeeds emit. - [Message formats](#message-formats): The limitations and type mapping when creating a changefeed with different message formats. {{site.data.alerts.callout_info}} @@ -478,6 +479,31 @@ Refer to the [`CREATE CHANGEFEED` option table]({% link {{ page.version.version {% include {{ page.version.version }}/cdc/virtual-computed-column-cdc.md %} {{site.data.alerts.end}} +## Filtering changefeed messages + +There are several ways to define messages, filter different types of message, or prevent all changefeed messages from emitting to the sink. The following sections outline configurable settings and SQL syntax to handle different use cases. + +### Prevent changefeeds from emitting row-level TTL deletes + +{% include {{ page.version.version }}/cdc/disable-replication-ttl.md %} + +### Disable changefeeds from emitting messages + +To prevent changefeeds from emitting messages for any changes (e.g., `INSERT`, `UPDATE`) issued to watched tables during that session, set the `disable_changefeed_replication` [session variable]({% link {{ page.version.version }}/session-variables.md %}) to `true`. + +### Define the change data emitted to a sink + +When you create a changefeed, use change data capture queries to define the change data emitted to your sink. + +For example: + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE CHANGEFEED INTO 'scheme://sink-URI' WITH updated AS SELECT column, column FROM table; +~~~ + +For details on syntax and examples, refer to the [Change Data Capture Queries]({% link {{ page.version.version }}/cdc-queries.md %}) page. + ## Message formats {% include {{ page.version.version }}/cdc/message-format-list.md %} diff --git a/src/current/v24.1/create-changefeed.md b/src/current/v24.1/create-changefeed.md index 99884b4a267..6a084278824 100644 --- a/src/current/v24.1/create-changefeed.md +++ b/src/current/v24.1/create-changefeed.md @@ -175,6 +175,7 @@ Option | Value | Description `format` | `json` / `avro` / `csv` / `parquet` | Format of the emitted message.

    `avro`: For mappings of CockroachDB types to Avro types, [refer to the table]({% link {{ page.version.version }}/changefeed-messages.md %}#avro-types) and detail on [Avro limitations]({% link {{ page.version.version }}/changefeed-messages.md %}#avro-limitations). **Note:** [`confluent_schema_registry`](#confluent-registry) is required with `format=avro`.

    `csv`: You cannot combine `format=csv` with the [`diff`](#diff-opt) or [`resolved`](#resolved-option) options. Changefeeds use the same CSV format as the [`EXPORT`](export.html) statement. Refer to [Export data with changefeeds]({% link {{ page.version.version }}/export-data-with-changefeeds.md %}) for details using these options to create a changefeed as an alternative to `EXPORT`. **Note:** [`initial_scan = 'only'`](#initial-scan) is required with `format=csv`.

    `parquet`: Cloud storage is the only supported sink. The [`topic_in_value`](#topic-in-value) option is not compatible with `parquet` format.

    Default: `format=json`. `full_table_name` | N/A | Use fully qualified table name in topics, subjects, schemas, and record output instead of the default table name. This can prevent unintended behavior when the same table name is present in multiple databases.

    **Note:** This option cannot modify existing table names used as topics, subjects, etc., as part of an [`ALTER CHANGEFEED`]({% link {{ page.version.version }}/alter-changefeed.md %}) statement. To modify a topic, subject, etc., to use a fully qualified table name, create a new changefeed with this option.

    Example: `CREATE CHANGEFEED FOR foo... WITH full_table_name` will create the topic name `defaultdb.public.foo` instead of `foo`. `gc_protect_expires_after` | [Duration string](https://pkg.go.dev/time#ParseDuration) | Automatically expires protected timestamp records that are older than the defined duration. In the case where a changefeed job remains paused, `gc_protect_expires_after` will trigger the underlying protected timestamp record to expire and cancel the changefeed job to prevent accumulation of protected data.

    Refer to [Protect Changefeed Data from Garbage Collection]({% link {{ page.version.version }}/protect-changefeed-data.md %}) for more detail on protecting changefeed data. +New in v24.1:`ignore_disable_changefeed_replication` | [`BOOL`]({% link {{ page.version.version }}/bool.md %}) | When set to `true`, the changefeed **will emit** events even if CDC filtering for TTL jobs is configured using the `disable_changefeed_replication` [session variable]({% link {{ page.version.version }}/set-vars.md %}), `sql.ttl.changefeed_replication.disabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}), or the `ttl_disable_changefeed_replication` [table storage parameter]({% link {{ page.version.version }}/row-level-ttl.md %}).

    Refer to [Filter changefeeds for tables using TTL](#filter-changefeeds-for-tables-using-row-level-ttl) for usage details. `initial_scan` | `yes`/`no`/`only` | Control whether or not an initial scan will occur at the start time of a changefeed. Only one `initial_scan` option (`yes`, `no`, or `only`) can be used. If none of these are set, an initial scan will occur if there is no [`cursor`](#cursor-option), and will not occur if there is one. This preserves the behavior from previous releases. With `initial_scan = 'only'` set, the changefeed job will end with a successful status (`succeeded`) after the initial scan completes. You cannot specify `yes`, `no`, `only` simultaneously.

    If used in conjunction with `cursor`, an initial scan will be performed at the cursor timestamp. If no `cursor` is specified, the initial scan is performed at `now()`.

    Although the [`initial_scan` / `no_initial_scan`](https://www.cockroachlabs.com/docs/v21.2/create-changefeed#initial-scan) syntax from previous versions is still supported, you cannot combine the previous and current syntax.

    Default: `initial_scan = 'yes'` `kafka_sink_config` | [`STRING`]({% link {{ page.version.version }}/string.md %}) | Set fields to configure the required level of message acknowledgement from the Kafka server, the version of the server, and batching parameters for Kafka sinks. Set the message file compression type. See [Kafka sink configuration]({% link {{ page.version.version }}/changefeed-sinks.md %}#kafka-sink-configuration) for more detail on configuring all the available fields for this option.

    Example: `CREATE CHANGEFEED FOR table INTO 'kafka://localhost:9092' WITH kafka_sink_config='{"Flush": {"MaxMessages": 1, "Frequency": "1s"}, "RequiredAcks": "ONE"}'` `key_column` | `'column'` | Override the key used in [message metadata]({% link {{ page.version.version }}/changefeed-messages.md %}). This changes the key hashed to determine downstream partitions. In sinks that support partitioning by message, CockroachDB uses the [32-bit FNV-1a](https://wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) hashing algorithm to determine which partition to send to.

    **Note:** `key_column` does not preserve ordering of messages from CockroachDB to the downstream sink, therefore you must also include the [`unordered`](#unordered) option in your changefeed creation statement. It does not affect per-key [ordering guarantees]({% link {{ page.version.version }}/changefeed-messages.md %}#ordering-and-delivery-guarantees) or the output of [`key_in_value`](#key-in-value).

    See the [Define a key to determine the changefeed sink partition](#define-a-key-to-determine-the-changefeed-sink-partition) example. @@ -343,6 +344,12 @@ CREATE CHANGEFEED FOR TABLE table_name INTO 'external://kafka_sink' WITH resolved; ~~~ +### Filter changefeeds for tables using row-level TTL + +{% include {{ page.version.version }}/cdc/disable-replication-ttl.md %} + +For guidance on how to filter changefeed messages to emit [row-level TTL]({% link {{ page.version.version }}/row-level-ttl.md %}) deletes only, refer to [Change Data Capture Queries]({% link {{ page.version.version }}/cdc-queries.md %}#reference-ttl-in-a-cdc-query). + ### Manage a changefeed For {{ site.data.products.enterprise }} changefeeds, use [`SHOW CHANGEFEED JOBS`]({% link {{ page.version.version }}/show-jobs.md %}) to check the status of your changefeed jobs: diff --git a/src/current/v24.1/row-level-ttl.md b/src/current/v24.1/row-level-ttl.md index 92789afe213..ad82287efb2 100644 --- a/src/current/v24.1/row-level-ttl.md +++ b/src/current/v24.1/row-level-ttl.md @@ -135,7 +135,7 @@ SHOW CREATE TABLE ttl_test_per_table; The settings that control the behavior of Row-Level TTL are provided using [storage parameters]({% link {{ page.version.version }}/sql-grammar.md %}#opt_with_storage_parameter_list). These parameters can be set during table creation using [`CREATE TABLE`](#create-a-table-with-a-ttl_expiration_expression), added to an existing table using the [`ALTER TABLE`](#add-or-update-the-row-level-ttl-for-an-existing-table) statement, or [reset to default values](#reset-a-storage-parameter-to-its-default-value). -| Description | Option | Associated cluster setting | +| Option | Description | Associated cluster setting | |----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------| | `ttl_expiration_expression` | **Recommended in v22.2+**. SQL expression that defines the TTL expiration. Must evaluate to a [`TIMESTAMPTZ`]({% link {{ page.version.version }}/timestamp.md %}). This and/or [`ttl_expire_after`](#param-ttl-expire-after) are required to enable TTL. This parameter is useful when you want to set the TTL for individual rows in the table. For an example, see [Create a table with a `ttl_expiration_expression`](#create-a-table-with-a-ttl_expiration_expression). | N/A | | `ttl_expire_after` | The [interval]({% link {{ page.version.version }}/interval.md %}) when a TTL will expire. This and/or [`ttl_expiration_expression`](#param-ttl-expiration-expression) are required to enable TTL. Minimum value: `'1 microsecond'`. | N/A | @@ -147,6 +147,7 @@ The settings that control the behavior of Row-Level TTL are provided using [stor | `ttl_row_stats_poll_interval` | If set, counts rows and expired rows on the table to report as Prometheus metrics while the TTL job is running. Unset by default, meaning no stats are fetched and reported. | N/A | | `ttl_pause` | If set, stops the TTL job from executing. | N/A | | `ttl_job_cron` | Frequency at which the TTL job runs, specified using [CRON syntax](https://cron.help). Default: `'@daily'` (was `'@hourly'`). | N/A | +| `ttl_disable_changefeed_replication` | New in v24.1: Disables [changefeed]({% link {{ page.version.version }}/change-data-capture-overview.md %}) replication for the deletes performed by the TTL job. | `sql.ttl.changefeed_replication.disabled` | For more information about TTL-related cluster settings, see [View TTL-related cluster settings](#view-ttl-related-cluster-settings). @@ -556,6 +557,10 @@ Row-level TTL interacts with [changefeeds]({% link {{ page.version.version }}/cr - When expired rows are deleted, a [changefeed delete message]({% link {{ page.version.version }}/changefeed-messages.md %}#delete-messages) is emitted. +### Filter changefeeds for tables using row-level TTL + +{% include {{ page.version.version }}/cdc/disable-replication-ttl.md %} + For guidance on how to filter changefeed messages to emit row-level TTL deletes only, refer to [Change Data Capture Queries]({% link {{ page.version.version }}/cdc-queries.md %}#reference-ttl-in-a-cdc-query). ## Backup and restore From 23ddb923ceb028cbf4a1557d3606a89c5603767c Mon Sep 17 00:00:00 2001 From: Rafi Shamim Date: Tue, 30 Apr 2024 16:53:07 -0400 Subject: [PATCH 23/34] DOC-10032 Remove functions from USAGE privilege The USAGE privilege never applied to functions, so it was a bug that it got documented here. --- src/current/_includes/v22.2/sql/privileges.md | 2 +- src/current/_includes/v23.1/sql/privileges.md | 2 +- src/current/_includes/v23.2/sql/privileges.md | 2 +- src/current/_includes/v24.1/sql/privileges.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/current/_includes/v22.2/sql/privileges.md b/src/current/_includes/v22.2/sql/privileges.md index 0e57e08012b..bf3e8066507 100644 --- a/src/current/_includes/v22.2/sql/privileges.md +++ b/src/current/_includes/v22.2/sql/privileges.md @@ -18,7 +18,7 @@ Privilege | Levels | Description `RESTORE` | System, Database | Grants the ability to restore [backups]({% link {{ page.version.version }}/backup-and-restore-overview.md %}) at the system or database level. Refer to `RESTORE` [Required privileges]({% link {{ page.version.version }}/restore.md %}#required-privileges) for more details. `SELECT` | Table, Sequence | Grants the ability to run [selection queries]({% link {{ page.version.version }}/query-data.md %}) at the table or sequence level. `UPDATE` | Table, Sequence | Grants the ability to run [update statements]({% link {{ page.version.version }}/update-data.md %}) at the table or sequence level. -`USAGE` | Function, Schema, Sequence, Type | Grants the ability to use [functions]({% link {{ page.version.version }}/functions-and-operators.md %}), [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). +`USAGE` | Schema, Sequence, Type | Grants the ability to use [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). `VIEWACTIVITY` | System | Grants the ability to view other user's activity statistics of a cluster. `VIEWACTIVITYREDACTED` | System | Grants the ability to view other user's activity statistics, but prevents the role from accessing the statement diagnostics bundle in the DB Console, and viewing some columns in introspection queries that contain data about the cluster. `VIEWCLUSTERMETADATA` | System | Grants the ability to view range information, data distribution, store information, and Raft information. diff --git a/src/current/_includes/v23.1/sql/privileges.md b/src/current/_includes/v23.1/sql/privileges.md index e6d3456e398..23c0193653d 100644 --- a/src/current/_includes/v23.1/sql/privileges.md +++ b/src/current/_includes/v23.1/sql/privileges.md @@ -22,7 +22,7 @@ Privilege | Levels | Description `RESTORE` | System, Database | Grants the ability to restore [backups]({% link {{ page.version.version }}/backup-and-restore-overview.md %}) at the system or database level. Refer to `RESTORE` [Required privileges]({% link {{ page.version.version }}/restore.md %}#required-privileges) for more details. `SELECT` | Table, Sequence | Grants the ability to run [selection queries]({% link {{ page.version.version }}/query-data.md %}) at the table or sequence level. `UPDATE` | Table, Sequence | Grants the ability to run [update statements]({% link {{ page.version.version }}/update-data.md %}) at the table or sequence level. -`USAGE` | Function, Schema, Sequence, Type | Grants the ability to use [functions]({% link {{ page.version.version }}/functions-and-operators.md %}), [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). +`USAGE` | Schema, Sequence, Type | Grants the ability to use [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). `VIEWACTIVITY` | System | Grants the ability to view other user's activity statistics of a cluster. `VIEWACTIVITYREDACTED` | System | Grants the ability to view other user's activity statistics, but prevents the role from accessing the statement diagnostics bundle in the DB Console, and viewing some columns in introspection queries that contain data about the cluster. `VIEWCLUSTERMETADATA` | System | Grants the ability to view range information, data distribution, store information, and Raft information. diff --git a/src/current/_includes/v23.2/sql/privileges.md b/src/current/_includes/v23.2/sql/privileges.md index a3a25489b48..223ce20ad7c 100644 --- a/src/current/_includes/v23.2/sql/privileges.md +++ b/src/current/_includes/v23.2/sql/privileges.md @@ -22,7 +22,7 @@ Privilege | Levels | Description `RESTORE` | System, Database | Grants the ability to restore [backups]({% link {{ page.version.version }}/backup-and-restore-overview.md %}) at the system or database level. Refer to `RESTORE` [Required privileges]({% link {{ page.version.version }}/restore.md %}#required-privileges) for more details. `SELECT` | Table, Sequence | Grants the ability to run [selection queries]({% link {{ page.version.version }}/query-data.md %}) at the table or sequence level. `UPDATE` | Table, Sequence | Grants the ability to run [update statements]({% link {{ page.version.version }}/update-data.md %}) at the table or sequence level. -`USAGE` | Function, Schema, Sequence, Type | Grants the ability to use [functions]({% link {{ page.version.version }}/functions-and-operators.md %}), [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). +`USAGE` | Schema, Sequence, Type | Grants the ability to use [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). `VIEWACTIVITY` | System | Grants the ability to view other user's activity statistics of a cluster. `VIEWACTIVITYREDACTED` | System | Grants the ability to view other user's activity statistics, but prevents the role from accessing the statement diagnostics bundle in the DB Console, and viewing some columns in introspection queries that contain data about the cluster. `VIEWCLUSTERMETADATA` | System | Grants the ability to view range information, data distribution, store information, and Raft information. diff --git a/src/current/_includes/v24.1/sql/privileges.md b/src/current/_includes/v24.1/sql/privileges.md index a3a25489b48..223ce20ad7c 100644 --- a/src/current/_includes/v24.1/sql/privileges.md +++ b/src/current/_includes/v24.1/sql/privileges.md @@ -22,7 +22,7 @@ Privilege | Levels | Description `RESTORE` | System, Database | Grants the ability to restore [backups]({% link {{ page.version.version }}/backup-and-restore-overview.md %}) at the system or database level. Refer to `RESTORE` [Required privileges]({% link {{ page.version.version }}/restore.md %}#required-privileges) for more details. `SELECT` | Table, Sequence | Grants the ability to run [selection queries]({% link {{ page.version.version }}/query-data.md %}) at the table or sequence level. `UPDATE` | Table, Sequence | Grants the ability to run [update statements]({% link {{ page.version.version }}/update-data.md %}) at the table or sequence level. -`USAGE` | Function, Schema, Sequence, Type | Grants the ability to use [functions]({% link {{ page.version.version }}/functions-and-operators.md %}), [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). +`USAGE` | Schema, Sequence, Type | Grants the ability to use [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). `VIEWACTIVITY` | System | Grants the ability to view other user's activity statistics of a cluster. `VIEWACTIVITYREDACTED` | System | Grants the ability to view other user's activity statistics, but prevents the role from accessing the statement diagnostics bundle in the DB Console, and viewing some columns in introspection queries that contain data about the cluster. `VIEWCLUSTERMETADATA` | System | Grants the ability to view range information, data distribution, store information, and Raft information. From b70d369dee51f3e28de38ee5e20161fb149052a5 Mon Sep 17 00:00:00 2001 From: Mike Lewis <76072290+mikeCRL@users.noreply.github.com> Date: Wed, 1 May 2024 13:09:49 -0400 Subject: [PATCH 24/34] Release- and support-related content and data updates for LTS rollout [DOC-9239][DOC-9811][DOC-10129][DOC-5941] (#18500) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Release- and support-related content updates with LTS rollout * v24.1.0 beta.2 Release Notes (#18494) * Initial commit * Edits * removed a non-user-impacting note * Worked on feedback * [DOC-10129] Tooling updates for LTS - Add LTS fields to versions.csv and releases.yml - Add LTS support to Release Support Policy - In v23.1+, convert download buttons to tables, move source to a section - Add LTS support to the message on EOL release pages - Add LTS support to CRDB upgrade pages - Consolidate Releases TOCs * Fix metadata in 23.1.18 * Remove config profile flags from pcr and update responses from show virtual cluster (#18488) * DOC-9892 PR #120490 - ui: show license expiration alert in Db Console (#18501) (1) In ui-overview.md, added a section for License expiration message. (2) In licensing-faqs.md, updated Monitor for license expiry section with a link to the new License expiration message section. * Incorporated David’s feedback. * Incorporated Ryan’s feedback. * DOC-9004 Create a physical cluster replication metrics dashboard page when PCR goes GA (#18489) (1) Added ui-physical-cluster-replication-dashboard.md, moved content from DB Console section of physical-cluster-replication-monitoring.md. (2) In physical-cluster-replication-monitoring.md, ui-overview.md and self-hosted-deployments.json, added links to ui-physical-cluster-replication-dashboard.md. (3) In ui-replication-dashboard.md, added callout regarding ui-physical-cluster-replication-dashboard.md. * Incorporated Kathryn’s feedback. * Incorporated Ryan’s feedback. * Fix logic on upgrade pages * CSS adjustments - Move CSS rules from v23.2.0.md to corestyle.scss - Change os-tabs from an id to a class - Add a class to feature highlight tables in 23.1+ * Fix link to Cloud Support and Upgrade Policy * Fix CSS rules * Add a missing logic branch to unsupported versions include * Improve logic on release support page * Fix bad relative link --------- Co-authored-by: Matt Linville --- src/current/_data/releases.yml | 12 +- src/current/_data/versions.csv | 32 ++-- src/current/_includes/corestyle.scss | 43 ++++- .../new-release-downloads-docker-image.md | 103 +++++++++++ .../release-downloads-docker-image.md | 3 +- .../releases/v23.1/v23.1.0-alpha.1.md | 2 +- .../releases/v23.1/v23.1.0-alpha.2.md | 2 +- .../releases/v23.1/v23.1.0-alpha.3.md | 2 +- .../releases/v23.1/v23.1.0-alpha.4.md | 2 +- .../releases/v23.1/v23.1.0-alpha.5.md | 2 +- .../releases/v23.1/v23.1.0-alpha.6.md | 2 +- .../releases/v23.1/v23.1.0-alpha.7.md | 2 +- .../releases/v23.1/v23.1.0-alpha.8.md | 2 +- .../releases/v23.1/v23.1.0-alpha.9.md | 2 +- .../releases/v23.1/v23.1.0-beta.1.md | 2 +- .../releases/v23.1/v23.1.0-beta.2.md | 2 +- .../releases/v23.1/v23.1.0-beta.3.md | 2 +- .../_includes/releases/v23.1/v23.1.0-rc.1.md | 2 +- .../_includes/releases/v23.1/v23.1.0-rc.2.md | 2 +- .../_includes/releases/v23.1/v23.1.0.md | 6 +- .../_includes/releases/v23.1/v23.1.1.md | 2 +- .../_includes/releases/v23.1/v23.1.10.md | 2 +- .../_includes/releases/v23.1/v23.1.11.md | 2 +- .../_includes/releases/v23.1/v23.1.12.md | 2 +- .../_includes/releases/v23.1/v23.1.13.md | 2 +- .../_includes/releases/v23.1/v23.1.14.md | 22 +-- .../_includes/releases/v23.1/v23.1.15.md | 3 +- .../_includes/releases/v23.1/v23.1.16.md | 2 +- .../_includes/releases/v23.1/v23.1.17.md | 2 +- .../_includes/releases/v23.1/v23.1.18.md | 2 +- .../_includes/releases/v23.1/v23.1.19.md | 2 +- .../_includes/releases/v23.1/v23.1.2.md | 12 +- .../_includes/releases/v23.1/v23.1.3.md | 2 +- .../_includes/releases/v23.1/v23.1.4.md | 2 +- .../_includes/releases/v23.1/v23.1.5.md | 2 +- .../_includes/releases/v23.1/v23.1.6.md | 8 +- .../_includes/releases/v23.1/v23.1.7.md | 2 +- .../_includes/releases/v23.1/v23.1.8.md | 2 +- .../_includes/releases/v23.1/v23.1.9.md | 2 +- .../releases/v23.2/v23.2.0-alpha.1.md | 2 +- .../releases/v23.2/v23.2.0-alpha.2.md | 2 +- .../releases/v23.2/v23.2.0-alpha.3.md | 2 +- .../releases/v23.2/v23.2.0-alpha.4.md | 2 +- .../releases/v23.2/v23.2.0-alpha.5.md | 2 +- .../releases/v23.2/v23.2.0-alpha.6.md | 2 +- .../releases/v23.2/v23.2.0-alpha.7.md | 2 +- .../releases/v23.2/v23.2.0-beta.1.md | 4 +- .../releases/v23.2/v23.2.0-beta.2.md | 2 +- .../releases/v23.2/v23.2.0-beta.3.md | 2 +- .../_includes/releases/v23.2/v23.2.0-rc.1.md | 2 +- .../_includes/releases/v23.2/v23.2.0-rc.2.md | 2 +- .../_includes/releases/v23.2/v23.2.0.md | 45 +---- .../_includes/releases/v23.2/v23.2.1.md | 2 +- .../_includes/releases/v23.2/v23.2.2.md | 2 +- .../_includes/releases/v23.2/v23.2.3.md | 4 +- .../_includes/releases/v23.2/v23.2.4.md | 4 +- .../releases/v24.1/v24.1.0-alpha.1.md | 2 +- .../releases/v24.1/v24.1.0-alpha.2.md | 2 +- .../releases/v24.1/v24.1.0-alpha.3.md | 4 +- .../releases/v24.1/v24.1.0-alpha.4.md | 2 +- .../releases/v24.1/v24.1.0-alpha.5.md | 2 +- .../releases/v24.1/v24.1.0-beta.1.md | 2 +- .../releases/v24.1/v24.1.0-beta.2.md | 2 +- .../_includes/sidebar-all-releases.json | 32 +++- src/current/_includes/sidebar-data-v23.2.json | 3 +- src/current/_includes/sidebar-data-v24.1.json | 3 +- src/current/_includes/sidebar-releases.json | 45 +++-- src/current/_includes/unsupported-version.md | 29 ++- .../v23.2/sidebar-data/latest-releases.json | 7 - .../v23.2/sidebar-data/releases.json | 2 +- .../v24.1/sidebar-data/latest-releases.json | 7 - .../v24.1/sidebar-data/releases.json | 4 +- src/current/cockroachcloud/authorization.md | 2 +- src/current/cockroachcloud/ccloud-faq.md | 2 +- src/current/cockroachcloud/cloud-sso-sql.md | 2 +- .../cockroachcloud/cluster-overview-page.md | 2 +- src/current/cockroachcloud/cmek.md | 2 +- .../egress-perimeter-controls.md | 2 +- .../cockroachcloud/sql-audit-logging.md | 2 +- src/current/cockroachcloud/upgrade-policy.md | 39 ++-- src/current/releases/index.md | 42 +++-- .../releases/release-support-policy.md | 173 +++++++++++++++--- src/current/releases/v24.1.md | 2 +- src/current/v22.2/sso-sql.md | 2 +- src/current/v23.1/sso-sql.md | 2 +- .../v23.1/upgrade-cockroach-version.md | 10 +- src/current/v23.2/sso-sql.md | 2 +- .../v23.2/upgrade-cockroach-version.md | 10 +- src/current/v24.1/sso-sql.md | 2 +- .../v24.1/upgrade-cockroach-version.md | 14 +- 90 files changed, 558 insertions(+), 287 deletions(-) create mode 100644 src/current/_includes/releases/new-release-downloads-docker-image.md delete mode 100644 src/current/_includes/v23.2/sidebar-data/latest-releases.json diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index 216aeb7598a..4d07485be3b 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5060,6 +5060,7 @@ major_version: v23.1 release_date: '2023-11-13' release_type: Production + lts: true go_version: go1.21 sha: d7e9824b4cd6ebf7a8548156f2a772ae6648257d has_sql_only: true @@ -5249,6 +5250,7 @@ major_version: v23.1 release_date: '2023-12-11' release_type: Production + lts: true go_version: go1.21 sha: 8d065df26e25a762a1abbbf2b1e475456b341a00 has_sql_only: true @@ -5357,6 +5359,7 @@ major_version: v23.1 release_date: '2024-01-17' release_type: Production + lts: true go_version: go1.21 sha: b95f2225b09cf25f9f2be31ef6a6f65c73a1b081 has_sql_only: true @@ -5472,6 +5475,7 @@ major_version: v23.1 release_date: '2024-02-20' release_type: Production + lts: true go_version: go1.21 sha: 69a32fafce429e5b75dba8f339ea15922286a0ba has_sql_only: true @@ -5526,6 +5530,7 @@ major_version: v23.1 release_date: '2024-02-27' release_type: Production + lts: true go_version: go1.21 sha: 37f75744ac468fe5a97b343a188ea248bce8fb4a has_sql_only: true @@ -5659,6 +5664,7 @@ major_version: v23.1 release_date: '2024-03-19' release_type: Production + lts: true go_version: go1.22.0 sha: d50ccb5a52cdf5a1f41cbb2fa61ef971c65e1346 has_sql_only: true @@ -5767,18 +5773,19 @@ major_version: v23.1 release_date: '2024-04-09' release_type: Production + lts: true go_version: go1.22.0 sha: 84cf36a2a05dcfcf6dfccf4014aad8f703ff6cef has_sql_only: true has_sha256sum: true mac: mac_arm: true - mac_arm_experimental: true + mac_arm_experimental: false mac_arm_limited_access: false windows: true linux: linux_arm: true - linux_arm_experimental: true + linux_arm_experimental: false linux_arm_limited_access: false linux_intel_fips: true linux_arm_fips: false @@ -5848,6 +5855,7 @@ major_version: v23.1 release_date: '2024-04-18' release_type: Production + lts: true go_version: go1.22.0 sha: 1bca2adcbc1deb23067e28369f8b24c99194f2bb has_sql_only: true diff --git a/src/current/_data/versions.csv b/src/current/_data/versions.csv index 3bc76b54574..d0f53f49767 100644 --- a/src/current/_data/versions.csv +++ b/src/current/_data/versions.csv @@ -1,16 +1,16 @@ -major_version,release_date,maint_supp_exp_date,asst_supp_exp_date,previous_version,crdb_branch_name -v1.0,2017-05-10,2018-05-10,2018-11-10,N/A,release-1.0 -v1.1,2017-10-12,2018-10-12,2019-04-12,v1.0,release-1.1 -v2.0,2018-04-04,2019-04-04,2019-10-04,v1.1,release-2.0 -v2.1,2018-10-30,2019-10-30,2020-04-30,v2.0,release-2.1 -v19.1,2019-04-30,2020-04-30,2020-10-30,v2.1,release-19.1 -v19.2,2019-11-12,2020-11-12,2021-05-12,v19.1,release-19.2 -v20.1,2020-05-12,2021-05-12,2021-11-12,v19.2,release-20.1 -v20.2,2020-11-10,2021-11-10,2022-05-10,v20.1,release-20.2 -v21.1,2021-05-18,2022-05-18,2022-11-18,v20.2,release-21.1 -v21.2,2021-11-16,2022-11-16,2023-05-16,v21.1,release-21.2 -v22.1,2022-05-24,2023-05-24,2023-11-24,v21.2,release-22.1 -v22.2,2022-12-05,2023-12-05,2024-06-05,v22.1,release-22.2 -v23.1,2023-05-15,2024-05-15,2024-11-15,v22.2,release-23.1 -v23.2,2024-02-05,2025-02-05,2025-08-05,v23.1,release-23.2 -v24.1,N/A,N/A,N/A,v23.2,release-24.1 +major_version,release_date,maint_supp_exp_date,asst_supp_exp_date,last_ga_patch,initial_lts_patch,initial_lts_release_date,lts_maint_supp_exp_date,lts_asst_supp_exp_date,previous_version,crdb_branch_name +v1.0,2017-05-10,2018-05-10,2018-11-10,N/A,N/A,N/A,N/A,N/A,N/A,release-1.0 +v1.1,2017-10-12,2018-10-12,2019-04-12,N/A,N/A,N/A,N/A,N/A,v1.0,release-1.1 +v2.0,2018-04-04,2019-04-04,2019-10-04,N/A,N/A,N/A,N/A,N/A,v1.1,release-2.0 +v2.1,2018-10-30,2019-10-30,2020-04-30,N/A,N/A,N/A,N/A,N/A,v2.0,release-2.1 +v19.1,2019-04-30,2020-04-30,2020-10-30,N/A,N/A,N/A,N/A,N/A,v2.1,release-19.1 +v19.2,2019-11-12,2020-11-12,2021-05-12,N/A,N/A,N/A,N/A,N/A,v19.1,release-19.2 +v20.1,2020-05-12,2021-05-12,2021-11-12,N/A,N/A,N/A,N/A,N/A,v19.2,release-20.1 +v20.2,2020-11-10,2021-11-10,2022-05-10,N/A,N/A,N/A,N/A,N/A,v20.1,release-20.2 +v21.1,2021-05-18,2022-05-18,2022-11-18,N/A,N/A,N/A,N/A,N/A,v20.2,release-21.1 +v21.2,2021-11-16,2022-11-16,2023-05-16,N/A,N/A,N/A,N/A,N/A,v21.1,release-21.2 +v22.1,2022-05-24,2023-05-24,2023-11-24,N/A,N/A,N/A,N/A,N/A,v21.2,release-22.1 +v22.2,2022-12-05,2023-12-05,2024-06-05,N/A,N/A,N/A,N/A,N/A,v22.1,release-22.2 +v23.1,2023-05-15,2024-05-15,2024-11-15,23.1.11,23.1.12,2023-11-13,2024-11-13,2025-11-13,v22.2,release-23.1 +v23.2,2024-02-05,2025-02-05,2025-08-05,N/A,N/A,N/A,N/A,N/A,v23.1,release-23.2 +v24.1,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,v23.2,release-24.1 diff --git a/src/current/_includes/corestyle.scss b/src/current/_includes/corestyle.scss index 66220d02726..f9fc8a47611 100644 --- a/src/current/_includes/corestyle.scss +++ b/src/current/_includes/corestyle.scss @@ -63,7 +63,7 @@ h1, h2 { code { background-color: $neutral-100 !important; - color: $neutral-700 !important; + color: $neutral-700 !important; } } @@ -77,7 +77,7 @@ h3, h4, h5, h6 { code { background-color: $neutral-100 !important; - color: $neutral-700 !important; + color: $neutral-700 !important; } } @@ -951,9 +951,46 @@ a.btn-primary { } } +/* Used for feature highlights tables in .0 release pages and for release download tables in v23.1+ */ +div.os-tabs th, +div#feature-highlights th { + background-color: #E6EAF0; +} + +/* Used for feature highlights tables in .0 release pages */ + +div#feature-highlights th, +div#feature-highlights td { + border: none; + padding: 5px; + text-align: left; +} + +div#feature-highlights .center-align { + text-align: center; + vertical-align: middle; +} + +div#feature-highlights .icon-center { + text-align: center; +} + +div#feature-highlights .table-icon { + width: 26px; + border: none; +} + +div#feature-highlights .feature-summary { + font-weight: bold; +} + +div#feature-highlights .feature-description { + margin-top: 5px; +} @media (min-width: 700px) { - #os-tabs { + + .os-tabs { button { &#mac { diff --git a/src/current/_includes/releases/new-release-downloads-docker-image.md b/src/current/_includes/releases/new-release-downloads-docker-image.md new file mode 100644 index 00000000000..95b90d9a2b7 --- /dev/null +++ b/src/current/_includes/releases/new-release-downloads-docker-image.md @@ -0,0 +1,103 @@ +{% comment %}This include is used only in v23.1 and above. Newer versions use release-downloads-docker-image.md. {% endcomment %} +{% assign release = site.data.releases | where_exp: "release", "release.release_name == include.release" | first %} +{% assign version = site.data.versions | where_exp: "version", "version.major_version == release.major_version" | first %} + +

    Downloads

    {% comment %} take the version name, force it to be lowercase, and replace all periods with hyphens. {% endcomment %} + +{% if release.release_type == "Testing" %} +{% include releases/experimental-test-release.md version=release.release_name %} +{% endif %} + +{% if release.withdrawn == true %} +{% include releases/withdrawn.md %} +{% elsif release.cloud_only == true %} {% comment %}Show the Cloud-first info instead of download links {% endcomment %} +{{site.data.alerts.callout_info}} +{{ r.cloud_only_message }} +{{site.data.alerts.end}} +{% else %} + +{{site.data.alerts.callout_info}} +Experimental downloads are not qualified for production use and not eligible for support or uptime SLA commitments, whether they are for testing releases or production releases. +{{site.data.alerts.end}} + +{% comment %}Assign the JS for the experimental download prompt and store it in the Liquid variable experimental_download_js {% endcomment %} + {% capture experimental_download_js %}{% include_cached releases/experimental_download_dialog.md %}{% endcapture %} + {% capture onclick_string %}onclick="{{ experimental_download_js }}"{% endcapture %} + {% capture linux_arm_button_text_addendum %}{% if r.linux.linux_arm_experimental == true %}
    (Experimental){% endif %}{% if r.linux.linux_arm_limited_access == true %}
    (Limited Access){% endif %}{% endcapture %} + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Operating SystemArchitectureFull executableSQL-only executable
    LinuxIntelcockroach-{{ release.release_name }}.linux-amd64.tgz {% if r.has_sha256sum == true %}
    (SHA256){% endif %}
    {% if release.has_sql_only == true %}cockroach-sql-{{ release.release_name }}.linux-amd64.tgz{% if r.has_sha256sum == true %}
    (SHA256){% endif %}{% endif %}
    ARMcockroach-{{ release.release_name }}.linux-arm64.tgz {{linux_arm_button_text_addendum}}{% if r.has_sha256sum == true %}
    (SHA256{% endif %})
    {% if release.has_sql_only == true %}cockroach-sql-{{ release.release_name }}.linux-arm64.tgz {{linux_arm_button_text_addendum}}{% if r.has_sha256sum == true %}
    (SHA256){% endif %}{% endif %}
    Mac
    (Experimental)
    Intelcockroach-{{ release.release_name }}.darwin-10.9-amd64.tgz {% if r.has_sha256sum == true %}
    (SHA256){% endif %}
    {% if release.has_sql_only == true %}cockroach-sql-{{ release.release_name }}.darwin-10.9-amd64.tgz{% if r.has_sha256sum == true %}
    (SHA256){% endif %}{% endif %}
    ARMcockroach-{{ release.release_name }}.darwin-11.0-arm64.tgz{% if r.has_sha256sum == true %}
    (SHA256){% endif %}
    {% if release.has_sql_only == true %}cockroach-sql-{{ release.release_name }}.darwin-11.0-arm64.tgz{% if r.has_sha256sum == true %}
    (SHA256){% endif %}{% endif %}
    Windows
    (Experimental)
    Intelcockroach-{{ release.release_name }}.windows-6.2-amd64.zip{% if r.has_sha256sum == true %}
    (SHA256){% endif %}
    {% if release.has_sql_only == true %}cockroach-sql-{{ release.release_name }}.windows-6.2-amd64.zip{% if r.has_sha256sum == true %}
    (SHA256){% endif %}{% endif %}
    + +

    Docker image

    + + {% if release.docker.docker_arm == true %} +[Multi-platform images](https://docs.docker.com/build/building/multi-platform/) include support for both Intel and ARM. Multi-platform images do not take up additional space on your Docker host. + + {% if release.docker.docker_arm_limited_access == true %} +Within the multi-platform image:
    • The ARM image is in **Limited Access**.
    • The Intel image is **Generally Available** for production use.
    + {% elsif release.docker.docker_arm_experimental == true %} +Within the multi-platform image:
    • The ARM image is **Experimental** and not yet qualified for production use and not eligible for support or uptime SLA commitments.
    • The Intel image is **Generally Available** for production use.
    + {% else %} +Within the multi-platform image, both Intel and ARM images are **generally available** for production use. + {% endif %} + +To download the Docker image: + {% else %} +To download the Docker image (Intel-only): + {% endif %} + +{% include_cached copy-clipboard.html %} +~~~shell +docker pull {{ release.docker.docker_image }}:{{ release.release_name }} +~~~ + +

    Source tag

    + +To view or download the source code for CockroachDB {{ release.release_name }} on Github, visit {{ release.release_name }} source tag. + + {% if release.previous_release %} +

    Changelog

    +View a detailed changelog on GitHub: [{{ release.previous_release }}...{{ release.release_name }}](https://github.com/cockroachdb/cockroach/compare/{{ release.previous_release }}...{{ release.release_name }}) + {% endif %} + +{% endif %} diff --git a/src/current/_includes/releases/release-downloads-docker-image.md b/src/current/_includes/releases/release-downloads-docker-image.md index 14009e925c2..95a811c3d33 100644 --- a/src/current/_includes/releases/release-downloads-docker-image.md +++ b/src/current/_includes/releases/release-downloads-docker-image.md @@ -1,3 +1,4 @@ +{% comment %}This include is used only in v22.2 and below. Older versions use release-downloads-docker-image.md. {% endcomment %} {% assign release = site.data.releases | where_exp: "release", "release.release_name == include.release" | first %} {% assign version = site.data.versions | where_exp: "version", "version.major_version == release.major_version" | first %} @@ -25,7 +26,7 @@ Experimental downloads are not qualified for production use and not eligible for {% capture experimental_download_js %}{% include_cached releases/experimental_download_dialog.md %}{% endcapture %} {% capture onclick_string %}onclick="{{ experimental_download_js }}"{% endcapture %} -
    +
    {% if release.linux.linux_arm == true %} diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.1.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.1.md index 070fe0c8c31..f9a2115bd85 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.1.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.1.md @@ -2,7 +2,7 @@ Release Date: December 19, 2022 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.2.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.2.md index d8d57276b29..04c3ec774d9 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.2.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.2.md @@ -2,7 +2,7 @@ Release Date: February 13, 2022 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.3.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.3.md index 8c55ea76dc3..b161441e5d7 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.3.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.3.md @@ -2,7 +2,7 @@ Release Date: February 21, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.4.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.4.md index f24b5aba37b..22a5e6e2041 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.4.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.4.md @@ -2,7 +2,7 @@ Release Date: February 27, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.5.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.5.md index 13fe2eb2e34..b35fd4d8f6c 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.5.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.5.md @@ -2,7 +2,7 @@ Release Date: March 6, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.6.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.6.md index f1995ee0e70..8e21d1dae7c 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.6.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.6.md @@ -2,7 +2,7 @@ Release Date: March 13, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.7.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.7.md index 860d65b8c38..7a908a9a498 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.7.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.7.md @@ -2,7 +2,7 @@ Release Date: March 20, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.8.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.8.md index 83566d32b54..6617da3f750 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.8.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.8.md @@ -2,7 +2,7 @@ Release Date: March 27, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.9.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.9.md index 25ce89f2861..1ec8d1aa96d 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.9.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.9.md @@ -2,7 +2,7 @@ Release Date: April 4, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-beta.1.md b/src/current/_includes/releases/v23.1/v23.1.0-beta.1.md index d90783f13b3..4f22a1a4601 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-beta.1.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-beta.1.md @@ -2,7 +2,7 @@ Release Date: April 13, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-beta.2.md b/src/current/_includes/releases/v23.1/v23.1.0-beta.2.md index fb77b43fe15..0e47c964ad1 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-beta.2.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-beta.2.md @@ -2,7 +2,7 @@ Release Date: April 17, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-beta.3.md b/src/current/_includes/releases/v23.1/v23.1.0-beta.3.md index cb2d0ba34fc..ac37fbc1402 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-beta.3.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-beta.3.md @@ -2,7 +2,7 @@ Release Date: April 24, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-rc.1.md b/src/current/_includes/releases/v23.1/v23.1.0-rc.1.md index d97e46bc2e8..0b41f9eb609 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-rc.1.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-rc.1.md @@ -2,7 +2,7 @@ Release Date: May 2, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-rc.2.md b/src/current/_includes/releases/v23.1/v23.1.0-rc.2.md index 9015eab3cc5..8da919350b2 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-rc.2.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-rc.2.md @@ -2,7 +2,7 @@ Release Date: May 4, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0.md b/src/current/_includes/releases/v23.1/v23.1.0.md index 89d652811d9..cd65a6571dc 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0.md +++ b/src/current/_includes/releases/v23.1/v23.1.0.md @@ -4,7 +4,7 @@ Release Date: May 15, 2023 With the release of CockroachDB v23.1, we've added new capabilities in CockroachDB to help you migrate, build, and operate more efficiently. Check out a [summary of the most significant user-facing changes](#v23-1-0-feature-highlights) and then [upgrade to CockroachDB v23.1](https://www.cockroachlabs.com/docs/v23.1/upgrade-cockroach-version). -{% include releases/release-downloads-docker-image.md release=include.release advisory_key="a103220"%} +{% include releases/new-release-downloads-docker-image.md release=include.release advisory_key="a103220"%}

    Feature highlights

    @@ -32,6 +32,8 @@ The features highlighted below are freely available in CockroachDB {{ site.data. } +
    +

    SQL

    Queries
    @@ -429,6 +431,8 @@ This change will only apply to new clusters. Existing clusters will retain the 2 +
    +

    Backward-incompatible changes

    Before [upgrading to CockroachDB v23.1](https://www.cockroachlabs.com/docs/v23.1/upgrade-cockroach-version), be sure to review the following backward-incompatible changes, as well as key cluster setting changes, and adjust your deployment as necessary. diff --git a/src/current/_includes/releases/v23.1/v23.1.1.md b/src/current/_includes/releases/v23.1/v23.1.1.md index 593beea4824..8098b813b27 100644 --- a/src/current/_includes/releases/v23.1/v23.1.1.md +++ b/src/current/_includes/releases/v23.1/v23.1.1.md @@ -2,7 +2,7 @@ Release Date: May 16, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.10.md b/src/current/_includes/releases/v23.1/v23.1.10.md index fb5db56f9e5..63e6b1f0015 100644 --- a/src/current/_includes/releases/v23.1/v23.1.10.md +++ b/src/current/_includes/releases/v23.1/v23.1.10.md @@ -2,7 +2,7 @@ Release Date: September 18, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.11.md b/src/current/_includes/releases/v23.1/v23.1.11.md index c888032e31f..cc6ab8d2b3b 100644 --- a/src/current/_includes/releases/v23.1/v23.1.11.md +++ b/src/current/_includes/releases/v23.1/v23.1.11.md @@ -2,7 +2,7 @@ Release Date: October 2, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.12.md b/src/current/_includes/releases/v23.1/v23.1.12.md index 04d969044aa..f82e0ee773e 100644 --- a/src/current/_includes/releases/v23.1/v23.1.12.md +++ b/src/current/_includes/releases/v23.1/v23.1.12.md @@ -2,7 +2,7 @@ Release Date: November 13, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.13.md b/src/current/_includes/releases/v23.1/v23.1.13.md index d2a14a51091..25745b30199 100644 --- a/src/current/_includes/releases/v23.1/v23.1.13.md +++ b/src/current/_includes/releases/v23.1/v23.1.13.md @@ -2,7 +2,7 @@ Release Date: December 11, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.14.md b/src/current/_includes/releases/v23.1/v23.1.14.md index a47a633ac6b..546e625a65b 100644 --- a/src/current/_includes/releases/v23.1/v23.1.14.md +++ b/src/current/_includes/releases/v23.1/v23.1.14.md @@ -2,7 +2,7 @@ Release Date: January 17, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    @@ -17,16 +17,16 @@ Release Date: January 17, 2024 - The [**Cluster Overview** page](https://www.cockroachlabs.com/docs/v23.1/ui-cluster-overview-page) now correctly renders the background color for email signups, fixing an issue where it was difficult to read the text. [#114546][#114546] - Updated the **CPU Time** label to **SQL CPU Time** on the [Overview page](https://www.cockroachlabs.com/docs/v23.1/ui-overview-dashboard) and clarified the tooltip. [#116448][#116448] -- Fixed an issue where the following `AggHistogram`-powered metrics reported quantiles incorrectly in the [Overview page](https://www.cockroachlabs.com/docs/v23.1/ui-overview-dashboard). The list of affected metrics is: - - `changefeed.message_size_hist` - - `changefeed.parallel_io_queue_nanos` - - `changefeed.sink_batch_hist_nanos` - - `changefeed.flush_hist_nanos` - - `changefeed.commit_latency` - - `changefeed.admit_latency` - - `jobs.row_level_ttl.span_total_duration` - - `jobs.row_level_ttl.select_duration` - - `jobs.row_level_ttl.delete_duration` +- Fixed an issue where the following `AggHistogram`-powered metrics reported quantiles incorrectly in the [Overview page](https://www.cockroachlabs.com/docs/v23.1/ui-overview-dashboard). The list of affected metrics is: + - `changefeed.message_size_hist` + - `changefeed.parallel_io_queue_nanos` + - `changefeed.sink_batch_hist_nanos` + - `changefeed.flush_hist_nanos` + - `changefeed.commit_latency` + - `changefeed.admit_latency` + - `jobs.row_level_ttl.span_total_duration` + - `jobs.row_level_ttl.select_duration` + - `jobs.row_level_ttl.delete_duration` This bug affected only DB Console dashboards and not the Prometheus-compatible endpoint `/_status/vars`. [#114747][#114747] - In the **SQL Activity Transaction Details** page, you can now view a transaction fingerprint ID across multiple applications by passing a comma-separated encoded string of transaction fingerprint IDs in the `appNames` URL search parameter. [#116102][#116102] diff --git a/src/current/_includes/releases/v23.1/v23.1.15.md b/src/current/_includes/releases/v23.1/v23.1.15.md index 2c1ba09eb34..732fcea9b4b 100644 --- a/src/current/_includes/releases/v23.1/v23.1.15.md +++ b/src/current/_includes/releases/v23.1/v23.1.15.md @@ -2,7 +2,7 @@ Release Date: February 20, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    @@ -71,4 +71,3 @@ We would like to thank the following contributors from the CockroachDB community [566a30300]: https://github.com/cockroachdb/cockroach/commit/566a30300 [7667710a0]: https://github.com/cockroachdb/cockroach/commit/7667710a0 [ce971160e]: https://github.com/cockroachdb/cockroach/commit/ce971160e - diff --git a/src/current/_includes/releases/v23.1/v23.1.16.md b/src/current/_includes/releases/v23.1/v23.1.16.md index bf41904e4a4..f6040c4ed7a 100644 --- a/src/current/_includes/releases/v23.1/v23.1.16.md +++ b/src/current/_includes/releases/v23.1/v23.1.16.md @@ -2,7 +2,7 @@ Release Date: February 27, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.17.md b/src/current/_includes/releases/v23.1/v23.1.17.md index 798cb9438ff..9ff6f415e85 100644 --- a/src/current/_includes/releases/v23.1/v23.1.17.md +++ b/src/current/_includes/releases/v23.1/v23.1.17.md @@ -2,7 +2,7 @@ Release Date: March 19, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.18.md b/src/current/_includes/releases/v23.1/v23.1.18.md index ed5e3422fa0..932db309005 100644 --- a/src/current/_includes/releases/v23.1/v23.1.18.md +++ b/src/current/_includes/releases/v23.1/v23.1.18.md @@ -2,7 +2,7 @@ Release Date: April 9, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.19.md b/src/current/_includes/releases/v23.1/v23.1.19.md index 1aca1134d2d..ecae59e1828 100644 --- a/src/current/_includes/releases/v23.1/v23.1.19.md +++ b/src/current/_includes/releases/v23.1/v23.1.19.md @@ -2,7 +2,7 @@ Release Date: April 18, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.2.md b/src/current/_includes/releases/v23.1/v23.1.2.md index db689d992b3..595b8442645 100644 --- a/src/current/_includes/releases/v23.1/v23.1.2.md +++ b/src/current/_includes/releases/v23.1/v23.1.2.md @@ -2,7 +2,7 @@ Release Date: May 30, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    @@ -122,11 +122,11 @@ Release Date: May 30, 2023 - Fixed a bug where [`COPY`](https://www.cockroachlabs.com/docs/v23.1/copy-from) in v23.1.0 and beta versions would incorrectly encode data with multiple column families. The data must be dropped and re-imported to be encoded correctly. [#103355][#103355] - Optimized over-head of [`pg_catalog.pg_description`](https://www.cockroachlabs.com/docs/v23.1/pg-catalog) and [`pg_catalog.pg_shdescription`](https://www.cockroachlabs.com/docs/v23.1/pg-catalog), which can lead to performance regression relative to v22.2 [#103331][#103331] - Timeseries [metric](https://www.cockroachlabs.com/docs/v23.1/metrics) counts will now show cumulative counts for a histogram rather than a windowed count. A `-sum` timeseries is also exported to keep track of the cumulative sum of all samples in the histogram. [#103444][#103444] -- Fixed a bug where CockroachDB could produce incorrect results when evaluating queries with [`ORDER BY`](https://www.cockroachlabs.com/docs/v23.1/order-by) clause in rare circumstances. In particular, some rows could be duplicated if all of the following conditions were met: +- Fixed a bug where CockroachDB could produce incorrect results when evaluating queries with [`ORDER BY`](https://www.cockroachlabs.com/docs/v23.1/order-by) clause in rare circumstances. In particular, some rows could be duplicated if all of the following conditions were met: 1. The query had a `LIMIT` clause. 1. The `SORT` operation had to spill to disk (meaning that `LIMIT` number of rows used up non-trivial amounts of memory, e.g. the rows were "wide"). - 1. The `ORDER BY` clause contained multiple columns **and** the ordering on the prefix of those columns was already provided by the index. - + 1. The `ORDER BY` clause contained multiple columns **and** the ordering on the prefix of those columns was already provided by the index. + The bug has been present since at least v22.1. [#102790][#102790] - Fixed a bug where CockroachDB could previously encounter a nil pointer crash when populating data for [SQL Activity](https://www.cockroachlabs.com/docs/v23.1/ui-overview#sql-activity) page in some rare cases. The bug was present in v22.2.9 and v23.1.1 releases. [#103521][#103521] - Fixed calls to undefined objects. [#103520][#103520] @@ -153,8 +153,8 @@ Release Date: May 30, 2023 - Improved performance when joining with the `pg_description` table. [#103331][#103331] - Added concurrency to speed up the phase of the [restore](https://www.cockroachlabs.com/docs/v23.1/restore) that ingests backed up table statisitcs. [#102694][#102694] - Added support for constrained scans using computed columns which are part of an [index](https://www.cockroachlabs.com/docs/v23.1/indexes) when there is an `IN` list or `OR`'ed predicate on the columns that appear in the computed column expression. [#103412][#103412] -- Added two new statistics which are useful for tracking the efficiency of [snapshot transfers](https://www.cockroachlabs.com/docs/v23.1/architecture/replication-layer#snapshots). Some snapshots will always fail due to system level "races", but the goal is to keep it as low as possible. - - `range.snapshots.recv-failed` - The number of snapshots sent attempts that are initiated but not accepted by the recipient. +- Added two new statistics which are useful for tracking the efficiency of [snapshot transfers](https://www.cockroachlabs.com/docs/v23.1/architecture/replication-layer#snapshots). Some snapshots will always fail due to system level "races", but the goal is to keep it as low as possible. + - `range.snapshots.recv-failed` - The number of snapshots sent attempts that are initiated but not accepted by the recipient. - `range.snapshots.recv-unusable` - The number of snapshots that were fully transmitted but not used. [#101837][#101837]

    Build changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.3.md b/src/current/_includes/releases/v23.1/v23.1.3.md index 11efcc273c1..2fa09a04c6c 100644 --- a/src/current/_includes/releases/v23.1/v23.1.3.md +++ b/src/current/_includes/releases/v23.1/v23.1.3.md @@ -6,7 +6,7 @@ Release Date: June 13, 2023 A [bug](https://github.com/cockroachdb/cockroach/issues/104798) was discovered in a change included in v23.1.3 (this release). This bug can affect clusters upgrading to v23.1.3 from [v22.2.x]({% link releases/v22.2.md %}). In an affected cluster, jobs that were running during the upgrade could hang or fail to run after the upgrade is finalized. Users upgrading from v22.2.x are advised to use [v23.1.2](#v23-1-2) to upgrade, or to set the [`cluster.preserve_downgrade_option`](https://www.cockroachlabs.com/docs/v23.1/upgrade-cockroach-version#step-3-decide-how-the-upgrade-will-be-finalized) cluster setting to delay finalization of the upgrade until they can upgrade to v23.1.4. {{site.data.alerts.end}} -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.4.md b/src/current/_includes/releases/v23.1/v23.1.4.md index a712fd8832a..5aec9530091 100644 --- a/src/current/_includes/releases/v23.1/v23.1.4.md +++ b/src/current/_includes/releases/v23.1/v23.1.4.md @@ -2,7 +2,7 @@ Release Date: June 20, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.5.md b/src/current/_includes/releases/v23.1/v23.1.5.md index 34493bc3338..96e04fed756 100644 --- a/src/current/_includes/releases/v23.1/v23.1.5.md +++ b/src/current/_includes/releases/v23.1/v23.1.5.md @@ -2,7 +2,7 @@ Release Date: July 5, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.6.md b/src/current/_includes/releases/v23.1/v23.1.6.md index 68876c7b85e..18fd56abd79 100644 --- a/src/current/_includes/releases/v23.1/v23.1.6.md +++ b/src/current/_includes/releases/v23.1/v23.1.6.md @@ -2,22 +2,22 @@ Release Date: July 24, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    - Fixed a bug in v23.1.5 where [debug zips](https://www.cockroachlabs.com/docs/v23.1/cockroach-debug-zip) were empty in the `crdb_internal.cluster_settings.txt` file. Debug zips now properly show the information from `cluster_settings`. [#107105][#107105] - Fixed a bug where some primary indexes would incorrectly be treated internally as secondary indexes, which could cause schema change operations to fail. The bug could occur if [`ALTER PRIMARY KEY`](https://www.cockroachlabs.com/docs/v23.1/alter-table#alter-primary-key) was used on v21.1 or earlier, and the cluster was upgraded. [#106426][#106426] -- Extended the `cockroach debug doctor` to detect [indexes](https://www.cockroachlabs.com/docs/v23.1/indexes) which could potentially lose data by being dropped when a column is stored inside them and added a check inside [`DROP INDEX`](https://www.cockroachlabs.com/docs/v23.1/drop-index) to prevent dropping indexes with this problem to avoid data loss. [#106863][#106863] +- Extended the `cockroach debug doctor` to detect [indexes](https://www.cockroachlabs.com/docs/v23.1/indexes) which could potentially lose data by being dropped when a column is stored inside them and added a check inside [`DROP INDEX`](https://www.cockroachlabs.com/docs/v23.1/drop-index) to prevent dropping indexes with this problem to avoid data loss. [#106863][#106863]

    Contributors

    -This release includes 3 merged PRs by 15 authors. +This release includes 3 merged PRs by 15 authors.
    [#106863]: https://github.com/cockroachdb/cockroach/pull/106863 [#106426]: https://github.com/cockroachdb/cockroach/pull/106426 -[#107105]: https://github.com/cockroachdb/cockroach/pull/107105 \ No newline at end of file +[#107105]: https://github.com/cockroachdb/cockroach/pull/107105 diff --git a/src/current/_includes/releases/v23.1/v23.1.7.md b/src/current/_includes/releases/v23.1/v23.1.7.md index fc863616e63..9784e30fdb6 100644 --- a/src/current/_includes/releases/v23.1/v23.1.7.md +++ b/src/current/_includes/releases/v23.1/v23.1.7.md @@ -2,7 +2,7 @@ Release Date: July 31, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.8.md b/src/current/_includes/releases/v23.1/v23.1.8.md index 1c529d95e80..43b294d26a2 100644 --- a/src/current/_includes/releases/v23.1/v23.1.8.md +++ b/src/current/_includes/releases/v23.1/v23.1.8.md @@ -2,7 +2,7 @@ Release Date: August 7, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.9.md b/src/current/_includes/releases/v23.1/v23.1.9.md index 5c9d7f5b71f..bfc1470fc0a 100644 --- a/src/current/_includes/releases/v23.1/v23.1.9.md +++ b/src/current/_includes/releases/v23.1/v23.1.9.md @@ -2,7 +2,7 @@ Release Date: September 7, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md index 785b56990ef..ee50d8cf863 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md @@ -2,7 +2,7 @@ Release Date: September 26, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.2.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.2.md index f8047b87ca8..bdc5629c8b9 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.2.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.2.md @@ -2,7 +2,7 @@ Release Date: October 2, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.3.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.3.md index 5691946d35c..7c1c2745839 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.3.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.3.md @@ -2,7 +2,7 @@ Release Date: October 10, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.4.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.4.md index 5b28efae3ab..cf51f02ae8e 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.4.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.4.md @@ -2,7 +2,7 @@ Release Date: October 23, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.5.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.5.md index 036524d6713..4a6d73c0c02 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.5.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.5.md @@ -2,7 +2,7 @@ Release Date: October 30, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.6.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.6.md index 02f11c49003..cef93cd3f22 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.6.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.6.md @@ -2,7 +2,7 @@ Release Date: November 7, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.7.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.7.md index deb0b8786cb..521e43cd835 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.7.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.7.md @@ -2,7 +2,7 @@ Release Date: November 20, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-beta.1.md b/src/current/_includes/releases/v23.2/v23.2.0-beta.1.md index 1c1aafc07bb..674020e46e1 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-beta.1.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-beta.1.md @@ -2,7 +2,7 @@ Release Date: November 27, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    @@ -28,4 +28,4 @@ This release includes 33 merged PRs by 21 authors. [#114535]: https://github.com/cockroachdb/cockroach/pull/114535 [#114547]: https://github.com/cockroachdb/cockroach/pull/114547 [#114830]: https://github.com/cockroachdb/cockroach/pull/114830 -[#114833]: https://github.com/cockroachdb/cockroach/pull/114833 \ No newline at end of file +[#114833]: https://github.com/cockroachdb/cockroach/pull/114833 diff --git a/src/current/_includes/releases/v23.2/v23.2.0-beta.2.md b/src/current/_includes/releases/v23.2/v23.2.0-beta.2.md index ae87be0deff..2eb5033f704 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-beta.2.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-beta.2.md @@ -2,7 +2,7 @@ Release Date: December 5, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-beta.3.md b/src/current/_includes/releases/v23.2/v23.2.0-beta.3.md index ccd879f95f7..b99be77d2a6 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-beta.3.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-beta.3.md @@ -2,7 +2,7 @@ Release Date: December 13, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-rc.1.md b/src/current/_includes/releases/v23.2/v23.2.0-rc.1.md index 105ad186d41..be9223ac6d7 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-rc.1.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-rc.1.md @@ -2,7 +2,7 @@ Release Date: December 21, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-rc.2.md b/src/current/_includes/releases/v23.2/v23.2.0-rc.2.md index 942757d133a..7cdcddc0a66 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-rc.2.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-rc.2.md @@ -2,7 +2,7 @@ Release Date: January 9, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0.md b/src/current/_includes/releases/v23.2/v23.2.0.md index 36933a62ac7..c4a60255be8 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0.md +++ b/src/current/_includes/releases/v23.2/v23.2.0.md @@ -4,7 +4,7 @@ Release Date: February 5, 2024 With the release of CockroachDB v23.2, we've added new capabilities to help you migrate, build, and operate more efficiently. See our summary of the most significant user-facing changes under [Feature Highlights](#v23-2-0-feature-highlights). -{% include releases/release-downloads-docker-image.md release=include.release advisory_key="a103220"%} +{% include releases/new-release-downloads-docker-image.md release=include.release advisory_key="a103220"%}

    Feature highlights

    @@ -23,49 +23,12 @@ This section summarizes the most significant user-facing changes in v23.2.0 and - [Known limitations](#v23-2-0-known-limitations) - [Additional resources](#v23-2-0-additional-resources) - - {{ site.data.alerts.callout_info }} In CockroachDB Self-Hosted, all available features are free to use unless their description specifies that an Enterprise license is required. For more information, see the [Licensing FAQ](https://www.cockroachlabs.com/docs/stable/licensing-faqs). {{ site.data.alerts.end }} +
    +

    Observability

    @@ -380,6 +343,8 @@ In CockroachDB Self-Hosted, all available features are free to use unless their
    +
    +

    Backward-incompatible changes

    Before [upgrading to CockroachDB v23.2]({% link v23.2/upgrade-cockroach-version.md %}), be sure to review the following backward-incompatible changes, as well as [key cluster setting changes](#v23-2-0-cluster-settings), and adjust your deployment as necessary. diff --git a/src/current/_includes/releases/v23.2/v23.2.1.md b/src/current/_includes/releases/v23.2/v23.2.1.md index 3b4ed063546..929ae6c47c9 100644 --- a/src/current/_includes/releases/v23.2/v23.2.1.md +++ b/src/current/_includes/releases/v23.2/v23.2.1.md @@ -2,7 +2,7 @@ Release Date: February 20, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.2/v23.2.2.md b/src/current/_includes/releases/v23.2/v23.2.2.md index acc6b3b0d20..59485e3d30f 100644 --- a/src/current/_includes/releases/v23.2/v23.2.2.md +++ b/src/current/_includes/releases/v23.2/v23.2.2.md @@ -2,7 +2,7 @@ Release Date: February 27, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.3.md b/src/current/_includes/releases/v23.2/v23.2.3.md index f7f88b45031..a03ac245ca0 100644 --- a/src/current/_includes/releases/v23.2/v23.2.3.md +++ b/src/current/_includes/releases/v23.2/v23.2.3.md @@ -2,7 +2,7 @@ Release Date: March 20, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    @@ -110,4 +110,4 @@ This release includes 118 merged PRs by 42 authors. [#119738]: https://github.com/cockroachdb/cockroach/pull/119738 [#119768]: https://github.com/cockroachdb/cockroach/pull/119768 [#120076]: https://github.com/cockroachdb/cockroach/pull/120076 -[#120245]: https://github.com/cockroachdb/cockroach/pull/120245 \ No newline at end of file +[#120245]: https://github.com/cockroachdb/cockroach/pull/120245 diff --git a/src/current/_includes/releases/v23.2/v23.2.4.md b/src/current/_includes/releases/v23.2/v23.2.4.md index 15a74769583..f6b48661f8d 100644 --- a/src/current/_includes/releases/v23.2/v23.2.4.md +++ b/src/current/_includes/releases/v23.2/v23.2.4.md @@ -2,7 +2,7 @@ Release Date: April 11, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    @@ -53,4 +53,4 @@ This release includes 65 merged PRs by 37 authors [#120396]: https://github.com/cockroachdb/cockroach/pull/120396 [#120933]: https://github.com/cockroachdb/cockroach/pull/120933 [#121329]: https://github.com/cockroachdb/cockroach/pull/121329 -[#121875]: https://github.com/cockroachdb/cockroach/pull/121875 \ No newline at end of file +[#121875]: https://github.com/cockroachdb/cockroach/pull/121875 diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md index 2ef2e4e9721..ee2f25d8dab 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md @@ -2,7 +2,7 @@ Release Date: March 7, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.2.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.2.md index 8e57623d088..ea68a2f6e10 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.2.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.2.md @@ -2,7 +2,7 @@ Release Date: March 11, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.3.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.3.md index 49b65e3da53..a9c256e8cf7 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.3.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.3.md @@ -2,7 +2,7 @@ Release Date: March 18, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    @@ -72,5 +72,3 @@ We would like to thank the following contributors from the CockroachDB community [#120097]: https://github.com/cockroachdb/cockroach/pull/120097 [#120137]: https://github.com/cockroachdb/cockroach/pull/120137 [#120145]: https://github.com/cockroachdb/cockroach/pull/120145 - - diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md index bfea86439dc..0d48352728c 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md @@ -2,7 +2,7 @@ Release Date: March 25, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md index b8f0b770c62..e9e58c7fe06 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md @@ -2,7 +2,7 @@ Release Date: April 1, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-beta.1.md b/src/current/_includes/releases/v24.1/v24.1.0-beta.1.md index 5b59305b6c2..4a0ee755e5f 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-beta.1.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-beta.1.md @@ -2,7 +2,7 @@ Release Date: April 17, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-beta.2.md b/src/current/_includes/releases/v24.1/v24.1.0-beta.2.md index 6f5a9f0a481..d4110a09d5a 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-beta.2.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-beta.2.md @@ -2,7 +2,7 @@ Release Date: April 24, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/sidebar-all-releases.json b/src/current/_includes/sidebar-all-releases.json index ec03c02ae25..266f6be8432 100644 --- a/src/current/_includes/sidebar-all-releases.json +++ b/src/current/_includes/sidebar-all-releases.json @@ -1,5 +1,17 @@ {%- assign versions = site.data.versions | where_exp: "versions", "versions.major_version != site.versions['dev']" | where_exp: "versions", "versions.major_version != site.versions['stable']" | map: "major_version" -%} {%- comment -%} versions iterates through the list of major versions (e.g., v21.2) in _data/versions.csv and returns all releases that are not dev or stable. We then pull only the major version name instead of the whole dictionary with map: "major_version" {%- endcomment -%} +{ + "title": "Latest Production Release", + "urls": [ + "/releases/{{ site.versions["stable"] }}.html" + ] +}{% unless site.versions["stable"] == site.versions["dev"] %}, +{ + "title": "Latest Testing Release", + "urls": [ + "/releases/{{ site.versions["dev"] }}.html" + ] +}{% endunless %}, { "title": "CockroachDB Releases", "urls": [ @@ -7,13 +19,7 @@ "/releases/" {% for v in versions %} ,"/releases/{{ v }}.html" - {% endfor %} - ] -}, -{ - "title": "CockroachDB Kubernetes Operator", - "urls": [ - "/releases/kubernetes-operator.html" + {% endfor %} ] }, { @@ -43,4 +49,16 @@ ,"{{ x.url }}" {% endfor %} ] +}, +{ + "title": "Cloud Releases", + "urls": [ + "/releases/cloud.html" + ] +}, +{ + "title": "Kubernetes Operator", + "urls": [ + "/releases/kubernetes-operator.html" + ] } diff --git a/src/current/_includes/sidebar-data-v23.2.json b/src/current/_includes/sidebar-data-v23.2.json index d253cde31b1..f2aedcaf392 100644 --- a/src/current/_includes/sidebar-data-v23.2.json +++ b/src/current/_includes/sidebar-data-v23.2.json @@ -7,7 +7,7 @@ ] }, {% include_cached v23.2/sidebar-data/get-started.json %}, - {% include_cached v23.2/sidebar-data/latest-releases.json %}, + {% include_cached v23.2/sidebar-data/releases.json %}, {% include_cached v23.2/sidebar-data/feature-overview.json %}, {% include_cached v23.2/sidebar-data/connect-to-cockroachdb.json %}, {% include_cached v23.2/sidebar-data/migrate.json %}, @@ -22,6 +22,5 @@ {% include_cached v23.2/sidebar-data/sql.json %}, {% include_cached v23.2/sidebar-data/reference.json %}, {% include_cached v23.2/sidebar-data/faqs.json %}, - {% include_cached v23.2/sidebar-data/releases.json %}, {% include_cached sidebar-data-cockroach-university.json %} ] diff --git a/src/current/_includes/sidebar-data-v24.1.json b/src/current/_includes/sidebar-data-v24.1.json index 5401d2dd934..d9eb75825d8 100644 --- a/src/current/_includes/sidebar-data-v24.1.json +++ b/src/current/_includes/sidebar-data-v24.1.json @@ -7,7 +7,7 @@ ] }, {% include_cached v24.1/sidebar-data/get-started.json %}, - {% include_cached v24.1/sidebar-data/latest-releases.json %}, + {% include_cached v24.1/sidebar-data/releases.json %}, {% include_cached v24.1/sidebar-data/feature-overview.json %}, {% include_cached v24.1/sidebar-data/connect-to-cockroachdb.json %}, {% include_cached v24.1/sidebar-data/migrate.json %}, @@ -22,6 +22,5 @@ {% include_cached v24.1/sidebar-data/sql.json %}, {% include_cached v24.1/sidebar-data/reference.json %}, {% include_cached v24.1/sidebar-data/faqs.json %}, - {% include_cached v24.1/sidebar-data/releases.json %}, {% include_cached sidebar-data-cockroach-university.json %} ] diff --git a/src/current/_includes/sidebar-releases.json b/src/current/_includes/sidebar-releases.json index 92e4984ad0c..26a6c95da8a 100644 --- a/src/current/_includes/sidebar-releases.json +++ b/src/current/_includes/sidebar-releases.json @@ -7,8 +7,20 @@ {% assign v_test = site.data.versions | where_exp: "v_test", "v_test.release_date == 'N/A'" | sort: "release_date" | last | map: "major_version" %} {% comment %} v_test iterates through the list of major versions in _data/versions.csv and returns the single latest testing version (if the release date is in the future or not otherwise specified). It's possible there is no testing release (in between GA of a version and the first alpha of the following version). {% endcomment %} { - "title": "CockroachDB", + "title": "CockroachDB Releases", "items": [ + { + "title": "Latest Production Release", + "urls": [ + "/releases/{{ site.versions["stable"] }}.html" + ] + }{% unless site.versions["stable"] == site.versions["dev"] %}, + { + "title": "Latest Testing Release", + "urls": [ + "/releases/{{ site.versions["dev"] }}.html" + ] + },{% endunless %} { "title": "All Releases", "urls": [ @@ -23,15 +35,12 @@ ] }, {% endfor %} - {% if v_test[0] %} {% comment %} check if a testing version is available {% endcomment %} { - "title": "Latest Testing Release", + "title": "Staged Release Process", "urls": [ - {% comment %} check if a testing version is available and pull the latest testing version {% endcomment %} - "/releases/{{ v_test[0] }}.html" + "/releases/staged-release-process.html" ] }, - {% endif %} { "title": "Release Support Policy", "urls": [ @@ -46,18 +55,6 @@ } ] }, -{ - "title": "CockroachDB Cloud", - "urls": [ - "/releases/cloud.html" - ] -}, -{ - "title": "CockroachDB Kubernetes Operator", - "urls": [ - "/releases/kubernetes-operator.html" - ] -}, {% assign advisories = site.pages | where_exp: "advisories", "advisories.path contains 'advisories'" | where_exp: "advisories", "advisories.index != 'true'" %} { "title": "Technical Advisories", @@ -67,4 +64,16 @@ ,"{{ x.url }}" {% endfor %} ] +}, +{ + "title": "Cloud Releases", + "urls": [ + "/releases/cloud.html" + ] +}, +{ + "title": "Kubernetes Operator", + "urls": [ + "/releases/kubernetes-operator.html" + ] } diff --git a/src/current/_includes/unsupported-version.md b/src/current/_includes/unsupported-version.md index 4588b7babab..a29ce9a863c 100644 --- a/src/current/_includes/unsupported-version.md +++ b/src/current/_includes/unsupported-version.md @@ -1,15 +1,34 @@ {% assign x = site.data.versions | where_exp: "m", "m.major_version == include.major_version" | first %} -{% unless x.maint_supp_exp_date == "N/A" or x.asst_supp_exp_date == "N/A" %} +{% unless x.maint_supp_exp_date == "N/A" or x.asst_supp_exp_date == "N/A" %}{% comment %}Not yet GA{% endcomment %} {% assign today = "today" | date: "%s" %} {% comment %} Fetch today's date and format it in seconds. {% endcomment %} {% assign m = x.maint_supp_exp_date | date: "%s" %} {% comment %} Format m_raw in seconds. {% endcomment %} {% assign a = x.asst_supp_exp_date | date: "%s" %} {% comment %} Format a_raw in seconds. {% endcomment %} - {% if a < today %} {% comment %} If the assistance support expiration date has passed, show the unsupported message. {% endcomment %} + {% unless x.lts_maint_supp_exp_date == "N/A" or x.lts_asst_supp_exp_date == "N/A" %}{% comment %}No LTS releases{% endcomment %} + {% assign lm = x.lts_maint_supp_exp_date | date: "%s" %} {% comment %} Format m_raw in seconds. {% endcomment %} + {% assign la = x.lts_asst_supp_exp_date | date: "%s" %} {% comment %} Format a_raw in seconds. {% endcomment %} + {% endunless %} +{% endunless %} + + {% if la < today %} {% comment %} If the LTS assistance support expiration date has passed, show the unsupported message. {% endcomment %} + {{site.data.alerts.callout_danger}} + CockroachDB {{ include.major_version }} (LTS) is no longer supported as of {{ x.lts_asst_supp_exp_date | date: "%B %e, %Y"}}. For more details, refer to the Release Support Policy. + {{site.data.alerts.end}} + {% elsif la >= today and lm < today %}{% comment %} If the LTS maintenance support expiration has passed but the version is still within the LTS assistance support period, show this message and pass the LTS assistance support expiration date. {% endcomment %} + {{site.data.alerts.callout_danger}} + Cockroach Labs will stop providing LTS Assistance Support for {{ include.major_version }} on {{ x.lts_asst_supp_exp_date | date: "%B %e, %Y" }}. Prior to that date, upgrade to a more recent version to continue receiving support. For more details, refer to the Release Support Policy. + {{site.data.alerts.end}} + {% elsif a < today and lm > today %} {% comment %} If the assistance support expiration date has passed but the LTS maintenance phase has not {% endcomment %} + {% if la > today %} + {{site.data.alerts.callout_danger}} + GA releases for CockroachDB {{ include.major_version }} are no longer supported. Cockroach Labs will stop providing LTS Assistance Support for {{ include.major_version }} LTS releases on {{ x.lts_asst_supp_exp_date | date: "%B %e, %Y" }}. Prior to that date, upgrade to a more recent version to continue receiving support. For more details, refer to the Release Support Policy. + {{site.data.alerts.end}} + {% endif %} + {% elsif a < today %}{% comment %}show the unsupported message. {% endcomment %} {{site.data.alerts.callout_danger}} - CockroachDB {{ include.major_version }} is no longer supported. For more details, see the Release Support Policy. + CockroachDB {{ include.major_version }} is no longer supported as of {{ x.asst_supp_exp_date | date: "%B %e, %Y"}}. For more details, refer to the Release Support Policy. {{site.data.alerts.end}} {% elsif a >= today and m < today %} {% comment %} If the maintenance support expiration has passed but the version is still within the assistance support period, show this message and pass the assistance support expiration date. {% endcomment %} {{site.data.alerts.callout_danger}} - Cockroach Labs will stop providing Assistance Support for {{ include.major_version }} on {{ x.asst_supp_exp_date | date: "%B %e, %Y" }}. Prior to that date, upgrade to a more recent version to continue receiving support. For more details, see the Release Support Policy. + Cockroach Labs will stop providing Assistance Support for {{ include.major_version }} on {{ x.asst_supp_exp_date | date: "%B %e, %Y" }}. Prior to that date, upgrade to a more recent version to continue receiving support. For more details, refer to the Release Support Policy. {{site.data.alerts.end}} {% endif %} -{% endunless %} diff --git a/src/current/_includes/v23.2/sidebar-data/latest-releases.json b/src/current/_includes/v23.2/sidebar-data/latest-releases.json deleted file mode 100644 index e25f8c0fa7a..00000000000 --- a/src/current/_includes/v23.2/sidebar-data/latest-releases.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "title": "Latest Releases", - "is_top_level": true, - "items": [ - {% include_cached sidebar-latest-releases.json %} - ] - } diff --git a/src/current/_includes/v23.2/sidebar-data/releases.json b/src/current/_includes/v23.2/sidebar-data/releases.json index fb49f7c9acc..8ee555fdc9a 100644 --- a/src/current/_includes/v23.2/sidebar-data/releases.json +++ b/src/current/_includes/v23.2/sidebar-data/releases.json @@ -1,5 +1,5 @@ { - "title": "CockroachDB Releases", + "title": "Releases", "is_top_level": true, "items": [ {% include_cached sidebar-all-releases.json %} diff --git a/src/current/_includes/v24.1/sidebar-data/latest-releases.json b/src/current/_includes/v24.1/sidebar-data/latest-releases.json index e25f8c0fa7a..e69de29bb2d 100644 --- a/src/current/_includes/v24.1/sidebar-data/latest-releases.json +++ b/src/current/_includes/v24.1/sidebar-data/latest-releases.json @@ -1,7 +0,0 @@ -{ - "title": "Latest Releases", - "is_top_level": true, - "items": [ - {% include_cached sidebar-latest-releases.json %} - ] - } diff --git a/src/current/_includes/v24.1/sidebar-data/releases.json b/src/current/_includes/v24.1/sidebar-data/releases.json index fb49f7c9acc..18f2a1b7c6a 100644 --- a/src/current/_includes/v24.1/sidebar-data/releases.json +++ b/src/current/_includes/v24.1/sidebar-data/releases.json @@ -1,7 +1,7 @@ { - "title": "CockroachDB Releases", + "title": "Releases", "is_top_level": true, "items": [ - {% include_cached sidebar-all-releases.json %} + {% include_cached sidebar-releases.json %} ] } diff --git a/src/current/cockroachcloud/authorization.md b/src/current/cockroachcloud/authorization.md index c92c2ce1f92..426e9d79479 100644 --- a/src/current/cockroachcloud/authorization.md +++ b/src/current/cockroachcloud/authorization.md @@ -1,6 +1,6 @@ --- title: CockroachDB Cloud Access Management (Authorization) Overview -summary: Learn about the CockroachDB {{ site.data.products.cloud }} Authorization features and concepts +summary: Learn about CockroachDB Cloud authorization features and concepts toc: true docs_area: manage --- diff --git a/src/current/cockroachcloud/ccloud-faq.md b/src/current/cockroachcloud/ccloud-faq.md index a9feebb4436..b17c95c12ce 100644 --- a/src/current/cockroachcloud/ccloud-faq.md +++ b/src/current/cockroachcloud/ccloud-faq.md @@ -1,6 +1,6 @@ --- title: CockroachDB Cloud Access Management (Authorization) FAQ -summary: Frequently asked questions about CockroachDB {{ site.data.products.cloud }} +summary: Frequently asked questions about CockroachDB Cloud toc: true docs_area: manage --- diff --git a/src/current/cockroachcloud/cloud-sso-sql.md b/src/current/cockroachcloud/cloud-sso-sql.md index a0852729cc6..86afd9cdada 100644 --- a/src/current/cockroachcloud/cloud-sso-sql.md +++ b/src/current/cockroachcloud/cloud-sso-sql.md @@ -1,6 +1,6 @@ --- title: Cluster Single Sign-on (SSO) using the Cloud Console -summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB {{ site.data.products.cloud }}, review of authenticating users, configuring required cluster settings. +summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB Cloud, review of authenticating users, configuring required cluster settings. toc: true docs_area: manage --- diff --git a/src/current/cockroachcloud/cluster-overview-page.md b/src/current/cockroachcloud/cluster-overview-page.md index 27df7c9043d..66f8f10d35f 100644 --- a/src/current/cockroachcloud/cluster-overview-page.md +++ b/src/current/cockroachcloud/cluster-overview-page.md @@ -1,6 +1,6 @@ --- title: Cluster Overview Page -summary: How to use the Cluster Overview page to view cluster details on CockroachDB {{ site.data.products.cloud }}. +summary: How to use the Cluster Overview page to view cluster details on CockroachDB Cloud. toc: true docs_area: manage --- diff --git a/src/current/cockroachcloud/cmek.md b/src/current/cockroachcloud/cmek.md index c7f9f75a170..eb4603ff144 100644 --- a/src/current/cockroachcloud/cmek.md +++ b/src/current/cockroachcloud/cmek.md @@ -1,6 +1,6 @@ --- title: Customer-Managed Encryption Keys (CMEK) Overview -summary: Use cryptographic keys that you manage to protect data at rest in a CockroachDB {{ site.data.products.dedicated }} cluster. +summary: Use cryptographic keys that you manage to protect data at rest in a CockroachDB Cloud cluster. toc: true docs_area: manage.security cloud: true diff --git a/src/current/cockroachcloud/egress-perimeter-controls.md b/src/current/cockroachcloud/egress-perimeter-controls.md index e5abfb6ab42..8797fe43af1 100644 --- a/src/current/cockroachcloud/egress-perimeter-controls.md +++ b/src/current/cockroachcloud/egress-perimeter-controls.md @@ -1,6 +1,6 @@ --- title: Egress Perimeter Controls for CockroachDB Dedicated -summary: Learn how to configure Egress Perimeter Controls for enhanced network security on a CockroachDB {{ site.data.products.dedicated }} cluster. +summary: Learn how to configure Egress Perimeter Controls for enhanced network security on a CockroachDB Cloud cluster. toc: true toc_not_nested: true docs_area: security diff --git a/src/current/cockroachcloud/sql-audit-logging.md b/src/current/cockroachcloud/sql-audit-logging.md index 665a093d4e4..e11be58c2d9 100644 --- a/src/current/cockroachcloud/sql-audit-logging.md +++ b/src/current/cockroachcloud/sql-audit-logging.md @@ -1,6 +1,6 @@ --- title: SQL Audit Logging -summary: Learn about the SQL Audit Logging feature for CockroachDB {{ site.data.products.cloud }} clusters. +summary: Learn about the SQL Audit Logging feature for CockroachDB Cloud clusters. toc: true docs_area: manage --- diff --git a/src/current/cockroachcloud/upgrade-policy.md b/src/current/cockroachcloud/upgrade-policy.md index 14a2b906b20..3ac7718365d 100644 --- a/src/current/cockroachcloud/upgrade-policy.md +++ b/src/current/cockroachcloud/upgrade-policy.md @@ -1,46 +1,45 @@ --- -title: CockroachDB Cloud Upgrade Policy +title: CockroachDB Cloud Support and Upgrade Policy summary: Learn about the upgrade policy for clusters deployed in CockroachDB Cloud. toc: true docs_area: manage --- -This page describes the upgrade policy for CockroachDB {{ site.data.products.cloud }}. For self-hosted clusters, see the CockroachDB [Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). +This page describes the support and upgrade policy for clusters deployed in CockroachDB {{ site.data.products.cloud }}. For CockroachDB Self-Hosted, refer to the CockroachDB [Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). -Cockroach Labs uses a three-component calendar versioning scheme to name CockroachDB [releases](https://cockroachlabs.com/docs/releases/index#production-releases). The format is `YY.R.PP`, where `YY` indicates the year, `R` indicates the release (“1” or “2”, representing a typical biannual cycle), and `PP` indicates the patch release version. Example: Version 23.1.0 (abbreviated v23.1.0). Leading up to a new major version's initial GA (Generally Available) release, multiple testing builds are produced, moving from Alpha to Beta to Release Candidate. CockroachDB began using this versioning scheme with v19.1. For more details, refer to [Release Naming](https://cockroachlabs.com/docs/releases/index#release-naming). +Cockroach Labs uses a three-component calendar versioning scheme to name CockroachDB [releases](https://cockroachlabs.com/docs/releases/index#production-releases). The format is `YY.R.PP`, where `YY` indicates the year, `R` indicates the release (historically “1” or “2”, representing a biannual cycle), and `PP` indicates the patch release version. For example: Version 23.1.0 (abbreviated v23.1.0). Leading up to a new major version's initial GA (Generally Available) release, multiple testing builds are produced, moving from Alpha to Beta to Release Candidate. CockroachDB began using this versioning scheme with v19.1. For more details, refer to [Release Naming](https://cockroachlabs.com/docs/releases/index#release-naming). -CockroachDB {{ site.data.products.cloud }} supports the latest major version of CockroachDB and the major version immediately preceding it. Support for these versions includes patch version upgrades and security patches. +CockroachDB {{ site.data.products.cloud }} provides support for the latest major version of CockroachDB and the major version immediately preceding it. -{{site.data.alerts.callout_success}} -Prior to the GA release of a major CockroachDB version, CockroachDB {{ site.data.products.dedicated }} clusters can optionally be upgraded to a [Pre-Production Preview](#pre-production-preview-upgrades) release—a beta or release candidate (RC) testing release for testing and validation of that next major version. To learn more, refer to [Upgrade to v23.2 Pre-Production Preview]({% link cockroachcloud/upgrade-to-v23.2.md %}). -{{site.data.alerts.end}} +CockroachDB Dedicated clusters are automatically upgraded to the latest patch of the cluster’s current major version of CockroachDB, but an account administrator must initiate an upgrade to a new major version. -{{site.data.alerts.callout_danger}} -[CockroachDB {{ site.data.products.serverless }}]({% link cockroachcloud/quickstart.md %}) clusters are subject to automatic upgrades for both major and patch releases. +CockroachDB Serverless clusters are upgraded to the latest major version and each patch automatically. + +{{site.data.alerts.callout_success}} +Prior to the GA release of a major CockroachDB version, CockroachDB {{ site.data.products.dedicated }} clusters can optionally be upgraded to a [Pre-Production Preview](#pre-production-preview-upgrades) release—a beta or release candidate (RC) testing release for testing and validation of that next major version. To learn more, refer to [Upgrade to v24.1 Pre-Production Preview]({% link cockroachcloud/upgrade-to-v24.1.md %}). {{site.data.alerts.end}} ## Patch version upgrades Patch version [releases](https://www.cockroachlabs.com/docs/releases), or "maintenance" releases, contain stable, backward-compatible improvements to the major versions of CockroachDB (for example, v23.1.12 and v23.1.13). -For CockroachDB {{ site.data.products.dedicated }} clusters, [Org Administrators]({% link cockroachcloud/authorization.md %}#org-administrator) can [set a weekly 6-hour maintenance window]({% link cockroachcloud/cluster-management.md %}#set-a-maintenance-window) during which available maintenance and patch upgrades will be applied. During the window, your cluster may experience restarts, degraded performance, and downtime for single-node clusters. Upgrades may not always be completed by the end of the window, and maintenance that is critical for security or stability may occur outside the window. Patch upgrades can also be [deferred for 60 days]({% link cockroachcloud/cluster-management.md %}#set-a-maintenance-window). If no maintenance window is configured, CockroachDB {{ site.data.products.dedicated }} clusters will be automatically upgraded to the latest supported patch version as soon as it becomes available. +For CockroachDB {{ site.data.products.dedicated }} clusters, [Org Administrator]({% link cockroachcloud/authorization.md %}#org-administrator) can [set a weekly 6-hour maintenance window]({% link cockroachcloud/cluster-management.md %}#set-a-maintenance-window) during which available patch upgrades will be applied. During the window, your cluster may experience restarts, degraded performance, and, for single-node clusters, downtime. Upgrades may not always be completed by the end of the window, and maintenance that is critical for security or stability may occur outside the window. Patch upgrades can also be [deferred for 60 days]({% link cockroachcloud/cluster-management.md %}#set-a-maintenance-window). If no maintenance window is configured, CockroachDB {{ site.data.products.dedicated }} clusters will be automatically upgraded to the latest supported patch version as soon as it becomes available. CockroachDB {{ site.data.products.serverless }} clusters are subject to automatic upgrades to the latest supported patch version. -**To minimize disruption to clients during cluster upgrades, it's important to use [connection retry logic]({% link cockroachcloud/production-checklist.md %}#keeping-connections-current) in your application.** - {{site.data.alerts.callout_danger}} Single-node clusters will experience some downtime during cluster maintenance. {{site.data.alerts.end}} ## Major version upgrades -Major version [releases](https://www.cockroachlabs.com/docs/releases) (for example, v23.1.0 and v23.2.0) contain new functionality and potentially backward-incompatible changes to CockroachDB. +Major version [releases](https://www.cockroachlabs.com/docs/releases) (for example, v23.1.0 and v23.2.0) contain new functionality and may include backward-incompatible changes to CockroachDB. -Major version upgrades are automatic for CockroachDB {{ site.data.products.serverless }} clusters and opt-in for CockroachDB {{ site.data.products.dedicated }} clusters. [Org Administrators]({% link cockroachcloud/authorization.md %}#org-administrator) must initiate major version upgrades for CockroachDB {{ site.data.products.dedicated }} clusters. When a new major version is available, Admins will be able to [start an upgrade]({% link cockroachcloud/upgrade-to-v23.1.md %}) from the CockroachDB {{ site.data.products.cloud }} Console for clusters using the paid version of CockroachDB {{ site.data.products.dedicated }}. When a major version upgrade is initiated for a cluster, it will upgrade to the latest patch version as well. +Major version upgrades are automatic for CockroachDB {{ site.data.products.serverless }} clusters and opt-in for CockroachDB {{ site.data.products.dedicated }} clusters. An [Org Administrator]({% link cockroachcloud/authorization.md %}#org-administrator) must initiate major version upgrades for CockroachDB {{ site.data.products.dedicated }} clusters. When a new major version is available, Admins will be able to [start an upgrade]({% link cockroachcloud/upgrade-to-v23.1.md %}) from the CockroachDB {{ site.data.products.cloud }} Console for clusters using CockroachDB {{ site.data.products.dedicated }}. When a major version upgrade is initiated for a cluster, it will upgrade to the latest patch version as well. ### Pre-production preview upgrades -Prior to the GA release of a major CockroachDB version, CockroachDB {{ site.data.products.cloud }} organizations can create new clusters or upgrade existing clusters to a Pre-Production Preview release for testing and experimentation using a beta or release candidate (RC) of that next major version. Upgrading to a Pre-Production Preview is a major-version upgrade. After a cluster is upgraded to a Pre-Production Preview release, it is automatically upgraded to all subsequent releases within the same major version—including additional beta and RC releases, the GA release, and subsequent patch releases after GA, as [patch version upgrades](#patch-version-upgrades). To learn more, refer to [Upgrade to v23.2 Pre-Production Preview](https://cockroachlabs.com/docs/cockroachcloud/upgrade-to-v23.2). + +Prior to the GA release of a major CockroachDB version, CockroachDB {{ site.data.products.cloud }} organizations can create new {{ site.data.products.dedicated }} clusters or upgrade existing clusters to a Pre-Production Preview release for testing and experimentation using a beta or release candidate (RC) of that next major version. Upgrading to a Pre-Production Preview is a major-version upgrade. After a cluster is upgraded to a Pre-Production Preview release, it is automatically upgraded to all subsequent releases within the same major version—including additional beta and RC releases, the GA release, and subsequent patch releases after GA, as [patch version upgrades](#patch-version-upgrades). To learn more, refer to [Upgrade to v23.2 Pre-Production Preview](https://cockroachlabs.com/docs/cockroachcloud/upgrade-to-v24.1). ### Rollback support @@ -52,18 +51,18 @@ To stop the upgrade and roll back to the latest patch release of the previous ma If you choose to roll back a major version upgrade, your cluster will be rolled back to the latest patch release of the previous major version, which may differ from the patch release you were running before you initiated the upgrade. {{site.data.alerts.end}} -During rollback, nodes are reverted to that prior version one at a time, without interrupting the cluster's health and availability. +During rollback, nodes are reverted to that prior major version's latest patch one at a time, without interrupting the cluster's health and availability. -If you see problems after a major version upgrade has been finalized, it will not be possible to roll back via the CockroachDB {{ site.data.products.cloud }} Console. For assistance, [contact support](https://support.cockroachlabs.com/hc/requests/new). +If you notice problems after a major version upgrade has been finalized, it will not be possible to roll back via the CockroachDB {{ site.data.products.cloud }} Console. For assistance, [contact support](https://support.cockroachlabs.com/hc/requests/new). -### End of Support for older CockroachDB versions +### End of Support for CockroachDB versions As CockroachDB releases new major versions, older versions reach their End of Support (EOS) on CockroachDB {{ site.data.products.cloud }}. A CockroachDB version reaches EOS when it is two major versions behind the latest version. For example, when CockroachDB v21.2 was released, CockroachDB v20.2 reached EOS. Clusters running unsupported CockroachDB versions are not eligible for our [availability SLA](https://www.cockroachlabs.com/cloud-terms-and-conditions/). Further downgrades in support may occur as per the [CockroachDB Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). -If you are running a CockroachDB version nearing EOS, you will be reminded at least one month before that version’s EOS that your clusters must be upgraded by the EOS date to avoid losing support. A Org Administrator can [upgrade your cluster]({% link cockroachcloud/upgrade-to-v23.1.md %}) directly from the CockroachDB {{ site.data.products.cloud }} Console. +If you are running a CockroachDB version nearing EOS, you will be reminded at minimum one month before that version’s EOS that your clusters must be upgraded by the EOS date to avoid losing support. A Org Administrator can [upgrade your cluster]({% link cockroachcloud/upgrade-to-v23.2.md %}) directly from the CockroachDB {{ site.data.products.cloud }} Console. -## See also +## Additional information For more details about the upgrade and finalization process, see [Upgrade to the Latest CockroachDB Version](https://cockroachlabs.com/docs/cockroachcloud/upgrade-to-v23.1). diff --git a/src/current/releases/index.md b/src/current/releases/index.md index 6ec063dfbc7..19655d9ffea 100644 --- a/src/current/releases/index.md +++ b/src/current/releases/index.md @@ -1,11 +1,11 @@ --- title: Releases -summary: Release notes for older versions of CockroachDB. +summary: Information about CockroachDB releases with an index of available releases and their release notes and binaries. toc: true docs_area: releases toc_not_nested: true -pre_production_preview: false -pre_production_preview_version: v23.2.0-beta.3 +pre_production_preview: true +pre_production_preview_version: v24.1.0-beta.1 --- {% comment %} @@ -14,11 +14,10 @@ of this file, block-level HTML is indented in relation to the other HTML, and bl indented in relation to the other Liquid. Please try to keep the indentation consistent. Thank you! {% endcomment %} -After downloading your desired release, learn how to [install CockroachDB](https://www.cockroachlabs.com/docs/stable/install-cockroachdb). Also be sure to review Cockroach Labs' [Release Support Policy]({% link releases/release-support-policy.md %}). +After downloading a supported CockroachDB binary, learn how to [install CockroachDB](https://www.cockroachlabs.com/docs/stable/install-cockroachdb). Be sure to review Cockroach Labs' [Release Support Policy]({% link releases/release-support-policy.md %}). -- **Generally Available (GA)** releases are qualified for production environments. -- **Limited Access** binaries allow you to validate CockroachDB on architectures that will soon become generally available. In certain cases, limited access binaries are available only to enrolled organizations. To enroll your organization, contact your account representative. -- **Testing** releases are intended for testing and experimentation only, and are not qualified for production environments and not eligible for support or uptime SLA commitments. Testing releases allow you to begin testing and validating the next major version of CockroachDB early. Testing releases are not eligible for support or uptime SLA commitments. +- **Generally Available (GA)** releases (also known as Production releases) are qualified for production environments. These may have either a default GA support type or an extended LTS (Long-Term Support) designation. Refer to [Release Support Policy]({% link releases/release-support-policy.md %}) for more information. +- **Testing** releases are intended for testing and experimentation only, and are not qualified for production environments and not eligible for support or uptime SLA commitments. Testing releases allow you to begin testing and validating the next major version of CockroachDB early. - **Experimental** binaries allow you to deploy and develop with CockroachDB on architectures that are not yet qualified for production use. Experimental binaries are not eligible for support or uptime SLA commitments, whether they are for testing releases or production releases. For more details, refer to [Release Naming](#release-naming). @@ -29,7 +28,7 @@ In CockroachDB v22.2.x and above, a cluster that is upgraded to an alpha binary ## Staged release process -As of 2024, CockroachDB is released under a staged delivery process. New releases are made available for CockroachDB Cloud clusters for two weeks before binaries are published for CockroachDB Self-Hosted downloads. +As of 2024, CockroachDB is released under a staged delivery process. New releases are made available for select CockroachDB Cloud organizations for two weeks before binaries are published for CockroachDB Self-Hosted downloads. {{ experimental_js_warning }} @@ -109,9 +108,12 @@ As of 2024, CockroachDB is released under a staged delivery process. New release {% for r in releases %} + + {% capture lts_link_linux %}{% if r.lts == true %} ([LTS]({% link releases/release-support-policy.md %}#support-types)){% endif %}{% endcapture %} + {% comment %} Add "Latest" class to release if it's the latest release. {% endcomment %} - {{ r.release_name }} {% comment %} Add link to each release r. {% endcomment %} + {{ r.release_name }}{{ lts_link_linux }}{% comment %} Add link to each release r, decorate with link about LTS if applicable. {% endcomment %} {% if r.release_name == latest_hotfix.release_name %} Latest {% comment %} Add "Latest" badge to release if it's the latest release. {% endcomment %} {% endif %} @@ -138,7 +140,7 @@ As of 2024, CockroachDB is released under a staged delivery process. New release {% if r.linux.linux_arm_experimental == true %}Experimental:{% endif %}
    Full Binary{% if r.has_sha256sum == true %} (SHA256{% endif %})
    {% comment %} If a sha256sum is available for a particular release, we display a link to the file containing the sha256sum alongside the download link of the release. {% endcomment %} {% if r.has_sql_only == true %} -
    SQL shell Binary{% if r.has_sha256sum == true %} (SHA256{% endif %})
    {% comment %} If a sha256sum is available for a particular release, we display a link to the file containing the sha256sum alongside the download link of the release. {% endcomment %} +
    SQL shell Binary{% if r.has_sha256sum == true %} (SHA256){% endif %}
    {% comment %} If a sha256sum is available for a particular release, we display a link to the file containing the sha256sum alongside the download link of the release. {% endcomment %} {% endif %} {% endif %} @@ -192,9 +194,9 @@ macOS downloads are **experimental**. Experimental downloads are not yet qualifi {% break %} {% else %} - +
    Full Binary{% if r.has_sha256sum == true %} (SHA256){% endif %}
    {% if r.has_sql_only == true %} - +
    SQL shell Binary{% if r.has_sha256sum == true %} (SHA256){% endif %}
    {% endif %} {% endif %} @@ -269,9 +271,14 @@ macOS downloads are **experimental**. Experimental downloads are not yet qualifi {% for r in releases %} + + {% capture lts_link_docker %}{% if r.lts == true %} ([LTS]({% link releases/release-support-policy.md %}#support-types)){% endif %}{% endcapture %} + {% comment %} Add "Latest" class to release if it's the latest release. {% endcomment %} - {{ r.release_name }} {% comment %} Add link to each release r. {% endcomment %} + {{ r.release_name }} {% comment %} Add link to each release r. +{% endcomment %} {% if r.release_name == latest_hotfix.release_name %} Latest {% comment %} Add "Latest" badge to release if it's the latest release. {% endcomment %} {% endif %} @@ -297,7 +304,7 @@ macOS downloads are **experimental**. Experimental downloads are not yet qualifi {% elsif r.docker.docker_arm_experimental == true %} **Intel**: GA
    **ARM**: Experimental {% else %} - GA + GA{{ lts_link_docker }} {% endif %} @@ -318,9 +325,10 @@ macOS downloads are **experimental**. Experimental downloads are not yet qualifi {% for r in releases %} + {% comment %} Add "Latest" class to release if it's the latest release. {% endcomment %} - {{ r.release_name }} {% comment %} Add link to each release r. {% endcomment %} + {{ r.release_name }}{% comment %} Add link to each release r {% endcomment %} {% if r.release_name == latest_hotfix.release_name %} Latest {% comment %} Add "Latest" badge to release if it's the latest release. {% endcomment %} {% endif %} @@ -353,7 +361,7 @@ macOS downloads are **experimental**. Experimental downloads are not yet qualifi ## Release naming -Cockroach Labs uses a three-component calendar versioning scheme to name CockroachDB [releases](https://cockroachlabs.com/docs/releases/index#production-releases). The format is `YY.R.PP`, where `YY` indicates the year, `R` indicates the release (“1” or “2”, representing a typical biannual cycle), and `PP` indicates the patch release version. Example: Version 23.1.0 (abbreviated v23.1.0). Leading up to a new major version's initial GA (Generally Available) release, multiple testing builds are produced, moving from Alpha to Beta to Release Candidate. CockroachDB began using this versioning scheme with v19.1. +Cockroach Labs uses a three-component calendar versioning scheme to name CockroachDB [releases](https://cockroachlabs.com/docs/releases/index#production-releases). The format is `YY.R.PP`, where `YY` indicates the year, `R` indicates the release (historically “1” or “2”, representing a typical biannual cycle), and `PP` indicates the patch release version. Example: Version 23.1.0 (abbreviated v23.1.0). Leading up to a new major version's initial GA (Generally Available) release, multiple testing builds are produced, moving from Alpha to Beta to Release Candidate. CockroachDB began using this versioning scheme with v19.1. A major release is typically produced twice a year indicating major enhancements to product functionality. A change in the `YY.R` component denotes a major release. @@ -364,5 +372,5 @@ During development of a major version of CockroachDB, releases are produced acco - Alpha releases are the earliest testing releases leading up to a major version's initial GA (generally available) release, and have `alpha` in the version name. Example: `v23.1.0-alpha.1`. - Beta releases are produced after the series of alpha releases leading up to a major version's initial GA release, and tend to be more stable and introduce fewer changes than alpha releases. They have `beta` in the version name. Example: `v23.1.0-beta.1`. - Release candidates are produced after the series of beta releases and are nearly identical to what will become the initial generally available (GA) release. Release candidates have `rc` in the version name. Example: `v23.1.0-rc.1`. -- A major version's GA release is produced after the series of release candidates for a major version, and ends with `0`. Example: `v23.1.0`. GA releases are validated and suitable for production environments. +- A major version's initial GA release is produced after the series of release candidates for a major version, and ends with `0`. Example: `v23.1.0`. GA releases are validated and suitable for production environments. - Patch (maintenance) releases are produced after a major version's GA release, and are numbered sequentially. Example: `v23.1.13`. diff --git a/src/current/releases/release-support-policy.md b/src/current/releases/release-support-policy.md index 755bab83c46..e897b9b4229 100644 --- a/src/current/releases/release-support-policy.md +++ b/src/current/releases/release-support-policy.md @@ -9,27 +9,38 @@ docs_area: releases {% assign versions = site.data.versions | where_exp: "versions", "versions.release_date <= today" | sort: "release_date" | reverse %} {% comment %} Get all versions (e.g., v21.2) sorted in reverse chronological order. {% endcomment %} -This page explains Cockroach Labs' policy for supporting [major releases]({% link releases/index.md %}) of CockroachDB. +This page explains Cockroach Labs' policy for supporting [production releases]({% link releases/index.md %}) of CockroachDB Self-Hosted. For clusters deployed in {{ site.data.products.cloud }}, refer to the [CockroachDB {{ site.data.products.cloud }} Support and Upgrade Policy](https://www.cockroachlabs.com/docs/cockroachcloud/upgrade-policy). -{{site.data.alerts.callout_info}} -For CockroachDB {{ site.data.products.cloud }} clusters, see the [CockroachDB {{ site.data.products.cloud }} Upgrade Policy](https://www.cockroachlabs.com/docs/cockroachcloud/upgrade-policy). -{{site.data.alerts.end}} +There are two support types: GA and LTS (Long-Term Support). Each patch release of CockroachDB is assigned one of these types. The default is GA, unless otherwise specified. -## Support cycle +Initially, a major release series has GA support. After the series demonstrates a continuously high level of stability and performance, new patch releases are designated as LTS releases, which provide extended support windows. Specifically, the distinction determines the time spans of a release’s support phases: Maintenance Support, Assistance Support, and EOL (End of Life). -Each major release of CockroachDB goes through the following support cycle: +## Support Phases -- **Maintenance Support:** For at least 365 days from the major release date, Cockroach Labs will produce regular patch releases that include critical security fixes and resolutions to problems identified by users. +- **Maintenance Support**: Cockroach Labs will produce regular patch releases that include critical security fixes and resolutions to problems identified by users. -- **Assistance Support:** Following the maintenance support period, Cockroach Labs will provide assistance support for at least an additional 180 days. During this period, the following guidelines will apply: - - New enhancements and error corrections will not be made to the major release. - - Cockroach Labs will direct customers to existing fixes/patches and workarounds applicable to the reported case. - - Cockroach Labs may direct customers to [upgrade](https://www.cockroachlabs.com/docs/stable/upgrade-cockroach-version) to a more current version of the product if a workaround does not exist. - - Cockroach Labs will continue to add critical security fixes to the major release in the form of patch releases. +- **Assistance Support**: Immediately follows the Maintenance Support period. During this period, the following guidelines apply: + - New enhancements will not be made to the major release. + - Cockroach Labs will continue to add critical security fixes to the major release in the form of patch releases. + - Patch releases for the purpose of resolving bugs or other errors may no longer be made to the major release. + - Cockroach Labs may direct customers to workarounds or other fixes applicable to the reported case. + - Cockroach Labs may direct customers to [upgrade](https://www.cockroachlabs.com/docs/stable/upgrade-cockroach-version) to a later version of the product, to resolve or further troubleshoot an issue. -- **End of Life (EOL):** Following the assistance support period, Cockroach Labs will no longer provide any support for the release. +- **End of Life (EOL)**: Following the assistance support period, Cockroach Labs will no longer provide any support for the release. -Cockroach Labs will notify you by mail or email 6 months in advance of a major release transitioning into **Assistance Support** or **EOL**. +## Support Types + +* **GA Support**: The default support type for production releases, starting with the initial production release of a major version, followed by each subsequent patch release before LTS releases begin for that major version. + * **Maintenance support ends**: + * **365 days** **after** the day of the **first production release** of the major version (i.e. the ‘GA release,’ ending in .0). + * **Assistance support ends**: + * **180 days after** the **Maintenance Support end date** of the release. + * Major versions prior to v23.1 will not have LTS releases. +* **LTS (Long-Term Support)**: Conferred to an initial LTS maintenance release of a given major version and its subsequent maintenance releases. LTS provides extended support windows while also indicating our highest level of expected release stability and performance. + * **Maintenance support ends**: + * **365 days** **after** the day of the **first LTS release** of the major version. + * **Assistance support ends**: + * **365 days after** the **Maintenance Support end date** of the release. ## Current supported releases @@ -40,22 +51,134 @@ Date format: YYYY-MM-DD - - + + + + - + + {% for v in versions %} {% assign r_latest = site.data.releases | where_exp: "r_latest", "r_latest.major_version == v.major_version" | where_exp: "r_latest", "r_latest.withdrawn != true" | sort: "release_date" | last | map: "version" %} {% comment %} Calculate the latest non-withdrawn release for a version v. {% endcomment %} - - - - - - - {% endfor %} {% comment %} Display each version, its release date, its maintenance support expiration date, and its assistance support expiration date. Also include links to the latest hotfix version. {% endcomment %} + {% comment %}Convert version (string) to numeric{% endcomment %} + {% assign major_version_numeric = v.major_version | remove_first: "v" | times:1 %} + + {% comment %}Initialize local variables {% endcomment %} + {% assign r_eol = false %} + {% assign r_has_lts = false %} + {% assign r_lts_eol = false %} + {% assign will_never_have_lts = false %} + + {% comment %}v23.1 and future will have LTS {% endcomment %} + {% if major_version_numeric < 23.1 %} + {% assign will_never_have_lts = true %} + {% endif %} + + {% comment %}Evaluate whether the version is EOL for GA or LTS or both{% endcomment %} + {% if v.asst_supp_exp_date < today %} + {% comment %}GA releases in this version are EOL{% endcomment %} + {% assign r_eol = true %} + {% if v.lts_asst_supp_exp_date != "N/A" %} + {% comment %}This major version has LTS releases{% endcomment %} + {% assign r_has_lts = true %} + {% if v.lts_asst_supp_exp_date < today %} + {% comment %}LTS releases exist for this major version and are EOL{% endcomment %} + {% assign r_lts_eol = true %} + {% endif %} + {% endif %} + {% endif %} + + + {% if r_eol != true and r_lts_eol != true %}{% comment %}Only show non-EOL releases {% endcomment %} + + {% if v.initial_lts_patch != "N/A" %}{% comment %} For LTS releases print an LTS row first{% endcomment %} + + + + + + + + + {% endif %} + + {% comment %} Always print a GA row. For 23.2+, add a link to the first footnote{% endcomment %} + + + + + + + + {% endif %} + + {% endfor %} {% comment %} Display each non-EOL version, its release date, its maintenance support expiration date, and its assistance support expiration date, and its LTS maintenance and assistance support dates. Also include links to the latest hotfix version. {% endcomment %} +
    VersionRelease DateMajor VersionPatch VersionsSupport TypeInitial Release Maintenance Support endsAssistance Support ends (EOL Date)Assistance Support ends
    {{ v.major_version }}{% if v.asst_supp_exp_date < today %}*{% endif %}{{ v.release_date }}{{ v.maint_supp_exp_date }}{{ v.asst_supp_exp_date }}
    {{ v.major_version }}{% if v.initial_lts_patch != "N/A" %}{{ v.initial_lts_patch }}+{% endif %}LTS{{ v.initial_lts_release_date }}{% if v.lts_maint_supp_exp_date != "N/A" %}{{ v.lts_maint_supp_exp_date }}{% endif %}{% if v.lts_asst_supp_exp_date != "N/A" %}{{ v.lts_asst_supp_exp_date }}{% endif %}
    {{ v.major_version }}{% if will_never_have_lts == false and v.initial_lts_patch == "N/A" %} *{% endif %}{% if v.last_ga_patch != "N/A" %}{{ v.major_version }}.0 - {{ v.last_ga_patch }}{% else %}{{ v.major_version }}.0+{% endif %}GA{{ v.release_date }}{% if v.maint_supp_exp_date != "N/A" %}{{ v.maint_supp_exp_date }}{% endif %}{% if v.asst_supp_exp_date != "N/A" %}{{ v.asst_supp_exp_date }}{% endif %}
    -* Version has reached EOL +*  : This major version will receive LTS patch releases, which will be listed on an additional row, upon their availability.
    + +## End-of-life (EOL) releases + +The following releases are no longer supported. + + + + + + + + + + + + + + {% for v in versions %} + {% assign r_latest = site.data.releases | where_exp: "r_latest", "r_latest.major_version == v.major_version" | where_exp: "r_latest", "r_latest.withdrawn != true" | sort: "release_date" | last | map: "version" %} {% comment %} Calculate the latest non-withdrawn release for a version v. {% endcomment %} + + {% comment %}Evaluate whether the version is EOL for GA or LTS or both{% endcomment %} + {% assign r_eol = false %} + {% assign r_lts_eol = false %} + {% if v.lts_asst_supp_exp_date != "N/A" %} + {% comment %}This major version has LTS releases{% endcomment %} + {% assign r_has_lts = true %} + {% if v.lts_asst_supp_exp_date < today %} + {% comment %}LTS releases exist for this major version and are EOL{% endcomment %} + {% assign r_lts_eol = true %} + {% endif %} + {% endif %} + {% if v.asst_supp_exp_date < today %} + {% comment %}GA releases in this version are EOL{% endcomment %} + {% assign r_eol = true %} + {% endif %} + + {% if r_eol == true %} + {% if r_lts_eol == true %} + {% comment %} For LTS releases print an LTS row first{% endcomment %} + + + + + + + + {% endif %} + + {% comment %} Always print a GA row{% endcomment %} + + + + + + + + + {% endif %} + + {% endfor %} {% comment %} Display each EOL version, its release date, its maintenance support expiration date, and its assistance support expiration date, and its LTS maintenance and assistance support dates. Also include links to the latest hotfix version. {% endcomment %} + +
    Major VersionPatch VersionsSupport TypeInitial ReleaseMaintenance Support endedAssistance Support ended
    {{ v.major_version }}{{ v.initial_lts_patch }}+LTS{{ v.initial_lts_release_date }}{% if v.lts_maint_supp_exp_date != "N/A" %}{{ v.lts_maint_supp_exp_date }}{% endif %}{% if v.lts_asst_supp_exp_date != "N/A" %}{{ v.lts_asst_supp_exp_date }}{% endif %}
    {{ v.major_version }}{% if v.last_ga_patch != "N/A" %}{{ v.major_version }}.0 - {{ v.last_ga_patch }}{% else %}{{ v.major_version }}.0+{% endif %}GA{{ v.release_date }}{% if v.maint_supp_exp_date != "N/A" %}{{ v.maint_supp_exp_date }}{% endif %}{% if v.asst_supp_exp_date != "N/A" %}{{ v.asst_supp_exp_date }}{% endif %}
    diff --git a/src/current/releases/v24.1.md b/src/current/releases/v24.1.md index 8e5bbbedc6d..3c1cb5de992 100644 --- a/src/current/releases/v24.1.md +++ b/src/current/releases/v24.1.md @@ -30,7 +30,7 @@ Get future release notes emailed to you: {% comment %} {% unless vers.release_date == "N/A" or vers.release_date > today %} -To upgrade to {{ page.major_version }}, see [Upgrade to CockroachDB {{ page.major_version }}](https://www.cockroachlabs.com/docs/{{ page.major_version }}/upgrade-cockroach-version). +To upgrade to {{ page.major_version }}, refer to [Upgrade to CockroachDB {{ page.major_version }}](https://www.cockroachlabs.com/docs/{{ page.major_version }}/upgrade-cockroach-version). {% endunless %} {% endcomment %} diff --git a/src/current/v22.2/sso-sql.md b/src/current/v22.2/sso-sql.md index fe480dffec6..444c562aa0d 100644 --- a/src/current/v22.2/sso-sql.md +++ b/src/current/v22.2/sso-sql.md @@ -1,6 +1,6 @@ --- title: Cluster Single Sign-on (SSO) using a JSON web token (JWT) -summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB {{ site.data.products.core }}, review of authenticating users, configuring required cluster settings. +summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB Cloud, review of authenticating users, configuring required cluster settings. toc: true docs_area: manage --- diff --git a/src/current/v23.1/sso-sql.md b/src/current/v23.1/sso-sql.md index 1f8baedfc7e..87cb19e3bd4 100644 --- a/src/current/v23.1/sso-sql.md +++ b/src/current/v23.1/sso-sql.md @@ -1,6 +1,6 @@ --- title: Cluster Single Sign-on (SSO) using JSON web tokens (JWTs) -summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB {{ site.data.products.core }}, review of authenticating users, configuring required cluster settings. +summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB Cloud, review of authenticating users, configuring required cluster settings. toc: true docs_area: manage --- diff --git a/src/current/v23.1/upgrade-cockroach-version.md b/src/current/v23.1/upgrade-cockroach-version.md index 368cae848d3..a8ff465b97c 100644 --- a/src/current/v23.1/upgrade-cockroach-version.md +++ b/src/current/v23.1/upgrade-cockroach-version.md @@ -14,16 +14,16 @@ docs_area: manage Because of CockroachDB's [multi-active availability]({% link {{ page.version.version }}/multi-active-availability.md %}) design, you can perform a "rolling upgrade" of your CockroachDB cluster. This means that you can upgrade nodes one at a time without interrupting the cluster's overall health and operations. -This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. +This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**{% if latest.lts == true %} ([LTS]({% link releases/release-support-policy.md %}#support-types)){% endif %}. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. ## Terminology Before upgrading, review the CockroachDB [release](../releases/) terminology: -- A new *major release* is performed every 6 months. The major version number indicates the year of release followed by the release number, which will be either 1 or 2. For example, the latest major release is {{ actual_latest_prod.major_version }} (also written as {{ actual_latest_prod.major_version }}.0). -- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that fix crashes, security issues, and data correctness issues. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. -- All major and patch releases are suitable for production usage, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. -- Prior to an upcoming major release, alpha and beta releases and release candidates are made available. These "testing releases" are not suitable for production usage. They are intended for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number. +- A new *major release* is performed multiple times per year. The major version number indicates the year of release followed by the release number, starting with 1. For example, the latest major release is {{ actual_latest_prod.major_version }}. +- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that contain improvements including performance or security enhancements and bug fixes. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. +- All major and patch releases are suitable for production environments, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. +- Prior to an upcoming major release, alpha, beta, and release candidate (RC) binaries are made available for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number.These "testing releases" are not suitable for production environments and are not eligible for spuport or uptime SLA commitments. For more information, refer to the [Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). {{site.data.alerts.callout_info}} There are no "minor releases" of CockroachDB. diff --git a/src/current/v23.2/sso-sql.md b/src/current/v23.2/sso-sql.md index 163700877e4..aaf460bc01e 100644 --- a/src/current/v23.2/sso-sql.md +++ b/src/current/v23.2/sso-sql.md @@ -1,6 +1,6 @@ --- title: Cluster Single Sign-on (SSO) using JSON web tokens (JWTs) -summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB {{ site.data.products.core }}, review of authenticating users, configuring required cluster settings. +summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB Self-Hosted, review of authenticating users, configuring required cluster settings. toc: true docs_area: manage --- diff --git a/src/current/v23.2/upgrade-cockroach-version.md b/src/current/v23.2/upgrade-cockroach-version.md index 45ab6da0936..42be2dd9389 100644 --- a/src/current/v23.2/upgrade-cockroach-version.md +++ b/src/current/v23.2/upgrade-cockroach-version.md @@ -14,16 +14,16 @@ docs_area: manage Because of CockroachDB's [multi-active availability]({% link {{ page.version.version }}/multi-active-availability.md %}) design, you can perform a "rolling upgrade" of your CockroachDB cluster. This means that you can upgrade nodes one at a time without interrupting the cluster's overall health and operations. -This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. +This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**{% if latest.lts == true %} ([LTS]({% link releases/release-support-policy.md %}#support-types)){% endif %}. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. ## Terminology Before upgrading, review the CockroachDB [release](../releases/) terminology: -- A new *major release* is performed every 6 months. The major version number indicates the year of release followed by the release number, which will be either 1 or 2. For example, the latest major release is {{ actual_latest_prod.major_version }} (also written as {{ actual_latest_prod.major_version }}.0). -- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that fix crashes, security issues, and data correctness issues. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. -- All major and patch releases are suitable for production usage, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. -- Prior to an upcoming major release, alpha and beta releases and release candidates are made available. These "testing releases" are not suitable for production usage. They are intended for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number. +- A new *major release* is performed multiple times per year. The major version number indicates the year of release followed by the release number, starting with 1. For example, the latest major release is {{ actual_latest_prod.major_version }}. +- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that contain improvements including performance or security enhancements and bug fixes. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. +- All major and patch releases are suitable for production environments, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. +- Prior to an upcoming major release, alpha, beta, and release candidate (RC) binaries are made available for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number.These "testing releases" are not suitable for production environments and are not eligible for spuport or uptime SLA commitments. For more information, refer to the [Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). {{site.data.alerts.callout_info}} There are no "minor releases" of CockroachDB. diff --git a/src/current/v24.1/sso-sql.md b/src/current/v24.1/sso-sql.md index 163700877e4..aaf460bc01e 100644 --- a/src/current/v24.1/sso-sql.md +++ b/src/current/v24.1/sso-sql.md @@ -1,6 +1,6 @@ --- title: Cluster Single Sign-on (SSO) using JSON web tokens (JWTs) -summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB {{ site.data.products.core }}, review of authenticating users, configuring required cluster settings. +summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB Self-Hosted, review of authenticating users, configuring required cluster settings. toc: true docs_area: manage --- diff --git a/src/current/v24.1/upgrade-cockroach-version.md b/src/current/v24.1/upgrade-cockroach-version.md index e0eb6562191..59be71b63c9 100644 --- a/src/current/v24.1/upgrade-cockroach-version.md +++ b/src/current/v24.1/upgrade-cockroach-version.md @@ -14,20 +14,16 @@ docs_area: manage Because of CockroachDB's [multi-active availability]({% link {{ page.version.version }}/multi-active-availability.md %}) design, you can perform a "rolling upgrade" of your CockroachDB cluster. This means that you can upgrade nodes one at a time without interrupting the cluster's overall health and operations. -This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. - -{{site.data.alerts.callout_info}} -CockroachDB v23.2 is now generally available and production-ready for CockroachDB {{ site.data.products.dedicated }}, and is scheduled to be made available for CockroachDB {{ site.data.products.core }} on February 5, 2024. -{{site.data.alerts.end}} +This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**{% if latest.lts == true %} ([LTS]({% link releases/release-support-policy.md %}#support-types)){% endif %}. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. ## Terminology Before upgrading, review the CockroachDB [release](../releases/) terminology: -- A new *major release* is performed every 6 months. The major version number indicates the year of release followed by the release number, which will be either 1 or 2. For example, the latest major release is {{ actual_latest_prod.major_version }} (also written as {{ actual_latest_prod.major_version }}.0). -- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that fix crashes, security issues, and data correctness issues. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. -- All major and patch releases are suitable for production usage, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. -- Prior to an upcoming major release, alpha and beta releases and release candidates are made available. These "testing releases" are not suitable for production usage. They are intended for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number. +- A new *major release* is performed multiple times per year. The major version number indicates the year of release followed by the release number, starting with 1. For example, the latest major release is {{ actual_latest_prod.major_version }}. +- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that contain improvements including performance or security enhancements and bug fixes. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. +- All major and patch releases are suitable for production environments, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. +- Prior to an upcoming major release, alpha, beta, and release candidate (RC) binaries are made available for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number.These "testing releases" are not suitable for production environments and are not eligible for spuport or uptime SLA commitments. For more information, refer to the [Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). {{site.data.alerts.callout_info}} There are no "minor releases" of CockroachDB. From 395dcd1d04c3d61490f6759d8cadb13a7820df8f Mon Sep 17 00:00:00 2001 From: Rich Loveland Date: Wed, 1 May 2024 14:04:08 -0400 Subject: [PATCH 25/34] Add v23.1.20 release notes (#18508) * Add v23.1.20 release notes Fixes DOC-10136 --- src/current/_data/releases.yml | 27 ++++++++++++++ .../_includes/releases/v23.1/v23.1.20.md | 35 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/current/_includes/releases/v23.1/v23.1.20.md diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index 4d07485be3b..c8ffccdc869 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5932,3 +5932,30 @@ docker_arm_limited_access: false source: true previous_release: v24.1.0-beta.2 + +- release_name: v23.1.20 + major_version: v23.1 + release_date: '2024-05-01' + release_type: Production + go_version: go1.22.0 + sha: 93a67980ee45391b8ef02d40a6d50ddb0245817b + has_sql_only: true + has_sha256sum: true + mac: + mac_arm: true + mac_arm_experimental: true + mac_arm_limited_access: false + windows: true + linux: + linux_arm: true + linux_arm_experimental: true + linux_arm_limited_access: false + linux_intel_fips: true + linux_arm_fips: false + docker: + docker_image: cockroachdb/cockroach + docker_arm: true + docker_arm_experimental: true + docker_arm_limited_access: false + source: true + previous_release: v23.1.19 diff --git a/src/current/_includes/releases/v23.1/v23.1.20.md b/src/current/_includes/releases/v23.1/v23.1.20.md new file mode 100644 index 00000000000..48a4ab3ceb3 --- /dev/null +++ b/src/current/_includes/releases/v23.1/v23.1.20.md @@ -0,0 +1,35 @@ +## v23.1.20 + +Release Date: May 1, 2024 + +{% include releases/release-downloads-docker-image.md release=include.release %} + +

    SQL language changes

    + +- Added a [session variable]({% link v23.1/set-vars.md %}) `optimizer_use_improved_multi_column_selectivity_estimate`, which if enabled, causes the [optimizer]({% link v23.1/cost-based-optimizer.md %}) to use an improved selectivity estimate for multi-column predicates. This setting will default to `true` on versions 24.2+, and `false` on prior versions. [#123152][#123152] +- Added three new [cluster settings]({% link v23.1/cluster-settings.md %}) for controlling [optimizer table statistics]({% link v23.1/cost-based-optimizer.md %}#table-statistics) forecasting: + 1. `sql.stats.forecasts.min_observations` is the minimum number of observed statistics required to produce a forecast. + 1. `sql.stats.forecasts.min_goodness_of_fit` is the minimum R² (goodness of fit) measurement required from all predictive models to use a forecast. + 1. `sql.stats.forecasts.max_decrease` is the most a prediction can decrease, expressed as the minimum ratio of the prediction to the lowest prior observation. [#123149][#123149] + +

    Bug fixes

    + +- Statistics forecasts of zero rows by [the optimizer]({% link v23.1/cost-based-optimizer.md %}#table-statistics) can cause bad plans. This commit changes forecasting to avoid predicting zero rows for most downward-trending statistics. [#123149][#123149] +- A [job]({% link v23.1/show-jobs.md %}) will now [log]({% link v23.1/logging.md %}#ops) rather than fail if it reports an out-of bound progress fraction. [#123133][#123133] + +

    Performance improvements

    + +- Added a new [session variable]({% link v23.1/set-vars.md %}) `optimizer_use_improved_zigzag_join_costing`. When enabled, the cost of [zigzag joins]({% link v23.1/cost-based-optimizer.md %}#zigzag-joins) is updated so zigzag joins will only be chosen over scans if the zigzag joins produce fewer rows. This change only applies if the session variable `enable_zigzag_join` is also `on`. [#123152][#123152] +- Improved the selectivity estimation of multi-column filters by the [optimizer]({% link v23.1/cost-based-optimizer.md %}) when the multi-column distinct count is high. This avoids cases where CockroachDB significantly over-estimates the selectivity of a multi-column predicate and as a result can prevent the optimizer from choosing a bad query plan. [#123152][#123152] + +
    + +

    Contributors

    + +This release includes 5 merged PRs by 5 authors. + +
    + +[#123133]: https://github.com/cockroachdb/cockroach/pull/123133 +[#123149]: https://github.com/cockroachdb/cockroach/pull/123149 +[#123152]: https://github.com/cockroachdb/cockroach/pull/123152 From e6a1f7d2053ef04a657c18224a6168e406ba2d50 Mon Sep 17 00:00:00 2001 From: Rich Loveland Date: Thu, 2 May 2024 16:06:56 -0400 Subject: [PATCH 26/34] Update v23.1.13 and v23.1.20 release metadata (#18513) * Update v23.1.13 and v23.1.20 release metadata Summary of changes: - Update v23.1.13: - Mark ARM as NOT experimental - Update v23.1.20: - Mark ARM as NOT experimental - Mark this as an LTS release * Correct some more metadata --------- Co-authored-by: Matt Linville --- src/current/_data/releases.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index c8ffccdc869..ce05dca4433 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5262,14 +5262,14 @@ windows: true linux: linux_arm: true - linux_arm_experimental: true + linux_arm_experimental: false linux_arm_limited_access: false linux_intel_fips: true linux_arm_fips: false docker: docker_image: cockroachdb/cockroach docker_arm: true - docker_arm_experimental: true + docker_arm_experimental: false docker_arm_limited_access: false source: true previous_release: v23.1.12 @@ -5323,7 +5323,7 @@ docker: docker_image: cockroachdb/cockroach-unstable docker_arm: true - docker_arm_experimental: false + docker_arm_experimental: true docker_arm_limited_access: true source: true previous_release: v23.2.0-beta.3 @@ -5350,7 +5350,7 @@ docker: docker_image: cockroachdb/cockroach-unstable docker_arm: true - docker_arm_experimental: false + docker_arm_experimental: true docker_arm_limited_access: true source: true previous_release: v23.2.0-rc.1 @@ -5792,7 +5792,7 @@ docker: docker_image: cockroachdb/cockroach docker_arm: true - docker_arm_experimental: true + docker_arm_experimental: false docker_arm_limited_access: false source: true previous_release: v23.1.17 @@ -5937,6 +5937,7 @@ major_version: v23.1 release_date: '2024-05-01' release_type: Production + lts: true go_version: go1.22.0 sha: 93a67980ee45391b8ef02d40a6d50ddb0245817b has_sql_only: true @@ -5948,14 +5949,14 @@ windows: true linux: linux_arm: true - linux_arm_experimental: true + linux_arm_experimental: false linux_arm_limited_access: false linux_intel_fips: true linux_arm_fips: false docker: docker_image: cockroachdb/cockroach docker_arm: true - docker_arm_experimental: true + docker_arm_experimental: false docker_arm_limited_access: false source: true previous_release: v23.1.19 From 8b9ffd8a9b0344377fc319a73275d04630911e80 Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Thu, 2 May 2024 15:51:23 -0700 Subject: [PATCH 27/34] [DOC-9256] Update Terraform page (#18474) - Remove machine_type field - Change wget examples to use curl to remove a dependency --- .../cockroachcloud/provision-a-cluster-with-terraform.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/current/cockroachcloud/provision-a-cluster-with-terraform.md b/src/current/cockroachcloud/provision-a-cluster-with-terraform.md index 94fd26fe304..425831c09aa 100644 --- a/src/current/cockroachcloud/provision-a-cluster-with-terraform.md +++ b/src/current/cockroachcloud/provision-a-cluster-with-terraform.md @@ -96,7 +96,6 @@ In this tutorial, you will create a CockroachDB {{ site.data.products.dedicated cloud_provider_regions = ["{cloud provider region}"] cluster_node_count = {number of nodes} storage_gib = {storage in GiB} - machine_type = "{cloud provider machine type}" allow_list_name = "{allow list name}" cidr_ip = "{allow list CIDR IP}" cidr_mask = {allow list CIDR mask} @@ -110,7 +109,6 @@ In this tutorial, you will create a CockroachDB {{ site.data.products.dedicated - `{cloud provider regions}` is the region code or codes for the cloud infrastructure provider. For multi-region clusters, separate each region with a comma. - `{number of nodes}` is the number of nodes in each region. Cockroach Labs recommends at least 3 nodes per region, and the same number of nodes in each region for multi-region clusters. - `{storage in GiB}` is the amount of storage specified in GiB. - - `{cloud provider machine type}` is the machine type for the cloud infrastructure provider. - `{allow list name}` is the name for the [IP allow list]({% link cockroachcloud/network-authorization.md %}#ip-allowlisting). Use a descriptive name to identify the IP allow list. - `{allow list CIDR IP}` is the Classless Inter-Domain Routing (CIDR) IP address base. - `{allow list CIDR mask}` is the CIDR mask. @@ -126,7 +124,6 @@ In this tutorial, you will create a CockroachDB {{ site.data.products.dedicated cloud_provider_regions = ["us-west2"] cluster_node_count = 3 storage_gib = 15 - machine_type = "n1-standard-2" allow_list_name = "Max's home network" cidr_ip = "1.2.3.4" cidr_mask = 32 @@ -251,7 +248,6 @@ Terraform will perform the following actions: + creator_id = (known after apply) + dedicated = { + disk_iops = (known after apply) - + machine_type = (known after apply) + memory_gib = (known after apply) + num_virtual_cpus = (known after apply) + storage_gib = (known after apply) @@ -288,7 +284,6 @@ Terraform will perform the following actions: + creator_id = (known after apply) + dedicated = { + disk_iops = (known after apply) - + machine_type = "n1-standard-2" + memory_gib = (known after apply) + num_virtual_cpus = (known after apply) + storage_gib = 15 @@ -362,7 +357,6 @@ cluster = { "creator_id" = tostring(null) "dedicated" = { "disk_iops" = 450 - "machine_type" = "n1-standard-2" "memory_gib" = 7.5 "num_virtual_cpus" = 2 "storage_gib" = 15 @@ -452,7 +446,6 @@ resource "cockroach_cluster" "example" { creator_id = "98e75f0a-072b-44dc-95d2-cc36cd425cab" dedicated = { disk_iops = 450 - machine_type = "n1-standard-2" memory_gib = 7.5 num_virtual_cpus = 2 storage_gib = 15 @@ -481,7 +474,6 @@ data "cockroach_cluster" "example" { cockroach_version = "v22.2.0" dedicated = { disk_iops = 450 - machine_type = "n1-standard-2" memory_gib = 7.5 num_virtual_cpus = 2 storage_gib = 15 @@ -506,7 +498,6 @@ cluster = { creator_id = null dedicated = { disk_iops = 450 - machine_type = "n1-standard-2" memory_gib = 7.5 num_virtual_cpus = 2 storage_gib = 15 From 8e777dfef9fc435d3540462a331fdceb4e1b079b Mon Sep 17 00:00:00 2001 From: shannonbradshaw Date: Fri, 3 May 2024 08:44:21 -0400 Subject: [PATCH 28/34] remove old training materials so that customers can no longer find them --- .../training/architecture-overview.md | 30 - src/archived/training/backup-and-restore.md | 335 ---------- .../client-connection-troubleshooting.md | 168 ----- .../training/cluster-startup-and-scaling.md | 319 ---------- .../cluster-unavailability-troubleshooting.md | 107 ---- src/archived/training/cluster-upgrade.md | 249 -------- .../data-corruption-troubleshooting.md | 185 ------ src/archived/training/data-import.md | 339 ---------- .../data-unavailability-troubleshooting.md | 304 --------- .../fault-tolerance-and-automated-repair.md | 281 --------- src/archived/training/geo-partitioning.md | 580 ------------------ .../training/how-cockroach-labs-debugs.md | 13 - src/archived/training/how-to-get-support.md | 38 -- src/archived/training/index.md | 24 - .../locality-and-replication-zones.md | 406 ------------ src/archived/training/logs.md | 13 - .../training/monitoring-and-alerting.md | 13 - .../network-partition-troubleshooting.md | 185 ------ src/archived/training/node-decommissioning.md | 119 ---- .../training/node-startup-troubleshooting.md | 322 ---------- .../training/orchestration-with-kubernetes.md | 525 ---------------- .../training/performance-benchmarking.md | 166 ----- src/archived/training/planned-maintenance.md | 195 ------ .../training/production-deployment.md | 13 - .../training/resources/docker-compose.yaml | 95 --- .../training/resources/mysql_dump.sql | 77 --- src/archived/training/resources/pg_dump.sql | 125 ---- .../training/resources/pg_dump_cleaned.sql | 119 ---- src/archived/training/security.md | 263 -------- .../software-panic-troubleshooting.md | 101 --- src/archived/training/sql-basics.md | 439 ------------- .../under-replication-troubleshooting.md | 111 ---- src/archived/training/users-and-privileges.md | 320 ---------- src/archived/training/why-cockroachdb.md | 30 - 34 files changed, 6609 deletions(-) delete mode 100644 src/archived/training/architecture-overview.md delete mode 100644 src/archived/training/backup-and-restore.md delete mode 100644 src/archived/training/client-connection-troubleshooting.md delete mode 100644 src/archived/training/cluster-startup-and-scaling.md delete mode 100644 src/archived/training/cluster-unavailability-troubleshooting.md delete mode 100644 src/archived/training/cluster-upgrade.md delete mode 100644 src/archived/training/data-corruption-troubleshooting.md delete mode 100644 src/archived/training/data-import.md delete mode 100644 src/archived/training/data-unavailability-troubleshooting.md delete mode 100644 src/archived/training/fault-tolerance-and-automated-repair.md delete mode 100644 src/archived/training/geo-partitioning.md delete mode 100644 src/archived/training/how-cockroach-labs-debugs.md delete mode 100644 src/archived/training/how-to-get-support.md delete mode 100644 src/archived/training/index.md delete mode 100644 src/archived/training/locality-and-replication-zones.md delete mode 100644 src/archived/training/logs.md delete mode 100644 src/archived/training/monitoring-and-alerting.md delete mode 100644 src/archived/training/network-partition-troubleshooting.md delete mode 100644 src/archived/training/node-decommissioning.md delete mode 100644 src/archived/training/node-startup-troubleshooting.md delete mode 100644 src/archived/training/orchestration-with-kubernetes.md delete mode 100644 src/archived/training/performance-benchmarking.md delete mode 100644 src/archived/training/planned-maintenance.md delete mode 100644 src/archived/training/production-deployment.md delete mode 100644 src/archived/training/resources/docker-compose.yaml delete mode 100644 src/archived/training/resources/mysql_dump.sql delete mode 100644 src/archived/training/resources/pg_dump.sql delete mode 100644 src/archived/training/resources/pg_dump_cleaned.sql delete mode 100644 src/archived/training/security.md delete mode 100644 src/archived/training/software-panic-troubleshooting.md delete mode 100644 src/archived/training/sql-basics.md delete mode 100644 src/archived/training/under-replication-troubleshooting.md delete mode 100644 src/archived/training/users-and-privileges.md delete mode 100644 src/archived/training/why-cockroachdb.md diff --git a/src/archived/training/architecture-overview.md b/src/archived/training/architecture-overview.md deleted file mode 100644 index 621efbbe5e9..00000000000 --- a/src/archived/training/architecture-overview.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Architecture Overview -summary: Learn more about CockroachDB's underlying architecture -toc: false -sidebar_data: sidebar-data-training.json ---- - -Watch the rest of Alex Robinson's talk, where he explains the CockroachDB architecture and how it was built. You can also read through a related set of slides. - -
    - - -
    -

    - -
    - - - -
    - -
    - - - -
    - -## What's next? - -[Cluster Startup and Scaling](cluster-startup-and-scaling.html) diff --git a/src/archived/training/backup-and-restore.md b/src/archived/training/backup-and-restore.md deleted file mode 100644 index 32cf9154bee..00000000000 --- a/src/archived/training/backup-and-restore.md +++ /dev/null @@ -1,335 +0,0 @@ ---- -title: Backup and Restore -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a 3-node cluster - -Start and initialize an insecure cluster like you did in previous modules. - -1. Start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Perform a "core" backup - -1. Use the [`cockroach gen`](../cockroach-gen.html) command to generate an example `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data startrek | cockroach sql --insecure - ~~~ - -2. Check the contents of the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT * FROM startrek.episodes LIMIT 1;" \ - --execute="SELECT * FROM startrek.quotes LIMIT 1;" - ~~~ - - ~~~ - id | season | num | title | stardate - +----+--------+-----+--------------+-------------+ - 1 | 1 | 1 | The Man Trap | 1531.100000 - (1 row) - quote | characters | stardate | episode - +----------------------------------------------------------------------+------------------------+----------+---------+ - "... freedom ... is a worship word..." "It is our worship word too." | Cloud William and Kirk | NULL | 52 - (1 row) - ~~~ - -3. Use the [`cockroach dump`](../cockroach-dump.html) command to create a SQL dump file for the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach dump startrek \ - --insecure \ - --host=localhost:26257 > startrek_backup.sql - ~~~ - -4. Take a look at the generated `startrek_backup.sql` file. - - You'll see that it contains the SQL for recreating the two tables in the `startrek` database and inserting all current rows into those tables. - - ~~~ - CREATE TABLE episodes ( - id INT NOT NULL, - season INT NULL, - num INT NULL, - title STRING NULL, - stardate DECIMAL NULL, - CONSTRAINT "primary" PRIMARY KEY (id ASC), - FAMILY "primary" (id, season, num, title, stardate) - ); - - CREATE TABLE quotes ( - quote STRING NULL, - characters STRING NULL, - stardate DECIMAL NULL, - episode INT NULL, - CONSTRAINT fk_episode_ref_episodes FOREIGN KEY (episode) REFERENCES episodes (id), - INDEX quotes_episode_idx (episode ASC), - FAMILY "primary" (quote, characters, stardate, episode, rowid) - ); - - INSERT INTO episodes (id, season, num, title, stardate) VALUES - (1, 1, 1, 'The Man Trap', 1531.1), - (2, 1, 2, 'Charlie X', 1533.6), - (3, 1, 3, 'Where No Man Has Gone Before', 1312.4), - (4, 1, 4, 'The Naked Time', 1704.2), - (5, 1, 5, 'The Enemy Within', 1672.1), - ... - ~~~ - -## Step 3. Perform a "core" restore - -Now imagine the tables in the `startrek` database have changed and you want to restore them to their state at the time of the dump. - -1. Drop the tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="DROP TABLE startrek.episodes,startrek.quotes CASCADE;" - ~~~ - -2. Confirm that the tables in the `startrek` database are gone: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW TABLES FROM startrek;" - ~~~ - - ~~~ - table_name - +------------+ - (0 rows) - ~~~ - -3. Restore the tables in the `startrek` database from the dump file: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database=startrek < startrek_backup.sql - ~~~ - -3. Check the contents of the `startrek` database again: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT * FROM startrek.episodes LIMIT 1;" \ - --execute="SELECT * FROM startrek.quotes LIMIT 1;" - ~~~ - - ~~~ - id | season | num | title | stardate - +----+--------+-----+--------------+-------------+ - 1 | 1 | 1 | The Man Trap | 1531.100000 - (1 row) - quote | characters | stardate | episode - +----------------------------------------------------------------------+------------------------+----------+---------+ - "... freedom ... is a worship word..." "It is our worship word too." | Cloud William and Kirk | NULL | 52 - (1 row) - ~~~ - -## Step 4. Perform an "enterprise" backup - -Next, you'll use the enterprise `BACKUP` feature to create a backup of the `startrek` database on S3. - -1. If you requested and enabled a trial enterprise license in the [Geo-Partitioning](geo-partitioning.html) module, skip to step 2. Otherwise, [request a trial enterprise license](https://www.cockroachlabs.com/get-cockroachdb/enterprise/) and then enable your license: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING cluster.organization = '';" - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING enterprise.license = '';" - ~~~ - -2. Use the `BACKUP` SQL statement to generate a backup of the `startrek` database and store it on S3. To ensure your backup doesn't conflict with anyone else's, prefix the filename with your name: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="BACKUP DATABASE startrek TO 's3://cockroach-training/[name]-training?AWS_ACCESS_KEY_ID={{site.training.aws_access_key}}&AWS_SECRET_ACCESS_KEY={{site.training.aws_secret_access_key}}';" - ~~~ - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - +--------------------+-----------+--------------------+------+---------------+----------------+-------+ - 441707640059723777 | succeeded | 1 | 279 | 200 | 0 | 30519 - (1 row) - ~~~ - -## Step 5. Perform an "enterprise" restore - -Again, imagine the tables in the `startrek` database have changed and you want to restore them from the enterprise backup. - -1. Drop the tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="DROP TABLE startrek.episodes,startrek.quotes CASCADE;" - ~~~ - -2. Confirm that the tables in the `startrek` database are gone: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW TABLES FROM startrek;" - ~~~ - - ~~~ - table_name - +------------+ - (0 rows) - ~~~ - -3. Restore the `startrek` database from the enterprise backup, again making sure to prefix the filename with your name: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="RESTORE startrek.* FROM 's3://cockroach-training/[name]-training?AWS_ACCESS_KEY_ID={{site.training.aws_access_key}}&AWS_SECRET_ACCESS_KEY={{site.training.aws_secret_access_key}}';" - ~~~ - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - +--------------------+-----------+--------------------+------+---------------+----------------+-------+ - 441707928464261121 | succeeded | 1 | 279 | 200 | 0 | 30519 - (1 row) - ~~~ - -4. Check the contents of the `startrek` database again: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT * FROM startrek.episodes LIMIT 1;" \ - --execute="SELECT * FROM startrek.quotes LIMIT 1;" - ~~~ - - ~~~ - id | season | num | title | stardate - +----+--------+-----+--------------+-------------+ - 1 | 1 | 1 | The Man Trap | 1531.100000 - (1 row) - quote | characters | stardate | episode - +----------------------------------------------------------------------+------------------------+----------+---------+ - "... freedom ... is a worship word..." "It is our worship word too." | Cloud William and Kirk | NULL | 52 - (1 row) - ~~~ - -## Step 6. Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Terminate all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 - ~~~ - -## What's next? - -[Cluster Upgrade](cluster-upgrade.html) diff --git a/src/archived/training/client-connection-troubleshooting.md b/src/archived/training/client-connection-troubleshooting.md deleted file mode 100644 index b081ffc4543..00000000000 --- a/src/archived/training/client-connection-troubleshooting.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: Client Connection Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -Make sure you have already completed [Node Startup Troubleshooting](node-startup-troubleshooting.html) and have 6 nodes running securely. - -## Problem 1: SSL required - -In this scenario, you try to connect a user without providing a client certificate. - -### Step 1. Simulate the problem - -1. In a new terminal, as the `root` users, create a new user called `kirk`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --execute="CREATE USER kirk;" - ~~~ - -2. As the `kirk` user, try to connect to the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --user=kirk \ - --execute="SHOW DATABASES;" - ~~~ - - Because `kirk` doesn't have a client certificate in the `certs` directory, the cluster asks for the user's password: - - ~~~ - Enter password: - ~~~ - -4. Because `kirk` doesn't have a password, press **Enter**. - - The connection attempt fails, and the following error is printed to `stderr`: - - ~~~ - Error: pq: invalid password - Failed running "sql" - ~~~ - -### Step 2. Resolve the problem - -To successfully connect the user, you must first either generate a client certificate or create a password for the user. It's generally best to use certificates over passwords, so do that here. - -1. Generate a client certificate for the `kirk` user: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-client \ - kirk \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -2. As the `kirk` user, try to connect to the cluster again: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --user=kirk \ - --execute="SHOW DATABASES;" - ~~~ - - This time, the connection attempt succeeds: - - ~~~ - database_name - +---------------+ - (0 rows) - ~~~ - -## Problem 2: Wrong host or port - -In this scenario, you try to connect the `kirk` user again but specify a `--port` that is not in use by any of the existing nodes. - -### Step 1. Simulate the problem - -Try to connect the `kirk` user: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach sql \ ---certs-dir=certs \ ---host=localhost:26257 \ ---user=kirk \ ---port=20000 \ ---execute="SHOW DATABASES;" -~~~ - -The connection attempt fails, and the following is printed to `stderr`: - -~~~ -Error: unable to connect or connection lost. - -Please check the address and credentials such as certificates (if attempting to -communicate with a secure cluster). - -dial tcp [::1]:20000: connect: connection refused -Failed running "sql" -~~~ - -### Step 2. Resolve the problem - -To successfully connect the user, try again using a correct `--port`: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach sql \ ---certs-dir=certs \ ---host=localhost:26257 \ ---user=kirk \ ---port=26259 \ ---execute="SHOW DATABASES;" -~~~ - -This time, the connection attempt succeeds: - -~~~ - database_name -+---------------+ -(0 rows) -~~~ - -## Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Terminate all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 node5 node6 - ~~~ - -## What's next? - -[Under-Replication Troubleshooting](under-replication-troubleshooting.html) diff --git a/src/archived/training/cluster-startup-and-scaling.md b/src/archived/training/cluster-startup-and-scaling.md deleted file mode 100644 index bc6a1cadc3b..00000000000 --- a/src/archived/training/cluster-startup-and-scaling.md +++ /dev/null @@ -1,319 +0,0 @@ ---- -title: Cluster Startup and Scaling -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - - - - - -## Step 1. Install CockroachDB - -1. Download the CockroachDB archive for your OS, and extract the binary: - -
    - - -
    -

    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-{{ page.release_info.version }}.darwin-10.9-amd64.tgz \ - | tar -xz - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-{{ page.release_info.version }}.linux-amd64.tgz \ - | tar -xz - ~~~ -
    - -2. Move the binary into your `$PATH` so you can execute from any shell: - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ mv cockroach-{{ page.release_info.version }}.darwin-10.9-amd64/cockroach \ - /usr/local/bin/ - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ mv cockroach-{{ page.release_info.version }}.linux-amd64/cockroach \ - /usr/local/bin/ - ~~~ -
    - - {{site.data.alerts.callout_info}} - If you get a permissions error, prefix the command with `sudo`. - {{site.data.alerts.end}} - -3. Clean up the directory where you unpacked the binary: - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf cockroach-{{ page.release_info.version }}.darwin-10.9-amd64 - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf cockroach-{{ page.release_info.version }}.linux-amd64 - ~~~ -
    - - You can also execute the `cockroach` binary directly from its download - location, but the rest of training documentation assumes you have the - binary in your `PATH`. - -## Step 2. Start a node - -Use the [`cockroach start`](../cockroach-start.html) command to start a node: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---insecure \ ---store=node1 \ ---listen-addr=localhost:26257 \ ---http-addr=localhost:8080 \ ---join=localhost:26257,localhost:26258,localhost:26259 \ ---background -~~~ - -You'll see the following message: - -~~~ -* -* WARNING: RUNNING IN INSECURE MODE! -* -* - Your cluster is open for any client that can access localhost. -* - Any user, even root, can log in without providing a password. -* - Any user, connecting as root, can read or write any data in your cluster. -* - There is no network encryption nor authentication, and thus no confidentiality. -* -* Check out how to secure your cluster: https://www.cockroachlabs.com/docs/v19.2/secure-a-cluster.html -* -* -* INFO: initial startup completed, will now wait for `cockroach init` -* or a join to a running cluster to start accepting clients. -* Check the log file(s) for progress. -* -~~~ - -## Step 3. Understand the flags you used - -Before moving on, take a moment to understand the flags you used with the `cockroach start` command: - -Flag | Description ------|------------ -`--insecure` | Indicates that the node will communicate without encryption.

    You'll start all other nodes with this flag, as well as all other `cockroach` commands you'll use against the cluster.

    Without this flag, `cockroach` expects to be able to find security certificates to encrypt its communication. More about these in a later module. -`--store` | The location where the node stores its data and logs.

    Since you'll be running all nodes on your computer, you need to specify a unique storage location for each node. In contrast, in a real deployment, with one node per machine, it's fine to let `cockroach` use its default storage location (`cockroach-data`). -`--listen-addr`
    `--http-addr` | The IP address/hostname and port to listen on for connections from other nodes and clients and for Admin UI HTTP request, respectively.

    Again, since you'll be running all nodes on your computer, you need to specify unique ports for each node. In contrast, in a real deployment, with one node per machine, it's fine to let `cockroach` use its default TPC port (`26257`) and HTTP port (`8080`). -`--join` | The addresses and ports of all of your initial nodes.

    You'll use this exact `--join` flag when starting all other nodes. -`--background` | The node will run in the background. - -{{site.data.alerts.callout_success}} -You can run `cockroach start --help` to get help on this command directly in your terminal and `cockroach --help` to get help on other commands. -{{site.data.alerts.end}} - -## Step 4. Start two more nodes - -Start two more nodes, using the same `cockroach start` command as earlier but with unique `--store`, `--listen-addr`, and `--http-addr` flags for each new node. - -1. Start the second node: - - {% include copy-clipboard.html %} - ~~~ shell - cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start the third node: - - {% include copy-clipboard.html %} - ~~~ shell - cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -## Step 5. Initialize the cluster - -1. Use the [`cockroach init`](../cockroach-init.html) command to perform a one-time initialization of the cluster, sending the request to any node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - - You'll see the following message: - - ~~~ - Cluster successfully initialized - ~~~ - -2. Look at the startup details in the server log: - - {% include copy-clipboard.html %} - ~~~ shell - $ grep 'node starting' node1/logs/cockroach.log -A 11 - ~~~ - - The output will look something like this: - - ~~~ - CockroachDB node starting at 2019-10-01 20:14:55.358954 +0000 UTC (took 27.9s) - build: CCL {{page.release_info.version}} @ 2019/09/25 15:18:08 (go1.12.6) - webui: http://localhost:8080 - sql: postgresql://root@localhost:26257?sslmode=disable - client flags: cockroach --host=localhost:26257 --insecure - logs: /Users//cockroachdb-training/node1/logs - temp dir: /Users//cockroachdb-training/node1/cockroach-temp462678173 - external I/O path: /Users//cockroachdb-training/node1/extern - store[0]: path=/Users//cockroachdb-training/node1 - status: initialized new cluster - clusterID: fdc056a4-0cc0-4b29-b435-60e1db239f82 - nodeID: 1 - ~~~ - - Field | Description - ------|------------ - `build` | The version of CockroachDB you are running. - `webui` | The URL for accessing the Admin UI. - `sql` | The connection URL for your client. - `client flags` | The flags to use when connecting to the node via [`cockroach` client commands](../cockroach-commands.html). - `logs` | The directory containing debug log data. - `temp dir` | The temporary store directory of the node. - `external I/O path` | The external IO directory with which the local file access paths are prefixed while performing [backup](../backup.html) and [restore](../restore.html) operations using local node directories or NFS drives. - `store[n]` | The directory containing store data, where `[n]` is the index of the store, e.g., `store[0]` for the first store, `store[1]` for the second store. - `status` | Whether the node is the first in the cluster (`initialized new cluster`), joined an existing cluster for the first time (`initialized new node, joined pre-existing cluster`), or rejoined an existing cluster (`restarted pre-existing node`). - `clusterID` | The ID of the cluster. - `nodeID` | The ID of the node. - -## Step 6. Verify that the cluster is live - -1. Use the [`cockroach node status`](../cockroach-node.html) command to check that all 3 nodes are part of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach node status --insecure --host=localhost:26257 - ~~~ - - ~~~ - id | address | sql_address | build | started_at | updated_at | locality | is_available | is_live - +----+-----------------+-----------------+-----------------------------------------+----------------------------------+----------------------------------+----------+--------------+---------+ - 1 | localhost:26257 | localhost:26257 | v19.2.0 | 2019-10-01 20:14:55.249457+00:00 | 2019-10-01 20:16:07.283866+00:00 | | true | true - 2 | localhost:26258 | localhost:26258 | v19.2.0 | 2019-10-01 20:14:55.445079+00:00 | 2019-10-01 20:16:02.972943+00:00 | | true | true - 3 | localhost:26259 | localhost:26259 | v19.2.0 | 2019-10-01 20:14:55.857631+00:00 | 2019-10-01 20:16:03.389338+00:00 | | true | true - (3 rows) - ~~~ - -2. Use the [`cockroach sql`](../cockroach-sql.html) command to query the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW DATABASES;" - ~~~ - - ~~~ - database_name - +---------------+ - defaultdb - postgres - system - (3 rows) - ~~~ - - You just queried the node listening on `26257`, but every other node is a SQL gateway to the cluster as well. We'll learn more about CockroachDB SQL and the built-in SQL client in a later module. - -## Step 7. Look at the current state of replication - -1. To understand replication in CockroachDB, it's important to review a few concepts from the architecture: - - Concept | Description - --------|------------ - **Range** | CockroachDB stores all user data (tables, indexes, etc.) and almost all system data in a giant sorted map of key-value pairs. This keyspace is divided into "ranges", contiguous chunks of the keyspace, so that every key can always be found in a single range.

    From a SQL perspective, a table and its secondary indexes initially map to a single range, where each key-value pair in the range represents a single row in the table (also called the primary index because the table is sorted by the primary key) or a single row in a secondary index. As soon as a range reaches 512 MiB in size, it splits into two ranges. This process continues as the table and its indexes continue growing. - **Replica** | CockroachDB replicates each range 3 times by default and stores each replica on a different node.

    In a later module, you'll learn how to control replication. - -2. With those concepts in mind, open the Admin UI at http://localhost:8080 and view the **Node List**: - - CockroachDB Admin UI - - Note that the **Replicas** count is the same on all three nodes. This indicates: - - There are this many initial "ranges" of data in the cluster. These are all internal "system" ranges since you haven't added any table data yet. - - Each range has been replicated 3 times (according to the CockroachDB default). - - For each range, each replica is stored on different nodes. - -## Step 8. Scale the cluster - -Adding more nodes to your cluster is even easier than starting the cluster. Just like before, you use the `cockroach start` command with unique `--store`, `--listen-addr`, and `--http-addr` flags for each new node. But this time, you do not have to follow-up with the `cockroach init` command or any other commands. - -1. Start the fourth node: - - {% include copy-clipboard.html %} - ~~~ shell - cockroach start \ - --insecure \ - --store=node4 \ - --listen-addr=localhost:26260 \ - --http-addr=localhost:8083 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start the fifth node: - - {% include copy-clipboard.html %} - ~~~ shell - cockroach start \ - --insecure \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - - As soon as you run these commands, the nodes join the cluster. There's no need to run the `cockroach init` command or any other commands. - -## Step 9. Watch data rebalance across all 5 nodes - -Go back to the **Live Nodes** list in the Admin UI and watch how the **Replicas** are automatically rebalanced to utilize the additional capacity of the new nodes: - -CockroachDB Admin UI - -Another way to observe this is to click **Metrics** in the upper left and scroll down to the **Replicas per Node** graph: - -CockroachDB Admin UI - -## What's next? - -[Fault Tolerance and Automated Repair](fault-tolerance-and-automated-repair.html) diff --git a/src/archived/training/cluster-unavailability-troubleshooting.md b/src/archived/training/cluster-unavailability-troubleshooting.md deleted file mode 100644 index f14010dcf44..00000000000 --- a/src/archived/training/cluster-unavailability-troubleshooting.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Cluster Unavailability Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -Make sure you have already completed [Under-Replication Troubleshooting](under-replication-troubleshooting.html) and have a cluster of 3 nodes running. - -## Step 1. Simulate the problem - -1. In the terminal where node 2 is running, press **CTRL-C**. - -2. In the terminal where node 3 is running, press **CTRL-C**. You may need to press **CRTL + C** a second time to force this node to terminate. - -## Step 2. Troubleshoot the problem - -1. Go back to the Admin UI: - - CockroachDB Admin UI - - You'll notice that an error is shown and timeseries metrics are no longer being reported. - -2. In a new terminal, try to query the one node that was not terminated: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW DATABASES;" \ - --logtostderr=WARNING - ~~~ - - Because all ranges in the cluster, specifically the system ranges, no longer have a majority of their replicas, the cluster as a whole cannot make progress, and so the query will hang indefinitely. - -## Step 3. Resolve the problem - -1. In the terminal where node 2 was running, restart the node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -2. In the terminal where node 3 was running, restart the node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. Go back to the terminal where you issued the query. - - All ranges have a majority of their replicas again, and so the query executes and succeeds: - - ~~~ - database_name - +---------------+ - defaultdb - postgres - system - (3 rows) - ~~~ - -## Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Terminate all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 - ~~~ - -## What's next? - -[Data Unavailability Troubleshooting](data-unavailability-troubleshooting.html) diff --git a/src/archived/training/cluster-upgrade.md b/src/archived/training/cluster-upgrade.md deleted file mode 100644 index d82f12b67cc..00000000000 --- a/src/archived/training/cluster-upgrade.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -title: Cluster Upgrade -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Install CockroachDB v19.1 - -1. Download the CockroachDB v19.1 archive for your OS, and extract the binary: - -
    - - -
    -

    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-v19.1.1.darwin-10.9-amd64.tgz \ - | tar -xz - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-v19.1.1.linux-amd64.tgz \ - | tar -xz - ~~~ -
    - -2. Move the v19.1 binary into the parent `cockroachdb-training` directory: - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ mv cockroach-v19.1.1.darwin-10.9-amd64/cockroach ./cockroach-v19.1 \ - ; rm -rf cockroach-v19.1.1.darwin-10.9-amd64 - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ mv cockroach-v19.1.1.linux-amd64/cockroach ./cockroach-v19.1 \ - ; rm -rf cockroach-v19.1.1.linux-amd64 - ~~~ -
    - -## Step 2. Start a cluster running v19.1 - -Start and initialize a cluster like you did in previous modules, but this time using the v19.1 binary. - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ ./cockroach-v19.1 start \ - --insecure \ - --store=node1 \ - --host=localhost \ - --port=26257 \ - --http-port=8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -2. In a new terminal, start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ ./cockroach-v19.1 start \ - --insecure \ - --store=node2 \ - --host=localhost \ - --port=26258 \ - --http-port=8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. In a new terminal, start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ ./cockroach-v19.1 start \ - --insecure \ - --store=node3 \ - --host=localhost \ - --port=26259 \ - --http-port=8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -4. In a new terminal, perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ ./cockroach-v19.1 init --insecure - ~~~ - -{{site.data.alerts.callout_info}} -You can disable a (manual or automatic) cluster version upgrade from the specified version until you reset your cluster by using the `cluster.preserve_downgrade_option` cluster setting. See the full [Cluster Upgrade](../upgrade-cockroach-version.html) documentation for details. -{{site.data.alerts.end}} - -## Step 3. Upgrade the first node to v19.2 - -1. In node 1's terminal, press **CTRL-C** to terminate the `cockroach` process. - -2. Verify that node 1 has been terminated: - - {% include copy-clipboard.html %} - ~~~ shell - $ ps | grep cockroach - ~~~ - - You should **not** see a `cockroach` process with `--store=node1` and `--port=26257`. - - ~~~ - 49659 ttys001 0:02.43 ./cockroach-v19.1 start --insecure --store=node2 --host=localhost --port=26258 --http-port=8081 --join=localhost:26257,localhost:26258,localhost:26259 - 49671 ttys002 0:02.32 ./cockroach-v19.1 start --insecure --store=node3 --host=localhost --port=26259 --http-port=8082 --join=localhost:26257,localhost:26258,localhost:26259 - 49705 ttys015 0:00.00 grep cockroach - ~~~~ - -3. In node 1's terminal, restart the node using the v19.2 binary: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -4. Go to the Admin UI at http://localhost:8081 to view the **Node List** and then verify that the node has rejoined the cluster using the new version of the binary. - -## Step 4. Upgrade the rest of the nodes to v19.2 - -1. In node 2's terminal, press **CTRL-C** to terminate the `cockroach` process. - -2. Verify that node 2 has been terminated: - - {% include copy-clipboard.html %} - ~~~ shell - $ ps | grep cockroach - ~~~ - - You should not see a `cockroach` process with `--store=node2` and `--port=26258`. - - ~~~ - 49659 ttys001 0:07.05 ./cockroach-v19.1 start --insecure --store=node3 --host=localhost --port=26259 --http-port=8082 --join=localhost:26257,localhost:26258,localhost:26259 - 49824 ttys002 0:00.00 grep cockroach - 49717 ttys015 0:05.76 ./cockroach start --insecure --store=node1 --listen-addr=localhost:26257 --http-addr=localhost:8080 --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. Restart the node using the v19.2 binary: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -4. Wait 1 minute. - -5. In node 3's terminal, press **CTRL-C** to terminate the `cockroach` process. - -6. Verify that node 3 has been terminated: - - {% include copy-clipboard.html %} - ~~~ shell - $ ps | grep cockroach - ~~~ - - You should not see a `cockroach` process with `--store=node3` and `--port=26259`. - - ~~~ - 49869 ttys001 0:00.01 grep cockroach - 49849 ttys002 0:02.38 ./cockroach start --insecure --store=node2 --listen-addr=localhost:26258 --http-addr=localhost:8081 --join=localhost:26257,localhost:26258,localhost:26259 - 49717 ttys015 0:10.88 ./cockroach start --insecure --store=node1 --listen-addr=localhost:26257 --http-addr=localhost:8080 --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -7. Restart the node using the v19.2 binary: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -## Step 5. Check your cluster's versions - -Back in the Admin UI, you'll see that all 3 nodes now have the same, upgraded version. You can also use the `cockroach node status` command to check each node's version: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach node status \ ---insecure -~~~ - -~~~ - id | address | sql_address | build | started_at | updated_at | locality | is_available | is_live -+----+-----------------+-----------------+-----------------------------------------+----------------------------------+----------------------------------+----------+--------------+---------+ - 1 | localhost:26257 | localhost:26257 | v19.2.0-alpha.20190606-2479-gd98e0839dc | 2019-10-01 20:14:55.249457+00:00 | 2019-10-01 20:16:07.283866+00:00 | | true | true - 2 | localhost:26258 | localhost:26258 | v19.2.0-alpha.20190606-2479-gd98e0839dc | 2019-10-01 20:14:55.445079+00:00 | 2019-10-01 20:16:02.972943+00:00 | | true | true - 3 | localhost:26259 | localhost:26259 | v19.2.0-alpha.20190606-2479-gd98e0839dc | 2019-10-01 20:14:55.857631+00:00 | 2019-10-01 20:16:03.389338+00:00 | | true | true -(3 rows) -~~~ - -## Step 6. Clean up - -This is the last module of the training, so feel free to stop you cluster and clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 - ~~~ diff --git a/src/archived/training/data-corruption-troubleshooting.md b/src/archived/training/data-corruption-troubleshooting.md deleted file mode 100644 index 71ce5a7e675..00000000000 --- a/src/archived/training/data-corruption-troubleshooting.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Data Corruption Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a 3-node cluster - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~~ - -2. In a new terminal, start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~ - -3. In a new terminal, start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~ - -4. In a new terminal, perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Prepare to simulate the problem - -Before you can manually corrupt data, you need to import enough data so that the cluster creates persistent `.sst` files. - -1. Create a database into which you'll import a new table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="CREATE DATABASE import_test;" - ~~~ - -2. Run the [`IMPORT`](../import.html) command, using schema and data files we've made publicly available on Google Cloud Storage: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database="import_test" \ - --execute="IMPORT TABLE orders CREATE USING 'https://storage.googleapis.com/cockroach-fixtures/tpch-csv/schema/orders.sql' CSV DATA ('https://storage.googleapis.com/cockroach-fixtures/tpch-csv/sf-1/orders.tbl.1') WITH delimiter = '|';" - ~~~ - - The import will take a minute or two. Once it completes, you'll see a confirmation with details: - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - +--------------------+-----------+--------------------+--------+---------------+----------------+----------+ - 378521252933861377 | succeeded | 1 | 187500 | 375000 | 0 | 26346739 - (1 row) - ~~~ - -## Step 2. Simulate the problem - -1. In the same terminal, look in the data directory of `node3`: - - {% include copy-clipboard.html %} - ~~~ shell - $ ls node3 - ~~~ - - ~~~ - 000003.log IDENTITY OPTIONS-000005 cockroach.http-addr - 000006.sst LOCK auxiliary cockroach.listen-addr - COCKROACHDB_VERSION MANIFEST-000001 cockroach-temp478417278 logs - CURRENT MANIFEST-000007 cockroach.advertise-addr temp-dirs-record.txt - ~~~ - -2. Delete one of the `.sst` files. - -3. In the terminal where node 3 is running, press **CTRL-C** to stop it. - -4. Try to restart node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~ - - The startup process will fail, and you'll see the following printed to `stderr`: - - ~~~ - W180209 10:45:03.684512 1 cli/start.go:697 Using the default setting for --cache (128 MiB). - A significantly larger value is usually needed for good performance. - If you have a dedicated server a reasonable setting is --cache=25% (2.0 GiB). - W180209 10:45:03.805541 37 gossip/gossip.go:1241 [n?] no incoming or outgoing connections - E180209 10:45:03.808537 1 cli/error.go:68 cockroach server exited with error: failed to create engines: could not open rocksdb instance: Corruption: Sst file size mismatch: /Users/jesseseldess/cockroachdb-training/cockroach-{{page.release_info.version}}.darwin-10.9-amd64/node3/000006.sst. Size recorded in manifest 2626945, actual size 2626210 - * - * ERROR: cockroach server exited with error: failed to create engines: could not open rocksdb instance: Corruption: Sst file size mismatch: /Users/jesseseldess/cockroachdb-training/cockroach-{{page.release_info.version}}.darwin-10.9-amd64/node3/000006.sst. Size recorded in manifest 2626945, actual size 2626210 - * - * - Failed running "start" - ~~~ - - The error tells you that the failure has to do with RocksDB-level (i.e., storage-level) corruption. Because the node's data is corrupt, the node will not restart. - -## Step 3. Resolve the problem - -Because only 1 node's data is corrupt, the solution is to completely remove the node's data directory and restart the node. - -1. Remove the `node3` data directory: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node3 - ~~~ - -2. In the terminal where node 3 was running, restart the node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~ - -In this case, the cluster repairs the node using data from the other nodes. In more severe emergencies where multiple disks are corrupted, there are tools like `cockroach debug rocksdb` to let you inspect the files in more detail and try to repair them. If enough nodes/files are corrupted, [restoring to a enterprise backup](../restore.html) is best. - -{{site.data.alerts.callout_danger}} -In all cases of data corruption, you should [get support from Cockroach Labs](how-to-get-support.html). -{{site.data.alerts.end}} - -## What's next? - -[Software Panic Troubleshooting](software-panic-troubleshooting.html) diff --git a/src/archived/training/data-import.md b/src/archived/training/data-import.md deleted file mode 100644 index f447c3aec50..00000000000 --- a/src/archived/training/data-import.md +++ /dev/null @@ -1,339 +0,0 @@ ---- -title: Data Import -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous lab. - -## Step 1. Start a 3-node cluster - -Start and initialize a cluster like you did in previous modules. - -{{site.data.alerts.callout_info}} -To simplify the process of running multiple nodes on your local computer, you'll start them in the [background](../cockroach-start.html#general) instead of in separate terminals. -{{site.data.alerts.end}} - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Import CSV data from remote file storage - -1. In a new terminal, create a database into which you'll import a new table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="CREATE DATABASE IF NOT EXISTS tabular_import;" - ~~~ - -2. Run the [`IMPORT`](../import.html) statement, using schema and data files we've made publicly available on Google Cloud Storage: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database="tabular_import" \ - --execute="IMPORT TABLE orders CREATE USING 'https://storage.googleapis.com/cockroach-fixtures/tpch-csv/schema/orders.sql' CSV DATA ('https://storage.googleapis.com/cockroach-fixtures/tpch-csv/sf-1/orders.tbl.1') WITH delimiter = '|';" - ~~~ - - The import will take a minute or two. To check the status of the import, navigate to the **Admin UI > [Jobs page](../admin-ui-jobs-page.html)**. Once it completes, you'll see a confirmation with details: - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - +--------------------+-----------+--------------------+--------+---------------+----------------+----------+ - 378471816945303553 | succeeded | 1 | 187500 | 375000 | 0 | 26346739 - (1 row) - ~~~ - -3. Check the schema of the imported `orders` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database="tabular_import" \ - --execute="SHOW CREATE orders;" - ~~~ - - ~~~ - table_name | create_statement - +------------+---------------------------------------------------------------------------------------------------------------------------------------------+ - orders | CREATE TABLE orders ( - | o_orderkey INTEGER NOT NULL, - | o_custkey INTEGER NOT NULL, - | o_orderstatus STRING(1) NOT NULL, - | o_totalprice DECIMAL(15,2) NOT NULL, - | o_orderdate DATE NOT NULL, - | o_orderpriority STRING(15) NOT NULL, - | o_clerk STRING(15) NOT NULL, - | o_shippriority INTEGER NOT NULL, - | o_comment STRING(79) NOT NULL, - | CONSTRAINT "primary" PRIMARY KEY (o_orderkey ASC), - | INDEX o_ck (o_custkey ASC), - | INDEX o_od (o_orderdate ASC), - | FAMILY "primary" (o_orderkey, o_custkey, o_orderstatus, o_totalprice, o_orderdate, o_orderpriority, o_clerk, o_shippriority, o_comment) - | ) - (1 row) - ~~~ - - {{site.data.alerts.callout_info}} - You can also view the schema by navigating to the **Admin UI > [Databases](../admin-ui-databases-page.html)** page and clicking on the table name. - {{site.data.alerts.end}} - -4. Read some data from the imported `orders` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database="tabular_import" \ - --execute="SELECT o_orderkey, o_custkey, o_comment FROM orders WHERE o_orderstatus = 'O' LIMIT 10;" - ~~~ - - ~~~ - o_orderkey | o_custkey | o_comment - +------------+-----------+-------------------------------------------------------------------------------+ - 1 | 36901 | nstructions sleep furiously among - 2 | 78002 | foxes. pending accounts at the pending, silent asymptot - 4 | 136777 | sits. slyly regular warthogs cajole. regular, regular theodolites acro - 7 | 39136 | ly special requests - 32 | 130057 | ise blithely bold, regular requests. quickly unusual dep - 34 | 61001 | ly final packages. fluffily final deposits wake blithely ideas. spe - 35 | 127588 | zzle. carefully enticing deposits nag furio - 36 | 115252 | quick packages are blithely. slyly silent accounts wake qu - 38 | 124828 | haggle blithely. furiously express ideas haggle blithely furiously regular re - 39 | 81763 | ole express, ironic requests: ir - (10 rows) - ~~~ - -## Step 3. Import a PostgreSQL dump file - -If you're importing data from a PostgreSQL database, you can import the `.sql` file generated by the [`pg_dump`][pg_dump] command, after editing the file to be compatible with CockroachDB. - -{{site.data.alerts.callout_success}} -The `.sql` files generated by `pg_dump` provide better performance because they use the `COPY` statement instead of bulk `INSERT` statements. -{{site.data.alerts.end}} - -1. Download our sample [`pg_dump.sql`](resources/pg_dump.sql) file using [`curl`][curl] or [`wget`][wget], depending on which you have installed: - - {% include copy-clipboard.html %} - ~~~ shell - $ curl -O {{site.url}}/docs/{{page.version.version}}/training/resources/pg_dump.sql - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ wget {{site.url}}/docs/{{page.version.version}}/training/resources/pg_dump.sql - ~~~ - -2. Take a look at the `pg_dump.sql` file, which contains 2 tables, `customers` and `accounts`, as well as some constraints on both tables. - - Before this file can be imported into CockroachDB, it must be edited for compatibility as follows: - - The `CREATE SCHEMA` statement must be removed. - - The `ALTER SCHEMA` statement must be removed. - -3. Instead of manually cleaning the file, you can download our pre-cleaned version using [`curl`][curl] or [`wget`][wget]: - - {% include copy-clipboard.html %} - ~~~ shell - $ curl -O {{site.url}}/docs/{{page.version.version}}/training/resources/pg_dump_cleaned.sql - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ wget {{site.url}}/docs/{{page.version.version}}/training/resources/pg_dump_cleaned.sql - ~~~ - -4. Create a database you can use for the import: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="CREATE DATABASE IF NOT EXISTS pg_import;" - ~~~ - -5. Import the dump: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database=pg_import \ - --execute="IMPORT PGDUMP '{{site.url}}/docs/{{page.version.version}}/training/resources/pg_dump_cleaned.sql';" - ~~~ - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - --------------------+-----------+--------------------+------+---------------+----------------+------- - 409923615993004033 | succeeded | 1 | 10 | 5 | 0 | 258 - ~~~ - -6. Read from the imported data: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database=pg_import \ - --execute="SELECT customers.name, accounts.balance FROM accounts JOIN customers ON accounts.customer_id = customers.id;" - ~~~ - - ~~~ - name | balance - +------------------+---------+ - Bjorn Fairclough | 100 - Arturo Nevin | 200 - Juno Studwick | 400 - Naseem Joossens | 200 - Eutychia Roberts | 200 - (5 rows) - ~~~ - - {{site.data.alerts.callout_info}} - You can view the schema by navigating to the **Admin UI > [Databases](../admin-ui-databases-page.html)** page and clicking on the table name. - {{site.data.alerts.end}} - -## Step 4. Import a MySQL dump file - -If you're importing data from a MySQL database, you can import the `.sql` file generated by the [`mysqldump`][mysqldump] command. - -1. Download our sample [`mysql_dump.sql`](resources/mysql_dump.sql) file using [`curl`][curl] or [`wget`][wget]: - - {% include copy-clipboard.html %} - ~~~ shell - $ curl -O {{site.url}}/docs/{{page.version.version}}/training/resources/mysql_dump.sql - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ wget {{site.url}}/docs/{{page.version.version}}/training/resources/mysql_dump.sql - ~~~ - -2. Take a look at the `pg_dump.sql` file, which contains 2 tables, `customers` and `accounts`, as well as some constraints on both tables. - -3. Create a database you can use for the import: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="CREATE DATABASE IF NOT EXISTS mysql_import;" - ~~~ - -4. Import the dump: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="IMPORT MYSQLDUMP '{{site.url}}/docs/{{page.version.version}}/training/resources/mysql_dump.sql';" - ~~~ - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - --------------------+-----------+--------------------+------+---------------+----------------+------- - 409923615993004033 | succeeded | 1 | 10 | 5 | 0 | 258 - ~~~ - -5. Read from the imported data: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT customers.name, accounts.balance FROM accounts JOIN customers ON accounts.customer_id = customers.id;" - ~~~ - - ~~~ - name | balance - +------------------+---------+ - Bjorn Fairclough | 100 - Arturo Nevin | 200 - Juno Studwick | 400 - Naseem Joossens | 200 - Eutychia Roberts | 200 - (5 rows) - ~~~ - - {{site.data.alerts.callout_info}} - You can view the schema by navigating to the **Admin UI > [Databases](../admin-ui-databases-page.html)** page and clicking on the table name. - {{site.data.alerts.end}} - -## What's next? - -[SQL Basics](sql-basics.html) - - - -[curl]: https://curl.haxx.se/ -[wget]: https://www.gnu.org/software/wget/ -[pg_dump]: https://www.postgresql.org/docs/current/app-pgdump.html -[mysqldump]: https://dev.mysql.com/doc/refman/8.0/en/mysqldump-sql-format.html diff --git a/src/archived/training/data-unavailability-troubleshooting.md b/src/archived/training/data-unavailability-troubleshooting.md deleted file mode 100644 index 6ad7e7dd4ad..00000000000 --- a/src/archived/training/data-unavailability-troubleshooting.md +++ /dev/null @@ -1,304 +0,0 @@ ---- -title: Data Unavailability Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a cluster spread across 3 separate localities - -Create a 9-node cluster, with 3 nodes in each of 3 different localities. - -1. In a new terminal, start node 1 in locality `us-east-1`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-1 \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. In the same terminal, perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -3. In a new terminal, start node 2 in locality `us-east-1`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-1 \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -4. In the same terminal, start node 3 in locality `us-east-1`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-1 \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -5. In the same terminal, start node 4 in locality `us-east-2`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-2 \ - --store=node4 \ - --listen-addr=localhost:26260 \ - --http-addr=localhost:8083 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -6. In the same terminal, start node 5 in locality `us-east-2`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-2 \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -7. In the same terminal, start node 6 in locality `us-east-2`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-2 \ - --store=node6 \ - --listen-addr=localhost:26262 \ - --http-addr=localhost:8085 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -8. In the same terminal, start node 7 in locality `us-east-3`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-3 \ - --store=node7 \ - --listen-addr=localhost:26263 \ - --http-addr=localhost:8086 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -9. In the same terminal, start node 8 in locality `us-east-3`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-3 \ - --store=node8 \ - --listen-addr=localhost:26264 \ - --http-addr=localhost:8087 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -10. In the same terminal, start node 9 in locality `us-east-3`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-3 \ - --store=node9 \ - --listen-addr=localhost:26265 \ - --http-addr=localhost:8088 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -## Step 2. Prepare to simulate the problem - -In preparation, add a table and use a replication zone to force the table's data onto the new nodes. - -1. In a new terminal, generate an `intro` database with a `mytable` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data intro | cockroach sql \ - --insecure \ - --host=localhost:26257 - ~~~ - -2. Create a [replication zone](../configure-replication-zones.html) forcing the replicas of the `mytable` range to be located on nodes with the `datacenter=us-east-3` locality: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --execute="ALTER TABLE intro.mytable CONFIGURE ZONE USING constraints='[+datacenter=us-east-3]';" --insecure --host=localhost:26257 - ~~~ - -3. Use the `SHOW RANGES` SQL command to determine the nodes on which the replicas for the `mytable` table are now located: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW RANGES FROM TABLE intro.mytable;" - ~~~ - - ~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities - +-----------+---------+----------+---------------+--------------+-----------------------+----------+------------------------------------------------------------------+ - NULL | NULL | 25 | 0.003054 | 9 | datacenter=us-east-3 | {7,8,9} | {datacenter=us-east-3,datacenter=us-east-3,datacenter=us-east-3} - (1 row) - ~~~ - -4. The node IDs above may not match the order in which we started the nodes because node IDs only get allocated after `cockroach init` is run. You can verify that the nodes listed by `SHOW RANGES` are all in the `datacenter=us-east-3` locality by opening the **Node Diagnostics** debug page at http://localhost:8080/#/reports/nodes and checking the locality for each of the 3 node IDs. - - CockroachDB Admin UI - -## Step 3. Simulate the problem - -Stop 2 of the nodes containing `mytable` replicas. This will cause the range to lose a majority of its replicas and become unavailable. However, all other ranges are spread evenly across all three localities because the replication zone only applies to `mytable`, so the cluster as a whole will remain available. - -1. Kill nodes 8 and 9: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach quit \ - --insecure \ - --host=localhost:26264 - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach quit \ - --insecure \ - --host=localhost:26265 - ~~~ - -## Step 4. Troubleshoot the problem - -1. In a new terminal, try to insert into the `mytable` table, pointing at a node that is still online: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="INSERT INTO intro.mytable VALUES (42, '')" \ - --logtostderr=WARNING - ~~~ - - Because the range for `mytable` no longer has a majority of its replicas, the query will hang indefinitely. - -2. Go back to the Admin UI at http://localhost:8080 and click **Metrics** on the left. - -3. Select the **Replication** dashboard. - -4. Hover over the **Ranges** graph: - - CockroachDB Admin UI - - You should see that 1 range is now unavailable. If the unavailable count is larger than 1, that would mean that some system ranges had a majority of replicas on the down nodes as well. - - The **Summary** panel on the right should tell you the same thing: - - CockroachDB Admin UI - -5. For more insight into the ranges that are unavailable, go to the **Problem Ranges Report** at http://localhost:8080/#/reports/problemranges. - - CockroachDB Admin UI - -## Step 5. Resolve the problem - -1. In a new terminal, restart the stopped nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-3 \ - --store=node8 \ - --listen-addr=localhost:26264 \ - --http-addr=localhost:8087 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-3 \ - --store=node9 \ - --listen-addr=localhost:26265 \ - --http-addr=localhost:8088 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Go back to the Admin UI, click **Metrics** on the left, and verify that ranges are no longer unavailable. - -4. Check back on your `INSERT` statement that was stuck and verify that it completed successfully. - -## Step 6. Clean up - -In the next lab, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 node5 node6 node7 node8 node9 - ~~~ - -## What's next? - -[Data Corruption Troubleshooting](data-corruption-troubleshooting.html) diff --git a/src/archived/training/fault-tolerance-and-automated-repair.md b/src/archived/training/fault-tolerance-and-automated-repair.md deleted file mode 100644 index d07358334b8..00000000000 --- a/src/archived/training/fault-tolerance-and-automated-repair.md +++ /dev/null @@ -1,281 +0,0 @@ ---- -title: Fault Tolerance and Automated Repair -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - - - - - -## Before You Begin - -Make sure you have already completed [Cluster Startup and Scaling](cluster-startup-and-scaling.html) and have 5 nodes running locally. - -## Step 1. Set up load balancing - -In this module, you'll run a sample workload to simulate multiple client connections. Each node is an equally suitable SQL gateway for the load, but it's always recommended to spread requests evenly across nodes. You'll use the open-source [HAProxy](http://www.haproxy.org/) load balancer to do that here. - -1. In a new terminal, install HAProxy. - -
    - - -
    -

    - -
    - If you're on a Mac and use Homebrew, run: - {% include copy-clipboard.html %} - ~~~ shell - $ brew install haproxy - ~~~ -
    - -
    - If you're using Linux and use apt-get, run: - {% include copy-clipboard.html %} - ~~~ shell - $ sudo apt-get install haproxy - ~~~ -
    - -2. Run the [`cockroach gen haproxy`](../cockroach-gen.html) command, specifying the port of any node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen haproxy \ - --insecure \ - --host=localhost \ - --port=26257 - ~~~ - - This command generates an `haproxy.cfg` file automatically configured to work with the nodes of your running cluster. - -3. In `haproxy.cfg`, change `bind :26257` to `bind :26000`. This changes the port on which HAProxy accepts requests to a port that is not already in use by a node. - - {% include copy-clipboard.html %} - ~~~ shell - sed -i.saved 's/^ bind :26257/ bind :26000/' haproxy.cfg - ~~~ - -4. Start HAProxy, with the `-f` flag pointing to the `haproxy.cfg` file: - - {% include copy-clipboard.html %} - ~~~ shell - $ haproxy -f haproxy.cfg & - ~~~ - -## Step 2. Run a sample workload - -Now that you have a load balancer running in front of your cluster, use the YCSB workload built into CockroachDB to simulate multiple client connections, each performing mixed read/write workloads. - -1. In a new terminal, load the initial `ycsb` schema and data, pointing it at HAProxy's port: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach workload init ycsb \ - 'postgresql://root@localhost:26000?sslmode=disable' - ~~~ - -2. Run the `ycsb` workload, pointing it at HAProxy's port: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach workload run ycsb \ - --duration=20m \ - --concurrency=3 \ - --max-rate=1000 \ - --splits=50 \ - 'postgresql://root@localhost:26000?sslmode=disable' - ~~~ - - This command initiates 3 concurrent client workloads for 20 minutes, but limits the total load to 1000 operations per second (since you're running everything on a single machine). - - Also, the `--splits` flag tells the workload to manually split ranges a number of times. This is not something you'd normally do, but for the purpose of this training, it makes it easier to visualize the movement of data in the cluster. - -## Step 3. Check the workload - -Initially, the workload creates a new database called `ycsb`, creates a `usertable` table in that database, and inserts a bunch of rows into the table. Soon, the load generator starts executing approximately 95% reads and 5% writes. - -1. To check the SQL queries getting executed, go back to the Admin UI at http://localhost:8080, click **Metrics** on the left, and hover over the **SQL Queries** graph at the top: - - CockroachDB Admin UI - -2. To check the client connections from the load generator, select the **SQL** dashboard and hover over the **SQL Connections** graph: - - CockroachDB Admin UI - - You'll notice 3 client connections for the 3 concurrent workloads from the load generator. If you want to check that HAProxy balanced each connection to a different node, you can change the **Graph** dropdown from **Cluster** to each of the nodes. For three of the nodes, you'll see a single client connection. - -3. To see more details about the `ycsb` database and `usertable` table, click **Databases** in the upper left and then scroll down until you see **ycsb**: - - CockroachDB Admin UI - - You can also view the schema of the `usertable` by clicking the table name: - - CockroachDB Admin UI - -## Step 4. Simulate a single node failure - -When a node fails, the cluster waits for the node to remain offline for 5 minutes by default before considering it dead, at which point the cluster automatically repairs itself by re-replicating any of the replicas on the down nodes to other available nodes. - -1. In a new terminal, reduce the amount of time the cluster waits before considering a node dead to the minimum allowed of 1 minute and 15 seconds: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26000 \ - --execute="SET CLUSTER SETTING server.time_until_store_dead = '1m15s';" - ~~~ - -2. Then use the [`cockroach quit`](../cockroach-quit.html) command to stop node 5: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach quit \ - --insecure \ - --host=localhost:26261 - ~~~ - -## Step 5. Check load continuity and cluster health - -Go back to the Admin UI, click **Metrics** on the left, and verify that the cluster as a whole continues serving data, despite one of the nodes being unavailable and marked as **Suspect**: - -CockroachDB Admin UI - -This shows that when all ranges are replicated 3 times (the default), the cluster can tolerate a single node failure because the surviving nodes have a majority of each range's replicas (2/3). - -## Step 6. Watch the cluster repair itself - -Scroll down to the **Replicas per Node** graph: - -CockroachDB Admin UI - -Because you reduced the time it takes for the cluster to consider the down node dead, after 1 minute or so, you'll see the replica count on nodes 1 through 4 increase. This shows the cluster repairing itself by re-replicating missing replicas. - -## Step 7. Prepare for two simultaneous node failures - -At this point, the cluster has recovered and is ready to handle another failure. However, the cluster cannot handle two _near-simultaneous_ failures in this configuration. Failures are "near-simultaneous" if they are closer together than the `server.time_until_store_dead` setting plus the time taken for the number of replicas on the dead node to drop to zero. If two failures occurred in this configuration, some ranges would become unavailable until one of the nodes recovers. - -To be able to tolerate 2 of 5 nodes failing simultaneously without any service interruption, ranges must be replicated 5 times. - -1. Restart node 5, using the same command you used to start the node initially: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -2. In a new terminal, use the [`ALTER RANGE ... CONFIGURE ZONE`](../configure-zone.html) command to change the cluster's `default` replication factor to 5: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --execute="ALTER RANGE default CONFIGURE ZONE USING num_replicas=5;" --insecure --host=localhost:26000 - ~~~ - -3. Back in the Admin UI **Metrics** dashboard, watch the **Replicas per Node** graph to see how the replica count increases and evens out across all 5 nodes: - - CockroachDB Admin UI - - This shows the cluster up-replicating so that each range has 5 replicas, one on each node. - -## Step 8. Simulate two simultaneous node failures - -1. Use the [`cockroach quit`](../cockroach-quit.html) command to stop nodes 4 and 5: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach quit --insecure --host=localhost:26260 - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach quit --insecure --host=localhost:26261 - ~~~ - -## Step 9. Check load continuity and cluster health - -1. Like before, go to the Admin UI, click **Metrics** on the left, and verify that the cluster as a whole continues serving data, despite 2 nodes being offline: - - CockroachDB Admin UI - - This shows that when all ranges are replicated 5 times, the cluster can tolerate 2 simultaneous node outages because the surviving nodes have a majority of each range's replicas (3/5). - -2. To verify this further, use the `cockroach sql` command to count the number of rows in the `ycsb.usertable` table and verify that it is still serving reads: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT count(*) FROM ycsb.usertable;" - ~~~ - - ~~~ - count - +-------+ - 10000 - (1 row) - ~~~ - - And writes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="INSERT INTO ycsb.usertable VALUES ('asdf', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);" - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT count(*) FROM ycsb.usertable;" - ~~~ - - ~~~ - count - +-------+ - 10001 - (1 row) - ~~~ - -## Step 10. Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Stop all CockroachDB nodes, HAProxy, and the YCSB load generator: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach haproxy ycsb - ~~~ - - This simplified shutdown process is only appropriate for a lab/evaluation scenario. - -2. Remove the nodes' data directories and the HAProxy config: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 node5 haproxy.cfg - ~~~ - -## What's Next? - -[Locality and Replication Zones](locality-and-replication-zones.html) diff --git a/src/archived/training/geo-partitioning.md b/src/archived/training/geo-partitioning.md deleted file mode 100644 index 732cf0dbce3..00000000000 --- a/src/archived/training/geo-partitioning.md +++ /dev/null @@ -1,580 +0,0 @@ ---- -title: Geo-Partitioning -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a cluster in one US region - -Start a cluster like you did previously, using the [`--locality`](../configure-replication-zones.html#descriptive-attributes-assigned-to-nodes) flag to indicate that the nodes are in the `us-east1` region, with each node in a distinct datacenter: - -1. Start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-east1,datacenter=us-east1-a \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-east1,datacenter=us-east1-b \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-east1,datacenter=us-east1-c \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Use the [`cockroach init`](../cockroach-init.html) command to perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Expand into 2 more US regions - -Add 6 more nodes, 3 in the `us-west1` region and 3 in the `us-west2` region, with each node in a distinct datacenter: - -1. Start node 4: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west1,datacenter=us-west1-a \ - --store=node4 \ - --listen-addr=localhost:26260 \ - --http-addr=localhost:8083 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 5: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west1,datacenter=us-west1-b \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -3. Start node 6: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west1,datacenter=us-west1-c \ - --store=node6 \ - --listen-addr=localhost:26262 \ - --http-addr=localhost:8085 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -4. Start node 7: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west2,datacenter=us-west2-a \ - --store=node7 \ - --listen-addr=localhost:26263 \ - --http-addr=localhost:8086 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -5. Start node 8: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west2,datacenter=us-west2-b \ - --store=node8 \ - --listen-addr=localhost:26264 \ - --http-addr=localhost:8087 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -6. Start node 9: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west2,datacenter=us-west2-c \ - --store=node9 \ - --listen-addr=localhost:26265 \ - --http-addr=localhost:8088 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -## Step 3. Enable a trial enterprise license - -The table partitioning feature requires an [enterprise license](https://www.cockroachlabs.com/get-started-cockroachdb/). - -1. [Request a trial enterprise license](https://www.cockroachlabs.com/get-cockroachdb/enterprise/). You should receive your trial license via email within a few minutes. - -2. Enable your trial license: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING cluster.organization = '';" - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING enterprise.license = '';" - ~~~ - - -## Step 4. Load the MovR dataset - -Now you'll import data representing users, vehicles, and rides for the fictional vehicle-sharing app, [MovR](../movr.html). - -1. Use the [`cockroach workload`](../cockroach-demo.html) command: - - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach workload init movr --num-users=5000 --num-rides=50000 --num-vehicles=500 - ~~~ - - This command creates the `movr` database with six tables: `users`, `vehicles`, `rides`, `promo_codes`, `vehicle_location_histories`, and `user_promo_codes`. The [`--num`](../cockroach-workload.html#movr-workload) flags specify a larger quantity of data to generate for the `users`, `rides`, and `vehicles` tables. - - -2. Start the [built-in SQL shell](../cockroach-sql.html): - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --insecure --host=localhost - ~~~ - -3. Use [`SHOW TABLES`](../show-tables.html) to verify that `cockroach workload` created the `movr` tables: - - {% include copy-clipboard.html %} - ~~~ sql - > SHOW TABLES FROM movr; - ~~~ - ~~~ - table_name - +----------------------------+ - promo_codes - rides - user_promo_codes - users - vehicle_location_histories - vehicles - (6 rows) - ~~~ - -## Step 5. Check data distribution before partitioning - -At this point, the data for the three MovR tables (`users`, `rides`, and `vehicles`) is evenly distributed across all three localities. For example, let's check where the replicas of the `vehicles` and `users` tables are located: - -{% include copy-clipboard.html %} -~~~ sql -> SHOW RANGES FROM TABLE vehicles; -~~~ - -~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities -+-----------+---------+----------+---------------+--------------+---------------------------------------+----------+---------------------------------------------------------------------------------------------------------------------------+ - NULL | NULL | 26 | 0.123054 | 2 | region=us-east1,datacenter=us-east1-b | {2,5,7} | {"region=us-east1,datacenter=us-east1-b","region=us-west1,datacenter=us-west1-b","region=us-west2,datacenter=us-west2-a"} -(1 row) -~~~ - -{% include copy-clipboard.html %} -~~~ sql -> SHOW RANGES FROM TABLE users; -~~~ - -~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities -+-----------+---------+----------+---------------+--------------+---------------------------------------+----------+---------------------------------------------------------------------------------------------------------------------------+ - NULL | NULL | 25 | 0.554324 | 3 | region=us-east1,datacenter=us-east1-c | {3,6,9} | {"region=us-east1,datacenter=us-east1-c","region=us-west1,datacenter=us-west1-c","region=us-west2,datacenter=us-west2-c"} -(1 row) -~~~ - -Note: you may need to execute `use movr;` to be in the proper database context. For added clarity, here's a key showing how nodes map to localities: - -Node ID | Region | Datacenter ---------|--------|----------- -1 | `us-east1` | `us-east1-a` -2 | `us-east1` | `us-east1-b` -3 | `us-east1` | `us-east1-c` -4 | `us-west1` | `us-west1-a` -5 | `us-west1` | `us-west1-b` -6 | `us-west1` | `us-west1-c` -7 | `us-west2` | `us-west2-a` -8 | `us-west2` | `us-west2-b` -9 | `us-west2` | `us-west2-c` - -In this case, for the single range containing `vehicles` data, replicas are in all three regions, and the leaseholder is in the `us-east1` region. For the single range containing `users` data, replicas are in all three regions, and the leaseholder is in the `us-east1` region. - -## Step 6. Consider performance before partitioning - -In a real deployment, with nodes truly distributed across 3 regions of the US, having the MovR data evenly spread out would mean that reads and writes would often bounce back and forth across the country, causing high read and write latencies. - -### Reads - -For example, imagine you are a MovR administrator in San Francisco, and you want to get the IDs and descriptions of all San Francisco-based bikes that are currently in use. You issue the following query to one of the nodes in the `us-west2` region: - -{% include copy-clipboard.html %} -~~~ sql -> SELECT id, ext FROM vehicles -WHERE city = 'san francisco' AND type = 'bike' AND status = 'in_use'; -~~~ - -All requests initially go to the leaseholder for the relevant range. As you saw earlier, the leaseholder for the single range of the `vehicles` table is in the `us-east1` region, so in this case, the following would happen: - -1. The node receiving the request (the gateway node) in the `us-west2` region would route the request to the node in the `us-east1` region with the leaseholder. - -2. The leaseholder node would execute the query and return the data to the gateway node. - -3. The gateway node would return the data to the client. - -In summary, this simple read request have to travel back and forth across the entire country. - -### Writes - -The geographic distribution of the MovR data is even more likely to impact write performance. For example, imagine that a user in New York and a user in Seattle want to create new MovR accounts: - -{% include copy-clipboard.html %} -~~~ sql -> INSERT INTO users -VALUES (gen_random_uuid(), 'new york', 'New Yorker', '111 West Street', '9822222379937347'); -~~~ - -{% include copy-clipboard.html %} -~~~ sql -> INSERT INTO users -VALUES (gen_random_uuid(), 'seattle', 'Seattler', '111 East Street', '1736352379937347'); -~~~ - -For the single range containing `users` data, one replica is in each region, with the leaseholder in the `us-west1` region. This means that: - -- When creating the user in Seattle, the request doesn't have to leave the region to reach the leaseholder. However, since a write requires consensus from its replica group, the write has to wait for confirmation from either the replica in `us-east1` (New York, Boston, Washington DC) or `us-west2` (Los Angeles, San Francisco) before committing and then returning confirmation to the client. - -- When creating the user in New York, there are more network hops and, thus, increased latency. The request first needs to travel across the continent to the leaseholder in `us-west1`. It then has to wait for confirmation from either the replica in `us-east1` (New York, Boston, Washington DC) or `us-west2` (Los Angeles, San Francisco) before committing and then returning confirmation to the client back in the west. - -## Step 7. Partition data by city - -For this service, the most effective technique for improving read and write latency is to geo-partition the data by city. In essence, this means changing the way data is mapped to ranges. Instead of an entire table and its indexes mapping to a specific range or set of ranges, all rows in the table and its indexes with a given city will map to a range or set of ranges. - -1. Partition the `users` table by city: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER TABLE users - PARTITION BY LIST (city) ( - PARTITION new_york VALUES IN ('new york'), - PARTITION boston VALUES IN ('boston'), - PARTITION washington_dc VALUES IN ('washington dc'), - PARTITION seattle VALUES IN ('seattle'), - PARTITION san_francisco VALUES IN ('san francisco'), - PARTITION los_angeles VALUES IN ('los angeles') - ); - ~~~ - -2. Partition the `vehicles` table by city: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER TABLE vehicles - PARTITION BY LIST (city) ( - PARTITION new_york VALUES IN ('new york'), - PARTITION boston VALUES IN ('boston'), - PARTITION washington_dc VALUES IN ('washington dc'), - PARTITION seattle VALUES IN ('seattle'), - PARTITION san_francisco VALUES IN ('san francisco'), - PARTITION los_angeles VALUES IN ('los angeles') - ); - ~~~ - -3. Partition the `rides` table by city: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER TABLE rides - PARTITION BY LIST (city) ( - PARTITION new_york VALUES IN ('new york'), - PARTITION boston VALUES IN ('boston'), - PARTITION washington_dc VALUES IN ('washington dc'), - PARTITION seattle VALUES IN ('seattle'), - PARTITION san_francisco VALUES IN ('san francisco'), - PARTITION los_angeles VALUES IN ('los angeles') - ); - ~~~ - -{{site.data.alerts.callout_info}} -You didn't create any secondary indexes on your MovR tables. However, if you had, it would be important to partition the secondary indexes as well. -{{site.data.alerts.end}} - -## Step 8. Pin partitions close to users - -With the data partitioned by city, you can now use [replication zones](../configure-replication-zones.html#create-a-replication-zone-for-a-partition) to require that city data be stored on specific nodes based on locality: - -City | Locality ------|--------- -New York | `region=us-east1` -Boston | `region=us-east1` -Washington DC | `region=us-east1` -Seattle | `region=us-west1` -San Francisco | `region=us-west2` -Los Angeles | `region=us-west2` - -1. Start with the `users` table partitions: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER PARTITION new_york OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION boston OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION washington_dc OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION seattle OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-west1]'; - - > ALTER PARTITION san_francisco OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - - > ALTER PARTITION los_angeles OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - ~~~ - -2. Move on to the `vehicles` table partitions: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER PARTITION new_york OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION boston OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION washington_dc OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION seattle OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-west1]'; - - > ALTER PARTITION san_francisco OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - - > ALTER PARTITION los_angeles OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - ~~~ - -3. Finish with the `rides` table partitions: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER PARTITION new_york OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION boston OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION washington_dc OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION seattle OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-west1]'; - - > ALTER PARTITION san_francisco OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - - > ALTER PARTITION los_angeles OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - ~~~ - -{{site.data.alerts.callout_info}} -If you had created any secondary index partitions, it would be important to create replication zones for each such partition as well. -{{site.data.alerts.end}} - -## Step 9. Check data distribution after partitioning - -Over the next few minutes, CockroachDB will rebalance all partitions based on the constraints you defined. - -To check this, run the `SHOW RANGES` statement on the `vehicles` and `users` tables: - -{% include copy-clipboard.html %} -~~~ sql -> SELECT * FROM [SHOW RANGES FROM TABLE vehicles] -WHERE "start_key" NOT LIKE '%Prefix%'; -~~~ - -~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities -+------------------+----------------------------+----------+---------------+--------------+---------------------------------------+----------+---------------------------------------------------------------------------------------------------------------------------+ - /"boston" | /"boston"/PrefixEnd | 67 | 0.000144 | 1 | region=us-east1,datacenter=us-east1-a | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"washington dc" | /"washington dc"/PrefixEnd | 69 | 0.000151 | 1 | region=us-east1,datacenter=us-east1-a | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"new york" | /"new york"/PrefixEnd | 65 | 0.000304 | 2 | region=us-east1,datacenter=us-east1-b | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"seattle" | /"seattle"/PrefixEnd | 71 | 0.000167 | 5 | region=us-west1,datacenter=us-west1-b | {4,5,6} | {"region=us-west1,datacenter=us-west1-a","region=us-west1,datacenter=us-west1-b","region=us-west1,datacenter=us-west1-c"} - /"los angeles" | /"los angeles"/PrefixEnd | 75 | 0.000158 | 8 | region=us-west2,datacenter=us-west2-b | {7,8,9} | {"region=us-west2,datacenter=us-west2-a","region=us-west2,datacenter=us-west2-b","region=us-west2,datacenter=us-west2-c"} - /"san francisco" | /"san francisco"/PrefixEnd | 73 | 0.000307 | 8 | region=us-west2,datacenter=us-west2-b | {7,8,9} | {"region=us-west2,datacenter=us-west2-a","region=us-west2,datacenter=us-west2-b","region=us-west2,datacenter=us-west2-c"} -(6 rows) -~~~ - -{{site.data.alerts.callout_info}} -The `WHERE` clause in this query excludes the empty ranges between the city ranges. These empty ranges use the default replication zone configuration, not the zone configuration you set for the cities. -{{site.data.alerts.end}} - -For added clarity, here's a key showing how nodes map to datacenters and cities: - -Node IDs | Region | Cities ----------|--------|------- -1 - 3 | `region=us-east1` | New York, Boston, Washington DC -4 - 6 | `region=us-west1` | Seattle -7 - 9 | `region=us-west2` | San Francisco, Los Angeles - -We can see that, after partitioning, the replicas for New York, Boston, and Washington DC are located on nodes 1-3 in `us-east1`, replicas for Seattle are located on nodes 4-6 in `us-west1`, and replicas for San Francisco and Los Angeles are located on nodes 7-9 in `us-west2`. - -The same data distribution is in place for the partitions of other tables as well. For example, here's the `users` table: - -{% include copy-clipboard.html %} -~~~ sql -> SELECT * FROM [SHOW RANGES FROM TABLE users] -WHERE "start_key" IS NOT NULL AND "start_key" NOT LIKE '%Prefix%'; -~~~ - -~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities -+------------------+----------------------------+----------+---------------+--------------+---------------------------------------+----------+---------------------------------------------------------------------------------------------------------------------------+ - /"washington dc" | /"washington dc"/PrefixEnd | 49 | 0.000468 | 2 | region=us-east1,datacenter=us-east1-b | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"boston" | /"boston"/PrefixEnd | 47 | 0.000438 | 3 | region=us-east1,datacenter=us-east1-c | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"new york" | /"new york"/PrefixEnd | 45 | 0.000553 | 3 | region=us-east1,datacenter=us-east1-c | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"seattle" | /"seattle"/PrefixEnd | 51 | 0.00044 | 4 | region=us-west1,datacenter=us-west1-a | {4,5,6} | {"region=us-west1,datacenter=us-west1-a","region=us-west1,datacenter=us-west1-b","region=us-west1,datacenter=us-west1-c"} - /"los angeles" | /"los angeles"/PrefixEnd | 55 | 0.000457 | 7 | region=us-west2,datacenter=us-west2-a | {7,8,9} | {"region=us-west2,datacenter=us-west2-a","region=us-west2,datacenter=us-west2-b","region=us-west2,datacenter=us-west2-c"} - /"san francisco" | /"san francisco"/PrefixEnd | 53 | 0.000437 | 7 | region=us-west2,datacenter=us-west2-a | {7,8,9} | {"region=us-west2,datacenter=us-west2-a","region=us-west2,datacenter=us-west2-b","region=us-west2,datacenter=us-west2-c"} -(6 rows) -~~~ - -## Step 10. Consider performance after partitioning - -After partitioning, reads and writes for a specific city will be much faster because all replicas for that city are now located on the nodes closest to the city. To think this through, let's reconsider the read and write examples from before partitioning. - -### Reads - -Once again, imagine you are a MovR administrator in San Francisco, and you want to get the IDs and descriptions of all San Francisco-based bikes that are currently in use. You issue the following query to one of the nodes in the `us-west2` region: - -{% include copy-clipboard.html %} -~~~ sql -> SELECT id, ext FROM vehicles -WHERE city = 'san francisco' AND type = 'bike' AND status = 'in_use'; -~~~ - -- Before partitioning, the leaseholder for the `vehicles` table was in the `us-east1` region, causing the request to travel back and forth across the entire country. - -- Now, as you saw above, the leaseholder for the San Francisco partition of the `vehicles` table is the `us-west2` datacenter. This means that the read request does not need to leave the region. - -### Writes - -Now once again imagine that a user in Seattle and a user in New York want to create new MovR accounts. - -{% include copy-clipboard.html %} -~~~ sql -> INSERT INTO users -VALUES (gen_random_uuid(), 'seattle', 'Seattler', '111 East Street', '1736352379937347'); -~~~ - -{% include copy-clipboard.html %} -~~~ sql -> INSERT INTO users -VALUES (gen_random_uuid(), 'new york', 'New Yorker', '111 West Street', '9822222379937347'); -~~~ - -- Before partitioning, the leaseholder wasn't necessarily in the same region as the node receiving the request, and replicas required to reach consensus were spread across all regions, causing increased latency. - -- Now, as you saw above, all 3 replicas for the Seattle partition of the `users` table are in the `us-west1` datacenter, and all 3 replicas for the New York partition of the `users` table are the `us-east1` datacenter. This means that the write requests to do not need to leave their respective regions to achieve consensus and commit. - -## Step 11. Clean up - -In the next module, you'll start with a fresh cluster, so take a moment to clean things up. - -1. Exit the SQL shell: - - {% include copy-clipboard.html %} - ~~~ sql - > \q - ~~~ - -2. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - - This simplified shutdown process is only appropriate for a lab/evaluation scenario. - -3. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 node5 node6 node7 node8 node9 - ~~~ - -## What's next? - -[Orchestration with Kubernetes](orchestration-with-kubernetes.html) diff --git a/src/archived/training/how-cockroach-labs-debugs.md b/src/archived/training/how-cockroach-labs-debugs.md deleted file mode 100644 index bc6a46e043d..00000000000 --- a/src/archived/training/how-cockroach-labs-debugs.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: How Cockroach Labs Debugs -toc: false -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - -## What's next? - -[How to Get Support](how-to-get-support.html) diff --git a/src/archived/training/how-to-get-support.md b/src/archived/training/how-to-get-support.md deleted file mode 100644 index b29eb1c79cd..00000000000 --- a/src/archived/training/how-to-get-support.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: How to Get Support -toc: false -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - -When you encounter a problem that you cannot troubleshoot yourself (e.g., data corruption or software panic), [file an issue in the `cockroach` GitHub repository](https://github.com/cockroachdb/cockroach/issues/new) and include the following details. - -## Description of the problem - -- What happened? -- What did you expect to happen? - -## Steps to reproduce - -Make these as granular and precise as possible. - -## Screenshots - -If any Admin UI graphs or Debug pages show the problem, include screenshots. - -## Debug zip of active nodes - -Use the [`cockroach debug zip`](../cockroach-debug-zip.html) command to create a single file with the following details from all active nodes in your cluster: - -- Log files -- Schema change events -- Node liveness -- Gossip data -- Stack traces -- Range lists -- A list of databases and tables - -## Logs of offline nodes - -If any nodes are down, manually collect the logs of the down nodes, zip them up, and include them. diff --git a/src/archived/training/index.md b/src/archived/training/index.md deleted file mode 100644 index e0c76fbea92..00000000000 --- a/src/archived/training/index.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: CockroachDB Training -summary: Learn how to use CockroachDB for your applications -toc: false -feedback: false -sidebar_data: sidebar-data-training.json ---- - - - -CockroachDB training - -This training introduces you to the fundamentals of CockroachDB, with an emphasis on: - -- **Understanding the architecture** -- **Operational basics** - -The modules build on each other, so it's important to complete them in order. As you go, feel free to ask questions on our public [CockroachDB Community Slack](https://cockroachdb.slack.com) or [support forum](https://forum.cockroachlabs.com/). - - - -## What's first? - -[Why CockroachDB?](why-cockroachdb.html) diff --git a/src/archived/training/locality-and-replication-zones.md b/src/archived/training/locality-and-replication-zones.md deleted file mode 100644 index fd82446e6e1..00000000000 --- a/src/archived/training/locality-and-replication-zones.md +++ /dev/null @@ -1,406 +0,0 @@ ---- -title: Locality and Replication Zones -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a cluster in a single US region - -Start a cluster like you did previously, but this time use the [`--locality`](../configure-replication-zones.html#descriptive-attributes-assigned-to-nodes) flag to indicate that the nodes are all in a datacenter in the Eastern region of the US. - -{{site.data.alerts.callout_info}} -To simplify the process of running multiple nodes on your local computer, you'll start them in the [background](../cockroach-start.html#general) instead of in separate terminals. -{{site.data.alerts.end}} - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-east \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-east \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-east \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Use the [`cockroach init`](../cockroach-init.html) command to perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Check data distribution - -By default, CockroachDB tries to balance data evenly across specified "localities". At this point, since all three of the initial nodes have the same locality, the data is distributed across the 3 nodes. This means that for each range, one replica is on each node. - -To check this, open the Web UI at http://localhost:8080, view **Node List**, and check the replica count is the same on all nodes. - -## Step 3. Expand into 2 more US regions - -Add 6 more nodes, this time using the [`--locality`](../configure-replication-zones.html#descriptive-attributes-assigned-to-nodes) flag to indicate that 3 nodes are in the Central region and 3 nodes are in the Western region of the US. - -1. In a new terminal, start node 4: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-central \ - --store=node4 \ - --listen-addr=localhost:26260 \ - --http-addr=localhost:8083 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 5: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-central \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 6: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-central \ - --store=node6 \ - --listen-addr=localhost:26262 \ - --http-addr=localhost:8085 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - - You started nodes 4, 5, and 6 in the Central region. - -4. Start node 7: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-west \ - --store=node7 \ - --listen-addr=localhost:26263 \ - --http-addr=localhost:8086 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -5. Start node 8: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-west \ - --store=node8 \ - --listen-addr=localhost:26264 \ - --http-addr=localhost:8087 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -6. Start node 9: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-west \ - --store=node9 \ - --listen-addr=localhost:26265 \ - --http-addr=localhost:8088 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - - You started nodes 7, 8, and 9 in the West region. - -## Step 4. Write data and verify data distribution - -Now that there are 3 distinct localities in the cluster, the cluster will automatically ensure that, for every range, one replica is on a node in `us-east`, one is on a node in `us-central`, and one is on a node in `us-west`. - -To check this, let's create a table, which initially maps to a single underlying range, and check where the replicas of the range end up. - -1. Use the `cockroach gen` command to generate an example `intro` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data intro | cockroach sql \ - --insecure \ - --host=localhost:26257 - ~~~ - -2. Use the `cockroach sql` command to verify that the table was added: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT * FROM intro.mytable WHERE (l % 2) = 0;" - ~~~ - - ~~~ - l | v - +----+------------------------------------------------------+ - 0 | !__aaawwmqmqmwwwaas,,_ .__aaawwwmqmqmwwaaa,, - 2 | !"VT?!"""^~~^"""??T$Wmqaa,_auqmWBT?!"""^~~^^""??YV^ - 4 | ! "?##mW##?"- - 6 | ! C O N G R A T S _am#Z??A#ma, Y - 8 | ! _ummY" "9#ma, A - 10 | ! vm#Z( )Xmms Y - 12 | ! .j####mmm#####mm#m##6. - 14 | ! W O W ! jmm###mm######m#mmm##6 - 16 | ! ]#me*Xm#m#mm##m#m##SX##c - 18 | ! dm#||+*$##m#mm#m#Svvn##m - 20 | ! :mmE=|+||S##m##m#1nvnnX##; A - 22 | ! :m#h+|+++=Xmm#m#1nvnnvdmm; M - 24 | ! Y $#m>+|+|||##m#1nvnnnnmm# A - 26 | ! O ]##z+|+|+|3#mEnnnnvnd##f Z - 28 | ! U D 4##c|+|+|]m#kvnvnno##P E - 30 | ! I 4#ma+|++]mmhvnnvq##P` ! - 32 | ! D I ?$#q%+|dmmmvnnm##! - 34 | ! T -4##wu#mm#pw##7' - 36 | ! -?$##m####Y' - 38 | ! !! "Y##Y"- - 40 | ! - (21 rows) - ~~~ - -3. Use the `SHOW RANGES` SQL command to find the IDs of the nodes where the new table's replicas ended up: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW RANGES FROM TABLE intro.mytable;" - ~~~ - - ~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities -+-----------+---------+----------+---------------+--------------+------------------------------+----------+---------------------------------------------------------------------------------------------------+ - NULL | NULL | 45 | 0.003054 | 9 | region=us,datacenter=us-west | {2,4,9} | {"region=us,datacenter=us-east","region=us,datacenter=us-central","region=us,datacenter=us-west"} -(1 row) - ~~~ - -## Step 5. Expand into Europe - -Let's say your user-base has expanded into Europe and you want to store data there. To do so, add 3 more nodes, this time using the [`--locality`](../configure-replication-zones.html#descriptive-attributes-assigned-to-nodes) flag to indicate that nodes are in the Western region of Europe. - -1. Start node 10: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=eu,datacenter=eu-west \ - --store=node10 \ - --listen-addr=localhost:26266 \ - --http-addr=localhost:8089 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 11: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=eu,datacenter=eu-west \ - --store=node11 \ - --listen-addr=localhost:26267 \ - --http-addr=localhost:8090 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -3. Start node 12: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=eu,datacenter=eu-west \ - --store=node12 \ - --listen-addr=localhost:26268 \ - --http-addr=localhost:8091 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -## Step 6. Add EU-specific data - -Now imagine that `intro` database you created earlier is storing data for a US-based application, and you want a completely separate database to store data for an EU-based application. - -1. Use the `cockroach gen` command to generate an example `startrek` database with 2 tables, `episodes` and `quotes`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data startrek | cockroach sql \ - --insecure \ - --host=localhost:26257 - ~~~ - -2. Use the `cockroach sql` command to verify that the tables were added: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT * FROM startrek.episodes LIMIT 5;" \ - --execute="SELECT quote FROM startrek.quotes WHERE characters = 'Spock and Kirk';" - ~~~ - - ~~~ - id | season | num | title | stardate - +----+--------+-----+------------------------------+-------------+ - 1 | 1 | 1 | The Man Trap | 1531.100000 - 2 | 1 | 2 | Charlie X | 1533.600000 - 3 | 1 | 3 | Where No Man Has Gone Before | 1312.400000 - 4 | 1 | 4 | The Naked Time | 1704.200000 - 5 | 1 | 5 | The Enemy Within | 1672.100000 - (5 rows) - quote - +--------------------------------------------+ - "Beauty is transitory." "Beauty survives." - (1 row) - ~~~ - -## Step 7. Constrain data to specific regions - -Because you used the `--locality` flag to indicate the region for each of your nodes, constraining data to specific regions is simple. - -1. Use the [`ALTER DATABASE ... CONFIGURE ZONE`](../configure-zone.html) statement to create a replication zone for the `startrek` database, forcing all the data in the database to be located on EU-based nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --execute="ALTER DATABASE startrek CONFIGURE ZONE USING constraints='[+region=eu]';" --insecure --host=localhost:26257 - ~~~ - -2. Use the [`ALTER DATABASE ... CONFIGURE ZONE`](../configure-zone.html) statement to create a distinct replication zone for the `intro` database, forcing all the data in the database to be located on US-based nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --execute="ALTER DATABASE intro CONFIGURE ZONE USING constraints='[+region=us]';" --insecure --host=localhost:26257 - ~~~ - -## Step 8. Verify data distribution - -Now verify that the data for the table in the `intro` database is located on US-based nodes, and the data for the tables in the `startrek` database is located on EU-based nodes. - -1. Find the IDs of the nodes where replicas are stored for the `intro.mytable`, `startrek.episodes`, and `startrek.quotes` tables: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=127.0.0.1:54942 \ - --execute="SHOW RANGES FROM TABLE intro.mytable;" \ - --execute="SHOW RANGES FROM TABLE startrek.episodes;" \ - --execute="SHOW RANGES FROM TABLE startrek.quotes;" - ~~~ - - Note: your result set will differ slightly from ours. - - ~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities - +-----------+---------+----------+---------------+--------------+---------------------------------+----------+---------------------------------------------------------------------------------------------------+ - NULL | NULL | 45 | 0.003054 | 5 | region=us,datacenter=us-central | {3,5,8} | {"region=us,datacenter=us-east","region=us,datacenter=us-central","region=us,datacenter=us-west"} - (1 row) - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities - +-----------+---------+----------+---------------+--------------+------------------------------+----------+---------------------------------------------------------------------------------------------------+ - NULL | NULL | 46 | 0.004276 | 8 | region=us,datacenter=us-west | {3,5,8} | {"region=us,datacenter=us-east","region=us,datacenter=us-central","region=us,datacenter=us-west"} - (1 row) - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities - +-----------+---------+----------+---------------+--------------+---------------------------------+----------+---------------------------------------------------------------------------------------------------+ - NULL | NULL | 47 | 0.03247 | 5 | region=us,datacenter=us-central | {3,5,8} | {"region=us,datacenter=us-east","region=us,datacenter=us-central","region=us,datacenter=us-west"} - (1 row) - ~~~ - -{{site.data.alerts.callout_info}} -You can also use the Web UI's Data Distribution matrix to view the distribution of data across nodes. -{{site.data.alerts.end}} - -## Step 9. Clean up - -Take a moment to clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - - This simplified shutdown process is only appropriate for a lab/evaluation scenario. - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node{1,2,3,4,5,6,7,8,9,10,11,12} - ~~~ - -## What's next? - -[Geo-Partitioning](geo-partitioning.html) diff --git a/src/archived/training/logs.md b/src/archived/training/logs.md deleted file mode 100644 index 45fbdc34bbe..00000000000 --- a/src/archived/training/logs.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Debug Logs -toc: false -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - -## What's next? - -[Node Startup Troubleshooting](node-startup-troubleshooting.html) diff --git a/src/archived/training/monitoring-and-alerting.md b/src/archived/training/monitoring-and-alerting.md deleted file mode 100644 index 1da08be725e..00000000000 --- a/src/archived/training/monitoring-and-alerting.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Monitoring and Alerting -toc: false -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - -## What's next? - -[Debug Logs](logs.html) diff --git a/src/archived/training/network-partition-troubleshooting.md b/src/archived/training/network-partition-troubleshooting.md deleted file mode 100644 index 0eb6d94ca55..00000000000 --- a/src/archived/training/network-partition-troubleshooting.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Network Partition Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -Note that this lab involves running a cluster in Docker so that you can use it to fake a partition between datacenters. You will need to have [Docker Compose](https://docs.docker.com/compose/install/) on your local machine, so you may just want to observe this one. - -## Step 1. Create a cluster in Docker across 3 simulated datacenters - -1. Download the Docker Compose file that defines a 6-node CockroachDB cluster spread across 3 separate networks: - -
    - - -
    -

    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ curl -O {{site.url}}/docs/{{ page.version.version }}/training/resources/docker-compose.yaml - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ wget {{site.url}}/docs/{{ page.version.version }}/training/resources/docker-compose.yaml - ~~~ -
    - -2. Create the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ COCKROACH_VERSION={{ page.release_info.version }} docker-compose up - ~~~~ - -3. In a new terminal, initialize the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ docker exec -it roach-0 /cockroach/cockroach init --insecure - ~~~~ - -4. Verify that the cluster is working by opening the Admin UI at http://localhost:8080. - -## Step 2. Create a partition in the network - -1. Disconnect the nodes in `dc-2` from the shared network backbone: - - {% include copy-clipboard.html %} - ~~~ shell - $ docker network disconnect cockroachdb-training-shared roach-4 - ~~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ docker network disconnect cockroachdb-training-shared roach-5 - ~~~~ - -## Step 3. Troubleshoot the problem - -1. The Admin UI should now show that 2 of the nodes in the cluster have changed from "Healthy" to "Suspect": - - CockroachDB Admin UI - -2. Check whether the "Suspect" nodes are still running by hitting their `/health` endpoints: - - {% include copy-clipboard.html %} - ~~~ shell - $ curl localhost:8085/health - ~~~~ - - ~~~ - { - "nodeId": 3, - "address": { - "networkField": "tcp", - "addressField": "roach-5:26257" - }, - "buildInfo": { - "goVersion": "go1.10", - "tag": "v2.0.0", - "time": "2018/04/03 20:56:09", - "revision": "a6b498b7aff14234bcde23107b9e7fa14e6a34a8", - "cgoCompiler": "gcc 6.3.0", - "cgoTargetTriple": "x86_64-unknown-linux-gnu", - "platform": "linux amd64", - "distribution": "CCL", - "type": "release", - "channel": "official-binary", - "dependencies": null - } - } - ~~~ - -3. Check whether the "Suspect" nodes consider themselves live by hitting their `/_admin/v1/health` endpoints: - - {% include copy-clipboard.html %} - ~~~ shell - $ curl localhost:8085/_admin/v1/health - ~~~~ - - ~~~ - { - "error": "node is not live", - "code": 14 - } - ~~~ - -4. Check the logs of the downed nodes to see if they contain any clues, where you should find errors like "Error while dialing", "no such host", and "the connection is unavailable": - - {% include copy-clipboard.html %} - ~~~ shell - $ docker logs roach-5 - ~~~~ - - ~~~ - ... - I180213 20:38:14.728914 211 vendor/google.golang.org/grpc/grpclog/grpclog.go:75 grpc: addrConn.resetTransport failed to create client transport: connection error: desc = "transport: Error while dialing dial tcp: lookup roach-1 on 127.0.0.11:53: no such host"; Reconnecting to {roach-1:26257 } - ... - W180213 20:38:20.093309 286 storage/node_liveness.go:342 [n5,hb] failed node liveness heartbeat: failed to send RPC: sending to all 3 replicas failed; last error: { rpc error: code = Unavailable desc = grpc: the connection is unavailable} - ~~~ - -5. Check whether the majority nodes are able to talk to the minority nodes at all by looking at the network latency debug page at http://localhost:8080/#/reports/network: - - CockroachDB Admin UI - -6. If you really want to confirm that the network isn't working, try manually pinging a node in `dc-2` from a node in `dc-0`: - - {% include copy-clipboard.html %} - ~~~ shell - $ docker exec -t roach-0 ping roach-5 - ~~~~ - - ~~~ - ping: unknown host - ~~~ - -## Step 4. Fix the partition - -1. Reconnect the nodes in `dc-2` to the shared network backbone: - - {% include copy-clipboard.html %} - ~~~ shell - $ docker network connect cockroachdb-training-shared roach-4 - ~~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ docker network connect cockroachdb-training-shared roach-5 - ~~~~ - -2. After a few seconds, you should see the nodes go back to healthy again. - -## Step 5. Clean up - -You will not be using this Docker cluster in any other labs, so take a moment to clean things up. - -1. In the terminal where you ran `docker-compose up`, press **CTRL-C** to stop all the CockroachDB nodes. - -2. Delete all Docker resources created by the tutorial: - - {% include copy-clipboard.html %} - ~~~ shell - $ docker-compose down - ~~~ - -## What's next? - -[How Cockroach Labs Debugs](how-cockroach-labs-debugs.html) diff --git a/src/archived/training/node-decommissioning.md b/src/archived/training/node-decommissioning.md deleted file mode 100644 index fb9b87e8645..00000000000 --- a/src/archived/training/node-decommissioning.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: Node Decommissioning -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Before you begin - -Make sure you have already completed [Planned Maintenance](planned-maintenance.html) and have 3 nodes running locally. - -## Step 1. Try to decommission a node - -Run the `cockroach quit` command with the `--decommission` flag against node 3: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach quit \ ---insecure \ ---decommission \ ---host=localhost:26259 -~~~ - -{{site.data.alerts.callout_info}} -For the purposes of this training, you use the `cockroach quit` command with the `--decommission` flag. However, in production, you'd use `cockroach decommission` and then instruct your process manager to end the process. -{{site.data.alerts.end}} - -Because the cluster has 3 nodes, with every range on every node, it is not possible to rebalance node 3's data, so the decommission process hangs: - -~~~ - id | is_live | replicas | is_decommissioning | is_draining -+----+---------+----------+--------------------+-------------+ - 3 | true | 23 | true | false -(1 row) -............ -~~~ - -## Step 2. Add a fourth node - -In a new terminal, to make it possible for node 3 to decommission, add a fourth node: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---insecure \ ---store=node4 \ ---listen-addr=localhost:26260 \ ---http-addr=localhost:8083 \ ---join=localhost:26257,localhost:26258,localhost:26259 -~~~ - -## Step 3. Verify that decommissioning completed - -1. Go back to the terminal where you triggered the decommission process. - - You'll see that, after the fourth node was added, the node's `gossiped_replicas` count decreased to 0 and the process completed with a confirmation: - - ~~~ - - id | is_live | replicas | is_decommissioning | is_draining - +----+---------+----------+--------------------+-------------+ - 3 | true | 4 | true | false - (1 row) - ...... - id | is_live | replicas | is_decommissioning | is_draining - +----+---------+----------+--------------------+-------------+ - 3 | true | 3 | true | false - (1 row) - ............ - id | is_live | replicas | is_decommissioning | is_draining - +----+---------+----------+--------------------+-------------+ - 3 | true | 0 | true | false - (1 row) - - No more data reported on target nodes. Please verify cluster health before removing the nodes. - ok - ~~~ - -2. Open the Admin UI at http://localhost:8080, click **Metrics** on the left, and hover over the **Replicas per Node** graph in the **Overview** dashboard. - - You'll see that node 3 now has 0 replicas while the other nodes have equal replica counts. - - CockroachDB Admin UI - -3. Click **Overview** on the left. About 5 minutes after the decommission process completes, you'll see node 3 listed under **Decommissioned Nodes**. - - CockroachDB Admin UI - -## Step 4. Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 - ~~~ - -## What's next? - -[Backup and Restore](backup-and-restore.html) diff --git a/src/archived/training/node-startup-troubleshooting.md b/src/archived/training/node-startup-troubleshooting.md deleted file mode 100644 index e2bc5e8e62c..00000000000 --- a/src/archived/training/node-startup-troubleshooting.md +++ /dev/null @@ -1,322 +0,0 @@ ---- -title: Node Startup Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Problem 1: SSL required - -In this scenario, you try to add a node to a secure cluster without providing the node's security certificate. You'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -### Step 1. Generate security certificates - -1. Create two directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ mkdir certs my-safe-directory - ~~~ - -2. Create the CA certificate and key: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-ca \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -3. Create the certificate and key for the your nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-node \ - localhost \ - $(hostname) \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -4. Create client certificates and keys for the `root` and `spock` users: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-client \ - root \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-client \ - spock \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -### Step 2. Start a secure 3-node cluster - -1. Start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --certs-dir=certs --host=localhost:26257 - ~~~ - -### Step 3. Simulate the problem - -In the same terminal, try to add another node, but leave out the `--certs-dir` flag: - -{{site.data.alerts.callout_info}} -The `--logtostderr=WARNING` flag will make warnings and errors print to `stderr` so you do not have to manually look in the logs. -{{site.data.alerts.end}} - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---store=node4 \ ---listen-addr=localhost:26260 \ ---http-addr=localhost:8083 \ ---join=localhost:26257,localhost:26258,localhost:26259 \ ---logtostderr=WARNING -~~~ - -The startup process will fail, and you'll see the following printed to `stderr`: - -~~~ -W191203 19:35:14.018995 1 cli/start.go:1046 Using the default setting for --cache (128 MiB). - A significantly larger value is usually needed for good performance. - If you have a dedicated server a reasonable setting is --cache=.25 (8.0 GiB). -W191203 19:35:14.019049 1 cli/start.go:1059 Using the default setting for --max-sql-memory (128 MiB). - A significantly larger value is usually needed in production. - If you have a dedicated server a reasonable setting is --max-sql-memory=.25 (8.0 GiB). -* -* ERROR: cannot load certificates. -* Check your certificate settings, set --certs-dir, or use --insecure for insecure clusters. -* -* failed to start server: problem with CA certificate: not found -* -E191203 19:35:14.137329 1 cli/error.go:233 cannot load certificates. -Check your certificate settings, set --certs-dir, or use --insecure for insecure clusters. - -failed to start server: problem with CA certificate: not found -Error: cannot load certificates. -Check your certificate settings, set --certs-dir, or use --insecure for insecure clusters. - -failed to start server: problem with CA certificate: not found -Failed running "start" -~~~ - -The error tells you that the failure has to do with security. Because the cluster is secure, it requires the new node to provide its security certificate in order to join. - -### Step 4. Resolve the problem - -To successfully join the node to the cluster, start the node again, but this time include the `--certs-dir` flag: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---certs-dir=certs \ ---store=node4 \ ---listen-addr=localhost:26260 \ ---http-addr=localhost:8083 \ ---join=localhost:26257,localhost:26258,localhost:26259 -~~~ - -## Problem 2: Wrong join address - -In this scenario, you try to add another node to the cluster, but the `--join` address is not pointing at any of the existing nodes. - -### Step 1. Simulate the problem - -In a new terminal, try to add another node: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---certs-dir=certs \ ---store=node5 \ ---listen-addr=localhost:26261 \ ---http-addr=localhost:8084 \ ---join=localhost:20000 \ ---logtostderr=WARNING -~~~ - -The process will never complete, and you'll see a continuous stream of warnings like this: - -~~~ -W180817 17:01:56.506968 886 vendor/google.golang.org/grpc/clientconn.go:942 Failed to dial localhost:20000: grpc: the connection is closing; please retry. -W180817 17:01:56.510430 914 vendor/google.golang.org/grpc/clientconn.go:1293 grpc: addrConn.createTransport failed to connect to {localhost:20000 0 }. Err :connection error: desc = "transport: Error while dialing dial tcp [::1]:20000: connect: connection refused". Reconnecting... -~~~ - -These warnings tell you that the node cannot establish a connection with the address specified in the `--join` flag. Without a connection to the cluster, the node cannot join. - -### Step 2. Resolve the problem - -1. Press **CTRL-C** twice to stop the previous startup attempt. - -2. To successfully join the node to the cluster, start the node again, but this time include a correct `--join` address: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -## Problem 3: Missing join address - -In this scenario, you try to add another node to the cluster, but the `--join` address missing entirely, which causes the new node to start its own separate cluster. - -### Step 1. Simulate the problem - -1. In a new terminal, try to add another node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node6 \ - --listen-addr=localhost:26262 \ - --http-addr=localhost:8085 - ~~~ - - The startup process succeeds but, because a `--join` address wasn't specified, the node initializes itself as a new cluster instead of joining the existing cluster. You can see this in the `status` field printed to `stdout`: - - ~~~ - CockroachDB node starting at 2018-02-08 16:30:26.690638 +0000 UTC (took 0.2s) - build: CCL {{page.release_info.version}} @ 2018/01/08 17:30:06 (go1.8.3) - webui: https://localhost:8085 - sql: postgresql://root@localhost:26262?sslcert=certs%2Fclient.root.crt&sslkey=certs%2Fclient.root.key&sslmode=verify-full&sslrootcert=certs%2Fca.crt - RPC client flags: cockroach --host=localhost:26262 --certs-dir=certs - logs: /Users/crossman/node6/logs - temp dir: /Users/crossman/node6/cockroach-temp138121774 - external I/O path: /Users/crossman/node6/extern - store[0]: path=/Users/crossman/node6 - status: initialized new cluster - clusterID: e2514c0a-9dd5-4b2e-a20f-85183365c207 - nodeID: 1 - ~~~ - -2. Press **CTRL-C** to stop the new node. - -3. Start the node again, but this time include a correct `--join` address: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node6 \ - --listen-addr=localhost:26262 \ - --http-addr=localhost:8085 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~ - - The startup process fails because the cluster notices that the node's cluster ID does not match the cluster ID of the nodes it is trying to join to: - - ~~~ - W180815 17:21:00.316845 237 gossip/client.go:123 [n1] failed to start gossip client to localhost:26258: initial connection heartbeat failed: rpc error: code = Unknown desc = client cluster ID "9a6ed934-50e8-472a-9d55-c6ecf9130984" doesn't match server cluster ID "ab6960bb-bb61-4e6f-9190-992f219102c6" - ~~~ - -4. Press **CTRL-C** to stop the new node. - -### Step 2. Resolve the problem - -To successfully join the node to the cluster, you need to remove the node's data directory, which is where its incorrect cluster ID is stored, and start the node again: - -{% include copy-clipboard.html %} -~~~ shell -$ rm -rf node6 -~~~ - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---certs-dir=certs \ ---store=node6 \ ---listen-addr=localhost:26262 \ ---http-addr=localhost:8085 \ ---join=localhost:26257,localhost:26258,localhost:26259 \ ---background -~~~ - -This time, the startup process succeeds, and the `status` (added to the logs because you used `--background`) tells you that the node joined the intended cluster: - -{% include copy-clipboard.html %} -~~~ shell -$ grep -A 11 'CockroachDB node starting at' ./node6/logs/cockroach.log -~~~ - -~~~ -CockroachDB node starting at 2019-07-23 04:21:33.130572 +0000 UTC (took 0.2s) -build: CCL {{page.release_info.version}} @ 2019/05/22 22:44:42 (go1.12.5) -webui: https://localhost:8085 -sql: postgresql://root@localhost:26262?sslcert=certs%2Fclient.root.crt&sslkey=certs%2Fclient.root.key&sslmode=verify-full&sslrootcert=certs%2Fca.crt -client flags: cockroach --host=localhost:26262 --certs-dir=certs -logs: /Users/will/Downloads/temp-cockroach-cluster/node6/logs -temp dir: /Users/will/Downloads/temp-cockroach-cluster/node6/cockroach-temp509471222 -external I/O path: /Users/will/Downloads/temp-cockroach-cluster/node6/extern -store[0]: path=/Users/will/Downloads/temp-cockroach-cluster/node6 -status: initialized new node, joined pre-existing cluster -clusterID: e40f17e6-b4aa-4e69-bd7e-ecd6556194c3 -nodeID: 6 -~~~ - -## What's next? - -[Client Connection Troubleshooting](client-connection-troubleshooting.html) diff --git a/src/archived/training/orchestration-with-kubernetes.md b/src/archived/training/orchestration-with-kubernetes.md deleted file mode 100644 index c60b5fd3911..00000000000 --- a/src/archived/training/orchestration-with-kubernetes.md +++ /dev/null @@ -1,525 +0,0 @@ ---- -title: Orchestration with Kubernetes -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -Also, before getting started, it's helpful to review some Kubernetes-specific terminology: - -Feature | Description ---------|------------ -[minikube](http://kubernetes.io/docs/getting-started-guides/minikube/) | This is the tool you'll use to run a Kubernetes cluster inside a VM on your local workstation. -[pod](http://kubernetes.io/docs/user-guide/pods/) | A pod is a group of one or more Docker containers. In this tutorial, all pods will run on your local workstation, each containing one Docker container running a single CockroachDB node. You'll start with 3 pods and grow to 4. -[StatefulSet](http://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets/) | A StatefulSet is a group of pods treated as stateful units, where each pod has distinguishable network identity and always binds back to the same persistent storage on restart. StatefulSets require Kubernetes version 1.9 or newer. -[persistent volume](http://kubernetes.io/docs/user-guide/persistent-volumes/) | A persistent volume is a piece of storage mounted into a pod. The lifetime of a persistent volume is decoupled from the lifetime of the pod that's using it, ensuring that each CockroachDB node binds back to the same storage on restart.

    When using `minikube`, persistent volumes are external temporary directories that endure until they are manually deleted or until the entire Kubernetes cluster is deleted. -[persistent volume claim](http://kubernetes.io/docs/user-guide/persistent-volumes/#persistentvolumeclaims) | When pods are created (one per CockroachDB node), each pod will request a persistent volume claim to “claim” durable storage for its node. - -## Step 1. Start Kubernetes - -1. Follow Kubernetes' [documentation](https://kubernetes.io/docs/tasks/tools/install-minikube/) to install `minikube`, the tool used to run Kubernetes locally, for your OS. This includes installing a hypervisor and `kubectl`, the command-line tool used to manage Kubernetes from your local workstation. - - {{site.data.alerts.callout_info}} - Make sure you install `minikube` version 0.21.0 or later. Earlier versions do not include a Kubernetes server that supports the `maxUnavailability` field and `PodDisruptionBudget` resource type used in the CockroachDB StatefulSet configuration. - {{site.data.alerts.end}} - -2. Start a local Kubernetes cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ minikube start - ~~~ - -## Step 2. Start CockroachDB - -To start your CockroachDB cluster, you can use our StatefulSet configuration and related files directly. - -1. From your local workstation, use our [`cockroachdb-statefulset-secure.yaml`](https://github.com/cockroachdb/cockroach/blob/master/cloud/kubernetes/cockroachdb-statefulset-secure.yaml) file to create the StatefulSet that automatically creates 3 pods, each with a CockroachDB node running inside it: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl create -f https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cockroachdb-statefulset-secure.yaml - ~~~ - - ~~~ - serviceaccount/cockroachdb created - role.rbac.authorization.k8s.io/cockroachdb created - clusterrole.rbac.authorization.k8s.io/cockroachdb created - rolebinding.rbac.authorization.k8s.io/cockroachdb created - clusterrolebinding.rbac.authorization.k8s.io/cockroachdb created - service/cockroachdb-public created - service/cockroachdb created - poddisruptionbudget.policy/cockroachdb-budget created - statefulset.apps/cockroachdb created - ~~~ - -2. As each pod is created, it issues a Certificate Signing Request, or CSR, to have the node's certificate signed by the Kubernetes CA. You must manually check and approve each node's certificates, at which point the CockroachDB node is started in the pod. - - 1. Get the name of the `Pending` CSR for the first pod: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get csr - ~~~ - - ~~~ - NAME AGE REQUESTOR CONDITION - default.node.cockroachdb-0 24s system:serviceaccount:default:cockroachdb Pending - default.node.cockroachdb-1 23s system:serviceaccount:default:cockroachdb Pending - default.node.cockroachdb-2 23s system:serviceaccount:default:cockroachdb Pending - ~~~ - - If you do not see a `Pending` CSR, wait a minute and try again. - - 2. Examine the CSR for the first pod: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl describe csr default.node.cockroachdb-0 - ~~~ - - ~~~ - Name: default.node.cockroachdb-0 - Labels: - Annotations: - CreationTimestamp: Wed, 15 May 2019 17:11:34 -0400 - Requesting User: system:serviceaccount:default:cockroachdb - Status: Pending - Subject: - Common Name: node - Serial Number: - Organization: Cockroach - Subject Alternative Names: - DNS Names: localhost - cockroachdb-0.cockroachdb.default.svc.cluster.local - cockroachdb-0.cockroachdb - cockroachdb-public - cockroachdb-public.default.svc.cluster.local - IP Addresses: 127.0.0.1 - Events: - ~~~ - - 3. If everything looks correct, approve the CSR for the first pod: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl certificate approve default.node.cockroachdb-0 - ~~~ - - ~~~ - certificatesigningrequest.certificates.k8s.io/default.node.cockroachdb-0 approved - ~~~ - - 4. Repeat steps 1-3 for the other 2 pods. - -3. Initialize the cluster: - - 1. Confirm that three pods are `Running` successfully. Note that they will not - be considered `Ready` until after the cluster has been initialized: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get pods - ~~~ - - ~~~ - NAME READY STATUS RESTARTS AGE - cockroachdb-0 0/1 Running 0 2m - cockroachdb-1 0/1 Running 0 2m - cockroachdb-2 0/1 Running 0 2m - ~~~ - - 2. Confirm that the persistent volumes and corresponding claims were created successfully for all three pods: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get persistentvolumes - ~~~ - - ~~~ - NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE - pvc-01ba3ca6-7756-11e9-b9fb-080027246063 100Gi RWO Delete Bound default/datadir-cockroachdb-0 standard 13m - pvc-01ccc75a-7756-11e9-b9fb-080027246063 100Gi RWO Delete Bound default/datadir-cockroachdb-1 standard 13m - pvc-01d111aa-7756-11e9-b9fb-080027246063 100Gi RWO Delete Bound default/datadir-cockroachdb-2 standard 13m - ~~~ - - 3. Use our [`cluster-init-secure.yaml`](https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cluster-init-secure.yaml) file to perform a one-time initialization that joins the nodes into a single cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl create \ - -f https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cluster-init-secure.yaml - ~~~ - - ~~~ - job.batch/cluster-init-secure created - ~~~ - - 4. Approve the CSR for the one-off pod from which cluster initialization happens: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl certificate approve default.client.root - ~~~ - - ~~~ - certificatesigningrequest.certificates.k8s.io/default.client.root approved - ~~~ - - 5. Confirm that cluster initialization has completed successfully. The job - should be considered successful and the CockroachDB pods should soon be - considered `Ready`: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get job cluster-init-secure - ~~~ - - ~~~ - NAME COMPLETIONS DURATION AGE - cluster-init-secure 1/1 10s 16s - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get pods - ~~~ - - ~~~ - NAME READY STATUS RESTARTS AGE - cluster-init-secure-fxdjl 0/1 Completed 0 53s - cockroachdb-0 1/1 Running 0 15m - cockroachdb-1 1/1 Running 0 15m - cockroachdb-2 1/1 Running 0 15m - ~~~ - -{{site.data.alerts.callout_success}} -The StatefulSet configuration sets all CockroachDB nodes to log to `stderr`, so if you ever need access to a pod/node's logs to troubleshoot, use `kubectl logs ` rather than checking the log on the persistent volume. -{{site.data.alerts.end}} - -## Step 3. Use the built-in SQL client - -To use the built-in SQL client, you need to launch a pod that runs indefinitely with the `cockroach` binary inside it, get a shell into the pod, and then start the built-in SQL client. - -1. From your local workstation, use our [`client-secure.yaml`](https://github.com/cockroachdb/cockroach/blob/master/cloud/kubernetes/client-secure.yaml) file to launch a pod and keep it running indefinitely: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl create \ - -f https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/client-secure.yaml - ~~~ - - ~~~ - pod/cockroachdb-client-secure created - ~~~ - - The pod uses the `root` client certificate created earlier to initialize the cluster, so there's no CSR approval required. - -2. Get a shell into the pod and start the CockroachDB [built-in SQL client](../cockroach-sql.html): - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl exec -it cockroachdb-client-secure \ - -- ./cockroach sql \ - --certs-dir=/cockroach-certs \ - --host=cockroachdb-public - ~~~ - - ~~~ - # Welcome to the cockroach SQL interface. - # All statements must be terminated by a semicolon. - # To exit: CTRL + D. - # - # Server version: CockroachDB CCL v19.1.0 (x86_64-unknown-linux-gnu, built 2019/04/29 18:36:40, go1.11.6) (same version as client) - # Cluster ID: 7e1db24d-0f11-45d4-b472-bbd5f1fff858 - # - # Enter \? for a brief introduction. - # - root@cockroachdb-public:26257/defaultdb> - ~~~ - -3. Run some basic [CockroachDB SQL statements](../learn-cockroachdb-sql.html): - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE DATABASE bank; - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE TABLE bank.accounts (id INT PRIMARY KEY, balance DECIMAL); - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.accounts VALUES (1, 1000.50); - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT * FROM bank.accounts; - ~~~ - - ~~~ - +----+---------+ - | id | balance | - +----+---------+ - | 1 | 1000.5 | - +----+---------+ - (1 row) - ~~~ - -4. [Create a user with a password](../create-user.html#create-a-user-with-a-password): - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE USER roach WITH PASSWORD 'Q7gc8rEdS'; - ~~~ - - You will need this username and password to access the Admin UI later. - -5. Exit the SQL shell and pod: - - {% include copy-clipboard.html %} - ~~~ sql - > \q - ~~~ - -{{site.data.alerts.callout_success}} -This pod will continue running indefinitely, so any time you need to reopen the built-in SQL client or run any other [`cockroach` client commands](../cockroach-commands.html) (e.g., `cockroach node`), repeat step 2 using the appropriate `cockroach` command. - -If you'd prefer to delete the pod and recreate it when needed, run `kubectl delete pod cockroachdb-client-secure`. -{{site.data.alerts.end}} - -## Step 4. Access the Admin UI - -To access the cluster's [Admin UI](../admin-ui-overview.html): - -1. Port-forward from your local machine to one of the pods: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl port-forward cockroachdb-0 8080 - ~~~ - - ~~~ - Forwarding from 127.0.0.1:8080 -> 8080 - ~~~ - - {{site.data.alerts.callout_info}}The port-forward command must be run on the same machine as the web browser in which you want to view the Admin UI. If you have been running these commands from a cloud instance or other non-local shell, you will not be able to view the UI without configuring kubectl locally and running the above port-forward command on your local machine.{{site.data.alerts.end}} - -2. Go to https://localhost:8080 and log in with the username and password you created earlier. - -3. In the UI, verify that the cluster is running as expected: - - Click **View nodes list** on the right to ensure that all nodes successfully joined the cluster. - - Click the **Databases** tab on the left to verify that `bank` is listed. - -## Step 5. Simulate node failure - -Based on the `replicas: 3` line in the StatefulSet configuration, Kubernetes ensures that three pods/nodes are running at all times. When a pod/node fails, Kubernetes automatically creates another pod/node with the same network identity and persistent storage. - -To see this in action: - -1. Stop one of CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl delete pod cockroachdb-2 - ~~~ - - ~~~ - pod "cockroachdb-2" deleted - ~~~ - -2. In the Admin UI, the **Cluster Overview** will soon show one node as **Suspect**. As Kubernetes auto-restarts the node, watch how the node once again becomes healthy. - -3. Back in the terminal, verify that the pod was automatically restarted: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get pod cockroachdb-2 - ~~~ - - ~~~ - NAME READY STATUS RESTARTS AGE - cockroachdb-2 1/1 Running 0 12s - ~~~ - -## Step 6. Add nodes - -1. Use the `kubectl scale` command to add a pod for another CockroachDB node: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl scale statefulset cockroachdb --replicas=4 - ~~~ - - ~~~ - statefulset.apps/cockroachdb scaled - ~~~ - -2. Get the name of the `Pending` CSR for the new pod: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get csr - ~~~ - - ~~~ - NAME AGE REQUESTOR CONDITION - default.client.root 8m system:serviceaccount:default:cockroachdb Approved,Issued - default.node.cockroachdb-0 22m system:serviceaccount:default:cockroachdb Approved,Issued - default.node.cockroachdb-1 22m system:serviceaccount:default:cockroachdb Approved,Issued - default.node.cockroachdb-2 22m system:serviceaccount:default:cockroachdb Approved,Issued - default.node.cockroachdb-3 2m system:serviceaccount:default:cockroachdb Pending - ~~~ - -3. Approve the CSR for the new pod: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl certificate approve default.node.cockroachdb-3 - ~~~ - - ~~~ - certificatesigningrequest.certificates.k8s.io/default.node.cockroachdb-3 approved - ~~~ - -4. Confirm that pod for the fourth node, `cockroachdb-3`, is `Running` successfully: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get pods - ~~~ - - ~~~ - NAME READY STATUS RESTARTS AGE - cluster-init-secure-fxdjl 0/1 Completed 0 13m - cockroachdb-0 1/1 Running 1 28m - cockroachdb-1 1/1 Running 1 28m - cockroachdb-2 1/1 Running 0 8m - cockroachdb-3 1/1 Running 0 7m - cockroachdb-client-secure 1/1 Running 0 12m - ~~~ - -## Step 7. Remove nodes - -To safely remove a node from your cluster, you must first decommission the node and only then adjust the `--replicas` value of your StatefulSet configuration to permanently remove it. This sequence is important because the decommissioning process lets a node finish in-flight requests, rejects any new requests, and transfers all range replicas and range leases off the node. - -{{site.data.alerts.callout_danger}} -If you remove nodes without first telling CockroachDB to decommission them, you may cause data or even cluster unavailability. For more details about how this works and what to consider before removing nodes, see [Decommission Nodes](../remove-nodes.html). -{{site.data.alerts.end}} - -1. Get a shell into the `cockroachdb-client-secure` pod you created earlier and use the `cockroach node status` command to get the internal IDs of nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl exec -it cockroachdb-client-secure \ - -- ./cockroach node status \ - --certs-dir=/cockroach-certs \ - --host=cockroachdb-public - ~~~ - - ~~~ - id | address | build | started_at | updated_at | is_available | is_live - +----+-----------------------------------------------------------+---------+----------------------------------+----------------------------------+--------------+---------+ - 1 | cockroachdb-0.cockroachdb.default.svc.cluster.local:26257 | v19.1.0 | 2019-05-15 21:37:09.875482+00:00 | 2019-05-15 21:40:41.467829+00:00 | true | true - 2 | cockroachdb-2.cockroachdb.default.svc.cluster.local:26257 | v19.1.0 | 2019-05-15 21:31:50.21661+00:00 | 2019-05-15 21:40:41.308529+00:00 | true | true - 3 | cockroachdb-1.cockroachdb.default.svc.cluster.local:26257 | v19.1.0 | 2019-05-15 21:37:09.746432+00:00 | 2019-05-15 21:40:41.336179+00:00 | true | true - 4 | cockroachdb-3.cockroachdb.default.svc.cluster.local:26257 | v19.1.0 | 2019-05-15 21:37:34.962546+00:00 | 2019-05-15 21:40:44.08081+00:00 | true | true - (4 rows) - ~~~ - - The pod uses the `root` client certificate created earlier to initialize the cluster, so there's no CSR approval required. - -2. Note the ID of the node with the highest number in its address (in this case, the address including `cockroachdb-3`) and use the [`cockroach node decommission`](../cockroach-node.html) command to decommission it: - - {{site.data.alerts.callout_info}} - It's important to decommission the node with the highest number in its address because, when you reduce the `--replica` count, Kubernetes will remove the pod for that node. - {{site.data.alerts.end}} - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl exec -it cockroachdb-client-secure \ - -- ./cockroach node decommission \ - --certs-dir=/cockroach-certs \ - --host=cockroachdb-public - ~~~ - - You'll then see the decommissioning status print to `stderr` as it changes: - - ~~~ - id | is_live | replicas | is_decommissioning | is_draining - +---+---------+----------+--------------------+-------------+ - 4 | true | 73 | true | false - (1 row) - ~~~ - - Once the node has been fully decommissioned and stopped, you'll see a confirmation: - - ~~~ - id | is_live | replicas | is_decommissioning | is_draining - +---+---------+----------+--------------------+-------------+ - 4 | true | 0 | true | false - (1 row) - - No more data reported on target nodes. Please verify cluster health before removing the nodes. - ~~~ - -3. Once the node has been decommissioned, use the `kubectl scale` command to remove a pod from your StatefulSet: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl scale statefulset cockroachdb --replicas=3 - ~~~ - - ~~~ - statefulset.apps/cockroachdb scaled - ~~~ - -## Step 8. Clean up - -In the next module, you'll start with a fresh, non-orchestrated cluster. Delete the StatefulSet configuration file and use the `minikube delete` command to shut down and delete the minikube virtual machine and all the resources you created, including persistent volumes: - -{% include copy-clipboard.html %} -~~~ shell -$ kubectl delete \ --f https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cockroachdb-statefulset.yaml -~~~ - -{% include copy-clipboard.html %} -~~~ shell -$ kubectl delete job.batch/cluster-init-secure -~~~ - -{% include copy-clipboard.html %} -~~~ shell -$ kubectl delete pod cockroachdb-client-secure - -{% include copy-clipboard.html %} -~~~ shell -$ minikube delete -~~~ - -~~~ -Deleting local Kubernetes cluster... -Machine deleted. -~~~ - -{{site.data.alerts.callout_success}} -To retain logs, copy them from each pod's `stderr` before deleting the cluster and all its resources. To access a pod's standard error stream, run `kubectl logs <podname>`. -{{site.data.alerts.end}} - -{{site.data.alerts.callout_info}} -For information on how to optimize your deployment of CockroachDB on Kubernetes, see [CockroachDB Performance on Kubernetes](../kubernetes-performance.html). -{{site.data.alerts.end}} - -## What's next? - -[Performance Benchmarking](performance-benchmarking.html) diff --git a/src/archived/training/performance-benchmarking.md b/src/archived/training/performance-benchmarking.md deleted file mode 100644 index e2e185524bc..00000000000 --- a/src/archived/training/performance-benchmarking.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: Performance Benchmarking with TPC-C -summary: Learn how to benchmark CockroachDB against TPC-C. -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - -This lab walks you through [TPC-C](http://www.tpc.org/tpcc/) performance benchmarking on CockroachDB. It measures tpmC (new order transactions/minute) on a TPC-C dataset of 10 warehouses (for a total dataset size of 2GB) on 3 nodes. - -{{site.data.alerts.callout_info}} -For training purposes, the dataset used in this lab is small. For instructions on how to benchmark with a larger dataset, see [Performance Benchmarking with TPC-C](../performance-benchmarking-with-tpc-c-1k-warehouses.html). -{{site.data.alerts.end}} - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a 3-node cluster - -Start and initialize a cluster like you did in previous modules. - -{{site.data.alerts.callout_info}} -To simplify the process of running multiple nodes on your local computer, you'll start them in the [background](../cockroach-start.html#general) instead of in separate terminals. -{{site.data.alerts.end}} - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259,localhost:26260 \ - --background - ~~~~ - -2. Perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -3. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259,localhost:26260 \ - --background - ~~~ - -4. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259,localhost:26260 \ - --background - ~~~ - -5. Start node 4, which will be used to run the TPC-C benchmark: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node4 \ - --listen-addr=localhost:26260 \ - --http-addr=localhost:8083 \ - --join=localhost:26257,localhost:26258,localhost:26259,localhost:26260 \ - --background - ~~~ - -{{site.data.alerts.callout_danger}} -This configuration is intended for training and performance benchmarking only. For production deployments, there are other important considerations, such as ensuring that data is balanced across at least three availability zones for resiliency. See the [Production Checklist](../recommended-production-settings.html) for more details. -{{site.data.alerts.end}} - -## Step 3. Load data for the benchmark - -CockroachDB comes with built-in load generators for simulating different types of client workloads, printing out per-operation statistics every second and totals after a specific duration or max number of operations. This step features CockroachDB's version of the TPC-C workload. - -On the fourth node, use `cockroach workload` to load the initial schema and data: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach workload init tpcc \ ---warehouses=10 \ -'postgresql://root@localhost:26260?sslmode=disable' -~~~ - -This will take about ten minutes to load. - -{{site.data.alerts.callout_success}} -For more `tpcc` options, use `workload run tpcc --help`. For details about other load generators included in `workload`, use `workload run --help`. -{{site.data.alerts.end}} - -## Step 4. Run the benchmark - -Run the workload for ten "warehouses" of data for five minutes (300 seconds): - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach workload run tpcc \ ---warehouses=10 \ ---ramp=30s \ ---duration=300s \ ---split \ ---scatter \ -'postgresql://root@localhost:26260?sslmode=disable' -~~~ - -## Step 5. Interpret the results - -Once the `workload` has finished running, you should see a final output line: - -~~~ shell -_elapsed_______tpmC____efc__avg(ms)__p50(ms)__p90(ms)__p95(ms)__p99(ms)_pMax(ms) - 300.0s 120.8 93.9% 52.9 48.2 75.5 96.5 134.2 243.3 -~~~ - -You will also see some audit checks and latency statistics for each individual query. For this run, some of those checks might indicate that they were `SKIPPED` due to insufficient data. For a more comprehensive test, run `workload` for a longer duration (e.g., two hours). The `tpmC` (new order transactions/minute) number is the headline number and `efc` ("efficiency") tells you how close CockroachDB gets to theoretical maximum `tpmC`. - -The [TPC-C specification](http://www.tpc.org/tpc_documents_current_versions/pdf/tpc-c_v5.11.0.pdf) has p90 latency requirements in the order of seconds, but as you see here, CockroachDB far surpasses that requirement with p90 latencies in the hundreds of milliseconds. - -## Step 6. Clean up - -In the next module, you'll start with a fresh cluster, so take a moment to clean things up. - -1. Exit the SQL shell: - - {% include copy-clipboard.html %} - ~~~ sql - > \q - ~~~ - -2. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - - This simplified shutdown process is only appropriate for a lab/evaluation scenario. - -3. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 - ~~~ - -## What's next? - -[Data Import](data-import.html) diff --git a/src/archived/training/planned-maintenance.md b/src/archived/training/planned-maintenance.md deleted file mode 100644 index a383e5574ff..00000000000 --- a/src/archived/training/planned-maintenance.md +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: Planned Maintenance -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a 3-node cluster - -Start and initialize an insecure cluster like you did in previous modules. - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -2. In a new terminal, start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. In a new terminal, start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -4. In a new terminal, perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Increase the time until a node is considered dead - -Let's say you need to perform some maintenance on each of your nodes, e.g., upgrade system software. For each node, you expect the maintenance and restart process to take no more than 15 minutes, and you do not want the cluster to consider a node dead and rebalance its data during this process. - -1. In the same terminal, increase the `server.time_until_store_dead` cluster setting: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING server.time_until_store_dead = '15m0s';" - ~~~ - - {{site.data.alerts.callout_info}} - Use caution when changing the `server.time_until_store_dead` setting. Setting it too high creates some risk of unavailability since CockroachDB does not respond to down nodes as quickly. However, setting it too low causes increased network and disk I/O costs, as CockroachDB rebalances data around temporary outages. - {{site.data.alerts.end}} - -2. Then verify the new setting: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW CLUSTER SETTING server.time_until_store_dead;" - ~~~ - - ~~~ - server.time_until_store_dead - +------------------------------+ - 15m - (1 row) - ~~~ - -## Step 3. Stop, maintain, and restart nodes - -Stop, maintain, and restart one node at a time. This ensures that, at any point, the cluster has a majority of replicas and remains available. - -1. In the first node's terminal, press **CTRL-C** to stop the node. - -2. Imagine that you are doing some maintenance on the node. - - While the node is offline, you can verify the cluster's health by pointing the Admin UI to one of the nodes that is still up: http://localhost:8081 or http://localhost:8082. - -3. In the same terminal, rejoin the node to the cluster, using the same command that you used to start it initially: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -4. In the second node's terminal, press **CTRL-C** to stop the node. - -5. Imagine that you are doing some maintenance on the node. - - While the node is offline, you can verify the cluster's health by pointing the Admin UI to one of the nodes that is still up: http://localhost:8080 or http://localhost:8082. - -6. In the same terminal, rejoin the node to the cluster, using the same command that you used to start it initially: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -7. In the third node's terminal, press **CTRL-C** to stop the node. - -8. Imagine that you are doing some maintenance on the node. - - While the node is offline, you can verify the cluster's health by pointing the Admin UI to one of the nodes that is still up: http://localhost:8080 or http://localhost:8081. - -9. In the same terminal, rejoin the node to the cluster, using the same command that you used to start it initially: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -## Step 4. Reset the time until a node is considered dead - - Now that all nodes have been maintained and restarted, you can reset the time until the cluster considers a node dead and rebalances its data. - -1. In a new terminal, change the `server.time_until_store_dead` cluster setting back to the default of `5m0s`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="RESET CLUSTER SETTING server.time_until_store_dead;" - ~~~ - -2. Then verify the new setting: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW CLUSTER SETTING server.time_until_store_dead;" - ~~~ - - ~~~ - server.time_until_store_dead - +------------------------------+ - 5m - (1 row) - ~~~ - -## What's next? - -[Node Decommissioning](node-decommissioning.html) diff --git a/src/archived/training/production-deployment.md b/src/archived/training/production-deployment.md deleted file mode 100644 index 5bd18f42332..00000000000 --- a/src/archived/training/production-deployment.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Production Deployment -toc: false -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - -## What's next? - -[Monitoring and Alerting](monitoring-and-alerting.html) diff --git a/src/archived/training/resources/docker-compose.yaml b/src/archived/training/resources/docker-compose.yaml deleted file mode 100644 index 09ce3d4b9b7..00000000000 --- a/src/archived/training/resources/docker-compose.yaml +++ /dev/null @@ -1,95 +0,0 @@ -version: '3.5' - -networks: - cockroachdb-training-shared: - name: cockroachdb-training-shared - driver: bridge - cockroachdb-training-dc0: - name: cockroachdb-training-dc0 - driver: bridge - cockroachdb-training-dc1: - name: cockroachdb-training-dc1 - driver: bridge - cockroachdb-training-dc2: - name: cockroachdb-training-dc2 - driver: bridge - -services: - - # DC 0 nodes - - roach-0: - container_name: roach-0 - hostname: roach-0 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc0 - command: start --logtostderr --insecure --locality=datacenter=dc-0 --join=roach-0,roach-1,roach-2 - ports: - - 8080:8080 - - 26257:26257 - - roach-1: - container_name: roach-1 - hostname: roach-1 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc0 - command: start --logtostderr --insecure --locality=datacenter=dc-0 --join=roach-0,roach-1,roach-2 - ports: - - 8081:8080 - - 26258:26257 - - # DC 1 nodes - - roach-2: - container_name: roach-2 - hostname: roach-2 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc1 - command: start --logtostderr --insecure --locality=datacenter=dc-1 --join=roach-0,roach-1,roach-2 - ports: - - 8082:8080 - - 26259:26257 - - roach-3: - container_name: roach-3 - hostname: roach-3 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc1 - command: start --logtostderr --insecure --locality=datacenter=dc-1 --join=roach-0,roach-1,roach-2 - ports: - - 8083:8080 - - 26260:26257 - - # DC 2 nodes - - roach-4: - container_name: roach-4 - hostname: roach-4 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc2 - command: start --logtostderr --insecure --locality=datacenter=dc-2 --join=roach-0,roach-1,roach-2 - ports: - - 8084:8080 - - 26261:26257 - - roach-5: - container_name: roach-5 - hostname: roach-5 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc2 - command: start --logtostderr --insecure --locality=datacenter=dc-2 --join=roach-0,roach-1,roach-2 - ports: - - 8085:8080 - - 26262:26257 diff --git a/src/archived/training/resources/mysql_dump.sql b/src/archived/training/resources/mysql_dump.sql deleted file mode 100644 index 4cd953f840b..00000000000 --- a/src/archived/training/resources/mysql_dump.sql +++ /dev/null @@ -1,77 +0,0 @@ --- MySQL dump 10.13 Distrib 5.7.22, for osx10.12 (x86_64) --- --- Host: localhost Database: mysql_import --- ------------------------------------------------------ --- Server version 5.7.22 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `accounts` --- - -DROP TABLE IF EXISTS `accounts`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `accounts` ( - `customer_id` int(11) NOT NULL, - `id` int(11) NOT NULL, - `balance` decimal(10,0) DEFAULT NULL, - PRIMARY KEY (`customer_id`), - CONSTRAINT `accounts_customer_id_fkey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `accounts` --- - -LOCK TABLES `accounts` WRITE; -/*!40000 ALTER TABLE `accounts` DISABLE KEYS */; -INSERT INTO `accounts` VALUES (1,1,100),(2,2,200),(3,3,200),(4,4,400),(5,5,200); -/*!40000 ALTER TABLE `accounts` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `customers` --- - -DROP TABLE IF EXISTS `customers`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `customers` ( - `id` int(11) NOT NULL, - `name` text, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `customers` --- - -LOCK TABLES `customers` WRITE; -/*!40000 ALTER TABLE `customers` DISABLE KEYS */; -INSERT INTO `customers` VALUES (1,'Bjorn Fairclough'),(2,'Arturo Nevin'),(3,'Naseem Joossens'),(4,'Juno Studwick'),(5,'Eutychia Roberts'); -/*!40000 ALTER TABLE `customers` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2018-12-20 11:34:30 diff --git a/src/archived/training/resources/pg_dump.sql b/src/archived/training/resources/pg_dump.sql deleted file mode 100644 index 6fd9ec472bb..00000000000 --- a/src/archived/training/resources/pg_dump.sql +++ /dev/null @@ -1,125 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 10.1 --- Dumped by pg_dump version 10.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - --- --- Name: test; Type: SCHEMA; Schema: -; Owner: seanloiselle --- - -CREATE SCHEMA test; - - -ALTER SCHEMA test OWNER TO seanloiselle; - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: seanloiselle --- - -CREATE TABLE accounts ( - customer_id integer, - id integer NOT NULL, - balance numeric, - CONSTRAINT accounts_balance_check CHECK ((balance > (0)::numeric)) -); - - -ALTER TABLE accounts OWNER TO seanloiselle; - --- --- Name: customers; Type: TABLE; Schema: public; Owner: seanloiselle --- - -CREATE TABLE customers ( - id integer NOT NULL, - name text -); - - -ALTER TABLE customers OWNER TO seanloiselle; - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: seanloiselle --- - -COPY accounts (customer_id, id, balance) FROM stdin; -1 1 100 -2 2 200 -3 3 200 -4 4 400 -5 5 200 -\. - - --- --- Data for Name: customers; Type: TABLE DATA; Schema: public; Owner: seanloiselle --- - -COPY customers (id, name) FROM stdin; -1 Bjorn Fairclough -2 Arturo Nevin -3 Naseem Joossens -4 Juno Studwick -5 Eutychia Roberts -\. - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (id); - - --- --- Name: customers customers_pkey; Type: CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY customers - ADD CONSTRAINT customers_pkey PRIMARY KEY (id); - - --- --- Name: accounts accounts_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customers(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/src/archived/training/resources/pg_dump_cleaned.sql b/src/archived/training/resources/pg_dump_cleaned.sql deleted file mode 100644 index 52f4147a257..00000000000 --- a/src/archived/training/resources/pg_dump_cleaned.sql +++ /dev/null @@ -1,119 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 10.1 --- Dumped by pg_dump version 10.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - --- --- Name: test; Type: SCHEMA; Schema: -; Owner: seanloiselle --- - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: seanloiselle --- - -CREATE TABLE accounts ( - customer_id integer, - id integer NOT NULL, - balance numeric, - CONSTRAINT accounts_balance_check CHECK ((balance > (0)::numeric)) -); - - -ALTER TABLE accounts OWNER TO seanloiselle; - --- --- Name: customers; Type: TABLE; Schema: public; Owner: seanloiselle --- - -CREATE TABLE customers ( - id integer NOT NULL, - name text -); - - -ALTER TABLE customers OWNER TO seanloiselle; - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: seanloiselle --- - -COPY accounts (customer_id, id, balance) FROM stdin; -1 1 100 -2 2 200 -3 3 200 -4 4 400 -5 5 200 -\. - - --- --- Data for Name: customers; Type: TABLE DATA; Schema: public; Owner: seanloiselle --- - -COPY customers (id, name) FROM stdin; -1 Bjorn Fairclough -2 Arturo Nevin -3 Naseem Joossens -4 Juno Studwick -5 Eutychia Roberts -\. - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (id); - - --- --- Name: customers customers_pkey; Type: CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY customers - ADD CONSTRAINT customers_pkey PRIMARY KEY (id); - - --- --- Name: accounts accounts_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customers(id); - - --- --- PostgreSQL database dump complete --- diff --git a/src/archived/training/security.md b/src/archived/training/security.md deleted file mode 100644 index 76f6396daef..00000000000 --- a/src/archived/training/security.md +++ /dev/null @@ -1,263 +0,0 @@ ---- -title: Secure Your Cluster -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous lab. - -## Step 1. Generate security certificates - -1. Create two directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ mkdir certs my-safe-directory - ~~~ - - Directory | Description - ----------|------------ - `certs` | You'll generate your CA certificate and all node and client certificates and keys in this directory. - `my-safe-directory` | You'll generate your CA key in this directory and then reference the key when generating node and client certificates. - -2. Create the CA certificate and key: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-ca \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -3. Create the certificate and key for the your nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-node \ - localhost \ - $(hostname) \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - - Because you're running a local cluster and all nodes use the same hostname (`localhost`), you only need a single node certificate. Note that this is different than running a production cluster, where you would need to generate a certificate and key for each node, issued to all common names and IP addresses you might use to refer to the node as well as to any load balancer instances. - -4. Create client certificates and keys for the `root` and `spock` users: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-client \ - root \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-client \ - spock \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -## Step 2. Start a secure cluster - -Restart the nodes using the same commands you used to start them initially, but this time use the `--certs-dir` flag to point to the node certificate, and leave out the `--insecure` flag. - -1. Start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --certs-dir=certs --host=localhost:26257 - ~~~ - -## Step 3. Add data to your cluster - -1. Use the `cockroach gen` command to generate an example `startrek` database with 2 tables, `episodes` and `quotes`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data startrek | cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 - ~~~ - -2. Create a new user called `spock` and grant `spock` the `SELECT` privilege on the `startrek.quotes` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --execute="CREATE USER spock; GRANT SELECT ON TABLE startrek.quotes TO spock;" - ~~~ - -## Step 4. Authenticate a user (via client cert) - -1. As the `spock` user, read from the `startrek.quotes` table, using the `--certs-dir` to point to the user's client cert: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --user=spock \ - --database=startrek \ - --execute="SELECT * FROM quotes WHERE quote ~* 'creature';" - ~~~ - - ~~~ - quote | characters | stardate | episode - +-------------------------------------------------------------+------------+----------+---------+ - There is a multi-legged creature crawling on your shoulder. | Spock | 3193.9 | 23 - (1 row) - ~~~ - -## Step 5. Authenticate a user (via password) - -Although we recommend always using TLS certificates to authenticate users, it's possible to authenticate a user with just a password. - -{{site.data.alerts.callout_info}} -For multiple users to access the Admin UI, the `root` user must [create users with passwords](../create-user.html#create-a-user-with-a-password). -{{site.data.alerts.end}} - -1. As the `root` user, open the built-in SQL shell: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 - ~~~ - -2. Create a new `kirk` user with the password `enterprise`. You'll have to type in the password twice at the prompt: - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE USER kirk WITH PASSWORD 'enterprise'; - ~~~ - -3. Exit the SQL shell: - - {% include copy-clipboard.html %} - ~~~ sql - > \q - ~~~ - -4. As the `root` user, grant `kirk` the `SELECT` privilege on the tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --user=root \ - --execute="GRANT SELECT ON startrek.* TO kirk;" - ~~~ - -5. As the `kirk` user, read from the `startrek.quotes` table: - - {{site.data.alerts.callout_info}} - It's necessary to include the `--certs-dir` flag even though you haven't created a cert for this user. When the cluster does not find a suitable client cert, it falls back on password authentication. - {{site.data.alerts.end}} - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --user=kirk \ - --database=startrek \ - --execute="SELECT * FROM quotes WHERE quote ~* 'danger';" - ~~~ - - Enter `enterprise` as the password: - - ~~~ - Enter password: - ~~~ - - You'll then see the response: - - ~~~ - quote | characters | stardate | episode - +------------------------------------------+---------------+----------+---------+ - Insufficient facts always invite danger. | Spock | 3141.9 | 22 - Power is danger. | The Centurion | 1709.2 | 14 - (2 rows) - ~~~ - -## Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 my-safe-directory certs - ~~~ - -## What's next? - -[Production Deployment](production-deployment.html) diff --git a/src/archived/training/software-panic-troubleshooting.md b/src/archived/training/software-panic-troubleshooting.md deleted file mode 100644 index f6300a301b6..00000000000 --- a/src/archived/training/software-panic-troubleshooting.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: Software Panic Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Before you begin - -Make sure you have already completed [Data Corruption Troubleshooting](data-corruption-troubleshooting.html) and have a cluster of 3 nodes running. - -## Step 1. Simulate the problem - -1. In a new terminal, issue a "query of death" against node 3. The query will crash the node, the connection will then fail, and you'll see an error message printed to `stderr`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26259 \ - --execute="SELECT crdb_internal.force_panic('foo');" - ~~~ - - ~~~ - Error: driver: bad connection - Failed running "sql" - ~~~ - -## Step 2. Troubleshoot the problem - -In the terminal where node 3 was running, check the `stdout` for details: - -{{site.data.alerts.callout_info}} -You can also look in the node's full logs at `node3/logs`. -{{site.data.alerts.end}} - -~~~ -E180209 14:47:54.819282 2149 sql/session.go:1370 [client=127.0.0.1:53558,user=root,n1] a SQL panic has occurred! -* -* ERROR: [client=127.0.0.1:53558,user=root,n1] a SQL panic has occurred! -* -E180209 14:47:54.819378 2149 util/log/crash_reporting.go:113 [n1] a panic has occurred! -* -* ERROR: [n1] a panic has occurred! -* -panic while executing "select crdb_internal.force_panic('foo');": foo - -goroutine 2149 [running]: -runtime/debug.Stack(0x8246800, 0xc42038e540, 0x3) - /usr/local/go/src/runtime/debug/stack.go:24 +0x79 -github.com/cockroachdb/cockroach/pkg/util/log.ReportPanic(0x8246800, 0xc42038e540, 0xc4201d2000, 0x56f2fe0, 0xc4203632a0, 0x1) -... -~~~ - -The cause of the panic is clearly identified before the stack trace: - -~~~ -panic while executing "select crdb_internal.force_panic('foo');": foo -~~~ - -## Step 3. Resolve the problem - -With the cause identified, you should: - -1. Update your application to stop issuing the "query of death". - -2. Restart the down node. - -3. File an issue with Cockroach Labs. We'll cover the ideal way to do this in an upcoming module. - -## Step 4. Clean up - -In the next lab, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Stop the other CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 - ~~~ - -## What's next? - -[Network Partition Troubleshooting](network-partition-troubleshooting.html) diff --git a/src/archived/training/sql-basics.md b/src/archived/training/sql-basics.md deleted file mode 100644 index d938ad842b2..00000000000 --- a/src/archived/training/sql-basics.md +++ /dev/null @@ -1,439 +0,0 @@ ---- -title: SQL Basics -toc: true -sidebar_data: sidebar-data-training.json ---- - - -
    - -## Before you begin - -Make sure you have already completed [Data Import](data-import.html). - -## Step 1. Start a SQL shell - -Use the [`cockroach sql`](../cockroach-start.html) command to open the built-in SQL client: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach sql --insecure --host=localhost:26257 -~~~ - -## Step 2. Create a database and table - -In this training, you'll create a bank with customers and accounts. First, you'll need to [create a database](../create-database.html) on your Cockroach cluster to store this information. - -1. In the built-in SQL client, create a database: - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE DATABASE bank; - ~~~ - - Databases do not directly store any data; you need to describe the - shape of the data you intend to store by [creating tables](../create-table.html) within your database. - -2. Create a table: - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE TABLE bank.customers ( - customer_id INTEGER PRIMARY KEY, - name STRING, - address STRING - ); - ~~~ - - You created a table called `customers` in the `bank` database with three columns: `customer_id`, `name`, and `address`. Each column has a [data type](../data-types.html). This means that the column will only accept the specified data type (i.e., `customer_id` can only be an [`INTEGER`](../int.html), `name` can only be a [`STRING`](../string.html), and `address` can only be a `STRING`). - - The `customer_id` column is also the table's [primary key](../primary-key.html). In CockroachDB, and most SQL databases, it is always more efficient to search a table by primary key than by any other field because there can only be one primary key column, and the primary key column must be unique for every row. Therefore, the `name` column would be an unsuitable primary key because it's likely that your bank will eventually have two customers with the same name. - -## Step 3. Insert data into your table - -Now that you have a table, [insert](../insert.html) some data into it. - -1. Insert a row into the table: - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.customers - VALUES (1, 'Petee', '101 5th Ave, New York, NY 10003'); - ~~~ - - `INSERT` statements add new rows to a table. Values must be specified in the same order that the columns were declared in the `CREATE TABLE` statement. Note that a string needs to be surrounded with single quotes (`'`), but integers do not. - -2. Verify that the data was inserted successfully by using a [`SELECT` statement](../select.html) to retrieve data from the table: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT customer_id, name, address FROM bank.customers; - ~~~ - - ~~~~ - customer_id | name | address - +-------------+-------+------------------------------------------------+ - 1 | Petee | 101 5th Ave, New York, NY 10003 - (1 row) - ~~~~ - -3. Insert another row: - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.customers VALUES (2, 'Carl', NULL); - ~~~ - - We do not know Carl's address, so we use the special `NULL` value to indicate "unknown." - -4. Insert two rows in the same statement: - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.customers VALUES - (3, 'Lola', NULL), - (4, 'Ernie', '1600 Pennsylvania Ave NW, Washington, DC 20500'); - ~~~ - -5. Verify that the data was inserted successfully: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT * FROM bank.customers; - ~~~ - - ~~~ - customer_id | name | address - +-------------+-------+------------------------------------------------+ - 1 | Petee | 101 5th Ave, New York, NY 10003 - 2 | Carl | NULL - 3 | Lola | NULL - 4 | Ernie | 1600 Pennsylvania Ave NW, Washington, DC 20500 - (4 rows) - ~~~ - - The `SELECT *` shorthand is used to indicate that you want all the columns in the table without explicitly enumerating them. - - {{site.data.alerts.callout_info}} - Tables are also called **relations**, in the mathematical sense of the word, which is why SQL databases are sometimes referred to as relational databases. - {{site.data.alerts.end}} - -## Step 4. Create an `accounts` table - -Now that you have a place to store personal information about customers, create a table to store data about the customers' account(s) and balance. - -1. Create an `accounts` table: - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE TABLE bank.accounts ( - type STRING, - balance DECIMAL(8, 2), - customer_id INTEGER REFERENCES bank.customers (customer_id) - ); - ~~~ - - This table demonstrates two new SQL features. - - The first new feature is the balance column's [`DECIMAL` type](../decimal.html), which is capable of storing fractional numbers (the previously used `INTEGER` columns can only store whole numbers). The numbers in parenthesis indicate the maximum size of the decimal number. `DECIMAL(8, 2)` means that a number with up to eight digits can be stored with up to two digits past the decimal point. This means we can store account balances as large as `999999.99`, but no larger. - - The second new feature is the [foreign key](../foreign-key.html) created by the `REFERENCES` clause. Foreign keys are how SQL maintains referential integrity across different tables. Here, the foreign key guarantees that every account belongs to a real customer. Let's verify this works as intended. - -2. Try to open an account for a customer that doesn't exist: - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.accounts VALUES ('checking', 0.00, 5); - ~~~ - - ~~~ - pq: foreign key violation: value [5] not found in customers@primary [customer_id] (txn="sql txn" id=fd9f171c key=/Min rw=false pri=0.00960426 iso=SERIALIZABLE stat=PENDING epo=0 ts=1534557981.019071738,0 orig=1534557981.019071738,0 max=1534557981.519071738,0 wto=false rop=false seq=1) - ~~~ - - As expected, the statement fails with a "foreign key violation" error, indicating that no customer with ID `5` exists. - -3. Now open an account for a valid customer: - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.accounts VALUES ('checking', 0.00, 1); - ~~~ - -4. Try to [delete](../delete.html) a customer record: - - {% include copy-clipboard.html %} - ~~~ sql - > DELETE FROM bank.customers WHERE customer_id = 1; - ~~~ - - The `WHERE` clause here is a constraint. It indicates that we do not want to delete all the data in the `customers` table, but just the row where `customer_id=1`. - - ~~~ - pq: foreign key violation: values [1] in columns [customer_id] referenced in table "accounts" - ~~~ - - You weren't able to delete Petee's information because the customer still has accounts open (i.e., there are records in the `accounts` table). - -5. Delete a customer's account: - - {% include copy-clipboard.html %} - ~~~ sql - > DELETE FROM bank.accounts WHERE customer_id = 1; - ~~~ - -6. Now that the customer's account is deleted, you can delete the customer record: - - {% include copy-clipboard.html %} - ~~~ sql - > DELETE FROM bank.customers WHERE customer_id = 1; - ~~~ - -7. Create accounts for Carl (`customer_id=2`) and Ernie (`customer_id=4`): - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.accounts VALUES - ('checking', 250.00, 2), - ('savings', 314.15, 2), - ('savings', 42000.00, 4); - ~~~ - -## Step 5. List account balances - -1. View account balances using a `SELECT` statement: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT * FROM bank.accounts; - ~~~ - - ~~~ - type | balance | customer_id - +----------+----------+-------------+ - checking | 250.00 | 2 - savings | 314.15 | 2 - savings | 42000.00 | 4 - (3 rows) - ~~~ - -2. Use a [join](../joins.html) to match customer IDs with the name and address in the `customers` table: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT * FROM bank.customers NATURAL JOIN bank.accounts; - ~~~ - - ~~~ - customer_id | name | address | type | balance - +-------------+-------+------------------------------------------------+----------+----------+ - 2 | Carl | NULL | checking | 250.00 - 2 | Carl | NULL | savings | 314.15 - 4 | Ernie | 1600 Pennsylvania Ave NW, Washington, DC 20500 | savings | 42000.00 - (3 rows) - ~~~ - - Now you have one view where you can see accounts alongside their customer information. - - While you could create one big table with all the above information, it's recommended that you create separate tables and join them. With this setup, you would only need to update data in one place. - -3. [Update](../update.html) Carl's address: - - {% include copy-clipboard.html %} - ~~~ sql - > UPDATE bank.customers - SET address = '4 Privet Drive, Little Whinging, England' - WHERE customer_id = 2; - ~~~ - -4. With the join, the address is updated on both accounts: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT * FROM bank.customers NATURAL JOIN bank.accounts; - ~~~ - - ~~~ - customer_id | name | address | type | balance - +-------------+-------+------------------------------------------------+----------+----------+ - 2 | Carl | 4 Privet Drive, Little Whinging, England | checking | 250.00 - 2 | Carl | 4 Privet Drive, Little Whinging, England | savings | 314.15 - 4 | Ernie | 1600 Pennsylvania Ave NW, Washington, DC 20500 | savings | 42000.00 - (3 rows) - ~~~ - - If you only had one big table, you'd have to remember to update Carl's address on every account, and the multiple copies would likely get out of sync. - - {{site.data.alerts.callout_info}} - Designing a schema so that there is exactly one copy of each piece of data is called **normalization**, and is a key concept in relational databases. - {{site.data.alerts.end}} - -## Step 6. Transactions - -Suppose Carl wants to withdraw $250 from his checking account. First, check that he has $250 in his account with one query, then perform the withdrawal in another. - -Here's how that would look (do not run this example yet): - -~~~ sql -> SELECT balance >= 250 FROM bank.accounts WHERE type = 'checking' AND customer_id = 2; - - balance >= 250 -+----------------+ - true -(1 row) - --- If false, quit. Otherwise, continue. - -> UPDATE bank.accounts SET balance = balance - 250 WHERE type = 'checking' AND customer_id = 2; -~~~ - -This would work most of the time, but there's a security flaw. Suppose Carl issues two transfer requests for $250 at the exact same time; let's call them transfer A and transfer B. - -First, transfer A checks to see if there's at least $250 in Carl's checking account. There is, so it proceeds with the transfer. But before transfer A can deduct the $250 from his account, transfer B checks to see if there's $250 in the account. Transfer A hasn't deducted the money yet, so transfer B sees enough money and decides to proceed, too. When the two transfers complete, Carl will have withdrawn $250 that wasn't in his account, and the bank will have to cover the loss. - -This issue can be solved by using a [transaction](../transactions.html). If two transactions attempt to modify the same data at the same time, one of the transactions will get canceled. - -Using transactions is as simple as issuing a [`BEGIN` statement](../begin-transaction.html) to start a transaction and a [`COMMIT` statement](../commit-transaction.html) to finish it. You can also [`ROLLBACK` a transaction](../rollback-transaction.html) midway if, for example, you discover that the transfer has insufficient funds. - -Here's the above example in a transaction. Again, do not run this example yet. - -~~~ sql -> BEGIN; --- Now adding input for a multi-line SQL transaction client-side. --- Press Enter two times to send the SQL text collected so far to the server, or Ctrl+C to cancel. --- You can also use \show to display the statements entered so far. - -> SELECT balance >= 250 FROM bank.accounts WHERE type = 'checking' AND customer_id = 2; - -> -- press Enter again - - balance >= 250 -+----------------+ - true -(1 row) - --- If false, issue a ROLLBACK statement. Otherwise, continue. - -OPEN> UPDATE bank.accounts SET balance = balance - 250 WHERE type = 'checking' AND customer_id = 2; -UPDATE 1; -OPEN> COMMIT; -COMMIT -~~~ - -Now try running two copies of the above transaction in parallel: - -1. In the SQL shell, run: - - {% include copy-clipboard.html %} - ~~~ sql - > BEGIN; - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT balance >= 250 FROM bank.accounts WHERE type = 'checking' AND customer_id = 2; - ~~~ - -2. Press enter. - -3. Open a new terminal, start a second SQL shell, and run the same: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --insecure - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > BEGIN; - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT balance >= 250 FROM bank.accounts WHERE type = 'checking' AND customer_id = 2; - ~~~ - -4. Press enter a second time to send the SQL statement to the server. - -5. Run: - - {% include copy-clipboard.html %} - ~~~ sql - > UPDATE bank.accounts SET balance = balance - 250 WHERE type = 'checking' AND customer_id = 2; - ~~~ -6. Press enter a second time to send the SQL statement to the server. - -7. Commit the transaction: - - {% include copy-clipboard.html %} - ~~~ sql - > COMMIT; - ~~~ - -8. Back in the first SQL shell, run: - - {% include copy-clipboard.html %} - ~~~ sql - > UPDATE bank.accounts SET balance = balance - 250 WHERE type = 'checking' AND customer_id = 2; - ~~~ - -9. Press enter a second time to send the SQL statement to the server. - -10. Commit the transaction: - - {% include copy-clipboard.html %} - ~~~ sql - > COMMIT; - ~~~ - -When you reach the `COMMIT` statement, you'll see one transaction fail with an error like this: - -~~~ -pq: restart transaction: HandledRetryableTxnError: TransactionRetryError: retry txn (RETRY_WRITE_TOO_OLD) -~~~ - -CockroachDB detected that the two transactions are attempting conflicting withdrawals and canceled one of them. - -{{site.data.alerts.callout_info}} -Any number of `SELECT`, `INSERT`, `UPDATE`, and `DELETE` queries can be placed in a transaction. This is what makes traditional SQL databases so powerful. -{{site.data.alerts.end}} - -## Step 7. Aggregations - -`SELECT` statements aren't limited to combining data from different tables. They can also combine data in the same table using **aggregations**. - -1. Add all of the balances in the `accounts` table: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT SUM(balance) FROM bank.accounts; - ~~~ - - ~~~ - sum - +----------+ - 42314.15 - (1 row) - ~~~ - -2. View the balance grouped by account type: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT type, SUM(balance) FROM bank.accounts GROUP BY type; - ~~~ - - ~~~ - type | sum - +----------+----------+ - checking | 250.00 - savings | 42064.15 - (2 rows) - ~~~ - -Joins and aggregations can be combined and nested to express nearly any query. - -## What's Next? - -- [Users and Privileges](users-and-privileges.html) diff --git a/src/archived/training/under-replication-troubleshooting.md b/src/archived/training/under-replication-troubleshooting.md deleted file mode 100644 index 192f664d84f..00000000000 --- a/src/archived/training/under-replication-troubleshooting.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Under-Replication Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a 3-node cluster - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -2. In another terminal, start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. In another terminal, start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -4. In another terminal, perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Simulate the problem - -1. In the same terminal, reduce the amount of time the cluster waits before considering a node dead to just 1 minute and 15 seconds: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING server.time_until_store_dead = '1m15s';" - ~~~ - -2. In the terminal where node 3 is running, press **CTRL-C** to stop the node. - -## Step 3. Troubleshoot the problem - -1. Open the Admin UI at http://localhost:8080 and click **Metrics** on the left. - -2. In the upper right you'll see the **Replication Status** widget: - - CockroachDB Admin UI - - You'll see that there are 24 ranges total, and 24 ranges are under-replicated, which means that every range in the cluster is missing 1 of 3 replicas. This is a vulnerable state because, if another node were to go offline, all ranges would lose consensus, and the entire cluster would become unavailable. - -## Step 4. Resolve the problem - -To bring the cluster back to a safe state, you need to either restart the down node or add a new node. - -1. In the terminal where node 3 was running, restart the node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. Soon, you'll see that there are no longer any under-replicated ranges. - -## What's next? - -[Cluster Unavailability Troubleshooting](cluster-unavailability-troubleshooting.html) diff --git a/src/archived/training/users-and-privileges.md b/src/archived/training/users-and-privileges.md deleted file mode 100644 index 5cd0730ec84..00000000000 --- a/src/archived/training/users-and-privileges.md +++ /dev/null @@ -1,320 +0,0 @@ ---- -title: Users and Privileges -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Before you begin - -1. Make sure you have already completed [SQL Basics](sql-basics.html). - -2. Use the `cockroach gen` command to generate an example `startrek` database with 2 tables, `episodes` and `quotes`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data startrek | cockroach sql \ - --insecure \ - --host=localhost:26257 - ~~~ - -## Step 1. Check initial privileges - -Initially, no users other than `root` have privileges, and root has `ALL` privileges on everything in the cluster. - -1. Check the privileges on the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW GRANTS ON DATABASE startrek;" - ~~~ - - You'll see that only the `root` user (and `admin` role to which `root` belongs) has access to the database: - - ~~~ - database_name | schema_name | grantee | privilege_type - +---------------+--------------------+---------+----------------+ - startrek | crdb_internal | admin | ALL - startrek | crdb_internal | root | ALL - startrek | information_schema | admin | ALL - startrek | information_schema | root | ALL - startrek | pg_catalog | admin | ALL - startrek | pg_catalog | root | ALL - startrek | public | admin | ALL - startrek | public | root | ALL - (8 rows) - ~~~ - -2. Check the privileges on the tables inside in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW GRANTS ON startrek.episodes, startrek.quotes;" - ~~~ - - Again, you'll see that only the `root` user (and `admin` role to which `root` belongs) has access to the database: - - ~~~ - database_name | schema_name | table_name | grantee | privilege_type - +---------------+-------------+------------+---------+----------------+ - startrek | public | episodes | admin | ALL - startrek | public | episodes | root | ALL - startrek | public | quotes | admin | ALL - startrek | public | quotes | root | ALL - (4 rows) - ~~~ - -## Step 2. Create a user - -1. Create a new user, `spock`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --execute="CREATE USER spock;" - ~~~ - -2. Try to read from a table in the `startrek` database as `spock`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --user=spock \ - --database=startrek \ - --execute="SELECT count(*) FROM episodes;" - ~~~ - - Initially, `spock` has no privileges, so the query fails: - - ~~~ - Error: pq: user spock does not have SELECT privilege on relation episodes - Failed running "sql" - ~~~ - -## Step 3. Grant privileges to the user - -1. As the `root` user, grant `spock` the `SELECT` privilege on all tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="GRANT SELECT ON TABLE startrek.* TO spock;" - ~~~ - -2. As the `root` user, grant `spock` the `INSERT` privilege on just the `startrek.quotes` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="GRANT INSERT ON TABLE startrek.quotes TO spock;" - ~~~ - -3. As the `root` user, show the privileges granted on tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW GRANTS ON TABLE startrek.quotes, startrek.episodes;" - ~~~ - - ~~~ - database_name | schema_name | table_name | grantee | privilege_type - +---------------+-------------+------------+---------+----------------+ - startrek | public | episodes | admin | ALL - startrek | public | episodes | root | ALL - startrek | public | episodes | spock | SELECT - startrek | public | quotes | admin | ALL - startrek | public | quotes | root | ALL - startrek | public | quotes | spock | INSERT - startrek | public | quotes | spock | SELECT - (7 rows) - ~~~ - -## Step 4. Connect as the user - -1. As the `spock` user, read from the tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --user=spock \ - --execute="SELECT count(*) FROM startrek.quotes;" \ - --execute="SELECT count(*) FROM startrek.episodes;" - ~~~ - - Because `spock` has the `SELECT` privilege on the tables, the query succeeds: - - ~~~ - count - +-------+ - 200 - (1 row) - count - +-------+ - 79 - (1 row) - ~~~ - -2. As the `spock` user, insert a row into the `startrek.quotes` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --user=spock \ - --execute="INSERT INTO startrek.quotes VALUES ('Blah blah', 'Spock', NULL, 52);" - ~~~ - - Because `spock` has the `INSERT` privilege on the table, the query succeeds: - - ~~~ - INSERT 1 - ~~~ - -3. As the `spock` user, try to insert a row into the `startrek.episodes` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --user=spock \ - --execute="INSERT INTO startrek.episodes VALUES (80, 3, 25, 'The Episode That Never Was', 5951.5);" - ~~~ - - Because `spock` does not have the `INSERT` privilege on the table, the query fails: - - ~~~ - Error: pq: user spock does not have INSERT privilege on relation episodes - Failed running "sql" - ~~~ - -## Step 5. Revoke privileges from the user - -1. As the `root` user, show the privileges granted on tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW GRANTS ON TABLE startrek.quotes, startrek.episodes;" - ~~~ - - ~~~ - database_name | schema_name | table_name | grantee | privilege_type - +---------------+-------------+------------+---------+----------------+ - startrek | public | episodes | admin | ALL - startrek | public | episodes | root | ALL - startrek | public | episodes | spock | SELECT - startrek | public | quotes | admin | ALL - startrek | public | quotes | root | ALL - startrek | public | quotes | spock | INSERT - startrek | public | quotes | spock | SELECT - (7 rows) - ~~~ - -2. As the `root` user, revoke the `SELECT` privilege on the `startrek.episodes` table from `spock`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="REVOKE SELECT ON TABLE startrek.episodes FROM spock;" - ~~~ - -3. As the `root` user, again show the privileges granted on tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW GRANTS ON TABLE startrek.quotes, startrek.episodes;" - ~~~ - - Note that `spock` no longer has the `SELECT` privilege on the `episodes` table. - - ~~~ - database_name | schema_name | table_name | grantee | privilege_type - +---------------+-------------+------------+---------+----------------+ - startrek | public | episodes | admin | ALL - startrek | public | episodes | root | ALL - startrek | public | quotes | admin | ALL - startrek | public | quotes | root | ALL - startrek | public | quotes | spock | INSERT - startrek | public | quotes | spock | SELECT - (6 rows) - ~~~ - -4. Now as the `spock` user, try to read from the `startrek.episodes` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --user=spock \ - --execute="SELECT count(*) FROM startrek.episodes;" - ~~~ - - Because `spock` no longer has the `SELECT` privilege on the table, the query fails: - - ~~~ - Error: pq: user spock does not have SELECT privilege on relation episodes - Failed running "sql" - ~~~ - -## Step 6. Clean up - -In the next module, you'll start with a fresh cluster, so take a moment to clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - - This simplified shutdown process is only appropriate for a lab/evaluation scenario. - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 - ~~~ - -## What's next? - -[Security](security.html) diff --git a/src/archived/training/why-cockroachdb.md b/src/archived/training/why-cockroachdb.md deleted file mode 100644 index 58dad1059af..00000000000 --- a/src/archived/training/why-cockroachdb.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Why CockroachDB? -toc: false -sidebar_data: sidebar-data-training.json - ---- - -Kick off your training by watching Alex Robinson, a CockroachDB Engineer, explain the history of databases and why CockroachDB was built. You can also read through a related set of slides. - -
    - - -
    -

    - -
    - - - -
    - -
    - - - -
    - -## What's next? - -[Architecture Overview](architecture-overview.html) From d4655fb67bfb5589659885042d0a1ccec9513332 Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Fri, 3 May 2024 10:30:00 -0700 Subject: [PATCH 29/34] Use the new download table include for 23.1.20 (#18520) --- src/current/_includes/releases/v23.1/v23.1.20.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/current/_includes/releases/v23.1/v23.1.20.md b/src/current/_includes/releases/v23.1/v23.1.20.md index 48a4ab3ceb3..770b9a3bd46 100644 --- a/src/current/_includes/releases/v23.1/v23.1.20.md +++ b/src/current/_includes/releases/v23.1/v23.1.20.md @@ -2,7 +2,7 @@ Release Date: May 1, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    From d35a7a156f8f8ee3fc6879afd3a0f09be202a71f Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Fri, 3 May 2024 17:19:36 -0700 Subject: [PATCH 30/34] [DOC-10213] Updates to Dedicated on Azure limitations page (#18515) * [DOC-10213] Updates to Dedicated on Azure limitations page --- .../cockroachdb-dedicated-on-azure.md | 56 +++++-------------- 1 file changed, 14 insertions(+), 42 deletions(-) diff --git a/src/current/cockroachcloud/cockroachdb-dedicated-on-azure.md b/src/current/cockroachcloud/cockroachdb-dedicated-on-azure.md index 0bf8f3a16c3..916e6ef5eb1 100644 --- a/src/current/cockroachcloud/cockroachdb-dedicated-on-azure.md +++ b/src/current/cockroachcloud/cockroachdb-dedicated-on-azure.md @@ -12,14 +12,9 @@ This page provides information about CockroachDB {{ site.data.products.dedicated CockroachDB {{ site.data.products.dedicated }} clusters on Azure have the following temporary limitations. To express interest or request more information about a given limitation, contact your Cockroach Labs account team. For more details, refer to the [FAQs](#faqs). -### Regions - -For the list of supported Azure regions, refer to [Azure Regions]({% link cockroachcloud/regions.md %}?filters=dedicated#azure-regions). - ### Editing and scaling - A cluster must have at minimum three nodes. A multi-region cluster must have at minimum three nodes per region. Single-node clusters are not supported. -- To add or remove regions from a cluster on Azure, you must use the CockroachDB {{ site.data.products.cloud }} API. Refer to [Scale, edit or upgrade a cluster](https://www.cockroachlabs.com/docs/api/cloud/v1#patch-/api/v1/clusters/-cluster_id-). - After it is created, a cluster's storage can be increased in place, but cannot subsequently be decreased or removed. ### Networking @@ -28,7 +23,6 @@ For the list of supported Azure regions, refer to [Azure Regions]({% link cockro ### Observability -- Exporting metrics to [Datadog](https://www.datadoghq.com/) is available. Enable the Datadog integration in the [CockroachDB {{ site.data.products.cloud }} Console]({% link cockroachcloud/tools-page.md %}#monitor-cockroachdb-dedicated-with-datadog) or with the [Cloud API]({% link cockroachcloud/export-metrics.md %}?filters=datadog-metrics-export). - Exporting metrics to Azure Monitor is not yet available. To express interest, contact your Cockroach Labs account team. - [Log Export]({% link cockroachcloud/export-logs.md %}) is not yet available. @@ -44,21 +38,17 @@ For the list of supported Azure regions, refer to [Azure Regions]({% link cockro The following sections provide more details about CockroachDB {{ site.data.products.dedicated }} on Azure. -### Are multi-region clusters supported? - -Yes. - ### Can CockroachDB {{ site.data.products.serverless }} clusters be deployed on Azure? CockroachDB {{ site.data.products.serverless }} is not currently available on Azure. -### Are horizontal and vertical scaling supported? +### Can we use {{ site.data.products.db }} credits to pay for clusters on Azure? -Yes. Refer to [Cluster Management]({% link cockroachcloud/cluster-management.md %}). +Yes, a CockroachDB {{ site.data.products.cloud }} organization can pay for the usage of CockroachDB {{ site.data.products.dedicated }} clusters on Azure with {{ site.data.products.db }} credits. To add additional credits to your CockroachDB {{ site.data.products.cloud }} organization, contact your Cockroach Labs account team. -### What Azure regions can we choose? +### Can we migrate from PostgreSQL to CockroachDB {{ site.data.products.dedicated }} on Azure? -Refer to [Azure Regions]({% link cockroachcloud/regions.md %}?filters=dedicated#azure-regions). +CockroachDB supports the [PostgreSQL wire protocol](https://www.postgresql.org/docs/current/protocol.html) and the majority of PostgreSQL syntax. Refer to [Supported SQL Feature Support](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/sql-feature-support). The same CockroachDB binaries are used across CockroachDB {{ site.data.products.cloud }} deployment environments, and all SQL features behave the same on Azure as on GCP or AWS. ### What kind of compute and storage resources are used? @@ -66,54 +56,36 @@ Refer to [Azure Regions]({% link cockroachcloud/regions.md %}?filters=dedicated# CockroachDB {{ site.data.products.dedicated }} clusters can be created with a minimum of 4 vcPUs per node on Azure. -### Can we use {{ site.data.products.db }} credits to pay for clusters on Azure? - -Yes, existing CockroachDB {{ site.data.products.cloud }} customers can pay for the usage of CockroachDB {{ site.data.products.dedicated }} clusters on Azure with their available credits. To add additional credits to your CockroachDB {{ site.data.products.cloud }} organization, contact your Cockroach Labs account team. - ### What backup and restore options are available for clusters on Azure? [Managed-service backups]({% link cockroachcloud/use-managed-service-backups.md %}?filters=dedicated) automatically back up clusters on Azure, and customers can [take and restore from manual backups to Azure storage]({% link cockroachcloud/take-and-restore-customer-owned-backups.md %}) ([Blob Storage](https://azure.microsoft.com/products/storage/blobs) or [ADLS Gen 2](https://learn.microsoft.com/azure/storage/blobs/data-lake-storage-introduction)). Refer to the blog post [CockroachDB locality-aware Backups for Azure Blob](https://www.cockroachlabs.com/blog/locality-aware-backups-azure-blob/) for an example. -### Is it possible to take encrypted backups? - -Yes, customers can [take and restore from encrypted backups]({% link cockroachcloud/take-and-restore-customer-owned-backups.md %}) on Azure storage by using an RSA key stored in [Azure Key Vault](https://learn.microsoft.com/azure/key-vault/keys/about-keys). +You can [take and restore from encrypted backups]({% link cockroachcloud/take-and-restore-customer-owned-backups.md %}) on Azure storage by using an RSA key stored in [Azure Key Vault](https://learn.microsoft.com/azure/key-vault/keys/about-keys). ### Are changefeeds available? Yes, customers can create and configure [changefeeds](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/changefeed-messages) to send data events in real-time from a CockroachDB {{ site.data.products.dedicated }} cluster to a [downstream sink](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/changefeed-sinks.html) such as Kafka, Azure storage, or Webhook. [Azure Event Hubs](https://learn.microsoft.com/azure/event-hubs/azure-event-hubs-kafka-overview) provides an Azure-native service that can be used with a Kafka endpoint as a sink. -### Can we export logs and metrics from a cluster on Azure to Azure Monitor or a third-party observability service? - -Exporting metrics to Datadog is supported. Refer to [Export Metrics From a CockroachDB {{ site.data.products.dedicated }} Cluster]({% link cockroachcloud/export-metrics.md %}). It’s not yet possible to export cluster logs or metrics to Azure Monitor or to another third-party observability service. To express interest in this feature, contact your Cockroach Labs account team. +### What secure and centralized authentication methods are available for {{ site.data.products.dedicated }} clusters on Azure? -### Are CockroachDB user-defined functions available for clusters on Azure? +Human users can connect using [Cluster SSO]({% link cockroachcloud/cloud-sso-sql.md %}), [client certificates](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/authentication.html#using-digital-certificates-with-cockroachdb), or the [`ccloud` command]({% link cockroachcloud/ccloud-get-started.md %}) or SQL clients. -Yes, [user-defined functions](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/user-defined-functions) are supported for CockroachDB {{ site.data.products.dedicated }} clusters on Azure. The same CockroachDB binaries are used across CockroachDB {{ site.data.products.cloud }} deployment environments, and all SQL features behave the same on Azure as on GCP or AWS. +Application users can connect using [JWT tokens](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/sso-sql) or [client certificates](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/authentication.html#using-digital-certificates-with-cockroachdb). -### Can we migrate from PostgreSQL to CockroachDB {{ site.data.products.dedicated }} on Azure? +### Can we use private connectivity methods, such as Private Link, to securely connect to a cluster on Azure? -CockroachDB supports the [PostgreSQL wire protocol](https://www.postgresql.org/docs/current/protocol.html) and the majority of PostgreSQL syntax. Refer to [Supported SQL Feature Support](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/sql-feature-support). The same CockroachDB binaries are used across CockroachDB {{ site.data.products.cloud }} deployment environments, and all SQL features behave the same on Azure as on GCP or AWS. +You can configure IP allowlisting to limit the IP addresses or CIDR ranges that can access a CockroachDB {{ site.data.products.dedicated }} cluster on Azure. [Azure Private Link](https://learn.microsoft.com/azure/private-link/private-link-overview) is not yet available. To express interest, contact your Cockroach Labs account team. ### How are clusters on Azure isolated from each other? Do they follow a similar approach as on AWS and GCP? CockroachDB {{ site.data.products.cloud }} follows a similar tenant isolation approach on Azure as on GCP and AWS. Each {{ site.data.products.dedicated }} cluster is created on an [AKS cluster](https://azure.microsoft.com/products/kubernetes-service) in a unique [VNet](https://learn.microsoft.com/azure/virtual-network/virtual-networks-overview). Implementation details are subject to change. -### Can we use Single-Sign On to sign-in to {{ site.data.products.db }} and manage clusters on Azure? - -Yes, [Cloud Organization SSO]({% link cockroachcloud/cloud-org-sso.md %}) is supported. This feature is unrelated to the cluster's deployment environment. - -### What secure and centralized authentication methods are available for {{ site.data.products.dedicated }} clusters on Azure? - -Human users can connect using [Cluster SSO]({% link cockroachcloud/cloud-sso-sql.md %}), [client certificates](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/authentication.html#using-digital-certificates-with-cockroachdb), or the [`ccloud` command]({% link cockroachcloud/ccloud-get-started.md %}) or SQL clients. - -Application users can connect using [JWT tokens](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/sso-sql) or [client certificates](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/authentication.html#using-digital-certificates-with-cockroachdb). - ### How is data encrypted at rest in a cluster on Azure? -Customer data at rest on cluster disks is encrypted using [server-side encryption of Azure disk storage](https://learn.microsoft.com/azure/virtual-machines/disk-encryption). CockroachDB’s [file-based encryption at rest](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/security-reference/encryption#cockroachdb-self-hosted-clusters) and [Customer-Managed Encryption Keys (CMEK)]({% link cockroachcloud/cmek.md %}) are not yet available. To express interest, contact your Cockroach Labs account team. +Customer data at rest on cluster disks is encrypted using [server-side encryption of Azure disk storage](https://learn.microsoft.com/azure/virtual-machines/disk-encryption). [Customer-Managed Encryption Keys (CMEK)]({% link cockroachcloud/cmek.md %}) are not yet available. To express interest, contact your Cockroach Labs account team. -All client connections to a CockroachDB {{ site.data.products.dedicated }} cluster on Azure, as well as connections between nodes, are encrypted using TLS. +All client connections to a CockroachDB {{ site.data.products.dedicated }} cluster, as well as connections between nodes, are encrypted using TLS. -### Can we use private connectivity methods, such as Private Link, to securely connect to a cluster on Azure? +### Do CockroachDB {{ site.data.products.dedicated }} clusters on Azure comply with SOC 2? -You can configure IP allowlisting to limit the IP addresses or CIDR ranges that can access a CockroachDB {{ site.data.products.dedicated }} cluster on Azure. [Azure Private Link](https://learn.microsoft.com/azure/private-link/private-link-overview) is not yet available. To express interest, contact your Cockroach Labs account team. +CockroachDB Dedicated on Azure meets or exceeds the requirements of SOC 2 Type 2. Refer to [Regulatory Compliance in CockroachDB {{ site.data.products.dedicated }}]({% link cockroachcloud/compliance.md %}). From c717ba8f44c47c2b603228b19302446321be2dfa Mon Sep 17 00:00:00 2001 From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com> Date: Mon, 6 May 2024 12:18:16 -0400 Subject: [PATCH 31/34] Add docs for fast cutback in v24.1 physical cluster replication (#18506) --- .../releases/v24.1/v24.1.0-alpha.1.md | 1 - .../alter-virtual-cluster-diagram.html | 576 +++++++++++------- .../fast-cutback-syntax.md | 8 + src/current/v24.1/alter-virtual-cluster.md | 12 +- src/current/v24.1/cutover-replication.md | 116 +++- ...-cluster-replication-technical-overview.md | 3 +- 6 files changed, 493 insertions(+), 223 deletions(-) create mode 100644 src/current/_includes/v24.1/physical-replication/fast-cutback-syntax.md diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md index ee2f25d8dab..eeed1ab4764 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md @@ -13,7 +13,6 @@ Release Date: March 7, 2024 - [`ALTER CHANGEFEED`]({% link v23.2/alter-changefeed.md %}) no longer removes a [CDC query]({% link v23.2/cdc-queries.md %}) when modifying changefeed properties. [#116498][#116498] - `changefeed.balance_range_distribution.enable` is now deprecated. Instead, use the new [cluster setting]({% link v23.2/cluster-settings.md %}) `changefeed.default_range_distribution_strategy`. `changefeed.default_range_distribution_strategy='balanced_simple'` has the same effect as setting `changefeed.balance_range_distribution.enable=true`. It does not require `initial_scan='only'`, which was required by the old setting. [#115166][#115166] - CDC queries now correctly handle the [`changefeed_creation_timestamp`]({% link v23.2/cdc-queries.md %}#cdc-query-function-support) function. [#117520][#117520] -- The new `WITH PRIOR REPLICATION DETAILS` option can now be passed when inspecting a virtual cluster with [`SHOW VIRTUAL CLUSTER`]({% link v23.2/show-virtual-cluster.md %}). This will request additional details about where the virtual cluster was replicated **from** and when it was activated, if that virtual cluster was created via replication. [#117636][#117636] - The new syntax `ALTER VIRTUAL CLUSTER virtual-cluster START REPLICATION OF virtual-cluster ON physical-cluster` can now be used to reconfigure virtual clusters previously serving as sources for [physical cluster replication]({% link v23.2/physical-cluster-replication-overview.md %}) to become standbys to a promoted standby. This reverses the direction of replication while maximizing data reuse. [#117656][#117656] - [`BACKUP`]({% link v23.2/backup.md %})s now load range information that is used to avoid a spike in metadata lookups when backups begin. [#116520][#116520] - Clusters created to run [physical cluster replication]({% link v23.2/physical-cluster-replication-overview.md %}) no longer automatically disable the [`spanconfig.range_coalescing.system.enabled`]({% link v23.2/cluster-settings.md %}#setting-spanconfig-storage-coalesce-adjacent-enabled) and [`spanconfig.range_coalescing.application.enabled`]({% link v23.2/cluster-settings.md %}#setting-spanconfig-tenant-coalesce-adjacent-enabled) cluster settings. Users who started using physical cluster replication on v23.1 or v23.2 may wish to manually reset these settings. [#119221][#119221] diff --git a/src/current/_includes/v24.1/physical-replication/alter-virtual-cluster-diagram.html b/src/current/_includes/v24.1/physical-replication/alter-virtual-cluster-diagram.html index d0444ee3525..c5400f6e9ed 100644 --- a/src/current/_includes/v24.1/physical-replication/alter-virtual-cluster-diagram.html +++ b/src/current/_includes/v24.1/physical-replication/alter-virtual-cluster-diagram.html @@ -1,273 +1,431 @@
    - + + y="1" + width="62" + height="32" + class="terminal" + rx="10"/> ALTER + y="1" + width="80" + height="32" + class="terminal" + rx="10"/> VIRTUAL + y="1" + width="82" + height="32" + class="terminal" + rx="10"/> CLUSTER - virtual_cluster_spec + y="67" + width="64" + height="32" + class="terminal" + rx="10"/> PAUSE + y="111" + width="76" + height="32" + class="terminal" + rx="10"/> RESUME + y="67" + width="114" + height="32" + class="terminal" + rx="10"/> REPLICATION + y="155" + width="92" + height="32" + class="terminal" + rx="10"/> COMPLETE + y="155" + width="114" + height="32" + class="terminal" + rx="10"/> REPLICATION + y="155" + width="38" + height="32" + class="terminal" + rx="10"/> TO + y="155" + width="74" + height="32" + class="terminal" + rx="10"/> SYSTEM + y="155" + width="54" + height="32" + class="terminal" + rx="10"/> TIME - timestamp + y="199" + width="70" + height="32" + class="terminal" + rx="10"/> LATEST + y="287" + width="44" + height="32" + class="terminal" + rx="10"/> SET + y="287" + width="114" + height="32" + class="terminal" + rx="10"/> REPLICATION - - - RETENTION - - - = - - - - duration + + + RETENTION + + + EXPIRATION + + + WINDOW + + + = + + + duration - - - , - - - GRANT - - - REVOKE - - - CAPABILITY - - - - virtual_cluster_capability_list - - - - ALL - + - CAPABILITIES - + y="243" + width="24" + height="32" + class="terminal" + rx="10"/> + , + - RENAME - - - TO - - - - virtual_cluster_spec + y="419" + width="64" + height="32" + class="terminal" + rx="10"/> + START + + + REPLICATION + + + OF + + + virtual_cluster_spec + + + + ON + + + physical_cluster + + + + WITH + + + RETENTION + + + EXPIRATION + + + WINDOW + + + = + + + duration + + + + , + + + OPTIONS + + + ( + + + RETENTION + + + EXPIRATION + + + WINDOW + + + = + + + duration - + + + , + + + ) + + + SERVICE + + + SHARED + - START - - - SERVICE - - - SHARED - + y="705" + width="76" + height="32" + class="terminal" + rx="10"/> + RENAME + + + TO + + + virtual_cluster_spec + + - STOP - + y="749" + width="56" + height="32" + class="terminal" + rx="10"/> + STOP + - SERVICE + y="749" + width="78" + height="32" + class="terminal" + rx="10"/> + SERVICE + + + GRANT + + + REVOKE + + + ALL + + + CAPABILITIES + + + CAPABILITY + + + virtual_cluster_capability_list + - - + d="m19 17 h2 m0 0 h10 m62 0 h10 m0 0 h10 m80 0 h10 m0 0 h10 m82 0 h10 m0 0 h10 m148 0 h10 m2 0 l2 0 m2 0 l2 0 m2 0 l2 0 m-484 66 l2 0 m2 0 l2 0 m2 0 l2 0 m42 0 h10 m64 0 h10 m0 0 h12 m-116 0 h20 m96 0 h20 m-136 0 q10 0 10 10 m116 0 q0 -10 10 -10 m-126 10 v24 m116 0 v-24 m-116 24 q0 10 10 10 m96 0 q10 0 10 -10 m-106 10 h10 m76 0 h10 m20 -44 h10 m114 0 h10 m0 0 h1224 m-1514 0 h20 m1494 0 h20 m-1534 0 q10 0 10 10 m1514 0 q0 -10 10 -10 m-1524 10 v68 m1514 0 v-68 m-1514 68 q0 10 10 10 m1494 0 q10 0 10 -10 m-1504 10 h10 m92 0 h10 m0 0 h10 m114 0 h10 m0 0 h10 m38 0 h10 m20 0 h10 m74 0 h10 m0 0 h10 m54 0 h10 m0 0 h10 m88 0 h10 m-296 0 h20 m276 0 h20 m-316 0 q10 0 10 10 m296 0 q0 -10 10 -10 m-306 10 v24 m296 0 v-24 m-296 24 q0 10 10 10 m276 0 q10 0 10 -10 m-286 10 h10 m70 0 h10 m0 0 h186 m20 -44 h874 m-1504 -10 v20 m1514 0 v-20 m-1514 20 v112 m1514 0 v-112 m-1514 112 q0 10 10 10 m1494 0 q10 0 10 -10 m-1504 10 h10 m44 0 h10 m0 0 h10 m114 0 h10 m40 0 h10 m100 0 h10 m0 0 h112 m-252 0 h20 m232 0 h20 m-272 0 q10 0 10 10 m252 0 q0 -10 10 -10 m-262 10 v24 m252 0 v-24 m-252 24 q0 10 10 10 m232 0 q10 0 10 -10 m-242 10 h10 m106 0 h10 m0 0 h10 m86 0 h10 m20 -44 h10 m30 0 h10 m0 0 h10 m72 0 h10 m-434 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -24 q0 -10 10 -10 m414 44 l20 0 m-20 0 q10 0 10 -10 l0 -24 q0 -10 -10 -10 m-414 0 h10 m24 0 h10 m0 0 h370 m20 44 h842 m-1504 -10 v20 m1514 0 v-20 m-1514 20 v112 m1514 0 v-112 m-1514 112 q0 10 10 10 m1494 0 q10 0 10 -10 m-1504 10 h10 m64 0 h10 m20 0 h10 m114 0 h10 m0 0 h10 m38 0 h10 m0 0 h10 m148 0 h10 m0 0 h10 m40 0 h10 m0 0 h10 m122 0 h10 m20 0 h10 m58 0 h10 m60 0 h10 m100 0 h10 m0 0 h112 m-252 0 h20 m232 0 h20 m-272 0 q10 0 10 10 m252 0 q0 -10 10 -10 m-262 10 v24 m252 0 v-24 m-252 24 q0 10 10 10 m232 0 q10 0 10 -10 m-242 10 h10 m106 0 h10 m0 0 h10 m86 0 h10 m20 -44 h10 m30 0 h10 m0 0 h10 m72 0 h10 m-434 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -24 q0 -10 10 -10 m414 44 l20 0 m-20 0 q10 0 10 -10 l0 -24 q0 -10 -10 -10 m-414 0 h10 m24 0 h10 m0 0 h370 m20 44 h196 m-670 0 h20 m650 0 h20 m-690 0 q10 0 10 10 m670 0 q0 -10 10 -10 m-680 10 v112 m670 0 v-112 m-670 112 q0 10 10 10 m650 0 q10 0 10 -10 m-660 10 h10 m84 0 h10 m0 0 h10 m26 0 h10 m40 0 h10 m100 0 h10 m0 0 h112 m-252 0 h20 m232 0 h20 m-272 0 q10 0 10 10 m252 0 q0 -10 10 -10 m-262 10 v24 m252 0 v-24 m-252 24 q0 10 10 10 m232 0 q10 0 10 -10 m-242 10 h10 m106 0 h10 m0 0 h10 m86 0 h10 m20 -44 h10 m30 0 h10 m0 0 h10 m72 0 h10 m-434 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -24 q0 -10 10 -10 m414 44 l20 0 m-20 0 q10 0 10 -10 l0 -24 q0 -10 -10 -10 m-414 0 h10 m24 0 h10 m0 0 h370 m20 44 h10 m26 0 h10 m-768 -132 h20 m768 0 h20 m-808 0 q10 0 10 10 m788 0 q0 -10 10 -10 m-798 10 v190 m788 0 v-190 m-788 190 q0 10 10 10 m768 0 q10 0 10 -10 m-778 10 h10 m0 0 h758 m-1370 -210 h20 m1370 0 h20 m-1410 0 q10 0 10 10 m1390 0 q0 -10 10 -10 m-1400 10 v222 m1390 0 v-222 m-1390 222 q0 10 10 10 m1370 0 q10 0 10 -10 m-1380 10 h10 m78 0 h10 m0 0 h10 m76 0 h10 m0 0 h1176 m-1484 -252 v20 m1514 0 v-20 m-1514 20 v266 m1514 0 v-266 m-1514 266 q0 10 10 10 m1494 0 q10 0 10 -10 m-1504 10 h10 m76 0 h10 m0 0 h10 m38 0 h10 m0 0 h10 m148 0 h10 m0 0 h1172 m-1504 -10 v20 m1514 0 v-20 m-1514 20 v24 m1514 0 v-24 m-1514 24 q0 10 10 10 m1494 0 q10 0 10 -10 m-1504 10 h10 m56 0 h10 m0 0 h10 m78 0 h10 m0 0 h1320 m-1504 -10 v20 m1514 0 v-20 m-1514 20 v24 m1514 0 v-24 m-1514 24 q0 10 10 10 m1494 0 q10 0 10 -10 m-1484 10 h10 m66 0 h10 m0 0 h8 m-114 0 h20 m94 0 h20 m-134 0 q10 0 10 10 m114 0 q0 -10 10 -10 m-124 10 v24 m114 0 v-24 m-114 24 q0 10 10 10 m94 0 q10 0 10 -10 m-104 10 h10 m74 0 h10 m40 -44 h10 m44 0 h10 m0 0 h10 m118 0 h10 m0 0 h146 m-368 0 h20 m348 0 h20 m-388 0 q10 0 10 10 m368 0 q0 -10 10 -10 m-378 10 v24 m368 0 v-24 m-368 24 q0 10 10 10 m348 0 q10 0 10 -10 m-358 10 h10 m104 0 h10 m0 0 h10 m204 0 h10 m20 -44 h972 m23 -726 h-3"/> + +
    \ No newline at end of file diff --git a/src/current/_includes/v24.1/physical-replication/fast-cutback-syntax.md b/src/current/_includes/v24.1/physical-replication/fast-cutback-syntax.md new file mode 100644 index 00000000000..18f5f46b5f9 --- /dev/null +++ b/src/current/_includes/v24.1/physical-replication/fast-cutback-syntax.md @@ -0,0 +1,8 @@ +{% include_cached new-in.html version="v24.1" %} To cut back to a cluster that was previously the primary cluster, use the [`ALTER VIRTUAL CLUSTER`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}) syntax: + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER VIRTUAL CLUSTER {original_primary_vc} START REPLICATION FROM {promoted_standby_vc} ON connection_string_standby; +~~~ + +The original primary virtual cluster may be almost up to date with the promoted standby's virtual cluster. The difference in data between the two virtual clusters will include only the writes that have been applied to the promoted standby after cutover from the primary cluster. \ No newline at end of file diff --git a/src/current/v24.1/alter-virtual-cluster.md b/src/current/v24.1/alter-virtual-cluster.md index 8c63dbf8632..6855d076760 100644 --- a/src/current/v24.1/alter-virtual-cluster.md +++ b/src/current/v24.1/alter-virtual-cluster.md @@ -44,13 +44,15 @@ Parameter | Description `RESUME REPLICATION` | Resume the replication stream. `COMPLETE REPLICATION TO` | Set the time to complete the replication. Use:
    • `SYSTEM TIME` to specify a [timestamp]({% link {{ page.version.version }}/as-of-system-time.md %}). Refer to [Cut over to a point in time]({% link {{ page.version.version }}/cutover-replication.md %}#cut-over-to-a-point-in-time) for an example.
    • `LATEST` to specify the most recent replicated timestamp. Refer to [Cut over to a point in time]({% link {{ page.version.version }}/cutover-replication.md %}#cut-over-to-the-most-recent-replicated-time) for an example.
    `SET REPLICATION RETENTION = duration` | Change the [duration]({% link {{ page.version.version }}/interval.md %}) of the retention window that will control how far in the past you can [cut over]({% link {{ page.version.version }}/cutover-replication.md %}) to.

    {% include {{ page.version.version }}/physical-replication/retention.md %} +`SET REPLICATION EXPIRATION WINDOW = duration` | Override the default producer job's expiration window of 24 hours. The producer job expiration window determines how long the producer job will continue to run without a heartbeat from the consumer job. Refer to the [Technical Overview]({% link {{ page.version.version }}/physical-cluster-replication-technical-overview.md %}) for more details. +`START REPLICATION OF virtual_cluster_spec ON physical_cluster` | Reset a virtual cluster to the time when the virtual cluster on the promoted standby diverged from it. To reuse as much of the existing data on the original primary cluster as possible, you can run this statement as part of the [cutback]({% link {{ page.version.version }}/cutover-replication.md %}#cut-back-to-the-primary-cluster) process. This command fails if the virtual cluster was not originally replicated from the original primary cluster. +`START SERVICE SHARED` | Start a virtual cluster so it is ready to accept SQL connections after cutover. +`RENAME TO virtual_cluster_spec` | Rename a virtual cluster. +`STOP SERVICE` | Stop the `shared` service for a virtual cluster. The virtual cluster's `data_state` will still be `ready` so that the service can be restarted. `GRANT ALL CAPABILITIES` | Grant a virtual cluster all [capabilities]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities). `REVOKE ALL CAPABILITIES` | Revoke all [capabilities]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) from a virtual cluster. `GRANT CAPABILITY virtual_cluster_capability_list` | Specify a [capability]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) to grant to a virtual cluster. `REVOKE CAPABILITY virtual_cluster_capability_list` | Revoke a [capability]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) from a virtual cluster. -`RENAME TO virtual_cluster_spec` | Rename a virtual cluster. -`START SERVICE SHARED` | Start a virtual cluster. That is, start the standby's virtual cluster so it is ready to accept SQL connections after cutover. -`STOP SERVICE` | Stop the `shared` service for a virtual cluster. Note that the virtual cluster's `data_state` will remain as `ready` for the service to be started once again. ## Examples @@ -68,6 +70,10 @@ You can use either: - `SYSTEM TIME` to specify a [timestamp]({% link {{ page.version.version }}/as-of-system-time.md %}). - `LATEST` to specify the most recent replicated timestamp. +### Start the cutback process + +{% include {{ page.version.version }}/physical-replication/fast-cutback-syntax.md %} + ### Set a retention window You can change the retention window to protect data from [garbage collection]({% link {{ page.version.version }}/architecture/storage-layer.md %}#garbage-collection). The retention window controls how far in the past you can [cut over]({% link {{ page.version.version }}/cutover-replication.md %}) to: diff --git a/src/current/v24.1/cutover-replication.md b/src/current/v24.1/cutover-replication.md index c29b1b1c8b5..9c9f49c482f 100644 --- a/src/current/v24.1/cutover-replication.md +++ b/src/current/v24.1/cutover-replication.md @@ -20,7 +20,7 @@ The cutover is a two-step process on the standby cluster: Initiating a cutover is a manual process that makes the standby cluster ready to accept SQL connections. However, the cutover process does **not** automatically redirect traffic to the standby cluster. Once the cutover is complete, you must redirect application traffic to the standby (new) cluster. If you do not manually redirect traffic, writes to the primary (original) cluster may be lost. {{site.data.alerts.end}} -After a cutover, you may want to _cut back_ to the original primary cluster. That is, set up the original primary cluster to once again accept application traffic. This requires you to configure another full replication stream in the opposite direction from the original standby (now primary) to the original primary. For more detail, refer to [Cut back to the primary cluster](#cut-back-to-the-primary-cluster). +After a cutover, you may want to _cut back_ to the original primary cluster (or a different cluster) to set up the original primary cluster to once again accept application traffic. For more details, refer to [Cut back to the primary cluster](#cut-back-to-the-primary-cluster). ## Step 1. Initiate the cutover @@ -154,16 +154,116 @@ At this point, the primary and standby clusters are entirely independent. You wi ## Cut back to the primary cluster -After cutting over to the standby cluster, you may need to move back to the original primary cluster, or a completely different cluster. This process is manual and requires starting a new replication stream. +After cutting over to the standby cluster, you may need to cut back to the original primary cluster to serve your application. -For example, if you had [set up physical cluster replication]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}) between a primary and standby cluster and then cut over to the standby, the workflow to cut back to the original primary cluster would be as follows: +{% include {{ page.version.version }}/physical-replication/fast-cutback-syntax.md %} -- Original primary cluster = Cluster A -- Original standby cluster = Cluster B +{{site.data.alerts.callout_info}} +To move back to a different cluster, follow the physical cluster replication [setup]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}). +{{site.data.alerts.end}} + +### Example + +This section illustrates the steps to cut back to the original primary cluster from the promoted standby cluster that is currently serving traffic. + +- **Cluster A** = original primary cluster +- **Cluster B** = original standby cluster + +**Cluster B** is serving application traffic after the [cutover](#step-2-complete-the-cutover). + +1. To begin the cutback to **Cluster A**, the virtual cluster must first stop accepting connections. Connect to the system virtual on **Cluster A**: + + {% include_cached copy-clipboard.html %} + ~~~ shell + cockroach sql --url \ + "postgresql://{user}@{node IP or hostname cluster A}:26257?options=-ccluster=system&sslmode=verify-full" \ + --certs-dir "certs" + ~~~ + +1. From the system virtual cluster on **Cluster A**, ensure that service to the virtual cluster has stopped: + + {% include_cached copy-clipboard.html %} + ~~~ sql + ALTER VIRTUAL CLUSTER {cluster_a} STOP SERVICE; + ~~~ + +1. Open another terminal window and connect to the system virtual cluster for **Cluster B**: + + {% include_cached copy-clipboard.html %} + ~~~ shell + cockroach sql --url \ + "postgresql://{user}@{node IP or hostname cluster B}:26257?options=-ccluster=system&sslmode=verify-full" \ + --certs-dir "certs" + ~~~ + +1. From the system virtual cluster on **Cluster B**, enable rangefeeds: + + {% include_cached copy-clipboard.html %} + ~~~ sql + SET CLUSTER SETTING kv.rangefeed.enabled = 'true'; + ~~~ + +1. From the system virtual cluster on **Cluster A**, start the replication from cluster B to cluster A: + + {% include_cached copy-clipboard.html %} + ~~~ sql + ALTER VIRTUAL CLUSTER {cluster_a} START REPLICATION OF {cluster_b} ON 'postgresql://{user}@{ node IP or hostname cluster B}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{standby cert}.crt'; + ~~~ + + This will reset the virtual cluster on **Cluster A** back to the time at which the same virtual cluster on **Cluster B** diverged from it. **Cluster A** will check with **Cluster B** to confirm that its virtual cluster was replicated from **Cluster A** as part of the original [physical cluster replication stream]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}). + + {{site.data.alerts.callout_success}} + For details on connection strings, refer to the [Connection reference]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#connection-reference). + {{site.data.alerts.end}} + +1. Check the status of the virtual cluster on **A**: + + {% include_cached copy-clipboard.html %} + ~~~ sql + SHOW VIRTUAL CLUSTER {cluster_a}; + ~~~ + + {% include_cached copy-clipboard.html %} + ~~~ + id | name | data_state | service_mode + ----+--------+--------------------+--------------- + 1 | system | ready | shared + 3 | {vc_a} | replicating | none + 4 | test | replicating | none + (2 rows) + ~~~ + +1. From **Cluster A**, start the cutover: + + {% include_cached copy-clipboard.html %} + ~~~ sql + ALTER VIRTUAL CLUSTER {cluster_a} COMPLETE REPLICATION TO LATEST; + ~~~ + + The `cutover_time` is the timestamp at which the replicated data is consistent. The cluster will revert any data above this timestamp: + + ~~~ + cutover_time + ---------------------------------- + 1714497890000000000.0000000000 + (1 row) + ~~~ + +1. From **Cluster A**, bring the virtual cluster online: + + {% include_cached copy-clipboard.html %} + ~~~ sql + ALTER VIRTUAL CLUSTER {cluster_a} START SERVICE SHARED; + ~~~ + +1. To make **Cluster A's** virtual cluster the default for [connection strings]({% link {{ page.version.version }}/work-with-virtual-clusters.md %}#sql-clients), set the following [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}): + + {% include_cached copy-clipboard.html %} + ~~~ sql + SET CLUSTER SETTING server.controller.default_target_cluster='{cluster_a}'; + ~~~ -1. Cluster B is now serving application traffic after the cutover. -1. Drop the application virtual cluster from the cluster A with `DROP VIRTUAL CLUSTER`. {% comment %}link here{% endcomment %} -1. Start a replication stream that sends updates from cluster B to cluster A. Refer to [Start replication]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#step-4-start-replication). +At this point, **Cluster A** is once again the primary and **Cluster B** is once again the standby. The clusters are entirely independent. To direct application traffic to the primary (**Cluster A**), you will need to use your own network load balancers, DNS servers, or other network configuration to direct application traffic to **Cluster A**. To enable physical cluster replication again, from the primary to the standby (or a completely different cluster), refer to [Set Up Physical Cluster Replication]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}). ## See also diff --git a/src/current/v24.1/physical-cluster-replication-technical-overview.md b/src/current/v24.1/physical-cluster-replication-technical-overview.md index 60585a150e7..8b0c1e9888c 100644 --- a/src/current/v24.1/physical-cluster-replication-technical-overview.md +++ b/src/current/v24.1/physical-cluster-replication-technical-overview.md @@ -31,7 +31,6 @@ The stream initialization proceeds as follows: 1. The initial scan runs on the primary and backfills all data from the primary virtual cluster as of the starting timestamp of the replication stream. 1. Once the initial scan is complete, the primary then begins streaming all changes from the point of the starting timestamp. -{% comment %}TODO Kathryn to update this graphic {% endcomment%} Two virtualized clusters with system virtual cluster and application virtual cluster showing the directional stream. ### During the replication stream @@ -41,7 +40,7 @@ The replication happens at the byte level, which means that the job is unaware o During the job, [rangefeeds]({% link {{ page.version.version }}/create-and-configure-changefeeds.md %}#enable-rangefeeds) are periodically emitting resolved timestamps, which is the time where the ingested data is known to be consistent. Resolved timestamps provide a guarantee that there are no new writes from before that timestamp. This allows the standby cluster to move the [protected timestamp]({% link {{ page.version.version }}/architecture/storage-layer.md %}#protected-timestamps) forward as the replicated timestamp advances. This information is sent to the primary cluster, which allows for [garbage collection]({% link {{ page.version.version }}/architecture/storage-layer.md %}#garbage-collection) to continue as the replication stream on the standby cluster advances. {{site.data.alerts.callout_info}} -If the primary cluster does not receive replicated time information from the standby after 3 days, it cancels the replication job. This ensures that an inactive replication job will not prevent garbage collection. The time at which the job is removed is configurable via the `stream_replication.job_liveness_timeout` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}). +If the primary cluster does not receive replicated time information from the standby after 24 hours, it cancels the replication job. This ensures that an inactive replication job will not prevent garbage collection. The time at which the job is removed is configurable with [`ALTER VIRTUAL CLUSTER virtual_cluster EXPIRATION WINDOW = duration`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}) syntax. {{site.data.alerts.end}} ### Cutover and promotion process From 321bb1ea56e3243d729f122e380dd362c6d4b311 Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Mon, 6 May 2024 11:50:43 -0700 Subject: [PATCH 32/34] Add include file for v24.1.0 release notes (#18516) * Add include file for v24.1.0 release notes Co-authored-by: Mike Lewis <76072290+mikeCRL@users.noreply.github.com> --- .../_includes/releases/v24.1/v24.1.0.md | 269 ++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 src/current/_includes/releases/v24.1/v24.1.0.md diff --git a/src/current/_includes/releases/v24.1/v24.1.0.md b/src/current/_includes/releases/v24.1/v24.1.0.md new file mode 100644 index 00000000000..5c9e947b332 --- /dev/null +++ b/src/current/_includes/releases/v24.1/v24.1.0.md @@ -0,0 +1,269 @@ +## v24.1.0 + +Release Date: TBD TBD, 2024 + +With the release of CockroachDB v24.1, we've added new capabilities to help you migrate, build, and operate more efficiently. Refer to our summary of the most significant user-facing changes under [Feature Highlights](#v24-1-0-feature-highlights). + +{% include releases/new-release-downloads-docker-image.md release=include.release advisory_key="a103220"%} + +

    Feature highlights

    + +This section summarizes the most significant user-facing changes in v24.1.0 and other features recently made available to CockroachDB users across versions. For a complete list of features and changes in v24.1, including bug fixes and performance improvements, refer to the [release notes]({% link releases/index.md %}#testing-releases) for previous v24.1 testing releases. You can also search the docs for sections labeled [New in v24.1](https://www.cockroachlabs.com/docs/search?query=new+in+v24.1). + +- **Feature categories** + - [Observability](#v24-1-0-observability) + - [Migrations](#v24-1-0-migrations) + - [Security and compliance](#v24-1-0-security-and-compliance) + - [Disaster recovery](#v24-1-0-disaster-recovery) + - [Deployment and operations](#v24-1-0-deployment-and-operations) + - [SQL](#v24-1-0-sql) +- **Additional information** + - [Backward-incompatible changes](#v24-1-0-backward-incompatible-changes) + - [Deprecations](#v24-1-0-deprecations) + - [Known limitations](#v24-1-0-known-limitations) + - [Additional resources](#v24-1-0-additional-resources) + +{{ site.data.alerts.callout_info }} +In CockroachDB Self-Hosted, all available features are free to use unless their description specifies that an Enterprise license is required. For more information, refer to the [Licensing FAQ](https://www.cockroachlabs.com/docs/stable/licensing-faqs). +{{ site.data.alerts.end }} + +
    + +

    Observability

    + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD

    +
    TBD{% include icon-yes.html %}{% include icon-yes.html %}{% include icon-no.html %}
    + +

    Migrations

    + + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD

    +
    TBD{% include icon-yes.html %}{% include icon-yes.html %}{% include icon-yes.html %}
    + +

    Disaster recovery

    + + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD.

    +
    TBD{% include icon-yes.html %}{% include icon-no.html %}{% include icon-no.html %}
    + +

    Security and compliance

    + + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD

    +
    TBD{% include icon-no.html %}{% include icon-yes.html %}{% include icon-no.html %}
    + +

    Deployment and operations

    + + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD

    +
    TBD{% include icon-no.html %}{% include icon-yes.html %}{% include icon-no.html %}
    + +

    SQL

    + + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD

    +
    TBD{% include icon-no.html %}{% include icon-yes.html %}{% include icon-no.html %}
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Feature detail key
    *Features marked “All*” were recently made available in the CockroachDB Cloud platform. They are available for all supported versions of CockroachDB, under the deployment methods specified in their row under Availability.
    **Features marked “All**” were recently made available via migration tools maintained outside of the CockroachDB binary. They are available to use with all supported versions of CockroachDB, under the deployment methods specified in their row under Availability.
    {% include icon-yes.html %}Feature is available for this deployment method of CockroachDB as specified in the icon’s column: CockroachDB Self-Hosted, CockroachDB Dedicated, or CockroachDB Serverless.
    {% include icon-no.html %}Feature is not available for this deployment method of CockroachDB as specified in the icon’s column: CockroachDB Self-Hosted, CockroachDB Dedicated, or CockroachDB Serverless.
    + + +
    + +

    Backward-incompatible changes

    + +Before [upgrading to CockroachDB v24.1]({% link v24.1/upgrade-cockroach-version.md %}), be sure to review the following backward-incompatible changes, as well as [key cluster setting changes](#v24-1-0-cluster-settings), and adjust your deployment as necessary. + +- TBD + +

    Key Cluster Setting Changes

    + +The following changes should be reviewed prior to upgrading. Default cluster settings will be used unless you have manually set a value for a setting. This can be confirmed by checking the `system.settings` table (`select * from system.settings`) to view the non-default settings. + +- TBD + +

    Deprecations

    + +{% comment %}TODO: Intro para? Each sibling section has one.{% endcomment %} + +- TBD + +

    Known limitations

    + +For information about new and unresolved limitations in CockroachDB v24.1, with suggested workarounds where applicable, refer to [Known Limitations](https://www.cockroachlabs.com/docs/v24.1/known-limitations). + +

    Additional resources

    + +Resource | Topic | Description +---------------------+--------------------------------------------+------------- +Cockroach University | [Example link](https://example.com/course1)| Summary here +Cockroach University | [Example link](https://example.com/course2)| Summary here +Docs | [Example link](https://example.com/doc1) | Summary here +Docs | [Example link](https://example.com/doc2) | Summary here From 445ca638cb785bd19cc7babea493ba05a5a052d5 Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Mon, 6 May 2024 15:28:35 -0400 Subject: [PATCH 33/34] In ui-statements-page and serverless-unsupported-features, removed text regarding diagnostic statement bundles not being available on Serverless clusters. (#18510) --- src/current/_includes/v24.1/ui/statement-details.md | 5 +---- src/current/_includes/v24.1/ui/statements-table.md | 2 +- .../cockroachcloud/serverless-unsupported-features.md | 1 - 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/current/_includes/v24.1/ui/statement-details.md b/src/current/_includes/v24.1/ui/statement-details.md index 2155d1c685b..c2e91b92609 100644 --- a/src/current/_includes/v24.1/ui/statement-details.md +++ b/src/current/_includes/v24.1/ui/statement-details.md @@ -124,10 +124,7 @@ If you click **Apply** to create the index and then execute the statement again, The **Diagnostics** tab allows you to activate and download diagnostics for a SQL statement fingerprint. {{site.data.alerts.callout_info}} -The **Diagnostics** tab is not visible: - -- On CockroachDB {{ site.data.products.serverless }} clusters. -- For roles with the `VIEWACTIVITYREDACTED` [system privilege]({{ link_prefix }}security-reference/authorization.html#supported-privileges) (or the legacy `VIEWACTIVITYREDACTED` [role option]({{ link_prefix }}security-reference/authorization.html#role-options)) defined. +The **Diagnostics** tab is not visible for roles with the `VIEWACTIVITYREDACTED` [system privilege]({{ link_prefix }}security-reference/authorization.html#supported-privileges) (or the legacy `VIEWACTIVITYREDACTED` [role option]({{ link_prefix }}security-reference/authorization.html#role-options)) defined. {{site.data.alerts.end}} When you activate diagnostics for a fingerprint, CockroachDB waits for the next SQL query that matches this fingerprint to be run on any node. On the next match, information about the SQL statement is written to a diagnostics bundle that you can download. This bundle consists of [statement traces]({{ link_prefix }}show-trace.html) in various formats (including a JSON file that can be [imported to Jaeger]({{ link_prefix }}query-behavior-troubleshooting.html#visualize-statement-traces-in-jaeger)), a physical query plan, execution statistics, and other information about the query. The bundle contents are identical to those produced by [`EXPLAIN ANALYZE (DEBUG)`]({{ link_prefix }}explain-analyze.html#debug-option). You can use the information collected in the bundle to diagnose problematic SQL statements, such as [slow queries]({{ link_prefix }}query-behavior-troubleshooting.html#query-is-always-slow). We recommend that you share the diagnostics bundle with our [support team]({{ link_prefix }}support-resources.html), which can help you interpret the results. diff --git a/src/current/_includes/v24.1/ui/statements-table.md b/src/current/_includes/v24.1/ui/statements-table.md index 321d3f06f80..07b200d542b 100644 --- a/src/current/_includes/v24.1/ui/statements-table.md +++ b/src/current/_includes/v24.1/ui/statements-table.md @@ -27,7 +27,7 @@ Retries | Cumulative number of automatic (internal) [retries]({{ link_prefix }}t Regions/Nodes | The regions and nodes on which statements with this fingerprint executed.

    Nodes are not visible for CockroachDB {{ site.data.products.serverless }} clusters or for clusters that are not multi-region. Last Execution Time (UTC)| The timestamp when the statement was last executed. Statement Fingerprint ID | The ID of the statement fingerprint. -Diagnostics | Activate and download [diagnostics](#diagnostics) for this fingerprint. To activate, click the **Activate** button. The [Activate statement diagnostics](#activate-diagnostics-collection-and-download-bundles) dialog displays. After you complete the dialog, the column displays the status of diagnostics collection (**WAITING**, **READY**, or **ERROR**). Click Vertical ellipsis and select a bundle to download or select **Cancel request** to cancel diagnostics bundle collection.

    Statements are periodically cleared from the Statements page based on the start time. To access the full history of diagnostics for the fingerprint, see the [Diagnostics](#diagnostics) tab of the Statement Details page.

    Diagnostics is not visible for CockroachDB {{ site.data.products.serverless }} clusters. +Diagnostics | Activate and download [diagnostics](#diagnostics) for this fingerprint. To activate, click the **Activate** button. The [Activate statement diagnostics](#activate-diagnostics-collection-and-download-bundles) dialog displays. After you complete the dialog, the column displays the status of diagnostics collection (**WAITING**, **READY**, or **ERROR**). Click Vertical ellipsis and select a bundle to download or select **Cancel request** to cancel diagnostics bundle collection.

    Statements are periodically cleared from the Statements page based on the start time. To access the full history of diagnostics for the fingerprint, see the [Diagnostics](#diagnostics) tab of the Statement Details page. {{site.data.alerts.callout_info}} To obtain the execution statistics, CockroachDB samples a percentage of the executions. If you see `no samples` displayed in the **Contention**, **Max Memory**, or **Network** columns, there are two possibilities: diff --git a/src/current/cockroachcloud/serverless-unsupported-features.md b/src/current/cockroachcloud/serverless-unsupported-features.md index 6dd94904d0d..a6705f694a0 100644 --- a/src/current/cockroachcloud/serverless-unsupported-features.md +++ b/src/current/cockroachcloud/serverless-unsupported-features.md @@ -50,7 +50,6 @@ The Cloud Console provides a subset of observability information from the DB Con The Cloud Console also does not currently provide the following features available in the DB Console: -- [Statement diagnostic bundles](https://www.cockroachlabs.com/docs/{{site.current_cloud_version}}/ui-statements-page#diagnostics) on the **Statements** Page - [Direct actions to drop unused indexes](https://www.cockroachlabs.com/docs/{{site.current_cloud_version}}/ui-databases-page#index-recommendations) on the **Insights** and **Databases** pages - [Direct actions to create missing indexes](https://www.cockroachlabs.com/docs/{{site.current_cloud_version}}/ui-insights-page#schema-insights-tab) and [replace existing indexes](https://www.cockroachlabs.com/docs/{{site.current_cloud_version}}/ui-insights-page#schema-insights-tab) on the **Insights** page From c4e825a6655766daa388d27b4fa77d3c4b405239 Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Mon, 6 May 2024 15:45:54 -0400 Subject: [PATCH 34/34] DOC-9671 PR #119205 - cli: --include-range-info flag for `cockroach debug zip` also toggles problem ranges (#18512) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * In cockroach-debug.zip, (a) removed problem ranges from “cannot be filtered list”, (b) updated to description of --include-range-info flag to include problemranges.json. * Incorporated Ryan’s feedback. --- src/current/v23.1/cockroach-debug-zip.md | 3 +-- src/current/v23.2/cockroach-debug-zip.md | 3 +-- src/current/v24.1/cockroach-debug-zip.md | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/current/v23.1/cockroach-debug-zip.md b/src/current/v23.1/cockroach-debug-zip.md index be7f866e364..30e01d01685 100644 --- a/src/current/v23.1/cockroach-debug-zip.md +++ b/src/current/v23.1/cockroach-debug-zip.md @@ -80,7 +80,6 @@ The following information is also contained in the `.zip` file, and cannot be fi - [Cluster Settings]({% link {{ page.version.version }}/cluster-settings.md %}) - [Metrics]({% link {{ page.version.version }}/metrics.md %}) - [Replication Reports]({% link {{ page.version.version }}/query-replication-reports.md %}) -- Problem ranges - CPU profiles - A script (`hot-ranges.sh`) that summarizes the hottest ranges (ranges receiving a high number of reads or writes) @@ -114,7 +113,7 @@ Flag | Description `--files-until` | End timestamp for log file, goroutine dump, and heap profile collection. This can be used to limit the size of the generated `.zip`, which is increased by these files. The timestamp uses the format `YYYY-MM-DD`, followed optionally by `HH:MM:SS` or `HH:MM`. For example:

    `--files-until='2021-07-01 16:00'`

    When specifying a narrow time window, we recommend adding extra seconds/minutes to account for uncertainties such as clock drift.

    **Default:** 24 hours beyond now (to include files created during `.zip` creation) `--include-files` | [Files](#files) to include in the generated `.zip`. This can be used to limit the size of the generated `.zip`, and affects logs, heap profiles, goroutine dumps, and/or CPU profiles. The files are specified as a comma-separated list of [glob patterns](https://wikipedia.org/wiki/Glob_(programming)). For example:

    `--include-files=*.pprof`

    Note that this flag is applied _before_ `--exclude-files`. Use [`cockroach debug list-files`]({% link {{ page.version.version }}/cockroach-debug-list-files.md %}) with this flag to see a list of files that will be contained in the `.zip`. `--include-goroutine-stacks` | Fetch stack traces for all goroutines running on each targeted node in `nodes/*/stacks.txt` and `nodes/*/stacks_with_labels.txt` files. Note that fetching stack traces for all goroutines is a "stop-the-world" operation, which can momentarily have negative impacts on SQL service latency. Exclude these goroutine stacks by using the `--include-goroutine-stacks=false` flag. Note that any periodic goroutine dumps previously taken on the node will still be included in `nodes/*/goroutines/*.txt.gz`, as these would have already been generated and don't require any additional stop-the-world operations to be collected.

    **Default:** true -`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). Note however many higher-level issues are ultimately related to the underlying KV layer described by these files so only set this to `false` if directed to do so by Cockroach Labs support.

    **Default:** true +`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). However, many higher-level issues are ultimately related to the underlying KV layer described by these files. Only set this to `false` if directed to do so by Cockroach Labs support.

    In addition, include problem ranges information in `reports/problemranges.json`.

    **Default:** true `--nodes` | Specify nodes to inspect as a comma-separated list or range of node IDs. For example:

    `--nodes=1,10,13-15` `--redact` | Redact sensitive data from the generated `.zip`, with the exception of range keys, which must remain unredacted because they are essential to support CockroachDB. This flag replaces the deprecated `--redact-logs` flag, which only applied to log messages contained within `.zip`. See [Redact sensitive information](#redact-sensitive-information) for an example. `--redact-logs` | **Deprecated** Redact sensitive data from collected log files only. Use the `--redact` flag instead, which redacts sensitive data across the entire generated `.zip` as well as the collected log files. Passing the `--redact-logs` flag will be interpreted as the `--redact` flag. diff --git a/src/current/v23.2/cockroach-debug-zip.md b/src/current/v23.2/cockroach-debug-zip.md index 93f2cc90a9e..261d5c22e08 100644 --- a/src/current/v23.2/cockroach-debug-zip.md +++ b/src/current/v23.2/cockroach-debug-zip.md @@ -80,7 +80,6 @@ The following information is also contained in the `.zip` file, and cannot be fi - [Cluster Settings]({% link {{ page.version.version }}/cluster-settings.md %}) - [Metrics]({% link {{ page.version.version }}/metrics.md %}) - [Replication Reports]({% link {{ page.version.version }}/query-replication-reports.md %}) -- Problem ranges - CPU profiles - A script (`hot-ranges.sh`) that summarizes the hottest ranges (ranges receiving a high number of reads or writes) @@ -114,7 +113,7 @@ Flag | Description `--files-until` | End timestamp for log file, goroutine dump, and heap profile collection. This can be used to limit the size of the generated `.zip`, which is increased by these files. The timestamp uses the format `YYYY-MM-DD`, followed optionally by `HH:MM:SS` or `HH:MM`. For example:

    `--files-until='2021-07-01 16:00'`

    When specifying a narrow time window, we recommend adding extra seconds/minutes to account for uncertainties such as clock drift.

    **Default:** 24 hours beyond now (to include files created during `.zip` creation) `--include-files` | [Files](#files) to include in the generated `.zip`. This can be used to limit the size of the generated `.zip`, and affects logs, heap profiles, goroutine dumps, and/or CPU profiles. The files are specified as a comma-separated list of [glob patterns](https://wikipedia.org/wiki/Glob_(programming)). For example:

    `--include-files=*.pprof`

    Note that this flag is applied _before_ `--exclude-files`. Use [`cockroach debug list-files`]({% link {{ page.version.version }}/cockroach-debug-list-files.md %}) with this flag to see a list of files that will be contained in the `.zip`. `--include-goroutine-stacks` | Fetch stack traces for all goroutines running on each targeted node in `nodes/*/stacks.txt` and `nodes/*/stacks_with_labels.txt` files. Note that fetching stack traces for all goroutines is a "stop-the-world" operation, which can momentarily have negative impacts on SQL service latency. Exclude these goroutine stacks by using the `--include-goroutine-stacks=false` flag. Note that any periodic goroutine dumps previously taken on the node will still be included in `nodes/*/goroutines/*.txt.gz`, as these would have already been generated and don't require any additional stop-the-world operations to be collected.

    **Default:** true -`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). Note however many higher-level issues are ultimately related to the underlying KV layer described by these files so only set this to `false` if directed to do so by Cockroach Labs support.

    **Default:** true +`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). However, many higher-level issues are ultimately related to the underlying KV layer described by these files. Only set this to `false` if directed to do so by Cockroach Labs support.

    In addition, include problem ranges information in `reports/problemranges.json`.

    **Default:** true `--include-running-job-traces` | Include information about each running, traceable job (such as [backup]({% link {{ page.version.version }}/backup.md %}), [restore]({% link {{ page.version.version }}/restore.md %}), [import]({% link {{ page.version.version }}/import-into.md %}), [physical cluster replication]({% link {{ page.version.version }}/physical-cluster-replication-technical-overview.md %})) in `jobs/*/*/trace.zip` files. This involves collecting cluster-wide traces for each running job in the cluster.

    **Default:** true `--nodes` | Specify nodes to inspect as a comma-separated list or range of node IDs. For example:

    `--nodes=1,10,13-15` `--redact` | Redact sensitive data from the generated `.zip`, with the exception of range keys, which must remain unredacted because they are essential to support CockroachDB. This flag replaces the deprecated `--redact-logs` flag, which only applied to log messages contained within `.zip`. See [Redact sensitive information](#redact-sensitive-information) for an example. diff --git a/src/current/v24.1/cockroach-debug-zip.md b/src/current/v24.1/cockroach-debug-zip.md index 93f2cc90a9e..261d5c22e08 100644 --- a/src/current/v24.1/cockroach-debug-zip.md +++ b/src/current/v24.1/cockroach-debug-zip.md @@ -80,7 +80,6 @@ The following information is also contained in the `.zip` file, and cannot be fi - [Cluster Settings]({% link {{ page.version.version }}/cluster-settings.md %}) - [Metrics]({% link {{ page.version.version }}/metrics.md %}) - [Replication Reports]({% link {{ page.version.version }}/query-replication-reports.md %}) -- Problem ranges - CPU profiles - A script (`hot-ranges.sh`) that summarizes the hottest ranges (ranges receiving a high number of reads or writes) @@ -114,7 +113,7 @@ Flag | Description `--files-until` | End timestamp for log file, goroutine dump, and heap profile collection. This can be used to limit the size of the generated `.zip`, which is increased by these files. The timestamp uses the format `YYYY-MM-DD`, followed optionally by `HH:MM:SS` or `HH:MM`. For example:

    `--files-until='2021-07-01 16:00'`

    When specifying a narrow time window, we recommend adding extra seconds/minutes to account for uncertainties such as clock drift.

    **Default:** 24 hours beyond now (to include files created during `.zip` creation) `--include-files` | [Files](#files) to include in the generated `.zip`. This can be used to limit the size of the generated `.zip`, and affects logs, heap profiles, goroutine dumps, and/or CPU profiles. The files are specified as a comma-separated list of [glob patterns](https://wikipedia.org/wiki/Glob_(programming)). For example:

    `--include-files=*.pprof`

    Note that this flag is applied _before_ `--exclude-files`. Use [`cockroach debug list-files`]({% link {{ page.version.version }}/cockroach-debug-list-files.md %}) with this flag to see a list of files that will be contained in the `.zip`. `--include-goroutine-stacks` | Fetch stack traces for all goroutines running on each targeted node in `nodes/*/stacks.txt` and `nodes/*/stacks_with_labels.txt` files. Note that fetching stack traces for all goroutines is a "stop-the-world" operation, which can momentarily have negative impacts on SQL service latency. Exclude these goroutine stacks by using the `--include-goroutine-stacks=false` flag. Note that any periodic goroutine dumps previously taken on the node will still be included in `nodes/*/goroutines/*.txt.gz`, as these would have already been generated and don't require any additional stop-the-world operations to be collected.

    **Default:** true -`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). Note however many higher-level issues are ultimately related to the underlying KV layer described by these files so only set this to `false` if directed to do so by Cockroach Labs support.

    **Default:** true +`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). However, many higher-level issues are ultimately related to the underlying KV layer described by these files. Only set this to `false` if directed to do so by Cockroach Labs support.

    In addition, include problem ranges information in `reports/problemranges.json`.

    **Default:** true `--include-running-job-traces` | Include information about each running, traceable job (such as [backup]({% link {{ page.version.version }}/backup.md %}), [restore]({% link {{ page.version.version }}/restore.md %}), [import]({% link {{ page.version.version }}/import-into.md %}), [physical cluster replication]({% link {{ page.version.version }}/physical-cluster-replication-technical-overview.md %})) in `jobs/*/*/trace.zip` files. This involves collecting cluster-wide traces for each running job in the cluster.

    **Default:** true `--nodes` | Specify nodes to inspect as a comma-separated list or range of node IDs. For example:

    `--nodes=1,10,13-15` `--redact` | Redact sensitive data from the generated `.zip`, with the exception of range keys, which must remain unredacted because they are essential to support CockroachDB. This flag replaces the deprecated `--redact-logs` flag, which only applied to log messages contained within `.zip`. See [Redact sensitive information](#redact-sensitive-information) for an example.

    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 #(ILLfeu@1$Y~ODxD$O^=Z=x% zujukQtF`2g9+_JsA&X!G)RWz`iPABHw*nNl}r8!bJWkX(bfKkfo3SZR68Met;jk=z75hTlSjEYm@V9dr)~ znL_vX9ltV(kyVJ8joa3Ri3lC)bx)^$Mkx_I52X`eRxu!b_3+7h9!!8p_LH+O$+4l` za83h$qt-iTlhp*UW(;%lo(Rfu3iY~f{Iz<$`&yr=RkT;NQ`SHA@QV2F7HpURrGqGrOjy=D{}psJ&T6A8|=&aKpVXWOggE_rQi0KQCQk zjWN_2VUftS9;gLN_^t@8xso^z&(eXO5K%gUo{_4QxIeI^nl0aZ#3IL9(vRGy;FfR!EeFU^jH@pd@ulxk zHzCgtvAIIA8LH;@AMI9Txo90V0+d9;2I=Rx352r;+iSDcD?fUirYO~WQKl|mh6Vy| zZx?;oT*@VGjl{;}Aa`EhYHZhBpZ*n5**dM;6Z({&f%yqxN@BqK3BFr;naSGM%AaiN-|J{s1!^FGtw|5KK)`X4H<;IJq`3->!wziC# zR-(PY`Fag?b++_At9Xj*G~XshhIPH_#(DCvFZB%ln5{5*>1DEsT(%f0gaOrRwB-$> zcB>RnmDkd{x(1tK*!P^l%^MnhZevmp*Yb0w2^FRaQfY|UYXz1jKsS}HB|Zn;*(?H$ zp>+JJP{-9fZ&)vGqLaM|qbw)EGF%q%py&i!b!dLP#Pp?w3fO}3)kLocdC5LUoD3mh zw>H!b7Pz5`<(inOAsHIS#o5kN)p(4V50Dc@8`Y_BKC)}4a-0|R4WX7OZ8f-jAbz^NbW&#-!h(!lNwtM;%q{gh26reV9e-gw#cgHL^0A8 zaf?13)>?(Y_;XeGGV7SSWA?sQ9G+G}ubq7OGkYSwcnax7uhva0L$^5scERKq^jIU66tHx>8rjk#GjjP}8$$Cy z(gZ{!l{7E=NEmq0q0vjI>^1@GVpWUd74u*sb9-pWY^AJ>Oc|jNe?Cn0vZE!n;`gnf z5JU3-L~#fd@3ZCne#Fpb-E@l`Vl`!Ep=M81uusZtwTLYyc`zq>MaiT09VMpNIa?X2AR z?Sso{r$@eiW*#%~6J`5qr#SLxn@Z!-mo2gY_2+G)63b(s|{CS1Y_| z69F?5?02aec#aY#YQbeGy)!Lh+&4m$Z-w|>n_SG!ExIRH``?+~l_NH2D> z{UEsqzie3bxzO6$?5_#4tM!LF@r^EGT=wb6TS5o+0{KH3G}$#@ z;mahX$zO~^pw`?xB#iJ`23I1z4|5rhTS;n#dNDsHmLxkymxb zx?D^$#4duSfR05#xn61SzCr*Av*gU9omL3`VzSek3FdQ;y-H%7T7y1#rN1uzu7-f? zi^MirQ!kWH#FyLL1k^(iZ<&LUUHqg%{*kF|peSP_XtR7}<*g%r^;Yd*rfIo+n#8tz zjv8~OYV*~B)32gxn<*e$F(Km85(k6o9d0%-i)QyabGg;y>a>>OxH4c% zFO+a1!&mMPMC(T907oreP)$woks*F#BS3 zWD91cOkRziZeLt7%M(V2CS_ET)#bsc+0D`IR@_+0!fcdEF;D?YkFw zcF++fyeq$`cA9ADSC608X@mC>dohZ}$BVg(8KhU`wD*g5ODp1g8#uF*dG#yD(kmtF z@`vsVbx@h1zEFx`3j1p zas^aAxwRSSq2Y=#xQ!0PXI=PoAimrrciAR0IMFpoPi(_dyVf;exr2Y_7dvdly@q9Y zPgBW`Im0Ad(|+(H`(n#I%)U;{O|X?0@BWi7zxD-IsAJzCWk*d%dhhTWk7e$(E9VZ^ ze7A;Ynb;k^Iw*@DPX9Q~-+4JqlpUhy8dKr5-%4f@RIdCgAIv>m)j>9lMLWC zUuvrrM}KCR&5m#l$0-3I|d1l~zwZKiwOg$jF5X95YA z3f@*E>i9ud2lPT$`(GLfqp&x)C`MyZLCVYcAKLG4nhNaeD1u7Ucg zxzsz6$Z{1J(qYQ1&YMd!S51x(^sOMledji1w%dMr<)oQMKD^xI-N+PJ2$N9iu?qkn zFOfIm$sH+(1W_kjsx&0s9Xw#oNh_v!T-I6gxMD=xDXjAC?>-ORfa7XjK3 zDcfY{uopE*_kL~i#ns%;-H2qLdka}FAd4-DJ8Ldt%OfMw9D99Ml!1h z$M9pVJ(tNV)ki2Qd&JPS#cIk;$Ya06su>rliC%hjnXNBP+2Dvw6rvT8occCg(0(e4 zYG>`eluqFAv~3OF=RS3ou!iUE^uvns%LgE|ZFYLKf9U)BL_a+xKq%{n0$`u=y8=aa z%VYI~4P5$M*-0+tG1bqzo^TX4j9UKu4I`$r;a>L=n1h(n?ho**6|MnZ*`v?MjHB8Z zet8=g69oxr3Ez_f>P^yFQy_hvil;-gh!uoEBz`Xy<4c<1@GAt0Oc)cMD?uh>sEXt^ zMe2hn`e}E`2`#^BulIHC?Slo>S%T`kcyUew-fs@}O!H z=%q^8Ca9|~w;H{z_$ESN2CE{i2-O|2oqAZ(R$%kq^JLs=pb!?WS*CkZ9K!*=XQt1m zQ=f>=DiG6ZrUq`S4|zJiTbUTS!ELqJ`f56AP+8=+WXv>X>oFDYGMOM|^6_Ht>5Fjp zV{{ewAb;7+ug!!b{})N9Z$pI!3Q0b$-zyS9R@2W*3VgI!LTcnIzvl{s$PA6H5f_e{ z?K*p%_$7F3n^#+{GUceIe?M6_d~wj(O>Ja31}%5Am{G$D90)*R?A-Vu2gs|`ngd*cv$$hKIB*a(nv97 z=cDpHWVyLTp=)mb!~!@;a`+*+xkGM z^%2qI-`oIu9(jzeW8PFciH^;afP0hfE5;3fX~%j*VqxEE%=uGV%#W6yq*yDsYR~!9 zJQx(-9L=nQt$5EZX^HofL_B<%cc-7vb0PtoFTyr;`pq6HhQ9a5BJ*{I+nkqXEZ#_F zpF~N-^AFIocvOER&W%5{we2JVMSMnwil~rI>hjr97u%F6M7{*9U;59{3@kbOt4=yE zJqaHb>(Q*t3VL_heM<`ez*?%H``E^qvZ;r;k#d6`64k3`(f0-oWU>yXe|H{Xp_6O#TpD>43wR^AnS!**kvb>$8i$EPqI3xPPs+@thH(470m=)3>H2SNscD@ zQ8}s~f^HT5(S3bpWJLG&6sS^bAeM6u=67my!w7X`*!kL`(t-U4_QnjiYNU}P6PcIT zwS&?gPhRCQuGEFkn`_AjYbSO2F2#4edLZ0pot90^!usUix7Jilo5tm-$9|d@!{mIt zEh_QFoDcmPkVc!YlAnHcZrEx^N2Mx{m6wFR#wOBWJr8Hrxk_Zqu0F(D>gTP1()UJJh;+E22x*931uMMOt{?8y~6q~Exo`Ljoa2m@iJ%N(( zTV2g9m0zG8p->)z>efueZ1ER8apU|o@XUx-1nTUFG#2{Yo0VD|2s7D_^Vui69QWEl z`6|IOyPt)hmu?>Txb^)fF3p7q_Vw~h4YrkoEGx- z?e)CZOXw0#(fy|O{~M$evLye{Jn+k;Yz%dqa2HiD}_gmPZc#7T?O7n;~k- z*WN$Xgq4=iO+Z%GPD5;WKk8?j`tgOADvPNau?$PeIKC~005LR&Ng2|-y%h7aC<7~M z8vwet!f+dio8NXaX^zM%hE_i9g*9*v-x=ihN`ycp;^^{js7!$q+UU7=>SFRg>FPR7 zQ{pd9Y(9}L^NtiUb+hrH9XNcwlGy;$r5)5=kAn?XOv8le$P`2w_?$|>Tp$W#7L!HwWh0>soJ3XyhD3Xs9IQ?$|`@P<4R% zL2xIZIi-958eNRz{N*<*`IYZEUz-JiS=WwCeFKCxpuln3T7x#QkME>+_dc3Q+q1B# zkNDLTLl9PvF_KG2f+eH@L?&EJSr#H{^sH-^q;Ka#dfg#(?CqqVukG!VN7q@}$55jE zOFnkBjM@6$L1h*i>Kj!{Aj%5|+)NXrsNE&JFw$GIWBe5#lWTlL>lU&qr%~MV8spdj#=Lcb@PBmTC$_m9t$^X-_oQhsIILqfS)LT;dRknG zA({NKY1MhGq?NiM1)I{j`oEqif zDOne%LFqwfldqmowRp$FI(-&cU?vq-t|PRy zIX?XwZfAA`(&iOci$L*}80AzlH;v7AD;4q?Al?XBwO=)Gpc-na-QPFo>aQ9Te3Yip zTkyiQMy!rxeSh9y0lVAXK!JQ>2OD?S{ZUyynx0>Yz@WT^43fmMY^($tM3F`fV7Lc6 ztYSae2<39fgW0VxaGhFzD-9d>kWv=XNS>{rem#8P0dIvYtj*G`Nuy%#){nVUE{?nh zi{wv3L+Vb~i$xHynN2gaR$X0k7|r-Ds#16FsH|OnEhU+7<1zb*&J~yG(R;|d zc^FJY7D1m|$O*iOF}YrwhfO_R-JLV}M4$fA`O%=_)I6+-E~CzQd28}hHNz9|Q30R3yu^<1cyO?1VHZUV6Q`67J z={81@%we>I-poc-P8e)*9^E_f(1#n1FXUB-fwfUyp#ARD@+l{GQ_g2b*Wp;s^mOdF z;mmd9T6$q*dArl`eYfLJ0!zSoQ3xSY=TlNC(&om9U}QxV#oZOpJkF$V#TRw+LN+I` zwx6&@Gj7Pc;LMY*>j%vH9);2L7Cg#9&4*g=fW$gq%uF{~-?KUN^=M1i^_l5{9I!{t zuU}LvcTB0Uw4%suf|>e*Y#TTtaAqyeoOjQ4#eL{?&P+;@(RX$3pGxCi?Vwi=XE(OHif(jU85UR!9xRBssYu<$ zPBfhs>*Y0h8kJ`oKFtuW!2Y#7)uB8rZ#}`fNh2)%&kcRR#AU)eIoOg#UY@z$(-R=` zkg?84T8G{uarl8+HB~-rRZ#MwKsrdPdd_*pCSHH)J}tKmc+fVopJ!kretKcAOV-ZI zeTl4mp9xBKLhe*pZQUYVa!lQ`>TCgfnvKrne1Ke7kBX1B0hh@dNzWyVS%guoyw&Uq zElbXKK$|Y;WWG{z9zkT)j|(c9PDm?=@a8^%{po4@?{9^(K!fjkVDCW5ncp|W#q`h2?;HdL{o_Bm;<=3 z?eQ8TXR(GhV^!MvgQ_n#e0F?FWc_9+5f!$iaL3M`6|Jr++Tw|qfKKN)mubS6%UPBQ2>Om~uhGmXw-FF(_AIH`7 z9nNO1XfS&TjN!7TPwqs*k%7YIf=qXml~RO)Oai-;(V(MppoWtri zZSW|!cRsV5*;}TT(2Z>KGf`kjNc0Z*!&Ohc5U@>iWl#6&#MUhTgRjgL8Y6B|m@gA< zZnwIg|B+_@dz*C%>-8_oYGeiX5&!Wyz`w4^H=a%(ZTKa3et8DztZojAT&YwZAO?TW z6yja;{cZ(cIELDdLlw^wMb5Y<;qu25miiB>Geo$;h*=3QVKKl~o_kQZbHBBmK#+X0 zOEbR3{hRpz+U)w5jVO1YUL*k%CWy#L{{@zB8spYx!~KyK*A-xq8jr5#FM-4#;w1)}0^a?2 z_?JTOzg2;O`|K-xsjfda;QwbUKI-O|<&x3&4gdK+fBef=m>eKXS&;44pS=20mbXd3 zuEc+_iGN@?ViHeN5N%T9z#*7S_e=uFOhgNg1Q;3s33S^1)+O_2|9@VAC*9!q$c+x$-f8hNSWy;qx&40ngmmPp35B78&Iqp{xXJ2)8cgf*=CC&%HAR&0=3<PIPivIe}PLqo3nS$4jhQ|HR83O!JJPIFxxJ2o{ zii{%YYWLIYNSO{$Jsk1GF%6 zOJB$`6bDB?8z4+aeM-y!F?D|*SV|m#c>fKtARdm${2u}k(^lX9j{uc`Du+|}=TNtgnN?Aq;Q30#`{0lSfDZeY+$h$HBm`T+X(0tkOx zCcZdhA`4~Q;9vHN|4VgzFP%xO@tfdnT&W10O}+_ogy;Xw_pfIaHzd~{RW_gX|qH)@(^cGKC@h;(l`GsBLAmn z6eUByi4W-rj;JnNswM`;5^!G+!cm#)#tZ;aSDy;ws?7DpGo87cQjF`(7`~7L3@k}& z;m4&{eB{h}LCJN`G0Ee=G-uY;v&Nl5*Nq3H!4fFq&0m=cHW3}2D} z_O5gm(cv<&BNJ$2hRfboO#r%~$BN)v926aP01J0?zwY3uU`iFxpW0->Qv_~@cxMj4SJi<5r$1Jf zv$-0H-(!Kpc=0B{tf_7Nx=W11roamER9VLx%TN5-;G@2!5`S3TKh(mA>p ztYzv%cd4aGI!X!{8X6k!#vs+|J@YgQwDdjSe7nBmAdkZrl`D9j97by>*MKnPi0>~S zLJy_&6D(hNK95-Xw)i?Ad~wk@U?!Gze^mq4gk67+tD1LReMLM_9jiV9a^+p*Px>=k zd<(yfG%`c2r?{57V!|IrKfF#GoHk#gas!7O9ck~vOsvN%BuJcriy1>|w00EqIjUtH ziO2JOQ)suh3!a-S7?!J1_;&_bs$RuaER{!>CY;S-X&)tXwCbM^1uq*e{9<9+h!XK| zR>)s{37%JIGJivcGpsm+-4%{vlc}~IwGv}CHp*9;_#y8lDHW{8>5@~T<-&odZvTBEO=R$v2kv zm}1GKjG0IkAO}Q>9O*ZUh=^nobgRtJy8Rh9NV)C*+?RyeFylq68cFV3h?*_*{+eD? zC3(-jKbJ+WQEJR<+TE%w3!)aIzvI6x&LDHCXF%lJmRp{dwkFCjB}8-qZO%zj!6> z%!RR5UDvqyza`oMfW#|ch>t6$znjM2d-P?!4bXg(>(a~r2I22e|6ho~K6;tN|2=66 zZkT(Hw>LjXSw`TAKq)aWwwFaO3H_OVvt_g72IVeYmCu*FgV1lq`d( z%yYF+Gls71(AMi;)uqnm6YhW=G`?SvfJN?%f2eYfJ^U|}#R8rzqMBIuoFM01#FD;% zKUaN2{OuC1$vt-n@n3)&HMVV`IJdiVhE+Wapvd&Dd_T9lbC~v}8h{i_Q;he&MMQR% zH{ntGK0Igib5R;|0g!%4Tl=0f`gtgCuu(S@Ou;kW1Cu_ZuCKem?c}46a)Qrv>5Z{9x}g5_T0?$6Q&!G@^YEE^l7r zZbV#6zUE1H=_g@BvH3a+cyFtzI^3a>TZ*xLYf=% zKx%K*EQ0z?Dp{)6$LP3Cx?{pEUp|xutFXp#J#@lJJbjmmi&WM4t>J0unf@BzzIAdj z=Rs7XIARvlUdqY8h)N8QQ%l!jW}~5`VUA9x#x+>tZI>uuV?`G6L1ry&t$1cUUFo9I z)j;%?BqcOYTK1exE!(s_81~)_CsDfK%Su{AtgeYERh{RXRpZx``PP&EPN6_q-H6LW zP0hIbU$HZ7XQp*QP{xJ7Yr<`Dpw>B0>fH62QwVrfED-cO-}zBjdX+)}3E0^Rl6`pS znxk2r*8QWn1yXz0HjBYm5LXgp%Dy&2^Co_TIl8Hyc(lV(j9mOt@^pCm_Drjx^o%!z zT;v%{Du=%7M-w|bT;zO@U0ualF=~MuUT%J(@jclu-Giv=dt|w^}dl-^TWR z&N6F6rCZtFjXGq?(P6$x3ceZ3HhfO-kRTq2VmY?TXMt+m>;D9~f-@HwzEA@0Yw^>4 zlXGnHKNNv~|LRg0_#CwgKC80G`XSDlHtS~rh}UD(Iie^zEB3~G9lQQFT7m!UC;@!F zc9x+8t`0JIoCO@Pp!{=i{5-?)!XI%?(_NrW9U<}587E7)cxB+M+CzIs^Y79ETz~ah z(W&zNdKhkGunttWy6fqL|GsVlgmXJ*1sLJ<4BVoFcq34%_=6OO_&90zb!2OJ#! zN@tnmE>s1_-QQ-tbOzBksDlm1Jcw(Y6`}hspO3 zi&e>IHtK;^;5nvS)^YC1Ir+w7K0vP9nw$j=weQ4b0WG|Z=Yu1U3zyu^$W3~rb{&UW zhN1?bLv(x*?h4WEj?ELTs}+n8|T>0X}Sh*eepsF_#6k22dH%fIdcV0 zAawCc$ywetl0Sy)Xm5AK0650y4bQ9psGs3rHoSZe4zn{HKSS!y!LbMMT~7J){y9wK zI;)Z}Gt`{p04&bFy8PojKU8=oNOrlda|nA6z}Px3`q(*J(Di(usfB}`wc<>1Clp`- zI4H!u&wS|2k0@L()T#*dH}Bjkh$}DFM`!jrIPNm;(i{)q@G`&ZnJbavOs#)dIVuCV z1Qfj?rQMnDJU*CHU94+uX<01cbN<`1E354pC6(-Sv%UX4K`c=DAN4KS^a^bAvE3G09?}PfDPO zixa(!rscpL6r674<{fK0CGK?B+-n$&rgi9+9p(@Jhj7KcZ!SuqdAPeeU=G0*C2~ON zgx#>PM)qyg-Uy;cb&$KYfyg>Yc3<8HR_oC=Iwwvmw%N;MFGq2Z3R5+v8TqTD1M0@t zE2a$XhwIr^kqrrYijRv?j{>*^`%1}zwmzl+m1jrAH#Pwg%+FzNi+At72k)pf`dl#1 zl=V<&Vt&w_TiC$p@arcely;)qA0HM$!YprW;_|mSktW|5!6_eg-L7c^c@!}mm}Pz; zRWi;X(PGoIK<2DKL1hz;dJ+>6G4F1p{jrG2X3uN6b{Ivwy)(BB5YLKydBer5ugo=g(fnFZ@r< z!w3ncqaMDL_q+f7F3*kDhDM*`BNw-&a+fK73OK>Ck2Ar0g)cvjK_XuEiNur1I`R`Y{a_6Gc&D6+35HUWGcw*TfPK0VKFBQX$BeK_>qBc zOX0w3kD&I`1I~a!cRK&Ud=|k!?g9Xg5Gw98Hp4n>Ln^D7DDoxcyOM^!YY9txJX!S_ zDemYs>)KD>+l=7d%M0JxClc$9;q+MSL1bB!D2dJU0I$K@zxb>1=!kyTszKts5v9hg zV2LgcX78??;$?s8DP+ilwsNB<0i!BA--P(-ZuK14qnHdIcI+M z1JBxfRjpmC>MeOY8`j^xNjPyT{k#R!P6+UeAeQ?mMh{;NNO^#dV{h;40pb%TMd`K6 zj{_-*Z_gvP!;7Rg2{{9Lq?NcF=V0 zu!5n`cDA{X(vINs@8)w6L!>TfSLAs=Ut14Rc-2-N7#kJAd%bk{Xj&*3!xl{H_RuFqzc2NpKR8U$h!;EjcdJjbctATIws=hv0y-QOd9CSII1E4uvDh^PcZhim6#i@+PZp~G) z@JyrUc~kd%xy(#3$11K>H|-|BFy3p3KHR_~b1_lFn!q2qE7TlQ!?n zcCQgB@Yt_k`be(3_HyvHQ(}uba`7=bHUyke79zih1RO{BGg!tEo#5>i zv$8MQe&VGj?zVvj*n>hWYDbv*+cZ9{Id{yE)c7@T6Dnci?6Xd@%OV$e0l~T&pluUD>-4K8Wz{(Euk%qW zh9;h+CbDT4v7;~d-vO?bYo*Xag5w0dg7MlYp(-R{>p6aQU> zV);55=RqqzBgo@yVm5T}Je`z~VLfv;^6xI-*D_yQBakd3nr*8JzxzJlYHy)oT^!xW zNNr0+k_-d?fZW7UgIqCa(ouy{-}1HBLY>P9`^D? zTbXZ!38|WB?Q7P^w+i=;n?51dsBAu3FDEOI%b|<>!LUpCkjXp{f9mM#SmzHq66->k!7BeyvxcHq!BC6RWkvQ?AtWXp^kz({-}u|FNR|wmzNfA7qd4s~e1$fqof`Yusz;z@sYUZnGIPKH6 z!eXs^Nv*})3WDo#L(D?;? zs3ES;$`Kn2k$f@yUaFx>AT4cZ82{Yv)C6(5h7HEj&RDb}60KF(0Y2MK?)w3n4!;TC zUR!MAap&qJV%s}LfXf`dM$k3Y)0k0$u=u)fTU@ZrZZj)5GQNha)=vBXrzZX7$!5EKxo00}W$1`g zT3DqRlH%Fjx(bonkG9tFe}fD+NSxTCjm4RvkSdC{CjBfaIusYosFOB;J(1 z%`SO)Z7DfR3&*h|4o8Ku*_jLD&Uwu0EwX;(plNh?47?9bBv9|vbQ3Wz@bBxDCT+E2NX2y3(zv zDkq07t;bd=>wzI!<5?7JPbbY|EA}6 z?-@3hk={zR88}wiMReWG>UH>@oer0aLLlFzQl{I{C(ZLKIQO0LQS5M;42<@*azGpF0SLI_M7hHZlc0Nui}|nfO7Yd zJMJLWkbZ|P8thZY?gy^3F0lf4lc2_?Jr6cvh9E( zS!wvsA8Rl4G!sNwKYV5Tv5*99x@iC2YPE*TF!x6_mLdvoXa_bg zKjpKPRTWnE=?tW2h|pb0T-WIj{L#8Pq5CtJ+?vK8XG!~p;|c<*0ip#x-Km{aiL9Se zXzI6vE~nNrl4#6@tIS=WqH3|RVCtByZFV7J)I>7fH=PkGp%P@Bcrm!{N)vXT9px7` zgfy{QH43}ZU^!MOzIf|U+^sWpkw>qvpYjv9i|y0S1Y(6zQ8lb{szo2p%!DU4tUV}} zXLuIP7VAm{&<&mWviOik0CS9@%Wz%P(@Zv(_n5$9|KF z`C^IYPD;LNtifir{QYK{lVq{&Zl!6|&J7lkqaVTX7^lHBox=jb-Ov{XzT7bOv1={a zxt;Wk$M<<%jmq3smjDiFBZNrai|a3!g}3L^(!!P@juDGXD~gYB4{$h4^YQ2MYL=sY{tYznD}}iaex-QXyc3uKCmt$v&>^k! zN-rCx!pCwGU1Mg*FNjxKtxSr$E&5!TSWPk8v}_Z)U+*FrFWr#tuCRnO*O#6en1HSj zkjnR$*q(s7+wBK23u!mdJJ{AA7k=vk>TQ+_1vcIeqX8;J9CJG#j|KG!=+w$|Non4+ zcH^-TZ4?!bX3KFN?U#Ypr&V*7^TU52Gopz-jt^imoPR7h2)I32=bmQ%H75||?J>=L zy~iQy^Ua^6h(sP+Y$~iwSMlJWhZif>1c^*HdHzWhz3YOa25c$V-oZ+h&m)UPNOLG6 ze*#gl+0B`Uf=J8bTy@{H_Qrjr6Xa3rLRLSf##W8=;g`;gjB!LJ<#|9Gp}LNHDrPQ3 z%T=*cm$uu;9IEQGm8d5X`2dJnisXJJC~(ftO~unfPLa=LH;rw}VL2VW{&J@Cqm;wc zgIVK3o3%MCBNl*NEz|p!#r@(iEng_$k@>1!qA%Ve-YK=PHy^<4GTWyGPSBw}+ijG$|Z%Beyn=lq@^fVNBT>h)89d?O zyjaMTa|T$lZ2b}G(eZdmAjtg&Vi%df&$%evoi1G@z8ocWJ>w9rAU|Ar+CXEz9UmxA zIPPEaP%1i-C+Kop%D5Z8w=^5R#xY{k@chMleV$N#uuyQuVqT=R>h$vM(8tNv{kRQj zH%B7N)xKH|cfBgGpqL{np>XN_$dP_TpAm$Y`|BP5b^d57pMs0IS&4?+AF3i)KFG*F z33)tjkaa@hmGr)oX4L;g>-!WpdKCD9UnEw^D3N%T|7x6Hmg%y{6L>a`)^WHo#+hs> zSt(W7&{`q2_UI9KeJ#@49iHN7yq&Jqrj#z}L3EB^f4h%>%=~CMo@Ba;9RCA9PW>VA%e3@QQe25$q6o76rct+u#02=UX5*Vpvnj^lCIB;lTh zNCr*6xA@-C{8{97FcpEv_>`UC%>5KtEfnHFm&YgDd?TRkJ+&rYZ4=K}w~+eIzL?ckPmbEMI`W41(Is(Qsm&oRX-a&}{equk zwxliY^G%1aR&51&niKa<=4skUcNXS|-f@E@7;$W8DCEp3uTMjNSA2}t1UoN8m z@-FqJ`Z`2R>&aod(!}dDLq!^Qu7a*in}CAlY*NqHjxq!5y2FDgH{()<{Qkw zIhO6^%q^KK`?8VsQI#T=BjYc>c$M(Anw)|k@`#Nr*P79y^eW>V%p{?VrbW1`E!lp^ ziw?2$_Uka}h>7KiUTj0UlDF*%nSPV@?d@tHh+`=go1%qmq*@FS$^W0~-n z8nV!8k)A(PkxufRk(t-G0|th}*{+aU4>0;kw5*W}RhXc30;=K%X+hX;@5!^Fe)<0O zV*>znlKOpRr`~*hfES8rx})Tx@}b<}Y+-HQJ}|Yj5|v=n4f^&_78cE|(d^4LDCy3R zW6bub&JQ~DX|`UIZmI6>T@(QmW;rKur8_Rv@nov%Pz%|q@4#$k0OfR$$Ws_eueisi zh0|NT>IbB=GRlyW1zW@IzPs5Uon*NsEnds=f*CCfL7_#w><+yMwE{$!{&0Y`nD#c; z-WIDEei8G%cp|DIGdNuCY##DXZtWAIt+2Vhn!05$$7VtP&y0Det!ww@*Aq4|q$jpE zU;Uji8Y}c})7-vRe7D%eu;XAJHlllKoyTqGs+h&R0p7)hwnHox@*(NOK`d z>-G}kAmlA_Px!2SON&Fiks@(pd6(^^xrGZ1c<}qtOnYz^bK?Q!(269gM`U0m zy291J4#NBabVQrUH>{PTH&e8H4E`6w`-J^Dt$EL*69YU zhK_d+zUwyoob7yE`?_~%w*gD4+2wtI&H3qa!{KaBLakMwD)sl)*q(0mX^#JYNdN1^ zcJjdRhPX=GQ%vRB+orPFa(=(14{{DihYnkpDoKHlrWCc(T+ch{6w;o5tLqOc(l}5D5$5`;L{G(u;>$ zWR*&7=k*=?jB_W@P}&UL6zJpuOKkSSec=les~(7xzi_^oUxI|{xup~8uZx+W0hPQ(1+>nS7@o z7+AGiADp)f>1JEkMK2?XFxDhm4f4;KKgZ@vq2eqE%OsWMhp}KO4PZJ`Y1RG~Utu(R zHPos${Fu>t8;TiuCcCyPow{mkMjVPlIvhTiM)h;&966dbFL^4j`=czQbnv51x24p> zkEp|;Z3$Be#h7urZ`?<`KcC5>0=qUsOr9)Odh2JiZ4ivUp<+p20Za2I&nYfb1C+Dq z$Mkg~g&imRT`lXCuO$u4m-`cDt1~#d$rE!*7&UGQxFJ+MFT$l5wVs>kFub{`ObkKl zsYw~o(}|P}7NSqwAQV;5$*pG7qr?x85qv=u8V-*`u<{>t2&Ge#VA;}LJ|4*48MZsq zLCjHk?8jO^+gWe%)!|@O0>~R9@=+i9dsyy6Rmow}h5Ss}0y2z)jlT-|(R_O`>>D~R zarPF8r;7g2_$nK=B#qBZa-p3DyphR%#LGMh9zA4lUem4(E6*(fAK zM0qxCpJ#qQloZ!>xZx)JoVD*nhLTa`7 zgy|x=AVt=Y12R##p-OEF^Edi_j{}v)69NGX_U`f99BDRb#mw{+S=}Xe&3c01+eR{d|kxE8tqMQ&)^RHr!1vlHKPYkV}u8i4q zJ;+5bb}Sq%*1NWyo`xWdWoO3ocUTMnKlR)%v)LvJkJQF?*c2*?SK@3@`sCbJBo2`A z@0$|T-)mUNW6+|HX1^h&NfM*+n{94^%{P)4e=(XG<8sv&!3NOX<_@p3=BSu4bUB{k zfxhReNL(v;8#!*0yRItm9G;g)oZn9e{82A^XWvi9{n2Bx(_njyzU6lu$)x_Xd@ltG zZVqs(tECi#-g?<%Icg^KTd@6v^|!4VDPlabRGER#V!fpRpXckB8!MF%hc1;dIky-b zHWyrPSF@^1{U*9-~{5BPKgqv50#%f<`BxxU;or3QHkNX0U{OvdBahe?jD7 zydm$)MjN|qwzw9LnK($LfM1yR2@XIZc<>>nm)R#?6rS|99y0qwr6os&O5&1})o2<< z;$XUDT@jbf8mBJ;H(2)>_1B||jiD9b3uZ;O`^dcVvqqf7Rdd2@sWT4Rv^1217j#tL z9!;+GQ@LPo?eJ(EOksYM+D8hNLeZ&W?=oo^hRkI*bwU;cZtJD$fbQT3!I8b_0vMP? zYcK;3;*0A4@(2WB8__B)KQGo!A+0%w$m_`;???N(PL|5ohs0z~`sNs!!?o^>C7bru$y9b9qkXZrsM|+|T<%wSq^K>SNSC0G7=%p==u& zpU&xwANjc7(#Z+@=~5CSgc?X6itrK1f@eN(0nD4rpOI#`s+zyM>L}OXZCS?FT2}ng?g2~_n74wcs_|ec|4aUCiOE42}NU|sU+Y#Gw zl|xJqjw8AmZK@9oXYW_jK-x=3@73V4bTTiYUoxXA5PnQY1cA?uNJE`mm%v?14x5Lj z;8-qv=4h+|`J{lH=}Sk19DhYU9h=2^Jksc@run9Uukz7MildROmJ{BT0$Wv%!T98h zq?#@^i{(7)tzHW{0sE+gjK=UG;R$gyJM?`mw}h;eT&9*%*T6thd_LNIfiCCre)kLk?iuX2zU+ISxj7VdnCMG^CbJN_?^go zVJiE3s2E2~k(u7*pKklc14d=WKbUX{x5}>6E$A1u>NL1-^rw}~{usYd+1nv0_`?*b zP^g97(rABm`^?r4s2%0-+&PdcYN|W-VZKVEmq9t3^MUH|H7ait)&&2E;{4wKA)Q@Y z$}IBfmdFq;(J!H3V&Fb+f0h&)!pgWOimi8|`hX)&={R;frXc>3`=2i7f7{1%iFd(B zgdFY^^OS^;TM1sb%_TvzDDkp<$QieG$4^A!>ab>Cj%t0kOeFx|I>>FhvZIMlD~~Cz zW3F4{&B9?dpD9Ohqix8?nR?N=O11B;f86MK!|kI|K|Ua#nqfI>-PLkOxV6uq%Sg!Y zSY-2Y^e0W7x)33+Rl24?Pjb()%gN@4z7o4XkfPj8QQ10vV1@mh799x9QbjXw$%(*{ z+^yUoaHOt?zgZ#BWb2E%&1DZIgAO|?h;MCK?b7Uo#xD`2W#mfT^WhQTeLiU7Q+aj6 z)LC2Nh~ZA27X=X3hm8VAoPommE0v1Kmhz$hj;5s_4CH!k3LAKF7c+C{~8 z#p1HfwZHq0(6h;NE;yaukyt(}4}HDWd7#OA2Sjz9gX#^Ga_`#O-D?H;4Sz32@=)d< zPcOpH;&vP#>TtaC9#3s39TNC?V!Z!cv(Er(`H3cc7XNrg!$Xc8?iX4AM@RLtF^;Ho)(? zC78q%Y)=4K^Z=JXCyTD%1|pH8i!v{nO-9Wpqj&!zF@z^v)lsoe3{=c+F2pMUQMdlxwFYiQEV z@=D}&Y*(ha!}Z)MHj>g^uuV)#dFfa>wvtfxF(;-`KkUz*rehvv1~!Vgtgf5T?%GFj zMlso*)0XRjrTZMJ*PbJUbWXr~o5l8`yidr>(^Y6iIO80$ggl6MxBNR*1SKH$-hSfx z=mDREvE2mB=D~bTHwTEV;6Gbw6WFKMi4z$Z8^x)?=#xtw$G*1dG$)aw@L9Y}WJDzM zHOOgXVjXtZ+-X_3*%?yNZ7^W5sgBcWJ>f`aR}mV|Y+&8OD%cca6dy*Qh2^myjl%xy zA93<9e7X1qIO@*yEa~;~Ic78e@X}s5l)PUyxvOTMZr6eZ>%28+-TsB*luKluM5js| z4KpAoUw#!DhZI3+dZ~Q z2Sy@3ryFQCi&x}5%V#QI07ri)l}UX5P*0yeb{8V8in_iygCmM<(v==YGpogv-{F<2 zPKl6Z`!3CM9Q!SiuU*g<9`OW(23xi!l-PF3daXWW6OYPX9(!D;pB)%WiEB2d60Yrf zGUmv{F=I-%k>ZHyc*ozvY4*z8@9X#wE<FKSB9QgQXpR=55CJ8JY>dwp6g4RKX|*N2YfYQaL!zuaFz)4~;@p zwhi~2RO%-$Yd>xk_q^vm!~Okn-*Vl;ZV5-@&y2lv^fZonTZb|n>%Cop(p^T_YWo0F zf`{OWM!j;rPSePwQxE&|MhM4_out2qUb%8jlRJz6fn_1Y<|SXf1#@6Dx31GJI=6vH zjPpXR6fKskLW+0PIhg!C%IZfamhX~1etjcU$mAX|7P>bu>WOtnP74o}4Noe5Pnrec zfokn{I1}F0w4&jAL^MLtUVLP?SsS;gMrY{&HeF%z$PK6RJH)4(MlpyBYThj~hq{hK ze8K=e3I?dJ&Kg!9tNXLK%ur%7IA@+eQ%Oo^vU#)@E3nV}s+jggi#YFTq3^jWnTZZ{ zly+Ybei~{7XQR-5K$e0Kp>9_r&kXKmbr<}po+a+ku40giA7i#RNreWad?&cAQ#HM zBrcmN>Nw?wKY7Vz4(Y%c*GQKq?8a#Y9AIPW6JANR-BBqyepM!`BV2ufEHd1uh{QOE z9F4W=>kGnW_OO?+`vwO+yb#8q5efZbDQc>s=Kie1b?0GVAA1_{;C;cJ&eC!)j=U^SVMXDi+STZ+*~+1S}~hb^97V2t<51<z=PK`!+lFuul1MR@9U{#FSeQM2(~ z728d2mmhoi9JQs+m@OGk!0YundZ!|Cv%1tM`xj)aX+K?y0||@}^FFm-^Ts-duX-)| zgW|Z!uajA?Y?%X8I#Rtm3`0o(i6|9p42@`5B(j(bWzK>_7?vSNO#0oh<_B?^1^E^) z=xDp!=iNm#L!z3GdmN|U7LWdJbA{0j!oXe-$^mW`TO@W2oB1LX{h0CJ1H z^q|2kf5)8!5AycSE!RxL6vzFl8Oiw5j)z>^f5*uF(xMMk>7*FD_;tv_pyat)EU^cy zn{mqU{?{K(9&b4p^jh`G0Jp1ae~>rMJWc(t66Th(Sngg+8Co}3xs2l2#YVf=Zj)d< z-L?A}7kafq?p7}2PSfyRzjLT(l8^kiLo&)*L@yWfG)w# zBk4)6&~L3mbKO?+MI?vtU4!R*i>nO-VuFz9)1f-Nx@~eda|T^V{Y1Vn@GgzmLm-?Z zTN;#(#+yXB5Om%RCwTH=VVMY4+qmdCxxn!YfSZP9OgB@l_^JB@ ztQRf*FbV_xce&C-uw0M%dN1y&v3&d~bst_NQ@Ct|v8d2+(lm^t7;nAY=5+p$+F zrlb3;DWV6c39jHp$|C%=EfaAooFIN*h(%BwsH&Ny*v!lm6nlkdXTDG)9fHd07`grVvFz1O`}J}sI~jy54=s| zFVHVv0J`Uuwp9jSMR7Cve5jUhlFOFoiH~cdS073L$cVpgatH(U+?h^@Nt_Nj+*k#? zjyR6O%0vR`7ppdlB@cgq$n3gU4Ho*fz1RANm@%2s2&|lN1CfFQLfAE+$#>9ogQ7xB zujUDeZp2A>)G(SsJO>KiaFQO5k{Daek}j>HLid?MJp;IT>FICs=xU7Ap;Ja>;BsWk z*rpxFPyR`lc6@0GSDlHccQgytjjLkmw1Kz9VGdzYIn#iHX^#yUQm42{F)T&h_-irU z)t?A##P(Z-!#&3w&&DomCo6R!CQJ+rT$nLb^94%4%m9Ee@HcYvireuY^}uhaS_fs5 zyJaX#9cIU}FfSKYTv7fv|Ce?>359u0Zip1Cg7T7yANX%p#uwvQf1qo4F*=t-O& z=AVDljd=BoNK;2{Hwa^09FPQO$3yH(5dB#{xk^(9heyv_hA`Hhq71!(Je*$62>wj- z@!I_yc1JG^CX*5(Oqh!K(be z3k5|oS?}V5O5-)hfd^_UiQTwAMx>v_%A0qo6a@U^V7Yybeaa>f-VOzb>F~d`t~$Sk zB8XjrJe6DcFb$;p(+liudv_06_EUrVN z)HJsn&Oig804uyLdv+{g@&W011d?+4R_iDFwU2(Gbs?b|JNwo=_wlxzgok<$f7%HF zE9{q&`w*`96%IlG*-8~QT^V3#N%;d>Gj05sG)%+G_tw(>Ju+*Ji%7Sy;`Lg-74@QB zts5=Q4yo;_K9uIhZk^>@{`^VuC>X%T%|PJ{aV13xsxQd;yWM<)q!$!<=jUygP%`blTq3%O+bdM({GRYtGBui* z#;{DU`}3=gVTj?O_u-S+-B#a-S_-w*OD>w-qLZ?r$h4|Nfc|pT10p`ZX&`-26;oI6 zV4Y<@UFAf6C-)Pc{eiEd47=1UCM+o)DGocFB7AGS-OM~-v+F8w>{7{Vsp`+!&(0dAzTSI(8`gQ+7yNXp1!Cs@Gn z_ws?_$#r-xX(NeEB1diO{WB3bfb2o8Z<$=ta(QH zfGRE4Z8s?L0*UuYo=a#vBLHYak95frrrU6L{Jgb|lxY&(d*PH&;R%V9vMC>d&FoN- zZV$$5mF{>0B5uFxGoB1r?*`l81~jhdb0Vx>Lld_Mgt4%ldh;T#2X3Wso7|5PW!}T-_gzLciuhZk()lmY!+QF(NtJCYxjySHi5*b8cu36>=^eLte&x zT3d5@8Y#H=7+ct|izjDPk}DFxa*YKTMe6Ui2fg?mVRkc3tGvz6C^->s7EuYz3`Mup zzOi#uTKvumhU zOEO+q5Q^4uGN_O9_#${F#H z5A?-j|B-9&aRkdzZ$vrPN%Bw&`%v?+pK$^x%USFqEe9;vdg4u}yIe|g=GCS|*gcJV z-SbDHHR$Ij;8|kopp(mFO*95&25dhe5mq;H9PyZw1tQy_eGw6T>#`NW3agSeOi%&M zGOD8c(HvRyH@fYg@v)@V?9VI$Ohby6x^F>!kuZ!-typaiA&AW&D0X9+-ft`eH@ zb0PxiFZZW*V_*R64{(6|i;DzPhe)zTE}QW5{<`>y-4aiva%YoP?fTOl2m;O7yAB6H z{j@bjUPlx|FF1k9FQxO{EHGJ8XToN&d3E+}GRuC>qW7+I?ff-}em<6b!J2SW?^Aif zR?+B?SR{=;utab1bT(fMnqqxY%x5+)0s%mF7G-Vz+wy)}DMyP`K8YTwXhaLXyg@z1 z9Sey~oj6$YeFgvgQ^YCojp@+!Z&!z)AXM+MX}8m-$Yae#C9)y6p3Z%TQZ};49~G~p z_;J3aT+bfXamaO2Gc8ArF55}k1Ra;I0?+0ySU15EKuVwPyb&Ul=1>W&7R-3(5)V}S zp8KI1F4O6B@k%2OP0;h1yTDErB&V6xo*|Ml1A(nK?s%RlW+iJiSbVo3+(NEQNNGO0m|s=H7Ek@!$ovOpEMQ0rby zVnbZ1t-1o`sD6FTShPaA&XEqifb};cqsr2SMm{LIPh8TuRv@N(7o+(Q)Mof@dg1U) zLW8c&F3`eLRAi2NM-D!h5TTl+8~h7~^5PY4}f#PP@SrHnojL<4`el zOsFPoJT^PfhLkomqNH2#911xO;_wM<9ULz3Y=H+o80$J)9$}U_@S0y7{aM|c45JF| zL}r6$jQs?mszN&gw8^A$;g6?WlbNPPrGI7E-lH_9?^h=tb&)&c5^_7>i&EG|MMNZd z#avlLZ3^i;E|LAHqh=Hj+f;Sobl;;z*#4n?lKE#MFjjoJ9b1DeY*TzoDZ*o=tEc}S z7C`nHhDoa+WYZMCbzidDD2sxGh%w1+7*=I}6Y4O$b9F}2`(YZRW@(Ql$aDRK3#A$T zn_3*2VDEGuSP?r<$EJL@dF<-l=UiM+N+PwUjF%zEYPq;#GwrLjx6!W}6CKB7+|!-?z~sEGUCZrui-Cs- z^}hR1O4-a^GhiZwUQsw!67nK|;%1Oa%-EmR(r@_2KaFjzUdeXE1qs_i01 zuf)^{;8QSCS0VY(+xiE`=~KDkpXy~3-F;rI(*nx_Sd}gCI81A9>qC0AxkNcKS?_xc zJ`RtiT>fG)q|~kpq#stVr5=z<%J8@*G?srmvg}BOds6yQ;g3&%SB*&M5L6luUnHNk zUArjVh3CL-v@imwWnQpe@ry`GJYO}|af%qRld8Afi}(kV^Wm%h0s@cADaXWpgu#pZ zL8WCG8BOU><(T3u{K_X?a-v6Z(YPBE!Q14T^K6od{XU%jm}3r}vNEkFw1J?g!k-yx zAl1$AuUjpiEbdlBq6hKY078JL2-Xmbqtt+W`kwojq?9PMJ*c&_O-=Wrvj9%f6)Vt5 z?R@5|Isd7~_k&ByLQ$L4o3#3FfPzXR;&3+#v0dD%P?urXhX1)hKuCDC6Cf87JPWZhi1VLT4(w4rG!QA)K7A|cVa+K4kMN>wY6JCrFC4|R^R549Uwm5IPk zcLDQt_6^VV*X8#+B7IWu+eX(ZRQ77zS=+;o^9;!$`n%OxC;vK94@TkVP`lLWcQkL2 zZ*yO|=2~f6_!eRQ4)6TkHfL z7qf>oas)~nOd{R&8a?42Aty^Cf%JdoB2DD#FqpE*7cEJg!s2*2gpr*QG!9VvX4FML zf|<@GsgE1dVVJH?K|{Qb#wu%Mj;}Zd!aQ!d|Az9;YMz z4UV%Uu>(|MzmcTrW+U4H{;zGiNIcMSASIZ)Hky@65ENNPhh5keMv1>ARb+PXw_Fq{ z5TkT8l{ou0a>1rPGDtC5l~aEBVg`Mq3eAl3t`!DQjrH5tGKUK=UhUltDQ9kqY`={k z=X*?3oKFgKBP?Do%_~-EJyZs%K7Ze8?brB;mFXRpo2E_x!?8p7%Xq{_q|q9fOv)t@ zLPzCf1*&Qv_FbPxZ~vmc6i+L2AusX^hGC1~T%2?$SQwYrs+Nl(Gw=2ZPST1ifytKx zrP+9pxI5)Mox%era)Hftnqyf2rFqbl)`I05?{=eylf{CjmAawpP$vW-bzePaIH8rGfa@Z`zY46-C~u>iHQl#_37G!}hRmBy!JyDfN#NV@t0nq&RD z$MOpEzNHWaoDc9YLcn83Sol5D4N?k@!VQT+H{pbB-CL>@Q{F#h!FpaYs;rWXFKwYv z5aB$OJlrJ9p=ec<--JEa(rOkaNFV8R#PT%DEKVD>v8_jfMkLy{dKh-diGLqLFP&5c z)5}a38G?Oio1g|5OD&cfk>~Z=V=2&c9O6u!*@^^`%C22<>6H|<`&aY6LDmpPEFeG?6xplX+}3df|Q_PW)y zD~e%sm^|fiJ$&vPL8qPtqI0;&h9fh5IC|tB3c0n8=jZc&21PPB9ZX)6m&-Uj-aaC%HhB$1-u0L9pi`c8m2BBruRX1tAm5G}Qgd_n~@JAK-Q4YBXb4MpiO zI>~w%+JB3v{bU5!75>4L7=9*O==~gB7qaNx*(%Em94;-k*k`mR4il^HtGQ$KYt8eC z$#px^%z^{Q>pOnVVb2kb?m*bn*>9(tG4T(CuqSkSX+mdtE#_cI3IH8{ciZrcR1_wL zspY6r*4q0Y3N)a^JIjeS;^L7}6FQ6bOeAB`I^PP#I&Po}mOeSOeC-%k) zg6CPRHJ{El>5BcBE2R(W$Ne5(679_Du;R2-{{lZ%v&@O-2cf}~JJn(nCJ2+`zvEbb zO|;}FHUhTSz8z@d3baz1OdK7SVl7yMgukb`6ghmVQJSDH`(_wuR~SB^kU71vxm|oW z_)u%7j6|(n9jZA|u2Yi;GwOvn?CoTo4iZ_8t;rw@O!kBz z9a31qV=?GsI48-q#&c-@~b&@J*9(5y(cP~dQ>++&hdh+QfczkdAR&$ zPe`7=#*7TA$3RAlYgF68{Amk19($a5KLsiwdz`*J0Mc4fsOSCiY1bczN03pcX1A=3 zEFUEEyckev5i*|HA;{0K&QyQ?TOhcK81^HKn=FALQ5ej!{~H-QjK$sPVnlx?Dzr)8 z8L_o?u=3t!-oQ2fEtkR9TcoNn&@sr@*veIz0{#pfTUqg}TkZ9Pv5gRZA-#U$X016y z>Kq~W4Msy8hQWmp7&Qzk*KH5;9gK&-)S8(zJBZ0Pmj1iax7$ zQj9`=LkjgmM1KfZ>%{rXinr^V=K|ZE=h;Aq`rh5+y~pnA^3QdnH={ef*NXZV^^qs= zM98Df8Oe%_-ztPzky8L&&szO|)#84g4WU3@JC$|184iCDRH zWuq01#{tc7FFONtrK)w~Fe*xA#`Ugqj0PsKb2@k{??TbOd`@U^mh?_DZlaYjx%x^d z{0?QrO}|HMXAmWWyJEf31nQlhH_o)xJ6Ig%e5&ZlW^rEMa|U$MpQ_=o?}d={X!^vm zXq>ioG)V26uRdYu4vZC(l7(fUT@9UmDoIk1dXL@AaJb>%2 z_?;JTR|VdrA6yf?ATqcWNZfW^rC}C-YB*8BsfZT&U%T}4iT34mS#+%-oUro7JeBTuHVj4^M`IxlvK zFr`s%y!%1G)e9B;6X879#_Dw$*~M}K{)Necw2b!ahBpd6* zTfg!b`m8f|Z*cPt(lx4iv50(apmfH%^62j(ES5$dKpLdvmc;lKjZOv(IowfsLSvAdw-!YFh-xb z_RHT~;D13goke1TLG)Sko=4{Y_?&NkND7dDAo516{X4w+A1hEw|FyzF?@{IdwSxFx zE5Nt0m;SAM>|ebMo<~rs2baYYmC*|S>tz2YdURg|`+IUXi=zDW@7~$Jp81CJ0iyK@ z**Zkk|6_#^7|04lAIir5UO@C8EAaib0(h(`TI2s%;SE(WXXFi7F<<`AyLb-y>m>zv zAGn?VW{>})PvcD(B8NAuQmx{DI79z>uTa&4TvxyU>#wi6f4!rJ`w#1X)}=419b}h% zLOK73rhHNFwf_=>ZP)L_|3eJY8x4QyLYv~J_&T5C*GAALYeWC{R*8ar0iB-7^L2B+FoPn`Uxi>8T3`Ceu4pPC&gyGl z>g(&)Pw>l&>>CXmBrnv#Ji{&j&kxziBGI>YMj{d@7*NntZmiTp>yel8SrwHMA{6il zOI>4;T4s!G_q<8XJLH-&g==JzMZ})@cosod; zz*BL|RaP=|2sv(ztD&HdHUBc@oBOj~!^4We3(&sfw)_%Iy{|h^^s`hLsNihstn<%0 z>kJ|JTK}zzt9Wu(WX!kzf6KI!h{Eph@;ltijk@AN2verO>nYOYsXy)4ci?7B#aExp z^wZ^xmOJy?)`Feglq6=4f;SaFrE{C-O?Z+|M-n0tpS-meYj&l9u#c*v=MeOr?m>k; z*o*h2`s6vlRRHY$T<-Z=ad_7e^OsWjleGTcUi6>1ZJ=+Rd-0?g82aDkea=9p|0d#d z_DsG6X)F1JfEnojIj)kSy`3QY$J_20!ww2%5(?=vUhp^n5RL=K-wYk+Gpl3Tu8QU1 za=#7RX<1#2vtoo#E+Lfl(*Y3YaO`*iomPYK|1tK~L2+%{zHovBcL?qt9D+9x+$|6Y z!94^TYor?|xVu{*ND>I{?(PJ4cX$8RKKH)+&VKvcs_!4FR@ExHd(AP&9Ao@sDe7x| z+Hz0kG(I7=C!!E`J%bT`jhTo3MLx`t3Y7z@yMmQAzgyzxo{P1s@J02ALP_Xxr6WiXdyF%TMZC`9=Uk3d z@nkOZNcrv5<9lP$@6wf?PkhOHfC-RBM!xzX_*+{&MuY zY}C%uBN9HB1T@$|VnRE+`E9Pvv-D?&<0sF0V5I*D{G$BlD~dQ!?9oz#UAI|tZBw6f z$}x79x610m)&N_WpvTu+_p=LTM9CRuoNu$DPoZaqlId5{z0pr$50=e^KrZ2#6jJ;9 zf@o$4I*t581ZMjzx{m$>^V#$Kc`>oh`JSR`Z!~O6Nk5Er$V$IE^GN~ha5zh)XK$Ex(3wM{2FnLU5H5!j*PtU;C`-iPbg$-T~X zhD$w?k?|>f)}k21B55wgSy8t){V6Og{ldFwPPDUd|q9+`wP1k6KPczz{ zF0C5qevZle`F&uwr*Lnu!B>gFH8JI^rsOYL`=JwO{M)z&G@5vAL(-ov*Ja-5QSnDU zFPUv`AOF5QE>Q+pUt$`+)&FxQzOlnAb)g0nAT`JEOq`H>s`tPga>^E`E3esIkE_BAoEC*z&!XYe~&>E6$&v9UtAU4mdqe zyL36QW4HgLoa0kV2!tYx5b)i8d3B&ImUVPlZ+Js%f^hxt6cu2l7VOAw*dz{!fpUs-_$Rtm*dx{u-ed*-dpuqwSJJiN6+-hi?`NtU5kv z^yAC#tYoii7HEA)6?CWm@LO*fIT)}iR=7QbYFr8}X|}k0fEWU;V*IO%BdM^&;%|<5 zVWg@OVZiH>mlt@}f697M)}F3JFbN#a)CF~qd{V>!S8Elh4{3KTmzmPpFc6l+!R$JG5YHs8_bmOyvkXj+vr@j0|M>R>{=XWf6D*ukJ_R5M zBwMS9|DGyNTyaaEvt3d2L&r=&wd`R?(=X}!Sd0}rN&PN+jRwLv#Ul@4EUeK;%lx*B z;zTLI$n+chWT9*<;6A?v0An7VupD7_`_qfuKx;s*C%>0?LeG~QB67S$X{BoLzWMoE zOr^;r!(5paaexH!>uVPqo%>xc<+-|mQPwl&#{@Nr*oWfFJog!RpPmt5+`GUvre0*jBk>cJ z1#J+#l+63Y#vG*m=FSBwCiduBqS!7h|B-H$;jz(qpAS*8mKMcuJ=1ovPO-$GIe%x2 zCQWqy3Y^Jb%V=vHNpJK1;?kh&JTCq?l|Sy_tIAV7j>G2GW5X}nSar$tTt8xB1gNXOi@k3Rqe$T47{hhF82L&D(n9BGu~sz0}DU5fQ?kAXN2^2u+Q8CSdYT3+^@-pd30dk7`ToHxpE zeKEkwe8?EJ@Azbmo-#CWd46V9ddh7CvnK=K~`V9mb`s27AjP=GwbA+LY6Mx?oJ0OxY@ zx$Duwx+uJ?!_AG3njK00=gfugBWlg=$IW%@&hwQ3ja@JMlVtvn-57r6Ii`L6`LBlI3hV1k;I z_!r~6#GqwMx5kdv`whig8!|EP({?_)?i!0l)xX&KwV7}w8+zY9nj2J`V9a?RZn$3^ zAiC~yCGYdu_Ashsbe+D-=iC)A=uc1QRb@7KTxW=zzB(S9JqMIMYD-Pm-!y_mO4r3g z+)VO%2b%7pN|Vx6b)z8d*R7d^qVFS_=)1R4qmnobPs0dHYGn@dp}fYyh)T@MRxZC{ z1&2~=(4(>hGO#E_hx1sb%uzE#c{bm)frYMCfvtVkrI=JFlaZ)|GXZ&1@>Q?GK(W~e z5^M8}gBco@RM>YxuqB}97Mb*hBPxY6f)eDhQAse<7CwtM%i^k235aUTocjsgA11c4 zxJ1_k(GttTb%$H7nkWI>DbyOL7BV7EbgmfK8kH|-*&3>`77vbrA|A!OUvlO& z++jRQ*&sgS@h4!NwuuGcS9L$xh>Uh5d)4V5^X(hT31vRS>wt7fS!=+1yb`8Ys_86h zzeA*&%1wG*Lf9i08=>JhnQH|Z)1J0dL~Tn$>rqY!3W^|$x*u{rUap0qUG{8N?ehWX z@x6d*O#e-0=!C_aPG^#;%>nJ=dn?s$egN@ONoL^CV>LGlUG2LK(^@ex|MguD&UU6U zqtE;BPMHE^(nws9Ui#=PChB;Aui>P6G*d+>NoCfLcyWc=((>dd>v#iAxxI_fWe8g^ zjYUoP(SDg)X^NaZ=z8t4;s3C8hd~n1+_fPotBR1^liryY5B6KOnmfpwK|0^de3-T_ znRVYd8H-DA^5MVU6&utm_c&hkZY3z>UoB4{J!x{svf&bSzDr+KRBwxZ50Q&fy2-%Y zQWPzAfwvy{xdKnt+vK#`uk3ZR5ilSF*U;lWukaM^Nngrs;tG2TI!8 zUiPGXvk-doF)oiB@nJ+p-Sc9>dy2sKWv40LyO1CVW&tuSJJZ z1qnyF7eSE9>qpmmx9XJoyw%_?c=5sc|b*~|_3fNbp z(;%x~`=W`M3xOY*r1MQ`y??EJdQ&`I%jW-Xg3~+VLvs=Ps)KOl=C3RO%fcc?>MD)#8N|t(Jhx?HNIOSTDUjWyng7WRhsI zU!PuUWtM+~xCeC~HyN6GY+9?1GMOqe5uq`J#uj)@Hu`~kP=|y=ss8ghRr79(mM3z&= z1&B%)ug;0QN-Vs(m0UVSnl-@vwJm)jRBM?Md0$ROgs;|~1P6jnb$$4m7}I`FXO>>K z6^kHIbN6?Wx2eV+UIRTfwa?ENI0p2{=SL~lG?j%D-+1p5!h8d1+)1AZ5M)8~iT^;Rfw>0#|jo-TQ^V==Cs(g{-hVI27wTw^=Gxq)ZLwdO27t_Y>WQN_S# zgQpaBm`ktlG^lY1gGJj0usWXdQP@rwEvHVHGY^hrHQd>tt{%Se=Q&$xx^9h$Bt)}f ztkX6gPH%|UXxR{pXx9*bI4VpyXVPNS$uAhJ&$6xQ0&`A!Czrhpx? za%Djb3Pd75ji;pv#nitmhgMlFHZ%69>iUeNH(`H<{l#AT6hlkb+l~APuL@!xVMyb% z+eV*NbUaDUOn$bzWtUQnRmrMrH4qGgJgrUMq?aVi`YX3j=%dpaSOC8P*&&emDh(J9 z4`{DM(0jN&9o_RXL=iB~z$HcjH0jF3CNoiKbj?E1#-VSIm!$k@5SppaW7Ukqx0gFK zOSWE1%>$<(nv?+LubOp(O^zMY_h=F%4v}981hvL(KmyV<>4P7r`8pO|Are-l>V)>ELXAjQLBR zLVt(T!j)7I4;H>|t59Js)@ynh_EB=YLpF+v>CG3=3YpmMnGM}q5OoLjc&iBHZV(oy zy5w>=J7UN<9C80GX}zr5u|^`%0b8a^IUx#AWp)*6m2Bs;3HwU39PtEWMBmdRX=Wk&;?_f3tDbKMdwQ;!K zXtCz3p^gr%Q(=WuU%r4QK60?}wRp_k0Zfd}Rou-D_Qm^@fh&W0G#6Ny)+&v;wU9)T z-$}n@Orz2>Sl_W^u7&?fjqfwv z%X`YZIc=v?vZq zB9_NZ{8@+dp3b+1So-kxn@>?`ZHlzh3>82%m=Cy!z zO(PE6*CDZEpO4>3_wLdQsipoXFGouyHnAN)={N4HDRD$5(Gd1`b@@Fwft!>!kSoGpc@MKpy1@1ko2F1CIYDOLf$FQ< zeugY)uJZG?_Rd-h<$IuS9$DS(L|U?b<5>MbK=q~GD3u^PO#6si@5co{t3e3e?Cs$s zmPyXHT`0gG+-h9VpzTqSqzneMfu_SK8uB!AxV~{1d9>T%qx702ViJVY$JD_nO=jM- zIoPqIO3tL!8vr>%&{G(ZS}}cNHX?}vCEI*{uHo2cw?k>cJ2Ay0)RhG1NzT#I==`G1 zj*9&#sZsjP8R2OKWI{{dVcD7AgbYWFT-0$PzRC{hvwe10SY%~CGvwTmy@^bsHG`Ba zZzXZcp1$9Z5y;6@5vcGvn|*NnZCdlBSLuY2iG>AfxH<}&{-HxAY=v2w6i=^|@@&>a zBay_30&(1a;m=-&roA;zuqX7D8mBaGP%j)pz+{Oa?!A$DxqK9KQ!J5$C9XgJPhW&mhTJ44gFXcM(7b9_C)1VXax`d*@-a>Dn z=bqP@p82(&JFMW34xzM8A!o7y?574e#XXe@)>mnr=)v|k?u-6SR4}aB8RbfR z?dZrVfihwvjn1+^CN&&}6eBYv?D#7jku2LkJ?SdVRJ3b9+GdI_S?Ez8 zpu#pqVWe9}Vb!TtUJ=hVSm$F%6WKQC4khAytR%RU-FT2@aTw#Cr1t-Tsmh2!UAh;j zCbCcM?--((dteI9JLPaHyOirCIi=9Zv*3vY_*sp}1gqh*VUBkPd96d6g0lYXnSzRt zU4=_(Czw&aX&n{`-|I)Y0aCuYc1Yb3dD5u)v#%sW2|?DuOjTBkKUAt+U=|;!xZH?h zOFuZ;$(KKZmww?D41F5JffIRU9Ti_U_RN5-x>!DGqEtA>akh@rR~HQbYy*C5k^;S^ z&OjM(T8(9CjEUE+aPj+DLf;5C+Zb0c)KzD8^1u@%ZO;R=Kf}ot{wQf1M{RQb^H*BM zG0~sYp+|7j%XkCoX9$T>nj6ncI+pEmT|C~xMRNU#HII1Nil1@n-yzWVRntS*jl&uX z`PS~6+vy+7pn#))o4h?oLomH6M z`0OGTPc0Gk#W}U2VN@D)7W~&A5cH%sK7pTDHmn-^wzJ=&F>VHphA8&-0KtxAgE~7Y zSl4x@%aw{ddSj_rq}hHKRia-ruqRTGA?nYem=0hJJoeGQtv(=H3pcPg@TSb%rU}=p zuLXDlH$LKJJ+gI)4ZV}u!B0yuFApM8BuRL1S-G=?9S!c?WQAt*x83r#PSDtB2$C{v>>4==S z2_7ab)BdBhfMCMwiqq>73>!CNZ%;Xocb3qRUj{!*+e^oPoi26_NGQK9`T6I1s7dtM zv+7c>*)bz5p|DHvJgMt=(vFEct;fx2cf6_P=WMkzpj|=Mf8*FiqWrKh5G#+M;}_^L z5He0EA%+4Yq1~85)L8O19PGn-U^sXAuQnJ_%utWm)`{oGI_}a4LB^BPq{&p+n5Y&skT_bQ zKCj0ROF8QEvvwc4nuaU&Yq z^wwUkC0O$%H@Y;Qna@XxazBVc7 zC5nEzkObkp_D>Dykr>opSfZECGgZ_*2HbyJnaQW+%L_B(SrXsKc@|89RNJyR>G;_5 z9myBZJ6=sJeh>2xkEMIu8zrDgAGNwcLYB;wOg4>!p39+UOZrF!=3Du zyDp1sY-SPGhd)S4BrRf(`d{=8;tPH^W=*GG7$sgFRor5z@{u6r0E$dRtvCRG@h` z!}+n&8R?9E#Z6hL^ciXFs6Cu(oxV|xb=$Z>^9{AN+eJVDA!@tgq6A}~-`$<^JS4Uf zMsCMYjmM{{bo`R`HlzgE;y!ZmhhMG3z;L82W*-Mu;(XXUxap}j(~w-CbB3H(i#V{q z$R2QPq0rxGYX%jyI9}GH#L;a&-m}3@*AVSys|TRWG5be9g+Z&>U6RmD=iy!1&(CL* z*26$se3kmdc5j;p8KxkLB00G#vt8GM^t&;XO+UwucJVvK1b<PV*qooHCNX- z04?&j2Vp(O8k8k_t706k*eAq&M!=ebv?jip#lCeB{CosaO;) zun*+L=qdSQFtuR@w2;}*N*^3k%1`4FlEhuJ?qGhs z^0*FC11@WMn~D_NCZP74g|BjJn0L(C`X-J; zcVM-k0o@@<|DDhCb(G#OOGxJ$q4Recx#p56!!* z7u6}=UG9AKs@Y#iS}$Nm<{&S|eorf-x&@eSoxfaQxu&YecG1Wm;WbU=oFqu>t+tdV z(k@$mvcK=qeBJDpD1M2ZmRTH zlACkZ4+qaWaq%U|HM{Inbfz0TKIzC0X56eb@kr{JMGC zAZ)o8eXFqhAy|>NDE80g!7LBY>sxS&y^3w-7cV%TsCZbdPN52RCjy05{`1P1MRESH z)1ykUK|`C!Jtpt=Yxc*s%6-T!$(?%4cgEo_QaWd83DcOtMJDt^k=U9aZn*tvVv9yM zK~is}2Q;_cB6NjmNUranRy%qYD$QjhlZ3KOrP7Xdi#@r7?071E-*coO_s@k%s8#tDo@4!UY{UCBi^@2?dbWdr1r z)A+%&-L6!DvDhEN61_(7Sutu}LgcT!xD7>P0UI3;I=t+~|JOP9zvtkh#Bfuu0Ot)= z3k7GYzx89!^l(}}oK|z7b01xQ!k10B7EJA8_km~3TE+S2FZ4h5Nt!apHTl%gqUu!G z;#u}<4A&Gh-6$DFh9wquBzY7I1b0V&h(|8Vxg_aOB^`U ztOi$pg8X*b1M@+iqwG0YDAE%6OCK0Kw9f6HUbWB4k+aQR0;Sxz5A+c`iv8$v;FKR3 z3_;C7P6I4c^qYS6G3F4~NF ze29R`aM#yZp#f#|_{Ko`$UGFeY+L$|Mt{Tv z`&FKN!D6j~I=s2QYOpj4;I+dAQ%QFUF+Xsgk9@4W_10?`+sFcWHaFp~6#TYa#YO3p zBm>!MHE)qN?+7Dj2b(0H7dPYbTQ3Fx4r?~U$Nk8Uaua;7vo zD+Y{4tPK6xfyR}4yZU$mJRCwKJwA0<9IYLZ>dd*ksl4@mF7ZT&uQ5Jq#2hmG=vBGS zZdiv2v;)aZgp5B;=ZXT9vI^ds>#Ya-uS*>SEbA=$eot3Z10-@>FzzkZT_|t4M=nL0 z6v7|ORX06n>5c;Hr#q~>*Q?!2fzUaOD7HFOZSLE(T=w3+#?TZ~oYr1m`Ek2>SDbqJ zjHM5I$=222dsyH08~06C@BxWDM2XUA~g(}5wb};s{>q4 zN*2roqyypd!+)CsmVF>FLvl8UR5o-slv1ail^{@Hz*(g`t(|O}MGJ$%T(5=yns4xh z=-0nu8zJtS{{I%+%s^~kJY&}*z#ayP42}KVq7ZmKL{o|HY!*)Y>)Ybb)x*|>xZ);T$Nhk%;uauSuh- z0a66v>0-SG@$C`)Z()R zvZ6?bV-Gh8YLi2=1l?ac6APq7f_3*S(Vuwc9XbXuwl>kbBKCbxrLMDvZf(zL8}S|+ zJ^2@Fox?&2*o}_5v`Y*pVrUt61dh~GDry}}QtpwK^an*a9x(u-As`u26!O?0Ld2p- zk7ZPqpcZ{zSViKHb=n>#hj`D!1YMtK#81q+NvS;qwngjQk44+8(F0KM=1OB#M4>mq zD(M0t_spQ9>6@)g*wumHp_qL%jf{u8*qj5Ihzr^NEMYuCQJx)gm6W7xcpiL^s+#%n z`<>~MXVYWWmG45;oKLGNr7utrTv<|Aj@YF`g#%*Oisj|LBD!8nIIwm7t`+Xm$D@<+ z;XF>4x6qLoeZMlsb6n$oyi~^XtaInWu$=Bk$l-T+?Xn*!@)2YwDs;VrTG9sJt3vru zXGQwHKq2z$Eje3wk)4v*!cj<^<<9aB@0Yj@V=E0>*{h<9rr?~OVP~kP@{)o5=^DLW z?ybeF+^46=v6iuoJ_FAlr8MgG79RmK*D2N%HuT^3&(c7{$vlB-(NjBI{yShYj<9T+urW6Vc{O$hDqKoFo`|P*9VK@;Yh>nlZ z`p;?0<(`DS6?mwG_7e4#Ki?Vr_;GAqpPp4B7CX-f#~UL_uh-y7iL$e- z-x-W^LFU75$aeZ{7fp^uc}t^G^tm(yk7WV&^yNyvN8%ka@=Ize1b-iFY`A~BfMUI@ zn7&B93i5dL!xp1BtQn^m+@68p06rBfiq(I=_l6AN25aG>=3pcd8q>=0I@+GwB;iDe z)4PZdW)^DBW_&i7<2MkEL?VR>p8f-yzLe}w^J=%=)`#UcRt-H2&KYPhG_oYEcS^vi zJoMN+t(T>Qx?Y0sIJJvMh8)5kT+o{6jo%jeBj^EL$>9K=bPC9PQoj zz(cj4HpZ3UMRauy(h&!`nIMgRmmv_a=jKs=#xk z`Q&Cv8Q-_e&z6c@@U3dGWH|^Q(=Jo6r``sdCHbZ0Y1sM3{K>toZtB@qFe>iWHAieT z?beG@z=`YwiL=BtpYv#)Bx$$FEybsP$9uENpQbR|t`+^~4DQXAsSp0_hGC5tEdN-D zf31o~3BsUgBH(&9O`Pa}^6%^Qz=)hI#@Aw9`VeICB*|s?`o;~d%}Eq_gyfoyG2AJ1Ws zC43TEi9Q8~dvlqJ-tvXj-U&}LzxMvw)b*6<`nIuHT6sP>gmn4gpGW)hgBbv53^kf1rtV)4~UO;fG>;%<1>C&=z0368QGqpJ=lC+Iq z?d@ed6m(w4B+q(rJs6KAOfkVOwtZ&YV>`!tS=U&df_h#veepA^EINcD)l%;Yyew;q zl(c%b&Nw1-Z9Gx>`QROHWBgiAVx{qfOFYZOOZKCP(H2+2MFupZT2<=?R)QkiTJ)B1 z3O-r8<*5Ygkt32p zzKpN|vh*Gw(M9#|1`zb~okB^}6rp8AA6N8tWPO0V9q=Zi;oFCdaUvq16-<<7IVKv{ zt&rL|(|Q|A{hxyg*;kdu=xP+WNB$-^_U~I6_<}1fl0J`L8+YM1T6mtkxyJ#vwCQDi z#K)Rbj)Peb3j1KcEQKwpp9;vHst`}ku>hJ?4GxP1x&U3x z^lC$M&2cia{?l=Drb+2PKIvbn=Oh9TJ9~g%RNN%!v5le6t1R7S`7CIpu)#&e=$d z@q-AguRT=F0r5U@?O3TZ`1tC%O8qLmMrOsc6*AlT;+D0XN!qfF_O(1> zdkxbA7YT*lHu%}4Xx?-BW9>o^9mT72%qa5hCdA#Kw`}JBZ~FbOUH|r_0qHpjkQyi> zRNnlbU+}kpy0M3&_CDtGzQFuRxI`Ht)+o(<`~2>mKl`&y;$Zg&=x=|3)r~+mb$k4) zV{<9VZgHw$p{39h%meN$liQR;ps5EXJSINro_0_*A%gwPxCz15rZZkmi&*%BqzwqTy0KQOG3)Q`q(mOek@c&?hWZQ%#B=KRoxvput5}0)qcQ6z=V;%aB+q7xwV9=)Iu86K zZWgX2sr)Zb?Ks5;Szi?FG88y@)P%%kwP$kxg1*v@T+Z!2Y88d3m?>IDp_(gxbMT{# zq4EMPhWuPVe8dJ)V|yaGyZzIg=YkL<{49>fGP_bPtsN8miBBRWR@#X?lM=J?p3~c=v}HLNVd% z&UQri7zS%N5bdhs+dbVZvRv}{?F+%=8@lq4kniqOCdbWw_Kt(_gi-3rZ{3+2vqXEO zrXxR(w=6RlO?~iaayxuAY}lAHEz%b^ zOZy?zESN%MPBsM_`v%_|fb9SR>8>OeF;8xQa{3JAWViS4(iC`{`iE%?gYN(3tbW)> z08;B|uwkrhZ19G!e^W-K%`)1w-I6q1+RP`YNfO=5VZ-_mc*YXncxs}ZC$zikJt@*q z>c@q8Ppm`X>#pqe?OxM9G&+V7rj+r5*7Y7Q0k13WwXVoWjcH2Lr5%IMY9+6f46!Ih zd<%mJWrjWlbWesF{pfi?M}16hv3}tBo%66r@0?NSg5oO^4u0d~*Jw62u%pmS%n-l* zRX-S1??|!E09#GsQ+AF!l9Vw$xag7tXT7L4vmX4&g^hnfrfs{>HCA|yE%rrfCXQUA zr#9P1!&cw&*_W0{yM_(7CnBU-#7mqOx80t*`qisf#=+AF;aPRqu=4z_U-T921oa@; zT9CoxqQlM%ac3AQDTkHc)O85Q3@Ij>#!MoUdJdIL<&Te5y9k&zsiBQ9$JMRh!XF!L zB5dP`Nyad*?QD$PZyM|lnFG(E2Dkle?7>=owI(f7t%;&uo{X37Z5!!irO{L^gKC|lBbLzuB{pRk?EG~( z?{IiwN~eSepP;ZM%ebx8n?kEN^X2&Qp_(@lrc%f;KqA!GEs^-y&afard)pes^8lDKl0j{0;v!FBDXyuu!kOHTgCEAtvTbRpvibg7g z3I)b9GFW^4U zmcHswWDZ0?SzCYdv|}}_!i_E6`H74WINt<_+7MZ;elzdE>s+98;Z z_6rv{xp3C#E%3I{`xDqrayRLkb5H4-2j+3Er24Esv<789FhzrX03;xmsjT;OGdyIX z|L#95{WILl3fnrTTOkxZiw^4(kNBc^(tz{rKS8gq4#Xna_ODjA4fn_0e#0NcGGI=l zzK%N)I`FN*0tJot5<1ACn@G0fR0v*tI6#^BS=Kep@glQB#`NytgIruYMO;s9 z95P*8-h~G02;|ro>pfjf#f1fx?fCP4lIvyAF0j@KGn4sltiJxu8 zT&nG5LI61{iF`6uW>;MJ{peV-l0;Il`uFuH>Gc@FbryF)1oivKrc$>F3jFWN6RVk? zG2_(40oX#}aCA=c0AA1 z(dmJ@ToS{FWZc%aj-FEY5mAxAUkNN!%6swkgVb)#fDvVGp3r80Vt00j?2m<)3r!>E z@%VWPue-2jE5;jPrX7K70{7R_H%JJ3f@?0ZbSgiZ`lWIg4LUAoLMCP!u3x}9>vFR4 zf)6HnIk71G4HkFjl*9fp3$%{GiJ1V|KJxr?_mdY8v<4!po0tq8 zn~qc2ZZi~^EggU*=Xb@8 z&tqjKM@+b1&8X)yC$JM<7hLR$AydR9X5084By)}@NYOFN?>Gkgvmc6vjRtfO#F$8- zDbd7bz%K-vtQ`=@StJpi7ogKe@e@~06TG%MMG^G^v%>3ysd&LGH>n_X=w5G%;N31=;S~*~x;gOe9a5c#Tu29H+*}C1Y`1 z_6K$!`MNN8f5lhe&)1t`dF}26;s!Wcm3#}q3!wbu`rP(C8JNSpN#uz5-K!Wo;Ng2{P=$}NVzen}Xh^{m%i)V*!BLYG&_V3H3( ziY>OQS3`WIA3KrF0F!5A^&Hdnarxe8b_~L?-Tq0^ovC?(d#o&(z8sZ}@_NR)rs}Sx z$BnVgo)Lf(FvBwnCh8tBh}@{esW+OlKjVxWHYqIIzc#m)`^NLS`Q=Ed{T8yo)=*wW zBD%Y^LTO{brr;z9f}Sgw=SJhTTZ%}SrHw_j_%S&o!=%6}PVGfZ(R zlPQ5I;CM)3AnF;(=RDBHr|yAH!im>cPAC0UV9a4{T%YfCiz=B<>LklvRaMOh?b&-F z;!MfcG#Xc(H`I_fpeu~ly9D=BjfqgAwJAJIEs77y&xYq;puwY?*27;f*#7gNz$59e zc-ft}1AJ})B3&xqtHo$~SBbMNTyjFYTPhUrIA9e+nD8c^I@>Sf$cO(TFoGz`%g-{~ zESr^RYl*ZDV&N`{&_-%p>?f1`DH41;<(s()Y@dx17O+-=LthFRrlyvMG%Rb)M7o=IFLN|sKJ zw!eGo0ZppFo9Q*7CyTLNzIK6*1 zbB;p60q1=j%-nludbPg@@K&nz80l!)nQJP8VMGAH(!N|u;atqPgVQA=(`$iaUf{EQp{j^;N=wz zS$jl%rW7p30KJq&5mGYROL4jBf8=#NLh7O9&M_>Bq|@xnsSre0U-p$O1-yFRebFL4 z{KW5zfubb*_Yv3aq!P>miX&eHGd;piAGW$M~2l=utQ<%Fnm7>TUO zCbM*#%Cla@9cA7J=665W5CPK1el?%%Y)E-TeU3&) zKb_OA&&}!Do@2Au6Ol@G@T(C$-vCob_bz0!3~xY5^% zS!UWZZeE+|{0NMD+C|;z&6E>fT<&X1mJ}bd9y;EuX5PdO>^{u^RYNHLpkGQ{)6%}l zT=+UAn*QFEY#^CDr-htdJd1v~a?f{J)zNBGLo#%NdRAQlf*2aG%og7;bQ7GGt{FaL&A}V4QOO_fo7f)huH%oLrEiNCZ;BR5@H3BqT{rXV zEi|1>H?I@%H;RSgJEFUK{t94Mu3w$5-(*5pN1B;q7}Y-gQ*w|#1ZT%>!`zkSQ|LTT84 z>vXu~mr+bi*Z%9=`2R5@NgR5EYqL=2PD#wnC%|akHn4L#F*asOlRnN!Thp(9(LEp8 za+R&ffi-93A!VCEzRC;rSqgW@AuHm)_^4NAGL*H$+lnTxnl&zCC`}#(;)5xkW-H5U zkKhoAI3SWtvjt|aBI}3iPtkIZP>7vMw)py$*(_>x28*W!*e zjaitR;Eoa*qoCtA96r%sK5%=W233zgxO6F1|hzdDqO15zT3VU^WjEZa9(uPAqf&_PW3+^t#-Q6uf za4lRyg1fuByA~EaxVyW%`?t^S?yv8CPoFXB4@FU$4p+%q9{~0gV1bsXaeq0nKvkde28+`AkDUGyQKPF`YGPt?n-r z;9D|88W#eCX9*7cl(}oO#r0CreWl7)1h-Tw*6ng+FkD7ETy4PZS0LE6*eQsrUu&P) z$j;|vqPNcNbrSt}u^zL1=6Sh>c)ms2l|2cp|7c+aOoJ0C7+(Gk zbpH#PTjPTOW?;)`so~W8vh0AKI;?QY?3a5zK#TA<%w(;$Io=PRI>+M1*n4fy6TYN< zv1V4vmyi=mN(4HpcWM=DzTXvdb4+qm_P3V@Q7HDXW{y_-Q6XO2=j(Uytd~awv)?~B zr6LX-1%(1IsJxzUfB?n}fo=?ioJeXIF|MzvFk|ZkR`j1t+{WyM$`6K_L=?d9f=2Nd zvoxZAYHe@s5e9*LtbSk4;7*ikdpO9ZOLFY+$NACMCXk@O=&Fqn{yNrVX`|S$J{_yt zkX6BqjMk{}Y~%NxyO~P>Fj$OWO_JYBd&pvusZu{P!a41)h}Gom#b=~U%2Q$PR>L;d zP{4Jhk@OT!6Gs3B0=#1df&6CHB{Z}rEYM*xfo_?}>cgQLz0=L%OlX}2C?Hgb;w7ar zT;Wiq3zq*r?rDDqQHufNiQ~6$m6#RT@A^%8@7;#xuC5@}vTYZQ3@Xmid=&#`b{Ie(FLl;CJ4_=y-b8rX`+w9x~^1`+3;_Xprl%cJDUrvDT|6#a}2_VdGob-#W8;n7*} z=lwvbJJauSIf^E1C0ElL!==?BJE_J?Hix$xFST8&l=U_jMVXHVb+%al$&HvQtYfV0Vg z;0+v24FWLnu68FifpAa3Bby8WVu#MCYt}CKhWzr3JR%xcLC@)SShxGQlm?S9E}GhK zI=PYBfZr4};|P`O(2Jxv3i#D1RAjIKr;JWlCyOcve-w#i67pb!_f^(Ua^D7%e0R^x zdV&Z}+KgG8hgAPoe9yUHc*&!Oeu~npGdqze@sNq0opxkd?Q>IE35vz5pAkAfESNLcr?n{j3tR;YIO{IW%TTN*@kCD9;b1mGgedepZ%EwI8X@KZ< zwhxn)f7{*u3*1^k0gi2jvUHyr8myMWfjk0(?)Itk4o^Rv5NU>x{$Gg_ar|r+>QwJB zQ8MP0sEAhAH}kf_33-AcPD!h8*17KaF9NN9YPjChVlBih5*ck%6=^o3r7blIEzeie zZg{sIkfl5BwclIMa$1n%x6#`<+U99Dp8cjbkKtg)8u^r(nJG{(qV)rCMcJIsU{QI4 zXq!L9{iY*V_uP!e&D|(AJB;nLwDQzsoFuLfj`St%M~LD%EVG4{cIq7Gm>LVk?A)F( zVf%!T;pZ4wsYHL*os(|hPA=Gs)BGh**$m~giBGp0^|=_cP$Givqv3FnU|c2)r5wFD z`z53CrA)r&6-KURF8AZs=*rW6T~2O$CeND-tBpqDsdbgb35rUwhL*sda!CBqa~NML z28nTo181{sIYM<$vgNF;SUjx2)XGO%Jur&EY?(!MBHuO~4m(5(J3+y-_;pR;9G&|^ z&Shjcqv`xRjsB`aILW^?YQ8@4?-=+r%Qp8gzmg>GBr#g^lZZo>w>f0#BpWTZd}k~- zbF&^iYNSPrpwc~zo3HWWa7V-|=pICHKJd-)7oJtb6Z?~l@QK$4!;c&Wms5pM-ynghG`3xiIZJ38{8Cz)iWUPIfvf}nsU4{dJOq}HA^ZvPe+ z!XLfd2m>)hhFyMj=34K7Nu}nao3_{0^88<3WjY<+zpz9^&1)!I&%cTfSdLcb_Sd~D zP$@={*oczha6G=3#N%}mnFBcthlZiWW}w#Ub{Mh*M-WVX>6tH5&8=Bo-f4B*W7u5x z?S_Vi{+ccH01TJJtXcLh`pyA_%6P5)r3p|xobtH_eRB>r*SV$A_zg1vOjXbuzexUl z+mVM(s-H6DPErKRco4P!lr8)2>M4K(*ih|W34U7VYI_FiDP5651LQ8fMnK<6Kok-M ziYdZLaHfU&jH%uH>ci*6Tv26yJ0vB_Z6skC`>tGMA4$ObrxEw%OYl^5aLGn zu}vg;txZ+3ST)GsSNd8`M_}5|2fuePtNakfNz+sC1o2Cnp>j0jH&u`6&|y2FuCg3? z9(f$q9Dm{=VvKqWHvZDJ))s^;d|bur*&hz_D9~^nlgYSYYjxP*^C(B~a!mxyUX2l0 zxwdak-pi!l)!VKlE`R=S==Xm=JwFsgEdrPQBOVa5_d#@3dzi$3&iA<^Dvt^hS)oh< zV*5`548Y6n9OeqG-|qkdvL%E!9Avd$>t35Z1!pv$>A<~R-H1j$>@ zx{%+F)^&d0P|*RS@5sF#7k0=bliBL4DbrOqrd3qW5V3mQf8zZS`Zo*W~{< zNC^<&02DJ*mc>@5dfk^}i$rW&*#xaAi2v#;X!|3%iu|P*Wq}?*`K>a%a%MFb_(9Fz zpWZ>3Z7?7s5j#l0VY@c5)-%UPIXej`l!3m8{Skbdw(Ioz5CJRgCg-J{~+EQ03f69rGI$EO_c(E9M)ugmN&Q@C79|-qelC1lN zL_ET(`o_yyBl)`5CR`Rk=#2j4lm0_D*CF)R`P{a^4K*}&;m1={!bsm-r*J>e8w!Ph zyy5#9mU~ue`Gex95fBV2!|H4Cyt#RRrQVvtl|rEQ+Zzh3;m_xpbx zMc5$pQXSlvHsE95Dwx5(J`X3_)mvWOtd?HL;MT~v?Z2;+|0*5pq%gqUMe6$^-8=GW zzGJ$T^&eOto`Ua9(;0*k8K8B+DDVGPVgFi&ueg8h8`dK%{Umc{`}<`0nK>+#wnI|Y zV*mFScEtp$RBLF&_CK7jgw_fF8VU;hpj7=k+WcRi00{wj3%?Jd1poLJj(@$yUKW-0 z-_INW{U1R8>r)tANV>qCTL-VKc_SWlF!r4pW_*MDf4}83A?kYlj!RVlYbxAZKg-2} zEN1qQnK(84|H;HddjDqs-W2h$x>Dd@9AiDaqQusY+p$iOb9iX?7T9g;lcTmaXlVCa zJO~H~37f=yYw|aS49DZWAY{^4{rSgYu}duSf}6t0&m9>+1NVaK8Xyr(LM(Tz@rdIs z=|=tU`^C9FI$4%bDtoGsF#J zEXReaowfM>Ef4+IIivHp*-C)JxMnJIjQ)RL*>=$TR@+_=U0|X4B^&t$G62%D9250q zTT-#{F2DI|qeC?iKl;57Z(4uD(-Rahkix8F7ZvW6KqeIx3B#H|PVT`<8%~t;iE0F> znSP2k8KjIZ6F6kDF<8p|U{d3NI!3q5=_-}~xUuf(Vf^lJnOecS|4{qx_C9=`?147@8HS%3k6gx>`;KpUSW2}XR;1z3kuS!S;H`%EO!98wrsN$mG? zZ#0^sK@$b5#`*%T2)LoZIlB7$fyH!%=0kW5F+w95VpKc5flR`X6=${a-&85K#fW`#8t=>59*fwBDoNqZHH`{2snjn1p`E@5MuY zK-%YY?bQ$(703pWqv|NM%UsN{qc!u`1jcfCVO~Cf#uy61KwP@PtE&l^lgCHaj`;Mp zkIb157B67}j?5+x(?$Yw#2Qtes7g!ZKh_XL-I|-A2*#SPlRY zo>{Q8I_Ru|eMn8Q_u1i4O&P>PzDY9K4k~=hnX0B3yCzou_gd)t#_qemo;cs^!N4BV zw0=3GP39To8;5X9rB_D;%eh0&5NnH=ZQ;H27uD@)bY;Hn?j0cD$^VFGu0$c+?&-Fk z#DKZ!Pin&m%8VK}nQk)28ux%rD97_XR2}k(8{b*D!c6M0!=@O~3G0E`BB2VJ#fUQ! ziTt$W$1VZrbYRi#gra{&EXL*?+)0ms55@pYX*n>gFD1N%X|R@(I)Ub*Pisrriuojy z#|H+#r6tD|nbPS#-yh>HiTB9)1z-a0(zRTBuC(v{^1Ij~5*Tspbs+!psd~hcJ^2w2 z0R%XIC-GXs;7rp;Hqha=^*PLCe8Af0LO7V>%#v@sm5@6^RKDvQS+XPKCYZBX?acB{ zk2(r0o88qom3;uvi|l+yLMvS!`N;l!TgskrRPDs4)V_O6FLjo05{Q)Ca3~M>YqHYa zYZE}2aC`1RT=qZIk~K((T1p_?E;0$>!wEl(u9TW}KvFb%3=f&`RUgQSCX(REaLu=S z-simN_SWGbgD}EI7t*7J3`6k)rf2H8?+TxG=J#jlDcaN+!y~NJZhpXFXeZh1Uqr}$ zXj+X1hzCa#p_Rp%C`Mm+f+?)Gb~|ibj^l#S>^21v&02Hy%c$C3)NI$B`z?c7dzx$7i?D6gqgx(wXSGaq7EQ-oV|AD#u7W&~+$e`Pf!N*7W`>7Stfs;J2(g%q?vo(BM^O(`zRX~MG zdo$fAk;jG5U~%~4{+#6}B)<1GW{orNU$6RYh=dM%u#T4%K9g?t1m7&4sa-uK0?fKT zIbZ3_3k|Rlo`p)O0W#PQ`)I9iLHWD(f(M+yo!fDwqqxL3 zTU3~>KxYwv9)!$d3O95w`$PdJ2dtOw$D}S=ti9K8_*v&<=2>;U$ZC9I=>X`avy)$f zzr>Au30oKqT?tjF^(VVXJ$Y8)KANnwH}8S1rhsU=iQ+qju*-cp>%^Km>%oiowvu7} zCcKd)*BBJ4_YS5qKTBN*H#T-!&T(cwmus;SMWzyGJIeA+y_VGDPUPg$SR^n&CVJ~e zv)YsBZUdZ*VcjY$y2mg-;}kM1E~j^}+&k6RKHKx=brx%%50ohTk?vN>a-<4+@0Kez zM&Yq5Ahz*MS95lf*lf8z-P(&Cpor4qC6+&<)|aUN*gL=2pKt$|BNm)vU1hU}euqRT zWVk1*p4C`2yrwo9_l8jc6lV-mL973#GyI==)lT`|^h_GyZ8DX9!trqWqSp*V(&ib^ z<&Vc?AJ>wP&acbm)FblT@C{vV&D#&&Q9SEgwNQerF#W!8cI18Ba&iYlv@00_bDr!+ zo|e2vH1fTxfE8e7)=7Cc@9zp5xE&-#{EL$>H`Z;gVhyq-M=ps7!pa&|Yta;9^uuCU zI0hX~42A4Zp!YxG=66E5*vubla=Q6sG(lni2yoMBoB51lhmNWS!k7S6ufHOyT9$pA z5f*=sznpqs<8}R2Wn0lqE7WFxSQt*cl)-scJGgl1+g)ydBy#3*1|`r)AQHH4jaSDm zvbi-YiAFOTzSoV=&07P5Qbkx2*U#SKgs$^^+uHD(*CU=%B>M=w|5S9_u7LeJ81%BI zGMJ*icv<909AxR%YbUli-Vub~!P+c?OF2xY3M3^fz^I4L=CLu2fi2THaHqi?LOTnJLm-N-CoWdHQ60d$IMd*JvtRj?#HRznd?RjJw7~b zp)3rneQ+kvpfp3cjAFr#-J=y}Zs|!9042FP87jp5S3~;WQ$|*ZSH5PWn@`hav#4x` zJHk_9_0i1u>%6i#-i+Ri9;grmG=2B;K z3Q;+Mf9^OG5G1#%!wET>?txfkJ|rhYN-U#b2PuQg0v+MzQx&!rM04+ZW9xCm-?iAe z!|89as*j5*fH>f@gB~;Ibd26VmnrnQ8KHZ!o=4*AwbVY!JggOi$xWw!`AonGZdCWvw+nsY7FZ1nFs6B9Sv!}zXH$W0@`#50bb~&_1rNYS2 z7mkAH>8k*&SkmGiJoK1h5|h+=OU_;sHx zM)3~W5ct5{xjONmlDO@$@V<9HLI=w{Hb?XV4;(6^p6T zmEHto?gt<4I&&48>>!*D59CNN33d3c-UUWJN9b_XZcWBpCh=QB@apV#vCHZ#ibVY2 z*=tj*cQ(Xv^x%vxbuxxp>g~z|9X0;;x+gp4^NbcDo|*n=`st|8u$-$L;d=i*2nCtzGVgbiq1V7obL{H!?#M+dSq=6&KgtxPH6%)`P4kALAu%KL#q(1{ouG?wIczq$idNwmkiq+! zQ5^r?RzV2=5T)?3S+4jC8u(8TfkvA5 z!6bQ`4RGY+iiu9*vzio2Yz`d<`_sU*wPfq2QUqa8AMe%3OEhh9S93 zThr@EcIUOZZ4SVu(r=&SV>pSKl{C`Own07I)dpKQ@rK&2CtWpY9^7zI@v{PwLVT%q zZpIvIfM@B4{)kwKOhDKsAJW9mo+Rn~TJ83ROQ8E+A`URt7bz2vZS4&x- zY2!9@GXE4ISrB>T)RZHhDadKR3)|;*BVOGl2ZkQ=ifsR7zk9sqDwk6b z0HV&d3}gqx6AYz&lpe1!XOKx}f|kXZ$>%5CfDL}IU27L64w{@G4*Nb|dq(8d9u5#6 z4%sFEnV!V;*{|(^*lu40RbJP1VXF#*4{q<%*=^Ae=cq%e(WT5GqRY$aV5;%1xkKQ= zLQu?dnf$+?_#=@?OcY<4Q7ZeI9dc;AMF3|r!(`3 zl>~S~+jT*T|5IiEV+Z&9{l)}Qdv{|Ct-Fqkl*j+LLzwscKI6-o`0L?g`O~+x#zYCb z>~Jt(%szOmp=dIst@W~;eTN$$m%^@Ya-W?i71!|NFRrBYYXg3Z`51HPV0=f}U`k_J ziB@5}1GS>^4vkK5hM8*lB1rx96$1QRvEl*JEHqM`Iew6)vzAGJNF9u6ETh%}2T&_k zw*yo{?Y$MSm;9XgkipIn7@(!V6yb}A*W}v&*4=bhs8@oM5Llm7}S)E)aRv&b@s4lS8D40R2 z8Wty4qLM39^97{~gd1wH};0{2Z7TP%m z@sJmv0TwdFUHO)Qb*bZu>D*p&iMg>kgS}pm@grHVi6z;G9B-}0{ zWl*ztq(B%U=IYHHe@Uv`P8QP+osul*^q_!R#kR!Tj=C`O&G3egsFJ5dVgXF8nm|I$ zFyb{Tq^i2JNT=!-_i*5$sI|kOCb~nVp_pF|UYd018Uza$1q8De5as^%j zTByy4_`(n7=x=>Kubcj(9gcVHB#1QE%X)X6FXyH1ZL=YehhVt+oQk!kd{6J_1HdC9+Qh)E=)P z7XA89AmYp8;>v#cG(~cAK8;duT+l)oWgWJ1=A0xip`sF|(iLV!)$kNhepE}2^Hr`g zTZ(E_af-AA>eT=@tf_i8o2O<3^IKLju*9-h~F1BJ(xt>p-3 zEs*@mbG9C(;_^bX6T45BBb}(f{&V^NZ;t@Ll(mVS9=NUjogVmTi!Zgu&Cis6^vRd1 zDqMI&z(;*MqV8_9^8XgU%u~uu;R((&C$bqu)D=&C*7WRH~DqQCA1ZG z=v1P6Xx-4$f2g44NK|tMP4yHzs?^Acs-ztE#x1QYh6u41Q`RMellszmwPE6?ipwly zQ^(r9iGOC+`k)4Osj6(m%&1^28kpK6G%u>H@*~c~>>N$UTN0;En*|B87lu#+x$7k> zm3(OFMAOFkv4JHfO&kk3KCrq{6P+p+ELHCzc^6gm&Y{%?yKFxh-Bo&NXC`xBEiI7UG$QsnG`uUiz ztiOoWUhXRVu)bkjqIF{W=n-FQ#|HEQwqdRR0WN8vuCE>K_KuC5-K91H7sR@yWIH*u zXypmvh?-&y+}_M#eIEaYHP#WFSfNoUif>ZNu449`uWJAd?>N?>3k7E+D2-F^`k_Z_8Xys&m^LDQ`a;>P z+f+L#b`RZJxH#lyx|pRhbiHzt_$T0TTa@;Zrlh-H4$v|@CwVXu^ z)|NCtDRbom_^#wMbCwfQyRADj&PD^lqCz*RFC`)ImC{FjQO<7drXw%uA`d1vg1&%h zQ}ODD00kb$84Q%;a|j3*Ey6B-#PSKDcEm!-IsvDiZ#Sec_O9W5bAaPysUaz4ak#eg zVY_R_po&e_+oK+UcQQP0oZ3bZ4vq_V-Z#17RdPF@sZn4)}-g(o- zl<1T;lQ0y3+iWiYm$bFbvLM-iY5-UuYN06pLWD#=gp1YV%B}FTsc-GD_(V7_E-<{ zcK*pO8=6>|%e+IItuwqsy`2c=U&4ebrJ?ifAq0rqj^7D7XNe6wxzr*ap%<_#`*85jR}I zYYvi)Q~tk0ryTJ4{ra2PBTRn49RO#?*P1A6Mo;NDiU8er6{qYKNoWAR9^ z&aL7xFrZu)0Ids$_MhGft?@q|UgU_40FXYv9_ekiyanu8lpD`+n8F=7u+Z*o2Zp`#X;-i)#I<- zP1G>fVg9JGg<~@v*&f#y3QxC$YT}Y*RRCX~?XGdBgu)H0Iu|67-gh#fEg57Gz-Q7Y zudY&mG_Sov7D-J}{jR`FKt7&cU9;Y6Pwyp3D8*s|(!+*{-LdZwl&TuAY%+jq$^kl( zgU$u?UlxYq!)Or}e}aOwrfnDby>8#bY%P^IaSdtkf~$y%%sM&;>6Mx4jZQu(t5otd z31C#W(nX6%nypaSrro4+m)?@O-%(8PQd;tiyhLvm4hWmj(FJhmX%B1pi}IatUn@0` zW$itW9_EKv-N zAaidnU)p&{;XmStXS61cuarRVwN${kO}&=7k4xa4E^Bbbc7MFacKewuCqyRB<~?YI z!pT<~b~UkuG{zJyiN)s9sU(eW6WbvW;pCbZ?kF#sU4`avpd`R%ul5k4rVb_4=HtMn z*UjYE?U(6g`BzWA7#76$PfL;qqSobKOH%SfxIaC%#C{jCsmAiVZ@KCS_#~8Oua_kb zBVu&}VDZcZmXXRgN0xZW?91_jjT!}x^*-HNglJ)07i@2;?7@jI!dr^p`pQ14P_kKL z%&D2ZwHI+bH)YC^ebsDA>VEhNI@u}kM<>SZ)!gsV7v2#!LXh*+vK=?zzuEsvf&;4_ zm-Eir?zRBcPWz^qhaS~gc|1(KlVx1Eva~4Vc(T#$7VEGKn6x!cuovghfPxgA##Im?2St{zq>}Eg_Lp=X2yUAj@CU*7v?(2LmTp@%FiPHqp ze~J><+aQO}3^CrcLEwFEQR|%p;+Isp7Q+2{`9t$wFsBWB!;-CFstocD0#pKn7xj#Dd@XgYrSJoNx$j z63e4{sv1d(2}1FwWR>`78fB-uTp@#bDvlCpog~3gbEv%=38o`kNCnvYk1gcG(V%|3 zu0Y|o3cW`E9+VlCUYzjhW(8#KrBn)SCe>oKT8`ENJI*3GKAkw>Srm-y&r8fvZGXsy zi@BAG)GvcTF>B6oqyec^f~#LGi@@RDYR8@av6?RSoYVRP zp|W^J^=?Zx>1Kx)P>y57J|XetvRjrF^g69ll{DL2bt(MQze$KOFv$lrR6u7(a@kg% zGZe6vkf}QEZGA#iasb2GBU`8}?eU!-N3c9+GXE-t(}w%8VxT`g>YrN5z#!&>?PAAm z!$M>j8=M&NgsE*k_OBklJvWakyQ%EwSDwjzrj770Zq9v?mg*kjq5SK(Jx-09glMO3 z8=cVq((vN`qlT9ciP1ypEnuAdeSccP$Yi9n3aOAEbk+zXBqStJvu;jg>Dx!CsUAyQ zfH3yMC?1DYEH6nU)Dqsr>YV+4?1ClB0{sp~LG;*y1ej zpP9)pm`LY8FtwXy*Xj8ug`DM(^}D}fH&iF+{5!2~+edhxvUio8FLmi*evmX8)eiW) zeZyi|9Sk|*;bGF0wmBv(T3FK^pJT`jalf>B_CTj(VUt?B|7@)_Se=Cblgfub7~N*S z*(Y=j*sgGkGWUdGhxTQB0+i41=Qc1Sdq*50`(*Tmwj_QwD+iD`_FWSh!UE)#u)nxl z+JuN!3$CyPry~>jTMR)s4c@((vh!8^{%8b zl=Z!~Q-P$?yKopbeQE${{?G-@Tfdz^5~a6$_2kK%*5%q&XmxU&9L4CH-S2qa(5QKK z!LfzTma9MpRNsfpe!#blY#GW45KdIn8sn`0HH4%S zAKaE?io7=&Od5?bn<-lU4_3r;Ka9p3Mh3Gn1UFCQ*Zxz`c;Qo}goq_f>>Itzw&91p zQQhA!Pj?%_9dDA1z5~XI8~va1*AEsy98BhUmg7(Dq6+wgVew&S#A4=%hAW*HtTlKb z5(w{Hl5b2lUU@uGA_gU~nGr9-;e|4DO%YqCs65_10OY>O6iOtvk_6G%08kVlEvb(|Zze#n@ic+SZzr5e~xfV{)7C+wNAr3GL<}RO}e8)(& z%))v?1e^`K&iRW(wzleA-VCon_`V~ScO>c?Wkp);(3d>Bf}PJ1LDC&3Yw98xMov_ecRO)2r}R!UC6&G@vNfjk5qem^`QwmTveHFq0ZI4T+_7|YaI&!@%uB3b!1-+t0^o1eT6qCnot(YtW0*8R430?f zF>0j3Za5aTbk;`X4npt#>6|UDA_mGt8coFa`5`Luvgx!j#kJh)J*UQ9s{}T)7oC$JRug_TD=l&6j*t?aJNPLi3+n;bs z!PP`_|8j!ijc5n+T*gh{5(vv%p?qp@`!+3jJV9P-EE-Q|YwnP~GH0~!bom=az*-Qt zW2@*BB4H`MatB!@QCfq|lBm;(>gap)nJ)6uYnH76zZHG;k{KbB0bME8mul?hHU#?* zUK^9Dsz-%tDq{gUq6`YkW>p@xMS$tvcgzvZH0n}^_@m+(H05@*UUvDY#eqq77X!Jc z3%-7>J*++89H^8}GhN`Ur2IYmi)|VatMRu;di;GqlFeOyLRPu|@dC)2KRX$yzvHvn z4Ucv76p|G{#HaLdl9V~E1(F|2IO%yPx0(awiC;x3I--dR4=1NYqkoI`vDf zN6h`jy}Hso8Pug`ETQkP4qmQ*4H1b~<^Ya+ zj7v|pJ0FYDu?jlYy^2{fc=vIBPW{FOw}OwWCU7Y4;B!oWR}8iC>7+&PA^dcrIny(Z z$72$&7s1QzSl%aiZ0U}Hws=JUb8H^_f)MFd44ylu{Ix6ogu!D_HJ889h}03oZB9}O zZ&luqBJZ~7D&fLZ0iWAX;N=0g&I1HueX=RV4%?M^Pk*92e&X;M2HE3^3VeL1xAci8v6KuI$29$I`3^z)P)N@d7Ok@4>1$Y8 ziMRkF=s`-Nh&=Sd&}JSN)`P};5gcn0Zqk&JvwM~7h^dl1C=lHSPfPGU%=);u(EMmL zrT2Bbswb3fNmRZb|c-s`o_%8saLgKoCx-z)F(0eBCTS~MZ&@VR%0n}Dlja5Soxta+HA=n}m^cGx%YgwB1tg(1b#%fQ&jizM6J1Z96z+aw;=tUZ#0t%267jAl}G|;W@Aq zD`uC>k#MXIu|wm;UL6m6f32;E|brd3q|9SYn z(L-EuG(CnlS*&1?4sn=-vo1)7+`E_Va6B$~3#5Q#-48YWc~o~sS_xfF6V3%c-q<=S zAKUCEtKTd&pJhdJ4=Xfy?$j~1n=ILg1>li~S=4I}dhgVncG242n(4)_8-g*wc}#sW zNrnsZx=pS#K>STUL?drs+QSg-2A}GF3WDwvcEp#<{ib^Vd_fo_psz6d||abMahkWR#Mr|_wDY(mf}U>Po_n{=Q8{j+ZKaz6C{qW zJ3P#Clr&~x11zuEjRe5)Jg0V~I-L_F*EP$|N-gmx-{nHhnhu#MZc*789YQfyZH4Tc z0{#|Y+YfHrt9kuQR%R)4=P6eC+8wS1zlha4ILjO%IX_c%EfpI08Zj>F@5Jm+A6qb1 zKdfH=G<5pXl^t_Er-neCHtu0wU(h(6GN_8rs&HfxQm%(6)@UyU1Vx0WTX>RsbR?04 zDP@-qccYs&|8dA4C$A}k>=%4b_VsU%^LivkYcn*kXHQ7VxJ)Fy)c$12FJL&eVd5Y~ zubPk}M$Kh1FBq0jEZ^ma1%V>oo{MFsI{YBhJcI>A>FJvLCzGm zo3Q8QE>ZyD2ciD7EJC+aGL2a+K0h#+Ts!mS53AT}SG>r+lAK)Y42CU< zPlji!(?f}(5O3T4qb#dj8n3ku*kJ@{VWMu`fnA+AS2xic*i^1cj7CRVsk1{-bcq@Y zF~C7Bc6{_K0=(>wty23jU*(*rx60k5ly;JD)G8LfHRTP{tlCN80QevKZP1^+o&lCV zyN(Nh*9f0ETU(Syf?pBdR}x91UWw}#q87`g#+s(Q%RwQVZi2_-J;>?)oW}%&QFYrc zv+~828bQ-(R#&9G(ohGiOD!gO0D;YPu!}cG1jd_nTo~Q;+;od|AeY=W=m>;A#lHb1 zYbeq|ldHpl;e7KBO0|-5w|?06poU(P)k))}%b3hhgob zJeQ)|VZAtBY`M)3!hgTMZ*K3Uh}!g8x!rf^D*43dkqrayt=wo5pGc^E@bHWVe9o!9 zddp|lOe+{+Ufn(3;_H269o1u`Oo})xk*o|bj zc_;mJs*T8ZY<^JQkGTac2=MjOYS&NLq1yXAl)%#&!Ld1a*ejcy#mae@D87$vB(Lu{ z;Q1aGWO9jv+xUDfRt-SG*bkxVEK)=5oy(5LVD zsyVYhRhW%IVG7kE(iB}N!G`=;$4K9Pdx+wF3hX-cnshmDlYR06XA`R3iHZy(E+HFL z(Wvm^3s7`OOdVQ=EVe*N5KEi>7+%r#NgIJ-{}bu`{Y~Rqud%c!X{oD_V$S1j4MY8H zQmqG&C!@YW{iqOdnJ^`DD|Ltzm`pZ3y>_=xlHs(TGNkaNRe!pB4+L@=sFY0fCQ~N*xxG_*QjZ_L?M{5r83R@m{pE2Yq{NTEJ=QJB4HkW<02&E8 zd-j)XX@{{GF`NsToMk!f&&YAe4PtGxMr5?)0rS@=gQki3fvAO}ILTLPj7lMYAZ?m= zwzK@WeilZPyGYV$V3QY4#$70rPi+lVdLUq#_o6pDOr)#$q3OMN(oy1a1aDvjUrGE) zAN&-v%lrwBpj=luu-*U*HBM1c2){R4fm0$uACe6o{z>IyxRu+`{%eEHn1xM54D35)V?# z+5KXjH=;ReKKC0~?h*icao$`cTU8}yKVqW1!6Od=Z>Vs~~LLP0sd*7W}&BbHMw$}*wh(13g@ z;UlMhlkLG7>-ETig(^h^@4{K;7@)E2tG7)DD;Nw9$WJO{L`ASE@F;#Hoc zh~g?WKquKE<^EE;%OgjmT+ibx9zhu0MZ(atCfC1a0-G6@Nj%sa;ru}@1(*rIIWzkwT!lj5eR~&tV0+hbd zQ@p3q51k`$lmRP{-Dd$f3hn#Azt=|KnR8WS#uI_Rz^)KjU9z|4H+xA7kzkaMM%N+| z63{UeA$RsS0)plbpZ1wTCQxS%>mc+3NX$l$vDnHGt*opJcF$Iycv2c}CmroT;epL- zk)n0q6>p$>rJ>2#d0+3hpnJ}PikusQHun8?!!2`-no+9i>+9=ssd*6)`dn_b1ch$b zGko5Cx;qPz+L1nJ=s^kxjE9M-7?HFQ^?PQyNEK>CkahLZk+#U#ZP$YRL)E+2)(8iPw~fcQVf}*(?Du;YPR3=5x>f7yR~VJjjnBm?I2$ha~nnkO|(y z7ZS^EVHu1cT+Wt#v9t`$EP*txt!&xS$3Lk&P)3}b`_2)WobdKO5krZUU&C&LNYeX) zQMH@U#7=PHK}+%(yuLtG@wH~C-P0`HvJVzC)YJDM95$T8nTil_eF=#e92Df|r;#O} zR|9VgYf2vhM31{yVq?#U@$o&oh!a2CZ=Udn-l2dUs^%`}brU@dhvy?yWSXBcoChR7 zf?(TO36Wxs-@W&)C$A6o$0XRD3PIX`pQBqU zR@DgL1`;q25FJ~4YvT=1MDv5McAG`sR60b6J-LC$ENZ!H=f#%v0=%t;Y`%9q~Amtelq-$GSDg> zfo-74Q0w*Lg+;m+_}W(G`anHhq@{NTKcnFtQ*X6c!C}NLB3xmGeeJ@geyUUSq^qja z=8U>o{b|a~MlAb%@kTOJ{Bde7G0{1b>F_*^{+j9cIWSDa%RNhpn#Iq&gQ+Z`i{&76 zmQT-wko%yH1H!OoR4;`F6~&`s@e~ha+Kt0<4?Fva^0)A$wTm(KuO=?hKBb6+ABhW$ zoq8e;zCRFnHZWBi|IY#I-)>Og)O8R2zCf1xtCf~uXLisQ9_l8n<`TL=f4-Y>}Vz;&rKuEZE0OclNtVG6t1yh9(FZPsBb@P$d{kV42QOR zJ)Qwir`|ajoz!Q;EjF3+si{u7drQHQWCs)3&qXtfGIMfq9rl$CX*5}7iJQDp`_ARO%iSYK>1rCClCW=;|FFi9mePvm}0TQ>r#o zdc4?2yuhujHiZQ0E?whJXL?VYvFY3oT(jHmlaDMT2#%nh%jFx2Ac2DF-lqBNO_f4P z#8c*g9g9VzA`A3kBUvAHWgbREa@X=Kp)~bt3}%fuPOlNWav$oCm<{_|>@B&HlHa*N zRq4)%tT=lr!LxrsS>b!GL=dwCBec*ELw)E)p-E=rcNh&lEiPi5*7@lS6Q}di8EYl8 z?w_{2aB%9+L0c1`PIj5jYMY53Wp^?L0(P-eSsZ{22u(G>>ro5~Y`RR3=LnRr%}BZv z!TgCVeAJX~iHi^P>d`V%&U^^YeKXxH}aQsChm~J=`kMe!B0pgrG z2SE^*#}lV?1YSI@AFQF$NZ^_ZEmE#E;DDWmgl?uz8bBu2*A_9T;0#D6ZNe_v~}y`Rhz$sDB6GD2|^UT*zFmvwRKdi(nQ6xdgc zUz&QaOPdi)wLeO&0Jc!C1m&0;B&L%?uX7b{=J$aQJ6!+uZaZOkJ-#5EtN4QLAS|$X zJQPA)t1E*}T5IZt+=gN{9{pm%=$`yW4G3p*4;6JE!fOR)JU)ai0)pGEfrr{ec}|X2 z81EaA$D2QW4#ZkQBYK`3lSPVS4=V4v58JpsxeqZKpdglrAYPHvsG;m^{DEBliH<~q zaGlboLLdW&pCxYf8Pilwi}Eg~(f7U1lt75NknqS5SMvJgs@_BK zfkJ7+kku+@5sPuqea5(L7XeDpWkX3Q_ajQ2yR%R2x0~{lPLCqyAnf+@@{3KmiO41VWZIkO~{h0i}JJ??a)4iW|9 z#cObJVWA@5{o`M|GJkvZt{mWfilIQ`Es;K8)|Y>BDm3`|lyp%x`LQu3{@5?!n z!@qJz_{wJ+hV=J{}Yb#!3i0OKcal zon03Xs@E08Fj75*t7^qooot3xmR%NKmMkjX0@xD%h6%WG{d@hXVl4)@8`pHc+O{*e zRttPXjzc%H>8M|AQN@=eNxP31u^0qQzaG{X1C2|DE_M{Jky_KwjuQ+>24e-|`zw)g z|M>F%nx*zxLH_xG7^y%&vd2J#1L413zPCcAm$=wkgRcwFYPD)ZO7(@Ea${{EXo z=O1@_jSBEvv=2);=_Ax#a@@IRUE5uOBb+$ch zq`#&Zq57t;q&r78v+cf=Hp{^ExKN)Say@acD5u^3=gR)y>x`RJQ$8$2)X3A_ zsLj|pxRoWUR~lJ4Z$ZIVQ!giNg+fa#*}bY=NGK?Q3E}eXUELU9Q|fy7Lp(x{$LtTNKX$ro+aYb;%;|2P0>)ukhED{QE^Y|{<18M z&j&vg~a6wYZRNo73BMvkz%jqeE$EoiFU5EJzD{{HB{b1v#t z$DMHGv2^~a`60qLqzc6!cF!wio=0b=CD+uqES(pw2Sqi%tz3~4t0>xjKp-Nu1Wq@& ze0%4Z>kNw%obUAkg0r?TVul7=c;Gt7s?+WBpX(n95wb0v5$u!a{3j9FSvP|g3XfSX zrqedN+_CMp>V=d~e_gT^Z%cNy&jPzdD~MRPZ$!Jod65>E&mBJ*Aw^URfo*Fj>HRcS zoM0x1GmS20I#Ko-lReY~MNou+Z7-ovBQvD)1u6i9?&NQ4_z}$m?pP49!n5#7gVeX0 zC?z|lm%`&I2O~2v=oBMP=Ek@SI6a%(g{S#HzC_4on_@8+sN=~UAK6)x>7QRG`{EIU z-`C1pSDPxWZlvz~g46(@{RD$E-^HSy=GUi7O3>dY9{Zn;KFm`y0mimYw<)Bm5e&`? zvPj9yGodk@+Xpp=jCl|n(40VH`HPO`Gudu-CJ5KwoW|WYAXRi*gIPuU&^B-&Nmv`S%11hyYK41L?rHL z#bt&7fAT!)-{#;Q6eY0fJhhy9nUuSnogo6IcY{{A?_CLF0j`=D^wZUh%)dDB_DYe zZbxs{g@^E@&>HpI_9g`(=2Gp!iL7g!C)=Pi8ag zv48I6yfN(|7M$XG_IEqa6lbW zxNYCp%9%$J37N*wDaaEX+>KSZm23~WA5_I}d^F%`jh({-|ka9L~XnI~?rUXwD(ca8YK;C)94y9>>(T6Vyr zTbI43H>pQqYf4+?-X0Lhl*b{689DN&Ih0vn%e)74L8?j}4~CqlEXO~*Y}n`O4L0sg zwQ^{+x0Q;LjxXU$8k3@dNcf4!YpF~H3D|>F6wMMo)o)^aEzv-4{m`;9ljGsJ zcV_+MaTds1fhhu8p&ovPJl74@v5^6>Qs}x`Xb241LYi? zKzt|rc_Df>|{Q-b}_TG*EL(bKg#Tl%MZ4+8E=vdNY-4m+@E)A;tam*uMt z_$u=|qF=W&uDJFD=;-Xh9t1b$D6L7nF`2zNFGH+DyKSg1Lv&MjQ**#EF$B|b^5<9i zpW1jU?^|f_l$3-o>JdF@NyBv`5^5~BhRKBfcjdcAO+%nqob4#ZLE?vv_f z!XP3dzI%m0s5v7EuVMlig1-(E{29og8=NoEM*`co*1Pzfa-_ZVe=n^a;SNsJHp&sX z#e5?VN@=$Z$AhUmS?Wow!lh+9B)cKmp`K;z`3Hfufx**(?nu^HnFr zqM1;kScz@B6#`=F--+4eHd`_uPERc4q(DDXeT3?Fx3(^M8PTfu-5u2mWJ}No1hq7! zQG?^r_GQQnaNP*q@WDV29@(u^uAe|ae5`<6=<0|KH=a&g;|=?(6W@U$9@RBo0;xiR)KQLv?DiwtcjhCKgVT|$rvu0fK@r5%#+T)4ar*vnkZ zLgU2u_LOs{MlU}S4?TK{bu?w$9PE!{r;7DzEqVFeP&0&PABNRKyetkg)M9Na`CPoV zi&z6GCY|?In}{0ijDu8=8E0I|^lC3_iz?-Op|n<%h>u#F&pN0L!Ux^LVU=yapf(Eo zPp@JAXI%L2>sG3_6}DuPjbcM}=QHp$Hco3LIyh3?98_8Fe%+|wT39TtQ z09D7_*bS^VxrQucPbb~yJcf;fhJqfwAY{j()Hcx6Mkz4eR_}V0_b1?45+%BrbNMig zMiTjpPJkzGQr(HSa}~MnRsBctWL6p~<~=Z@K1wU=%D$dWWrqGb5*NGgG%H`S*7H-_ zGM&cr&ia!eE3|P4=vJ@#T43VkT3t-Oq_2JQ4hN01Zcc+n52nu>U8|_ax zy5*wRdx1Whw+0tSg!{G8)9t6{DAy#%5Q;m2^Om0W%5!mXJ(U}C9L)YA>ayxfx}KE% z<@VWbpW~gL=pCVB2Q+c;d%<*`u49M@>)R*G1iI}*cjaZ=8}+h)a9os3$w^2*+MPy# zwup33#nR=GoGOZNqn=WCtg?TWjb!jZZL?+a60iAsp;OT<{7h;~kY0&ct|XfS^d z8UQz((K3F3zv_BOhbL-r)kxuVLbBlW2w3-Vg&|;gYUSO}2W2^AH3v*O$DOQp1?JTF z+`^0R<#nba(F=6AWA^l~7lsRF79d)Zl>OqJEah}jV?7of5r-F?iPXsv z?%*%{)#cGT_eRHx3q$Xljb4eW_opECC+ZK~r5Njksnoll3y#9@buSXU&W2L7 z+7MndeHj5nX`~Q-#rjDaE(V=uFW_>V(d^V4F9fqck?ZGb1LbFy1|A9ibv3?+WH(45 zKeH2(t1lRetu9BL;?dMTL+BW4J5)I5Gx;YVS04UpMflg_4ak+DHF>|2NeN9ayCPJV zZw9dNW$8wxoZ-x93u8f1i}FnuGFE=%!yCW}`k3I9JZ3OBlP;TQ=ZZ=l1^?X4l_@;# zt#jQYKHJnr=MR?>!mNr+Y!(N*K}1S>L%{9dw4o!6^`b=(+U)nXYg8qGkK_?(yeD5Gsduw^dIa{_;Mc`<~_FZaAzz4eYLY?4@Z8V_W)5%8& z3fA`9yW_dBQxP_FCuR6>e3N2bwU}3)A~-B<<9%+T6Th66Ug6Z?J2qvCuVqS5*%U)R zB$u4#>YrRGPe19AyG77GlV_`}Fsn2;k?V#C*j(18_bf``b=%4W1F}CPHBC4kORlJ@ zOPibV1TuroIGL7Z(q%%hA|1hshi4XjMEwWo2wmWILV!ynz0;l3m&7*s@7Bj;s6W35 z3iC7cG>wF7?pD}%ArvZ6WzVj`9Tupef8KF}$3xGQyw4LS!PlH}E9PlTICRhot+8mj z>I!0tAIp&jgFTv6sI!*g9(Pl2V-f7;k`~|l1QhxdU~3rGFsIQ!3s-0Vv|xsq8@wE$ zaa~IzD{)G84v+b~xtTuNy`k`I-d?0#&(P8;L-@kXO|GilI00qkD>-B9~ zI15g1rf$Q}88tLX*ERy~;3W=I0EbY0S1bRSTD=7g!b6qBq5x4`Mox{pI~2L>7uI9| z9=!9-6Bw)cLO38Vtkah#qEt0Znr5Ij$Xgh<@+tX|y9gxxcm@~7k2c)`YL4M=A$a?& z#1DX~rmh-tw!VQ@eKdyChR+jnQ#06ZdB-2pL7Rm>>|%-1Xud*>FEhX_aw3?9Nm?-^ z8H6a3OT%{}7;xfK9hv3Yu`>yykV%(F$nL}Bv>|plSqMRK1hLlN zG{=kE&Gmh;j*GUht@Z2`W(%{U@|C&CszL1QK;Irj?>iIFnrk|B+!~I?ky3N;SFUsD z*DS=x2jlCy=NXJr5hS!fS@&T9T#3J~ThhBOP#&*uZ4WAA@|yniRh0+~HjpH2Y~gu& zCdepBfp)t)BXUS@3sG+?i<>(;X9+R*G@E5u;&Imh^WCPuYc>$iJyfrvLCt=x6*cR& z4h;smw+RxciKac>qx6o(WVmt{CfIS~72eB|CaX0*4NDap&2*eB#5~$8N&YGrZ@S7N zb`~v5X-N$S*f4B9uvk6sSRk!`X(xlq*C(K%(wd*^Q10eX?TH?K7+xILYgZw)4h!RM zu>E!v=&^yk1m7o}BCt5(ZVhnKrwZf+m)z90^=FdZ?aPUc43mcXdl`h`;k zS96=l=uX=hn&3wu>YV8iCgBp1Kfvw!f@|xk;*Tx`4v0OyujDJd7Zum23IpJDdOw`N zTHLn50giO21j~h)+|Y-4nC}bCA9hQZgd^ak#w%4dg)t&>#7Mc#aX8!%u^&*Su&4Ny z&QVb)H#KWbNq!DwMgua-do7jot=NOR(mN_IaG5YbX(lY<1qPl4KLD_(Bmlz!q`acf z8U9+qifoVn%-;>(n|tUO`lC;#%bZmA_Rd)S_i6>e-43s8;&wLFXxg^qhIT8?3>GJy zXm|hkUFa*P!&6MuQdLeAy%cY@@@mIJYGOV?r+b1kkZCe*Oum*aPawvR#5n*upJq8jN(HIj?>~atdh6M}b3|qj`?PoR|(WKN1GJ?IpGZJSf$o}?A&0nu_sds=S zITUCigmxO3;+!x>WRj3$8*y}dQ?@uYp8Lv^EQ&VAFwbl#YT+7Vvq>hgwmz2{37{8WN^s~o+ z%!FuEWeptZZm5;QhGXG|pAKAIbM&BXDzJp~Uo^%bfJ- zR74``q_b~CjrW*R>x_R(d>F67K2Z%e`F@b=t2<$FbA8UFo8NEowPboIvi>%%)=B8k zA`gLJ`_gNI>+j-wDr^XN{AtBu?(?rEcVVf9?Ho-N#`D+XOto zmo6{?C2`m6FpNqgtxDZgFDH&LB)vRrA|jcg1IrjLyQ>_zLS0P~_Z#HiNTf~JbMoxV z=~jn{Y7R#KVo~KX0smK@fQRP=xW!QBO1hIBo;gUjr`^`Wn^f1{<)+(JV|6}ZZ-nUh zN()MyfJ%GN=X7&gxtR5x>{xDjp@tJEG{C=?dL(S~FUQ++T{8eK<9 zyR;gDmkurGmld{W=nTYtxDB6KZe z4?3Oi$xCoI7T7(GXgZ;n27y*&W%@dGVsYfu-3aU5WWtD?>Fm5JM9|h8)bw^tDvvja zNS((_DoNvrPOnA*4dM)?uob}9DA6fnKTKET;!v(YkHexDCp*@#)V1HZb8w z!z+MoLvMb7@0t$*yj45DIY~HaFv%Q$%y;7>NL`d_UjlOnI;&{&MRRJ{%!548klv^L zP?)@yaI7PkfnJ$+vm`gS9IfLTm`Y=6Dw1-&3arykhH6OcHc(KXD zvAm}~MyoH}?e8udPw2dpKpXP%a&HQbmr*u<+{dUs=0rUCUb;b(hYyW06ygL3boQcS zSq?S400KUgc0r+^M*hB4x-q`xTezl^vbnnPw+Fi+XzCs!H9wu{P4C_@R5qx<+7>ES z6*szIL zJx2HJKuHPX%n(M%LOU(N(*jvZK0FRHsFv*B{Ln}$@FtNx8>duwG<_b2<@Q5_%jbtM zb-4;R;MG^fI$mInMif@4us`Na;jF^npUCT&*ftZ{8b^gonikl-8J4?QRH}d8gOYx2 z1jRQ|IGpMBfe{T-Kk|Ae|9$x>=XV@Dngsffw)#RP;(={cSrrBl!V-skdYm2S@37;5xA6(3k z!m*u&lAb{dI|4Xy@cG}Q{hkhf&u0*D!z8YG%-=C$!w}4`;h!7~6_t9jV6v%_OXLj}J z4m`00?qhz47In%t-`9y=iGXk>xObd0zOJUz$)qiM7-(Y{7xG5y+&7B$Rt z&bw4&#P=ly;BbR`qBT|ldwpbwo@aF~ak6TDOT;PC}Ua24fB zZFo^>)F5q1!Cmbj#LU%RcsBYRdrm!Z1y52|v&?h3DK#6}fs(VYQF#{~&h8*?XYt79X$Xjo`apsr2<%q!-0Pv3 zOOkV+UUak)hbscwlFaT;p)|X*L(m&Z?~BHAb0IZHG!f-wC8(cug0;H#nRcNg-cxFR zu+H>nsNNj?w&wu;+HU?~9Xshax+hT_GX3HS@@4PL`BgQpH>E+1H7j;wgSLez zk^nKbyAgX4Ao6J}r-T1X(hSNl_OvMTxr+(8Ep9+WDr%;rCwotMp9)_(n;&i4b2zJ} zTO?Bvgg^XVkZ`4^(!Lx&VXgTqR!CfF$B26$lGQdj)mJ*NaEs&&<8`<4SoeDD{d6vC z&EqQf1Y4l}QbqHgi~N6@2Y>bw)ZSWX=by}ic~~u$y;zsQi5x-;h*duOymxOTmZEZ$ z^ck@21ELyPE$O;M|AvlMJ$gA`+VjoNkV#-DTU)9&nm~Lg`TCubjL7LLHvJsJW&HPd z=GnUISL?{V6v-Y0<9$`T#CH4V@PMI<-8|ArcF2j|o=UM=6;|KKa@W55VE3j(VPMki z=}<$_nACNWW598dQQ+o=w=G6lhTA^zLW$jx3WK#YcR#b)B8-f;4=Eq~_oaHjVpS$R z@6~re53xjM^BSKXmr3b4kUSPz?`bb{V}$c4W)^GBG^pQkktk^`$-Wbg>KK-_s4(u0bJO5dd(w{sxr+YIVoTIWp16 z*#V#D=0fq&M;Q%0(=Sa&fOh<71N2ey-?tIcw{3*3$mE;r%M)0m%l)^JU<>g?dRAoe zFM;S`ro_&bq)umRNFFMc;FpHxf?ep_^ftx>^}(~TL|uJ)56x&+<#hp;uhIn?a#+uV znLf4I8i_l1c~dlPVE+Ax~%xZM8OVVoU3AF)$5>ob&R z{%v$&AE+Sk!qpk0j3@$aDMyOq@Z}ume z8P8s+JK5he*^M(oX?|7UZqy%01=aJvhQ??t2)Nn%sm0w$Er+jpbYykCAXRO?3Ipi8 z@=xu-pB*g0a#XrP+pUeHHr;KWF)$Y@qf`is>xVBh%C7tgjcJEK1On7pcoy~ia0LGd zb1(RkWEH_|K-E)TaK)vI#u_9Pa{}k1b^xgSiqHoTAH>-nj-kz*tE$WR7UN};chK7? zWjW8TdtJDNk7hRgnaXYJ>>dvwc@a3IX}ndf3{mwS4eHH8Itx3Mscl+}9 zApOh$IWk)1|6g7?M>x^J(r34S!IEuV^c@^|iyn~Q`S{Zp^iP_F$A;r`zq## zfH0PmN4_!J1OUXozLz%JuU?-O^Vt$WM~Sp)w^@g9H({z?#xb#4zTSs9%Ov0XY#FdJ z?oiSy%aC{mC5hg6D{k?|K9SMiJbS3bdtzgoR)1d=T5-mNOR{JDzT8^0S`<;WONR|6 zF@sw44ZW*ql<@hbXE6T3Umgm1JL8DW zc|^k!Nv|gW2AUfVYxpySUBm8Z`r%=y>g9Gz^44r*QAmYD7y9#xx#hqW#|3Xq6pywl ziQGe{=mD<5Hpj0hN=+gXBd-ga^xtLW1=QbFG$7v*?H|{>{ZHH4f?n^~x?7Ab z^_0fQ3Y|-txZ9}h-jt%hrlUP+&}iH8;^KiRYR-?pBO|^iqy1SR`WFpm4Fws|2c>kS z5ds5>LQjvRR3s)>m^Pi}V^c`z=6W_^w_RxX90MLn$t^TPnhDN$_7B2h)ix2q(c-Q_ zjM185%EDAQUG`pKpT_BKG`r8|ameV=Pj3!jGiHcDJ@m)q?5SQ?^EjnEB|+_TJxZ>r zqsZ?ilkp-kSJYU?LigAy#n1>$E*)@hAA*qN9Ym8+CF#kA4AE=oh3RTZT%!V&y%l$G zz4?W7*-SfutIHGbyHaa=9H7=Of>9>G?tVjTs!Zqe;@+sfBv_;cu(3kqHjO&978Lam zV4b}hCPl@?^Qz-)8j0=^H%ZJbEGpc#)v9l>gO;#klS@5tn*z)m)qhIH{9nw%w=MHci-D&vIzRJG44BhdO86YaWIgdC9KK|KCJh%tARC5q zC;`X2d2XhIJel;CABM*+dbhP*#xr?TZV=Z~X_~MVWW{QAVAq@og8rnm{m~@ZM`q^b zr|nQ04H&-jdXJf3ei3_OrE&NRZSdrYaM5+!*tBn1cdZev2Mj&WmM%Zawb@&4jYh%i z`QOfFYC*ta`JH=wkjsLLpgQ&5z=%A=eQ4ZkzWN%>kNlJXn(#_Lua|Tvr6QNuus3#On&On0u zy!fLb(?P1~>X3q9?Ag8!KVhjx1Nrx&WBWU@fW4bjRGwcqQ@3Jd(-C2z>S3#24AT!( zO&nszCx_VjGE0@qR=eGi3hVQ&e2|X{a+c(a^ff7p+msubk|{gIp{k01rV#k1P{q*m z-A1ZtSWv{2iy#e876!K}>d7+fD9T$DI{V7(XiRZWp_VK@M>mAwm#N-rZo(B^&eje! z7V?n=HrQ=*>T+^)N_Eq~!&l<}<9IwnfGlY7Ux;6hbDsnj;8lmuGR8@}6nxUw$WLgR znlQ$&;Lr~0@p&Z2&n%0KS=#_{5@7B ziG%l3+3#4hNv8;xaXxstuay63m{3yJXzO<(7ERJjfYHvCAx6~B|HP!?RiwC(f170h zA__D@JX?R}ogY}xw9vg;To2vm)pxq>{Np?TcFvcNUVv)q=9AwbBqCj|#L($Z9A*%5 z{Y&orA=~%$h3iG}Knl>-bUJY)GsSK6 z7C?aF4k=8h&YzLi|6l;!c-}yNuVuL=LoUjLg`pC80nv`JaOt-)2mXND?Pc4%!(Hpp z?yFI{j!M^3X)~}h932lfzVOYvsWR;v|53GgkpeL-LmKzEvN(Mmu5c4yJVhQBUSSAe z$Q#=hQc5uRKaLTSH%KQ^xk}7m;{R4+5UQ=h#F(>fiwz8gFUWGO&?H5h(-K0KW?e^J z%?H^8IuvLx6Zr>&U)CQLoYybA;u#J-PKthq0y#ws@=^L%W22ZyyJI%6!*K=RVwta0zq83!cuX9rl@KaPf*Y-Ia$} z_onpRL&D)GHawW5EP=l?Y>JFg88pkO4F?5Nf$dYw+W!XU3HQZX5k zW4A^8owwOw&~k_mM;wBJf|1N}&1YnHxSt^@^-{y6P;vR3u>sFX;li&clv+82xOjSj zW8E1>@sKmWw`}(Mp^jcG5RfS(e1DP!6Xr#eB#N|${19*)LQ~Yf<08F-Ydo>CG(?_C~GL9gC(CbMWcDlaERRULag_gUe({2_%nyZk_QhDDU zP6nMt_w^~Ww*=N!;#nW1N7Pkly`7$pWSqMfaKxza4z?Vp0 zU!CP_zck%Gg#&_L9lzDANW4=pZ*If^O?Gak{8`-;&j~%uXl1n_J-thvOJ=xoz%QQv z(1C}+c7YhHljdmN@tw2HE@E$)F#DB`#dCB;)j#Lh1Slka72agM^+wtj@ppWK)+qj8 z&>C`(JRSh|9-*R$vH-L#q6lT|bHYtR#xTmPhWYNUtr-c`?6|m_9x$DQ^ZGjH_14n3 z_xX?+o8^hIu(E3sb}WRHHWfu0wGj%o;TK~EtvMtA-447e>HR#+r9nZ9Y(H~NTrl4JccoNE) zG!{=If=BKR^V_?D-#eU!CksZeKG_L-th+Y3sgMVip4_DtEj3RZtI$;Fwhg+}B8uMl zwNv`?@NlPlwiWv$n+LumEffHJiu4}|&1!~8t}Cu5@y4CvpzMD5^TiOB2kGb_+K{_~ zl}_a-Lx9p3j|az^%=h#0X))kK#R`xH>Yf^C;X(gc^>1}gN%C(mZ9IOo1Qo&L)lIi2 z+2VfwRu1JNQ-B2A1dnRM1V1Xo08?L;(P$*4j-cKC7%mh_y_zqqp?j62LX0l2y0%nB z(7p7u;=YBh|Jk;P^X0-?zCPX0FD$}ylj^)(qF3_V({l?8y2pTZg+?YxaLh=kwZ{j* z{DYGRL!sLG@J91o;sRpnC%I_2xvCvI$)SI&oQxkk$rLs( zKS^#gFKDk1!9F>rr=Q4OKXp@mMme@hy0O*e+y(#O1`z0Gw_2k|4hl#-N=y7^WK^W3 zJ`up^y6B`Rw39*|cH#f$xV6fH+@A2YcbnKUl#fy;cHrGdyPHw7!4iz&(j-m!RXHhy z6$b&FjYdXXj6dhHe27u|DGW9BDWnhm8S!M( zWRFRs%^K$BW;_ZINLW`$h)3L3-5SQt^^zljdpPdp zAqSKlus)aq$=LcHL<81&_?;Mgv1f1=kw)$7phoe$3ieN&OZS8^1IpmI;h^^|O>4;- zsz{i3n34^$QXvZ@klAi!Yl$3FjxSsJ;p5JXXY&zmxnNm5g09Vi{2#_t) zTOJ`%q5nl^>aM;Y9WeSVn*lV4C_l!L{Cx{WAo=#9%>ld*y^`^anThzC=Gr_$9U!aU zE)qH{EyxJzA)g__5zo6maihHN`mv&k#MfFx+jcnHqEc?`hpzjzR2E$EQ~cy;RaIanNei{{Z~th#CWhVhXZcrh_RX z=`g+~WbQM0w*QW%5OG7n;eBrTM!?f}@`;cT@vZK*-t`Wc`43V!Grhy=b@VPr`b&-O z1bw3#g4Fq#;-~BIyDAJibfuXPH-{h7#E;6I_Nf5MA^tD>&Q%UxFsj=HaiMJ%gB>ZpG*@aOeAeLSoXoUA@Egwx{p4 znw>H=<%@2j0opcFjmihMMJSX;Sb++ghU&W5BUL7~flo427F^doN!kcm3da*?I1J(u z0yWv85$c{#st-%vO%wUZ%k_cczXb0m0KR@bYtqT%Gr~|>6XdMrO2_n}M$qK%gK*V^_s_YkhE*K7& zosQ;x5Ak%`8s7ydFUQw)m3mX0C%P4}B=ZxeCsNcp=~bcP80&J6()2*H3zg<5K=B9g z8+u$@+D@*weqimkhy3>GgOe4A>ScWQ2;3!-rZ9~~<5kbm$4_gC6f_=>)?~WfR%1-c z-!npDi+ncQ2!xc&ST`DaV0K4R#d=})BU#n0>$`2HM0OC|3&`77O=9M+A50cq7e z>*(b2)5?fIM(a#V@h;Xe706YxrSf@I>UQZlXQ;x)Ng&K3XbMm2e>1IfdC;Du zwD^%?Eg?#ELTPfkz=>~!V)<}on`EDs8!j7u{q+^y8CrSb8Eh~K_f>OX4K=CyC^S() zOtSe7#(1KU>n5$yAO4zZZRB`S<)TaQBTAqLZ|fP7S7crBeYrri*VkWGZp*i7-Pt>t ztq4B;VScOCik(!LShfwD-KqS9grGqveI3oeKgczUzgI+6E?egBQ7aKyyO5pH0G05Q z-?-gm%UJ=_?~jEzjF<9pwPCm#SSoG{Xk`2+P7j8t{QG7^!Bioe3tNeQn&twr;TJKU z3kU>){pZP}ZS@M>9dT5;BtH3*H!U8)R%2Z9zaB^!LcoD!^>!fr{_=Jp6}Ww17x{op z_T`7#^uYcYcj3ov(fQxwNIk)56YHi^O_7ll#;YX+9*d6dbP+A@4iV(S}wdkS0qMST;2DcmP4+3=Bu8~!E5~CT|gvV#&eG+gG z5bv=HSH7bKTS!qpTU()!W?$uLGJNEa;Am%?4dsnX*TK1VtY^Hcm# zHKZm`W)?mMx3D_sWMM8*mue2Ljz0%CD9U}~(uO@t48-6P zdPw(s0~b1_A%Kz|EgPWU;0Gk?PUjb~f#TlfF2kZ%xZGGH;p1nTHS(CGStzkF%BkQb z&4{F(v3WHES@JzL3zLKXQtAvkC#E?PM^v3rSe2!8XPeUN6(%_F>Fg2JzkX&K)AfJH}QN(S_oQC2E1N(Z8L_jM$-83%M&jr*~X{ zJdYvK(h-iVRN-!z`ZbT&0OOJYtU5}q;__mlz!%;j_18~oU+HK;uq^AvoruX&F7TQ0 zt#vuuo75%GDWjnPrRVksIQ1wlM+diC3j-cDk3Um&AiM#%#ZMkLy46_RU`!CTVm^&5 z)pb&2JIXq)`J-w-!iDnn!Y$dR$~31dDI&gH0=jLCCE$I6f6KhiSP9u>MlTo-b#N})ubn~t>D5DKC$g%h$2kBgg60O+)nPzP33F54r=K%J{C&v zR8|1!x#k+1C0rrKZ@@d(R5^^e6PLAFVuyLV_^AP_NiQ$Ft@?V`dwx?M?IE_b+3Ve_SBIjrrDs!|@WwFU?j3*g~pEiGSC7*UQFVMQ7W!LC%~^S_iXvI69O zMxhILxmr^XSb`&(OgC;sAfhrTWbUpqlF^wH?wM%Vj2hrcEWPa`I>#mvjASA%{Pi`D z{w;n=gJcU&W%r}@J0MCH13`_EmDE~ZB#NrfQ2O;s$OnLGvGQrb*VaZe;X)%|D{ z@`cLIfEF&v$-KEQdPM=Y9eP7Yv4Be>2H=gR$FY?GN(vKSD*CLI zP2XrnQf)HMf9k#s>vdC(t-2!#WJ#(};XZ#x`)>*OniYaC4MbzfG>M=kwzGC9 z_Y3o-miQsTwED?R2%bpcKLaa83<4R9Q_9%&T!2(Hi9IH|`}rP*~n=_K9rD z5o&+u33ey;-ye6ygimkqt%WPhGT%pDXbR4D3gqxSM;4Vz2uldR*&ENTxp`o4JrQI! zVHWS4&S~$Ca+j?xce0I=<#Avn-*)c#5+QOmv1ru&=tmo78rYvxf<0Ts zd>5z3Z|k-0#u^org~}i4GNa6OJ`tnD)_psdNNKafJ64|&T8s-rM8xz>Tlv6Xu^(Zq zQUmFKbs9t(grd@0=u5jS+<&>~g;JoE8AyNWU*-E#eh8J0Obd(I95@z~nu+Wh-0rEC zm=s0Bi-Sbkw?5*lQUz0BBZ>dU)@roD8&oRp*r|aicU%Q=i{_#LXz|KBWA7TEa|BY@ zNBZfk4DrVqb+$P8ca{-aFViVCvhA&QrEhQ|VRschcC+{XKAc3QfbQ}{w3 z&ZllyWhWu=873Gy>jkw3UG8hUAXp51E>}-3(pN;3BlL1E#7NZrxRW`un_C{ohOSCq z5SXFz^g}ZTqn(+C)2bJ1gwbdGWhWsEy1k9ku4V0(=aqbyY9Y@W*PJvpR?lwNgsxRK zmD1P@$?_}EWBzyVK@tD+hZl@UJHac_o((k5L3Tq1;87fgiq@tbuUuBVK6-P}iTk~! zZZ0Dk=Hp$6_OwBqA3wfpWpwdau#{M}P>q?Uj!s~>7Zr87%(Lh%^I@J1Sd~dfFx*1( z76q3utE)wgvXZMo#jJeG#RFI4>k8LY{;Tc5l5=xu+plJ2xgM$MO$f86+WPnWZ1&?p zRE_3K)gsrYp4^#PAux^AH5rnP%q#D7ht77V8%09FG-;>Xd6g=9ys1y_P7+RH+4nZQ z>Eq`f5cpCJb;5O$Ub^I47#boDW}Bo~Lu4{EpCKZqV9J`a$qsLgdv`a#RtRzor*Ua- z)9lGF6)xKuFAF2^$gbXqV>Y|p*VLggU62hwIM;eSK9eYx*!;{GTo0yI)>0Qmqx)DA zLj8mJxQL+IY?juY?b!19Y%`=#CzH61@1^?1c)T>g;dm(%uSu_FZ*<>b=EIH6bHa$$ zh+9S4J}bX_V_kev!bGW_W0>5@5!&G zajkb3IF=IG?vJ`OzL()?IM=~D&#hnQL-dt9G*rzG3XolT3)eM{qykViWEdCx$_anG z1A+Yak5{U-RYwZ=#?Xq4L8(5dM&^nP$>c5p4CO>X>rq?ACY+UU&n7&B1MWZW`Pbb! znD0HG0x||a+BHP%c+=KU?;%@LjuiDWQsvcQJh6{wK0Rx>-NW%**oD&4#C1_Q;L2xu z-?JDRYi|!>9Unhz&+-+hF0LrOCslHsn-ZC(E7|hT9|zEA8`OS7}NpmUnHvYe%O%PX?@$(e@Kr%r|OYV>6Er z`F)z=mK)oSJm#`X0Mk_Keftf~gi@->Nqei_wAvn*(VX@K8QN`{SwUs?lkT@G1`4;n zV4Y+w5Z%UCcaEq?v7+fJEXg(ol6Yu#`+MHBaHmkPviMMqL%=`0a332; zIS-CycC}vg7c5fld%RUtysC6|x`H=0j23m6N(@NIQ*O&Pc1vpTcB)BjQ6~o4% zos}*Q+6ab=N@-f#29!@Y+P7}~3QMYXHA`C5`YKC&+tIG)vNhFJH$TNY4!oL2!54o$ zNbk?H^LC^lQlrRM#xDyzCUGj=msXp@s8ETIj`pk+D2!|j;XQY~RXi@$eQ&MV zqjBq#QU-A;++@0~CF?RnD5x6*tB()T=YiXr(S)PK`{R86n*;sf#O}Fb_O0EFP!$hD z{#$T#sKhUW)^FTO+PlBY#Gk z^AF5L#OjwhCviY03a>L6*%c(9a;Ky2GG|sj2@v4Ys7j}>w)@?UP>;+^Z#$Kconsgu zsb6IiinkutN~l;`_2+)P4^ba2v#xQe3cdwAG})uj=c7>`Y|eB)Hvxds%G_~_K+N?P zZ<#T>=5bbrU6+IT7R@nIq5AU{l*_fs*SUks^D>j|u=0JD?St(Ui(4ZGk6nMbmDg2VB7|FolM}$L0+ug$hKeSZsQire3r@;ft-lzKrWUTs0 z3kuHlj`<6!CJN83e*wAjg8i~YY=?M#ixX~dUM!&8asVkLY%e?sITDNWAUG%Bta^V# zL^cC|wnm6#fZVLJ_aTF{f8E5z?)>lQ2R_N(qPp@mh^`5}`Too3W}VQMecF3k{EOT~ zo1JvL^vWL0STjW0Oys4kft2IQvV!tB+wCERZf;#KfA{}5k$)Pj54<*U1QnNqY0jy0 zb|j$YvY#q4RhWSIbynedm2iHd*AYa5Kk3Tl%Xw(%j$TZZpV!M?9#o0Ob6WN>r77b# z%2Bu@L+jqm0h%9B1M@iesF`21sP^682`f2^YP#?CcdQCfZiVHo9BZN?8t;gSQYL%r z)9PV!cE$q{D?Ym*dZ`h4@q1Ys3uW^nnI@JX=a-ifjOP{|eAnR>mGC>oP6r~d+Cx|$ z*rl(}w8L|ft$x!o7V1?Sp9%WZuUgmH9lKmT&>eXDHn6|%cxO6`x@h6o*|WDy=B*kx z?K7(Fi);rh=!Qk)J!VxOy7j!pF}oHA3ppL^EdJsd)$=g-t5_K+y6Qc;Sb?He#i0)u zUejLQD;Wfj!E-p!m`5V2ydbU2nNEXL=OJO>5kke-)V5HNNcZTJzqtLL%l1Q1Wks=| zP{L5Qd28y=qA-oY+wo{O@3VA$!yi|?PA9u}ur2;-+VKKA<3hlE*L3u=JbJ$S)q=6L zA=0}`P%u(2FuUfiRt$fPSQH^RIJh?=wQYyl)pK3utdZeFHs~OEAH4q}P$65Rs8hgg zBXkI8$y|?Fz!-l1^8H*>VvTVEb`~PD+x|!eGSdHC99_G+UCjwX%%D-5t>ymw&+aUq2 z9Rni%>%^c`r4NK}J%%R(5g;z1@;WUOBG)~A3Dv5AskAO#7_?3QWPSa15JPr9^Pr<2 zmDtdWI0B2g+~=4@&)44k}E>kfy%6s%up>o z#Jlye`sCKQyJ#OG_&xs3*MiukQT>)I<8-Vll>``dG- zLw{L=ESnJ4T|KBN`1-;~R#Iy;-!E&FtV$q1hgwzSh~2>pKE3p~?dC>3$JcqkDq)``hN?Xr_TF5Tx|hU^xsj*S zX&T-vb^OCB(6{VoHa$xh2xyOZ)D~+#?>He%MSv|&e&c4dmg~HjRUFP^(aij3tg>0q z)?lN>6tftudR8!f?i(Nl)AZaDEMzwDYTc%9rh|2VpJ##a+k2sV`}r~!*+tyu7|`MD z>KA~3KzmB9eBX&Ui}u8V0mRTk3b7>$~z1qYUB+O#Ttw)iC` zr(N{HQr$g|70b>q7wfDyw4o;74-C^4lXjI8D#!)xe#fo(dGFI*;n*c^SdTZ1YpkUG zSUiVWxkkO>q7%L%W2IXY<49*`o0hQqtt+%-YkDcB%{Xg0rqP(C83{#M9xjO3qQO{q zdMR9|0W8Z=mFoW;{ zkGdoM%HhEnshZjshxsGa%WnLZL~$`~_1%kk zzE-|4mhe@@a|xop;>{t6?9k-2;&(V{Novf)r4Wb1i8QlipB&dWQ8UX^IVuMdM5XGX zH|;nj^GStpD7UnzprDly@MMI50b1JUpwOGz?1m`bsnv`-=YFkoy7yRR8?JH}v?$u_ zfGKWs*=QE`XO4J(^+as`x7mFpKP)~kR`ILp!I*Ay=WA9MYL_!&+w_|`6~i1a?F+#P z7M5MfQmrXG`~BN8K?VlHvc8@1woLkAb(M?2US+Bxtaf;YE_|TGyp74BkJ=omcvC*) z(sp4VxYTn)TR;!hKFF^1rOX9swZ7r`DU{^28_&u&Is+c zAvB`+bp)9Nwd$Ag0{q&A+oLntXPt+VrJxlV+iq-oU?ZEM;?DCLIVu^~W)cN#W9v}_ z(Yk|ld8IO!S-O=xRE@SkmfE+&(+L6w$i4J^3n7rzROE!54Ds@_>h|GpO^rpgg>TdzG^EBKtSSzbKK){TI+ z-LXdyBQX^MubI3RDJy=RTz@evkSW0mG=`+R7Rp)1OO*7WyUynp*O+NHUsTWVnf4t} zF23q|Yc-7uZMBF||M6oP-yIsgEB0|VqsM-%akSVCqhkIdML&Moc&JWCinHTaB8iK8 zTc3As*X*)oMtU0sr>i(>t*V*%87j$+eqZ%~u#N-_5( zplT+pasxxrBKlxt(*GRpqCrK(kL|}?zkdDl!`7^* ze(j|FFp})|^+O$avi^f_s@YH@6r>bszgXcCa)29eE^jspF_@-2e-YUQPVnH|838YH zimmw&A@*#(YoUi`UMb5rd~}<}JClAG6-m||M0lXbRdz7!%}KLQ+I+#`nvS#2-rPQV z=wm?WYOX7MSFwLky@4VmrqS>wwe*%_Y%>TdmHio*i6ThdQ2~4Mv{S{#j!Uzt+=-Q# z;EmIeqUqSEG3J|g3^!ze)!K7~?(-yJSEVWWSlv{$Zw}9#^EX#s7XN=qq&|>mg5LB- zZON23%)|Rm4bL3od9*Cs37>eJRhoFjxZ3=V3T5~V-C9nvG>}!JVsNDnwokoqLPy86 z98Xg-xK_QDh*CPqKS056f{|;E(U2f#OG1uolY$EM&WF>Pf}}x)OfqsK|1vWx<`XO1 zV+FsQ_OD)^BKsyN+s!=;{jg2qgk^I92C2(AfR{}E-7g>zAUArHjj*~! zO6mhZiediNmyaZ*(s%$;oBN-bum59o|1>P?NCS|<6Vu%O`Q|^B8NMHrs@$-WAR$Gb z1&~TzVrC8e&#(V!7*MAij3$kxijqX}R5wri3x4ZoE2H>VQt&jn;4PqtMGNA5my`|i zW8tP=v?3#6!!Qmg5^VRGhLdP(;t&v_xbJr2Wl~y>$Fw}ox_FY%a_j_joao}L@`0pZ zyz*~Tl@#Z#3onv1*ck(K*@e5qlY|SdMu3awPDY&+B!aKkV+Imkv3}wYNxGG32r$Tt zT&Z#<5#a+#pvRqI{0j0XM&93qpL7Sxkdf4oi?We7GZT z*>UBHS{WIM^cfz=`zZr6X#F=2V2Uv=Y^4Fx0pzb;NEzqKlkKK3q7!pGBAyvFe+e7w z(PLs_nx~}Q+e(l^>V z*d@|k8BVzaD~CP|CLO*ER8LPMMknFDPoF;J1utkZJ5wud2f0(B$jyM~!buokAh+UJ50I?A@j{0mgQp z&nsV&mZ_}$J_A(WE%WBqL;uv&H}21BA4Gr6j@Vq5gOzf(IgwZ%*A4PVd~?q3%^x47 z*IC^l8J*S!@id9f8K`W4;Vp-i5~d?5 z>#P7gNvS~l8VOgY{C;2Lnu~lBdxe^$)+04wtWvqNDnI?VQ}DaQ4>~$C$tSb3~Bk(%Km*!Lq5KCx@TgaOi`wSJQmv zZLuJ6=O_HSHmJ&P4XdkD$R;CI-MH%5-_eRhv!oX3y{?7}C)DoeA~b>b9BUIe+E(+g z!>;MikLPeWVE2e&scn1s)1Be}E5?659YXwQq~}U}k51Egna8%Drj}}t3 z&ng*DtE{wrfP0(97UX(0;>=lkK8uD2<+gk81gmFMLfHoufF;$Y|J~Wr$WWS+$_?n5 zV8oymfTao!#paaF_wquwms*qVOUzYIJ=vBUcVs;|Ngkf{o5F5fS*bp9%uU6;OI1>X z(1-qE&Ix0zGz}0W)?=EK6F^9x`|^RDC0~_>)%{>C9~_q}6nOwJa&M}%D!*^-nB^tn zY5=zab;|DmCeVyp}s4n?Ho^Z?!FDjaEAP1?#|5ZJ3l63NiNm z9b(3i@4-Sj3*I+%TxwkQhQ7LEy}S+DN7(~okjjqZQyXaI?>EwRPBo$j;}=}lxOYSU z(c1rdJo37FVC^&V)hWtm%rPbX{*#fn1~uCaP0y*BU`&@Ur(vPnaF3o4VGAoxCcd~X z8sADkF|k~j$Ei+lcOm2rfq}$3jbXHV>>M3R`{MH{a=ly6WuUX-iTSJH^PJb`C1mo~ z*DOtRZ~az@$$e9GGu&5ux-Dj#@~`W3s%D#n@H$?Le)54_ZS_#jN`sLSi|xW@8J}L! z$}aoob`#P(?v9INrm1JPkV;-xkgC0n;HiqEY2@XF`;L{;MEiQcKSf^4BVp+uV{7!Nk?ly|2zt1N?+5IP z#g57WDA)0&)Lz5m*7)mCH4VT|wc4ktpP=x!mg=1-G@f*4Z3~3P2wuZc4xU@+IlHp; zh*_|E;ydkGdJYXr8eOg1CQW?KnNot0b<1noH|eAsnwF7%bySE*Mm%_dvX$`>BQ?~k z*~x+atmvfOfg@&cc`7z4sTnhIL*{={wn_GRI`U`sT?ZQ*LlR#vW^~2uvW`t;+L}ZM zz8#D7FzP*X)4qu9lv^6>(dfk@rJ58@-H|d+1cz@)fKU8g6Y&xYjV<`Jn`V-20bGT{ z0iFlJ9X$au0z(r%MxgJ7jqF_}hiZ!XfwAf7V;B9J->V&hj}}*cRHa|E$9Kj^xbZo7 z_u3xJRC5+YwxQuJZ6H?38NKPQsKs~9FDXu#J;OONeDZSW&z1SSiXU35=}V{@4eAx* z>TEnsxef8=*4#mEvdw;K$?MMFMx8kCVlVq)nuY$C(QrdOEg&=DD3*-#hS(Vi z6|$#j;0?w7*Vln1qdBts7KzW7ov1wat{MpY>+)BEOLIEm*8MK%aGGDWV`hDS5qA58 zj2W5&c?Z@ zi{XpanQ6a#26KZ>p*_A@7I-kSH@&efM%r7SNk~IChA(D^l4@#cw{*6BC|1CrCTGIN z&=`wgog8IgW8>G6Y5+%FSD-_TYCM&MEcXM6ovr!VzJBng0UWe_4eQ$l=CkO#Th(Y3 zfJnaQKzvkSjD8B-hq*DDEP&}@GKwwI%?fn)rh(nodF}B|P|zttG5QvsLX{Eey*LQo zCxpkl|Gr~naKHy1t{e$N13Q;T1zPG6aIM-zKJA(Y{^v;^GDUZ{e;nD5DHXw=cSZ2A zC&`H!x@38|gKe4T4?D`5vd@f8fiS#Rb~}CVJA8X2V1P3870|cP6gCI-Tnn`8E-Nds z`1zZC96Y=4uopa_kFty3UdC9;WjnV<&9?MwZ7l!ApHJVLqq;&{Y0>tj5d*2%>Oi?I zMhiI@$MAtPdsq&#;8XWx8G@^_05@ziEeE(0tOvEAG3Y-3ZB+%hACcZ&B|8h zP)i;YXR2#?{vrM%FOtN8bxj$A$BgY^#dzD37CK!-%0ZrYd)QP(VnSF@L<@Xb-5 z1FOWkJb0|;aTon!7Q#krL(q1pP>S{5n?z$T!kMk*-bXryK6#TyS!z3m{!+*ZJ~-;! zojf}f*3|Gg3@z#=4MSxocFA~wP)|NoNkk&M>n zV-pNi=7B}oXt~V-+V?1<%gq+Mh~DA!mQeOS8{Q*iQfHe2o=`1(xM3k;J@`ZlRaTrc z;7s|QUDAE2m%pekYldJPtxYt?Oc%qHvoeirx_5!ew#Vcpv!eA_W)jZJ?Ok+fiM!AN z?mI7ajD@Iv?hVU`MZ1l7uXK4HTK0Y;Um^V^3X$OGf-J+H__D5X+1V-_d5TP}9*g>Jb6Eg1sM}~qWFQ8nqY+Xoq}ys8>&%46-3l4Xo1ukS zFMY)s$HWWO5qrK%>)g^zv*9y(0HgR!XVs({vi!zZNxo>X$z;5Ot206aSK)th`9gKs zPiFS^*Hs_BnA_^Y-7{$IW#?{}jDBzfo0q34w0ahWg;u`8Y$q+)YWDdEFP~NZYeZoH zu6=&#;yDK(A@oS7=P9Yb;*#T%CpWUe^*^)zPCt6liUpw*#DnH_AJep16D?QMg5P3l zNg1NieGnOg7|b>P!4or@EurC&DSb4-gqSJOhCE!2z9!J%yr?{s2b~p7#&y+obcgOB zwZh6S@YyqI*%-N1xi1Z;Su?|T-8yaDY8uwcQu#vC9yNcc(T24NpbJ&V>CMw&S#>C1UP%-e=;nY}ODUoZ7!m4?TB zky-mn6wXMyZoEmfsIVKEA_03}YKT%@hLqQ9HN2%oYDmI$0{(!rFNH=2t~ceiFkBel zo26_Pqef>l{Gr&U&nC{kvOJi@-YFm$KO7-CF-OU$@X1F`Rdl&X0y)(E7T1+)I3F1t zf+>2ctUuEKP^rwbSz7AIP|U~|EFcuOv7fL4A9tB51Kw8^6s2EyVt)eXLdJ}u_)$_4#3Aj<-ygYbJ6o%z4CJF;s)Sx$Y*p;x4gGn!R< zhW=P~S3SI(MQN@*VAoL5?W!#DOKxqr{Q&+4(^RgGB9{T&PZ)gZsFu>SgwoC^VW zy|s`kkC^)1j_kVcV=0FNPT4M>4#Y%{W;YWCg&J|nbdfGwxQQHi7e||RdCY{bp8q{vzs2wu0Z8>?~ zoEzq=l{|M_(N+$Yk}cF5XNj3F4qDkE2d>|@>RZ_yjOLupwGBBq#%Y09S3U=7^xE!o zYE%DS$cAfgTytCL*B3L?(JUH`mZu*ZG7wjKJ=o&2>^j6Qc9!xS`V0s0*Nn(YzuCmc z0Kpx-?&*~uaUzLW02iag8sz9&$8+VIee^3|Wf=d}|CCa*_KnII9$ zX`Au;v>d=oJ}f%a7M=c~`Ug9ft!6QLV(;{Hx9qIoZ8Fs^ zI;b(>X>GP5H;vUK&0};Ow*!yQ|E@-lKe2px%jxPw?*v@^rvy9_*q>UPM0Pq>UI~Wz zL5(e&SZUPX8dCjOi26`?Xu`C$Fs7(uq~1Z(aYO&IumcdyE9-RsDT8eC_iAcJnKnjr z^0Qcx2PRh8ZXumY%t_sJA^nwnNDIBk?n@Rij~$P;!qzxJMX120dZpvlgs_~H^isnGV?4Bn_mHTV{HHZD)KnyUI7cn=hf8|?{oX3wT9XRgb?pD}O z^aAaXeKfz8kn3aM+jI9`P0reQSSoKV?v<_2{G0|wdv<1LE;z`+f|*^NGG7jY? z8isyAPsBJ}mw=>4g0HAu2{d0l_%b2+ru4WxExxt`dgq%_pLVqn+tI@7jw9P*``WZv z$V$yfwnx(T0KL~rpMw_a$;*|~=X9_bzh(d?ul&bWbbpw<7>_5fJPHfSJ4+04Pv`(X#8&% z&wts^^+985zCD%s+zY&q8=9~i7HdD6b2%kcvvJ)VK#upOxm}bRTTPbDothrPX}7n) z0NE?lDIckU_&H_f)?vyq{kv;n`e^s0g@J;ss{vt~A59oBa;P1jxalpi@j>q$ckSX} z3X%NrKDY~E02i&?>AASgzR)N0w5xWv7LO`~E6ba!GL3G^DfkQ40lafw5pnCe1wc?o zE}{j18$0i6vY-LIiX$p)vA0=Ve@+{vByhl$4+L3(S13eK2R2)7a0#<}&~P%}8>+CI|AF#tF4MSs$bNYcP%?d5{8>yItNJPb?v_8lqI0=w0k2DsP{t zyz%9#qxUglAm#L3FKBBxt7K&e|pgL}^58n-Kb_aO7 zI!%+Y-pvhB2D=7MZm%F0?)@@`9#$-kq7|@SQV6l}1H-J~nW1Wj+SE^?&*nyv0Fr9J zw);sbOOZzDQ$W}Xe5mu~!Gg@2UxNjv1)fd8KUZ>n!0gQBg(PqD)wahY)jIU0GscO= zSsbb&8VStdP}QkDkk%+A@-cuFo@o5<{f&v&$GMUFrT;b;*GvSyrFAA8l;K$^FeL)9z3>5?f61+Vlp5cn+}xDGNW=IUb! zhl4F`qIhri?9XGc(AC#!?N*^ls}<|ht@c?-(A@njCiJNmghS1gGHuz*4N;NW9d|do zp%=hS%4=b3hrqI;=BH^)exgZNv#U-AKO8!Ka3%`Cspl6=E5iCajjFX~E1H7Kd0~@u zfwsNx{;ImyYri+*|8QAyr*B+Id%iQl76C!hwE{0`{STV=MI37GQh*@7k~lG&iIi3= zwWQ>CsBndA)J6jaS{S0l?2_PNp6|QohLYYpw3Q;ZoM}xFLS}cxWoR!$t+r5Gs2R8o zZu3dcNQno=*OW=u9$JG4ews5Rg*;M4S3@>ykG{j#A7a68EpD3>eFJldUh@EL>xoaQk&r%nD<^ z`hcm8tsu_NsH64^#OGfjMjCJ;L?x64t6GWD^Hz&y+J@1Qqd<{Q3MzEi3 z1g~&#t?fWS#!bUgng{>~JwNgyT)Mv=`qzy$>2IsasY-V?$-pF=$fwDP34dqQE1jYW ztG49KpD|_6%`L%gT>^tJvVcAs(c>&g6R{z*F~!Dg-=hTW*+I&V7>UDFWx%|W*@lfc zefIW#x^@YagEru8<>RdqzPoE$02meIjVj;ai>uk+H}IOM z?S!jWe`0}G72wPDOWn~ZI;i~gxhJ*I(Vk*uO$Vsh*WEA5%PvP~Bdz)MYp8TD z3P}fWkeKVUSx~!rQQ=S@PfQvhde9-} z0aC?z?OgBpg48{-!{mJYQ9VDyRs_5-BX%SNs+*T%3hvAmRh7y=%lSZ~$9!^e#i}8W zdY^Dmw|TJn6CU|`;Tq(W?^ltkmXdG1qpe@KqqK|kiiU7R ztx}(TY=!5OfCD!W9}TVBqKK|gEiog+Fk8?foR#^3eh~{#Z2_=dZZ(TLv%lKW z!>0*`H_OeWud{w_Gg{f2Gn(IXz z-2t4QaL0jVwf5m*va??0&+-wFtMyQE!h4l3@Ux4?S<+ZZ57m39i|7qvGiq_$V$dYU z_4!B$Xs5|GhL5it$m+^l_uU|msG(dtb7I4f>gs98_~HDlNgjCiv^ytzks$k*MZBcL zHa;)PxT%K1m!FSMkvrJPwI4psKa^|R^=Ixaln{IQ$`%qEBCyFbRlc(rK<2 zwks0__-A}q2=?8(&%u~tgOpmy=in5dr$By_PRkWogNI8EJa=I(=nXp)lqrI+OIgyd zBeDS}tqLqt*zzh05)iE*qI{d^O7x(LOpTt+^et`qtl;0Ep`4W70cI*^%|`|0 zd=dqcoBca=L~EZ#JIpiaGU)vy&uEdy`n33-R!SoW>coY&AS-Jy$n-t^ff@^}t+38Q zu)>YsZMqzi=lF}vYr2#Zbj^}k*+;x7Vc{pp)u~UN7Jrl-ldP9rzQ}A4*VrMR!r@@^)c31_G}C>?2&++)nGpNe zc~4CFn@2JHunl~`(Vk_7vG)|%?aDnl+QPaq4!o5uhJ|YEF=e0mMOW%1*w9fuVTmh_FfzDhCI4#|G9&jiqMr`=ZTe1s8*M zgdK2ix`ZC@m$gQUAb_J~A;8H97ORkPW3k5m+*uy0`I70u87=3bfmPzZao&=X5IX(E z@(uqaHkEk*2t?G z@qJm__=`Ijsf{mKr`8AwjpA(|9o@|A8sU15E4K<>W*BP}6<%C+rd#Ocr@?ru^DW~p zBIZK|7hBKC4kUD)+K4yCeoG8B$$`4&D~^RzXeKU3EYumWzt0x^CO~wF)$2@ASY5m2C$LbhKVa zQ#>t!+D2B~@0n??F+%!efE=iipI>~hZMJhfXL5+~j4Fg&jRj-eZvn^x9G6Y6CN~a; zHYuOsgnqdbu=C_)FBm)9fN=n}+YS=j;F!dM#y|)#CQPq>p(<5GV8;G8}ipOhQMv(()0TFlsp>`M8@OzoG1?-{TJvfkTN6(cG{;~rjxOd97g-qNk)9$0|Umh zHzF%mwZi6Cpb`f+nrn%7Rd#mrDh{+NWMaUoNP>Nxi(B%2>+1(6(MLZ8Ch&n{{PT}b z;~xUj!tUIJ7^uv80Bc)?Q13siJ~yt*c26Hxx@e#9$iS+@Uz_V!)u(qs_f>Gubdok( zn0hyN^i%biYdi z06m?086s#=YY-{tA_nyup}xUF%zmSSt3n+SL)74{7qQhs*024pIx5)j$#$2uenoqpr z!bnn!N*k#4ZS;N_&50oNZ=pTVew*4>eDe*d59NIZuzqgAPLPSD)+1w}s0DJBg;e{N z$6UPF9A+V@#P9%lj4>_{vm~`Yu4DUq&Hl*c5B-V)P=4anbO@57iSI0c#r)d2t8)@C z_IG+Y3@{m*9HA;wX*{3>q>~W~F! z@kst7n3P3-CZNG@?gA{N7R8c!%;Hzgsv9H<+g$-9MXY8rAhFO>WU~f5L4+2MU&DZy8zVkbG-p06+Z7Hz!Zb$ zECd-z3{K?+V2V%fy&?4gROBhg+FZP-|BghPvjFI|O}t@7>kmS_47dmJ$FlAUf4j#2 z^Utpv0Npc=5)>9mN3;1cR9}zKF+ieBSw_Hap3Cl%nlBZ3F~A@f{>m3pyRkF@7#tCs zIZw)|_ere%9ULf9TNWQB1#A8UJSex`U*c3GmAD*Lj^%gJLgn8_n}9<< zz`W0`3w`hYht1OFW3wH6M|!4$i{jW`?ay+T+3H~M{k<-MBV=g{&{3|B< z+Z<=Lxkmg2*9P%lT`=yQq{d5?SX`gB>rr4>st({lwLL0B?eDZWHDzDEzN0uTOg%RAz&&BYPpKj z8`blY7#y&{aNChmjs;r(Q*jSJR&Jmk@vAjL;6BKRcwdr@RJvcO@{Q{BBGlCt6K;m` zo3@cEl!}X?fz0xfYsA>5{6RTzVUPLGMC15-ne>xNS=OXOzrKeIcn7H)hjwa>;|;iW z&2ID>Gl>-g-aeK2!H?7s!~$axL2#)A8m^HO2B4%R5}IxeM1;&d&%Mq}8gTk;@R-I} zFUPYNJy`}Im!q{V;dJbubST-{K79D})kg6AtHip_U+sTj%J<^4_o*S0>NUXoO|J)x zCXbPm>}7J-b~sN4`hUj}3|eHOhQG)JA|hS}2P;lXL&NeX*-3{EgD@F&7I1q6cUmwF{UW*Y(4Y5@$s_O1 ztqWPc68S?5c4XA?FjHHm%Ubv4tR5@o9+J#2P7_h z_BfQR+M2QZ|E-X7>~4jB4b%P?4*t~x*@>~^J|l67|KAmaDTwqgD#D;C%fzfxz~6Iu Ll_!OdO#S~K`Uq|@ literal 255261 zcmeFZWmFu?+CPefAW29d0fG}GXmEFThrwNj-~k4A5+K2Ca7l0mhv1qJ+!6+Nhr!(k z?y%2(-~UtdROKWjC{&#tf!21GNJz3@z}o0K8ol_L`f)L$@4qQvwqR1K zqsU@@3!YDljCq7X(P0frHK({tnfd4u7 zwboaf5M=RY*)Wc^di5~qnn%{aTj4}BCq^WB29hY=mq=s%F$Dz99N$80M1CoYXNqD3 z5RsZ?H8=MPeuh%i269t=&bx{@AqTPF<);Xj^e$Oon_n7ONYRVNu=K4d-ibgD+Z2q- zEP6umN*HvPV{~BYrt=PKirDdHc%QF7!D7{3*oxnXwZ~6MM5tF$zrl3&9*s#G4&p=Q ze<5(li){LWSe%4@zB#%vDK&^<^5Z4g zVK?qkd_A(XK^yvfFu40UM#3=Z_R^D=%dhy!CDCpxk1Bbk5{OGHx(6>BeyGnsHA}kr z$=j(TSc$|e+aR3zhT(HmQuh}EOBeB+wZp}JFm}iejeV_RrD9^uq z#4Gxg9hsb$F8LddTou`y=B_}>16oO+7!koC{UTGn@M8=;f?PhYYxVM(*E#+Gqg$UUWg{6gZh zn56zJ()o{;gAX33AIAu-7Re-zFC0`nzPC_&+W z>4$Rxs*Ty^joaH<-9ZUBxu*2@ZTS-G%kv`RY=8Df1nEGSjhEMBRe-=wn;hM*H z!|wF~^xM<+hPP#s26P)AV8KWWxHcaOV5sIM*mjFP>4C%tD1H<#J_XUec&^?q`PvuX zV8e_RZ{X3fC?*|h{|}-HWV^>R?aUPfBuLK|>3GqGg2ETs>#_HKjzOOp1^69c`$)g| z^hp(mC_6ftBJs1(as=xOa_SeDGG?)_sGs#pe){|<<;#FfUkteCu?3@g^gj7E=V z?#qTqK}oOJi5}Wl5&+eAqZl>fGT)vidxcP|lWkwMGwH7VNZy>e_l13MZRbv3z+=Ph*sMv_j&@2&r`n$f6@Gk{Kda4XGVL-<`f`F35(y6o6n`g4b>E7cvDKd z`zC|J@QrJ{FdaQ(3LPIK8hsuECO8b-2XNhnmmE?b&6E!Fe`!?FAJc8q)g*8vcqj1m_4NV!$okm&P}UmywiC|jvo!n)Z`7nT zI+cU-*o~yJt28YO`sBbf4334G5WKPIRQY#bne((XR5Zv{MG8kWNdZ$3!7)Av9^@3F zt!WI29b+0xws|=gHrh9a4KY;T)}SrcFRC8p+o~R898DW_ggk%$n^W3W(t6dJ>Ca@T zlTnULe6DpKVPP-S;A?}@@%MFeB596-%J&A-KGSZ~gnD)OYW;fQrQlLPevNjqM6t2H z#*CDJns=&O@EO}KGpS;?d}wKWakb(`z|gY{l}71CMZ?xTvpKyv#>V|q>CH>n;i>%T z)=Am6??}Nm`qsu~`ESSHZH@uNlZ3xsD{@U*eCYb>_-P!Y9A_3Mj|w}Y-uyGsG+`If z5bG>((t+2+!tRwFHM^c8Xu5D%r+adkcgCaU&}qf!W$KscFYOjJy_oSEAbbA!Oa)^Z z$Gr12qSTONdBwU^w`4!=YHkHqM($#cCP!s9t7NO>a&AYq{W{jl&lSnmYUWPeady2G z162mLQ^3plzG;SDn{R-Rfasb`u9?Q3#;&W(XJcIxz%V87AeVmjyAJMdx13!|fzhEc z=KivudvQWG`#_e8h4%}5ajYZexgRXXdeX2NuoXkaLy1B|qxhqiqB^6VMX|`}M#z)a zm}$-wIx3ebHz?0!>_v@}kn%TrfQ~mOhTMh>Hn28q%?r(gx&{cLyzAibmM06A@%`_# zQ*A$Oi%;NBlsoJ>nAPdk8M!|>=RB7`PkZ`Kn$sL}B^~`o$AWoOw_0>`rb8xLCc5C= zk@G>{;q>kp$G8`h|IS%ubjx5f-@JZHlh3BGwXnWVqmPm=Un`(B`ep#`;U{pD$!4E2 zH6S#QbgO)8cGq#cubWw-TN00~Blrt&rG9#?*8mt8pL@o`TiH=vv+J_?9ZMMx)+^M zdU&oP)BIlYC$X>16hVqo1JKDol^o_X%kQ1ym)*Ks!q20P@%?#zycLW49aoshD_qHc z=&LR|(wAGds@7W_$CCd#7ek#$L$2sck$^gS7h04)N11o?_C?$w&s!apWbUOK$&X(e zUPddar~OI+u|~!uCe#Y-KA{cM=p>Z2D$ve9chQ}#nI#YunYS@wSx9S(yJPAQFt?Oe z$#-9e49qhvlpK`^BP&#h9WV$`d%K)nrx&JY@O^BMYjE|H_q6s@5?3;fs&K73T(yoD zkUGo8RhxJZsy(K}GgK$LOyj^a5+em&&$T z4m`exCstBoQf-6nRv)as4{&DiIj(o;4(RGzQB^~&>IT@ds!f#7XBQiq*45V62CiEs zi##k3XD;QA(+FO_OKw^`WckrHnoyYdS;2w%M6ccxr&YG1(EKpDbDO}QaSd!l=fc3q za$WVQY4vA$j=$mg_TorH9%=tYCTDcERhw#*3(D-sCuyh7ef+0yiP3*zepEIeY}{a`Jm zF4EH4_NMq-F)DyD6u>L$q#ml~)BX zR}$skxvS7-wT=@(r=8yJ3^Y`WS*g^q%_yfI3%j2*Z(Qa-iFopiV2*jbuBn#%cJB1N zgVcfaG-;NF%jm3rc9yU9_yTW%v7qd+fsl8k@9y$x&vph6uET62-z{+B-F#{0OhcXV z9DVcg<=(9KC-1!TvHc_wRv*>V&|Pv@LkGidvd4mU{;$qA_ssWJ2vm-;d|*Zg30L25 zQhKYm$Tl)_TEtqCvZB4`;o>LDF2=oCME+W>-#tAyS=!pBuj8+qjK3H^Yc)EOz8f5> zV|LVkoQ+P_-0yvU=?g=LKW`Fd7q0b{zdG4D9%ad8*>0Wov%keZ+nqO=U;O%+YQ4t~ zjaBDQ#8V`r{YL?*C`ivThv`;UH$-&BR;{!MQSLDNhd);>KNfv=;~x$C=+DE0JXuFd z*7mh^+5;)O2k@wMGW7TSieEGHkO&vgR;Bw9K z9o0vTU^qVj5m1C#>c|0=l#mz@=NL$jkcp7c5NF7UuP`$4|DH=D(;=b$bsYr>DbyP2 z(cjM~BaZi<7{vF!&A*PQaUn?Ph`(?VUyrXS|MN6v@>kUVIY(*Swn_4)USu%Ur zf4J`lNzj8IacXY~GNtgaw{vje_Yk7|>j{3u`Tb=UN{YW80oe*s>L{sFNH{uMQgAb~ zGP6<&V^L602s&E;`PC(*|89=>ONjD42=sxUg~i?7o!Om(+0ogGg^iDokA;<;g`NE! z;)!=Io(>>Wk9Q6(RR8MafBKQMbTN0f{s6LebfCEJ*VN3>6(mGSdHbSe@_cBL6-YFENslIEdSd#qN(8hRen`#4@)~;No#uq%@FSpX5-{x7yPTi|KryG zdF8(~)%ib7**Uqm|GnwI-TJ>b1-Mu`OE}siUJ4TaKMec3@xR~vyP+V<{oMbJ7XKpj zUsn;77RC}}`CqOHW5pxcG$9yCVlAnni8vy}?EZtYi1?xV*Aa1!+^!2+q|!%15=D}e z6w~xT-kC!Oy&5CyKJ+J2^4h2P%&DgKLNYU(A`B%v;AGyLB?tt|klk;25|mBpCKi*A z5rm>Hu}?vl+w5(X(YpiWnQ9ODbdcdbpxofHF=PdtaF1#`Zu9eBXe52Zgh3I2g!15@ zdW;JkRu>%8m&lJ^h$21kr~L(mNmuwkc@4#)RzN_CKE4~}KWX)Xb%pf7gSsF52S(BM zfp<>?aQ;avjO0V?e?~Jr3X}E3;EV?o`M&o@10LuPr!ZnNvsf=!UHX42{{y}tA)^4B zQUB4f9MCY58!Sy}A1*P7$slvgKTuNsmZ&*B>zb(gt`d)6T$zly8KsN{;MtzU&#LdZe3n{6!q|^ zzqr2c{vFnFu0bJ4DSiXL+1sFLz<=1nd!UN22Hte!0zA8s?Q8womg}>fRj@Sjybs?{ zM!ud2s4q_yH1mPEov07S>O}gg@W}fc!jp1;DzM0gub9Wpj@K!;)q-!#w&5j^q(6zJZnZCV&R)QH zr`c&Ge`mI(dut0;5GJ2GT2x}MwP$Fua4WL*Ggv`d1~yUc&b|ueJMI;r_BonIB8`WS(!+s^EqDBK2(rfay^7 zPs#JeeY_*#DzDyAuSk2GM@1yYqV_b2#iJw9{A=G8^lZD2tmZ9I(^ zxfQfCv_1OtO`YN{XS|k0`$RL{1)sUDakj!O@X_N(dNU;tWYY7GqRo#7P7>Uo>ANNB z^Ei6iXHdy#rEqzEhjIodF&igNKbz6@{pH%e6FN9!(ewGs_$fxR?kiz^>ygIdPoH@6 z>mtenQd$WO4IQ_Kn`j*8)75W!vz7NVh8+^4n(;5r&q${lwh0=(=KuC>9j%U|H-B6{ z9BJS2ykI!qHOub1GL;EXts>|_#{YTj{aCqu4r>%IJ|w=Z!wv=eoYD7Yu|%f}xQk)m zIO(hxSz`~U^Vxn+i)>KEn6 z)wdE|gRKV5w1e-Hh*-;tW{jmy6=&wZyw$_>>nPj6(4OoUQ;Xbt@UPT z9If}lPC5NsiEJe$KYdE)H&?XZ+}NOvULT}sa9NKDXh)iu!J9i9Sz}Z$P_vL~4BDC( z-dup%q*2S^%4G@`)$Ce#x`qw#?`whIKC|(*A+v1bZbhhijYv@=kloe(+Ijct*%ypx zRyUzI_6AF0e4@9Z(PZ%wTbH>S!#paP2600ATGvHn6T=y8CYs6uzE|nFikF|gRI21c zKrl^jkpdT#F#-5zue!N+tzK>f%tmo7*Vvz1hwZk!)ox(fxUXMRXU;3^x~ifHONc8M zT@PjlWqZ;nZB4c<%o}JgxNnWpOSNgNXEUb5UAD>1IVdPZFQr1zT=P0m{Ym0%CvLU! zr)Z4l1<4ku;Av2R(ns&j1DtAGU4H+nQy(~B;StU|BCQ849TYfEe%ZE{*zW(3_UJs> z9j#4i)-7soAY8G^LZ-6lE)!y_watZOj}^nC#`bzDUsgGvdQF`SMvn_$hhcM`ZcUFD zsi$I>X%@}*%nz(wB`?9(dTFuvNEhz9#R$3lAY8jS@ULZ)<2f$2a%tR=zIB!J5D7;< z=ac$MqsvpQkxD}i-KN_oDNXOC5{jg3#|kM2iTF^wx}&lZ*j^S8e`EG8;Q!5CXk7Qc zL%Ee?dxN+QTvSaUO<2smH&L8pF_hj*G=Fca(u4a;?Nu06@E9p`LR6*YH8s6Y|> z8G2OV*S4qUW>e}%e&x#JXJfV#dB7H}aknh8-L>Eig}xoM{tT4Qz>i^T#tCQkY0{WQ zDcvd=!c^58Eb-*rcXoSWXB@WUOjRc99tGU39&UfH+WinNVvDYHDP=fICb6BOg0(-3 zv3E^6r=x)ka7dSlxb14bsAZl`<4PCyCof}$HN7Qk(n$MU2;LEUREV{o(huUAAG4YD zV)OmpTmOY)b@I!L>XgG2K`Cd#8$WkXh>of4U1ke1*@aS~}l-6x~QhlUAfzcN|(s`@9_1j0Tegb7zV$ji;&JzL#lSe15 zpqISt-H4^vOPAF)dsAM+OSi%!k4dk#OK|59Iz!K~&t+0;xs6T83rgpTqC>7OW-!qb zVK+JR>U4%IgUj^rbx-^FFWbP{fF8wAOv5A*0HEp2&$o46xiEAJkXg-6iIqFW#^Vd3=Jp z1E+VSl$Tl)m9~pwW|w=OH0oBXG&OA}E#$hlEjj2(&2=WEs3}c;d=MMHs8ArpFw6c% zx(j_cB76F)gRAFCjW)G}*9L2tZO0_S+<{W<`A;huf*Q^?8ttFInzO$*Z~B%!pXHPd zx4$Z{KZTVpCVT!i{Ln|%&Ng$o3^lB&zj$3-b_Lk$Wbb+>w292&nAQJt>LpEhsq>7; z-F#xmAb%gYc%p>ad9{b3oG!_QfVr2z*w1#iu6&c*rGO9RL#vP56&yr>&j_F8V6QiJ zH^*>4HcG|o+c`Jc-*6}+)@UE_d#ADuv=sGC4@jYou7yUcl)HICsA6sBz3lTS-3tEx6MD zu`DP#FEEu`LuH|WQ7kw#xG$TAyf+R^uD<~T2Uow9O=L=m^p%OuiurtiK`3Yz1l3F; z9s3?C^+d!WBT2}cTP~Ga)?v1uUP<5G6$_ioURA+HtK3d=ccfb;GK*5*f8H`f03@nH zue)q*JA)vo`<98?$LTQ||5m}HmBcK|+hxG|n}Xr1nuWv-g`^ik;G8mitLLmj`Zt(_ z!u8Q(!ew2M;sh?pUD+$97!`5ljM!M4R8?;e*cw4r(zzFiwaW>Cth%|H@k?Ph zZ{^}PghNzRWQbchg1y|%0usl5TXxn2rL=0*Kw|fU6Duvva*mWDtGF%7JaiP;oRoNdUh6Rr;66h%)@7&t3JB`;*mrxn|%(1uH;ndMQmN!433|08gdq8aoU7ZE!Kf1~7OPtMRt=@QQJy z!O*2R(iTYuy#rB=U@B72ub2ky3hA8f37FV#w-2stXloz*6wrc~Q)=LT@~l*D@1MSE(H|Mg&) zZ97wHe%G68%`aZvbB_ifZSed})_A_%f<3F>6;4%`1*BeMI-moDSDw0_uc)oTTV`}z zR5SN=NMPiv!!z6K=~H6$90vtk{iZ0A>51v6aH|4=eP~Vwg!w$kmGnAn+k2|e=oucf z_Y6G-2f~Aq*^eG{HOESZ1+2s%3sGlbwWRbL%S6jJhqbR;AzlRPY#YL}pVv5(BLTk??(YV{5T5nmr_``K@qXIqen z`})Nuh_@D*qaglnhSz^7J6+IK3lNsNrkPQq5Q?u}wA`;;;6cnv%nK^PqTl^K3Ct9ffg>)LUv7M;cw4&6zR2 z0JU{_A-o>z89sIrFt?J8Zsq$_Xg%3zKuQa4B0OZg?NCa>!)n``Thn)4RaQnfW` z%U4V3^%HYM1)izK2)D`SVVyaYoRW`nCas@<%K{k@RBH-Iu?4VByohf7?aD=Jb;=(L z{&UhgEMi3M1rcePEw9|NRwCxywlL7Rb0X-Iw?nQjZv~94jK0cSH_O7;+@Co)eQpC8 zEm}7oZ#l}I&>%2Qz^UX<(@aa=yUL|)(!5@;@ z@}@Dct;o5TA!2-G!0P;n#9148jlaU1gNG$lpErpHVI`+Lmk9mF?F(-y(L4SEsOc5V z7crEetHewWmXUl7#bMTK?XqT2^u9ZDb%)w}y<~+V*FwgKXPS<@d{?e$wDkX?!c+)L zYa%B3P}PtV0jmo^G8-!J+@<8+5pRs7LJd0SFga778tLN9!%yg!{}yza0a@vE3sZDI z&t^HCd#-P}StvI?W`LLoGW*={suQ{F5Xls^prFCqVtT0w|Jq*ugpoI_SkQ)qqKtycZUT&A zW#UxSDu-(V2aSPy?83Xq#4S|Z$kl3)xY4%&wLVwRN;`T_!MmKJe#f@{C`0d(j(r?u+LjLf%up1C)up;6V- z+wQAyqu8;DGNTq|uI;+2s0I6WMfXLbh>`0PP?6QJF$hZ>W;>vYT*{Qf0ekB#l9l1~ zr;=J{p&>o29A^w#6ROUs&fy9M9mpOr;r=J!yW0K<+R#&--!mYA=o!1doUks9AB z94RGC@r;-mg_>%)o_mwB&RiWU!$d4fTr-WV5r(N*4F-_Alyx@0%eEx%4eBf|;dUox zg_1Vwx7Bc+=FJ=NdS_EBq-vIX8Qh?v&;a^gjUOhXa5a9j{Y+bnHvl3(w=H=zAZfsu zZ0%2)UjnVqfL>>x&k&F@6OY!V3BoOKuJ^9bc6JC(5v#y10h1AZcw%X#vTw~z_y{71 zv7MRm8+d7EqtZT*u>8Pk#6hHJGy1@|Z=+hKXJaxO>DL1N)VlYrOLz#&ppy0MqG8ds1DCCS`K(gAoykI(dOirV!0$wQ zA&|=QddRpGE^&1pg9zdEXXZ+7Azyf)f?#1k!97?7Bil~uCx9J3X!na)#+*W<5qWbVvjc>AV6MPVp?>OLXtyt1!9@*O}>aJbPE z3*fJ@XYLHc=llucalFkzu@|s}h1IB+pUtQv;uNhmFPePONQagGCAaN_qikg3yVFwL ze&X^rN>`g!n!vz7=k0NkKU&QkDqgB6z$U*-C9iX02W_xNo9f;K6wi}2S7VdM}>tj)NV#=M5Xz34AI{4mJ`epTWO zE}+wxxUCQ9T2E#xBnbQo?9UYo?7Fq+jh73v=%to9vs2Gk#Pq!CrNn)`$eT|*8*ODp z{&m~iT4deYceV%lNHR7^In?l4P8ONt`g@-8$6H79!6Uv(i1cRJ^RqV(3Gt9nFbyf@ zQGi72J5w&~rbkRu4c_J2%HCm}6_XCdIWA1e%(smF2N(W|q`gd~7}tvLBEieVtb zn;(`#S3(N6yi-bmPVk+QCq;M@=Ocatb6({R_IW-HRchD`e~E@R;G!A`A6M(L+k1T} zMh>Vsz;uaMd04faLJbR%H&YDXsz}VNRo5oCUK#Fih&>(kLZtt}*$i~+)|gM8#IF^P z_clv0=5YQ2|G*!_#1|0};X}B^5Hs!>ddYm1-(%T`7^M&e*tu4!H@J$(Oh}6;5w#ZQ z155DphKnc4`a?A~`rJhvBAs_?wEGFgc&`IB3Wj?St6(p}-tRP(p5B{`u>}Zq3Olgk z42Cx$Z}gYv)!@uqbGh8_Xt|S1I4(S=y$w7qwQo5ZZmY|)iR@Co7B;TaxdDIK#!WJJ zE#)rwsLqJ5gn&-$=cI;VI$$0X>M)5*(#;S&$He;$Ok9&%MX_g z;hm3{-HGQ9BsLB9Q#qSHV2kUU|nXTdE=_V~wsK!L=;WXnJbHwS}(k6M?9zxr@bZhfDs|WnGSc2hz6vKroA_89t(dl0teuvexf>HNe;4a~bxikinAw1k9y?f1fjM(fz*7 zqq(`US_FmgPkYK`376t@$;a~p5?oHcf9h6FS4Xb1Q||$*O4k$v z+fJ0pb92q7Gu(igzHIdAnSL|H&Hf3bRlX0NspAk8j^1pDD%zt*9xe^n({JBIoDO9O zYGv-s$;j-3k%tL`|3J-Sa2PuL_#UotJ_MIQu=HD@9n*z!fwM*Sx zisjRq=yeB+HxINjq<06DR$THRw~5k#z@~+8L|B|(^ltzBqMqzwUP3^C<0FjZ%dS|X z7xj$yH9)z+tEe!`MpPAzsx9-4A>)`UC4nt~`5`Awfu|s|2xf9;9<%R*5>|-SOeP>e z_opX*#Oj+@7aM2xMS3lj&!@pNP9Ztn4Zl8LK9u2~u`dsO2 zz(rw#uU&N#{-C@i1~n4`3WK@r$(kCfv)J=zwE2CnN^Xw#+s1hj)O&**cu3$;{rD%=LwT)&Koeai#1B2F zc=4}LJMb5kXgkxPpu*mxe}E}EC_HsHU?^p~jpSDF4^dH$)s5GYawGwN(933=4P)UtA2BFX1`9hr-z_q%Sfi6XKbbo-j#5_&wvsI{^+!oUZT%H$@vAtehUENT3oM2c$F@Sjn`nF8j*2H# zi**0dr&-hw3}rAm8yv!b@h~cu&42!&K6)9aoq3q_Tn|k?EO)3ook-Y(c(*&G*S+l% zagKu#jVOQ1_Fcdnaz{%RigvkCeCnxww?}V@Zgo#k%8I$&M)BiT?Bp@q5u+jFdW)xy zBa=T6xU6m;F3sYsO{Vw)SqDv1@6w+Nf8`ltU-gz8pI{+#&|-7%iG7utA#>i5luaPR zLX?p_oi}2R)@~7yLq?Ld`gt~Hj}V{ML;V$<@VBmc>jL0N*W1rm@Oru{fy{UMwR8){ zyDlPr<{sGp(dlW2zw)3%0h%(HbJ?gRGhL40)UpR^Fs^H8B$!ZfaXBaD#MS>2cE ztZH4$%S`a!_Qri4*ik~`IBqzG8BsKU|QU9ZFy@>o$_5`^)tq#8GU+UPuD?n+j ze$^|}flA{tU8rI`J^dl2c^XH2TZcnbPxEva6!#6XJ&7+r0-m@T^WSeHzZ*1O!;WY- z)FeC;WJ1XlS99{c<3GXu3e6--M1XC6jwTHz0eXK@X@VtAqubif+c4*KhW?eWoUGqg z5lLkc6BFz5vO@u~O?gs)C+FkKm4qV0;jMTdo+VFtKY!Lj1qHGsBG96oZs%LmT77K> z4Mlq6?OJ9MglRPOw!`!Uz^7y61#`>jd`P_9ae*I*<^z{Gqr@SocOj1|` zHbWejb$Z#mx|b;-IYeaF85+RzjqbWWs9*@pVKpol zMKYCZA0BchA#It90BjRoZ;gBDhvEAfD1SZEG-E;=`>5jc4URdww-1+i@s z6~=j;EqaWm6O#8JHp^vJPbOm{bD_q76zmj42}YyVVS&c~<}zuiWH;>90E-gQcw#qs zztxH9Z9|gxbhTp}lVPj0-`z@uB_vB}mk2Nl`Z6`3aF7y!mi;6dX1X1tn}ct-dK0XW zUEpNMORE$2*69)Hpu0?+ceyuu0X?VrHQAOhLho}=l07cX)#S26eQs^zMS8mlMhIhdv{64>U zOBkDk^qZ4M3$>=|@9>Jp`^8*$n#k*jx=;5b_-^f{s${RVA|v6Me&!J$w}uyZ?qczZ zC;G~a&j|6a1PnCct(r`C*$Lj25mN(&yadqXlCB37yPfD_Hc^4^WI}pXygMR)kE=j~ z(toOzm4)+!5C^ih_)jg0(q9#3jcyV%@E3vw!n1t%-)=Rh%sej)m{J9cYV>C#2Of=@ zN12ST3*n47i5IHz4f4Lf&I#ul+$5wM#{2Tr39v=PKsziWd(Mx{ZWz2=wxHQtbC>wc zJSew6cQSfqn-pinI$J)VXl;9uqSvB$)@>_D)*LSr`h(p)yd`WVx=mU(jV;P={p^`K zG+a8fa;*--nyb&L#Kb{FmuqyYu=ls>loN%x5#2fq)C-q2JVC+3cK%cLPR{Mw^&q?5 ziG}&Z*H**T%MqH=4g|XXt$_PJz_e1${(!`SufyO&Jp*+{Yes(=g?noAb=7A?zcftN%-fn+9Vqar`h~Q zMX3g?$eL!nr_YX=VLTQQQ%VWLi%t@`CV@9}JLUZOW#?IM+KRL}8p&}&o z(d)gIC29Ln^EwUhQ*+gj-?hvRdKV583s{Hvd<)88dq*X*N!6L^r*D z^E^Z)fsw&t-JvK?JdR(|#uzxLUm|Y2*LKXGUTZQ$4TJiBQfnCS%WNp~-_A#mX5|)w zcWr(|zZImG2vK1b_g!x|8-DCM&lXhamBnK&pGf@$4jTW@Mv@oj-j-lxh_CJBVc>-w z#W(n7bf}bNUq?&#G{H$si%u#)Q zG<-#j_v2(Vb1n0*sn|)9fVDVp@7Ue7tx;zX{T*taIHpJr)=YAqX_Yd76xyHk@*}ma zSFFDTJXbP)rmGbnfSPMQ*u!Ao0SK<8VMw-Oo&nOtzLF#TR`cQXP%$2nsSk$)80&Dcf>vVTM5q;#s(T zX^DmJrZ>wGAf=IS_7-a#<^}!aO=~f?Lb;l~%gpa26H9a$kMYY`&%8OL)-wd$bDjE` zon^q!O3KCQ8dG(;A_xJCmTeKQc{(c?4+rAe?NlAN_1wKxl=R%eF)%>nOfAesK-=I;dfm6zzeAGzZ_lyvO6xWn?Q zF4t;9OM2|b69SfA60Ucpw=E+IZS$mS{wxXH<1EIFlr=;(T;s;tZB(bWZB&G#=eNTW z{=Fwt3ah~*!}5df4E^8QqWY8oz9k4qcVz8V-D2JyLllid;x7orCX7cqYbM*!ozY;t z)zzFH0n3$ktt)T6R7)&w--(dxKs+|Eyqg>mc!2(&LY)_%%>yM#S)ovE;i=zhhKeeV zd|$0k@V=MbzEiKQ$!Q_Xt=flb$kdkM6UL3elWaU?9N;;Sz!pM^IU9kfQvg(bD<%=! z(U*%}b|gQ-CoHKvym|HqPGjoqyWgo{BV?>DEm6YP4qZ$1Cbdfi7%;9*oLrYu+5B=q zjdmdkAKn{R#;bnsXC%PW$02>09XRTA(OD%o6zqlPz;jh9-X!6gEQ3b;H(vb1Nm;I% zz!`UHahr2@gNVHTM2`<}ILToMDWZaL#>yb~?Fs z*zesqISH~O3h-=S`(GZg<7=Mx{_Z;n^apG0{?aPp@tQf;X)d-;sruOOpdb?HhpiZ! zoJ7OOgKX?fF8kNIfB`@Fqz`$)pb<5B>72>z#}>-8`EPCBb5}kTZ3Zc*ga7lt0QT=X z=wCH?5ATl@@1u9|9RnjYG}?h&<3e!HVl9r9y3RdI$88u7@a!h9%0Q{QC<#YmKHe&m z87QI@EVHk}T}c|RA@cy}r!cm$ka$pI*J?aIL`)@{KzimlUx4vHH^1*agxbw>;W!`=a-Q~R^44=EKt)q3r_XQ|^j zS;fl=D`xMe=h^bfOAUoZ*Zqjzo>44BxGv!~vkw$Crft_uD)XY8sU{StH9Q^wH34iG zdI??di3>(c0ZNHX#;ZZ9|r4nzg9G$`upXI|ngfn_|ohWM! z7*k}S3BOQS66}IN$w_bcJ%z;~x5LIEwV+Rv0|C0Am54#!6Eq>TfdN~XHNP?A8b;?7 z`o)G*Z0Yq+8Vx;}NhNXt65KaqUII^nXIKd%Di>dLF?aE}GOS9EZbxi13!!|G!Wdvf zf62lkY4h4TT346v~t3}|13~3l*d8RKSuze#Yrs2VDehK_=PjF7-RqIxn#0ol5pGP6$ez{HjiB# z0<0I|z*A;y=C*$Zb%50dPU{*1!XRq9O6Cm0-f77wz$FIE>+MY6Dwp%}qnTEb$QK## zo4;MHuCn9-p}F`>T+q%hm{uKs?)h{viyUIZ#OU`{HGhthkP>RT`;~-0LbpZP#e9}@ zniI_6sL48xkO{M6veY+K1z~uxe>&#f*@+N!Wpna>vj6{MN$tY#t6$UbtxPd~m>)6Bk>K0?hI|11qMp&(td;(gb6W zR_4xdJnkWdM8O7&-gGf`i=OvN=GG(?@Gs0JZmXM4_q$XOn-nXDe&da>=c-VN*xgP| z5~LyI{QSG+wp)szZ>w7GK=ULbqE*;98_fOi17)3A_+>=^f)8-znyue6_2K`*kVTnT zgBB*dJ)d8nyr*3=^7&Dp2`4HW!`$tj1qg!9_sIC%#Pw?26?p^{l?3#~l|;53*ig;R z!tB49eyh65dB*PjgS|ilG}fgxxK+FWemd@Vd^4#SYfV1$8(An1kykCf6)gP)RLs0G zd1!iKo0nO!b&8Z3nW4MJ(hFBER+FYfkSSg(q<_FQ%9>M1i$k5WPnn9SggFLDV| z{JO(SF=A1eqdukmLoDvHjc{+s5TAbGPi5O)@vVAe;ReLIq3W|>BGl;A3o^2fQQtr%clkLhf$5cJZg;5Z(Piz2-tw+yH;=E$a38)m zvQ?0~Goxd;D&Get@yC$%sg(wJ?jDki&VFc-SRA*dg-8jFVqnv=WY{rL?T(q!b>Y5) zXx7mE&TGE8_lkiybM?akI928oWb{QrZzKSsk}PL^B4uw9rWi(R4T5J*jvP*T)=ssJ zD;cn#k@Cs4UON^4a&Kp)SdQA>j z)`qMXCXDL=6uo5t%GE4&4scsd2?NBAOFq!WXD3;7qmSL#;Dl&up4$DlCT^D_ctvA9 zY(no@xRl;|av2uZh4Yvn)v`?g=kmKd)qN~a?n}Uo3gi1sS#l?kBohUw6dKxlw$Kq7Ff}4JWL_8D>pGW?tFb?!5v;Z4CbI(=3epbl zN93z=n^W13VJLp=Zo0|Ifr1mQlgb__2#h!}hiR(a&6c;hUjL3R2k~}e*pwY0km(*F z9@+Kk^`9}XEp8jfM}_x0b-vr^4f9TDwC~&mhpU&%q30-d*DB>X=V6W4oXDF!Nmfb~ z?8fl2988tUkI*(HNV7LU8`$}JeRfCh`#6d-=o4Vx1Hk{?+Dv4?3+2^kdXxNu?vjO) zkB5q`u8lYh!3j>h-64&D-dwX3@c(n1!2wB zdNj69{W5GhBbE-!@y!@b-S?pjo* z-vf=PxbX%~zN~xxRc|PUystFOCf2aK&KCNQiN_bj_ld_R+Gza@ZrI@JBuZ+zm>yg% zC7>9(OZ7)rWBP^m$rr5mIr zh8h^|M$dcBd+z64e9ry*{Kp5FJ-^@DYp?o#*V=}zcDnXP`5XKjwP|T=1IcUp(^ugp z+<4%Wbb+jDTu17Mo!tx-qj8}s)XhP^<)kM6W?GiOgdqFzTfFTt=8`jy2V!gZI6UYc zpCPRqNW=D=X=~I#L$lNK)+)nlf;X+8x5{<`Y2-{DJ@IQ-BtOvi->omt@F zK$W=M`tpW<6rmMPZ>8n15UkpKa8$H2e@87$_<$oY&u?tY@KCn&Fpy+(MV{0e!Zs+_ zHcXte?KcN}^|XZA$0Db`Cr>};;lOrPlpttb&8N991*bgld0me)UncS@UDP6Oe>ur_ zP%|6k6TN5L=0I~I#s4+@HQh~+IgXnd{4*`b5S#YIFY(QZmFH{c zw8exH6=E5Z?A+&GJC?o>Z#lE`{%hD8YNmFm-dk)vaUYeM?^5RHZimPUdB`NN9I@y{ zGZ54vA{LI8EuTc6+*+x|3YU`ZZ4O@-PMT86b;f;{l1OgbHe^0>cC!SX<36ZbUma`& z7TN%~0I*LAkm6#oK*6V4iZea0!~IorwH9yK&roKx8Q&Txc3nJz3l@zttB0qkzB;!j z8RJ!+elhJ((wt|JG^sL&wwK=tH}F?I3GQsBiTDur4PyhXB29l>dM7Xa=OYRI3>Nh! zxQEUcP)h)0RmhKmLYjRue4kLVljb|VZ}XX&%Mgzc{Bc$8`0hZ!PmdCbieOwV(A;>`g~lljr!dxfa6!foZTCX4jO11tX3 z5l*i678*cZ>Kyx>WkB2Ot!yMJkoBTixG;@K_q>siD(q&ULVCh z5}(<5^Y|60+a5)U&RzjLp+ak4Jw}Zo{KGWkp3attu>OpV^?B-8txs^BZg{#7UGIc5 zU-eti(tTxmon>_(Ckjl3(5^cnuon1s)umAGmB4VAt8VpHWE9inc(tUsJLrpSX(5eC(1H3?#e6SCJASC?l|4jcwu+o>A$OYYvuX(qouho`|s=Vo4iEnqz7^w zi`H9y*R9Eog`1kJ?IJNS*LdPyvl-zhe1140=|tZ}oZPHN9XtGVkZw=pT`0)_>AFB? zf6ge?MK1Z{uP>opG+|a+2Or*ywcx?d3Um7!T=wGXRaEG zmb3#(Owk{{aac|_2ZBhFb9~J-BA-3c8wr{S@bxe&+}~<+MlV^1dBSw}SS^cQKJhp{ z@Fb^2e$yKDb$+}w`C0BwYO|YnsYe|c<+2;QUUV~jODPb|C5KVCDWmR(MG~JIn^R05 z29wcMcqVCD+VW0njX_QBmxmMMEu{y3W57va;ZsJrrXrK{NuN~EJ_(;Sxed{I_zHGk z1GdP0(T^k(Grq%qM`@H#a0k?kJ2Z>O-lN;Th39@juod`a9}BAe+&SffzVMZS^(4WT zno#YbR)HS+nj*}q94&ga&$ZzNLi(>9D1FOS=#|p*l1bm9!c#=NHR1}oLj_Wnf&V03 zH=1e7q2yOo_jQ@6Id5WJVb|k2SS`bhAiurNsZCz~XZqqN|5kC(F6dgXqur8dyc-DP zfEo^D@2jbqoXCvopgsNB;{$g&>)pz5JS|!{?ccnzgi!s8#^Q-A_N2+~+vni-{e0{p zU^B9+@9SO>+Hw-nAI@!}_EA24uJ_ReZX=?YMzG4suYQ195)wI^nbcLk5&0$-omNtH z#q|GVLW266whI_5``-uH+s(hDOGR#9BuiQfGTpmI*YsK()L^5QTf;`8WTNWhZVnhv zllWk)+avjF&eKt*4A~H*!I$QzR#tT$R#yC;M%nR6^A4!_;im}hJqhxnZ-m{B%g@#K zIS<$S*qcu^z9=RcZ!5 z=k$kx#0x9wfvD(1tZ*)LQ-Sw2VBp1iie!&SH0E1P?Fo;iuu+4k+%*#Cwf>oFqf?;y z;qdrv(uwm{+tSl~CHv&JC2Vuazn0$W*Xhd_P%u=32WQi*5|Kp`r?FFmbT<;7$gMpEYSZEJNnEKE~W~+zFA6k~&LadY)+Ob?m-W-JIjEvkMDfPTp>g}G1F#v+zKrqOdst`mLjKXe8FdmJR|n>gPKkBbci zdh!*QyPvO*wCs*FD1=Ut>+nS}**C9^zqb7&$KWsj7k2;`KH^C4o`0Z>pWj&fer25| z1{wOns$=}ubQY2UDb}bux%E? z*QsEzpa})UghBZ^FIDl@Kh9_8{spJNc_`33+ezs zcfV69ugk3?4;k)oI8_2u zxcO8=sNO%gO@IFZx-8$o)Ksc0_5=E$Qk<(n0hxZzZgQ;TxXmjmO9s$t3pc2R>w#zb z%2b`xcHK%ElHVaxo|Qx^#en0bohrRy zuV>diJYV@NwK9UDS1x%jL~`ni&X~ZR)*^hb@9#}e0u0 zOdKkQMYn&BwS@h*wKxdv;;CetT-dKtgz0{Q_>)u8h7?A8b^6;UZdT)Bg?spobPeGu z=H12IG8RwYOQby}nc2E}?_VnNr=M#w)ph zddq*AHb1{@aMJe9_)T8_Hy_djtyb;GxUx|9O%O z@WEspcX7MvMm9IQnK&$bilgScG{48NQzfDAEOf-v%ESQn93!3f?w$UPu%5r;U4Ewc zXhU{pY?Z>;nrSI*8|GUY$mxmZFcy=Er;ZtY z>N+{|bw~Zg0Yoou{1}-=drxx9#3%E2hfhEce{D zzCk1SGpuDhb}fQ9%w|t(YU_Q{M4_g=Z04unY(LWFgU+%&N92KiS2Ta|kDIz}uTRs_ zCy!rZT%G2d`|7k(Dm{=LOlOz|-`YrP{zF6*6z2zgq=zFW3DsrsykPr>NGUPG z$pzUM)pEl7m$>i?|BA+|j%6fqL+O&mqeDlwKZ^=RBtP~=J$nszu4OS0ifXLG7S=9F zI~DRcZ9F|pzsa>n%k_sY@mkv1SiiB)xGMlne;CaKVT!*hXZkxrJ5`w-ud;Teqk7C` z7MjRp0v-{UxJ34t>-aQ^8*UNu7L7ZsY$-h}np&Kx>s>!$i3?GlV9}=^XCmqNX0;pp z5O-tDO|={<)8Ux7m6s!RY2fPr;Mxl?_~T@evn!rG9hU!bS5_r~o9$P@^e4AJ@^HH+ zibjgo^Q#c&t{E0yD(Jw7`4nuN6r%S7aEW~$;vD?m!k`6o@Eq|e zb*8zQ-?y3=a>T|G>f+fIto1+zpZ~~u;ufR95Q52UqM9-)`m>YVFRd`y)yKQu$S&vx z`p0t?rnfES1)SI~7eyyF$o*0XihqCW&-};oSK$YgLagR;U*xMEMr77~ch|#9u$^#_ z$06?C%1pq?wH2l%>?VAEEWj4j{MSK0UpCgI-+*=qdU~BAXqtX|`mhH^fl5q_7QN+H#OUMZ|#X!(PgcFjCe~W|0Xn9$)J8S9|$KC_>)XN{G zmI?$&m@G-ZcrmxP-fW?qbpRQf@EdI6kK@L;`f7th{k~2F9 z!bl-eVGKBk*HElZGvwepkiO`&%TIPD16aeuNAGtE@23lby}AI-NyTdkw>WSQF?Y&h zKx}Fwb{FrmSm|aU=BbF0EC1{p480~gU@+fS4W>Mlxi1qVkeDqObALqS%9UT`j%$WM zct;{zkK|fI{SpPIvl7-`0cpxOQC_MF{y`Y0phISPk`TMrmHGZFEhiBLm{~Nd+_)CE z!PQ^!;!SrT!l;@MD>-y120Zg*>&1cqI&@ljCGEE%{a48N?>}W=AAu2TnrwoH+r!_| z_%$edq8WK&;UgQ8|NUGa7359$f6qmRGva6fqjN67JyTyo|?Yn5Vo(uKS+? zw3=9;S_Jv=J@8~^Q>{GyUzx#8Igp6D`^;YmdGAzrxmge>W;&hluBMTtzmBq?#B-`NG3laYQTXcZ4ygbZpULAv^_j_xuI@OzvOv`@@@XY&=%7f+wN zuY8)v8X#{vKU4p4-#aYt3e@9N^lV=(R7ftH^2AvDY=f{H z++H-?o4kpg;I5YLdHMNybaA83P!Jsw18&kK!6^^6suk0}_AbYuKMOfqMKxl5R4(iu zPf@Ae`Mz1JJl2xcNRefPduJpy1wMR?@9if%v3r#;sZDmBk8@k_4=$muHPs zVy!Gh&6pQ!XLFieC>uIxC*#0n4b5>E(ns{ffaz1H7d!K-V8H2M27g|1z+Ql#_M=B4 z9wB~-5sKH_#V#u{&A$hGtMzF0-7WfEHRx z&NqCw#GrvK_%_|UN=sF_ml)V>8(j{Ko4P!)Z`g&|Wuj?at$cU)wMn=gs!uCSBjm}3 z4VfS;%sb)*v+Uxm3ta#Fen%``&H1iK{C^#@zNc zWz&D!=!pwDG~}KyL6x4qMHhdMn(43UhZQDotOfpjF#A zm{PQPq2SrJ=+U<5v1bn+35Qo^qw=ApH$04hw3c`9tQy!kvaZ7<*@ zb($Xgq$P>)kz!Nk0^Phg#ITp^wxFKt*0}Y-XtDO3^VgYXkmJ{oEV*B1_x-Ju7_GahbDfjbVkq@&sbQcB1;oU_5*3DabxoMwJzJxQNe8wFcxxs66@jjt4( zpAJTIJn;g-GAu>;NwNKiZDjHJM)VqlS!U&cl{Oh>w)}PT<14J)^=)67mJEVyhxQY2 zVN|f3A+QJ5n5R6T7a;BiDKES*wx=lmel9xn#OI{WC7-Rbmz28VJ2=3QZV^2pxo8F@ zDEDoS3dZk$fTO9t0GB2C*c(isJvQB&*`3H0T|C$n%yn4`A$#`OzG}h=NgKPs?tD+~;X_H^bMs60r(2=z4-> zdv2Iv6cjd4P$dbP@|;$}Hw2$+;ZgG2#SOAWvPXbf+M}!6M0tHFYQDsECiU=S!8|p> zVQ(aUFv`9G)gXsztSg>?F;zXG_VRvwSkP{tHl1&@Y-xOQIh+wx1Z>B(Y$8_u5}57T z+)#J=73j$m7Y>`XqJZ+9QBm_x@3&OzOti-;wj;ex$Icf=6@2-%8j zSI{uLq>PU9X1YWAMr2p#G0oxc!!y8@zC9=53FcqJAhxmv)oGKbtVYXnb4=FLCIUve z+oWmY@^3awbX!?0!fhN?A&}vT5J_%2(=Yo_(MG?qgH%tmjcjelCzx~OHPLh-U~ro) zooDs?werFi9fpc!R$c{x8ege<`R6|Cn{RLuTPAB`$41f0AhxF~2p_)!6Xac1NiVg0trvC0ThDAym-zUf|BQrgO-CI|@9WV$|F?tQ3szyl(JOenw04Ac4cS*#_m=5K1v1H;^M| z%apXLoPcKzd7vrFn&YnFx-oA3r2zQ?ks|;b*EAWc@=OQ)MT7e)S^>F&cz+yD4&d&Fh zjBBach(v2=2q{FX*d9H%I;ru=mP>y62H#7w`yHDiCO2+?5{8#_E2j{VMrV;hj9YI| zyTJBV$4;J~_KOTyLdoRPBc|QT;*OsBgH0TDZQFQ;kHUbz^oe zYaqkg*R$T`vAiZh6|a7*^W3CNuFhCg7DKk}ipa8haUM)|ChZCJV6U%z44Qa{ZhYry z;sPxI-P9;qEK360$yMEMpu|7L4k@o|E(BV8!-L5FsLL1fdd{}%` zcZ^^lcK2!yn@a;D_e?w!3|%XNt(Y!L2X8moh1Bfyo%`!rMr4KUc+Cq}2GJVV~Z1<;Ee_jPlIXbP1xs+;sz5?-2jqfH5aDf7Ek zS@RJngm19NXuTUM@IeEy6T+44t9&$MwNjvTk-g;@UYf(8XaJL4s$dTdEd z<|{1^&-!Jxf$aXms7BqR-boVR{k|~8v9lg-&uI1-QM~h2r|KEsza3F!t-<5ZvYvn_ zICpS8oW8_FT1AFoHV-M#~16}*J7yF>c>d#Y7%dMK8^7WM31u0g^c=OwPD&t|pq zGku0&1_x^d2>~_J=H2P#O+Rg|xrT%f!M23(@ftgN_7-I+A~ts+`RX`2gw(Mv#W`MviN$R z7Gg#h+?t^R)$!O4^b&&@_Mzyw`rBI1l1*FX(?xT{445HHAJ|8VDw5-wRMhJ$?b#&N zud)6#crPbs_J6|i3JEAuLm_8Qu1_wSHh8lc@wH3M!VI3xpNl?`-G3$9B!J6tu8l5H zz&gX`6rn^i-jY02Wbm2s)CDo_QgJ7r!eYg>S0T2-*LA~%(Fl~2%@ai|%1)04?YT^p z@d-H!e>mgkJ=q0R5-*KbPP1GrO9=PdE;OWEt9){RMvfe1L@-rsvyxUa-xa8FK+nFG z3q(Q5z6?am=XgJtCsN_N@92hS=p0wN*+AP<)?7J=n~_7>+li*7d^S|9$$Sp;8(=j1 ziRYxNlg;vCRAymKnxOATFkhnkt;RPnmve0VA6(S_Xm!=mp_&kmLeF%xWxVD)9B<`~dQ7lE z8F8HtRT9^h0>$I8-VIS#qlSUo$$BiSHiq(pE0(sV8eB0eKw6vVS}!{W$aL~_6-$(* zamjr4iRRo5FuGDO9h{N|jk^N}>Rn$GBT$v@2s3hB9Uz3vZCueVMD^F&A0F&(aF=L; ziW{_v(d+(ABxX@$B43-iPG35Zi+dZ6x;wYoaxqYPA|9)un@!Ho(4!RFX za$jQZCYrM#h?$M5ZINuN!bb1-4Rh5U5;;8HkBy4%-=3}K8Y|YV>E&$lf_4WEYa_~& zJluOhj$4QW%~4M{GQ67Wd8s?_ zmj=bix3rLpsw~I&0AYGpNJPs!JMx*Rt9_!ju)tL-W-L7NSQP?jz&(x%ElQymMsdR_ zAgm%2b{$|b)UKAt*3N;w=}oDTxW`w-&N^-L?A)}}C3V5V4Ba6E0z!La_`O3b?aB=` z%kd*Rce#KCRazyeoA>?^BS{vzqrkPi_!_SwFUu;4Wjhi9E0|etw9M80wFmBdiw`$l zjJABOM|-kYakC9lbp|qA)YLY^{1SV+K!_rt);fa@O`<6>imefYf>0^I{ASD?moRY| zzY)>hyAN0=4j&qGoUx2RG2zZejShQwBgV(OF_M|D&O9b+&Lf?-ZmBC=j78nuDX(*F z(B32JSu1@BD~@B;7jsrFRyxGnb?#*_pC78rwbG82U4m%&ysgW%?uc94{!3|M)YBu- zFEKA*mGaUsmZ}`oY}%p*sA2Y_-u60Vq7JIO=S{;K7JYFLic&q5`3@y25Yd^3-?%HF z3da1}9~9GZon?R_OI*?V<28}Q>%+Xj5T34_H|w)I%@~%zfN~PTafsmzo(JU7a`C14 zvQ%_*<{^t;7EW7;d%2=XeWt-hjr&nJOq~eC_zn6Z#AyYO1iNRVi2l7n-bzZ98wqE5 zZMH3EWs)a1NZ3IsA&Np@M`oBQLMBrp7`~fBSzs;{U#iC%QBZc^QB%Cw87Fx_{)mO9 zqwkI|w5bRh8)Du&U=G~oZSrWr;<$5A#~5dE0E0g>nP(%=xNUE1w046OIsq>s0I|VI z&NjGrGx?&*)?#}ihuO-ouJ2g^4oB+`Y;Lnxuv%D6H(`%V1>e2yUfmkA@uI_CuJMx> z$dTT~CE~Ro`V|2qE1+O9%(arJP%9q@C#%7%V31DJ<0r#+cTV?9lyYAsyL1CuF@YtY zGg@8KwH0v1%?s%CbjnTML*3(O@Lmb`s$SDg+?(dwOR;Z8MPplgBR27K?IM60}08lDB(hz@y6j$(K^^O z-VbgJRbDHm00l(vC+q@udoazM9lbTv^yi*3U@t^0jXrrIK81zGUEB)DR$D|r!A(i7 zyRq*f0O)A*fZAiM?~{Ex0F!3U+_t&pT{p){DLZV!!L3_f_7epWdf2sAsjeqOJw}RT z+|svcrHv>@sZZY6SC+L1YCIbB-zBo0uIdBR1k^Q(y$p+TS~m$OCaH~Po6{g(N*|UJo0C4s-vYdk#F*h;q*qQwm_@#h-aKs`9H1%Tu=ao;PEs zhowFo)w8G?&M3bhu-lc1FA~e3PWUjcv(oGcM4)ciM^3HsqydDrAzfAmoP->>>)K5q z6+m4S{d5C5>Jb#MK+??d1d(dDnJ23QP9LUuE_^@bHRZW-eq0e{U&CXb{EzMF3ZyOf z749`XJFl7EF$=W20`7UGSytWz$w;Z)=Eh)HQgy`@>#8&uleed9W#8wE8gYX1GR5Tp zLevESL_$YtO&~(hn*4ue0ZjRgHF+K`zQ^&y#L$bm&IFGYwP(u2YFfVc8&bf)mzc@|a=bpA+OT)sWhf7QU>|FCyA&ZAMY zL@zeQO1sa?-Lb&RrXY2E6}eW8H6+SwKhZpKYFddGN5~YZ#9HN|i&ywqAH+X7&p)0n zt7-C0lx`I=H?7j~Rury1)A-Q4L-PHi%ya+tPcWk02le5lrhr*)yXMJYjIKNe9F*7@ zNqKFq?cANd9>4nW(;GkSYn2ZuYCR9rPCPpqWuhOI73ka(^*McTusGEN0Fcr2hRcI= zq1#kO2c7pvHYE9sh^#5z`Cq_g4$@R?7~rz+;DqLTY=hMfpg|#hl#&-6 zisE=HbmcO{VwUn(RbL2<3i`jQ`m(L^+&^#(1wskE_MBtcm9D}Y5%M2zw4W%pvapcM z2rIV2-B#X2T?*7VD1Z~nlH!04Eqgw2m+Jxu@qes`lVBP04PE=fN$QyMDv2s#l)f9Z zM29MpmCb|lwic(t_1l+O)F6Ui&-?KIjY7yfVc;ja3q&q;;egO*{`1>BQTXzzMcEd? z7)VQ_Vs}$r0U~3;cK6a5%r{3tcKW%E@7I$*d=m=TR1#D-iLXG3g7K1u^HthU*29iP9stjZkBuIJ^XVsefm@1mo{C&c zAiPHT;9bS*6tO448RFkNZa%EJyn-C03|{)RMDr*hg>Cm@(_CO6nHS~p`j@v1l>knu z{mDLfyAp8I1f4!gUs_eKWt*)*tH@$t>)aGPJhk(=ppUpaneR8O%=?26`q#1n)OXJw zP}V@fz_(}84GUn371<1z3-HGUM7iPEdV?Qels{IFW{0)8a^jpVRgY#n@7}(U)nn%i zkw~#Sj@||_F;N}gXFeSuoG^EzJC_@;`##{trWnuPz-o{EGXHN_Rj0+Bg5uW<_kSRS zY2!3TPg~(?+i?shbVkeAkdxnJo&SWLT>LI5#Lo~+rwA%BBYKX|C^BGEV}F}S@503t zFS&GM;NEUPz#?)Umm*L%gVOwFu;7^;?Zdy{>r*I@WuG9y z1@``5ECOoLKaL&#!N0Y;pdAu@c`ir|UXf*z_)~`>K*`FmjUQbmyT@dJA59d>RPKg3!q zNkxAJio{EabIjSTHJ>aihyi4aiTZ_vJB;t9mR9dCE^;MKu(eLxzH@$kDe>~A0+35T z#-ihI6`!QO8G}}#@2M#L+3|Rab3VhOP?V%-mr)O!`%XY#?LYAnH6`O$m`LPaL zQ2k@0S?{qrWbHfFRQ9#h=a*y9f1%p}hp|jAUH|*UQwgARl5hw<|5*v}8TAXsR4R2x zy*1$CY|H{C)xsBBM)hw99Owm8=lZIe%!xCj>6BN;GMZt%mp-Wc(+A*~z3q+o`28{# z1{%hxL@P5GHNX%d)9iH&%DFJ(qb|=+roVUw65_L{GbFhF^;TCJH#DwT=y02`&Uv+7 zNQ2%EB6U%uZaL>SK{wIn%5ynp9j4CPJHIMjcAsCrISx0I?SsXPOjinH81|uL6LHDq zNA7W}Fglp$|<02O!U0@WPHKDBSSzfEbG)-RUS@h)Lk0>5>rkff2(don?vClo?Q zO5N|^X3G}N{5$uaT5tH*!7UhAQDn?d$joB0m#a;i&O z>-zoF6@qSC!6h%_1Rz|5UYR(>g6BimKm|gxbSnCS;09tDiNKyr0gEj%V(&|x_BE>a zn1I_pILv`wq8BZ(M#)eC4NJ6QmFN2{!R80g4>q*x^4jPu2XZ6ItR(R%gp>)RDei{L z#oL1#>WwZv5pMq~ouRZLd6R&>< z%?BJuaB=c{gOE*!8{O<0Yn}6P{ba3!F8VfBlPH^8CuRl??JpXkv{f9J0^reD5)AX> zBCeACK?|tvU1)*!Fo$#J#>cbA;C7rQTBS50*;t;;oejO;)M`NE-}l9`pKfG~XVZ^9 z!oHpKTw7j~xg4dtLHHN@lseWVf+#lUe$zvbI$gY;$XRLS*@#SLR-Q7dy6mrfQV6TUAtgs24g3F zP9+Xw_@%hl^jnkXxH@iq4)9AvgpN2kL^rsR zU?~f1#VGFQ!QZw*@o}Kc{`sV~F_WWPF5#s?&_5QBBL3;o3ctrR%)x>!^2DrNP_3Yi(-_h|`Woy>>5R)=Tx{|N5)n#6@fy79IY-P5R#^fe`0^CkdRm|DB}Y z7UX~C?w9%f|LK#0c+e`&QAi~`G7)2nMrD-VZFU2p8tQMi(9?*nUBCXWy+cv%qDR6l zyeO?XwQt||bVz%w>M(M$(M5B2=_}ik9Pv(K8Rtz56V=&6h2*7AT@?VKU5jSZPfBQX zdAE(2{di?;w@(p3!9=Uya_c^=v^1zxFN*!qWl-_r9?7?|%&xiAJzotm>xq_$W{|tx zwm*{EFiFPwd)wkPdy~pOCkXq*<7rvs)nEd;cjkLfZ{bx*eh+3w$5($`Z;qsJl*MEl%#~rK zWKUk_j__I860R#m#WR`j-Za%Y8x~09u`lBnF?r5jpjW0B#7p+?&iX$(r=PxPrC4wu zl=oW}z2>K&f!)|TPbOA%O;}go0CxC}{An=YE0gE;XWVP*B^%W(H~acblt8eV`MDB= zSg?c%chygFIdoN+OIZm69-jJ$W@oIr&{uy5Z-HHnBa zW&cUl%^k;!`n3CULATwyXs&>O_j1w3WRu~+mhgl4D<#rtll(dJrsg>kWo>hKbBo|A zlaA%$%yP-KzL)!|#a6M;Cjwm@`XKmQSA1}2Mz5VAc`5>erV*Ev=-EqM2( zo@<6v2wDO@ld<7hQQG$l(3xD&t*7});Nth4!DwMm4Mvs9_v+r6j`@)COaUz8uqnc< z3AgQTw;6kNRN&Hh)w(K&uR(!UM$sL%1ks``akA0vkMHN6pbd_aj>O0H&T!b`QHU^Q zeNn2JINTU#`{c<3h7$362t89w^UZzp(CX-=%}kwUE3o%tppKCc5 ze30l%&$ghU(LkwFu-zarHehhr`$onF!_%=HxPr-5ffjke?7D}I_Ro@Eq`1?(r> zA(6AX#;kWfO?eSPTC=#RC=RckPUh7D*J6_tb9$`LpL_4Ul21PK$*-|juBmpm8f{xW z6r!3Gca zT+y@Lb}l<9H(4SEL);mbKbYQRdeQL1Yo^K~{W>X+WC@1ejedn46G;ipZpWhBr8TnG zKOTNZ(+mwK6QmY@su%})vM|>rv&WKepOi0lW!nQd^u*PbCfk!x zQ$$r>TG9P0Cl~?E;$Y(OAFc0SXugC$by_!$3MvLnXU!G_?05f?NoNa-DZ@*nlfF44 zvV4alSx_|^#xbr^RXOh8&OlqJ6H@*nsxexb^&|240Wkag4r?i7LXKjp1#2vr!_nR! zx7|=}bQkQ1)uBhxbTT$>1o?4FLcVk5w90a~t{U#DYBJY5tXG>!r;of|*uTqeh!-gl zd|Nj6`s#*Ai9u6I995%vO@r%M+{UES<1JXEa=)0n*uJ%XzW56y9z_g6UZ3pz>tH}I z+<+!NS@+_F*fJS3z8D!*7DYIbi+HKpfjJ@WL$`x4cbBj4CH25OCjDP^EM>x2-U-V= zyWVjYPg%$=#f@j+K+HObPRIJv8mI(^R9|84Ek}E~zl0tANXB?Tqc5{@f=G@QHB_wF zFg-nrSe~H>8s~R7Ng)$)RNaF8C7lK?BsUK+J6PSfV%u*pwgrWlckNP2-F3Lcbb&es zA0DGp6!$z8rnZqcd;wRsSz}w-$8usG;$%7guz=3JoK}Mm&~)|tr0!RRW^XYZA!om9 z>28hrs$)LbmNP~)uNJGNzYh^lX9=m@jr6HGAQ#AuGi!u0%`f#Nw^JMz>$=5$Bq8B& zjHA`q9)CTzorH>EP++ng%;iF!1fs|VTn-w^RQJ*!MBS@MLfXJ&-&d{XJVB_sPhrVN zC)aFs`fU}{I^{Z3Pa}SQF+nUH75L&;+s-h@Sg==g}MZN!6A<4`z+Z zNcm(A_!d1AfEPNH65Jm^8uJIYb4`bt$>rC^s=@#%2|w@KM962rAAa-RTwmYT9$#nk zw9rR1oI;p-kC?6I3S>z(KJvun6?$`yTwLTsONu64%^_qH;J@%YFD87_^yOVMr|F4f z+*Egmm-$+sH=l630{-#tAbYZerm-g?=frX4D>=B?Hm6BF%MQ7e_m-~U#OV=})B94l zzyi|`vWH_$PNa~0~6mqF#rEVU!Hafc|Cp#_A;dkj0MHE z9AAX+)L0Hh=QNnD!4Gr#3)!XH_HbxO6Tn;0*JsB0ejhE$D&Ec(ziqsFh^#T>XDC*M! zHRw0oEFNE2%2s&$#`SJN-?vpqP_K7C%dyCrd)xPY)92K^0_7Bp-@I7VId)-@gal3mlBVXjOC$-r|BuM^uK&vhf^ za|+f}bSVKXo+rJ?aDA+lFUvf<=wH& zquGdt3{5o{q&TzEcZJ8P01rbku|nQ;!?n4zq;WLEoF?yEdbMG#S8S1POV>_yX1gL1 zkBq0|K2Cyn)s}_!?%ch+b(inumRTOE=VMj_u%74G${#<>>b`NdG~Zf8Wya^7diCP( zA`V*;A`?v;R?-WYwi}N#`5$_t0(bYeb;*?`khm7t)r>RDZue_#;F7sI|Fmtv>A;+! z58JSN`AXw+V=_xLAc z)go!?y|cg@EuH)PZ#N=Shou9Hr#FWNy1E5cjta!%MQx5CX(cMdc-K*<>+~d?uJuzk zBSR`o7f3|%ph|^Ik>qAJFEO7PDTOOu@Ia0hhZ9J9TZ*`i?x>JJMp6M zxzBqHatAiroAiLMG)68o+23PuKq>H5M96*eCZqPL3ZPUTS+BdUioPhC%GDW`<@%tc znWwy9ONcl8v3YjldocG>N4gJpU_3ni{#dy%j@?!J9=E^YanA{W$CX#BUgaHlE$93q z*FEN{s&0T>8%%5&^aPF4DfmBH%w|L-VB0xJ zT2tFfIjqqT9&Fg5Bp*`#dRS4 z%n?G`bt&pBhLf)kor9ESR&wfj6fjFDeNP544godx!C;4w&R5$uXC7i*x1{HjZ~I2? z#I8m0%-E>=!$`ZSi`AJ7Rhix~8>35)G{ov+cFD%G(8{PI((HYXhB3DGImulIAPviG zC+c_w-3lw`O=i;tjyWMDSsmSXV)I}k&^ASK&j_9;qGx!+kY#-JARELeDcqaf_DjT%gp`+|dw zGQ$0DG^pSn49@1|;6fdl!O^w+_s_0g`Rn>Y0l%Jv_x6lnOK zq%<3TcBF$yR_?iao(VdiY_u#-(}gU>D<5<<7ofcf7OT~FwSI&z3;iO%Es^%oa z1sStPbRUX0dHu+jVUoYMPnH2Fj|kq54+&d~fUaK9{UVX}h0%{>2+ZmoEG4fdSZ$@d zo{~4|tiEqJ+AdY6ZgN_0<0nlyT18M?!jQh=JwYwm*avIhJU=yjjQ{Fo|5c)^7)J1> zDu4%T>!G)A7moJvswVUrCgi(qHBOVZZp+84C3}QL)bzCbx{KxH56N})pgyn@bZKR7&sDV`gfcq z!|br%78WR^Ojm=-@?aR}1kjNoiqg_$U6Fj}DN31eYldWv}1hmtS9C_H;ymlwA; z7+YYaQAkBTZE03A(Tsc_n!qu$nihqf;IjQq9q82feg?Bb)tUf&e=2W%f{BCpj@@{< zcY0{z?K?USMM+Qy3A1i_&~@eErnZTT>cgGxblouatf`F&O5d16Q7vO=` z*t0`w!(}@8@6)HrniwM1jM;g9tbH%?OWdlMds_tws2%qhwedh9@sjPto(w)ctc*_? zqK+ETmr8i7bMB@qTQ?xNSdBB)H0SM0nsMA!yxkw6c{_N{KUgl^0TSY8KWm zK-`~)_k&EtwHu?}S-0b+{(^?LLZ>Z!_Nyw#OjZbQI|B z&AH-D?it4W|FHL-QB9`p+VEJA5d<6%5fHE;(vd1%M3j!w30-lN+4YKRnF@;j{+!z zg>3dC=IGEB8_5o3eOwOI{31Q4+PT9~)~c8-Xvxj!<9eYM_jr2zrZHuYEi>Zg>Nk!% zqo6A;MgVV=CzD(LT@my;ej*9sL-*02ANB2+6f9vL5;*kqCePP8p^p~$c7{xiKoL{b z#DcNi&y1O)hND}PsF{IH$&g5_&>lGscgL7@BtguY`Az*ybh)P9g;~9=C5H0HPJItq z*k>!YBwC7vPJ( ziWTs~SzbS8R;9BoXOjl;P;qMttQbgBH<`AS4yp;zvG}mXXwf3#inSr+!d6!?&sLSD zzA;g|2!PtIcPR6Er+kiGGt>$~mD7i62>g%h@$@5uW>$K>h zlKTS%u%__gui`qja<+`yLob$q>JQ(4B&=r{$mDl%?6mNLOL)*h%j3=Dmcc8oZgYTt zOxJ6zq-U*7*1)t@@aMin&q8Nnhz6n!MKXEL)dyVkF{dV`5x81G1|Y<*41F=9`SX9} zxZwXripuH;F`*MdnvTYfg;7(i2P-^Zeg<6Eg@?b~l&JS7Yigy7d8&M8y&d8%a(F`f^4-+RwCSu&S3 zHiuIy1GJlriwdnV>=J%ws+ONz(@O3_+N^tG>&J~PhD}!e0~BG8@=3H?vWcF6 zhlxAk=Hq0G8Y9~(7-=+eNef!>%qX$nneHPn!I$~@$IGk7fURU97qm8%9oc%Vn0em9 z()?I$S7OIX=jJe%Z7?8{U(Z3#h6-?@wsKo0FF9`XGLYnBc>y8K2Cd@3qm7loeHEi6 z5jmX^NV~hP+|6J@z0@khvjgp7XZ0@*4iWi_lQNZ zT<(zsgnQdmexqN17VydJ&u=+T%|*UR0fN;BaiAq}nlVtCz~miG_!!0Q0`JhdHNo04 z9NN(3$l{DXOKHCsqpgQ-bap$(grmsARgt}Dim5ho8tZgW?JcP(s`k-LRO6%nn&uv^ zf!k@ZJYc9C+iO_lPUp7&xba@6w%tQOL6^Oo?>U9Q0rV**5UfNh;L=Krf`QgmlTQTV z9;4)=gX3(j?m)*#I=HgwP~`n;*#06*%~m{ODV6zhnwX8b?_$@L0{Gsii+*P^Elj%W zM!(I%`N3nlTQTkwteI+d`Qvpx?nmO{D=QPg6hjbHK>ojqwZOGwhK7n9jE283JYMec zRyIKhnK0{>qOHZ6jiY*QzAoclSAJ|9o0#Kq$7H|thD~wQIm1yb64Wqw^1@X%iRRGN z(mJB#$h2Y$->NZtB_u$mGLF4(M{&!luQN~VB{0)%i*ckR6{_i2IlmtKL1raryo#!5 zc*#e9xQaxJJufl*>En~(^vp$x00(R3%DaQd%d4nc@#SyMW23T=vXTyitIvGKb^+y; z#rpF~&r;!BI^2Fj=4E=8f;acXm4&NXcVEl%IJXh!3_k(|eJNDv$>bHFM!yP3p&L}% z7smQ5m+}>UmGSv{ODjW6Z{zYLu82*7y4axVxSQ!#TJ_ETT^1l}%CLn?;oVImt@cSP zB9-+G^qigofUJLLv7oCa30Ylbt`u4GGgCfHHF&qo|A9^%$gmZMEF8r`)9Q1za2GY#&W zKkX=x^KfE#xL3Ta+Iz{?g&)rcPptZd-lr$pcuZnc&QEToh$Cl*BG&&Q1nu~#;*k6t5*4V9sCAlRURHE{EkE+k+iQ86=G8e&{P&Fg-)SwojZyt{ z=(+~xu9o4DkARuJI;dsv_R47GlJO^@V7l4?AdVt2zb+&CAb9Q;q=b{C95GX8Qi`Dt z2znO5$`C}Zx|7p2Aw|U@acarRI@fEb-;dfh8fuh$+BWFk*xbG&GLNr}%Hl1s;WZRz z;|zlxWHMW|a()lFIAt-4-T5HqmHo5Rkxf>(NFHmq%LNwI;M4~`9yI4fE#jQfQ?bsz zv=1>r5q;bNp3_>Gei=>-W(2F|GrYB!+GETZVa-ruU#W1|m-0wIBUux9Uu(Pi$`p!2 zTnDc*uX~F?$Nt5m?09H*@=24H+RvK6wPYCyUsQK_y((%U=`s*^$8+oge8rNSO%!9O%K3g?z!vBFIpH>TP@Ctcp?;^CeZ6u9V+PKF zc^)vq^iZu z3>nrBDTsPEwz!{>brn_bBklnXRH_@uX`?w*F$?bDOqRo<@L~8~A!o9n!vJ+0PLaUE z)5k`p2u$2%P9ixUf8UH*I-{_{;-hJSqB)arSAfM>o=yWHf& z{fj)rXqF&=->5y4k)7r9NqBHMdcS`bZxd|%wgOWtQw+x64=40^_kmE zxtNMOFuR|TnaeksY`LT zPIEP*Tdx^HoHTRpc~3X-H~KlUSu3NT2pWdlnsuI^trZ7tmV_P7h?h5+Mze$KJqorUEk^$e6zZ$3c8$1O)airvCZza_!NpH60(*j+SrZ zaU^TAPK8!^cPp7ecnjcuW#1;UO*+^J7%NCByUchIg`@ zSs*N=tl)hDe_bp9DT?m7CWIl#E=C$YlbJU9){3z^rLR{m%h$Tx#KYxDcL7taQIYWW z-=e|Y4vRY7ku1in_q~2{Ww+n75fy1KblZp&Ra!dGC&=6Y^*SdklE!T$tbe@gC-@*5 zgv}5Sd#}hE_g+24axsB-)~xlYL{FkCjhr~|KkZXo?q;FZ1So&IiO?eA@MNJE{=N=b z#b{n@d8Q~@>A_{_T#-PpPY$hqO5xP^pL4a+8YOrlE+Iu3%rXJtLXF+dMq#@S_6k|P z#`75*MhHmbt@BOVF#zI=+)*!uLGb?Ba>&{r%0NQ`*>}j>YtS9$vYS(iFny#*}N2{aX3m^I1S+ z;%n<@IqXn>S;fDsinfiohOAKuTgcSSlr#ep3_WI_bOwcD?-%qAEvh}m&qar7rfDb9 z@g2wgd&2tft>XjpHV;7I`W$CF75LI-ZDS_TM{_?;r*GMAqKSm+{m!nY6SDl~rA^J? zD8D2rS1%i(D|?8rmMqp0cAyVRuX8iXf*z=XDLf5Ehk!e}!+KVh_PxRv(r0U2>buT! zTBH%vcv!E11uie#m#l3d=4EkS$>}-B>!+;bQmw|r=aJ%OjqA8{_t|5gS%8@^_q?BYDGw7sk3MgKYWR>s6S#~pv~o8|Hj?wI#TKa>RYl=| zpr}Q0;a^j)G(u`d$kz15l(r8`rXX3UpifKwOoeSjxeSR*;%i;t$WwYcbl{r&HO0X7 zjFmJUO@EkSmRM*@{mMvSR(J*O$vxO8KC2cFuby^sMjiTm@iga?;SP|tmxiA)YkA-; z6$bQ{_x#&#_3l)djjGI8G;6sGCyr8ho|A3RbYUt7Oqq?5Y=NXZ$_N^Dy!`1T?{=0n z)bX~s!Iatz1#pdF=A~(Xf{2UkU4w)@F`uPg{=BJh*I32CRbeoVSs%M9y}HMBZ%707 zEKO+bw6Lt_cW_osK z9|;(Yjh?S<_=pGV?Sk9A8CUuhe@%tPx>3#9r%Wrcc55r_g!N_UFg~|BlUb!qc?p+v zC9jF(hc4B<=#Hq+b6=Ol z@bd0f{OB0QMw`7)nBO4_2+0^*|&^du}Ecr@pORC(Wz;Hdn?8FU6#uD6ofeXWW;Rof|?z&Zx5?YFM5^L8_CNS2SI&QD=gd(iT#*_WA^ zoiIBUR;}bX&kvvDf-0gqCq7xjUC1Z>h?m~h$Dng>=6y-vo4UxM=qy4&79=ZGwK@u& z=23hC0!2!85q0u}vQ9g$0+;j%Mf~ZdAIw3(K)DaC*kEnYH?-jE*(SVr%T3s|CcOWtoypK-0QZ&qiGVsd0#hyvSruX7k@t>>b{^Ode$ZB7v%OZz zQyM$(Yd%Wa$@82FX?wlgns8y@(*du{K_TilCbboxo8vI-LiS?m=q|B5IMg$-B1_Mt zEDy|*8I?U7?L$|KwAD=&RaAOkXjX%=n<0q086J7LO$BI{t#w3*Q5sNy1!HGJZN)2J zzl_XbH}aPq#DRkrA_G+dHu=&JNmkQzL*g*51tYHZR_5eS+OO= z)LB2?)Y|drX*)|UuFc)eV$|IWs?!(Rm)Dl*ZE)zGX`&|dva-j?i*B+qCs!fht0y&L zVzigIS&eB(@{6R_f2yMd09Wajw^S2?O=QNYzR6RJs@QE-OVl7BW5{`st-M5I7Svsw zUAM7S3VOA>&3xRc$pv@J4O^c>O>Y^K2^+7qw0y}kJRC9Z0r7BH_}DG!K@OApPQ?)2 zX5b8uJ;r_N<)Xtqej)bugS(^*AgAjM=kYZ_FosI)6TT|GA)38N*HT(g&yH4AkXn>8a@a8RXZdg21j9r=@h+MZvnbhgsi!v=_HD@?7dHZ72Q0 zP^8R=8I{yJgOc=hxNN+wyfyZt0rCvZ6N=*h0Ek_TCPB|nnLC*2nxN-umu-0v60)f+n^e9|x<11a3(SoP7nxtb@#fi6lW<*7q!4zNkP^Xv5}h07J&c`3Bk!bru^z5|=< z5y~?j8O`C4Q`mbJ@1gv?mi5blaHBNE1yy zc%Ft@x7M(!ke_W}&1=1jc78}rygnZ)mE`Zrwu3tdEgS+``Qe^6PmK#xF9*0}`EJa@{XBrS7VGl04EqUDEf%08Fr{_257h@?gh)%4uZhVguQ>%wFL_fVtBRSz4bMvnxy zfras5RCkbHM%L}@8M4#^$`ZJ$Dg0CDkqcbN!Qh&nqe-pKcT%E0Xk8zc%&(vMK*eq9 zLER!`nhmD0C@LSZRj0e_oOt?bqi~5ELWYU&dbQBI#%PPn)|Q)Xl5ioD zYKA9V$K|~cr7fYWO~v)PY}a?{B+o2|k=I4-p9PQkOg8h|Xl{phjvS>1tjl>H*b4Ln-~AQo-2tdE5XW3br74g3xod7T;4oTN!d>Z-8e0!y zChma6k=tw2NQc>48Z~mId*m{*-M$EwEbpg$)VDlDJJDS*J{&ksvGV*2Sjt_Sr;h>2 zf6Ev9$eJWYCW-fz_63OAI|2qL71dJ43bM7WM7hVSC&w0ltydK}p%}=QYIEXi7eT&O zn;WK(y1q5MWIYr)F@AkV&e!h#p4@t0xOhtG;iaGTbP&G`h4#=C0pk~z)qa0ar9HfF zGSh7SQ_su`Yoh=V*1%h~K4oc-gUVEKqk|8#2Cm{X2s=6gqR%$WD$~fGnkOB&p~@A^ zxEg+w>c|A04#Xax^VTNmQ0sd&OCDEca0(OQ|x$kx3lvSu6 zLwhWbgii8}_h){LY6B(A{6#o>YZHm*awkBXVU5|=jGhEs)Uc>0K9~e^;lMT#ypDyg zhao)MQM?mi+VFtG+=Ma_UYnII>DzQ*4jj;@Xmj8g5K0}L^>Tj(ax2ik>JUqbBvQ_0 zbDK9kO4#9+nAY{8(V7j{;4glA&Dd9a^WU05|Hq$lX$R0t-|-<;^;tCr#-HJ#!W(Uf z6E_zd&$#hNOn>y<=(=gts2ikIq3rDHV`?c9F+h{Tw-}Uai@CwmUrkE-t@p=iSh|*m zD+*?4K_fl2b0)BN|x@Fl+3&&kA>*WRm)w_kTJsllp>q>Xad z_ojJ_>z0XBvR@093}7%)6ZNUQ_`UK1*=II~IxFKS>wsa!A_*>y_9iEXG=!^^spyog zz`ZNU-3;G9{DsotA1}H64bZ>QVUnf(LPPbRKlQCPVCqmDnx}N;f7+q{wJZPgtFyNN zN#E1j1>L_eXn(xqb}=A_JP)-IVENyu6i?~{AMcxpJlp@~(?Nl8&?q18ZvW?B`NxO& z=U?!D$p-)Ny{A7d25#wK{=H29Kfmv;5HJpJR|2*q{=zT#<0XGTrvG>>Xa9ao{}_nB zSJUqU@%L)_$0qmx<)#;0ajX_hS?g9NSQMUI3%T{b*=RS+PZC9pQ*XQ#_>DAi-1(>L zmSxadS6@!U0w&M$kyGE7?M?GpQI7wxu=wvPo&Wm11GehpPT7L-=S5?`yyjGYbT{4^ zexI~%HAgJ#WR+-kpzE!~?W%u$eRR(`5_LQA;-1FZY%4d$^&`)pca{HHd0p~9{;=p? z+RpN@R*Y{+vHf8-tGM??VaM~L{`7J47D+&K(c+5CUUdM6#mC25w@T;6{(^|;kC!~H zW=s{aFg_JIJIs*Pk+6}5=GAHQZ2R_bYp?CSeFpy5|IG(I{%alWW23Z(q3xrN7v6~e zx_y^>1B)L{qPIApm*SXt65lya%l3Z5*ymmt*KPz6*!Y=)miDtx2^COz$ypYQ!~*8Q9F_K%m`e$F~k>yU6w z3utMe#S@||GP`g6*J<&`;QsRw{_&D4nQi&2Fn+D?cZ~tNJ1}7CWO{SyFI*S?Q5xL7 z`%@*3=LT$%1TMz?^}^})^Pgr&co^XC_4oV!ucGMharwu@`hRBr-{bQ4xct4p{A*GC zy&nGBdboZ2WT8gcba%vO91q|BH3V6#m7<9#Pjl=Z zV)y;_Z7!0?Nel{G&j;dkj;0l9oxD+Of8jv9%K+SEBaruie?C9CaQs)Lnl_FTRL$jN zjlK}(i?^;h2^mK&_{I7^D>o6+tXj)MSAtD@1kGk2`7RGFzA2@-d<7hdFAHZJUIHRx zZuU>thnr;`9v(!gMgk?)Vl8r}FQm%4S*&rJJp*tsKXssxd-lH^=KuASe;NlksDm>H z!pU(BQ5LB;9`YOQw^%*Bb0?l$3$6R{>Fc`O#&{oUVM+83H)Y#i>ELwg4I6Xh zL197TO{Q>maTAL~9@WjH=^s1LdH(xkPfVjK-!0>NNrydH=GC6MZU=tLdJgo?^*&H{ zxeP%a?D{chyv6Or-n$S7JhI+<=JKe!%;S3X=B+{cb)9y~O6IZ@GUw_{Xz(nQy1S@@ z%#b!Hl~w1K^-fnHWq%Ahx=J|xo&Pb0+F1|@xM()yty1CF^fM>+sRzl9!LlhpG^+-g zcUqLnazrHI5~)1BxBk3NyuHiuv#e2MFgRArz(1RQ50R}+G=K6;xsR-DS%T-VUiiMq zXhU7n16}9(8agr5;-`)U+cikR37xGax7R*9gK0I5TYFswdEpexkSkh}SvTF+4g(eE zfxE%mN2A;FQ%!|W>utPLQ_O1dTU_G_DB8Y}3iqI8dX?pOVvh8#Wrz?-3PWx;mG!h1 z=AqU{Oh}Wjo|QP}1-|7ldDjoA9vAr=Jc>QtiC`dn4X9w3&cbuq$L8C8;X-M>I_vp) zeV4hMd#TP^@<+`ST=GC}KToRr=0in`x?l@eX2uM^WaYQUW0jyE#u9{yMhH5W6rQ^z-U+Xxkz`T7K+b80V!wTo<(M`kf^tO7 z6mj!i-m+)uPUnyFd)-<%SNB^=Y!{1;^OSnnUs-JreqU`LH&`WLHpqJE3hd5PgC~0{ z{LrDY3N!v}I$LoL_#<*P|Jh@;=eiAh>gHHjIClXFgq5rZG3+IGCtGPFu9cZn^|rHk zu3I3$1}$KnpVPP$y7QwZ2m*OF4r~s(Q{4lzQ&VX@-H_I%%w?|KP=2$^gXEV-3(3ok zXAD0MjFO#8{?)i739filmQ?7Qh=zLO&;iodn z=LsnyN54)3Chjh!qiuIU`%LTns615yaSQS+OVO@$RTfbW((D~2n3YULC1NV|`TR4k z?7dQ)x}V6C>;yH(jV<`A!eeh^3`<8BY z-B@JgE6wkBwP>?JX0J?p4VrarZ`c1RDe392*8uO*{tR~Buz0)vhKiSKeRns$I<3QBoRIq=821(3d>&@zz%IZ&yE|T-6 z3|m4Yz-G6R^IsE$`CoyB4lXK(>H-b`{8}m3-@aPJv3mJXwrSClo$e07OGF<^Yrd(v zkV#>gl8ec!CWo1M+F_jI-1ib+(uz!#Lw-1!Geo{q$JvwitYa)Rkf2bq80ok4GB%-( z^j*GQh>_$3>tv|B$gIUo+a#(Ep7%OMBGh> zuXVbwG?@t@1-f~Li3PX#333P5def^SzO|NUrGTX0Y#WYoEG+d|);Qq3E$Sa3tUf-z zIq}51-@2K65_Xq#Cmp}IhcA%ogj*rTUa=gesIH?HOO+gOXQH#cequaEXUujgJm7p`^9-I%JrXEpNybEZdrT z-~K2Nd-IZ{7&5>r5a=lgs(aT$Ug`A(ns!SK(0*1Rl@f*Ooo=+L&0l2F$|1Y4we0WV zqa~dtbsNK}w}f&(k0P~6t*q~%|- zq(ibRPx))*eb?G^{t>j4%Qcz6s~l@VIh^va_22JW*RXV4`99@t4%2rx7X{V1I!89o z@^zQ;aQE#OMYw{^;k=ME(sxS~4lrQv`mCYj1R?oM1U)$lR|(&*AO-oRjHfPir)VKt z8v8O$ z_F~bZRIcXvc?`Vw)i5Ak${Rp{ZJ}ljv97M#984F-;JA^K{pcvt`(t$x;Y~V?lKiWe z@zf;MqttY`f{Jw8;>8V?%5&nTn){Shu_xcZoDNI_oOQH-_zd0P?p7n%GZM89mdZ4T zl|C!!JbjH*!Znk6b{WVn9I4z(7tl>d9?}Cc z&)XB3Z*6bQ`z(mhJ^!5h31v15Gt-$w>-v>e5mjnMERLgG22+@V zG10eQUMe3|PN&dz=UKXGJvnQas{)v?2^VB9Wya7+(5g&%RfC$yYjX_F}@AnP>?vgyuJFV!bM z&mgs?igAue`Xfj_3ky)&JXCvV;)i)udcO+gIGZcZYU!n8CHV)gqOw_S+l`*%@q^3|ig0zc}hyYbJ4T1sCeeLT<9C0cX*0a-c5 zpAR32y0pibzQvI2%BTjnBENIm?Rv7+@#ZZi_4eWTyV+u91_uoP-_6!vHR?t&pMZ4A3$w4Z)xhd?qzqzfr~UzLKJja&&oc`hmC&+*8l8$cmo z(6#|YB(d_Bqw{u)*p3g}Zwy+mBz_R;sKC{jp0COkM_H!z-T_SmL602$HIob0%(8k@ z?(VLAtxE3kx^T2i0Qnk4FpmTjNIms4Ieme!uRIIzEBOzw?~CY59!@D>TB<7!asU!^ z6}OzXW`=k8!nkd}=6q~G>m7qu>X|oHNM?7hh9G<>jLF)6`<4;vP=B9g*DyaqDB%qE zkZqmyJ26$SNg>3FtSkYTM5a323ZAde>=jn|F?+$F_I1eC=Ip(-Z|Y+e7LH^7NzJFO zfh^e@rK3vWHz46sV|Cjj(ZChdQOGBYO({01@hIneUCD@qP2RrVLf2ad(~fuAL-izj z{SD&0Y~EsANIaUyIZ_aY&XoPsIOS7{NktYgB~O^tFE5rtOb?(c=FT5(Szrj zMmDK>=e~R8>0u@+y~e@-u#9u|sa&d?+}o%#V~z9?vs1#=OU#*j)Mn%MnW=FF1Dp50 zqJxoaToXeKUV(_Z--^EWzWekZb`hT|@|?ZZ=JUzTJmsStd5b!QEHMheH`5vEwoUL& zv_RRX_^%F*KTin_SidppK5D~zUV<$r1F+*SarB7P`Gs@_|Pm11*of( zT0^)N-7+qux@9XF(zmi;!RB;O_s(T7#H4pDmEs{cZsG#CD+UcS_;oau)I6C|a8Wud zJZWlrl(1YA-YEvPfjvE)l^z0neulVy+Sk3KtwMfFAp;Ds%s~zA!y2KK9}C8BhR3Ru zE7EIhBL@2qW_KvGgZSB1*F0{!zp&Z;>rgLkplR2S7aMdwWmV1=C|jW35-{M)m{o7; zrnOUB0s$(bjiMEIhL~-tHj^^@XX4y_z?=ntdKr9}E;9tR<*tS4rRW=$zY)+aqRbYn zAHHD@`7wdwk)U?DOUXxmO2UN0ts8IGZ6%7Wy)tcruWr_T$1Vz+wImLnjfoZX-&<|) zOI}|W@>)BaRPQ|9;*^7?dDpbOSqzafYuDxK8PYa9&35fgJcqbeWlIMdNj9}?+&7)N zYaOw-mQUdivf`LL`^)li_Zyb=r%dh+eY5^h zNY}TD&Ow=j>dD5Dgy|1yBT$pR*B${7m*qz&*yMjNYFR|+2!noOD-s&OqBxkXK^yq^_Yj?1&*CI4t0UuhF zxffJC1tgN6XX06@@f+uDd^}fZ!Lrb~#g9|GTu-G#gAjE>7=Tl2Wh(r!HB-5)qtvu* z2p3xCI*6vl0fM)c-1_0s4!OHdr}#FDLiZ+zs-2De(&>65-_Wjx=A6&)$_cFu+1fb` z-F^=VFQpnrH!)=p#ZS^LPE!HluVB0>Iz`Pv#gB#BT6x)!+S+tq&Hhm%EyZNdrd)Ug-TwGUIvF_)mrw#w{~Ky^r-DIky24M~9y<>`|1DW@9CqE&p+VQG_7M_VKM$~hm7f$ZgdVah zmt0iYiWdR3pev^MxSoG#7YlsQH%sve_aH&7r<6>fcWOqc1KNg7u4nb5HJWtyLhFo} zdgQ)9s1O4larqjTVUxiX=NT|ritzN;%!C{Xi+vKGCkDbdSg3*c?7*F??QxmT0GMY} zlljoMeo#`g}RP&%V;=_oHDY+`? z(TSbo`*Plt{O}s*)l=J3W53L*Ha@>@x8!{Y9qnBiqn!Lmq-K-*ZguZ%={RrO1Nsuh znaC@4vgGaVWLnmlC7bLZ?;BvaQ08Q)@7zM#QbPrDQr1Y_0jYz1#9jj010^eTq#&Eo zWO0GSE-?HK#gb|BWF$+|5p8(@P?b2YHYJq07wtpi*MHu5`{|j}1|3kzO$eA4gc*)r zCX9Go`H85BpCZ5g=_>i*4K0s4%Q*E%bMjw+_5btL?Yls#$r65w(cqXA<*H-InucIH zs(1n18g)%)#ci&XilB3jp=c`@0T*vmWl-00EhIOb+(Y6XUsxf*$fbJ`BT?AZsfG&e zTkFAj!?Odob9n4tybzT{tlGUV%&*TUOCemxG(plHuCn1LoI&yxM${xd_KVFXr2zMs zrz{GK_7Qj$D|)B)oUnx!06hMd4Lz2ZLe7FLcE;4A<=cmj4_Pb29;T#UfBYT!AxS0J zHXC`A&*@8F0X$5PfgdL<5MPZF(8$u*1!)n8j^-z}$P>=tp^;b8gwtj4Oz}yI2aA^M zm|WszzW1jyy(X(i+?YTu{!a3tJ0Hg_I1VHLfs=s?0L9ea-?MiA0VyJ_3ups?==cy5 zTm+&fhr8rd{W5|Xc-FG^#0TBfdt!buZ$JS}!t2T+c4M`c_d_7=8h&E%;9bz#m5AAp zjdtm8`|~5C=?=!Ve#40gm|`>d`KNf;?g=Kp4SA~(RLoC2Rt#KAr{o~E%FXY$q2XT?{uKNCh5{0D zR98QHw4o1gF?mS8U149jrOxk;6a;ZR*@i7!w(SxNvl5-fT5{*NqH>h_&i^fWV3maKPL4Oq+(OkIfcB&D(S>U%SH| zTK|+>(=mX}(xnv-4hC-f#+{!<9lp^gZNG0Fsw)yG;~a{hn74e~boyGh&L3ED%Xt^# zMJNd`NSZM^0F5)mS}WA2vvx4X*K3iir%kv6aP2_q(^y8}FS}{E@{TJDHgt0`K2H zjwAFpE03nEO*dY(s96kLPygAxsT^1GQVCk05fIQ1E?-OFQNBBi&gev2H-)81e<;7u zn4z)ltli}A*7v5qd3fN3*cyZ3q~V7#NLpHd%iMIr z`RT6pBu6N14_~Yg57N~EH3KGTSMQfNW(kqcRr%x65q zCk&iKBQI<~Q^ics7sJ1Ovllc%W{+ppfeL6jLyPvuY7wT3l>p+C)i`;+#^!{tsajg!DcE}8Mo3p0th01(iX8l=V6WBYp zA%=Az>+t5Io@d>?dG%hPyb7Qxl8Xml*8^qUa?P$)-XgpQGOgt>^{uQnC!7l+$BcT? zHtR%Ys-M)3K*zrzow5!_Z-gAm7<{|>fE}GJ=XHrs+Q+kU&T{cSJ=mXc$)F@;i0Cs` zm~gO(FL0hY-1N>{Ddm5!Y+9{pu}9kB1WR4QDb`n}-}>N?;}@__$_kTmiuId4>N^10 zgk7%12AW;;YiMhEG9SATJjzx){BqLN2R|mGpQ9SYs7KkJMuuD31b4F;4$lJyYC_TU zq(PI~lah8z%tOlnfVlT69+@&A!qqlBA8;B9ved-y${lweh9qWO#45Ab*D068;)o@H zif5?V#RWVpY`3(&USsz(3@`-e_rnAbB9paJAoBR2g6)HKj)jB+{@n1jw72c2wCC>R zx1}bsaNjgN6)E4Nyoe+Kr-~aw9L{U%^EPD!-evXyTEmOHjmKZT{H!t zWLf*GK}$+ccg=VDgkJvE&UOVh@-Ee?>HDFjm6B6hfLA|F>~N}kQg1AReH1Ow~y+by!w~S`sZoQ zbF_x+OKM@*N7hp|LMG6w%@m?k4%dUJdbgPEGbhoW{K!8?<-Y;D&a<57?$?0D=!-`S z7t|k3H{uvGA~Hl3Ba?r&F_7a7noF<6Z+Xq@=gA8qRDUgB0E#&tmB0<8*LD;0k4t#* zT))aW@3&B|^O4lUirW6xn!sW0tPMD%&-|66pwr|A*16%7Xx%7CGyW8}0?A{Q=ss1P zk}7g;gh9W+e*LL6tAM^zw}UeHXR&PsZ!#)*XfgOEZ~fIh`}obN-WvQFhMAAb zGLK6>30waYzMDB_akLd5QF@q{uNx^mT-u-99+#vIP1d+;IgZtVHzh1W^ep>I*K2uz zD)lv|T(^5ahh?^$$BpiMP4}hc+Sc^u7u%LW4gJHXC)52llX~?=Ya~nJ6-}G^c|ai} z=d(hQ)>C8I8#$E(MVlJO5+I7}^Ya(yMXVl;1r)4*_m*jNA_M~W&-d%+Tr69qZvlSq zzYuV`7o}_PigCJ@;lrE7_X?~)LLKCW5^ZZbPW4p>kr?R5w~U44Zvw@I}gD7 zdZyTO{ivsGXXca+nFv0_FWp9f`=`ZA4)IFAi^rtmp0WQKE_wS>CLocpyY`;@R~7&+ z8s>#lwUOh|Lb5Ublu7T6)-f5tDcS+!4TxJg&)AoQ;A2h8JQ`{{c_jQ!shj@<$-*W^ zjaq^KGuoF+6;muKLRDNW+iyzU!ywAXuK9kw1LBnQjzZf=OBGw2zPOr*&Z$Eahc9K% zd>8%F9dV{f9q7&~i^jZ4-&W9xcTOmdVfP*CV3zpNWIASn3Vl2L>|rNyu?poK8k4lO zu>D-6DacEF5@f^y4-J_6tdS*c|9k;MDtBAWkoOR)_4yq#*6=lA7Y29^&bq47zZ9#z zqZefPdr@x@RO(k@NtpxmKUMM!*t6 zt>NY+s|M7W_8ck+)Wei1ahv2dxB)><8D`xAt!;`tF7w1&ci zvUG)0_rwrFt-_Ou78$BX`|8@`WaB>FlodfEjUnd!eO?!zDqPK&@GZ}zI8yVS#-TzJ zG;iJW9cI!6W!YklcA&O{NHr5t{aol=1uR?QSYXqnX@mEw`w%o5LaH>)86kw-tWHW5 zTRuI#KO8DsOtl9Bx&H*^{$U5_9*Y(mVP71W;B@Csj%C7Y;UL6+n2Z? zPJXjTma`jMj$SkT!XT&YIp{6}Lfqp3t}~$(^(PLBoy5D3Le(IwZxVr$Y$TLrS%|v< zzJ2ET24`>iqmuseUe(_udXwc-&;SG?fAo?KQmpy%owkC)4`vln^SZk#p4d<5Q5N_s z=|?~C`UrlWVRus*f^<5aA0!8_97GH12G|BO{CSG?$qI<_tN{3zfW02}EQ!Ffh48Bx zW^JB}HGCC44+Z&)$x$Y7cU7*`>Zu3WDHeR8c{Z)89Ic&H(KT8B6Q~PfSMM8q#EsnN z8Ye$3ie*X8@CycsO$rRR4NQl`7pp^f3)5bNaWL7E)&{XKp|_Zaap(E!+2Fg2%}S(^ zlr7Tpx5?KN1T;&jGS{TPxTo#*2+J3{+8YEL;c~pT|LEfj!GEo{pTAx;+yqOR5f3gz zd3Y6=kCwNjUekJ1HP3f$Yxrf(n0P>h6eEXt8jFhidO(Z!&&G;$6zSa}08#(ERtb%+ z$Y%@yVoA39J&YDgqm}-hB!XOVze{wn%?y|R8~mX&UvJGKEN|YwqX6dwq$D~{yrEsU zb8B#~Gbm5PPFi}MQxC}&BifMk&SnnCOsNjgRS z0>2(&)dGxj{@Lnw&~5ds)v2(B=j^N7KXB3O&V6Z>%KO=<81l!6&exp72YG!3;z?2! z_DhSxroDw7y~U9zUZ5DK5}BDICxhPU=1QBm8-p#I!oQ!!VF6SlXP$bf7$ny9Kk8ur zi7%Y}1OyE4?HzA70)n|OYp0g|qzNPohC6E|-*|aZCG-K=0)E5i;K@wCz?sN6w-<9I zBI3Oz!W>SWvtBlE#dh3GEG<#`O!4YY;OeBuXTA5TLq}O$-+KUn1+b;J#v;H~&{*=j z+KyN3!*v05_yuue5GJ3=J+#WOkWZBI*$2>RYZw(h{VdT>l)Ku zV+oh==}s4&Qgq${urXZ-J!ZT*& zCnJrXXRB&0-Wd^v&b%4DrIO4{^$e z6pF!7I!UDfAOD^>`_4C~uL_gonEe&jBaFtmH z`ZlgM`v>k6lgtWLC3J)>7(5WLgPZWELW+$09Bj6In~TPLQu(u8=k_<0&`)-S9N#R! zg;O~dcloT)Q#ts9;R%$wo}Bmen~PPULg1JcyX$mT?}GXI1+gRVCg)cm-y2W{DYi-_63l64G?=w{(j#-hvav%!r$Za-_0QyUD)_9 zzuf*s>#mwHKnnZ++1&X}+3x(+duLwqNRibGXaINP%~X(gP6$PDX=&ARYuq+cWyeb4 zGQcEFK8(rW_gErs5wJ!zZq(35|3$-U2ZxSVqBn~=CFUb%4~zf`3aL##a^^q>*i<<^ znNR%HMgQxif8dx`Lfbs=7Hn>X#fq?m@B5&R?%mVlbzeewPU!cXhn@X?lj}~iCtb%q zU9Ky=W3&sN`XglzOI&jLuk{OuM6Wgj?Y_N_U@7^CmCRb7&uxOqWT?M0^_w_-@ss8z zj0)HZv#XJODdJ9T;}Rros~f+%YW-JekAJ9cegPD^doM2xo^W>9H%LC?RsjAn948Cp znh%yI^!`rWdlTF1{5o4$iY=&p>V)ghE?-lXIqBdhMF?LFF;u;p zaw_uwu=k!(O{VP{=vYue1r-tLA_CGoNLNvMkrH|U1wsdrCfx=WM4AvfN>Atn2ptp! zfdEoMhlunVB@jv|=ZQ1(ec$Zu-g?$LYn?y)$IO})mJV;;r`-3|?nP%>VUNqk|N8{{ ze+z}KUa%scOqnk=!9ePUU0%EV{g5(D@*?~ov^O-?E=XKHr8adbS4VP-V^MfLmdU-lSis>Bp|IP@ExF;Y#o3&}-n zyc1v=_+Yi64AEtonO00$GeJJ+?T1%%Eiadc(NKk@;T!2HVS>lGiX!d1(-Xdj0BWsE zdCmJ(uVhM-BFpTP-fc6|Ib)B2Lom=O@@dJ|&w`w5On_SQ<>#nfz?4+FPpUuv8q%?) zouTPd<|;tU^5bEw`L&2Lhn*O?-VPlfd#r*9Jit@J7*&NgNL^MvIk zNZZ+-N?m!i6kad_ns&t8e*um2?ZAcuU0cjSw|aJmUIhW5uZ&9zR=BL6-SK(^?RGS& z{a=;Sf7p?O5(ho6gNgl#%m$fKgSQ zmkF8bFEFc~=U4KNh@wwzcdQt2HRXhEqmP5sRO_&T`}$>27;*|>+g5DS`MsJBjdmF(!kA7m-qF3Glly_vAX?+$r4FM)La(mHh(>|`XRBPsm@^Vo%Z&I1p6uWC+kPq5{OdCN&&BeOHNg*xZBd`E z5kSV1Q{BH2X4gt@O=?#;IjmasHTLD|_~V)^Uv3>bVJZK&QZLlu5q^np{{o7o51=&Q zLT#~5MpFsm4z~CMi<_M%0n1SZfESxmSArv%f#5P;zrq(E&Ln?hb++AlB^Znk(yKE( zq+gJaG2^tc+P8r1%ycA0OQ=|EShue%J8@=X&*;MwQ1$RvDe^}O6kP?w8T%wAO_v2m z+P7}-C05b4xlKLnNE~Gjgni>a}$+2zn)~hh4 z5QFAL2|!WC=_Uf~9<`e*%bl*4yvx4k8eqgQMIh%`VL>J&n2R#Ip3o%}ICmMAj9XxP54EK(IP{bEQv z`cjF!Pw)?S|zTtjQ!lZqn!zB1y#qpqW6 zgDvUs-1OPJC_o9OyszC+6Ckn`T z*x24(pz;uo;|`{*y8k`8PWA(SImswd-L6_6*SjK5vgsH;S!(}XRKJ7&!{hTe{#l;> zj|ax4&T;Ztv91Ebbe~&Bw1a;rVy<{E!_um^a zQakk{9@e#Q2}T!HdTzg|8LCinp*^A<1%kg~zzMGQozbl=elO;d((r7ub(|TtaywuM zdQJ!G(#&cHzAMc_ld7wr|C}35t4qIDNFEM-?%9C7N-e+$mnPpQO4`~*i!E4`Ak zUk8x3fH`i0A2p6rjMj2hOD^;m!mhgjN0NKEpJ7*utPrD3Z!yF1-)(vhR)EECcJU<+ ztp05FQiMl+Q0@a+tBTu;rt^d7a%ot9{8sc8-7~0qmkpQ$mLvBh4CoRH`V(C`>cwWY zft0159%+{Ku&-b>m7%{PaoD1lI^Kcw30Ps&z@ajgal|EAiK)DR!>%hON}BduQc19k zRsTW;tf#WOX2w(_uHbcchkTbS?iT2rvou=z_0sR(?)H9NA7)739*d3_TcVDKHUuek zCd)4_5ujW52G1und{HU74Q{x+NUYm=n-z&}JC6V4aW(Y)O#zQ<)9mB1r1fi3<1dhI zZ<1Ut?Ho8Id>r70O_ru5d48xDt0TTTR=oP#7|~Mv;fw(MIFtvH2ZsJmkBRDSEXqNb z-o(2#@`IAM)V@tUPYY&H<+qD`U1Vf_=7Ywm;s*&wieOr4HY?Z6Oko{S13=c+K-))xvAo)^*6>=9$|D^d+^y{5@=5a+&3)}wUCt>nsY%33jqO; zCDlj9*%H=sbu-%DyBWSX^1;)jf~Ybtu}O<6WE--)Z*s)zxMLH-MJU+3P8b}GDI{3o z^=RIkj?#B+8k}(`&Nl~8hbh0d$A!1Ai^9Ow|7vL*)s^pL_Qvq?1%3Guszid;~*v?h`i{UnV+hjNaoW>-#~;CUbS`Bja>42 z!95)dxA1vn2IwuZmiZevDp=>c!q}^Z!o9sKV^tREDjSCQ)|iGi;0RHTMf1hG?_M^}%-;bwKB}&pYJ^iQdeC|CeuPC@ zYdBM|s&roU5HLSU6V%}aya36%Q=y-&DL9`R*kATF-(=TCtO5Y|EL0x1DM zzN_B;*yCJ6@OTlqf^!3ICVVN|<&xFaZVTT`qQ5?Wy@9Rwn0-~YGIZVB_?;M(RRyTO zq9B)zWIp%0r@RtejzLqcWpNMYd=~`IVGu1B(HKd4ISae2p z_#_SxovOm_LzGZHg%%2y;%~egZYnvLR=MEocQ=yW|ArIrM+My&tocI#CnrjQQ4W$f z$nM&md3%Pf&yAB#-46+K8C(Dj&f}#1-CN^9d5O{yh9YE=91Q*Lb$0rc-+Oc{^E1=U zloz(Jr|a&-Q3i*h0z|U3&oFCr$!{WAM??M7me~K96LGN>yIrL|p(a%3StxSIR zMKAt8|8w7hi7T?5p^N*In=1H}XV2#9@&zAVjylzCB5~}w_A}OW_}uli%j`EO(?jU; z$0^e(bT6u}mHO>=NK1*$j0>!E7P@)wS`hqg@CjnG7))TN1Wqvs-!l6@II1(rNgdyG zPYZh-YZ3oRh5J9yP|w7{jmNCOdk{uF5&!?`6Z`bIsEQY0ujy* z0J)J4FaTf8dy$j>!&mo{^6_FgD5Rc7fW@SACHvR5hQEKItN-`%ezIc!`SK=sPXQ7I zVU&}dyhX~-#}!MPcXhP>_R1q~4k@q}z-oODu^Ol-kG`yX9qcKm0gb$hl&1BabbA-wA7sy1Q&B{&)Xw8b&o`%pfFkzg?AO--b&K7@?EIbEDY=nD>q!Hd%DoW> zS@wlwyq!%1fQr5!Zc*c!QRY0>-R;6GU#6da<9YfltX20@w{-mPh7o>S041x(rY2>4 z2z94gBfow%Ms#n{;f%cLnw3yCG92ruYqBz0=Ms)EEzAzsn-6Kb8_uMpS=*Fwm zD|b@#B@8>pbNNzkWSQX3K2gA+5G3&YVl?UyzN{ChwfLbETsty=3HPhfsE<)_6m3VLq8^ zo8hPm-^aKR3d4JxjEy{uN^RTNPdbWslXxFMKIJ@f>^HcUf#$&Jmp(sqfc=6RBX1 zjh3_88k1nMQprr(v-84Yc!B)1!tygx{ zeawj_e!9ctsxpz)DSSntGUhb3zs1|U+Z|l1Y6aQbl~k{=&W5@|PzS9|^l5Hy<}KUo zhH?L$sgi(O=qIzM>hKK0`YF&O74R{VkMU%am{lB~k#}n{PllH(w({--8yN`&@n-r! z|946Ho=wbP$(>dZpqsVdIN|5~;%sZy{Sx%pOoFWJ%c|LMk0)hWnhDp(h0ILv*>r*0 zU?~>Nl>Ssl+W46Cz$A54I%`n&<|U^%&D9OutW8UyJdh?4BL%s^G?19#dh8{QnU~74 z^*dfOZr{zy4TBW#UjE?A{JS0hv-3Z$!K37BP%fJS%mO-EFK8~uy*|>v7SB`q^=L51 z13HzBU>5@pv$|HH&+)~FF@n&#%U-62<(&+v2T*Lm@%$jM1l3uo_}Fb-broO@rkML2eL0$n(QhDL29yv4lwG zt;u+U4VMc#sd6VhUsC_xqWI(Cvme(Z3M`FNoz|vz51?+#x2QfGEqoJGSDFyGy?IT4 z{a!rMZLf4l^!w9Ux-N{n_CXlEU<%xzsP3(fh?S?%cU-9{8oYT)uhsK;XA&4T^$wtF zd{)#F#StAN18KwuCb8;lZN==nqpy-=LAy%@&~Ow?Q}k(dphD1&ai3oL%nXC@NVP-k zC7rlFIewiq1+U}bV^qf?-`{Ls2=a)e%5pK?2$RqbJnEHlUgS=^lFejx!Kw+tyINK1$;?ElSrc)Z(4C>O3c+714Qhf}S7G#eNO^*; z?}Ypt^C#&G!lz{vyJs7G@Tq;dSk*l_cXhoSZBC7I9dQ5voU;Zo)zR!t%8M1-83#Q% zU(jPoBqCd6HCu3YUMyrMH~A&AX;Uml^x_K%OK3cUh_(hp8GQ(vk3z->n~S1pIiC(|nb-M`m$)EJl-kFq-(~eV3RI&soei zp023~;1gtVglR#*?(!r_<-fi`NqZzQJMNFMebP0D?&=J)&jO#X%KUDzw&(Gq*gx>+ z1A)u}U{pvi|I?e0|g-g`1uuZo5LFo;!a;BwVDePvtTZgAMEgn@pSd&w3etPiQDq6_S*^(s}7P9SlGM$pRp>lETD0rRRIUZmR8T!4Y@BI2f&hU#KogYnbkPJB6jxGHEj^ehiC z=uOaXKib7tKWfKE4-z)+#)Jk4mE38L1LdE_B5PXfgT5eH$T}yY zXSqME49-aBxJdlizOOpgkIk2cHMtRwJZIp@9%m7*hHtu=xUiNgG@TLF=SBb!R=fbu zn(SwC00oRRt+JeLCL1eS;2kE&bagAqhCfJ-iWI9@s6RRV^E_^h$?D?(DgRp677$Vur@fD*QW#RYQ&l<>C9=zHLO(By zeCj+nG#e-JI+ zH##G0$PcWYZ1dgikU;H|x89-2R11iZnQmX%oth~y>z5;yCINS4G}+bI^83%t|6^PJ zcy8s5q{~&PEo0hFiz^&PMV54Q7scSVCwMOr$BGl8MV1MUMkMOxsD{qeIA)W38Z&Dq z`GkUzYUSuvA;+iDua>u5 z(w1<+w^nC2qG}bY3WBi3z^3J7(9JH2E!u%~CUR@U6`o>CGw-RMwlnlX;b@qn6U!BK zo7O6VmPLIzu#44!E29()lB;IY{>0ioVgYZxMBbjPdS;)0>{RV(ZR_9d@Be*kjW>Zg z6~;3}!Nj|Tn325`tdgeL zT4}b6r?-&)Dh`|OEa>_#-s%mOCI*!nE=4&3S_X4`;5v91nzwL=@@otF)zBfB4iO9ES59R@3HPpQmZ|4owW+2tR1 zHswLs+sFElkJ~=17ZDczO)g)>tSLVZg~2|R`NoWGcck2)Jk$P3Ve(R7;t3dh&j4E% zBwJ}#&)j#7Rnd3J8#D4?D2HXS9nqk(P$j@v7Hb;2Fz+3~o?<(a+Tl9OZ!rg*w;OF3 zHo%JEW@1NQJ@wA9C2+0Ytch%b0C!xS**3@4>{rgkesayO-@wGt8qHO{4dz>Mu}L`= zD%pTqX8_VxI>YbGVsw&DeQ_i&N!K_31>JSAqdV?vm7d@V7chsh=2;Y^doGSz09%KR z_q-0Bs#&Fd!rF?IajHV#g7?ecO+9}2jFVjH5kNtELhxqk0I(p|MqjYFF73Daj9K3O zLtbPQ^3F^QM}y6Mz6>zG{1!FCKH@H;*&M}J5b(qxni)$QoGQxOFh+x=>^qa9;Crt% zOT%dDTT}*6;f&FD>O@_vvT08=Idkb*(QL9p;7o|e`5zGYZ~W_&$PY}3`u{Mc|EvT4 z4-owCrRjwS{|5;E1jG2_pMc=8C)Y24wpb5oJ+{tHL1J)1ji205~}{8mNLpQ!obtiPq} zXyyF0bLbF7ahcPTf^b`_h5`M0E~Xv02FUGPdnY*N*Zwt&?;uU)@63(S1EM64%|S98 z?r}u`$i4Nh;76hbwfv;-?G*2LTfyZ5)`UL~0dRo#`($(PE)APv^ii6Xql~nFYA`ES zXewz>&0S$Rtz@;A><~S`jrJ02Qh62Ist+?JjZ4mSCSI)anEl*jR6?MUd<$IMlFPVYv{nlTeO#;V>#( z5_KaQ$nQ+G_Ua)_<=t{bsekr{{`uJ#PV&<|(*UTe`Q;o=oy6%*n8~1s@qh$x-_JZu3D&M%&8D9e^Je1&HeS*W`FL*L!{s= zH&uu*AJNsf>fX9(uG`(Q#H{G;a05S!5hBzUTeSC9LB%HRltrA<(T!MSET8==x*(^_ zz^6hSvRb)#w)RFFP~FA~FztfDKw}LHLdVYuoRs@UA#DsIbUj}g`x^1t6jAlA5r|$b|9)uOPFtWxS#uT4e;fw-y6~wZc zR)0QJC^+>B-DvSC62Lw`HC_89^6^EHocJD@3Ydt>TbfA zBh7~bE}_4tRgrr@zmtndANfPDh;Um`K1triie#<>V)`rlE!+oC-~2ntzm4L@DQs*^770PIOmqoKQKxg=Tbeo3xN+#dQy3|z(hw=Q9Oh0+DKGST+ zupm~NaIQKWB8$y~oK2IfnkpaA`xHXh|MUv#|30v))hCP|q!PzaRC_lT{9$4pfR3yH zzGaP}(yYu|?*hmG^OkR`(6F%RQ4B~q=8ff}u;BWP3(f!xvIf;u7hk!fVboOUPz<+@ z&FbrfQvWWCj0JXT7lgMgX?WBmJm-H(2imT4 zHC#9Z>q?c6Z3}NVX}1pr%Rpx(xzuWWW1F=zrQt$WyPw4* z<;_jEr)onR>Q(Cq7P`bFwOZ+$R?er`)Vf)out}Vos z;S1y}wncqw@Pb7;u_|N$mW8mxx**$`tYBdf-|11~ONcWl!rt23BPGwWtB_>Tg&^5) z?D5@&8=xAbO*@D`;@|1>@fPw$YS^}w2~--r5WSbCi?#qzZ?JpVX@Mjp zC~T&DUxt8Q8uMwao&lgxPkj@7=JxJT?ll%N@_U(^L|mKKPq^Y+9UulvuQNkqeRj5T z*bYK;&UyeILte zPm>q$d;5VSExpRWZdo>QWa`Eq1nICR!+S&5nK>x#(f4HR_6xw@(jGaIh~SMyaEf3h zgNK|GHk*vm4~9ZCW;wA=ZgZ1NKKU^U9My~7Hz?yFq6hDAgc1ifGWT+YwSbs^Js6fl z72lDxkE+U3ghZ-Co{37)jq4r|5xbQAo?}`8$&;g#Ci3)CMMvHxhv-XwIA*jvL6Qe{ z7zMT>EL{I&*Mp(B@Sy1Th7e7ND(Wc&oH;xpIG#ms>Ks`!sem*Fi1$jWu+tXXx#>-@*%wc=PyyK zyBO(e+|H!0JV~POyca9osGOU@Bvm^RX{Mbb*G#3DIKyk@z0oNTa%jt$p!W}Bnj=^Q zZQEaa$`)18>NV#3bQS6~xPECYPIL+;9>!>DDg5$2d$?~w=Jf5zEGc+Luve+vZrOes z5vh_s(HPUUz&8oIGAHA{hCmNIC1(tS9&z*_Y|qS4qtMxRs@#UhOEt^8o%i1K@bq2i zMKOLl4A7)H@tY;w3N8|{=58JQuJ7sJ_wC`TZU~L1nLr*$=4t8oF>3!Jkf^AS&x=&e zDXhC8ppp~Um?Z1}VyZ0x$|eg?b%b$wp+uMSpwd+z{5TfUYVd~!l+1%vzvxR4v&*uk zH==txT#i)RS17a^2bQ~=6e@l9l9AQeh1jrsb;vZ|HV{+gbhKaDGl2AbWo-9MOrk;~ ziZxXapgAGY3R7{W4xXmc@m~0>oEX@z>a|#Gxf1a4X2?Zsb`aVzwF-f& z-WEXqk&$-VQ;e@mD_&enIXu;h`Z!@W&)z{r+Iz6vpon2mZ(p!acB0SH?o!G3PTlrt zLxcrRfwRwLed!Ei``g5kuH&%h$e^5x$b&EyYG?HI0>_~~Zv`LQ@eUj|CAddd#cIm7)!X3PsvG#Nz#LE3 z&w{raow3`NHmVVBYw>kQeKcBvTsSlvopCEC`%7a4Onr*u$_*eG^|M0A#}L4V$0+I~ zm)84BS#Q1L3Wq*K>F4bA#I|7`GrYVSi(5@wD@2CIap>q0BG(;g;t`#++&c4|YXxHcW7`4gI&U96l@1&)(as5iKP9@AzrRL&kg#ghb^TRr`e54QTndbTkyuhF#?;^fdNXl(Y@98CgJ${YhhP&)6KPJJ$iW%;5|LXT~~k6yOnms4?YbnerT ztVcu1COEZ+JH7?&Df0dnk_^`h%AKS>%@oMyUw}(A+V6bZy}_eb`CvtFq8QS!Jwmg1 zH?nHVcJFSTHu|IZYOlB?!0`2f%(1cJ5RodCmm?G89 zj?%D1b(mEw;wq3ZqG*K?wx_K0C}y~9@nS=vg&nJ(L)!RZ4AQXh0%#<#8*h+!I)1(8 z?qiqA1* zt})XO2l_WIK}yA0Fb_;_VW%)66T9PgKPB0}j-fu|{?a!Qd~;vz_&uaOcOG07;|`G5DurPRNwWee0x_^~uj4UWZYBb} zR@suIK_;mp4G=-^x!+!B)n8IqGG&F*Su5|~bc-}}k(sa9QlZFD4nKdHf@&(3oH{ht zpJRHb#H3v)A3TI6q@+4m*s2CrD5nssCuqnJY_YJFp zTDPVTMa!F=8>2U9#3)?3`C>|M1dSBWwKR*qq?S+PYj}at?MYHw91kJ_k#zy$mGjvd z{B?=ti&>D7&bJA!2Ek#x__G51S_+6FK4=0Y=Xy2$dR?`*E4N#gngB;b!i5o^rPb}k z@h9nhXHp$`bjr2TzGno;+r0ML1CGJAx4R>2fq9)kJ?>~&#Q*rnT3P3Qdh^?+VAb-( zlNREbyh-9MgBC$~+o5}kMKcMHYfE-uA1)xiO_2QBN+!88@5IW?c28ZJ zTsQm()C-yv>D$C@y@;Co^U)*so+8x;x69ktMAo@AUR^h=`3qKB-y>&esEQb!|HS;c zs0+RdTaa3Fb>fio#_t6ZBKJ)-kp>rcePPHv)0TnM~s zapDLp^sS!27U2VrlVWD5)Z5%Gk8G2T+&BY%!&Rll*T~i3#yv|D5@0FF%7_#DQmVEo z;!m1^D`;v`xp0>5y>JoruF!Q|fh4IYq2cnrjf_3$G@n5ml@q6SvZ}W$)OsvW-U_zg zf%FXti;D%5BuuQCg3MLaV?9HJxV2MVcVDT;@(Thx!oXyO>j;mSojlFM;owDfimasu z2d|6kc%5C@6Au1#0?Rn5^dp!)e;tbJ9R-0cE3Vk3KD@?mXCK&f2489aiJJYSm)gYt z(Cr=h6KERtX@aRYmn9T1{F5^*L|QF;k>Pm#d7sG$g7^Y175CPd>_}hQIOB&xSo(fI z0k=%x&}x9phv*wXSj*R@aO8A-Wb7r2+RAFn-IAxpeVa;P?#D){d#_=F=q3CyohY^a)a;>6LpSVt;|t@TQ4okX@HD=JAh!kW?)1}SpL#{gv%`8vM@it`9 zdf5gU+hfTgV)at?7NyjY1D5bod~DfEYzf%bebRdaX4x<2Iek~BR&57}h7z>^89k2+ zep*ilDOlV%^z`6Z9IXZlA~&8c-g)D}c+3n>R1EM@YEh3s3g@ z>(;p$77*#_P6ReMJ51u7)tx}3RoJ6nYyH2a0neMq<}os8cl={nnOiozRSBkgg2R(; z^xU7c=^cZG>YS%f&Vqws+l!I^<8ehA=Ma@f=eaNSfXNKG;PxE=Z{%7c5D@PAEX3(! zkCUA}kI;?k-R7l3QaLP+`4nRk(4QGa@huL@n;#(0F$-(Xr%taT}EpYjfQE( zkj)bYSx68zL%}eo`xXw$Ka*?XUY!puBO)0T<%$flwlN*7{bHm?+XfGjfLJb}_BB)! zqsjfFy};~%AtdwDdEt=;y9~Nfkp}o~uhHDd8h+Qe($YA+pzUpeXc$}bdoacF`=<*^KZ>i!-XG6ar9s(VX$&Isg5 zkG6K&o*sFRxlC8M66|gvVZuC4B&)|L1A;E->I*_1cL;+@uu_NyNT2{P? zBg5o#WN3s8ldDG>D-#*G=X-7LCLxe#cfIeT1Eg~w%LT0t%Ea+NVF_}c+2fWdhu9O_ z6%k&V5E$8q_MB!9+uHz z<0HKPJa!J7f$A%S2;6$05n>Y>!OW-F3H>5DK8gT@hhM-@cR~7V8Skw&2!rt5%KA8I z!@yy9RN2PJ$Tgs-{cbLeTC`;svr)BU6I@_e8mv;0@myecq-^>k2?@z}&+wD6$v)`A z1}UV?)k~Bf7`fHAhogDnmeM>UuB#Ed2ik_#DET~W&LbmB8kVdgm(U&4vXu*ai;^bR z7nLS$pQg(R#J0XUARkT@Kv!V(1&FI{wuJI7eIdH&wnLFF^Y;|z`#wUXZ~2@LUY+XX znQT7MOGm&ctRs-PK*dQFhVLB&UeB5Do8KqrrQPUx>>=7>5xZV9Zu9+hX-h!BFhn<} z51BO+56;dM=EWgM%$w_`|xRG2=V;;7I59&kwK zH7J4wcu(Y204(oyv@P#~Wbl8InLjzY$(r#!GqMt7m+}Y6qXiKmv_@Hq*2d~mv&mk5 z`f@*2-ovu9djiqql4z<>Oh$}bjL!*YUe&xsZ=gX7>qt~%RS39rl!ldBq}Vns?TY)w zR*=dh=eue^eVzaezOIVQg)Vf5+Y&iZwcnc;LE4?=YD@RzHA8{p3+c${1XBfkb9mA< z7HV|8eY4)H1X0^QYR4h@iek!4jg2@t|7}f!&wS!Ze&c}dRx8a^oBlGvLDtw>T!9KO zB}wZaX|?C4L?Vq4FKl`3=a;h&!i>V-WKi+l{IDGCz;L=D_|`^ds>!O2+Ilql^m-MA z7jEs>W#m5Y2OIwN-)#7W>&J4ZFT;gWX>;$H-<3k!e;4XO??-;2?v3~d81YlJ(YF^r zh%_tmcl@WXW?DW!wSND|Z{!ozGX6k2RLCXnpO%nx_uPNcyqx;}V@GrSSm*-Rk1Y*X7@px&&&Atz z46pYfU1pEDTaJF%cRLUS-)~4$#IgRe?7e#7&W~Mfek{K3yda3JIHTw)C;x4H*MD`h zb@CK9=QH?Kw&2w@#Axtcov$C=J0OI=?^k?#AU}UqQ5X1PjS`dBc${ zdu4j1PL^1Bb@{I;ng`eYy+`Z)RZ`{s7lw8faXNqdZGcVoPrpq)I^4Xfw7qsnfBhS{ zOEt0_*K1SSt{gr{`D6eu`uX{O6E#V;tu{QTE44MH2Hi1sK~agMO}Vm5H`ThoY=Gy; z!P^m1&JS!^ zrx2{nSYA|6<6+mu2i!s5nA0~Pmo-B~47Y`1)lkhxsh;nO_F8`Z@QQZI+}|##D6wtA z`sgxr-vo?Fz=AgZPT+3&qNF;IHY)`R{Y|xZ)%>8^A?$s#&z5MFPqJNh=*^DGQ9e}y zTh_TaHNazjxxsU>#{xG3I7rdJ<_Mv61x2TxtGof5_4Ug851VZ8^@l7hh2(ja%a}-yex9BI#B!pSpL26vA!uv#tHl&rT_mD}n=*U|ko! z(K*d9+(dVEm_X8=mwN*(j-i?oyaYyNb+>FV4{{z4PME!7)n5#w-O4oVwJNe@{U&Jz zdu5acWTa810?5h`494nlp!u!kXJ>`OSmmohO{WDi_Jx3ZnsUM0au8UoZ3eup5#3J; zvy@R&m)EYN_U~M+laa^*rOkHFV!vDTOo2>o-$?vla9_PLnl;e2yQ{sf-s1j_U|s#7 z25Y=@;JE~Go95$1XAG=(%kXD`FhKCoh-{Fe&&qz)72hu26WoL)ApCz7XDJDM`LA-b z%L@|gbPck^4#Lh+{@ST=VU&D&WL~l&-njzNQl{YS^CrG$a2PD~E{<`8AcX`NE0M1{ z%w)`nY~xIV2gD$pa}kO(6ux7RRf6I3g!rOYD zHU6tsE_b7O%&ZV}i&d`DjRhqY`jYJeywJSN=jH;)4m=3Ew)+5RsE;oMM3r}e_67eW z;dqWlS*|XpW#PeS4i7=7OZ$#1G`x7Aa90+{!N(2oI_16uZMD}IN&>L;Y2`M>iEs&P z>gP<{g^mkWO9>u1US_)@RJm#qZ&O$r(zrVq7tfs~5asgNa;L56DuHlyVQ2;~hc)+B$+)Fbyqq*sqczW+l;Y^?C|=leG{H z8)b=u5?Si!K$^p9D-*&3PL_0RpG=w_{7!q#qGjnNn_?=E2Xld_jMt!&Z@0AD>&MOd zOxD!D6o6KvGka8~IrX#GR@YkfrQKIwV@M7q=Jf%bpQnMS!pT7W9tAbG)_Gh0hy|*H z63(MNE=#d|M(ZB#i#tBE%NIk)+Kgyki24=@?@?+!zzU`w?LG`u4m$_oHKM9r%LQ3- zRlbXHx&8cu6URL%XQ1UcJm5M^Nm2Y?S($XrH&-TdKv4OjB0;=f|vionu#mjD(m_EnPm-_%oY@B7c1n(8n{Qt z7c4QXpjV(yK~{>Cj%^C?p@652Q@?plbbCZ?m?sw>!|kIDbr1mlw|=p~T3i2HN-XO@ zT%3wOOUG&^;!yxV2T0n82j#@K`#CR{X-`qR$bCc)#7Yu7lG>5_$<5#*vrCD3RnZ#sqp@kYdHHKY8 zc-^c!H)(;jz21oTbDy1ZLe7@*r+mA#YpyMOS1LI^`Fk+gEHTRxa}4qqENs<6Qej=m z{J`Z(WG;mB6^wil18GF1UYbM8qt(sBQcTdAjo5TI`eJRV42p!>B=|=h8*WAu3&e%wLXgz)y|XM%$uT(FzwANV%w+qJ1QJr(IZ%VQ(rsX) zyRM()7Yc?J_Pi4VF1d281aVUX`yLOF>-I?8xkvA4r(8scw<6H9%M4(;2~!;gg`}OJ zJs(kzcZA@_6W_JJgZV^jyUd_S(!He_i2p_v53TmoT__9KW8${T_8j{4X#^*`2jB7m zW5<`!jUB_)S;5?+d0*nGxbjobSgPyc36j^(kpv>EXkT71Eqx7YHtVf7u9UvA!6nD& zg!SnLl-C)G8d^|xI^hpYC|MHqS$-@8;@2)o>-o-1wdlDhSiEz_>3&|rvSQsTp2QIb z!0PeFD!jg}v|Ys_nlT$g@FPGYA=$(L@}u978JT3Bp?lE8vLG{ozkFKU3x15 zacM&>z^V3~fA|O~p0FwgIUAe^yAAdK+esK?%oxiX2S2SuGRwI&ptoV)0P@e0r1tHc zUiLmnpjvbpFV>6Z)N)K|N4@1Oud^J7xM;FyycT}DG&(~SpU`EtzF%hL9(h1i%qsg) zutZ+X`w+(fRWqQ<*a?PS1oAUwRd{y`*lyZEaIo`c-PBWXduF=y(27wV8EOqqT^^%DkZoad;)AEAsU^z{81000Wu#Un7YNSj& zFv{~jkTq6*-SZg}vVYA}L(H??dPZt4RRzVg+T;`c>3@^cY{`v{_C`t}RoC3z)p)H?LLR;I@ANLHcf2ZEEr{ zqOJAQ?L%wA5P1P33nK|RkJR2SFsXr2;}ut5Z_CS+O8^tvW0o>UQ%(f;^>PX z$Ki_uZt*q!vme|!ZVE&pB?$?6!hI7>D%0EHOwl5NG6@Y<&oRjoMta$rw;^ZwHm)%^ z+`_H<%Y$iEYi#1?X-zvQxBYj*LQx1_6sOh#l>!nU4fK40e&sh7h4_LbgtGYhhtkk8 zr-pG^@>bcY9fR(;)_Aug8f$Zfwi>%Z&^-8U7P-&s_{sN*^k5*)i)~h!pl;JdsofiB z{8$aQgrh`Hdpt5&XhA9oWH$wB3M@<84BC%*Z?}MwX4p`-)KTy)Pw@5Iy$2!3|eS6M=#B4=9w3kF4a_Auk zDHDp1b3GvDR(RIDkw3GFH@DcaiAw$htFZs(+*^z#F=M4GUJ^Cc9&7m&hw&g+np_=> zPAkI;xIU|?_m zv2?57f!7eh0c@+qM5Eo(t35e7c^g1qOIC{Ts$mNUZh&kUs}7RyJDO-Q70Eh9(BZ7E zN9y*Mq|Ip4r^yv&=|P0&!?fk|t$7Et4qiQQ0BzglM#|qS7AG!`TTy%{u=Xq`5Dy;V$CTZmiwgM_cQI1tZ=IZ&Jra_VUe826_!q z>Uc229Adb;;0Bz7%Ll};2xR>FoWy4tR`ZO%+4(EENcVRg9>a=(ZN@xA?bGssf9cXJ z(%O>9%g3ai>< zy0I6S1|TC4xT@{Cr?#l0m`Ac*QIk(I+Z&1ZW>;L$?BH-5IWW>0HqHYC7|Hc%SQj9j zt{9=}D{HVz=>&hkkKy4|I)%okr&-Xq*VY^O!VEj%a0X$G*ejuDRoPU6(PKF)t%_2t z6x*p2Ls7C?&T2_=*$P=W`~hX#F1ra|zs`{VcKH3*n&*k>g9j$Lt>(1H;(d?8g|A%% z;r}``hS<8E`UH!K?JEUAC=g_+t#ITv>@VGrCIKr9r#?+t#Im+RsVic zYN>0U)7CYAu-F!tWy@5mPuLg1SH)X=X^&KSPa^kHXOfG9fQ-QLc|$s98->X_Z{^~B z+9`x-)uUW@NB!7Rs&hP(-ZBtMb;uLFB(PZz8u8w@b)Do^C^F939v6utU>0M{*v2aY z;o^=xZOpvHZ;=bNK(XpPRIOx`X*z-C!o*hOAKx8`7h9C&iBv4Y29l#L%50PJp*7be znFb&g>@HwD(NI@LTnxW%elD=6-2nYMKb=AV&Qu2Fv{9cPSG_h0?p!eGQ{#EhIK?^3 z=?6n29~C2=1`69T^R!dT7b(^WZE@{%t|PTUA+cOG zQXLx+Ff{LzDYaxSu14Z>JJ9rMQW#;+HRYC_<5V|TA(oc{p-yK`Y{Qk z$Zwqh{=QK(G_K3o+Mpne9a#5h*Z088JBz2L5NsQxmZB)n)^Ef-96L&GxldEZ`_gPI zCTlfEKkByK*kg(2RFcd<-n!^8ULN&wPD1-@OPCM`H%%0EhdEu`k(Vo+K;T#dcJ-CT z_M$W)c6$roim|f$tg3)mK3eqA3$jK;DYy>~r6B?{nq;bH{z-?SC9NM#?X%d~1Gl&hJ}5;`~y4 zOydb{On{h4=N#s)IxZoH;%A>6NBaQKU^87i=tHgVB5%{3IFSpfu4xZ=mFHj6z&}I4!u!v5-c%k0$wduq+^>{`UT#mCx98gU*DGuGM)$LgaHD4hg`-;5%07H2u%7WSgXlij zT`QM-r>G`D;~=E~e?#yKxP~p+%74^rXI`oZ!3|+L?weCB z7n7cJT7asYFiKxvniAmi&=|SKcx@GW(PYE>g)*>G@bR$r!?so!K}o3AGX@-KsQ?H9XgSzC!vR9M;}Ax5@-V>H_1$~d%(Gyc z4?N<&*ZJY5e!5nALPt*3 zy~QrKfRZ_-M|)9J7=~J-aF7k^UwA2`q3~r?>v(^~4uV}!9|J4Tw_z>Li|JGGn)CP% zKa0#N=-Tocm^zCvC+50tdD}ujaPrg5w|Y4K#h<;i448us>r*w%|9*4sb118JT@=s7 zP}a_Hw63uJMekXW&W;8&o&GJYOSA3oL;J;^=o{0YyM!RK7k`MeFV+|SzidPThUs(} zLlztTj@VFPclk4deFgSeph3q2HFhDJIAx&QuZrXW{kAsxLir%^GBAcIsp%H>7p$S( zUYoESYDoBxs(AH+SnrK%3tOkdY|VWU*1SyG5sunC5BT>FNC>C(CIu1v@~y(goM=bZ2l_yGiN`^NRXb8}^xbl-*u63jr}g*1Dq5G(vG*a8-W!-i?yq|(x&-x|ew*R4^7}*e zjO0v~cpA@iMKc_y^lzxpipa)TW~H7xT`o9waoq~`Nj<2BTiSyt8u#>hV8g#=_pOLh z;bf@QfR0QFi}1>M9Vae-BSAk(HF0(+rW|Ka$_C~GZHudLTxlT1T!h1g#unDSv6f@5 z&#rkX&|CC6P9kr5#C@SZ!aKmgpNr((VRRkw>|0aBE%(gH3ez!25_jj~X+Av>3D-?} zacwLrBO^uL9TaPa)7M45zV0-tle%#t+M+Jn==Bvfeq)%u0H|1M8N00Z)-(TrI>Yhpor{XLv4xts$~H)!!EKH#F8_WD<syA;E}2XK!zbOV^jHm|m`kU$uG#Mge7v3S&qgNd zb~L`RZ0t>(S{zV@zO)|KocQYQyzT4-(3h#*@BS_5bDEH} zd1xhV`o?r1=nVpnNQmXhP%&fC2+#}eh|_0Mwx^sb<#L3;>+iqzEtY8QsXxWd3_fJ> zHMsKGbK+C$qITy9e}OT^%iV z4SWF@Vf9i}6UTe9h*~Iqtz4co``N}P z`ZQV5$%e@V-O9`*q_oFV zkt~s~K-JsyE!8LV6!heDFm-Axf$Ca^wOsawmS~=eRA=S{S;RyP(IiqkyXp+?&Wzl< zw^!nEA0fW35YVu_Hj|NQnC_!hI|nHFn%A$5gK5gr=l{tKfb-_z&7@=I3itNBJsbFU z(wbI>sp) zEu|>Z3q4igTK#*jWZQ(iq&sO0s`OKu&j4^!VLSNE4kjIe_y zKNmn9VQZF>)Ws8T6|`M6d~C3uZAYUS-2j9{L~T5XIhXQ>;eF5WQN7k}W80@>XG4p{ zx(?eF)fbcXPcl%tq>Y)&pj*ilcaYZ-4zYLL%K-SEPE9<1D`|L-N_d^4%=~v6gjBK8 zUF99U0}F?`9WNRTa#h29dA3}b+9wT{>J84xndkS3&PlxoR7i>HAOLHCaf1NHE!DAv z@Ukfn)C3HOkr@Qmve#y%Z!a2^``+=6)xJi*{NksH>-m#(6d3(0rO6*5{~piFU+*}V z|33WC{KXx{)2lEI{{-}1d|F72I+9{eP9lWWhhGs$$jOf4vxVLV-d;9YXH9Ss%Gms+ zOQ3#j<;zjW^g5G42kRlli@F%-wG2<0*P!27FwNxvSTI1q+5IT)C+SN%4`TIVg!Ky> zoXLZ`kB?nD>=w$jo^E3eRHsMfnc3< zV2E*-^?2jrrC)vM7Y_g25%7zD6c>eb1`6Q!MzH=zc?9?ROiNEki;HirO$*m*rzMNu zI`_1aM_@^>YAUY~e)$Cp9-AX+v8#2i;Mx=lUM_Vo>F3loIi7;YI{z^3{EGGil}Nwc zdgf|0WE{yBP{vVz)@}OQWLZ)5xxk;!(@rX7npVI~KHppQ zKL2Q`P|kjqz|UGLIlY|#7?@^b+H{KR(; zz@`6iFa6-t_&5LkyP@x2t&0D;p>HKQ*S%{5qP4~8hZA{z^hlGSBrG^f4n7Atp{e=# z#%H#O+&ju2_0hR-JLQibu>^iL+Y@gVcH#?iCOsC$)k#%TA%FRbAK&Azck#SQq)R%uq`B(c-T(Aq zKfd&jFT9a;>ZD+OiRJ;Q#K?(@|M>y_&3oQ;0>|*U0XG#U?(wrzKRonbzvqGNA@EH6 z5q`R=*Q@{ZL;vzUX`-O^P$EjPlJ`oS>0iF$Pv6|mLIs{l>5@t0nI>?>+J3&rCKM2V zO{mj?^~a)IbauDblRPmKsFrF4I)RA#a==BRPVi}6Uk3%(pX8fBywspWBTW98+Bna=ZWF+FZN&Mhdjb;hoc+_9RPOh+8s zkTvL-oKD@SOo<}=XCGsU`!2b1r& zS@nNxVOR}e7QJ>^Ex~!dj+~`jpS?5mDSumK*@X6|BU8z#NLhN$$HCI8mq7RJ5kA9W z=XF?on#N_4hT7<(X7E+llz5q<5}oWJ?7}ctJ4{!K#_x|?ciROFSr2<*hLCaha1gC-A7eQFk6uNs_c6NFg+m2mhZD8 zVl~WA?O5?GTW1(l=guc0wyft6YepJtE&JGPU~6u%f`7o`?2gx#J-OQ0Rw^Pn|HN(c zK6T^_Uf#2kw_sp!GNpLCuH}ioBQQ;&r7q)x##=}3fM+>ZdHwW;_p>qR+dap z?A2t+It4`AR-LW`P`;R==lM`;VwSbxm3X+FG`Sa}8)bdCp>FaX_T9YK@J56@)RN8J z2wgB!IzEtcb!fRVE8wx-qB?2q0Q9&(v6TVhlRda29aQb78YIkrfyAW6$kV{$VJ$C~ z8kOO-L)~N;Qp~{FMerh|`Btl42X+M1ZVoSz&zpljmD6Ib+U`-6|14Kvr zIilY5mU3XUy*Cool-v&geE;5fc%u@1RVaMu095!G&m?0IeLXAB#?-bkF5 zjZ#Dg6{g*>uUtGdzfEH~#;B4vz)f~<=c$#DW&NhhteBAHszmTD%s_TZ;YH1KjWBsb zK=Hcm99~9bYR=I`U6K#fNp50% z?3Qm~H~UIvVL~2O_=U%qUrjdVi9?^^oMfp9?j1<0&^s5A*rYZ0WcR*`)w2=4a8#`D z!>jbsjMcBFnZIiFW}oHL&*yG@16xy)BB6N7-H{hno9jB}%^($U-E9*6tkaFoEe5UTRD=HqMf!uME36op>;xV4Zlq78;=DPW^+Xw0mdk-jO{&1@m-)@1accbLRj7|(*hVVsfgYQXgobW$E1 z3?ppvX%Rj`+&HE&N>=@3wtF)o(w8S{z~f>6>JmGOJQJf46>=6G z0=QkZxjuX1Xjbt&_zb^CHXgh2+N04%3Xg~oW9!E2siZr)5&_MU9KEs?oSTM_W>W5# zUytLtd9>LAwtHtCYs80k#3OaQTdZ&z*l5cI$Z`{I2#H5}ndr*L7jqwlBb^ zUF4b%dZ|Ccj4)pmMp{5zH}V}{xBB|d*R|Us zb#9Bv*h_2Vd7o)S4HFMf_D63twkaleO!z78#$uZT56vJ>m-rmgU!6GrN>Qkkl8$isw>Dc-0bePD-+HA%B@cnSNmN5!ad< zv6>uI?^xzhN`(=n`ILr19J`A;CO%+4z#j63{vw_36}eYbttTFaHDg{B?vA(Tqh zU)mKtb${+JM`kYCsJPPGK#oH1qQs4!FIZ|HTF84A$0<|F$rvvQ`*PQKy_walO-1}U zo=HEy)$XD~SkS=6ochr)6;B4soHn(P_~WMeUh6YjEW%EspNn_uW=C7=_jGOK*1wIJ z5$Qm?VHu(f^Spb1w(H_IjpiU9;^0N~qkM+b<-`T=$7iK^U^W9@6~z-7!R9>{k=$Yt z6}a6EY=LtCJ>Gq(oVgaIXQ{vfdBZ7%&d=h3;VQf;9%2?4pc3_ZR`8Q%YM^yge%IjE&1zk z3O395`VoxNTKQJGdLK9|8^M7-9o?26t6f@$gv1+CVb1LND%zFqo$Xm|g|qv%`s+$8 z67ml~iN-{$k*i%LdFjn%YwaF8C3On5MlOSVx!v-?mc+IuZ+972c$`~RfUeBBg?5YB zdsuwO8aI73>b&mi1dfAIPu9Jc%PyP`cGWS+(7oq^S3+;Ox_*aZ*V9sbTeEbcXcTor ztE$`jY?pwWnnI?Sjb?7OY3}l;z-|01!rE2H7`|#bW3^FAE#1g1%(Oa?K+Y<+wq`0* zSNQ4CvP8{D!Ng1dn1gNzt39g%r{*bH&y_90hptOk2)kW!pl5K=7ice$6aG1B$opYT z0p%<}+F%=kgve!xI@q-YSJ z8@$+@yzKIuQqI+8I+imK;p>-fGr%l1C;8 zk#|<{@2M9P*|l}!ygSH!f_Fohb~(MxcjK$D4rSAPj8}YI;Ftxb3w=Q&hOU)yLTB`&qOHTBTZ5ttK~$f14FI`}Vx*VOp%kcm^k4 zP}fF)!%@#p=~JePBwEAm9&g$32dCY`jEL&AmLwYNxc%$(``9$bp^Lkr+JoNKoe5P2 z@VR1lyJFZKTzmKKT+$dyoEtV+Cpo?e0ECvf^!$xT->!odJLu9r3OuQysYh#08%Ykj zVSU7cbIl2wHqH86^wF1^wK}^6?}oBOs6@fu!iiavN(AGD0!PWbm4enJm{pOR2)KXm z86E3caC()sSL}J&5(>y@oj%ZxjCt0+*bSB=ZBnR^n!UWu>Ubv+?f~*0LrJXhiI3%b ziez3vF^{E}IxYi2L-<=h4oFm_-mkOnv-9qR^i(p-p48~agJZ)7iS-LUE7Oy?^BY(T zi~sKA%RsJk2+y~QfJokLM_kWqv35u2D?v&rsh8~Oq9kBQpfr%VkC*EX-x*JN7WIxomv^cEB=Q&F%E=?r_T8^(ESK`wh7F{$9eEJy2 ziy{!GqV+0y*)`sVWum>xH@97!MkNTEK!lptFhY=a#YdwP6d2^4&iJnS=}NwKT8nvBA?pJ=kPRE^XfT5HL(sGlk(HR;N*hnH-}FkYxtr~dDS zRI~0Go~(0|uDGkLLZ(%l9<#gR7-yOf$?=&%U1219Mr)>2S1l$%9!JunN`;5GlTEeY z9#!Iu!UwJT63k?r=XCn=rps<#9&XhX zHF4eZYM9JOyQ0Q`%VcP-eBXFpA;>)NXZ3$83?;8~)I1Oo_*L0SW-AD42JWdhlJ zmgFwOI@oM@8jx$ezK&P0LPhgRpaN6ZAe+EPQx+BHg=~m!>-R@t;VkN z(1))hMwahMMWbf_z|cJO=Ol|67et2=;uvP)%bi`rb8e zeC}wpkL+;pigubN$MvPudkUVVKV^jcj{*V-cYwld2@B1=XH5)|h-rKkdhce!3eVwk z77?qLqCV^MQLn-(l)J!V9_Rb`xc~9U8v=EcRpp$Y41Flwyd<>w-pv$OgGqEh6?bfL zn0NB94$VuHtqnG4y`<0>oM#rDSLP2z!G6~_?aAQ1k@?Fnas&5o-_(q_IPV;pz2c`k z>p6);7!Ic9kM&&YO5pV2D3_XzlC3+aV_lT5eH@z-VN8N`%Sje2#);ChthmheyY-y}_KFsZL9y8O~Ir z?(!WNWUu^418niDZ0oD2X%p1Zhkj{ZCU%lNo?zHHzL&07!4W(!M!Sb)282%lNUrSaVv-MRSmrXNg!!j;Wi_94nJy)MVh#8OWxdOp7+J76G@PGH_>W5>3+=Kdsy zzHF%T+Z&Rl%Y(KYT!*V1aO8>N?aq27nL1>Fa%effghYb(UT*r42KB_12VF~5VWxfV zgTIPeYI|1B1o{stq*lXfeUDE=GfVXF_E7_@DzPH<+mShjG;Arurll3Td$HZKOLRh> zDr$V;sCK_H`(aFi*t?y?k3IV=FX=`Jt}W&QnwCF&(M}+5n_K8oxPeZeUW3DJS=h$ z3fLpbh2qgY^(C&*OnwtFo3*sfl~@6@rU||e>t$I=BgyS@hhM^G@>B||AsN^VrmJ!X zgx8suIwqHE{g7r9;?nhz#j>JQn|;yZM31Va21pjx`RLhFwzst78R_Lb5!?{HRZTUj ze5N4}SrCU$+vb!yh*-CZh+5hfnMY-rcQ3uy^%-*$4?aUL#|OqI-?o>6d_!q)>2+h5 z6{3mO-Yn1yR^5Sx0un>J^S&o+hmWNGIZbw)mk1SE;%vlFbZJL=_pbHK_d zT1;@7YYDVO*z}%S8kD8SQ&RE5UbAo=ujxxlIf9u7pxFE&+2gNJFT%T2iuz9x<(BTD z^VR#Ve|yJ|8fe_xT_EMU1o|j8YyXK*{xO?IJfaZHnSk~<<8UN!z^&t{&|?3pMS0uu zi)m(jhW4V7Ho;j5GIw`vkFZ!X1b5A15St-ajkTu6 zxR<6le(cQU+gNtu^JZD{2X!pXk7)ZxjbSs1hN2C4evhDnyz|#Ph!d%K3F8D~2s>!! z3IFULzn37Iy3`fPF8+KaNjUN9A?>E(wKs~@dJM2jvo40X)>lvPem$n~$Po6z{u1>e z&HGYzv@DWWW!aaU;(AE=_XuvKQ04RU{9UWjE@tZyopENB!%wEInG%>6y_X=TRnq^tJUG`?g(bNgW!%r_7O_gu@AS^*NCdj{gLG5ev;Tb>>BKOth>b zab~@1j^=a4LIDFCduJxk!j@Q<#w|70xWs;oU1L@2Vlt+Gz8f~DQzoiZf#jK!?=1Pq zs$05HI=MGBIM#K;$Ob#v#A+T;SdTJe8=T*qB3a!@6YS77wvQ6CNu!{SqSs1zOD&h(@X(UDQXI>DprRc==T)?&9)$2Oc9gl_|c%A$^Yyy(UGCxyy= zK|_7QyPQE{h&_#+wbgezmb=DC%`9V_Z=6@FQ*M1zp8|K3F{jUt_0Cw@LY2k%)w-YL zS4)9R6jJ&Og_O4J=2U%WRK6XM#1{3UP$`F5j((48(3ji@8g2Ht?UuO3>X?rgm^E|@ zE%){bXu%&na%(oS8@XhLw}3Rs>pL<%aU9xRvUeNEZ@la;x0~+9TlUp>Y`|Uad5d{X zLrSV<0?hw#?`K7x!cb1c4wvla(ipR-jpjI=%}*ZkhTjda3U^L{e|{I{Evnpc5e>Pb zrt|AeS8Og^{cBI^26FAfW zT`Qf(e{yP=CZ0}16iC({ixGep@2Nc4j^M1I8sq}R?l{b zYTGESCT|64yEQ8jL5Cxwxob+ee~G1W;g{9IUM1btwBdo&v4?LJFOLNkar;E!2>IJu zENj&0H}JE@2rpc%8Sb)5%-ykPp+Oz#zQ}*bs3Q1Xh)V&W<#L#V1@bgca0>BKMgQIUz!+lSYLrmI3Fi+(e%~KC%JR2mw zXU0B(w45wbb43;?r}WoP)aVD7Jf>y-K;o%WsTW3{9Vat_ENO{>;S9|u!p&RM_}RrW zmPunbNWuG@K*t$Qt}o){vtQ2;k@T{jIqmipo_Y$%YPDd-NW+qL2ye2e8kvs6>w{Wu z`r1J8!?Am_xNSw-$ljoUwZ)M*9xs*U#cYou@t?% z>{66_dNUxbQK|t|m>g-w)HsBEy0r}zMmeF!8V~CegetM`dZl^Z9`{yV2XJb-6zkL5RsV_b7JH4E4 zJQSN)SLGeSl9>)j8THM@Y#z=KiP&acm1g5u{?dtlkKtUn5-pbjY*7^XnXNGmGr=9zKg-qxv4?>uMAJ3l*8}K42Bt)q#dISz?UqD>&sMrsfAM_^PmN-a zZ++z_SVsI_()QWlPL%_&;%C*+FT>^au#^7{}~1s;bX&*0W@b-(HNtO-|plH==J>7dy&hr#y`?QRZjRxBA) z67H=@l1uUf?d1%IqGHPDOQeXR7bHPV%PU`jX~~(&GiI})MfG*oQKhbB;}`+C`1uc! zo%w)}LX?Pei4EBAwl-N0&`XJm={l~?8ErEI1i0Kua{TP=QWS>EDlp|@cndS?%dPL! zkTEL|@jvj>`M5ERI8WiQOT?%fxDPw~Zi-2=SJ(mqbHb(JoV$S&g6sJ@NZvjlvt*Cp zilA<&>uYOd_%;m?v{i5NXz?d^Id3UCxvh702A-hMWuOb057#Me#i)O^&kZ=+Ji~=< zTLuEfZslU$cQTQR6Yo!$k1bGJ1WIh-a<;AZOob!JDm6$=s6uvPANMmlPW6mtyZ1on zn7F^nn8UyT|CVw^>C=1C_8?=F5#lCHYTnF^?1qe#e+0w`RoEM7sV;{Ji;(l}{62Tg z=o`#8K!bHXr`;=5HvjVS{c?*!VvRkyRO+&FnoiV8pdC<1Tk>_=?h#UC*OrpT zi$3^XxYy;-$CqR@LP|~a4Vz3raAC;^TQtjYUeK5yTre!X{7pF5g#^p3TB*m&<&+Cm z>}~g1b!1q~fy7YAd-HkmL}{!Nu3Ry^`8H~YXyDfM(VT9EL*F6a-nwwG%Q%|7R?iNw z;%+;nre(vCq3X5le3F6Wufm2}WOhx%F0-_cqeWkF3{}dX2rkD7re|};X)ZJl${=X( zLw2QtcfI!!-S@gE(H(E=QaP8~m-yYq1yW_Bf}cZTwLdYcS+p2%n%k46bm3`rG53@|m4MQZw_vCm~y$;D#VOt7Lc z+$NpCnl$BJ--i0y^+)muH%dSPPe-fw_(&@2LYbsPDXFy8JZ#F@HNVe06>ZdyN9(ph zmn+wiQBN!<8DLE_#I`98Olk9e{Yf8x6tV2}n`HM4GEY_tt$7?_(i*<$T@78*$t`TH@4H>mc-Ym6c zkA@7}m&{BXrr0jnk)EMna=%+;ySCLE9wW{3y5W@ucR0T{B>f z!1SJJmSM3p@KW5exA5 zrB#cpf^e}FG>q0q!uk~nFBhC|;2(ydZi-%&-d-BWo%(P*3JUya1|vtCL5oafs*j;! z_Dp0zWT+R18)8V0-gH-&g{Ee~ zLixn{C2hTy*C)qnu-RO=Eae|LfIq{XO%;mkAg`;_Pqz=H9ipU)tvhU7#v24gY zay%n}Jtdaw_sA+M%Hogz!cjJ|+}aXDFAZ}{uGB0|VG``K+vOYE#3jb9vx|9K&3zn- z)GeV%uIlj37eNDgd9fCp)5V__eRmwwE%X!~EmZiVcH_oA=?>+Gw?nZx+ALA24>$ys zM$)e&AVm5?`Pe<9pLpT@w6>b;#+!TKQT(|?ev*X>7rH&!sZD*8k6k4u%p{Icd#omO zth@*jZyUG)uc7AjjXT`1&G^Lf_zucU8^e=b%Fkc68Ps~w_Ozf2($A^ zCO<_@7#7VkQ^PWj1~am@HCg49uPRFKj)pJS=?k2VRT>%}sc+s}wRV+(=CsQERCNIh zdr_C-l^y{(VL7$?ii}2Y~7Zq+}eZ(^%!?jXIya7o;{&AEu&sAn?$DDGe&TZmQ zXZ2GULKM%yBuX_-Y_4GJ7N&tW?3UiRlrlJMGIlQ_tic_rZDTE#99(WdD;#iMq}3&P zujYppKy|J&dnpx zte|FS+M_`mAwlEXntVTZLNXTr)wDX#a}qG4)6De<9Le_ti%9WW8CcxvevUnioplq6 zBZUmktk)h{?F>oAf(|||HLN+BbIHUt;bsM35r{~TzyyFN29b|Y#qoGtX4 z9gZwU+4375MaDHwmYTSFEy=2nI}}gf{JoBflgx?)-%g5wgqB_QH(0-8X6u_^zOvhK zzH2?GU(~mj6H%%-h6QY)W4>Jrcc#xap5RoOOVXTIAKM;`hXuQ8S}b=rtsJAK+u>53 zb#pi?#^acCoC=en@aQbkTV+v~Lr@BM+6Vwv>F;d=@1nH0_qQdk-e6jak&?D^@Ha6d z_ck5Vw-G$^-`s&c4qvS{$Qky9*JkVTPfb5Iu@o0FV`df=<_}42P;%a^;C`T6%E^0D z*9Lk?322|H->fOMoz{sGwG{J~;d8iR5_K+5sqmA&kC%C2H(o zJu-_IcrdOFCtY7E_Nh;ew*do40e6;!ILsK+xVcH%MQs8MpAx+cI8aN4&=gimR_SGo7-8^%-nrFRSYPutmH7Npqz+pB zWX5%OB8SXaHhe(G3&@skM*pm(PClpDXc@65Z#=sRc9ouxo_NW zJ|)^|zN0gkwrlXZEn=&YiD$k}{Ep>MRaC&}kzaxFR-Nhv{q1u|-Sf?NfXxacu7-V5 zzP(W&!LTv^5#eexBw@=V$MF~>g0R>{1_f6M$=SpzeJp35`Oan=JxT%`_?du6z3^?- zRm7(K>MR*((xVMZYK?W6YbKGG%gEb=U+2Xlvc(5|_`+m&KcWr7k(7wkKRyVQH<<*_ zbTR{S#~4Ia&a$;ur5YnR?D>3AA2*A*L)-w1;ILfocp>&pDdRzC`h|j25`OlJL*QpB z(qgz4qL~U~+f**m>fk)Bh^rr<8@vFdl(%488BR1U_?p6Yrs)IXS1H)A)c`NQ&5noPg?W|*Gt~^?&@Fjix*rNP{ZL2vltQ4Oy%n=Nz>*^oU>N@-n zqb0D&7WnlT@adfmo87VG?S{TbJJO^APv9)`HM@I|#11NqVNqYw$6!tTg3YupJ6*4= zFN=sE95P55Ram##S)=&0h-6gsc?@a9)mIaLSXvTGy6iDAGLRN!jt|MN6`N&gsN zwcq44QeiA2b@=(^#(G<0=>ZpI6bPwa7p@78xfOqPQO_Sku0cBL&cb5#+<4nKp!2-E_L~c z_qr#=EKxKFznEQ8ZswlmnpAr6TJS-Rk`e@$bQH`%NvgQx8^yIZ#>DAergl~~20JdD z>v7>xzDX=DGDR(n!VaYy8EqOLYS{C{=MWr>+}3GZiiXa-f(c2DbURSwjh@6+U=YG{ z#B+BFiLUufHR*Wg-oe1F4dnpi?=d~zWrk4^4+&t}ULWuk0K*=wj9qAyB6r$>t2y2R z>{)rv00!EoO^g*(Wm^t3OJ?MU>&>Wh2xda>rBBb2eHr1LE$=lGA(iO*1!_Ep)I!9% zihp`M)`9hDARTvTd=IDtu+uZYq8i6co%mHk7T`r2Y~zBTuGf@{n#^g$wg&!GNXPD} z@XIPe@vt7AzzJT3%4SdZ?-{=P6NE8a4pBUqvKIpsT# z^5bl??=|<>)dwX>%K4Hz<`z9hYg5ODah&n%^{cPKB9#@CA?2;v?gy!Nb-E4bwu)CK zlrjgKW;_o-t%pA#40*$(*1p}FHC|_t^Y!lUoUBnCX)sHC6kQcR%VYo&Ol`ZS3WX51 zQ`1MAGsp|vZt53)ib#&`ASra~rh#%UjA%&*rh?kK%GcO1C9ez$fbSNGe>65?_} zS_>t-r{j>kPASFMoaqy=oZ8j6ZjZOn=GuX?vVE6vk2alSL7&+VOZFRuB`XDHTIbWu z`>c6mr)ZcZm4C};|4p6d?^4A7nNr06mD5rH?tudm3~+_MkLwRFc_?bNYuMEiVwnP@(l-3J}d66+NU zlT9Nr>}HBl_?68$xkPBAxS_WK1&n4Grsz?UjM3jQVKFm4;`?9&4jtWjMG2zWdz_*s zF!DMQzXoHB1xDeAoNcquDHTTC=|t@M+j~+;6se@J`m7Yel*F!^?&!uyg_+UJ-^clR z^kiBIC6}p|v#Ff>>Vv%#yT$aS9aKrm=SRC_qj#z+7cU;JZ(Rre3x!05MNp0jOa{-i zhrGDLq*gh5%GYvNRx#hkfw+yrd;PEv*Dz{bLBa>kHDLl%_7JO>Tc~itdl@LGeX>%S#*VOx)FyUkLXz% zN<}P?5EDgJqOV^N8`|v>8sE)`Tn)>VL`wer-~d=n?gQn^fzvqHZZa37PnQ-PQrW&A zKbOg08h4Yd!=WfGK-)gN`lAu-Fa0N*jg;Bu_xI~*0BK%sB&e?lE75N{BT%tt5a-b( zlsosjo?ua)T?;wSp1YOWiJ$`>4!L{#tA}nlLZOz@K&c~>pi+a+_5iz-U5U#-E3Ta4 z`m?m{K5oB8pB>FkL19{l8=$f#gt$x!QUibNoqawsKjo40z$0@C&Vp)~o>$Qn2cqou+*2Lsi}7o_?Y{W8 zU3lrNiGruPO+!ihtMY~hQr5c`73M7vZ2&oGmp3?(OWKH6oROntVa9TF^Dp4`a;;j* z0CKs1cOMxQh5Z+x_^N4vqem80G~#zQu#Te@wxr1RMUUam;+e?7<*%V?XT$2_ZdIax zOZqu@0?TE%=sU(Zasaw@07_9T`T>VyB}_KHwiRD$#|YNODPW_L64_T_f8`tlMZM-R ziIg)bY&czy530{*1K2-|keJoo*gywn`uRR*I+QZgPP6KjcAvkTS{`eb)8tvMvTgpn z?rvaM>ONI5VD?=eR1&B#5V7s$(E{n(Fl1_jRa30I&rw6Vu!bsZGel_r7|J#E-3iHtN<02 zHSxq|nuxaN`{Jj%z&Q|gu&~~t(W(;A6H+z640ts$Thjsb9i-IMp&h9A#hp@oXy;A? z)7XU+E~yT1^u2LR4%p9e30@Nc!V)*U;jv1k-Lv!=S3?^M?;X>D6yn?;);zR# zBA~`uYi_8-{DMIz`Xs;Yk{oCe>ixwLm^}nQQE@V}@zI!2R`H4l9Gu}A4Sb~N_#9h@ zpSz8|&q0Hkzt=hq!Q}3R2c1`e<_Bt^KIQdRxadBd5(icP!^fmyLB{RoZeMk_)tPOPwb120AXSP^rgwf+Rirq*SqCkIrxK%ATF{j zpWBB;lM<=?OL@R}x_5QP?ko8|f8*UdI=gzrt9vqmfcmCbH{`j^2Vql~7K5}}s&vgN2*_(QwkACBw z3YY{jU4wm5O_Z%bB|Nmx^>g&3l?GU$DrcGYJ1(FxvHO0b;h|mtvuwlhclJ9?V9443 z9`YaO?(ZT0%LVuMD*vl(^><+TtFZcaVEL=C`tCFpW&|_}T(aYpWd3t^8-FLGcaSSH zU*Ah)+_BLg+tEJzr_=2n|5v+$tZi1#+FBio5nYn^2tE7hr$=bR-rowW0h;>Z#=F-{ z68@A0?-(3bU(PZo(6yv%q)zn~D7j9zOGqv1Od~T3wWddwC;l{vsAD4L_O_Z%H8z!Y z_s(9O9U{k0z3e!4CC21Qw8@S`(sspw!k@y#k}%^Gxv_Gp3x_ztc~Fd z!jkxB$Q^R=0H^nkb)g}&XsQ#Xh+ z63BFWr3ht_kk|=l<~@Lr-6bs^OfnV!li$q z^MC%abJRbhqcF((P3~Di(%PzkdChbR?@B_!pG|tqfrkct7ssN#Tkms&+rIi(0>RL7 z|JBfD6>5D;3ITpbg(S>O88f_e~hqa)~Xbs#-G6{hu>vBIBlV9MDvFhfT{Iq)e_`+p7hzy44> zlcsk{wGy5GzU$PFkN0l+`*$DUHi6t$Vf}F;e(`TTlmYquj3AHwl-uneAI!?@`;hw4 zL^J*$_TDq9skH0k9{UKEaZpeYP*G6nBE3XKMWrcd=tU3^LO`Uq1Pe9JpN)qDf~A3$o!Ieq(dTlwDicL(9@#aV|x z{0p=qg?{~y&)M-M(1w^;w9qC@XN{;B4!<-=ExHw3y0kdX*CMuPQElbwfBf73 z{BRJm`IhXLXzC_RKRHY$grTRQ$6`lKm$s-CjabW4$k7!0AkBd3;BzqiXhr^|4sqOJ z2st@JeD6UGrHxgpBrww0-EZ#e`{|au|A<~b2;Kx#E!;WN=a^&P9&n0JdEaHJFShQJ zpSn#o&gLM!QiKB?!Z|3PdR6tweiOYM(^h4coIFBOXz$k6hQ}HID2Aq30ZOjSb!XD* zOsJC%bH!Imd;$YsdD8HXp{g0ve@xwV^L12*Yg2rsuXP@C}eW%G2TJ@hv0nvHV(DI6|7Vq6r zb|we+OTyH2+K2KXa*Hh{0|G|m@cGeNsS&ng&=9ane0_R(w5V$=-KjHJ`%-QUdDy%c z1L)+G6OMhpX#FvQsjha{ZQYGe;m$K;1+A`7YY?-&QnF5hwHh5rW*uP+hO;aorJyO? zS?8L$Y`M4o3;Sg1ZM+Hn8_s=_Yc!0T9HG^l8k--qG`FmHDRy{ID|t{eS7P6ChqlE5 za?aW>GG0J1Y-z@AkxoRufOA-&#kPn|MLlDLn0h$ox{*4qr}O<-{woXMOx*bcNH*Vq zh$|W5(nAMdE0c8yA8y-UUi;cO)iX)FS{WF9D{)TFks&^M5~=E3Y`_Wg!&l z6FHgi!paRX8rlz^zHsK?oA6{&i)IgO#DF?^*R$Q&Z>r>3mGF@!X_`cSVM!Q1>a(C? zwJ2^VATTSwwOuQZZd&a7dGDdv_T{}gD|ZjyYxD``-?`VmivPLp{2$Ifsv*&DSG!@bX-x1H}8;cFpzCzoL%%F_{k#Q=TMN}*XMLd^5oWu^j z4}|eV^9v8MRz!=SZsUSg%)ZJ+wjsLC4H^FWz*e`HOiF5g+r!&DF1gN`7p#S}(;D3> zG||H90MQjQoQcv&ABWZ-r2ibpKkzYn=U?Ob-ofwXcmPclW6B%m&5#6>b{{_M!zR!UxZ>>KxBcjPi&sE1-#UeHaSTP&#rysfr^I88%-LhiU8$!cHA>%(V9a_GeRlYsin7xf@ zKjUolruR$N;-~?#jwKnkKOKXTprpFBU$Hr-m(pei14bN=92}W?@z;oquUt( zF>^TtK9dxXlIJv=m-B%D`?v*`qM5r9n9?(t*Zr(+8iFPq0v3;TkXu?+j3sAO5lyp^ zGybma*yDDdosmm=-GaND{>*BcXs@Kl$`+Pu!f7`xO;sEH*k|&EK5{1a!~QOyBF@DL zg!R&?WfL!`vOmc7hJ~{&IS>@zOv-IIqeL=tl@!rFIb3 zug&2*Zoj_Z8cjTGH4R1DYnND^gj98C{&d;__L{NP8rVglJ>XocP}DYS=k(B)Xug`n zC}PY?VM$f96*glpeHB~K4uJ!Qid331O!@UQ=&b)$o_3@SNK1K3cjZ|kYeJ69=F4Xgo7z$_2 zDR(y2lW{m9Z&x-kB;*t`aCs}8p|#K$G||bsTx`t0jh^N8Yyg^V@M zS8=Dbiw3aOqDU_v*cvL47&JVHoEsc--TRAAsNZU~d#XOsA*wc3R~IdKxQaJlRHH~~ zvXC{5Bgg11&V@Z3Ji22}LQrv~rMb{a+7Y}E)w}CbSwqCYWhzR-J(<-6xF9c27 z6M5di;NygT@>$urtmK4JsRQGpwRWh)kA#V4v9YSC!jHoUMFKep9+Kf-Q(#IKvXSE@ zCM=p_^dJUMSC6HU_moY*m!G-vzSytFH3bp0a=z#rTBH@tJpYT1xM}(h6){j^?)R*l zF)b|E(W~sRDX%)hYCJc1`O#<*@zj>_ro?TnqIQ?pst$SB%&0^I%}?XNI)qX+(S5%e z(yaT7y2eurwPXkggty|AzL8Z)F(pV^L^3cbvDNulWC3uc69!B4x~@SMSIAi{}AMPaHm6C-I+2b4z2!umZuzi<{larHlce3Y-T_ZJ{hAVgm$Er}6Gq-*<}f{6M`u37?`{DujPeb>te`woCk|Z6 zsv^jfL2%dIT}i0QscXt3LF1+8tOI81mr#eg>q~A;7)ZiJ#ZZ+Y_(_+K7UCg2rxwY% zh&IyU6qFN#HJQ-bK@xmZ8pt66Gu(6Yo>dJzfz)pu_-JQtsu`@qsO!$O6>A~;mD-p=u5w?10lFa9|j3^poeGlz_@P5k(i3-0q@rY-)qFSmB{ZJ9fuN#b`^- zSMx^M8-oz`sgSiH1rV=j6Q)G$0x~>w%I2YcGHNz}FC)>cR0rN^6RiqUm>!^+H6~l5 z#u7;Mc1dIa`{=5VF)2{%mm7x>$l@*MK$T2Els8unB^j$(sx(N#FNQlWeE+=IuRZ@< z$h7i^TARmq8_!}Bqa@=u`C~^N!S`;ay#Kxbpps!|nM4)Oi)qG26BYyXR2HAew!cXA z;)JG!e?Cxt0Z<;RtGIk%-~Ff+vBB22J%JpjwRXpu7r<+e_L+XbxRA}xZytl z92i~ftg_Q~7eI`C5Ndxxny*qP&>wpCO$`kcv<()07OtGiN6F)-FZg`9v7>?Sg={>@ z+HkFHq&>RtEW!_9ti=ewB!nN#3Y^{E$`~jyY*jHNeq+5n--+feXaH4#MIzbnMgNGn zu(r6ml3u&8I>;AYSX8H|?LyjI!ZrdcL1u2O+)(MkcDX@zC6%sPL2Qh%tF{7>cA>Sj z)pO>H4{bK)-+hjbp~dhApCEDovB^fh8$E3-_m{s z3Wvh!`cxH@ZsSvp39f}X1ITnOe~-?QEx$y0@2oci-dc=}_q7e8zS3BJ^0{bYbNX1L zcx6MxgW7Ga*F>?dAD|~*0D{?iXZ~tY%O0B^ixY+&*|!$F%Q*;7|4+GNwXu5cKCCCy zLSfy&p)-U&`&R|kRFIluAFcyY#6ClSF2XM7s`X`z;`W+_EA-BEbyi5M(d5aj)deZj zI=%3icC_MJ<%zKcP;AmytI8suu9@h8gbZ^RSrq46!~nG4;oxv3+~Tmq#$GCAI2)zG z3mImX7H(^u{nO;9i}#&!T**nSl~C8)&r@ZLgg>=($)3zKq_i^)jLH!^c&kB&gQgc3 za}Ojwze%~Gi8w8>*>#&i_MsQ|pg?JhIP6ToGyh~WnT4c=tGN!ZWP1RG5Q%BSlB5V~ z7TAxL6(d1s+hdF_mETO$=DuAn?)^I7>}?pCck|sxaT?%>1i_`DHaxGirX;g;H$-4? zHFB_eMi+5!V$f3I|K@i=i*2`kzJl$XJA<_@)4R9V zKSl1wJsdFAdD(WIbZskOY5UG+_gw@+02kYU-sshqyu!1ckA)hR74dHz#8UZ7^Hhv~ zgX&zysr7wRO9w5_MHQK&A1$@GZ=U+hqK|AO&~@>^M4|C-aUD(QT$FmipjWr>+R6y; z+4|bJ=~RC^XnZ=!tx&TesAet};`Q284)Aj4>6?DK4s4@s`1WFjMEhWU{Fe~=FgCUq zZ2$gJ&D?{h5>a~Lrq6D1%WUVWYNwRl*RGyE#kXyieA{MUQ=q&M|HVqNnr&Tp9T5CL z#1FQGVk%mParP49{!}o$iuak=0Fs2s!NWYs9H*ueFmVz45U6d?fIqWTkHu(>i!a?C z%~ADwJ>ZPnvTT(-gI6(~CAkV_YyxF zq`k%PL#m=cG|ib|<<<@{&D$OyBPpcB8jC_Z^{!s-K?vJAj%bY6)h_iLf#&h_&tbAr zeh7hj2wKl6zd66K@slAM;BJWO#+)^i!2 zBKgD--SUNp%S3mgq!~f6_fHFZH>wUhUSZ@l%|mJNq7e4?q*D7+@{zq}cjd(s(?Tz_ zDwA57O#2-YhhlX$$m}YArRz0vZi|n8s!9TN&P`jkH{2SSb#ZsANym|O$a!cRTp=@8 z5}2en7IxUetD{BiW-$t7#$XVC2I?G4BF{%<#(-1^_M{k0KsUVjORv`e zBVh&*1>&J*;E0Owi<>-HD76>z>UOxktTwVcwf$z#M{#=i!i@sLKs&P*3%1T5ru;hN zS&6X?h;jYf&bZQHIy!qaLa(!z^WH0yJ;j%aR_*lyuAs$Nsz5-n@1;jgK~bN7lO~aP z7}N1aP!GuT6hY{ZmX~h`CRP8by)wiLUBe+>1@qD^4027NQZBgR#xMoaacpZpl6zk?M^XTD!BU42Ao4L@QwWk7%3l9GiJA zM6JlLYM+oHGIX@EW2CI&+c*#)htNps@cQfo%d;^vmEN!sI+a`0f`G?ZID|^U*?`N- zMf$qq?XH9r>F*uNtnbSW-tlv2_uB*M{Z}+owdXesvb1Udfi7$Vt*|#*fihga*PQnm zcc8!M?kGQwC5McA-XHoXFC6i)i+BL=MxuZ>60@qA1I+bvf3<<4`dsf_NvaBo$jx_H z^PN(A1MR}<9maqg+(uH}-lWHwi?VcnM4Lt9>Kmwa_gm!lq3>+ViR&o)q_7x##j5F0nxge z***ETCq_hX7$;w2W?GL~{_8}gbE{i{qqbW-A<|YtOf)p@jMDZ!5{q~l1b{07rtt9( zQwUs1$Sw#J!`vv^I4#=%BvevFyg@)#Olu2(s*1~ zRJLfpw}{R0c_vYRK)`kHBpL~OX;S0q=i$7%$2z^Fa1j_Nl@`qLY(6F3g54gjs!%=q zr0UYR8)%|2j!F-1DiBU|HORHw+~sknbZ2fQy~@9Uz&IUDQXdJCQ5(*&sHTYHhR^1t zyM8R2QpEM)B#lkEfD2nyAAa4xuN#ux+Z*CSzy1B)XCOW0n`8KkPx$(Fb8T^xJC8|M z@u_)FB(j&e$M|k6>}c-FZ9U#ti^kfQ{H6NjJ(}+<l+Ju<1{^1;Ca#Tf74Tu@DO+TvaEg!tf{t&j=-$q{7kxCJpYgTHn~Pv`8>llEQr;#%w3%7&e$g_K z|1f)5rK3`=u!@o3H#l}BPK6v!f5aY~24;Ldx`B!=o&MDOh$YDmJnS=cXmuw7g=m*# z4EeN#MSWd4V!VI&{?m~gf+MAP5L7v2W9QQz!NHlzVwwW0-cXUyx6xO1#GW+=ND*+V z<6uRc7+OmvC*}T9U!v|WthKS!0zZkln2QjL)m`+%d#n{3DoPAo7+(w$*3o7sbvu8| z%XzkiF?eb!37Rk$!nn8%fE^w_;zw_i0!iWNZAP}C;}WZ5=HrY_&ri@+Lx8}cK3K$I z_`)f99D%4ns+)*29UKceQ@%8qI$p4h{@`GGz63FYO!BZ8G!u_Fh6;KY-Z|OTh zB38&$n_yp-uUpP+fKVdQS1V2bbhoOZdROS$Nb~xH>(M2)JOyn}30cnV0c(|i2y}rT z0)3>!&=cd4_<=T|?io}Ew?8bbYkK$~Klv-V#dRiAX9=$FOc~!%Z^6Ncku*(67@LBU zi@Ba+H341+TN3lZkNI(%Xz>V3avu-IZVFqOFIybj@Nk0ec1u~bu_=<(1ySWxT=SRc z2Mr|Pm+@yToL|k=%gL3}+NH1|Lw>cTPPsHS6yeU`{8A4_u^r;-p5Jy82pKFm_!#{d zjdCumtMovk!)eBRuN1drN_ggW)PdH*%0&i0#9E>fCGha9-YI8c`Pz?pS=4Qz>4YcqQ+227}Xgxe*iCN~13a1Oo-FLz50ZkX;vQLm7) z97%j<0_-S$ne2u*Dmxcr?V{e6Vx%G=LmSbxafLT;$Tjt)hqIg97J={5u-~c%nvzE% zp#8ODe~r?LWWF9$A^~g!& zP1vq(j!K7yz8~tu4TIHfL%$SxPM`d$m|B(~4bI-_6ioyV+(GkmA=1c#(DBLUbU`3b z`34EuS9s*kycXDX`0!#+OYK;k;!|R)dEm2P*O{bkH}Q}+lTJ&$Er?)$%d7)! zFwIb6lGlrUaeX74pdcL<;kI&6-JTS(>IS30m!aj`Hl*yDj@8Fk*Q|McsEGusA3fO9 z3)u_8KSdirr-aY7Bk~Jxh3!Kak%`V%z|$#i^P0{H$*#}Z^U7{5X7WG3Em%o5!ruiBCOo?(Ne#}f)VGse^l4D-mEEjmZJ9avF9h}vUlD@{VwAO9{fsu_LHIn zeu=Lun{VYq4{QRI#=npI@7Mj?;raJ4|NV~s1xx;Wclq|@UsLsW3;eHT{*O=j|FI() zwDjyollzrBFABxf2fl;+{e4r=H3;gho`OS1`@&zY1d;N62Lw2S!F-CcG z>v%s}`&aVe_m@#Wy!0Ue9y#XW{J!n`QGF+hefStqpMK7-5%1By8(XxX;P(%v=cL15 z!1J^JWp}tP-|h|fW>8{m`UnRNdAB+2us$o-mn|KjJQ#;^{|un>f)=y;m$dBq3+D~SpV&2JTI1DjL{evHfYY1_GPI7wDBooD)N><^1 z`qHJ`Ve1=4MBe? zzP5V3Z=VvxKz>_mf}MM20D?2WG_UO~PDNKY2a3QlFe|VhrQ5mZxz3Xy1(6-|)h(ty zaf$yR{%;!oFL^XXeYH+E?}+hJiq-QZTW;W@Vpb4X#9@&wu1MHMa6!>1!#`$cF%868 zL(Ll=3B^zAT&iSzJN9IcxG=h!>uR4A%8ABN z<=PQ(t;lu$E+kH=6&lmG~rmBUm{Gwq6R&TjP8Ff%Na(P4O=gfXY zjmD9MTLkp@SPME9!o3giESvWz>UE`-elVz7?9=v{yGp4uKlLo&t3*+&S(E{#Jsrk4 z^Y;f+147k?NeZ%Oti9pTJJ!nVK1e}@QxpXR1m9x@MI znB|SU6af;xpq9Z_CC*u8=AF1cL^GUspIg5CrAMU$|A*Cg72xivDms>yoeEXrpZd{y zi}CpWk!M~5x`ZU>z9dNd006?o$a@(Zt`m5l4VaQMVax1e-fKh4iWK@$D33{vgbz$H zQr$04@e!I4AOVte@8M1$Y;t?Sq;Trj>Fn>7LwGq6-) zKAXF`xG00HHyj8J=d=YDZ}esGb?ABr_4q+$Y+<5|!*>~Y+{#^tC z!xqa=gJj@hcpVSGSIwAkTk7&0>ERsPAwJ0u=uH+{g>-O#+ z-)hds}?2ObGYl~;Slula&Zw>6}CvqBHUn}f-rll)pcwV=q1 z6LR{icwlq+faF)uZ2zEE`5IO>6Vk6xv?6(Vr4#&})|88ENjzjUTGZhDdD~PpXKk>& zUI1cY7igH~Gw;HLQqn>$t^jo4S*)QfHXZimeXs_KVV!pc%hG#VYRLfUsuSlhb$ZnS zjSpRYd%aduf4-G~b-T%Q9&p zFg9yZX8e_>%fciKcQJgmm|s+2S?wNcQ6w}=6a1ewNmC`d?~G#lwAtBm9WqFmgd}{) z9lx7$T*!34xv8!T_Da`!JOjn=4FZg`wg&*HvHmx~j?>GbVJV-@H1DX;;61vwS30#M6o3EQ@S5&T@6?C(GqH1nh8>N(4<6gl zeVZ^hHAt?x;npRF`O&>GD}xsHe%HbWJ_8j^8lsPoXz4l1H~32}d3P)HJGRWKD4Q3_ ziMtEm)iTl9cxO4+FE~Z{B?Au_y@nG0<=gD)?79t8vIT%+JuP?@S@GS#cH+#cgoIfq z3)_45b%6ySAvrsdrBb>M`EZVVy-P+1UUxay1Vrg7JH6^i``=jr8ykc^uc!uASG`@p zHyt&5c=X0{X^0Kyf|v{i5pXBV?l)`6+9$iCs`u)gR(zRDiO~o`TLK7$4S7oWXA68V zcWc*aS6&-fS^Jnxy&Q+Yj_|yZRkDR#y~dN>knpvZkTZ;HHbY4FT8=b=Pl47l^7$!$ z=x9l2NPc~eSYbTHy-SEwOjGZEXzG>@zZAtX(|u1=6C)~8QY$4aAwK%sB=`vK-(Yc_6c=MM4=ga)_54=oLrJ(tqNiyCI=orOmW#poyr^V%+~ z!hr7ye723+A+JQv(ptRNkPpe&Ic|6V%g+M^?Eue_De=%IG#Ye?j*t=v0P5O6_4e$e z6pJ|?J!UQ9A1GJS0Rec`tm(>AeJrI08(qatmU3DOz>&~l zB)n~Z`0Bq9mVv(L@zR5-E{XO95^17hvPpKqGKqUiuy^-S|@#w}B*ua#Z84OX-mSV|fT55N!)^ea%Hi z45pU#2k`T)jIW3*>^?6mgOV3Jai}U>(wizDVhYR{;@<+qf2a0(1X@HEY2+LjoAT&M{cLjes*xHBv zYD+-J1y@2_t)u(roF4=qjQ*&+n_sLs2vi3pt{aM&kxIclXM|n3jLoN0(CXwEKXTTv zOdigVCu1t~wTm~CAH+W)byxm6Ay(SBiNyYPd}DQ>*uJt2((v91_m-85*KBgez_cru z^2B%{7F?xmIQ)9CL--R{fk5%##u29P%wCuBc=hIveuvQbZvb%tQS6)&PNw76&U=2U zFJ$WG)dUcCi%h~TXTI>ESTSg+4X1qnV?zUgba@vZ5FO9`{Z`AB zC-=tzRoK4>7lKSAX-}H~tn^mv?C$h`I@e?T=D-wX$G*O=bL7xmOaJTxOSuh~Yvyun z=r6`iH5KXbNSDNy_EzGaOHDGI5gT1bmhTTN2u-h~#1w5b6L=%KG&?|q-K&c4Z3J?G zehyGG7cKO*Rj~%ZFRZXNW*Y?mwRs`pkZ-#Lypr-DY%%j~ZZaTUiscn{5Yw&NrvNw7 zE)$-8i%4k&Yl*3O2J!b~GFS6*(vC4&JT{q|Xa?H`&6N7ssddW97rvc61R!Ni7OJ7T zHk+V;WdA^)wdiv@oDKupKY?Cf`$~(N0_o1#wGUfcHy8sd2@X@Z)dcqjmz3b-n46X< zo?TaGJF+kI0kC%>2tV44S)Szde{*Do-NKYaPPX-@iHTzl#dlOM+{cT%RQTk#^+nOJ zL!Y>!r4KCtz;`cb>Ec{BWtxpB0ntX`68pC1t6GP1XiIusqyMk0a(9aJUR=?QLH2;qaZT3GG zI=h!)BUw53=@J`Oeqy=BS&EMY4BgE~tfCaU#jXk|_qTy14fCJ(#y|r`aQF}&6ke`W zVS2`gmZt_^V^zS1m}@Ldd<*x0sqQj+ZN8kgF{fHQ7N9lw5tmJMH+U!?Iu~!^9M6vg z=Bf>0_N>K~v@og>02rJQLhu=dA1HBERsl+0|IG8v(J%a!G8Kap!0JeSqQz zMSFRb)~%htlbwSAF_-dT%olEXH0AKM=xxO`MMa=oS+=oZ?DC8tYo-%!_8(-TJXr^Yu5xd311gF z{jt>E5AeIzng9Ff(5eWkYzOAXL6sfd_M4%4~PhCiZsv8fNITG)0)FlpZjq?Kb0g_q|U!J zS-Ih-L1(!UskY2-AG;WAc zE9|RIkP}%q@Fm|P13gfhg!evxXtp8GVcODAj$oTw&pL?T^tYp~X|ReUScRuQW{$_5 znO^hf1uahYk4f%j%X+b?&+OLK1{|Zm>Es_eJ7s;j>Vhf^45*BYm-s3JIKVRuZ5|AM z7&bQ(+)`2jtY|unq;E+DA1B>O9UcdmmnJ0Xez(6fs+XIj$XY`i@PuOZxHq%nn>-w* z2m7}0+XCh)fy`O&+c*kskktvS=o%)K&3=0mrT8bwtNb>;!g5dxqvq_p=9&C?wcq{( ze5MmTz4GP9-MzVc`rCF*^=VX8XQ;f1B1E$8jSM4n$nKStH_70jAIv9m%iU|()e7LhA z*05doJ%05PClaq){y$XOer>NxclPbbZ09%6WnSd-?n7+vHK{ViXEt2LQ1K$sxZz-O z$ns4VAG|)+_7MNQi+T)N^je@PntsX{Yb2y!={E!5Wr4oB?-K0q7;SA8wFs*m`x3{m zW_}=mWd2sq;cKOu-yggNkjdHaxoN>Sh7z~c^N|$%i(nw{ayi)xNHhhL-jb68=QYP` zsso?D9nBlN!8dYJd?R-mZ~&}2uj+0+ChSulQ?ELt4(KpSB6R%^9)(M{h`#b3L&FW8 zgmd53nmmKEmtU*V(_t0vOVAyCcD~sg#XJDFoz;s-q08q+Y^WBxC%Wf1ZGDT(*)Nh_To)E+35ZsF{ zxmJJ$-()X?P-R9d12{LW=u8t0S+7dpx);vT`Lh&L7)z>mq;K$pLFHa&XzX>#EFiV@wmWbY~)&0I7=yIuH!=3sF@J@M@x|&^3!T z?3mxL+EacT@P@y`S17Y^$$>>4;H%J2< z4HUYGIW1&bk6?)-a3+yh8+7FnvW%Kt5N%a`yezIG-&^)N^;lb-QOkOV8r6uI?S_P( z3YiOVq|K#`P4_|PQcHVMp)UPeGS&l2Ry=iJKv_60S}k%i`T;K;oUSJfMmy>+{oTM3eYSF#oLw;`mc!JIY%R) zD*byu&@J&F5=G+&i6Y<(jW#_!gz)`*K>mWQJA)1YuEM$L;qE#sjpJkhhl0wQ>axak z!qkBL%tSsrw;whIG`JsD7`-n;*kh=gXn3 zAiAx5AsI06n6>*?qc(1SOb7njPOhR6y%cJ0H(#S4>%H#`iBGv;J-7Qp4IW}QyP~Mj znd;nI&0R&!l8I4Uimkpz6S+Gi#du-sMOXYk=PPQd^83^pa)0TF+q5~krg5|D&S@Y+ z7jrgmZk{F4EaG6TLOP+uk<_y@jgpaHC0%kRwW&Yjqh@>GWPi2#Xp!~Y>r_|(HGOSj z^(g@09u4utT+KRccp#QPN#@{AVC;!ly&5@8fSEw5U97*rEA7@= zaDrD_I31}c8J*@w9cQlS146+&F4OVF+irR)Zxep+UyZcBnb9b&YM9~Chz(~K5 zijj!8cEI5QS|-Q#G`o6@`&9W7_-v}{>?vw~Ml?gv{qG|leq6hQmwtp&CmhvYRLOg> z0L^LzovjX=`~*-FF6YbTT@)y8OC+(1TzwC4xbkA*Ld9GFG}-BnV)OkeAFGamV$*s?UJw}GbOUA8p0 zp_VM~we*kTfzqDee^{M8Nzq#zWF&u`i+J*?V@=J2#U)u@i?F5WD@CWb*h){x`>Ya- zeaZrZ;CX2g<^UI0Y10UAP2;4770<6m#+vC)b$95+s*^+1d27r>hx)kz4>v)14c-+C zsNzg!Oi3zm7A|kNl7h_uKbeHwSQ6reO9zlCpQ=*pMeI)YSuL9?w-~A1X=+_t3U}rK zaR<{Eg60yZf%Z4hDrs@!7t8F_v00xsnS~*bzQFx;flbSh$MfYE- zOTXW|&d;rX+|kOfbFTC2JyPYYb{k+_p(3aHMmQT}N_=mSp5ovDojj01R7(Yj9%cXA zMt%6ple%_+<20YyLCY`~>Yzg_e03f-Z9E5+~CNPOYDE9RdS7%vX&yPmRt=Ext- zykQZyG`r%XhwdfE)6=8|((%Zv_e}~3f#k?+!)s60g967porx0(m9pjZ&=V!EN#5ln z;XH3bkn;em3qxNd%WPme@wfD!tB6lq{&DWNOjoKfmEttRmX236+CHL;pQ@q_` zrg%+UQjleZzlVZ_U9fxOyYxpp_BP21j{Jc#yxW#xRhx3(3*l>~w+MHHeD$z_UD=s* z>H6~a){+w;wAt7u$y8j5@C>0v1_`H0_^%#FZ2ZG~;Y#42nctp7r^sO_3MG`|j#FJr zn}2%GKVJK%&F5vmY}0kb29jarxC_RR+}p|ZzA{%gR%Z0^sfZ85wtXn_oql>;2?M>soTUwfZ@=DNLZ`2INWxSn2#>pqqM5&rO9FE)ly zD}+AkDEzrmOi9){>s^%w>{BJhf*hu3hdd;w9WY-^tqAZ`2qXt%D(xKZD&NU=XL3mu z(Z$Y01x-Rt@cn^$k!DTG#Qn8yCo=G28y9YvPeh>!7^=aZc^86f(;KU6!iux=`Jl%k zcyb$akGR(HO9JVN7Pj`6&$u;D%x5ZAiMMX7&E7R&168-Z#r`CuS=HU!fQsc@b9Zt72bJ&)@NCEUTC6u(3!;e`~v;X zFWV-^&SYPJJvbivhwQ#zuFJXK9uT%Y1V0uGsWBQTk%|j&?K+{;ifP)F5msgGTuFoX z+aBG*I_@7|EZYjQhF^oq8$j-Yc*U2&srO>~DqbXO4NfN7-GPAJ^TKCJ1Lp_jLF|%i zeO#>l5+aqvx^YXGbZW3l!-DeA-!-TdrAB_||@QRkhV2l!xEkG>&NmXn2N%wTa z#34!=lzM-|nhJsR6?P{!DI}}7y)iox73pah71<|1;LOW(?(w)JAo41|?Idj}ewO5A zxe+{NA}M}<{))F*#nfo6!OKoX#&vOeh);6Y{FQs++qlb$`84d@K=G5F*%%4k(;$>> zddcwCk1s@IJ++@*Iz0y2fkuM4r}Lu|p9mQWD;`TsNccwS6Ot<3tXZ9KAE+v+=pm>x$ z+(x>3;f>fij2Q5d@6HTl$J@e(;{$rxmkgn2x(DVtA$dD9qeZ(6v7B=KsaBh5VTUT# z-363)#~!m!=kx+g)g1$9y@^e34q;TUZjo(ENEuO`Zs+t#&Lpy_XU6wZ6lm0tV|^>j zwbwu&Ouz;uuZa1Doj1xgyF2nBfrMWG##9H)b|gC3{dvDC;4!tgwA9weJ^9sY)%l;T z`?(|FZD;Rg-4^B0<%GtREyBEpj?yRj#zW7YIdxaj(QEahFJ^{y9 z9Ua|;ey|-#4|2NGAn4tfr^!9R9lAu?LS}z=_)3*1w)1ObU}sHJ;c)21+7kmt-!J0m zL**oVhkM1!Vcq*Tx!;O=xBCL8+2B4!kF+~KsKd9yVF%z81UF%}MUmg&A6*_Wu)w*x z3!uu-n!Bx^=Y0xzZ*n&dkDO71%ymV_%|4Xet^vETusg{7%4#U|G6BEL@ zjBHZLI(zU-_R`STA|mZ$w~g9I2l+cScSs7=ljEj@Gnr}VxE=ILl{+D|GeS>OkhS4U zH!5#v#Ao3KVvVr#9&ZjyO3GR+^m-EwL}Mtf|4){oR+`T!I+olws$&Ys<0Q zb5}Ie6V+oe%`iJg`~4a9Aiu`5uPe?&qP4z);d^&WD4$PDA(!n7ANrIuzt$MHn?{#M zMdBA{Z(6Zf+w;J7UaeFw+{s?*Dub=QqWyX( zp2>X*?XV}+8@VmzgR>tp(HVDIQtG+UI`_T>X+s>>+T|y)sp!BRA~WPVc+zEqN@H=u z9qQ@f0VbLqJ>6d_Z6OI1QFUihi(&ERI;d|@-cx>U?G%fj_#QKYlCa>u}YnEwmU5vM0! z-J4^&HI2y-OK1(|>Nb^d`tGEeP`fYm^HDY`(z{DD_m-Z#m4911@TS8$K7{>kw3_ze zd^k$#LW{-6Tt!;OTKT~KjM8r?qDiV!9k3OBMfA8gVeK`B>a!+cfAW6d#I~RH%5R&M zrQi8K-mAA^Td{KR$fOscb9-}62SRe`)Y;!NhMRL!_vmTeYqOdsu+;L*Gv7>T({0`2 zr{lZdo>8%$@Rb^G1h^pIiosy&ma$-9Xt8EVNr6L&%g^_qFZp0mR_;PUg>SK@7A zz!jlV+8xGB3_j4SDV=MhtBNwu_QT*6^iXt1aXKz7;)eBR*T7+)I6vy!mE@Z z>%iU?16wm8B}1BO^#gg;B<0{FPI-8hwUCW^k3S|i<`u>$;#OtFE!9y4)Uak$e?RN6 zAB$?(_HGb%^^r&ITK{>h5Q6T8GzI?crf{?dr4KD5kmP>7$Rrb<^I>I#Ab~~(R^<76 z^sCubZBnT`mJDAxyzCZ@vFrPy4&h*?%%MY~b7>+5*I*rV$^s`i_9uCA6J4 z_8WoaS8K1*xYQfzopRZr`vRkz02S*A{^HlDAl_J!FyaYV{G$r#V zmo37_IY;X1voTkVIJdjTN@7m-Y%UhQR#G3D3Et^-4~p1XkPgYo>!}x0>Xy7L|H967 zaJNSnCi2km^vjfcNIPy zRloRp-2M|f-FI4dR`KCbxo^2$li&V4VU}O#F~_Ii-L#X_dyPgbeAg&*A>x|(Qg^NX zruBblnP>i+ylYxnR)uO0(27R=Sqs^Zlg$(|lN&l_q(?G*pq({|0SCJY7`XBS0dKbt z+FtUI%Wm`csDH%XDg!FSA+}>(#AJn8--`y1)jnF>l2E0pxHaEV%pGni3ElYmI?hOW z{&pvUwKt`mDyn3&!FYNUm$hj(?T#PQ#bqeMx^Yh~(-=768!rQrOzu%AdueRHl;oJo zut!sN6QL^d?-Wclj0hI=&@3!UHds3#J3Ap0N$|-pEFNPa=gLbTfm5eeJv%L_Mp~EN z2Z(fUN|E^(9{lKDNbyn5pA#wh3YZ5UglVBkc?Z-7AS>7ILUTL5s+-ibdMWXG(45CJ zWBwSL@Q3q9ylVi->N`)=^lI~_X4%KZFi^r(ZYhTZ+BIboX)y_d6$#cos+4;VQ#LRI zS?71Nd`rHz-v91*Py0rVoIE$ARw%bU;rW!Cg9xg~eeLrmed55HNt+4zZfE#lfyG?N z?i?^YBO^=2pLnXi4P608$-g^~F~($_ zFB+ks#a7{0bQXhxRjvf2>J0n76T^zBP8?z-&+X)L4d8ku`f29Nz2CjcN#0BIUm$-E z00BjN^Y^(k>5V0>*~8e>6ha)DFn>B($t3}5mIa3l2Q2Sa+m*8=<8n0o#z+`-ODLFz z2wz{=r|ytR1S=)Sugr9}oH6g{%2W66t=00zJq4H_yCGqWdi5L> z??|ORTxrLe@h7x{)xr~-g08UuL-V^`Uu@Phy5;UZRkM?RIVY3dwtq|eSl9^9&Np(` zTz9=yo5jyBWz$wC@DUxyoZC-7#!F!3H&o^N=ydn3s&!p`yT&RebFv8iBFVoszZ(^r zd;42^qjCDu{pOOyxf;dY^F8@?^#L87km>KGT>XYYtqb1Efjj`dI4TKaXQ!vor;7Ur z39IQd^Cd7P&z?IrmDAms)k8s?UaVBCx?_&2K)Uq&oULX-wJ`Nz89$r`7Iq{nR!d7Y z7?sBM?7Zv#-RO~9MG)ksd*0;q+o;%E5YLYHpYxLAo*Fj1JT%9e;QDx+uaK`|Owy9F z-=F2+1B7?qT|K1Kg|Fr$i2Xn8y=PEUUE4n@7OY^08<47kC{02QO-1PhDT;JdAcU$A zLJ3twRHWAc0coLw5^6%T(n1YA6qOP}NJ5YFvw7d=KXdds-_DmaXYP-g$)xPP_O-6- z*VbLNP>BhFI7rq=^}W7kEqw3x6x%<(ha9>PJ4N5-^HaSMp}Gy{MpF)u))2{+j~pE- zy+x5@#*)7FZ_(>t%$^giqDjd>bpkf#PyAZUnQyQS$GeQAvN>NC74 zoUa@@L}g?QIYfJ(q=6Nxf1PK8bDoEkI;a=8iyV?$$@v+r_-*JP%C_c4kzkN{h zdtS(*n_n`j4mmZD*HleKY%!tsYg?L}JEtPZkcvIy+mq#!AGC}5oysI>a_A^yPR7a* zd+aE>*KG4N*X5N?cnMBH?R=Nq&b(~F^04}P&c8iFfG6x{PL+j_tc-LSd{>vQw;y$2aVDO(6A89UJds()Dm#~^( zUXs@2h+=c{wdkQ%FMfWgb5CyEhA|W0-4r`SIHtyy=$k**Pcy$VC{!UK$O7v28=rL* zu~`o?)!u`GDNcBo&8HErSAWM+lrg-0^}4-6M`pe)h0?COp0&w)h>bz^*c<@gF%SBI z&T|N@ru(j%Ps}(I*YwpwAp?c9&Hv|}KyQ!TZJ@Gjx;uF&P>e0$-6dwWnB1YJRM`?y z?$^ChD&~$`qldraRFuB%Mvm24Jr%Y55KOZkBP}1-SS&Tklej`K@8qcm1tHUazR4 z)EU?DB`$L54*0oAkm!Solz`I516$VzJ!-;-=2jKwf4y9-AMe^+Ul5QVe-?>!0n(TO zmtD|ySf#<7vt+q(fikg5zqM3>1#CqjEXVY%Fd;3Q@GXp-Emh@l8l*cFyf7s9VZCT$ zq7SC=_f6V9?#KyZ3v1Y(KgT@0KZu}fCLHm}zDG6Zo69ZS>IZpEDuHHx%Nx%}DmOh^ z*RK~;h&?{9=MNSr@JoDq(~#()>H~B*T>*JBKp8n^zTcPW?jZF;z8^<6V0|!3$;BL$ zbdD9j%{xa{(qbdb#$l45Pg;mx9Fh4rGI~KSog%yD&zUG8x*0mB=S`uRBpEg98K(`* zSN9taOAYssaU(+$+3(AG&PFGv6iQFZ6V2v-0ZseX8qZ!#$d~V^#j%>rK`Z!OTTPI+ znUY$5E>L@LSr=qjZbEzgUhXzbNDqWDhd@o^lTV3V~tJi9PM}%=lZ`s=Db6rk! zYL(MW5O__*+ft`WlI=FwxSHLk8jF&i(qUeh*i0{j<1&FN3(3F16j%|;3y!7d8xsfJ zQ)L#7tT6hQgcK{Fo(8cTCmXzXPT^h-ZNsgc04qoxCc~7|-CHt%-}=i6>nSf}?l%-cyIwq>0L!ZZBeKPP2CQs|+)mPZ?<5zAIgn(j2_Y1Jpl$;e!rm z`|FRCEdF}Ox4c=wB*-Lwq4h$Z>raXyp>HRcai@q9XGn==Z;x0<5ip0||In#`; zSHNO)Pxj#E9Pfyqpe7`MD~vUL=Ho_zl3bIK$3ZmD&O6@ODH;8ypBx*CY*U1iE6W@9>6y8|BGtnaVA^T@}lK%Y5ZCZ&{cjLBG7+j78 zG+q;NJny31p;}d0bT>ZL?#|E>iU=7jpJ~&>i-l%u zhRh4*wq?ZH&;XlkpR*`whv0w!X%-OLyaMqBAqUSFIeEH@f~$Pw|2UA(qS9dA97FVk zJFRrXQGOEnjfiYfX`+X|O1Z@7y)Md~q)K7^gPfMI-utJCB1-%XzJPH9B-B zbw+LSDLsG1%T`9kd%KD5&%+}#wdE7Rs0`-yZUSqx@<+I1tm?KXS>u zlKQy3e4H!%^qiXwRc#Z=Y}9nZ9}4E|PIJju*A}()$qq)bm#C!s3?rm++$csXe+0aUW<@*<$zH(};$jSoL_-w2iXsEK~Vbevl#mtuUFpSw`z`FaD$wYXS+tHgX^NGi-ZaM1xvyzwdwqf;L!-l>sNDLsZK$< zi?@)O)WgQf{V)x$-ol`&iNcQ5Dr&CZ&fvNia5XdYRE@3t;IOOS6AuR)5xd&-I;Wv; z;WyM~7KC(dkiEQ#yI%~7rwbkS;Mqimx>fz;%1^K1exQYbP6J|QZA5bk@^bxOpuJXN zbC(s~etMYGu9t`L8ZqC*EVFQh2B{1KcR}ePr{u$7xRj?~%2l+gl_i)suGU2P>V`|( zK_`#k-J7;uSo0cICN$l?U_@>tCeIrvpNq5C9$?dei5zrL&3c-3jLen-gG%!H*86tI zZOjbGx{(5RevjrYY+>qfq=&tvt7+g#FeR zOR65j2-Ovi5V-ZoNu3Lz%P6%9qSrX{rjMB~X7hOAHYpIj^B28Jic8RXl@J-=5 z0i!-^?LCbX|4=F~b?(t$T}6CRaooPKdv|Bs24o+Dhf;W;&`<# z&XcnF#BjrRfSc!`I6N@07sU?my=7?+B8C`$0akV8t@4Nr8%;DbNLaLIZS&9%Gf<(kDbk!tl~f@WQ-(~Dc~gl6 zwxZz`1YJmMn$HGof)jmL`&NcrMUN0xR}#z9P0CG%fS&gF23POY-%Vqma12lcsV2aJ zsNni%hsO%q5fN>WIe+q!vQI1Dmfqf34?{{^U!K+Z_-N6T`Kg?`%PgSG(U13E0xYLc zfF8OiTYtqbZYv!-4pc>n@x;fHpAR`qNIdB(GfzROc)j!?bt;iQH))(m31g7!y@8ei z$@_ErQPuY@j9n9$1teQ|KQF|>PR9+}0B!KLf?vovudM4fc{?C8iCWgET&G{6{x?s7 zIShHwT;kLFS?=pir_VBGE*c0wi*2fGquElPMnYC>R{*e+@giX4K;XN6Wqzfpv&hcljbZ%dhk`XvEzng3Lk;n^1LF9{wQQ!_j+n3z;$A5hM zi{t*ysU>Qgl#+5ymr#P-VU6UVIhBQm>!jW`e2y_j4dUe7MqTzM#4QVgFF};WGX2*R zr(0vk*-iTVQU;;$_p{h;6?e=y;hI5>`x73;jV4kMLkp;Ku0WOJ1PHOhmUG`ul6qgu zCpXBMvAD--diMlBJPOLY$6)Cu8G8L>0W~B=N%?OKTooi+D7#niW{qLH@An=I$0}SF z^n&L~0G&kjm!X&WQ5DXvxL0dj3Vq_MFhfmE(Ioti2H9kt3g`x0=;H7upxJ8eo;_;F zXgi)l=`w$vq2N^wSPDF|jW{pJTeZ)>t?p(@m?!j!g42IhWA#sl&d1zX1Bi?)+fEm5~bjDynf&fc+klpY~&5=t4r!wr?U*0{Spy(LAZ< za_V4rx~Ia?c^NJ*{S>`q0JKhl1U{fqoz~3jSj6_ha^U<2H=T$uZZ!bevj`_nQPVPe zt?^O`J9LKPTqKiy+ zpafrijkF&{-n{~kIz{*sw-|MutPjwx=IIR3vjlWjvsu2^Hw}l`gS7M%)qp-n5462t z){p>{(;|AIzxv}wLsf5A;~73FBCnT@SgL#S|H%SKn7}MDtkQ26h^mnWU9v}U3EGU;;eiU;7IQdmaHg!}W?bVdj@3#ECNfKU+m*LGoNChoUD0Lp| zIzX!@cdLNuabf7W)XoWXJ)w3)zPK2o_$f5(? zqWn%ZKe^L5Y&UO@XD(D-#x$rQVGWFaYmhj3pm);z>6qJ#kitT;V)vb+uV>|}+Tm^e z7tyKNui8!k7p92R`?S)nNcZOpa`<)>xcB%f(v`-b#yh28@F}cwkeN839WF7$ck$i~ zy58Mc_Xpt+0y6w@mj$$AVNN{|Z=Ev5p1KOAG=FT5RuUu=6m!l>p-WYz z#5HuY*WZQamO#?sO4hZA!h5vIpypGE_W1sPL{Xpan5z*#X*uihx-c38s&5)SCSIbX zV?A+f?<)Cncz3IO<92I^GS9EO;m}skH@>xa$)8R&+*cv^&)LpuMn3)Ha{dP{$re5X z{0v+nB;nY8W&$_?|h7=qJ#!<~?F{kK^lY;*@{nmdz z>!#$sD2)I9L5IM81=hbXn*EmoPWwuxvr-YGIpjP4b#sDm5l$X1t)4lW5RBrNjrv=Y zu>TyqPQ3+?K!*w0>vMHy{+^P6+q-h`cCqUQ%hi7`!M~T_-&OGMgYa)H__rMXyCeMn zX;Z8s`V#=r@dEGHZ{M^B#h_thof83DS1ks`1gQ{m+M%PTbpV~`n`na|uzRTU<-ePh zTc>~)W50!Y)r5j94;Ff%uLy+y{jO)MfE>MghI|%~Q{^C1qw6STEi~Q>;zswaFR2YT zr2WjvZ!JmY)XI9XVZX4b8mD6M(3?c@`M63uorh!y#(jJFgLR!QmTc|+lTyo8_U5lv z>z2ups7n_|s#j7L)UL%{jn~Ssq+AIYE5wJXzY($^Y@FujXnVZ7s-}blYbQhOCT&{m zNM*Uy={C{0H8Je6TE+kTg9Wwa$i(l_w@YtC+Ac)>`4!JJj$KI=8t6jfXBJ~GR}03; z-P6hccAdji0MOYnzxOS^2sXR^p>cQpsP>#}>p0f*j&t3w3TgV5W0RJIEn;=}X59>3 zhh7Q@VJ_E9dNge9PWmnFMBkX1>&+4Fe|XDdhH%yc1sUJ$*y>QjQuzXYTf+t_-CEZj zn|hJ7;i{$vmym68Tk9v4s{xxmT~27cn#hgDJ+m(G4J;u8EHqlvy7pItx_js#_bRsn z$Pgn27L%n%Bv%{QDdasak0eEDlYSnZiRX{fnbhFQ`&GIm*StQ^p3}Fe81Dq?D5yqF z7xg`t^I7K?NCddI7r>M$VG(WW95=5yiAO4dq&~oln0u0pe{`!P0@y{z89^J0OCx`L zdkE;ktrf0t!kl`k{#WSh}!L$ry^Y7c1bY*n1SXyKFxHJ1?zG8q3+sc9@Y1FOW%!e zg%f*CxThrpI0(FHZ-D%jeCLl@w976;Kdq+y$ImJI4G|liCTrel;9xW`EvtC?pu^_7 zeSxeJ72QZ5D|<5*(9(I1pMUhQR?XEKN7_t&V$&$04Y!u&!j}gO`lIYHO}$uWa@lws z;IQzp>vn(+=+ZCU2IeMUp5Qs?AabARPT1lr6bDjaXXu5-suCGWlv=teoqcaPLJNS8 zT>j%_uxSj^@ZXrv z_KCydwiqUe(QtWrQ$*8l<8AIUv&J!sOEOkh_p3%S_CL$3P}Dj_ResvSXSUL;)u&z zM|AeR9P?_VpLxaQO|uq*3>a|K7O^A)^^L*W<~Yv<4Bv?#&qGsU#yR^+jZfAs#GO2( zb``oms|9KtOF`eFkr;t--%HOeSUl`McCcChK_TN=q}zN zKVufJh`~qi?^ySIrE}Vp#{_)eS=N<^doo-19rXjvU9#y_Iww<-S~5^*x^mC)q%UBW z+nCrs_^|wvVuhKcD@)spKMU>|v5@yi2-OT#;p0>6ZE?}@pY4l)BjTnTp+G&-r4t8W zW49jyyttb=?#H(naC8}bUSY|>DH4G0FQ6S(h=7#Giz?sFwujew%c);vn1^x8C7&#h zoNN7c5tEd&hWUJCr2{y8MG%0H`mNMCN*f%#H%dvn3Cg}*u|`+lYJbcQyR+Ua4{kN0 znl_1L`H8lzTfU>>r;{r<~e!lQ@B+RdQ$2z5JB4I|;_Q_OIa1@N?JEcNdjyADSI z8t7OvhnM*h<(*s%#6r>bTxeg( zb|I=t=nGw(BB))M+*O_$-uUV-r`tu;E+sZbO6z>Hn4;A+n){k?t9tijz)eVc9uFwF zbUVK$3&f@PL*Y?x=`bqOMqe2ez^FR%1|f7^=Cr%y((>0vF<~4cw%V^mjxu0t8 zl{bmUTl;8Nh9-OWx~-|;E90o;_&)sTh3xb8qYI|?pA*akscZUqntU-B%y)11uv9vk zZIWU#gbS29bSx8~2CXp$OoTLYLTF&;b4PEJx_Kc2f`H7F= zr)0ZKZJxhD{sz2QG5B`V8itpX30i0XX;4K7){`CV$@2EaIP=tXD(f<`Lv=F)=o?dX zn?nxfp30K$d<^=3-74)6VB>RrloN`F|45Ph+#6yBe(gNDyEDt6j3M49zG{TW#O$h+ zk}A_uCM$mzxpr7Iz;OK>9yRZ^X2%_X_cgbMpkAv3*Jm!UG1 zipNBLX}{0#jc=z0ohBGaj!5>aH451JlK1l(o3^YI z%2wSLN^Tb|@8W~v?<<~y{3Q66+f;p+L0cP#+JS3IunM0<$pIcVUry?D-7Ez3VXZxY zh2fZD6|)iZj@MBsFW~nQxlb@F6Q3EV;hqJF@H~{Ee?1Ug@H!EoGJ_~4r6lQGt(gY? zhLC-Q=w)7X+H+OxifUc?({N@rniNOEP=TlIp+2?!$Jz4>Wv9oG;f`4*$yzMfvrjSY zgk)>%)|}c;CTY5Ge);Rv%s8zrK(dx+FYqj#>LU3VT&K^slfHG*e_+1KsQ9)L6#J5& zb0VyBJeKn>bTi-5mOSxP+Hc}9m;B_F4rSd~e@d=1?VZPzJ!R(pFEtiyU)YpO3U!L1 z*G^?zjVSb7E6OyaHwjv&o1KVGrO&FBDPA8JzEmM71-02RUrO?UnTm&|Lq9v594(heJLnsi@8TV@gT#4d9u9s zf9*F_JkWgALz-=X4NK8oeICqAz~4IumQgDFlmILB^8I2-*AHvx>Ao2>SUdHW(d8ym z)JbW5R{C^4`_Khajnj`y*ZKWd>);EiCWjUP?HxK%K$e*+lA>r|t8`%PZl*=%&jP`Q zG3wuD*dNnJ;()9x5H=q+Tm+qb94D*Gp|t4qkqbV(L$dZf0vJXk#E@ilE(TX{-l3P~ zGG(rKf2x=Z7?iO)J`BkE>Znm^dM%6o(n$K}n6VC(S>-jS2XegSE2F0qfL`&CO_vG< zV%0f0!I{E7>Q`=VI#LUZ&_myppJsTC8$i#wJYs66?F>KuZ2v_=KdENIN@8F0tZ^^7 z_1#GM$Q0a$k*)s_xw>hH-4Zv~xT$+5C}a*gU{X*`b+^MD^Sa})q89?u zjBw)l;ytnV$Zw6uEqb8q$pbx8d8^9OrrnA~4q-rKtPzF04fvPbnFBwpYr4b<%5_{b zS3%~+L5g$PnXc_AEcArzF6f}E6RDk0UK~~dC^SdPp5q!Hj~8X5KM9FX1e@Jyaaf)i zn#4Di2uJ&N=_#7YJZaX8Z$#r%L;wqjfm-}fxc@2{% zapGC(#%U+`l%Hff#&nxqSN5ryE4YuA%l2x4rVmsH7Z`&bTR(R#zN!lS zLnf~{M;%RvMv(Op#`SbMSMufOq~(}Vmj^Gc2^TA`zvrzj$Z5%>EB5dvC_1%*5IDW9+n;w8dv~084UeWf z9SzzUEAQlEK(t4_d#;&%P!N4aCcHQkXaN3a#qE3}aqnYK4)eZm&<1p!y)tQ_`d+}6 zU;l3y9b2;W^>Q}oW-h3dGhYumGI-xhB!4SSB{=Ah!J6eT#C)HabvPz7^;2xL%J0i} zwXr4;dTrC&FKcB559)%cPK(BG^hi7f7=CP1;DAdDjxEh@pKF^hO5~T@c=uK=KV~p^ zB$MRb3YfIU>t8vToS5!*uDD<`?DBT-483-Zb)*U@$pT`iD|D8lgg{|Oe~8C9`e=pT zQA;ZnrpnP5nWy!Rz)Z@EkgV=MT|ViaUpSqKH4KW86)cLVLD!#8KXEz&X7RbDNEQ*) zIF6vl4Kdh^|^~(bJ7RXIFPcf-}kh8m7V%QXk z@5bvo;FvQ399_&PdO?=5_=WjwB6K|n6CY5zr!c;>S`~F_uuw?G(6Ug&*y^f0kgmT< zOx!kw;=9Cfh)2Zt7DP?<)X@;W4 zG7t}Y1Ca?)={5FLWv3TV=690RsC?6<#M#i(qcOujIJjn5h~E}Iw8iLKrC$rM(YnBv zp|WM7QI~C!j;d(hrZG3p!kF8)+gve~{*C&=qQ+ufkZx3xs5I}96{tKf;nKVK?M<80 zDKNBCT;T{1NZ`RHnum+6k&||AKgM&|7{O+!VlG=4UmqoraTAsjz+Eopqt1GY7iu&4 z+}R8U(=bq~lEO=e1yxF^An8K#3)8$Whl3XXK{YuRs*F+wFH%f;i}v@VpIF{i{wH+r z$9+5N`wp+8Yse}?uv zNugY^v02Y(2*JtT=(v1({4${L_^23T9S}|$f-ogJixdE_$AKLlL+n2rdY*aen6teH ziGu#EE9dV)9jH$n82Dz(scxE*`U~5AEQ+@v$?_-&O<(S;QH_}pR?h)6sIJz)pk4B= z(|m4{Ia%_%m;Ds6P%-{w8KpmMlS?)_L-vM z^wGIvP>ps?4eF$|^Vn$=leRO>J?!T@dX335V4>i7(3(BA=6%i)?j6DYZ^t3~$|DOP zNTLnNA6O)5zr7ORdP6OMmy$AF*0dcjnYROYzNM77D`25PZ`Bd@!)oSso6{@q)3U}s z#QP{>9bu$XRD*(4yH}%vWVQudbRHqXmSArv^?8?V(f5Mhh;1spCiA*-Q$Ws})qpEy zeR1(cx+jEO3>cln`S{CynrP>kpWpc+IC%{fy?3c)zJLgn{EzkWEPmaSDp|GoZHo|( zh z@MG}VJrP?3sdI=#0eK}UL3<%1V1@Z&_r~OjaZ($Q?RL7Ia!o^v03rE0e}f8NdJnJf8Y-5BG&7FA#Hm5UUA$VE4E0 z|IJA&>OZ_xPhL4MMRGpq9-ShP#Y%xoObUf{duzV&JLIsbyIF`qk99fwg_@69HXzXW zE>e|59W<-OWw_St`jFnd76+dckE-8Wf}d{)eU_C_-`(x@dNI1@hV@IUM}N9C1fInm z)YQ}b=-sF+jBP35n$fhbO{UGuFCm$eZTy2ubNktC49CVZO}WphD z*6Z#qo_yvTKtXOAO{DL=sCUGO42X((`R)u9#toc0FmN>w*+=UF5r-IJ88GKC@DcKx zq!ztfAME3EV@Pk-?Unx81K%70;6fq@E^Dl3ZR-%H3*BWMY$DrO)Dzep`h=B%QN4m_ zJ|76aJORv!o&5=!x_~5eW|LZ03F>ZW+6F0sNVJ+U+d~e%9+{AE(%0P5qJ5thsL4XB%C-Zj-81BuBR+ZO0xR1V)eV5JHvhrcm~c6{X& zGKihK^bkM#G+X?zmv-SZIk#oK8Xw|Fr!i< zxWdP=vCwk459yS>?TGmXPa>7;NFJ{O={!EqP73;waw;8l&6tBX2^e)6%@Tq8!VVJ^ zAD>SN9ZgaYiRR(euHm znw%!qqaqEz<4OY*c{?vfB+x0%EXLi)YlRtPWe@`_%e!tVPc{*>!9qKP6+JcR+?*94 z_rDw8YtL|p9QL96=kX51E^pZBeqZ4Nq$;F)(Lo2WJ-J&rI?LF1KCUOL4*g9(^jVwu zVM3g-VgU76%DoRk*$7Yh`?)zAzdDu6y0VGN4-1wP0*WtRf$HgO&PJOkDEa?>ZBo?x z)pbbC?JhrwOV8kpsKN|d$1p$6@^|0iwivio@ z`c{YW8sh53*gj(*7nZ+d>_DLd&Qbl32raGoTMw7A@OhCao+12|p-*}>NY|?0@PSF< zr7L`@Vl|V@m&msx#+q6H!8gK;Rb44OmO}CJ8f}kElfw@UazdK*hD?iM`@Qt?9eU)V zyZTC8y=$gOzycwDU3@ygt&|*pwOsG!We;pEdoA`L0HAebh!MP6mf4ZVZ1l2uzlXQE1ThSH=}69fTo?9BLQI(``~T0(pV2$92tjx;T!J?0H`n#H(?1I|Io+-sy^@zLdS z(>v6ub*Fym+YkNs;;q!Y#%?JY^;swoDI8UJvm`My7qYbY@44)IlH!4i5$DtUn4^yu zc9Cva1AO&!u#KIn%pre72#{+peGn5EFkJsd(;6 zLb+_T*tCyr=q@N$`jFF24F>lOqwnwD?2SzWd*xt#lu~^2&kppY?kAmTT`MSW(M@)ry58r*BvD_?4?bIYf9D<)%Y zfHEjQotNpU)pVF=Jx!JTpypQL(QTf6R%ZyxN~(LiwiY>L^Ym@ugP8@aXM3_ukO;rn zp5^tFXOnrH$%CC@e_?Kh9KWgWThnXUb)(;e=ibVIOXIABMdKvVr&1Gfz(V3{7a$Q5 zl7U^ZGNcNc(e9W(MzFo(6q^)DN)ZCZ=~oVBzG1;u4n_(M6s~ez<&^RS$IF&jJfP#I zg!eO%2!L~0?>Dk1r>q>v!&&85)|izvcjB)?Oa{&EdMp#$ZD^akO5P)Dz~&eAu8dS0 zYE`~Br+2t!0*-dP?f{FCjef!ZnjAGUcQ7cX78AlJ!dJGQ-DtL|8ba_j;GDjJFleTFcUn0NfRImeq{m#3FVFuq%1cmDE|8etv;~ z0B>au9+3VjVslJa|0uQ$o!T*zY&p%&r{vX_zplq4=L+h4?{Ron)p!#q)p5Nj>3}j< z;P@_Zm8;n46v~+|$uO*Stl?Dt$iSNOgV@vu{A|F0?jJG8FASPMcXkH(K-75NS?CSDNpLx=z@-^n(#mLw`&|PxRuLce zfiuVZj1IsZu=7whlL-8tI^>|&-a`N_h7Gz6L(+v{ztKwIAxOn+?&YSz3q{ynM)iqKKXTR?4e9!y1fyP|M(?GGc<%;g75i7(68wg@U0v6^o+9<~ z*RrZAgG$E+krLK_U8mpYUjyfd9RfKP=ti?-n;mw2WitCYE^dObnIBq(=}Nf)a9)op zZy;7Qs;*?hUaykZc@ehp2q8vd&vzI6U{@})quhC%B85jd3Uf;-J^S&Vkb%GdT|Yw< zV2dTh35pV;#_bt<Ir+4uuGAz;^J zZzpFzPh{oI@sz7M4}q&{3Dc0Dm-gPAi+LZ9#e2VeA4oK~G$MKBM_yJb1xr@KM@0Ri z_G3O;BHF^};DDcp^JT6f@?bkmKn*fZ8}+cxNAJ@z-sr|hOFP|t?u(ASbSs>gzi&3% zdtaqQAc|4ZPKRYDgipbxo+L=%bKLc<|FvUOqj9y(0h~e`ud(r4=epjZw$V4@qIqSo z#0hiSad4yzFjB$8I5IN;z|J+ioLcFb7R8DNxyPR3Rn#^e8Qj?PO}}^2mb;H=!##2D zsDi?$;_{*iwmLd9ReSF)ahm>lpcg;CcA?E7P^F*iokCU4*ojE`?7 zhmsq~^m55nPMjb0!qLC$>|RDNYn$rt+1E1s{#xq`Y7Y2Bl|aq<94VEe*rj=k(t|d86wNFqM z9;@!OERGoQrjRwKPn^F?HMyK)X?7j5V3O9&o8V;;rM;2%EAK(#sW>%nFlx!cD7;Dw zJnHMJ7p`Z7DbOxI0zYnkR)XV@0}uon3j~6~G8ZjQ<^x$Lvpn6{T$7gG@jieWH{t2^ z+($Fe9FZarGz}p_^ujrc7wBVg)vR%q8g>g`xvJmO>W8A3yymhA6NfTts?rvFlIYCu z6-?KUB&A>js+Vi(00@nf@Pu4UG*7N6P903Hv}nNQ0x1A3xh83zU4=GEX9{uO1>p|k5xZim{G zeF%z}Ujh>|U-bgY#9mN83rAzZ{!gCU={rd&3!3Lj%r-U5}f) zc0`|M0jW8ijarH#Sju?EiT9V9;UN`iNxOg{HTL=Q7EUMhj|7kxX7@+wWNq8a_O3+b zy6&iFSI>&uIgNq<4Ie_Mz1Czm_!2nbT2uL?t%gX;NI%rye{-trBVdv>?kBm`I4>^T zjo^rrQK<5sRNapiVJk+@{R72E!7ZD9o?eOg8GJ$1^1igaw0glI+#K1mY3a10W8fRW zA<_zo=b~BY%j}V#G{9ti0R@a=)2+ssGmk47VbnkE4A9i(vVa!5O`dT3=GCuLs+()c zxyexj(yiaVO-+{{YO(u4=r@R^!0&8r)Z{D^67G^vV%rC~9h}WXL#II@H_=I+3&n4w zT_Ak{@KUs4M!k|XVnI>Zs)avJUQI=41e+Uw)>XQ_iZd_SO!s(77&2pF>(Qwc^a2zS zW#ByCswh!qQ}wWNDO$Xu<3dE0YSLD^WgCP)D|89|)nmeQrM1qtOPfYw%q#VK>$~%<7mC_$cY``9+Ti`9p^B!(|aHx*Do;F>AC0x_S?)yPsb)>W2 zwbC0}@Nn2logBOh0N71}vbvxNnJa$#bit)AwNbl#NMy@Qdxu2QIC5PWc*p1`Ami1Y z8x(mQ^}L(sj%OEV0x)j?o5P8+~9)dclR6Q{run_s3@eg z{`P{hJetPsz-o=_2*mCrduh&u%WB#Kw5-SNEQPurxO7Jl1Pl`DAJ^X(@-PAd?mjG2 z5|+2(5ZSvCKXJ-McmCx%-Bfeh0K4<4f|B2t|4yuX=64v*-R9-c zJn)#9K0Bsd=Q=qUqQB+MFS<&nnUA}+>yc0ssJ@*bB|HI*lqTGXV?YMJHPEoHlz zdeR;?w#&%%vC4;ab-UwU&&aOjt zy2y1pkleNNiQTOawIgxe>JEZ7I2F|-q6tw-*lBbNr8#0cq81 zrz`-8zbvl?{_4_!m(AM8{#Vj^g-2@szp?B6}}_N7{HiSpVD5 zBw#7vcu(P=!%u_P%-iRC4Cj~+3n&vw5Sa9PZ>VU%?dRTT<`EW9IqRQ@W(deMIC!LK zWnurnt%&a1r6QgYPOFv1snsw(Saj?%u7kY7p!B!LTEzCIb$j{myWaEpmS-=t@XhJJ zf5Z>M#bf4Yqk>0Jz`5f$GW~%h>S^?8)mY%n>*TBUFNA)jE@{uS8#dUO&)(9OECdqJ1> zlGgh)3S7>bRlJOo-D)f!xu>0VPb*H`O!xZRw{|Bt?3vg-+T98V?WAj4ac8vG_UfB< z8mGo!vlDgs>0NLeGV`|=xhow+CambiuVi#HSI}xfjY`F;(VYo#LP3G6|MMZBQ<39YER{3Rc zS2vPyV(iZ}tlc9l7mNM3+sO2|8yr@WRy|v%YOGfr@~orhaBE@7Hr`|#>DIE_HP6TK zh-Wv-`+wLd;HEQ-*nu4N5d8FVmRsH{Hp@v*2ylpG8!rn|r})wC(*r?a-|KoAu{Y$q4gYI?#SsWZ!5;7N0>$Wkh{5E*iz$yV_H z^8UZCq=M#yYP+jgNxGkFABnz^Z0(6>R5UnaXB^x})fSu1UtPGpru`T@g>;&?+Ou+l zz?Q0sC+CNph>=zuk%Qh|C5I4kM;uO;ymtQnu6)NUF{%3RSYbVi4-W0xy z329}U0eu0IE1?y$rTU$*L$nXAx6BW4u6Hieowzn{Ip(94uAVeYoQ@1R*SpTa?@*-v zxvoMX#I#KEQrc1mj((^`T}|Pd{8f(}-RSirjo)^!9s7FN{Dj@hxrGbSnN>$}=a_lI z+$tYKyU(T)G);d#Eokf%qFTk8`gWX6y1o&w8u+QL2c44`s3qus=WLTML-kR2eOho@ zovd`+%G30(p7Xc=06JcQ7F!AIrv#SlV6y@tpKiRwIwjs37%nxH!9FUeht;22_id5s zXt}wetLA2yIV7JZSl-lUrCM`>eT%`R)(C9;9%Hyz-rFr$-QdT#t;$r0nwou!Y#5q0 z)zA0&TB-A4IXB$Dz&^y2#FSjAt8RZ@w$O7Q)cYpIzWCuAHZyW#DrC9Jn;*4MY20L1 z(pmK37c&>u(K?mJU%P%mH`Lx5CvdPsY(87V^<+VEj3lD8x7#Eb!Bb4!=t#HUCsu8p z@`n1Ph*9u?+*usXYx-kj{Jt#|qy<|E)Kx01brnkp_DR(gbG{_%`}KnS2L<2U@V(al zhP$6No1&@HpCM#Flh-zelqE=U;`|hyN$FFf%hqSF(09K3Hcc_mC-sfV{VE|Od`@uJ z2HG(?EK;TAWvYVe-lFk89?H9F}*3AEEXlsTxI}P~R%DbqFSZ?`&vYz8JZ? zpMEHqRn<(`CoiSNC=$&J+tj zYo0+WJ+g6q!6|n{E5A@N=^uQ%4zWV2g%-;%8-xLO9-KY(nK|K_loN5D8&o;u{UGM? z!UtIB>z#sDw*h^A4yvg2<=Y{v_N!yOb`VD8MIPIZ>5)5d26d{o=Z7gVu~9K&sS*Bk zo;74nPC#ue`e<^$U8w4?6$QC`icr%7;E)R+pHTyW5sE%ozbj7k383$;=E_L>(RM z8ay2HJh1KvZr-pLvHoMNO;y94V9kOk+m?Ri+Ptwk9$4K!tqZ)_E0o+5Ne$H@2dFRa zOZ>l1w_6;_P~CPiyFx;-Q(o3?@aXN0p=xaRg3m!o3(Inf|!3c*HZ8M!W-3D@PT zB!^L#m)TomqC#R^Gy`&7E_5zhuLek2&sgmi^sMY5xW1Dv(38{-gU(%w=t(#aeL20| zBcrz)Y7%N^y{n37ExWV4c~{6Lfp2(XY*ODptYV+X`FGYMayHHIP>VRXd+hp_@M9&< zO2c+M4)ZtX)yMi#({trS7~>l$KxJ7T^Z3)E*U`D&TL^tCx2Vj%qMJkih)8=Hw4&*c zznZV|c1I69`*d!$3)I+~?ahLpF+d)pCMjPnpD?K zw=pApx-$7y!A7LR=f$*J;+GUQ)d09-G zgY_dAy37f>)%roSsWfbBg&L{Uk_Z^Sk0rerf%cAAeb&tJ{XrGT)mN*rpVe1mKDM{e z37{RBb|MNKsA*nV9^t;On=MYuGc|=Yw8lUp2`LDI_%^IxGvC}YKdy2-A@~%bdhy=s zFLVoI6=JvDURLy$;WYMiSo1J=S1=}6IzI6igOu zgKwyEL2J9BQS+RF)4W0?#@3S(7QDHkwfCtQ*3_nRHx*Qlz8HaMcQ1fwjG6hHWnVNY1qQbKGW!ek<0dFbxPkfeMQxTx1r|+ z+WB_jX>j1u+P1T`uXx9li^>mw#6k4M%WCqG%^8o^mXc7=Rq{y1Y?d_-68+i{ zzr}n4Z?f7xw3T?rDY9pN3gxWA-(geZ!U?m6Emm_O^#awbV~gJI@LMZ<2Ulc2L2JNc z1fd6+^lh2$!{x1t%sInsZ>;0|Xf2ltoM%OiMs@qzQ<)QRv#cG`HMYHP{s0H=?J2Od z+TPn9SNkY#fS4iL)s(C$p4NnD5xe_VK)u&K2Z}FkxVXMm%&nhh45)tgZ0N1%o+~XA zC$kjm9U>y5X`)cL|-?o-~an>Xk`WE zx7P=1{{!#Ds3YAZYQEr(w&NC*7|l`EN~x zgcBLsO>JJ|C^)IDixQz#F$n4j64?L9xxO5TA3j`9R3bY}$9T6tk6HCs3L&=@S+R3I zGeIJ@45n;^n^zb0hh5(^QLlt-RZ#a>T6N2#Ng%NUg00$kdwKH(*B~{l0IJO^$u`&z zHjYVa9j~pGvZ`Ld%c0^1QZ^uKMOj{|-Q>y08K&N(me$S^ z&PteosAb+xO7y&@3Dtpuc-8Hfc2LLHW{IHJQha{i$OaK?WJATBh%dDaMy2Q>pWn{T zKjTNpN5L7k0g?SW1_*lHG{cXvE{L3tq#~L=C z9re7${6LtrYpUOB!tQNe2^BL^vPggSUjNq3i$<^E{-B=izd+=1xS!^HWAdD@{fxDbLZUl)2yubgk6+0p3|I2Gw0*51ah~DW>mPd9-AJ6WXByfxr&L43Ba=) zx2?zRbzLPALGOay>npfcP3~;;)=%#rRfANFx(#cJk&3&>hc6hnL(ueo246>L6TDz` z4{>UP5GdLfwzVSS^DHJo^vPnN8E<{xxaT+~V{39&-}*+5Z6`U4;+9RjVwHCW%6tEq zICxTIVrU4ChhFkRI4b3g;_inisJsNp^9XF&5ZkP#U{1#(x!K4TpNby|%yycs7yO-8 z;hmTE>1t~Q_|wE=1Z3^wy3XWmqUyo39;YxH$1$b~HBKsGi+@xQ$ZtWXBI}(DtBSU4 znu2wka(zrbDJyI3>Vt2e#2sE!bD&JfH0`xpD)u{yY~M05*(}pNmJg?@>@_qoXRZeX zOB1$K4u5T}#(8Qs$Lp1OGL~8@ zrH-vu6^t%xv{S+9+mbgF?ODqv`x^`I-z}^oJbM705=kGQZJXr{S5~Ihn(uCDpl7Jd z@UFn^{mjW52GK{FAS!s?r%T<@KCbr53Z_?YxgmU68V+5G zKMiGb3CS~&9AQ3}nViq|GWjXJUGx=fmXfV9Xs@B$H6d>Sv!&?mmx6zu+9c&n?f)gF zJSDYt(cCs1!KA8(yb-wlt-|w|I>-0=f=o+UZNk>#mKpQZ5=YK*(ZbSoy40Hj$FOfJ zUGH@@;UN!`6rQ|AeF#cnD(J#J@ftbOrWqkFaBb}mo;m%F$E0?dnz1`O)YT}h+@NDG z-+)4#BgyfId#6Ulwv-h9=vFMUSoo9+j)sd44z{(|dnf0_#U^^f{9a#F*U+o+$|KqE zmm^MU9TQ8ru}F_lL3(n@>Amiw6;ZgI)kKjc=Dr#*&Z3>2>DB~uYv*dqx|HjjwMSjE z*ghtKh4*8n>MGc#-&7S;GF3OqDG*Jq=@r}ll6eKbZ3HF#5-P{!v4PG-A%S%4!%5HS zm9?6MK6H$V?>DUK2ij|Au)>~GW3exn{V!RfoxO0FsF=)P%KLtcL`3@?z9ScqpG~5s zZJD8?ym|s*KkU$mIc@wKoyvQ1JjCgzWosZoJM(;2moVKTXLV8J;AI(Gc1qZN;tRe} z6pJF~Rij+63TnI+8!AR}cey~?CHbU=+7KIvWBwlFgEiQY01p=KItf``P^A%C9(0ZKJB{UddXX$a}{iy$3;_9jxUh>$K znf&6XoOd4VY2Enab0LoKRaFzk`Cpg*VL8w0>WBdr6X}v-4P3$WmtuSa?pJAZyl~?J zz+Tz&wJJQ4SeJG4<{L$>yQzs{;c=-8f~_RYOOfwHuExhc##ia|XL|yhcSnn)?t@NX z0#vjnSY%X)tm&tA1y`{u5q>cHjZ)ITSU3hZSh;a;_yW_V4)Av}SL(*PcwaB^-3+1| zok>MQx%Fa>=-QVH`mf_MA6I&*RPcj(xXnDsI=0;}+|SnH;^eT_h8=9dImJIDtsIa) zxxkukVbA?kioJ&<7Ozs0kv|b*W(|ct_EeSa7vRnu_YQyWn?wj1E!U;VL5^phz9X_1 z(FR&Vw;Z~l3Qp*z=jBNe&vGgtB*SdinyLA%xyHh!Z(o2O*M2i{Tm&xa^jq`m2iQxe zSY2jt%W#mRa|B_u3A&Lraqn)ul@Viagb zi+5I}zV&g`7Pc88ZLB~8n%kZayUQO?-q~h)9e1p@X>x7`Fcjv6Bt74lA!q(!ZQO#r zw1L%y4;=Y;p@tDiNm_P#eM)vHPa7IlFt^>;N$-0%yAq#x<#XpAeVet*k$q*ww@e73 z8uIBKqZxk}A$n1TR=DbD%9P1^8}q!nkfW!s^@+i2DV>7O!ss{iZ)hsNg0VTi->0r& z?XHB{$j-*Qz`}BqH8kNh10>q!!v$G!T7b(y6@JDXZm7A{`!SA3hCkrg9~Dx-abbny zlf|-6eX;@g#*e?DfO4X@uBiQtqoJOEJy>1D2@mThQ zbZz-RjCNrUN|PToKEu6l9gV|SS@DWO8U_n??rGhGnon0!mqtpwyqOjlA=C4}Q0=hy z<#b}^f*qM7Gv&s8rHp+}r^9@PX|>bwP9*B}JeaSrFiMiVD+u}t`u-+GYY7r-^_PmT zY>2TrouGGnD&!2o$tndZyk^9%0KQVg(LD|5$?@704SJv1~|$?+vzQn zb}I}7$m3L<`#&Gk5vQirwvJxp^ek{R*^Xog4OCJuL|)y?84(c=;__^n16GTH83zQh z3`$U#AWVrHx|DuH9$wB8D8X!5OViOn&vTvXN8lGqQ_v=j@8G_c#vj~X$BN+%v?{fQ z9)UB=KQi5e0x{8Lxe`1GqjZoAJups$ zuNQM6O(OE5^g!*hVL@}Le6%I9`m4RM1$!FWiR=JvZ=5_R9$n91QGr~gZ=m1|Ie+c! zI6Z{=TJu7C&(K-XWKVpA0Ck+-*Og5&)zksm=HJCG*c5e7YyYm*F-hfaZ(ml}j9iJ^ zYMRn&ZK6&R&7eM2cLViz6>W#SFLGS{NV#Ds}6iby;-xdx8uA1*b6Kv%3xCs*e)mLg>E;bMFv-&+Q# zj-xO>7*gT|A=F|Ds6exZ&KP!-voAMg_ve~Oj}*DK>YQ1G&iZT{(@NcH0_$;y6$Q^N z5-yKy9=;@aJ$f%SiIb1BjX#uhFZ5@Mz1*Kpy&!UO#HiLI_3V|VR>I-HkM6#=Kjj#c zW}5Qdn(-8>>8D&vR{7z|g#K2A&B|1-n=!#x0FPRsi|hyQI%{9#=;{)IQWew9^$DY>VBZw*TY4fjCom#|~2_NKAG z@NbNGi*F1w-dvRJ6HQCu0B2p$kV*9u$4Z7Se_uGj@>6Mxv{L}8#Re;n z=vHSA$ria=0!W>UI?S4l7u6{Jq;y(!lc%(*+XKO)ZFwOMfNZ%B)s+t*Br$~zNw8Ai)_hc!V64>7M^ z-r74&M*9^XYA5(N{Hpi6W{Ky?n6vC~r*%qiD)No|5|eHUUxuLF-x zU-hez_c~2lpKDPH>b8QuQ>LAyq2UG^8TW3joepMxR-(aPap$Q7^}8|iOV~{WBGwIa z7>c&b_qH>HxVGyN`FfZKJ!)>S`y4&n`K_OspKhug7BhrGGojL+_;31*=%RmU~6E1cRvprZ-pL|z4}?T)UyE4(oe@o#G!n{3q53)^(SbNMSc^?`GV zs#l4U4P5`{wmbTlX!0}l5B%O;N5P3p9Fd%9meqO!3cG#GhFYS{WQa9B$etV-xSw}M zzPDW}a$G0oRsGcMb}l4d&W0*^9UH8K*b_{8;Mfo1A#Bp zMc;b{AEbA-au^zBEU8ufJmx7I4yVy<#y~J7OXB zbb}_>>E0 z4UQ7?y6ISn`q7~lr;gL<<0&7)bcoNJtPIoD?|`dRoF-#rC0qgIiZu>yc{jZ;3M6Wx zjMN|qeemmX%*2;jtyyN*>E(pT-f}m*`&lsf%{^W*>Gx~aJewXt6itbdtr!^AckovT zbwcwjM?}8>P0+IN3N0EO27v9@7n9GJy8~njuP$^69^MWpf zYSF?=p2jgAhV3z+pYrw36?Ll(a;f>S=P8G8>rVTGic5Dx$U9>L(;)llsuJPa7k8fl zyVqlsaK=(FIOx7qUDT`m_{>(B&6kR?B^eL2-E%&Ex+bcq_;Zf{AO)o@ADIR1G1%E9 zSNmYzQ|FfjoBS7#*q=n%U#jj`f=+qh7mUwi&I<&Ubk^pkWyjhtS&dGoR=L3(L3U8R zCGFVHi7RBmk*!Hcchy;qc1I5ey1C|5P$e4yg4i}S%W;??e7%(B<|VHn))K&1;u`MD1%;0I_xAP?d>80 znwcd;9uT-`tQD?x@#7kE#P2X3%%B&|HFmCcEeqAK{Hr5liRy37SmMY|S#vX(RFt2a z5lT{mc^sGppz;gt)xJv($R;;lIb5X%W- zeLP5Efzw3~JIwH_=3Qbz2@t&Vy@=`zwi6>YKd(q&^?LhU&3r#vxiD=0qWMx7UU8ap zCfeA=QS}g*^9@&sQb$0IDUT9z@Frqph*I*fjLAwST|8~aVKZew$j&dMJqp8QHy*B<=JHK zjXc@{m#=-?woJ6Kk}QOZ2%4lfvwP1UZAl-(SKzxi8MS^m^;_WEqJo}2w;hFlipkFQ z?9ko`OTRbIxZtQECanA$u?eG~b0~gsKXDjmYySaZ>23s)>-|8xPTAsTyZNznR0yV8uoNXNCJjTWOF>nl(831TZ{BA ze7i-{vW!<1-W_krX|*-Wn=|jCIXwjR_~3Rfg=~4pKNnZbaBkoHa|;*PID+2y6c6%5f<@e`2drs0#Fae#)0^pBIlcSB0{#M z2(7>E+zg)|z*(4Y7%Vy<@7@-bj<-uH3Cv(ybK^!K4Tt1rJ)^P1e+`ne9%|jU^_UN7zg&>P8pG z-Pk3-ahUNSr;sE_xN&|q8-I>RbOE1y@dCBt$KncA)i2#fb*N&fs{OI?lhPwAec_kZ zujEg+9S-lnHu zDP4G71UTo&+}o&WaAZBrX0oaSn|W_wLlG>S?wh<$46!VHK$;+dw9Z>{<4HZbe0w$g5>&Z%`_Y~A}5>}rcz79WFD8=a* zEoe)GRmv6H6Q@T6?fVWCYYty1`F_isbupV~`$P0RciO^4b_dIubpccSxzYJN%@=R5 z{gEsREJkh7>ph79?&_SNiJ8b?P+~Kn1&#f$2KN znalSW^tJs}pe&{y+ZsBpY0TzP+FK<|H(<+4G=}znJo-%j^kxY&{6=6!-h?`|KYHA<<*ieMiwQS`Uxp8Y zx`&Qy?I&U*V@^Jp>cR|F+Y#>yBr1JE#+A=|ipd&V0yWLPozu7Qp-I&z>O6xI{!y8m zDsx^T6O3nqvVlLVU+$L})+8Y?HV-JG?*|~`yfU~=Vs%-?$B+G|O{L|Zj=G^dt!(wh zc(YtCSS}`_9?QyIw;CQH8o7O4GVh}ay=IYN`Sci=*#c48QoanX9sZ)rBT~tCqe$A|FsXopAV$a_>;h%(+a1lGw@!Q+w%y zIp3?6v5@3eUmcOJH;Tcq$ixhG=1zRBEQLkHayEaPmRynZh>5sjjHA~klzQ)Iyh?Mn zbO>%Qik<`n{>w>D0NxFaf5_y3{i)!+6T@wwC8~=;`Y7|gDije%>Cu$~IZ^IIiV(N8 z=&Z%#CJ^-MQ}yurj(L8im?(XV^S2&v3*bmYp{|e(ggwf#n;OCDl4Z4pdwGd!ED(F7 zIt?-c66gs4XSjQOok93g1;S-Z1K=&eb?)5Eb%F0gv1-^wE8{4X;$Cr6CUVH+?K|ZD z5O;F#h}~yU4ViXCyYu#^Tyx;Xk3-5KD@Mml`)=|{l++zuStO`(KXnH^vbDB_xC;^= zGawV3yW?`HFEsT$;$o$3i_x#O#iWfprCVHB^YPLq(Rq5RhknF~xJ_9WlNkT71iqcJ zXVsbsFsA{FiSC!(pmW_}f@sn* z+^{@sRaOF+o27LEZ|bw_?u9A~e8yC_qv&V1`tTP0mr2;km-~2X9CnctyQ~a%Tsj0A z7mcR38gK>rZV~TxfRZKew<;U|-s8+Eu2!uiQ)-Omkx#RYk+GI+1)T#$vo~-xPUszo zJ;0>7qCFG|58DfdbCK)P7BNNpY_Tr988Hj-F7M-WD}KS5no*XR%aToP%cF@ZG6dz9 zEH!Q~>)vUZZ`QM~T}lmnH2cnTga3~MA9F%j%%GFnvZhp`c<~V(Rvo_cbz?~W{hz>*Ukdk!Sf3I=ehQvJ-7G@E zq2FDl`F;>KzU*eQ$k?JH%iAGo{X^x3pL1MUUAh8;bjVpnB4_z4N4}}myWBI*fA4WR zMa=ElBPYsN!H~CvTl}XBB=`8117kUhhqjh7WQD5-dLDG1Wm{dcNNLdtWeSDN{orTF zJy(oedAyMKC>6}3o8UgV!ajN@TT`s^S08!mJMZ$+PHg+@nBVQ;3HQtM?*RWBxq9p_ zwe@j^)H|cdIy@U?PMKIVr(TpJ6bjqf2?2JL!GgP`n-h%sLdp;~}TlQA!EFE(jtx^TP`}9BHAL)Vp_cMs&iz%d?oq@QD6gdNMOLBkw(< zFb(w;x?dSGZOzZ*pa<3b{Fs($n1Oc}GX1N%0$f@$Yk8czMkzxCV_44%37aA!B@H^! zinX4pz}YZ-i}?Cx%UH^7Jm#L)xNb~dtK}k!q7;*5#W%K7XxAAprN0^DL@q_@jpi?k z(VtMlELknGB8@aos_0RE#ACS~%xd(!7~&^QpIu0kCU5nIAa6m`j5fv~3U6#pf*uP@ z%bLD;epdqY>5-T;M}G-ibeG_1pdbq_`>vr8vDU(LbWv1=7=Z}j;yd%-UG28@^Yw0n z#<@>=KI&eu&vGN!O#MWif3+$!(FXu11+DCtLI?GeO3t7}H$ldaz6tAaH{A2#e+{;aXz+82C=RbLdh0kyQJCx zLk2z$5`xBxIK^MO7v%D65jztM94-6HkgERZD!27QHbajKN&(5x)$%3ZPKi~2m9*&)T3?hr+wsi;H3v%QmcMt| z<|whD_zC`b#zDgD*oYs;)q0(9-m-gogeRgXk+L?O$$2SYG|UWPv>jb&9I^H`D`*o} z;_8}OC}^I6Cwh?eDvw54rJT^&|KS9enBzNg9*Wl3Z-lYXi-LOfn+P}8rz@WG=F?UoAFEZFgGWBSPgMI`CPPHg8;NEP zl~^^V-;{-{8@XUMVku1$5=o?wrrPz5;4KaIQ{;WfG5|zq8#y4wwQ?rVmu?OUrnA|s z0$WW(m4<)A5Dnc;_u*>|h*P`K8m+Yx9|zvZ{IbO}MAHdvS0KodANaoOOc`5G3;kmw zKF#}jFxzrV!Ga487Fr92$BgBYWtCtAx>m8O*>ooVCfRg< zY!k;c`TBx;dzU}2bBSFg9DJkQ{9EaV+OI`p8ANGKbdimeH&BS1=$55rTgl2jLmnS6 zvN9;@M6d>GUBbfQ`dAEo#{zfCh4%aj{GOs)Y7d6>Fx}|zm5c`RIgW$)dz)8&rmQwG7Wkmi`rE%lEJ>*<4_8cM6f?iCZ1#d2qOrv?Y=qdqwHTps{A}Z}QYi z%Yt5}IuFE((8#HAJM>ihbj9rAaD@}{v|fm2v>HTTaXAlqGv8@Qn3z&1<5k+w&7M$& zFRh6vF3Ste1D^tKs!l*q-n<;v+Df}u1+{;VQmUGD-(FZ*-+8X9eO|L?`Y|ES?UA(v z9;n;|Ug>odl-xR{R##@PZ`t} zN>}L-Mb2Gsnd@5(Z(OTGMqLn-^Gc?UqF}cP$efF-O;$@51&yXt2_G*Ryv3IV3j_?; z3Ni9jobU5J;blAK4gtRgz{U#SoTbkN&kM4Bn>s^E%{DBE#)ek z+a}D0_$dp2IsDp-MO@s>e?Ui<{|rjaSY3WIo0ZnT86OzB7cS1cT($=Io2oXwBFcW> zgkkmLdtyU&{m<8vmhX{^%&#@dc|F-{mw%)pzOSCM{xm2~2YSR!@og>9gWP)m1mdsS z)oALQzBk+A62*hqef8=HDt)0JIO~@6G zfbo8ag6%k0A!_6HqRd8TN(cMtY(u&=*d54||*w{A;-GOiTSV1P*_s zZW}E74+{Ir9bf$msF1dLK8mPOtj<_22J?(?Ip#&0AGO{g4^Jk^y9r~9SC{~Sd%T!v z4IPF2yzz2>>F;58UDgZfW5U*%!O9!odcN7)!ntbnJOQpp!NOIgtMBmubvsDyz+lvW zQBn2$Vna9Rtm#34_#NXgyC+xtf?iZA&bSX%CEmRR$}+ud@{R5nPH{+6$xhzf`%ET2OfB{F4BIg!^O%f>f*}0Gquqg1ba6tTM5x|qkQLR zww(i2JB&{}``9;#u5Q^Jj$M!n@5WXv>FD`gb1-pkr?YdB{6O^m{a=f04?PHMwBDmUTPG+V?>c+koZC2Y$9`H8|zduN2! zP4MWFcBYda`HXxZDmUT{f&1?)q&ZyQ@ijnK!2#NYh|J8xNVwml%Jr1P>8u^1=X`GX zhFl1N8F$1vf;j4UfixJ<1my6amwbbiE=;M0`OS}ZTRR~2PHVx3RAdIs>|ZSgS~FFf zH^-k)#|!JB{vnvf8#OXMe_URt@7*~ju{}M;cL%xF!*$!QzXOC~1LhIz7wy9CN}=A| zj~)&J=$Xx9#!oc2xFI8h+^;%5&&)ZoM-;6}om$ z?Q_&F3?O0noXfs);~ zM^fuf+2#XOIH?%>tX*}XIIi0cQcSMrstw`e!rv9dzjW8%N8LF-V~QhkOGpDvK5g@k zV5Fl6fHCAmn`M+T+wU!K!XwP&gCwD_QD-oZ^GDthzg$TLqlrp_n>5T z*E;fWsg)<~btLV(kFDN%f8}XCx=Hn`aZ;I6Hj6em-K2I0UX}O+Ye(up<_vLj^8Hn) zj=fQzL}k4!diwTuTT6wtC0H!QS~e%zu0K>hE@(EvYVXJ+$~1FeR$d*_%q34B_Z(g{ zsr@Vn(D+F(xb5Vnrsd=lVzByWI+P@UQ!eFpyNo2l!-vL>^2_mk06fb2*No|Ac!!KI zla&J{0FKd0?y{*9@{Tjqt;j5k9$PT03U1W(%4DmF` zWGgNyzHh9gygL+#GbZ#Y`ONl*-xKQ+*@k9_N%yGMIq&=j$?SeCCfyyfYO;+u5E>T{ zo5tq1=@|ct6>$x$D3dameQp`A9u8((T6+}K*x;)V_t#kCs2{e({pJwGefh+gLE+vs z0%H(0ax3(ukE#}d_YB|V;#H=;8vWy%PUX%{sEXG>$DxeN8?be(dilBy9!|9J$NiQH z9ZEusl&0bu1Du1buISt=p?>;~%E=BKY6dBPru0cli%Cq2O31_qr^H_hZ-5RLK@Wzc zXQ)6nvKf0aDoJ;pnC(s1NULwt={&c>lMaob*=o3w^*aA>Gj1C^4SY~+vrymYLrIJ} zTEgpxjc_i0i()mC2;j!Xjb&oPuXm>rrsaVV!qOxX+pon|Lx^qO35Kk+{~~Aop0WnD z>`1v;FW;Obz`0qf4sp9Y_Bpca0hnVcbo+p4fkG)r1P<0(TX(0bX3VYP1V~>LLwnlN#-Qt?J51&ZFp1z1vH|zeOl% z=aqR!Ow()BWrV;e_o`&5@DiY1e28fz{nuR zri;3$^!pW!V`xaiGR-)eHd1RNJze10A>|U`+yM!pw_B5MR#3omfzA>D5v2=utz{o= zo8IcsI6abfr7i$w?LVt>?$U<9tZb^=w@%Eer*HF$((9NvWs|$!2hbRo4`tTI2%C8H zq+Co1o2!S}5zdK|mHN>_zI@?Hz<@6%l5ZRNMl}3)hA=l{5wJM03CDPPJa!S`RR^OXYBzMXMHpE zEgqkUr`OuyPA?=jtx>O3k9@BezB7`3&MK&U_N&@2pN6Hxvt?oy#;nV#S;$!!A>oC= z^=Z#I;7+@zS1IzBJMHJ}Z-&$DAcT@Akg`-5F{+K8zOAouwep$SQc5=N!{qq{F#Gn=^d@O6JY`b$E zKDU|pH|T!vKUF=&w^&4<4Hj!B95=n2guXF?iMlgwC9Tj0!f+1>iz|M@8WJ&n`a+VX zC-c;$!1s$uNpYA@Sdh8wGc8K&nKIB{wToD94ly0$S7+J4?ofyxfrjNd3GmBKVgS)z zi8rIHvUM(6V-l8WHBdh}=>F?Rpj2~K=J?DrXh`62nQ2X*!a1m6_HGCo{I$Zh!-uaZ zoRV|yCZWeY>=;CNa3??R5%=!W_`?`K(O~1ZImk|am-Yh9S02!WJSZM5BBv6K9_w4h zf7i^G1WgTzJRoS18-rF#9}6eAm|QV=$^e})br`{Hi0T<5N*eCQ$7u{T76%k{twxs+ zBBaac!!u#joceAXCK*>H{01a22>{yog1Z%E6bH!nNcW%otEOV-PihB8W#;M=v7%>( zLWP40eQ~n`k=(0xP8u(6eycBjwSKz$SWrSGOMQDCZi;`?m|C5=dq^-rSrr)P@X%C; zATXS}tZ3uR*v(iNByL#?J$}Y2sg|N-T&+a^D_f zp$~)_*cX5BHa3Y}7@96}TJHWElDG^ou3FuLqb%Kj_iqvxqgCs7#u2+SGB#=mZTCi7 zoYze(v_XLSbj$fIK>rRB&th93dur{MIDe{MLLE-xA4EWqe`;AA9Y3_^|Cxd)TPRcVumjMuS1%05Q{Vh7E zDfyI3yy87wi1{g8yQ^>)QWiW9l|Q0C`BC;68sTgVDbF@O{{p#ShH{rP#qTV8%DYMH zNQB};Co8^r8A>8fJ~DnPnvJJ5vTcg6<1crMRW{~-k$b&+#&%or-Wjv}%(tL4&7_v@ z{>!JK=w(u)3(s*1x0M6W^>c$dZswzu+|70qwG2!QB*m`EAzzBeCbS5K6iTgj;W#h5 zjqE_%e)5lnlP}|R`60x^>K`_X>}BZ&*9s{ib59m>$2!zcip1#{uC13iiBQZJYXQKmD2_}dXLOb7LSHo)q`@ayp*`>z)Z)5-Q9y7am4%G9rm=RAZ z9;9Mqq}Ia?+{`CSgLr%F9SHAwb{rex`Z0@A0|Ddh|KkO)aBo(NPMYCjI2DY*)GYUE zfnnLQ;5%A;?fH|GdHMwjX~N6Q!vZl(9n9UUFyg(AX&`RpJ=R{Zi>Ce)P~mJ>%F&{7 zhHg{|{wv2kWx?`f`WT-nKGw%nVRk(}!gr-uq^Uq?Giaqi^Xo3=&r7xva4{QYT3cMOdwQCtUrCX!N8^Pfs8*Mp{I^NRHV3R;^EYapNZK7fNZW|u#GMC={Yu9v(% z{-ZR9H=E^hIf|GIyojW-3_T%b)8prDxeGJ8=gUbeNTxbIP5cil9~Ec`q)`99 zqK`#@B<*_$o{QC_NF@n(WZ>JAIRmoI`NLdSUqpZTZ{c(#Flf)tDtw5%B^KVYJS{g4 zjfFleaMv?g#A1+lOoS^69Kbo~I*-HIk&Q)}#rO*{60T*-wgtvJv9p|&Yn7p}G1pnX zP=QZ0S_u{Z?w9qrnQ=tvK&X4;{Uj;+?z>CAyIT_9*Jy)oSY7?nM2IebrP<>y@;{+= zbsGO?E9D&)zV)+6hzZdT;%i>_u4OSi2yE4&GzToUi{Ka2BwW4+U{-AYF+X{|%i6=b zr0Yh@iy%tY?e^zhC_hNz1)$NLA*lAT+1Mo9ByZ}HszlRRThqBDm5GpOqQf2A?q<)> zu5a0$`vt`so)SR85Ta<=DFPObagoEi@B>o5!$x9lta#(*DU}6)`B>9uTCWNBsU`vZ z6reDfvpR;xMON#G)4!){0-3y~IWw8fTIFzi3pXHg@qM5BZYY70<0fHfB0=zn@fnvud*DBu8||1l)twqu08!{WalI6C)0C zy{Zb!vDGu^vudUv8q?=qH69+ibpYS3V$K>M?Y~`#O66?6v2PnP`OTWQTWv>~&#zGD zMvwsk>TW#CL zxteMlKTjEzPk?5e7v5Hek1uMnN_tvWx7EuB7!q!jJ4o!wffxAdB99+n5a>)idY+^o zSKAVJ$#NS!=^oY>5wCuSH62eZeSSY7&UC}!*w(=DMbn@ui3fdlpin^<-}hjgC4nhD}s z)jeWL{2UarYpBeXmPpQzMv2=CaM;*w`;OK=w_Wf>IgNRBieH*<2|%*$rw{Gx$;ZsA zhcVrl@29hVHXVp{f_NO)-z&bRTokP_!68pYIOZ&Fq$te3@!|IoQ%j-tRO0HqHpRN9 zME9Ew>1fwAstqjUQ(YG|rBj59Fb!WmkSIsN0~p_@D0~s6KO3?}${$9%5UuMo`!%#l z`rDyt!~cN>E(%M>BX*^H5GCS1IPd1^=<$^`K%!dz5o#z68ApwL+T8Eq7AT$ijhLs? z-WoX64LuB1|MMpLkF|z{dK6HNseY?p#{gyq>FcT0xBvB4pS5lNo%eU9v<4E?lc?y$ zJUiJzI8+?Y(J?-A>f+6=l@=|fX>e(B--tWR_M#w*`|00u=FS%^HMcyNKjlk^sH12koz4g_@BUQiLxsa#U$jhL0s`bDlH0=Kh(4D-X z-x1=@NR7lj<^Gckdb;=(ONWgEvIGo=EkQz<_mb#KDhgA6Egy_U&Ax1Pd1^YiAOB4m z*~dq!|Bb+ZBk_EANUkVd*o zx}{4(BovVD?(Xgs1VOq(O4xLFDhO;sx?ziSxAeI;&-;w;{gmf7&KcwUamF~$82b-4 zv03+8bIo(6bs@{c^cx<2DA zmEB1xRT zh>%52tE45?yas~A$o4t+qd8sQ0cTL@9P6Nc)xCff4*l0@XeQ8hZ(RGNNLg{bBf<&< z(|qn0_9xzM$3)6y0|0qUf|P$Us?*IC-0m5#qt?l$vUPYMpZ$mQd!Hb|&|kgE*U@op z(6PpH+<~E3o>#dn&Wb^~ATaQrRZ^gdUbO->tMwNHw_RVHU7gzurU`3N_rq_g$$xW7 zUJ>*zj(YINaxwbC_-sBPOsco@cLW~ANm)gWJf0=SiXpxrIPe}IpHTRs!bo#PL?a*0 zgik*5G>!Y#HkH{iV?JXKhf!^vK7I|mocWLc0)$u&ZQ&ds0y z;onF4FE0d*dH-D{s3-i_@b1jw-@Wu7PUc^a2R%dnbr1hJCaD;r!(pm|pWrqIpEfd3 zU(QVbcj3?9=gtcxI8j-kFPnYtOCwD>FD!e>zkl*S=TJL4CT*=12tD6eM~@58{&U;j zEbf-Itu~w=tu?_t!BH?%`Ic-*{O1X-$BQNZOQpeqx~>z6q26M=sIiDasbV%>@tVH3 zR>9kYhv(0~A!GA50M{aYRRqFtk$TJUvWeiIfAqkAMM-av z)N$U{akW19Ng7BQln*k1Gd0)xRy*RR!t?CUKhc{;dMZ<^Op*s6>iqBNZJP3GEgs6M zZ8qtLL>yc9fKCLZ2mgccto00L_>w_XOXE?a1UsU|X*tG^xy0jUb(xA`q}D^g5i=D)h3C;Qy;E=jPu{MXwE zf37{P#a&3n3Us;of6C|IeVG5Jy9@<<95g@j&x7EB4&db80sIxyz4&(k|IWa_Gw|;W z{5u2x&cMGj@b3)#I|Kjk%s|x~!qw^QUa4&QO#i?ZB=~oQMY#adonFJr-77KP>&+7! zMmxu~n-z?mpm(x3p}%pAjXK-nZ9LrTSeLr4lEb za5i5p%&~{hw`X!PFPC!6Z4zB(8)XLfk|)Gg>VIc5Kkq}u8Q~4>+kmcW-nMPv0AF=Q zI-dT@lL5DVO&9EBdfYgC4V0ZtE?39S0qsE3Eo;UWUhT%uD0cb(rnXU%zr(V!kKjy< zKLdUF;det)cb$MfEUZ)4a(=BFFqTkZyR4ve`7ATCB3URlmFoKc{^rq_oKg z=@{Ue9@Yj*#<)+G<>sZdJwu!3AGt<3LCaCk(+U5GP@_qp>YJ}XAP3&8wLfdX)lL2> zbnetBTmdD?fxfvT=_3$Y=mj^J!qd<@hQ_F^BF9tffi{cJT5m@x3;w>FD9Su?oUjRK zy7kP*OFz`M<+63lwU-kz$?m(ry(@9HVLIB|(idj{_j}|JgLS7VidWQA37;{P6Ix?# z*=%gK{5-t9DRWt`Oi=Q3@-6E`gQl+UWq020O>c*Tq1L;|tZc=3CuFj9<)xB99p-tgt zJ)_dK7OUi*fcF2ZCp|Qd$bv!mT)q-J)M{7u#$&c^MtjD3nV_szI!sl_bdYox+EA}U zmzw0)A`7Tw=3C8db_ozZs+5MNKmH(iG{;~ATp{5oRLT!@WGr+}E!n7@_mEL-@u+Fu zQa*+s!Rf?S^q*EDM0SVxb?o-z>#lhdp6t2i1Gha{9}2Zrld6^5WzX72QC^L@>^P6q1@T|F+Lo25}ldnT8l3q7+PL`Lxd>1W_DSt=^=Jq;W656 z6Q%9??MldYK|mF-I`H0aw^E_2wZh$8IhKx|Tmp@!T;zm~KKWKOx{S3`Vtc&A#STFs zbx-v?4l~VhHMQAmnq)4uEHKn=X=E_jeZL^DdI$=QI1WtxbY{A^YqzbhqUV?eQm>LY z6}!3-hT8t^(1N<3lyZyyRcylUu7o@R##6YD@&vg}O@u0q{JENZxr)+_in$+mO*VpW zZ=2zFPX@QayX?hV#9mQR9BUb^ZH}gyYd+0um(4HrPLDS@=yY2OQBM%!*gn0AB@O?X z7=-wvH%!sgc)ITdM$V+%7D8q$Ngb5Icw?w7INwIi`UHF$BzUR_|8$XCwBwS!#p|T8 zShMXb(Q5B#L0{}Gl6PbaNUb(W9ru|PUZF-sHBM4?v+0NK4 zk0Tt4Fw7^)L!Po+l+@z?0#!eS?ZHcc2(1^-TWMyr=eL7VYKWUoWjr%)8c#02QC)jbb6xq1N*Z&jVO#Ss7iv6u%*`y{N-VB zl|AuN40}G%ZH(r}7)fC!pP<)ix7jO7M5Z%eqFrbA_t1)wDtvi|LFL@{lh4*mtJz8U zLna^P*{)#pPbn-J2~OR(ZyzHpuDy4!ULKrye-cBbdJ`jWv)EA3EkqwRu9eJT9R0NK z-G|Xg9ube#ZFgR$pK@UY)RjhWk(B3hKtZDmzmrhaYrM6s+Slw5{m35nRCv0VRulzF7YWzr>^p$(K%#sPy z>I3>J89GaQX)HvE3qDTz_2#3{ic*BlAf6kx4oL}KQAdLoJ=b6Bh+&_Rua_`bY^>&w zzrIgA?8&6z3>4_r6_dO8^G9Sfi3nL*wQUJ0{t~|NZh`BKLFs z9;UeV?Z?U%_~ASv*k-?84V!b6fY~8hft= zxT1b+@6e6K)ZtCLjRcP^M$(%k_E#q0b7iq$Z;)=33o3;6R={3k+UjO)TAVP z2`ko{y%3w$?+ikv%rtquh7R+bww7iqNzL<9&_S`{roirUZsq&=dUws~WlSj#WB3Ss z%9J*jK`ved)hPNVJS%Z26zs@KjgZ}kM9Zdp}Tb8&BLR(q-!vdaB#@l+3B zhJ%TCJ+wSdN$K2%td#1Cj9zDI4C*#hD4H@4>kMBy+tRqlabyl>i!}w|5E<4J{d&Yy zood~W1%8^;kX?Jb^w#`)YeDHiDu3wl-n33=iQPDnaAlFRMq|;4@s=uhth=Iw|Fkb+ zx~?J??<1V3*7gK7lX4~0{RNpx zE9hDxZt-hJR)@+9TI_o3JXNU4Mc6V@<4Ac*-+~}~&+}>=j-yF5)Qp(|A>~6^nJY^W z!wCcH=;|G8Dy?zxy&$_ z@6~4?E9;pQKk2?ojtxl`!&^DAREKCTg?X90VVrMD3 zSBKNvFMmm}gKY22&qB=|Jqa>Rr`B9_UO$+@E^4>VN{a}Orf(GD22Nr3O%dU%u`Wi# zAXst4VT{d;FA%13J3ias9Lpwcw(6*bwI@)>jv0r8m}=)i9(hr{svU9~&(5(xxxOmP z{&EJF=f0ehkB&moa52EQCB*78q}s+{>Zv?=`X=w2tL_$;NQIz!PjQw&5QMDo;}W*b zRowK=w&rKs@#+t8%sSshf=p|AMWSbH_wfvAuTlKBzKP7wh0Hjc6*C9WvvNRfm>26O zCt~!2-(CyWYm8dViYDO1@Re|xH+jlo#c6nu;i*s5mer_vPGOxe#7~H@8l?C5A6u!P zkqX4DvFMn=OWXZ=l!|YqX?OTkb$TnSrJT>PlTUB9$?>e!p~y*f`t0iX;s-sA$Zp!h z293+MwPc4X} z`gm0le5#9s*O6QZA6c#E$c|bMLO+FLj;TjROk7r!Vi@8*W-=5|UF>dw|N3pMsI7*v z9@b=nEik2rbTJ>LD0KjrMUz2H;thM*!K>lE0Sg{ZLN>8KHvN7Smfs5m_;&QiOUqHh zE_AF-b{pZx#Lp%4_5&WEh(?~hVGY<>@RV!>JyI#>d{H0Z`cf6qQlLbDO=KO5&Op33 zodHy=Q>X4J&ONits*-Jc)EhD|Ydmu7E>R)$VB(WK(~2@(JU%m8=+}IDeZp{~WDZDK4KWQHBskV0r&A8LH`OgabwLVf2c2Vts8 z1w+@-DY~@=z0$;d9)EqdHrInUJMLR-X@y9R_{LO+8-QXXBCVhw|`YvCh zGW`r_S^h>!bKK+@@XNkt(%Ut3e8Cl&C?d7aEckUAmuitJJ!O=aH!%fjyG}@;Rykde zGCa#iFK<#ycws}D0fz@Dk1cu2v?N9r9A^xcb zF`{>+|B6ib>EPZH5_*O4tB7R!eW8%&7Iv;oIASFFu+dA{D8kVen?3%l2`oyPQlo2q zbHNNwg0eid<~nkOrPD<8I8^)zKTPbBtEd4Y!lJ*^+gSRicTw;OBgXjzWX&ZLkmb&?L)eN%#*K;t~PXw zv{4dni_Y=L{`dm#2+1FOX9i%6!^_~cDiS?W-UY!}DrqtReEG}J9f*n4>`KoZ;Un9% zfwc`^kGZ)$*i2C4nevXUDqAb3~X|?`6UNoINW#wv#b~WDQ8lXZE}Tt zbU9RKo%O_Ko1GJJTtA_b>@m=@=u0Bl7RvGfR`n75?!j<@rsg@loNPmx0Ga_x(;4xI zwJJ+S{!1GbHavRz1cqnvK8)ErGU$Q$ZLt+yo?CXwcb>Nz3GA{hM7Gm(I(oG1%3-i1 z2NTFI(8_5&`X+JN@FwDWfCm-m4QkulOw<7?7g?lMuB!7)WU&pK>1RD&~l zY)tf{FNr*Id)`+ZS44ND)Yx09cw5^ob1}<`xCQ>hgtJ@X2NI?teDX5y{>KXSdP0hs zh7sn8woTKu0uWJub+WOE(nSM;=HfRTCXx(7#HqYNuzm&fZpEUak`Jm8X*z8rX%crE$Ww;1&G?Js+lOyS-uf6;7>MukW7kJ&sxw2!D_ z$bSatTYun#SiJi(VLOwLoKESKT1oxh?1YXPK;blb^sN{s9mB?HcH=04`xsg<9BU`2 zx9;KiHxG3B>@2W)d4C2~s7{y`xaXv3B$+Xi{%HK#Ke-{()ow9%kor4>kX*{7K~HK2 zYoK+dICefPA)xnqkv7Ga4w}>H!XiL65^4#R#=*8gFJL8?wNHfFcT#$rojPf!MJ}vx zp(6F<-rzFLP(lr1?fR~>g;F&8*C!ym#~3y3#j3Y&`D}wun?IqxM#1BgjT$XcbnHzy zQN$)Y8sPuMgw4(oNx)&Hb{W!Jor*C?2y0Tc$}~>SwC`7K{Z@{Yehf|K0V$6fd=n<- zwh+iS-D1X`S-0UCwj~$$)&x^}_7Tuvhw~{leZP{88B%isI6X^DGmD7i+&&tuciJ=2 z8O7akE&5^00+E3DEJ~`YWSvk~G^e#KV9m`3&MFI!BcI#-a#OE89MB)u5h@uM>0ohE z)`Q|=;B&`GLKj)K)g=PB#is(I?PxLJr9KvOHMozylKB*58)S-b{<6a*!-V}1)vR^i=7_)D`yNTH9wWX=yqtwojiFh)_uV5lZJOiq$c>c9kmm__ zX{AlFql{X5?3;sx`!VTruK*#h$4%|H4VAsiG;+?8LvZg^H^gj(pVDQa`Tme!Ie)K8 z1%xB{bhkilmTahY$F<7UGX+i3bpoWy({TA_$k387TQCpfUOQqj0pgsluUtS@d(6?yHlzt1*`?xsCW`8YBu3(kgE zgF8+Xu9Y1v0?v5n)`hSMA5zYJ7Wb+|9MRx*)@*LDO*&X{2PEJ_4p9$IJZm5MpnaLw zBIi4gyl~=iJJy~3-hLfD`2AYMB#aDj9Z%-r0;;W{L}f^9bvOtHGf92&fvrEjQj#jA z;GwqxNk|ZUd%*coI6oWS#Z{wKBr-9lx@%qdB21NF1L3GeRH~3qd9HLaSS_Xae8=_Z zX$?l+gZN!5htC{VCiQYtc!4niGI|nCs`6%4D8EA#FE?1dQ67)&+*6MXT755UefIRf zdja^T(^gz?VG1Nh5^!rT;m@PH@_II-ePAnwsiMc0-uUMJk@DqOfBo%Jc0}_2`}SJ@ z6YTR{OZQSy3)$2f`Bw-*99b6FGBVX>ZzGInZ)R<3ndJQ5>YbvFU0vzW;ok5o(}K4UeSL09qSNkO7!JJmgf-hmu6s=|y3%#B{>3GQ3C1+SfK#e>#XiF>|&+|Gw8I#=0&B&S0&VL`1mgq0T4iEdxz!#iII-7UVI zxH_nF<9eFp{sM|;Mk>Wv<~ej1v_|SY`P0!P^+HCwuq~SpP#@=D2n4TuJ59bJZ^Y7r zqhby0Knh{VW$W^g0^@ymTDZVq*5VoENZ>b|XhH%PL&)?aNO(V|I!kkqQaczaGHveO z2s!yre=&D7z9@c~f;h*!I*>m9({O-F$wF^U_}hfX>YpevAoBsTzCR*(ZXjI#;r>PB zBSW{g+taOPf23+1(D~^ue{q-Lsyu{FldI6WwW=u<-V&MFA73`*N4n4CLSWz4^lLU` z`=q9~^F<1kQ?3SSn9g+>zEyKTOuZdB4`+f#A`nB`H_laOz0r(_$zXzfG^1>Cn=PFC zvWcXT9)Ota0I;vZhfRFhKgJHH0>YIW&8C4l)LRW}N7jMSbloml3l6Pp?EAJ&|5Zi8 z4xw38L2u%7Uetz&_3InKL!!JpN7mW_*n0&`H%yZK}<<|zFn5;bT^>0)r z)si=Cb;|}=cSMo6F)05_fw!X6M}aVR%I=P@fv-LwqQ-OxEft$0d|=Zn5PjMqB`t~b z)L(t7T>s=@A6CI&-L)Ntiu3ieR-$A8SC*pS_x z^x>z~>(O9Y(mi@s&tKnETU8&+P+2C)73k0F+$fT>FP>1XHKJ(dncjZ%NFS6?uX}F_ z_xlEje(?_7j~oo75TK_oKtRm!D_ka^$Te|%zTT|p>7 zIZAADZ{_xvkkkoaBy}|Dz-K=6V6^0sdfFbXU20*d9U8?clMhepb1bfhleE)2pM;)3 z@ti5faq9c2_GNM#jUBTVYo^WG;ImL^Tb!ityLokqq<>gNJZu)0f8sSm-`f$n^c0!Z z*Z8mZuI!$UnGO#fin9pHaL~I3PUkA05*IDB*07k7P!Y*=_me)Un!@YrG}Uh zvsR@>=(iW72;mxBrPM>Z&2a#AiUayiJ+wBRt31lb2Y%LRO_1>|4bCLJ5#@Q8Da9O| zsOqnl!`Qgq*uH5;Tv(Xrx$iK9aq8i&L?buU&u`5{;rWjKDzP-2)kH2C6dMwuE#~)Ndrt4#bbI+HXY2+f$9H|F9^(SFkWx zN!cW#l~I)9!+SXsQu`U9=*a+Z{J5L0X$C=^JBE+T5OAljT4fo}C?y;#WfV?0Um$PJ z0JW-#*?F)!W;{CMwuK-iv#qImk6=O2b6&mQoCD)bx^Q&5zi&q#qDMs{pc88xyC5^( zR%456KP+DG98;#%e7)pN+`H+F%*BXMxPL|A^sKX)qDG#JWvVC|Frjn>uH2c(nXMai z(8>CU!l##!6bH*a@sfRm#@OBDb5t1vczvF?4_EZ9XFqr=6uFTbm&p`dHem&3k7xrJ z4bI5Zf%}>0>cr>8$MepjQv=oJ3g7l-PuGWuX}?^9(}koL;Y;WLk1i-3Ru3yBm!eW6 zZM?#nlI}`d$lDE5Bc$ar3byyr?d699AsCLpi=#D`>e7O<_U|yM@UZs7^HXfoP_l#) zYE_rc)4=sZ7L}adfd& zW64k6EXTjKy(XDy1O4pFP{(cHFmb0~?IMj=p%bfHC~ms{qDTA>>I}USy4XDVrESdYJhj)g$F2m@qeSCHTGB*`2M|_>$@B)1tEwrUCfw4$1 zwQH6~03z&rAR3N)t-@;>UY17L;!(hsM%My#WJ>RfoA*SMR&suU;==6)3H5$V&H=GU zfe1C#+I}MD;vF&$wS)%#`at0SV2rFa;J`J}L$XAI#|;^zo|ksPhJD}~?mpf)Frq5h zJYj^;!eu*8?F}Er*3-$ulsc9WyXhb5>22zdkK97pBg>(^M`&28BQS960k^zA{5JMA zi@HRrMZC0SSC;+Z)F#Tn%p#UQ{%ZToDx(_n^0OiK{INxVJdYuW@9#ScR(6Z7)8~x9 z$~GU(jiWPM2oio_Sg%s7Q5U~^*1~SorI`G2ccF!4{sJ`-I9l*u&cx15L0Z6;uJ|DP zeqJsAny4n{1_s|r^yF@>wL#rDkuI9Px7a>kQd$+WUllRnMozeO-w#|8ABZy%a@i*8 zJd$W2#w#E`@bNfX@ZQLg74CebR20|y^N1+<#BC$r$V z9v!^or_`bm|N1S#v%rD_48weSk;zgrPr)b50HIf$Y;?U!JR&zu6@9oekk^vc#lz!0 zL81NFAEVi(%d`IONL!#{?eh7-8xmJ{7zE1(nkFiytf=7t zkDvJ)^u%oKT`hHIHc^8y^Er_Yk%96yTAFRp4=?oYGEJLws_`Mqy3=%aLtML~c zoU1)`P}>AtoS^r`>sE%hDDx++*8^3INGaD#GQnhXcRIwPx6EdnX&K)%n2a@*)J z9jA{kwIKoLu$Gz?CV>+f&`c6K=Yx!|J4xFnvxh+#a3&(TkHuI!<+{U&WzZ!a(0I@1 z0XV6Dg~3+zG1Z$iNjmDTls9i(4@Q)&%iqMPrQ_YKQ&tUXKYq;lr8O9nBO3{O$-)M& zdS5J@gem1q6z;6R%S{{b61{K9(`;^=g@h*8J-U~cL}Az*jrgf&-fMmpICHl1tvNl9 zU2SDqAL!IOy%a_Z!~9ZL@_iu{-*M;n!yg^}p=n?esCFj370EO4xjoFe3~@w?plxCC z{1UC5e|FKw!&A6ym7kIr#IiC!Sg{2}L>^%AI#4+xxrqmo!AUgw%+E?KusGCvwQ=)* zehm=nWMBMWeGZmU>D@l>FIHR^Xtqpb)=`_~zfzvby-TiQCE?E^@DJ8la<4#gUR|_n z2JJ&4=@S=ObeiLia9P?a45_8j*EzNvq8}jH`(cEV0`#FuTSE|P8-5Onvbdkpk9}?ie5yUKQ;&JMe?OI*`5#Up$QFue0$_Ih zl->}QC@bJq72_r=LG#h_y!R-Mvz`Jkg6QUOWA@YY-7Ri%&On|Jw%U_RZCDfZC_z=O z@RQV9^UD-xqMuJzhZx2e_|6c+ANMr)N@~plr&F(>qTVVZ=PCJbS?RmC`+P90Y1)lm z%B8w(d0#b4ZODrGs1h{X8QSS4IS*%qHj_0QRn>-!mzT z>nUeB`uTiEQNmlkn{|d@kp}@ObrLv*;wLLU!!)TTv1U7STGBzK0NsJc?|GY}TBOX{zi+9(B_!k$P;*BDi&|~*V*GB4e=%Whf)Al**+XgnWSX(5&_BrCztS3HUl67S zfEH8g@2mxBDDJZ^vWI0fdeBrPP-SrxL~!{h&-T}Mg76*!To*0tlZuix@%zWUbOOxe z>>(^IoJoefA?f`_K<1B5sRu9`z#UMvCu#5QA9r(xA2c|8kk<~zve^DJN2mta2!ckOhzkqLJSBFNz}fwqEhC7dPZ!%&HLd)_+Pi~ zhY?2C+gRt%4cjT`0UXYLI~o7utWOTfEBzHFO$6yWlirostD87Q(?OZz^|vck5gWPD zm~6o)SkH!AZ(RZ_VoiFB-DQkMi>5KTtkit_)hi9s!AaL3brOkr#fbIq)zSO2wuh1n zbG$@BMj`FsdAHRUvXO9e|aE2N;Ckrt-rGKL9_+M`93cJw~a_vP!bt5Oz#&g_G zMdw>r)YCO*Sy%2qB7#tfr4Po2 z&>jcQ!f>Si-&g+yhS_Lg)b@g_WDJ!o*~fUEeqK&nB})14v5uL(%NMI9{0jLFVukXx zNzX0Sy7Up>Czi!p^Pfrw&cst$r^KN;->!bm-8eFu4=HgtnL%lZ2yrfw91qWf(He20 z&QIZS{$RsVFSqvKt8Z%`!$kDk*q?QgvsaObsD>dYaR`vEOHh@f$ob}*mDuCLJkPZR z=0r}*1qFP5^L(n;=yEZ%d%6hz?pvqYvE~^=RZ?vvJMrxsk#+0<<5<3$ZBZ8UOe$AA z8tCn5DT$jQ=ql3vI<4?l2+z@0n_E{1iAsx3G-XiblHKNzF(>t$nC(XoySbCEb0*>d zyU7h;@KA^8yNBX+NQV@+i@@hkbFy4T2w-Zci~ zee&A3wR?~XPxnb&Z#s<|08$!t77xe=*1t0J28hkwxfVckQmqKn;WSe3!^zaiXMb4i zw8N`L_RVs>_yZE5#uvOnmqk6r8XE>CW`-o;vi=i%m@1q|%U*!%=AO;61=NfhW)ltC zSm&+7+>L{!FdU8$u0A3`7X^tA>G`ToTJBR~Na5|s3$U{;8=%asLF-gA|D_Ycx)U`( zQV?s~+Q-!5Ymw8l97_4u+2c4zs&l`ee}GtjcZyxcH(o-b3OAb| zOom4z?QMPZYGv;HJtnmS6;lw9crGaoku<(6y~dO}>Cd2!{r=Kd>=)Fd^rrCU?4GTK zjXEq1v+b}UTK6Z=7tI=jqa_T!Mv$ZTw2M6rQbEWxdsDYJ7keE#MsU+eb+Fu>FvOmh zs6-d5p89RHV903CpE8EgoML5zDVs?3h*;pN;Me)N6c;Dyg&NkxjlwwGIRDfLc3W>2 z1{M{WKfb8pgzbX5Y`RbZ9A9ePZcIC@iP|U-5RVDIa^C0T^t@qTN#4Xg&z5|+F_!<) zdBbGEV+f(k{nxs^^H2|!&sBX4gQrOt7JvQ=F9(GZQ^1MRBOBwj3>A*~XpU}8mKpc# zK61F&cApojF-T>2wMtgOHqqd5@VsSc!alN@-yeT-(sqV<{t`8DTQ2g^{m(Od20Gi7652j6mFic_KAzIbQwCNCU2rj}`Q!{MC<8G<8Dj?*TW zd~H#5Vyw?@*-Kl59J8S0>JP>Um5LWA_*=Fp%JgwDP(6!2 zHp^cb^+bc0Prh}9wraE+M)=!;LK%b1inTz&zvxAD0!x}sq& z6yM_Tj{>P!t4c?|v8XjmO8_dPL7lb;4==(qWQ-YW>OnC)WlC}|ojao?CE5YAq&&%Dy{%Y`=3j@Fc6Iwhz7ZUd+kN2vE5a80aN8I{d5Y* z^!T@fY|mUg5L96}-mQ`C2TpQWc6xtM*m`}&Rb12o7|+9Qwv49Ioz%YJ@3F)g96`D1 zd^XW^)g0X+pEuXC1y9%`DzgS%CByh2H3R3|#&cNB?c`&$qTQ(Yyx&FKOsnnBt^tpv zy8MDjy~!RPs(&G_9aAQZ(~mNs&nE6nyuS_KY>&D!_ygQaf3*#8 zg2XdR1~1A`W4K*WeOFxQ?l2!mlK{RJ{QbaiD)SD|qUYQPX!kS8^bo-4m4oObc-*K_ zuk^b@un~F)YK}47$Tk-mf}etK^KfuZNcmLWm-5y6EW=rzZ=z`YdWiOVM`J>9A@j$# zJx$jqGaXe)77#Hyn>t}K-|zNEit$s9v9-g!Djwd;{|Hw7ooyZ^2ZNi*y6Uu zb!!et`aGwJW>Tm?6>IkWQ<5ktsC|1|7dKDhnp^(@ou1uwuox!F3PBTb&un7&1p}aXmtvTZ&OWl$?t%tGfBz)+S^#fT#s z4R)?nS`LZyCSP;lPb|JtwVi4fYdpcv{~EfZIWhSu+gcj0esAfm|2ng7_|M|uQFJuaUcOJmF_M?ch%cI5NU#Z^U;<-;cewvnjbWbfJX^ zmM5L^+D}r=R}d3qKFxi1L419%CgrXBizyO+LI#sMqCn8?{Fs0qT~+iKuWz>*GO3w| zuK#o)hwsKBjt^;zmxj!Zmu`Lf=oIC1GazwmbVXIds9Pg)I}srZY|k;#3V@AGaDT6| z{^Nwf#G-?w89SkL>;(tmSW|4SY`m5yaaxsL17;vsZ4EBRT}Z}}!Q&JA+j;-@TUa2H ztSxDu*ec2Zj9p1h;`abI+>e~q5w5Es2eX}49~rY#O{Hv7!t-e=mrpc~fFQuMK2iGg z>ODP_VKES%_-?%>OGwRTctsqJnemxSI)&dm?o?yE!_*JSw?PgnWCWznBi?Dk3orFT zT0@cwMW+okkd29l(1D8#OrTP+Y(nxhQBq2L17@u<-BMTv`Y)N}i~++Io$Ed^WI9Ci zL^^Zf359uIH6~a;?57>Ce=HkQ?tF$22qW_lAc%;HW^;2;vCZ79QgfR*T7YbZ&Nyob zB>RbI&4Q3M*e!a4mkBW3s$7NWpY(#B8~#9-O1^rt zE-ThtZ9ZZPW_f<|*$>XA#?UDX zR_LaD5<>RuXJb`(`>g4yRs1{Ss5*btwQ@gb@{5E*?iECWd&!7fL>OQ%WW*Wtgm2gl zogb}CkkdwrQf?E$vg{ukV|(CrQU zu{xA3wA+^DM#>*w9IKmPf}Tx@iUtF(xrSKKr4zYhL;A|FxIt%B*5T?WzM_C>TwA{@ z(DLuyczcV>$)Q5iOq7S39IVN}j8ozkx6Ouk7n!jP&d2VPA}KfQfDvT}*P(|y@5x1H z{tDkT*t{r@JAR>K-pKR#Mz_2oN8Y5yPH|ez)h|sjO#oy`RqZkU^+T`Rr7!y^%-Fxk z09hWVE=T*7P3QBYFZkzMozxrx%a!g}HD{czuZJhc9Ra6Y+$m8#-*OgRy)pMH9Opu! zvDz|#Lh;MGw4MpmXykb4k(Zj|wMlxeA7T8UU^SNi3P4 z=MX4bVbSPaxoN(ST<=0nyQd5X41&YoV8N^ z+^ivN#P2)>ga{qS?@W$sX6x?Qrs*9-h{x|??q9rJd+QyQ7WDK!D$V~E*54H)sYI(u z>H>wt&_R8_e<+5`N6Wj#@a&<;RBy5LzEZw8MpYzdESnesaY(t@MoOdGtnHKHany5P zfOZ0Mi{YO+Uql!NIabRqfNp8kL9klaN<6}DZ63JUQO;>ut3Ux%{?Lu`Gud>kb=Hsv z^ur;xgaST?N=S*trDa;~hoZqvo?Jn%OJM_cgG82E4$jiqeGjBLUau9?by2HhP6p5f z$-Tr=2Knvpj9h#FPh5DWx~H{d5ozgjsqKMARPxfu*;3`H8{|DEZwy{GE=ucek{+t+ zkAmo@N%|;mCI{O;8U~Ntxpu-(U>Mx?EfzjMOL0qEP}MVeZRG|}Bv>74bbgGLGXax1t@?>JR96U`@KK%FQO!cFy~g24`VS0$;t3qh^?ZDm8yjlr&)qdMNc4z{cqM zo;TRbkodwUwijC`wrXsT_ZLKx!IpuHwnM9a9caUuOjH12V7_3Av1Fpgvk$wbC6&qx zcX5-|iJKkUKg3Ozf03*I95=z4gh)Oiziz!eWiTJvq~Z104q9pi_&JyZ`T6|xpJN-2 zBegFD>6DA3d(kL@3*<7*hootVxI8KuH5w&CS+{3P(u1CyJv*ipw{qQEn55vW<`8EZ z?Lp(}M|Y?wLkbIp%|?Kwl=M6$O_(6|1lfIr)?n&1f`742*q~%{dt5nTm)ZtnHh5(> z6VyZlIS3k>)`0z;4zNV% zD%cRjNTY4iscH+29$Kz8T|k!zNWNk|Eqd=%E?E8II%4oR$3S_C z5g@Un|GDXU!Q1s~Ck~-nF;xQ9)ApS_TR!>1^X@vIwlcu-k6iZni#scP^h?K+2qC;{ zuZhjm2UXnvLK@@C9bbQ=UHW`$*B(jGsdd=s7hcAB$jOid(IR%DbXVh(wrR zL(eujY31UwSs&eXLaBu36UybIv5BkN6{bhQH5Z6ts7*I3`sWgE<0E!QrldC*d*kgF!!l-J0 zjc*5!H-|){kz+Zof$0G$eJqgT?_IclbzE8H)J+M0A8`>A122-&Yc}gKsol z!sW`c8;P5Vez-b`T-W-{*1t)FoGs+Y$S7XrJz*le0B!^-*YFsrS=;iZb1cYZHAoK`{&Y7+8V%qDFi1>I* zuD&5LPb6^~iGaH54oaH7gdNWa3hFc|#`IaP1VEU^);|Y$i7Y_8S$R85%5HlBsFhhW z1QZrx!|AipVmN~en9IGun$@Bbk*PLx_F!4Oak&!m8bin|17LlsN1{&EqVs3q2AS&N zemvxWs{9iWLzE(1B!%zd?k?|Vpy*-?s0Wv|=2_N$0y1Nux z^qlwL%iqJ|NcpOj;Ep;w=r5{wm*>tdy&v%5Y|F&DSc2IT1SLBJ5^=L z;QD5viHHbVXI>b8Cg4`bjtLtomm#Dq+VM-o!zRMVvNi4F|WUGR3>22q>3AXAizZ0BHoZc}&nvh{$I(0Z&L*Xl&5I z_yRn+QE{7y0Ha$;h9`odZmSy|Q~)49whDRLu`qCVItO^a=Ow#;4|IZ3Y!i+ zPdg~RAO0=@j2JX0eI|KdI_(Z3i$?ol>^iJ`qQhjeh(k}CzAQ-jBq}PK%%*#|b}0&# z-E{T-C|&9RLF>5pzb}tKC4(x}erJo@@LuqD(bVZfVXJ1&`_sJ$CU=O$!Smj53OZ^s zSj6_xiR;j)>VgvVw9~+(%@0Vy)75Xd8vru5l{82MB}eq5s9uOtodg^)pQ7%5SM6Wv zYH)2767C;7%wL9E3*^Ru=k}xh=UluSihm-DZXY1hT^ZYG`*{#cg9&7dVrWIYdI6*y zhR@MBIoIRsp8eM&>iQ74@7)i&_HCfc>QOh|X8z_Mr}^$l|GzCFAl(*kjmne+bVkBc zm&=j&avfJthfva{igOI)(L_wYCfq+IFJNwApsA*2pjzd^_cnI6ZcqCEV(%>jqTJU0 z;Vo?dDk1{XC5@ysib!`!gTl}u-60Ap-3;BG(p?JD&5(mg4jn_+f1%IW&pyX}o^w9D zAK!2IL58{SwXSttzgkDzbJUt6kDkKC0PSiEbi!9Y(04ZpxWAph&7Y&1?btopUvtv5 zv*|sT58^PJwub^+FSTTX2yNghog$_9Np{wc>c9Os?q7>s;{SNrpnv)$yr`GdcicFU zg|ayWpH;qzuhF|w5(*?6$GCDaN|l>je1%juT}20gqo{Ky!nnsXSBW;_?d(ES*P^t< z%0Ozbt>KlWC6j@Bz=%GAE)0|o-jSy6uf1AMhC}5wp8=XmV^x=4M`UiLkp0=0ygM7F za24<2KiB4mO;!4;JrvYJsYX`2PIVVssT_sW9&V865UCeaGze?Mu#Xy{kBE18ktMU} zx4WB}>>kFLZ*K+r^2qVX^Wd!J?B%FKqG($cfk$0cL|}48l>7Ux_|XRUNr?;hn%=*Q zHvr2{NZ=Qj68m>t%0J-E{}EjDX`w*~SaqU62Ub0k4OHFH*97?`#(D^Qxf{D)znpD( zZP(H*`x?#r{_HrwEQUZw290pf*hK)8`@%b+I29n;MzLC@O zJWOZl0%V|8=|eOKdVs3K=IVj#$oI{-{RPAx8f6vGJ$HTZ5$45Ons$WzZYcQUdOhYf zXRKKOI)Qu^v7rn(iW)meSc!q}X70nSa{`rFDzAir`FhWD;g(ZwiyM+r{#I)(MTak! zFsDX;ij@8jDcPSQC7=T@P?RRS8l&KJAD}lDPM;Bmw0-kjB(wl5AIdMN=uH~hk}eME zW5wu#m&Up=K$@(SDUlWQ4QtJW`au}xA;Lo23>N~rJAQ{H*4&w#240AteJ%}f=-j0r z>TqqSJ9v1{S@G0G0{7z?cR>cYjk#KvOO;eHV3@o}tJ182R}FCUnVOkHCw#yl$a;RZ z00NET?8rIPAG3dXb468cN0+40cpmlLTWoMY-c7u9j1#f__HPFFw<3QW1nd#8bo1P%G9Xs5;YhBB{pQU2ig5iDV zTo`2q6;=>w&UMe7Yw|1LQZ? zUncUp>H1@QO?oSN=KQ8WIriANKdHMEFMAOQ-MhlaupAwS^-qpw_*UX4Q{J;E8ktk zNQDBw>`69qokz(EUi+Fk`tB@2ApDpAHxGpdrwet(tM_)ax zRIcoP%|~_wMWK_Uo{_soo@@=D<{M5YgS5a|u3e>DJ9mD1aqbUJ7xNaMJcU#trLA12 zMff@9D&MCsKoabxXFHqM!js*{Vu0xtYPK3AD=XgMhVBBV;Pil;o*NUkdeFT;VHb{;7U6+f#uZ#DGfj0x7raCyUt%`C<|>AQMn( zKeT-t8VAynxVvL|;~xQi8H|FHm~)K@$hHO@JZdXODP(M3)r0<6cFPzT2qPYaQ9;k4 zziW_>Y_2;4$4lKsW#VZ@z>U&l(J&OvSieIFP;8`Z?n~*vwmD#1k{P%iTR2-jQ_xCL zLcprWpg4hE*7I$l=K_k;`Emc*lQEERA(_Nf+Ke}e!G-a~O2Py)#H7h`I;(i9%7Xm; z&81=ZfW1#I2)_UlQr!P$nN|UR&C~1=$@$H6p3PdcJC;$XI3RvYNJ}pR6k7$KV_Mw41oBHKS6K!Q% zNOwVf@M&jjX1-BtByX+sob{e$q1hs}LF+ZPO0y$I_)4kC*cM7dwZI*^S!W zuLk>a#iU+x=QbZ6XD)uPoln%#ao@)LbHFRGg=eQ|gPUdVNm=|m`R#V`mDaT{9t|?i z`QROoSc#~-wRQ(Ka~f!)a&Q?J^v;)W#eFf+L` zp*gU0O!>Z2141i{`%K%J2eB8RG*8qld)sdlrr-)YSj;Hg9Az7%q9Nk=V#rJc3lA4| zrvtossA<{#tEioFdkgURu^_(Pj_ZV6R<(per6#G? zXc)Q~7`=5lZ1=M5J>kf~@JDmRxSF-!H!yDv-HxT8xYvHgbzgwz4Z<}PG1fF(3vjw} zwCh)@_{hfnRrL=VYGbzVv`RZWyyeZk8<{B){T%d~Md&tTZ*F_-f1&?J767*$uyfbu z#K;qOCbL#mXp#yzQwvAt7k0BjmaE(!64lfk(V;=qi{PO*xZuvzcK2fqSeNPN$bsWt zs|J#eBxWD$y>ZF1d9FL}C-+Vi_O; ztb%T@%u6ToI>_alOYg`uNMukdvRCxlnq4u(kDVhC(1Ry1)I&^s==M=DL!^xHJvkD0 z+h@S2Ka8{Ua)K1nr^D3Lqrnukri#}?%x&?2*Lgvnkj*~fU^=L@JBlF>j%XSUsc+)UNJF1A-n6$n$xl%XAN#|{sfeg_)}f_nmCgqpSf7 zo;i(18~r|C0tgJa&jeyy%nxEeHkpK}ZFVj>O_ z-A+PbAVx?6(C-hqr3+eLQ`X##eUD2f_kPr!2823B0URzAbU;u$3T+6pQQHSH)?f|D z|5~{Jn}d+BUh8RwY83<>lVT7k0yAFtR=Qr2vuWj{K}?)L;$*IFagYX1n0hOkm)qky zw=Ew|i@~n~^a2^y1jho#_h+uwa(|L=Ojm{GH!!v$on?ttU=*y#uTvp_Nuj6O!?UdB z?h?EctFgslmGF|?Z50bsh%LBywp>Sk@T&G5#0#|B`*==0)ptB^XQo%LD6LV$!lDB5 zPF;@Qi`@1s)zzBJOinI1w+ui6^_APr{B#^Pv5yZW+k7!U1IS+TP^gV&n9elQC}MK5 z49YR_{a!5L>r)|5N;>)Eh+ZwnILt+c7}ivr(5S~S{Y!O-|5kyY5K>ZX%x#`4xE1 z?R7Nq8($6epI0n%+yhH&MLj>xYs(mD%dpvyi(?yZ8On!GUESU9fe@;NbIQ7RIQUWr z>-1P6CJ;g3Po$t~^!OAO0=b^yg0b<*@+)hEFBXQ1j>R^o&BD zVsTrZkz=B613WnDn|TU|mHMJepo7seS$)TYI_oYIVJ8R<>`G{wW44?bBJBH$1Dnt8 ziPl?Ua(q;#s~>nFI4NDp1hp^CMk!NX&EWW=e=QRv4AFQsvZ9#%DDGnc86Ml_To!a7 zoo2i0#XZBGP&L4D&3_Jl|L33e=MQA0K0v|Cs@E6^f~>kQ76(uB>v?IMiV7yD4rl5P z7me{L?KV!BhiWxQjvH+}buPBUie=(!6qYV)mCV#xS);n}V}L;EJFYfx)_r&JIE4Fx zneN^(wTD>?1^2k|ZT2$I`q3otagJ4Z;7LLSa+|ouQ-9*-vH#^1d@FwMs8bnw(v32a zCg4k$)DbAl2vW{+({D8w$q~$>ZG((VLqyj;&N=yJ9$-Nu8Pp_zyV>GaW|J=^8%QZT ze#@gf`jC%b2fX-aFG4QGf=PrI6;S210S$)le4j%pUe4o69&%#4|HE|a-VIb4j9Vmh zr%@03<7_5t07I$y&WIUTs`2R_%Tg^*Q9|LZX@hfzwGqn{i^e_T1Nv90A|8R+bVvd7Qi?>=s(U7 z$(&XHJ~JHrs|$qrRxFn|GOtR;jnJb}vMt|x2=)vv#bXNUwmO0OD14S!d61CP`H72o z;p~04Qh~`eQxHYee4yW9c!dfF{#QVum_B4CMZ7UYHMX1au52PQh=5ftv{mQ_2+P)? z+-C55$M%2iQ|AL69V{h^#*t2$zkZErO@;VY`IR%v*rg$U%H(E{xO(*GU> zU%n~>)s+HUf#tc?1>f0C^q(D*_kYtd5u-!4$}~Jiug|HjamR~ZjUm+XaWAc=>zM(t zg#0!f!~5WGBAdbPyTrP76;c6QkGty=c2)BoA4!zIcM`)pvr3OGN&Lx@H8&~#asaRNiB6-{%)St($3wZtbwNu=h$@@B*7>K`+z=a(LfHT;>HZqWe7 zY`j*uI9pJ5CGficZyAYSyvR>0+a(upsn>yHai2iyF0M!-5x#x(*V}Fnp8PvEA>mK^ zQj7S1K?EG?;l&!Hzv%~)b{O;2!M7-L*eGI|Ae=!=>575qjNo_sAb9iNTKj^261v-e ztAzfSPV1EQ$^u#T?<|n+`oDN7*8gHy{Qv!i|KIx!w@J~G1l?EwaErtWqZEr&AoDUwdCyo=Nb1;Kit;-`8pRG|EJ6~yWL)y_6W6@XcP~*QYL|1 zl>@iH_M(6KPa-IAsXs8~H)p*bc^2zR8afK@BvB(nI?3m(j{}S)V3p~)q_?y2RFfh*7etG*|_&|xxiX(lR zRK8+dm%|^!U%&W{TJz{HmtaZ}iY}qTpSyUk5kZU)y%U3>NRs3Z6 zgYusu1iq8e*_`$X67o96S)6(JBRAl3jc1hpAkBT1ESV>RuG)3O?-tSHrw5zDl)k6- z(b~LaX!&%;zVp&FY~~Xgl`zsDJ054xJ!fmBgOddqzka$O3Iq!7q5Zzu{mDP|g)X%b z>*9Y;kY5V^Bv(G8UZrkh?2N+17;1CR>#D`(HFsYlwk}z=)3g<~N+AG$0|O0fEr%Ox z6bgsi7OwhVf8q8l_4XA_#$nvw4YFa;TEpt4)}#20*pDA!QEY4h0~rVt9rH*Qa-($- z?q^A6yrT*da8cKRPelM9q@KKy_6v%m<{ydE$!ta6lZ?7SL*w$9x`koImP=j4=rW`E zmfJo^oydTBD{4lnHX?DY1Y-q(2oZ;bH|qeAlAs3S*qt1YpKT~JRP?8c`a8PZgta&$ z?@ctCC!dX!*0`U_l9n-}S%MtpaA3KSTHK|{a9#X7iARFbS{r=!<{3!sPDQhRlL0!3 za8Ai*F?J6&wO%ThZ<8-T)k73F~3x za{cq`D^b(kWXvqdzYVoN%kjmVUp#W#)q{rM>xl&(m2z4t=m0W~`6{;KO89epGp0Am zE;}Ur%k}wq7(D!qL&&ah*p=T52uQnu9IaQ25cDbls%miQ4O~V8`y+wG?VlWe&B9`T zyeht~4C&5uh)3V@_Nc3fvd|F5R*7{u?&2a8HVU?w{5))6s=;9#3Bfj(SXJqq3Eq*v z*;7JZfU4V|L@U2r{4xBeP+K=2cFvMc*AuF%qb1$9o?L@Gd4D*4+*A|^vU_>gm4U7y zLw2ur*Cn{%E^VM!7_@lnHI&;twMVD=*(wmk;CJ2UK)1N0s>aSpb$%oQ zZRf|z&Q4>4X*UZ3?o@rhk*h#i%zw*1b{c{5wncJyY1IjkGOJR+8zE6`V}O2GZ83^L zV;^7e-t2v(4I7Yb$u$U{N&i%uoo*-d!YTfKv!W6F+^jX==$KY0`&0}ROH3Se*mfop z1(r_CoT3I-@mybU(MeXfgq?GqYZ{l|#>Oyz7cZ0W$VW6@IlI3T#86)J!*#s16bro` zdYNX_-MJNdTkQFB6_tB;(9tsL!ZxiCa$&uAO)Jo=99??NEwcZ3*rou$gkFD= zDH*}=-Qlc>;6fM`ap zd1{RfYJMS!?ul~8?EO+4d-KnRgj;3dQfg(iA(3^P)iaxW$1$@K{+p;9^%oL5QvHsb zrIQXDta?@#eHY(%Hnlh`u-3AZoh0J>ipOoD>r$bE210yQmapDIY8nD&j^k(2)gGG< z<<-qJ9;J&JD$L3`Hogvd`gtdySS%)r{=D3NlXqNjsUGoqql9d7&-L2}m|@vc@1(#Wd zl9rhHkfp*o)i-+sNwdWwCU>DGU&oFERlYnR7R*Km130WNQgAICf23AuQg>BF6f z6?^W}O7@rAimbxC8{5v0h8>CT*)ph#)9GhzVNO0aX)d{baM`pqTo`n(nkS@CEo%!! zR3=u^UwwV5AxJ=B8}6;zV{g*CQ`{e3K~_|?r4<4-;GJ&|GN-YB(!r7SESjF3#Qx>; zt=mx1Q>QTTPxovOVSU`m)+aAcZasY6Cf`t39)yJKvEXcgmiKFUcD@@Qv~PUOop z4Yzyc~3d#wc{*Zszj0Mizr5ho*>^^Z zc$bV>bG)yq;#EZ;k#MhI9*<1MO^5MYmI^RQw{mkF`FO9Cal4!ZfHkZD)Mvl6N zdJPuQmhOkT!}DKB!&}bzrkbPtnmMU6BmBDThsZeXiMTSd@40My@{{e8ZSA0_nhxKv zkkxc3s~gQzgCEq6;mS43_-fM0C4I6VmxpVac**2UloUP`vhC3!7®_6d7yy#<9Y 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 Date: Tue, 30 Apr 2024 13:24:15 -0400 Subject: [PATCH 21/34] DOC-9654 PR #118850 - server: enable continuous CPU profiler (#18492) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * (1) In automatic-cpu-profiler.md, (a) remove note and warnings, (b) update default values for server.cpu_profile.cpu_usage_combined_threshold and server.cpu_profile.interval, (c) removed recommended values column and section, (d) changed values in high-water mark threshold section to match default values, (e) removed mention to consult support. * Incorporated Aaditya’s feedback. * Incorporated Ryan’s feedback. --- src/current/v24.1/automatic-cpu-profiler.md | 52 ++++++--------------- 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/src/current/v24.1/automatic-cpu-profiler.md b/src/current/v24.1/automatic-cpu-profiler.md index abb173e88d5..1bdcde8af51 100644 --- a/src/current/v24.1/automatic-cpu-profiler.md +++ b/src/current/v24.1/automatic-cpu-profiler.md @@ -8,42 +8,28 @@ docs_area: manage This feature automatically captures CPU profiles, which can make it easier to investigate and troubleshoot spikes in CPU usage or erratic CPU load on certain nodes. A CPU profile shows the functions that use the most CPU time, sampled over a window of time. You can collect a CPU Profile manually on the [Advanced Debug page]({% link {{ page.version.version }}/ui-debug-pages.md %}). However, it may be difficult to manually capture a profile of a short CPU spike at the right point in time. Automatic CPU profile capture enables the investigation of CPU load in this and other cases, such as periodic high CPU. -{{site.data.alerts.callout_danger}} -We strongly recommend only using the Automatic CPU Profiler when working directly with the [Cockroach Labs support team]({% link {{ page.version.version }}/support-resources.md %}). -{{site.data.alerts.end}} - ## Configuration You can configure automatic CPU profile capture with the following [cluster settings]({% link {{ page.version.version }}/cluster-settings.md %}): -Cluster Setting | Description | Default Value | Recommended Value -----------------|-------------|---------------|------------------ -`server.cpu_profile.cpu_usage_combined_threshold` | The baseline value for when CPU profiles should be taken. Collect profiles from each node that meets threshold. This setting enables and disables automatic cpu profiling.

&PMheHvJDoce<}^RJ037Q?Zcp4{ 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