From a94a08e9c592778a97526f9966f7d37aba19472d Mon Sep 17 00:00:00 2001 From: yuanyuan zhang <111744220+michelle-0808@users.noreply.github.com> Date: Mon, 11 Nov 2024 17:10:53 +0800 Subject: [PATCH] docs: merge cn api docs and update descriptions for termination policy (#8414) --- ...e-and-connect-an-apecloud-mysql-cluster.md | 6 +- .../delete-mysql-cluster.md | 8 +- .../restart-mysql-cluster.md | 4 +- .../scale-for-apecloud-mysql.md | 2 +- .../configuration/configuration.md | 79 +-- .../high-availability/high-availability.md | 4 +- .../proxy/apecloud-mysql-proxy.md | 12 +- .../manage-elasticsearch.md | 77 ++- .../create-a-kafka-cluster.md | 2 +- .../delete-kafka-cluster.md | 12 +- .../cluster-management/scale.md | 2 +- .../configuration/configuration.md | 2 +- .../kubeblocks-for-milvus/manage-milvus.md | 75 ++- ...create-and-connect-to-a-mongodb-cluster.md | 6 +- .../delete-mongodb-cluster.md | 12 +- .../cluster-management/scale-for-mongodb.md | 2 +- .../create-and-connect-a-mysql-cluster.md | 8 +- .../delete-mysql-cluster.md | 6 +- .../cluster-management/scale-for-mysql.md | 2 +- .../configuration/configuration.md | 12 +- ...create-and-connect-a-postgresql-cluster.md | 6 +- .../delete-a-postgresql-cluster.md | 12 +- .../scale-for-a-postgresql-cluster.md | 2 +- .../configuration/configuration.md | 10 +- .../high-availability/high-availability.md | 4 +- .../postgresql-connection-pool.md | 4 +- .../delete-a-pulsar-cluster.md | 87 +++ .../cluster-management/scale-for-pulsar.md | 2 +- .../kubeblocks-for-qdrant/manage-qdrant.md | 77 ++- .../manage-rabbitmq.md | 77 ++- .../create-and-connect-a-redis-cluster.md | 6 +- .../delete-a-redis-cluster.md | 12 +- .../scale-for-a-redis-cluster.md | 2 +- .../configuration/configuration.md | 10 +- .../manage-starrocks.md | 77 ++- ...ilure_simulation_connect_cluster_after.png | Bin 204444 -> 239905 bytes ...re_simulation_connect_cluster_follower.png | Bin 45227 -> 108141 bytes .../failure_simulation_connect_three_pods.png | Bin 73183 -> 164569 bytes .../failure_simulation_connect_two_pods.png | Bin 74358 -> 164088 bytes ...failure_simulation_delete_follower_pod.png | Bin 9143 -> 12252 bytes .../img/failure_simulation_delete_pod.png | Bin 8737 -> 11628 bytes .../failure_simulation_delete_three_pods.png | Bin 16637 -> 25576 bytes .../failure_simulation_delete_two_pods.png | Bin 12811 -> 18272 bytes .../failure_simulation_describe_cluster.png | Bin 79241 -> 178615 bytes .../failure_simulation_describe_cluster_2.png | Bin 83201 -> 178872 bytes ...lure_simulation_describe_cluster_after.png | Bin 79422 -> 179583 bytes ...e_simulation_describe_cluster_follower.png | Bin 88460 -> 182239 bytes ...failure_simulation_describe_three_pods.png | Bin 79345 -> 178052 bytes .../failure_simulation_describe_two_pods.png | Bin 91365 -> 178242 bytes i18n/zh-cn/img/pgsql-ha-after.png | Bin 168784 -> 174323 bytes i18n/zh-cn/img/pgsql-ha-before.png | Bin 132261 -> 174210 bytes .../img/pgsql-ha-pg_stat_replication.png | Bin 49675 -> 52191 bytes .../install-with-helm/install-addons.md | 2 +- .../create-and-connect-a-mysql-cluster.md | 274 ++++++++- .../delete-mysql-cluster.md | 64 ++- .../cluster-management/expand-volume.md | 156 +++++- .../restart-mysql-cluster.md | 67 ++- .../scale-for-apecloud-mysql.md | 349 ++++++++++-- .../stop-start-a-cluster.md | 177 +++++- .../cluster-management/switchover.md | 101 +++- .../configuration/configuration.md | 344 +++++++++--- .../high-availability/high-availability.md | 285 ++++++++-- .../kubeblocks-for-apecloud-mysql.md | 2 + .../proxy/apecloud-mysql-proxy.md | 521 +++++++++++++++++- .../create-and-connect-a-mysql-cluster.md | 275 +++++++-- .../delete-mysql-cluster.md | 66 ++- .../cluster-management/expand-volume.md | 168 +++++- .../restart-mysql-cluster.md | 60 +- .../cluster-management/scale-for-mysql.md | 330 +++++++++-- .../stop-start-a-cluster.md | 151 ++++- .../cluster-management/switchover.md | 72 ++- .../configuration/configuration.md | 210 ++++++- .../high-availability/high-availability.md | 134 ++++- .../kubeblocks-for-mysql-community-edition.md | 2 + ...create-and-connect-a-postgresql-cluster.md | 276 ++++++++-- .../delete-a-postgresql-cluster.md | 59 +- .../cluster-management/expand-volume.md | 172 +++++- .../restart-a-postgresql-cluster.md | 65 ++- .../scale-for-a-postgresql-cluster.md | 356 ++++++++++-- .../start-stop-a-cluster.md | 144 ++++- .../cluster-management/switchover.md | 78 ++- .../configuration/configuration.md | 258 +++++++-- .../high-availability/high-availability.md | 134 ++++- .../kubeblocks-for-postgresql.md | 2 + .../postgresql-connection-pool.md | 98 +++- .../overview/kubernetes_and_operator_101.md | 4 +- 86 files changed, 5454 insertions(+), 723 deletions(-) create mode 100644 docs/user_docs/kubeblocks-for-pulsar/cluster-management/delete-a-pulsar-cluster.md diff --git a/docs/user_docs/kubeblocks-for-apecloud-mysql/cluster-management/create-and-connect-an-apecloud-mysql-cluster.md b/docs/user_docs/kubeblocks-for-apecloud-mysql/cluster-management/create-and-connect-an-apecloud-mysql-cluster.md index 9fc3d67e32b..fd05e9943c5 100644 --- a/docs/user_docs/kubeblocks-for-apecloud-mysql/cluster-management/create-and-connect-an-apecloud-mysql-cluster.md +++ b/docs/user_docs/kubeblocks-for-apecloud-mysql/cluster-management/create-and-connect-an-apecloud-mysql-cluster.md @@ -200,7 +200,7 @@ KubeBlocks supports creating two types of ApeCloud MySQL clusters: Standalone an |---------------------------------------|--------------------------------------| | `spec.clusterDefinitionRef` | It specifies the name of the ClusterDefinition for creating a specific type of cluster. | | `spec.clusterVersionRef` | It is the name of the cluster version CRD that defines the cluster version. | - | `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Halt`, `Delete`, `WipeOut`.
- `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location.
| + | `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Delete`, `WipeOut`. For the detailed definition, you can refer to [Termination Policy](./delete-mysql-cluster.md#termination-policy). | | `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. | | `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. | | `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. | @@ -264,11 +264,11 @@ KubeBlocks operator creates a new Secret called `mycluster-conn-credential` to s 1. Run the command below to get the `username` and `password` for the `kubectl exec` command. ```bash - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d > root - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d > 2gvztbvz ``` diff --git a/docs/user_docs/kubeblocks-for-apecloud-mysql/cluster-management/delete-mysql-cluster.md b/docs/user_docs/kubeblocks-for-apecloud-mysql/cluster-management/delete-mysql-cluster.md index bdbe4c35d6a..3777875c682 100644 --- a/docs/user_docs/kubeblocks-for-apecloud-mysql/cluster-management/delete-mysql-cluster.md +++ b/docs/user_docs/kubeblocks-for-apecloud-mysql/cluster-management/delete-mysql-cluster.md @@ -22,9 +22,9 @@ The termination policy determines how a cluster is deleted. | **terminationPolicy** | **Deleting Operation** | |:----------------------|:-------------------------------------------------| | `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | -| `Halt` | `Halt` deletes workload resources such as statefulset, deployment workloads but keep PVCs. | -| `Delete` | `Delete` deletes workload resources and PVCs but keep backups. | -| `WipeOut` | `WipeOut` deletes workload resources, PVCs and all relevant resources included backups. | +| `Halt` | `Halt` deletes Cluster resources like Pods and Services but retains Persistent Volume Claims (PVCs), allowing for data preservation while stopping other operations. Halt policy is deprecated in v0.9.1 and will have same meaning as DoNotTerminate. | +| `Delete` | `Delete` extends the Halt policy by also removing PVCs, leading to a thorough cleanup while removing all persistent data. | +| `WipeOut` | `WipeOut` deletes all Cluster resources, including volume snapshots and backups in external storage. This results in complete data removal and should be used cautiously, especially in non-production environments, to avoid irreversible data loss. | To check the termination policy, execute the following command. @@ -63,7 +63,7 @@ Run the command below to delete a specified cluster.- `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location. | +| `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Delete`, `WipeOut`. For the detailed definition, you can refer to [Termination Policy](#termination-policy). | | `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. | | `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. | | `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. | @@ -199,7 +199,7 @@ mycluster Delete R Horizontal scaling changes the amount of pods. For example, you can scale out replicas from three to five. -From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to [Horizontal Scale](./../../api_docs/maintenance/scale/horizontal-scale.md) in API docs for more details and examples. +From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to the [Horizontal Scale tutorial](./../maintenance/scale/horizontal-scale.md) for more details and examples.- `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location.
| + | `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Delete`, `WipeOut`. For the detailed definition, you can refer to [Termination Policy](./delete-kafka-cluster.md#termination-policy). | | `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. | | `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. | | `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. | diff --git a/docs/user_docs/kubeblocks-for-kafka/cluster-management/delete-kafka-cluster.md b/docs/user_docs/kubeblocks-for-kafka/cluster-management/delete-kafka-cluster.md index 30e889c1a45..56d172cc8f0 100644 --- a/docs/user_docs/kubeblocks-for-kafka/cluster-management/delete-kafka-cluster.md +++ b/docs/user_docs/kubeblocks-for-kafka/cluster-management/delete-kafka-cluster.md @@ -19,12 +19,12 @@ The termination policy determines how a cluster is deleted. Set the policy when ::: -| **terminationPolicy** | **Deleting Operation** | -|:-- | :-- | -| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | -| `Halt` | `Halt` deletes workload resources such as statefulset, deployment workloads but keep PVCs. | -| `Delete` | `Delete` deletes workload resources and PVCs but keep backups. | -| `WipeOut` | `WipeOut` deletes workload resources, PVCs and all relevant resources included backups. | +| **terminationPolicy** | **Deleting Operation** | +|:----------------------|:-------------------------------------------------| +| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | +| `Halt` | `Halt` deletes Cluster resources like Pods and Services but retains Persistent Volume Claims (PVCs), allowing for data preservation while stopping other operations. Halt policy is deprecated in v0.9.1 and will have same meaning as DoNotTerminate. | +| `Delete` | `Delete` extends the Halt policy by also removing PVCs, leading to a thorough cleanup while removing all persistent data. | +| `WipeOut` | `WipeOut` deletes all Cluster resources, including volume snapshots and backups in external storage. This results in complete data removal and should be used cautiously, especially in non-production environments, to avoid irreversible data loss. |- `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location. | +| `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Delete`, `WipeOut`. For the detailed definition, you can refer to [Termination Policy](#termination-policy). | | `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. | | `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. | | `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. | @@ -895,3 +895,76 @@ You can stop/start a cluster to save computing resources. When a cluster is stop- `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location.
| + | `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Delete`, `WipeOut`. For the detailed definition, you can refer to [Termination Policy](./delete-mongodb-cluster.md#termination-policy). | | `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. | | `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. | | `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. | @@ -242,11 +242,11 @@ KubeBlocks operator has created a new Secret called `mycluster-conn-credential` 1. Get the `username` and `password` to connect to this MongoDB cluster for the `kubectl exec` command. ```bash - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d > root - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d > 266zfqx5 ``` diff --git a/docs/user_docs/kubeblocks-for-mongodb/cluster-management/delete-mongodb-cluster.md b/docs/user_docs/kubeblocks-for-mongodb/cluster-management/delete-mongodb-cluster.md index 719bc360446..5ab324f4641 100644 --- a/docs/user_docs/kubeblocks-for-mongodb/cluster-management/delete-mongodb-cluster.md +++ b/docs/user_docs/kubeblocks-for-mongodb/cluster-management/delete-mongodb-cluster.md @@ -19,12 +19,12 @@ The termination policy determines how a cluster is deleted. Set the policy when ::: -| **terminationPolicy** | **Deleting Operation** | -|:-- | :-- | -| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | -| `Halt` | `Halt` deletes workload resources such as statefulset, deployment workloads but keep PVCs. | -| `Delete` | `Delete` deletes workload resources and PVCs but keep backups. | -| `WipeOut` | `WipeOut` deletes workload resources, PVCs and all relevant resources included backups. | +| **terminationPolicy** | **Deleting Operation** | +|:----------------------|:-------------------------------------------------| +| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | +| `Halt` | `Halt` deletes Cluster resources like Pods and Services but retains Persistent Volume Claims (PVCs), allowing for data preservation while stopping other operations. Halt policy is deprecated in v0.9.1 and will have same meaning as DoNotTerminate. | +| `Delete` | `Delete` extends the Halt policy by also removing PVCs, leading to a thorough cleanup while removing all persistent data. | +| `WipeOut` | `WipeOut` deletes all Cluster resources, including volume snapshots and backups in external storage. This results in complete data removal and should be used cautiously, especially in non-production environments, to avoid irreversible data loss. | To check the termination policy, execute the following command. diff --git a/docs/user_docs/kubeblocks-for-mongodb/cluster-management/scale-for-mongodb.md b/docs/user_docs/kubeblocks-for-mongodb/cluster-management/scale-for-mongodb.md index 48549c5139b..84b29fcf2ba 100644 --- a/docs/user_docs/kubeblocks-for-mongodb/cluster-management/scale-for-mongodb.md +++ b/docs/user_docs/kubeblocks-for-mongodb/cluster-management/scale-for-mongodb.md @@ -224,7 +224,7 @@ Vertical scaling does not synchronize parameters related to CPU and memory and i Horizontal scaling changes the amount of pods. For example, you can scale out replicas from three to five. -From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to [Horizontal Scale](./../../../api_docs/maintenance/scale/horizontal-scale.md) in API docs for more details and examples. +From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to the [Horizontal Scale tutorial](./../../maintenance/scale/horizontal-scale.md) for more details and examples. ### Before you start diff --git a/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/create-and-connect-a-mysql-cluster.md b/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/create-and-connect-a-mysql-cluster.md index f0c8ec1a3b2..e1b546c5e50 100644 --- a/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/create-and-connect-a-mysql-cluster.md +++ b/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/create-and-connect-a-mysql-cluster.md @@ -191,7 +191,7 @@ KubeBlocks supports creating two types of MySQL clusters: Standalone and Replica |---------------------------------------|--------------------------------------| | `spec.clusterDefinitionRef` | It specifies the name of the ClusterDefinition for creating a specific type of cluster. | | `spec.clusterVersionRef` | It is the name of the cluster version CRD that defines the cluster version. | - | `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Halt`, `Delete`, `WipeOut`.- `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location. | + | `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Delete`, `WipeOut`. For the detailed definition, you can refer to [Termination Policy](./delete-mysql-cluster.md#termination-policy). | | `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. | | `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. | | `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. | @@ -251,13 +251,13 @@ KubeBlocks operator creates a new Secret called `mycluster-conn-credential` to s 1. Run the command below to get the `username` and `password` for the `kubectl exec` command. ```bash - kubectl get secrets mycluster-conn-credential -n demo -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets mycluster-conn-credential -n demo -o jsonpath='{.data.username}' | base64 -d > root ``` ```bash - kubectl get secrets mycluster-conn-credential -n demo -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets mycluster-conn-credential -n demo -o jsonpath='{.data.password}' | base64 -d > b8wvrwlm ``` @@ -265,7 +265,7 @@ KubeBlocks operator creates a new Secret called `mycluster-conn-credential` to s 2. Exec into the Pod `mycluster-mysql-0` and connect to the database using username and password. ```bash - kubectl exec -ti mycluster-mysql-0 -- bash + kubectl exec -ti mycluster-mysql-0 -n demo -- bash mysql -u root -p b8wvrwlm ``` diff --git a/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/delete-mysql-cluster.md b/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/delete-mysql-cluster.md index eda84134077..b8b727b40c1 100644 --- a/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/delete-mysql-cluster.md +++ b/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/delete-mysql-cluster.md @@ -22,9 +22,9 @@ The termination policy determines how you delete a cluster. | **terminationPolicy** | **Deleting Operation** | |:----------------------|:-------------------------------------------------| | `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | -| `Halt` | `Halt` deletes workload resources such as statefulset, deployment workloads but keep PVCs. | -| `Delete` | `Delete` deletes workload resources and PVCs but keep backups. | -| `WipeOut` | `WipeOut` deletes workload resources, PVCs and all relevant resources included backups. | +| `Halt` | `Halt` deletes Cluster resources like Pods and Services but retains Persistent Volume Claims (PVCs), allowing for data preservation while stopping other operations. Halt policy is deprecated in v0.9.1 and will have same meaning as DoNotTerminate. | +| `Delete` | `Delete` extends the Halt policy by also removing PVCs, leading to a thorough cleanup while removing all persistent data. | +| `WipeOut` | `WipeOut` deletes all Cluster resources, including volume snapshots and backups in external storage. This results in complete data removal and should be used cautiously, especially in non-production environments, to avoid irreversible data loss. | To check the termination policy, execute the following command. diff --git a/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/scale-for-mysql.md b/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/scale-for-mysql.md index 660358fac4b..4b68ebf5613 100644 --- a/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/scale-for-mysql.md +++ b/docs/user_docs/kubeblocks-for-mysql-community-edition/cluster-management/scale-for-mysql.md @@ -197,7 +197,7 @@ mycluster mysql mysql-8.0.33 Delete Running 1 Horizontal scaling changes the amount of pods. For example, you can scale out replicas from three to five. -From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to [Horizontal Scale](./../../../api_docs/maintenance/scale/horizontal-scale.md) in API docs for more details and examples. +From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to the [Horizontal Scale tutorial](./../../maintenance/scale/horizontal-scale.md) for more details and examples. ### Before you start diff --git a/docs/user_docs/kubeblocks-for-mysql-community-edition/configuration/configuration.md b/docs/user_docs/kubeblocks-for-mysql-community-edition/configuration/configuration.md index 8f71ba2d778..526f2a5d4b3 100644 --- a/docs/user_docs/kubeblocks-for-mysql-community-edition/configuration/configuration.md +++ b/docs/user_docs/kubeblocks-for-mysql-community-edition/configuration/configuration.md @@ -176,7 +176,7 @@ The example below takes configuring `max_connections` and `innodb_buffer_pool_si 4. Connect to the database to verify whether the parameters are configured as expected. - The whole searching process has a 30-second delay since it takes some time for kubelet to synchronize modifications to the volume of the pod. + It takes about 30 seconds for the configuration to take effect because the kubelet requires some time to sync changes in the ConfigMap to the Pod's volume. ```bash kbcli cluster connect mycluster -n demo @@ -319,11 +319,11 @@ KubeBlocks supports configuring cluster parameters by editing its configuration 1. Get the username and password. ```bash - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d > root - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d > 2gvztbvz ``` @@ -398,7 +398,7 @@ KubeBlocks supports configuring cluster parameters with OpsRequest. 2. Apply the configuration opsRequest. ```bash - kubectl apply -f mycluster-configuring-demo.yaml + kubectl apply -f mycluster-configuring-demo.yaml -n demo ``` 3. Connect to this cluster to verify whether the configuration takes effect. @@ -406,11 +406,11 @@ KubeBlocks supports configuring cluster parameters with OpsRequest. 1. Get the username and password. ```bash - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d > root - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d > 2gvztbvz ``` diff --git a/docs/user_docs/kubeblocks-for-postgresql/cluster-management/create-and-connect-a-postgresql-cluster.md b/docs/user_docs/kubeblocks-for-postgresql/cluster-management/create-and-connect-a-postgresql-cluster.md index d08f1176744..a582d886d6a 100644 --- a/docs/user_docs/kubeblocks-for-postgresql/cluster-management/create-and-connect-a-postgresql-cluster.md +++ b/docs/user_docs/kubeblocks-for-postgresql/cluster-management/create-and-connect-a-postgresql-cluster.md @@ -197,7 +197,7 @@ KubeBlocks supports creating two types of PostgreSQL clusters: Standalone and Re |---------------------------------------|--------------------------------------| | `spec.clusterDefinitionRef` | It specifies the name of the ClusterDefinition for creating a specific type of cluster. | | `spec.clusterVersionRef` | It is the name of the cluster version CRD that defines the cluster version. | - | `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Halt`, `Delete`, `WipeOut`.- `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location. | + | `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Delete`, `WipeOut`. For the detailed definition, you can refer to [Termination Policy](./delete-a-postgresql-cluster.md#termination-policy). | | `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. | | `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. | | `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. | @@ -261,11 +261,11 @@ KubeBlocks operator has created a new Secret called `mycluster-conn-credential` 1. Run the command below to get the `username` and `password` for the `kubectl exec` command. ```bash - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d > postgres - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d > h62rg2kl ``` diff --git a/docs/user_docs/kubeblocks-for-postgresql/cluster-management/delete-a-postgresql-cluster.md b/docs/user_docs/kubeblocks-for-postgresql/cluster-management/delete-a-postgresql-cluster.md index a4133357ca3..56f7c239502 100644 --- a/docs/user_docs/kubeblocks-for-postgresql/cluster-management/delete-a-postgresql-cluster.md +++ b/docs/user_docs/kubeblocks-for-postgresql/cluster-management/delete-a-postgresql-cluster.md @@ -19,12 +19,12 @@ The termination policy determines how a cluster is deleted. ## Termination policy -| **terminationPolicy** | **Deleting Operation** | -|:----------------------|:-------------------------------------------------------------------------------------------| -| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | -| `Halt` | `Halt` deletes workload resources such as statefulset, deployment workloads but keep PVCs. | -| `Delete` | `Delete` deletes workload resources and PVCs but keep backups. | -| `WipeOut` | `WipeOut` deletes workload resources, PVCs and all relevant resources included backups. | +| **terminationPolicy** | **Deleting Operation** | +|:----------------------|:-------------------------------------------------| +| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | +| `Halt` | `Halt` deletes Cluster resources like Pods and Services but retains Persistent Volume Claims (PVCs), allowing for data preservation while stopping other operations. Halt policy is deprecated in v0.9.1 and will have same meaning as DoNotTerminate. | +| `Delete` | `Delete` extends the Halt policy by also removing PVCs, leading to a thorough cleanup while removing all persistent data. | +| `WipeOut` | `WipeOut` deletes all Cluster resources, including volume snapshots and backups in external storage. This results in complete data removal and should be used cautiously, especially in non-production environments, to avoid irreversible data loss. | To check the termination policy, execute the following command. diff --git a/docs/user_docs/kubeblocks-for-postgresql/cluster-management/scale-for-a-postgresql-cluster.md b/docs/user_docs/kubeblocks-for-postgresql/cluster-management/scale-for-a-postgresql-cluster.md index c8b1323c3b5..61c798d56f2 100644 --- a/docs/user_docs/kubeblocks-for-postgresql/cluster-management/scale-for-a-postgresql-cluster.md +++ b/docs/user_docs/kubeblocks-for-postgresql/cluster-management/scale-for-a-postgresql-cluster.md @@ -224,7 +224,7 @@ mycluster postgresql postgresql-14.8.0 Delete Runnin Horizontal scaling changes the amount of pods. For example, you can scale out replicas from three to five. -From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to [Horizontal Scale](./../../../api_docs/maintenance/scale/horizontal-scale.md) in API docs for more details and examples. +From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to the [Horizontal Scale tutorial](./../../maintenance/scale/horizontal-scale.md) for more details and examples. ### Before you start diff --git a/docs/user_docs/kubeblocks-for-postgresql/configuration/configuration.md b/docs/user_docs/kubeblocks-for-postgresql/configuration/configuration.md index b5df6728c33..56914888495 100644 --- a/docs/user_docs/kubeblocks-for-postgresql/configuration/configuration.md +++ b/docs/user_docs/kubeblocks-for-postgresql/configuration/configuration.md @@ -161,7 +161,7 @@ error: failed to validate updated config: [failed to cue template render configu 4. Connect to the database to verify whether the parameter is configured as expected. - The whole searching process has a 30-second delay since it takes some time for kubelet to synchronize modifications to the volume of the pod. + It takes about 30 seconds for the configuration to take effect because the kubelet requires some time to sync changes in the ConfigMap to the Pod's volume. ```bash kbcli cluster connect mycluster -n demo @@ -302,11 +302,11 @@ KubeBlocks supports configuring cluster parameters by editing its configuration 1. Get the username and password. ```bash - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d > root - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d > 2gvztbvz ``` @@ -385,11 +385,11 @@ Just in case you cannot find the configuration file of your cluster, you can swi 1. Get the username and password. ```bash - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d > postgres - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d > tf8fhsv2 ``` diff --git a/docs/user_docs/kubeblocks-for-postgresql/high-availability/high-availability.md b/docs/user_docs/kubeblocks-for-postgresql/high-availability/high-availability.md index 7390faae730..5b3380f1d3b 100644 --- a/docs/user_docs/kubeblocks-for-postgresql/high-availability/high-availability.md +++ b/docs/user_docs/kubeblocks-for-postgresql/high-availability/high-availability.md @@ -167,11 +167,11 @@ KubeBlocks integrates [the open-source Patroni solution](https://patroni.readthe 4. Connect to the PostgreSQL cluster to view the replication information. ```bash - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d > postgres - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d > shgkz4z9 diff --git a/docs/user_docs/kubeblocks-for-postgresql/postgresql-connection-pool/postgresql-connection-pool.md b/docs/user_docs/kubeblocks-for-postgresql/postgresql-connection-pool/postgresql-connection-pool.md index 0fcef81d7e5..d7993c5ed1d 100644 --- a/docs/user_docs/kubeblocks-for-postgresql/postgresql-connection-pool/postgresql-connection-pool.md +++ b/docs/user_docs/kubeblocks-for-postgresql/postgresql-connection-pool/postgresql-connection-pool.md @@ -119,11 +119,11 @@ When creating a PostgreSQL cluster with KubeBlocks, PgBouncer is installed by de 3. Run the command below to get the `username` and `password` for the `kubectl exec` command. ```bash - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d > postgres - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d > shgkz4z9 ``` diff --git a/docs/user_docs/kubeblocks-for-pulsar/cluster-management/delete-a-pulsar-cluster.md b/docs/user_docs/kubeblocks-for-pulsar/cluster-management/delete-a-pulsar-cluster.md new file mode 100644 index 00000000000..c4b371280a0 --- /dev/null +++ b/docs/user_docs/kubeblocks-for-pulsar/cluster-management/delete-a-pulsar-cluster.md @@ -0,0 +1,87 @@ +--- +title: Delete a PostgreSQL Cluster +description: How to delete a PostgreSQL Cluster +keywords: [postgresql, delete a cluster] +sidebar_position: 7 +sidebar_label: Delete protection +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Delete a Pulsar Cluster + +:::note + +The termination policy determines how a cluster is deleted. + +::: + +## Termination policy + +| **terminationPolicy** | **Deleting Operation** | +|:----------------------|:-------------------------------------------------| +| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | +| `Halt` | `Halt` deletes Cluster resources like Pods and Services but retains Persistent Volume Claims (PVCs), allowing for data preservation while stopping other operations. Halt policy is deprecated in v0.9.1 and will have same meaning as DoNotTerminate. | +| `Delete` | `Delete` extends the Halt policy by also removing PVCs, leading to a thorough cleanup while removing all persistent data. | +| `WipeOut` | `WipeOut` deletes all Cluster resources, including volume snapshots and backups in external storage. This results in complete data removal and should be used cautiously, especially in non-production environments, to avoid irreversible data loss. | + +To check the termination policy, execute the following command. + +- `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location. | +| `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Delete`, `WipeOut`. For the detailed definition, you can refer to [Termination Policy](#termination-policy). | | `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. | | `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. | | `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. | @@ -226,7 +226,7 @@ The scaling function for Qdrant is also supported. Horizontal scaling changes the amount of pods. For example, you can scale out replicas from three to five. -From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to [Horizontal Scale](./../../api_docs/maintenance/scale/horizontal-scale.md) in API docs for more details and examples. +From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to the [Horizontal Scale tutorial](./../maintenance/scale/horizontal-scale.md) for more details and examples. #### Before you start @@ -967,6 +967,79 @@ You can stop/start a cluster to save computing resources. When a cluster is stop +## Delete a cluster + +### Termination policy + +:::note + +The termination policy determines how a cluster is deleted. + +::: + +| **terminationPolicy** | **Deleting Operation** | +|:----------------------|:-------------------------------------------------| +| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | +| `Halt` | `Halt` deletes Cluster resources like Pods and Services but retains Persistent Volume Claims (PVCs), allowing for data preservation while stopping other operations. Halt policy is deprecated in v0.9.1 and will have same meaning as DoNotTerminate. | +| `Delete` | `Delete` extends the Halt policy by also removing PVCs, leading to a thorough cleanup while removing all persistent data. | +| `WipeOut` | `WipeOut` deletes all Cluster resources, including volume snapshots and backups in external storage. This results in complete data removal and should be used cautiously, especially in non-production environments, to avoid irreversible data loss. | + +To check the termination policy, execute the following command. + +- `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location. | +| `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Delete`, `WipeOut`. For the detailed definition, you can refer to [Termination Policy](#termination-policy). | | `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. | | `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. | | `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. | @@ -196,7 +196,7 @@ mycluster Delete Running Horizontal scaling changes the amount of pods. For example, you can scale out replicas from three to five. -From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to [Horizontal Scale](./../../api_docs/maintenance/scale/horizontal-scale.md) in API docs for more details and examples. +From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to the [Horizontal Scale tutorial](./../maintenance/scale/horizontal-scale.md) for more details and examples. Before you start, check whether the cluster status is `Running`. Otherwise, the following operations may fail. @@ -529,6 +529,79 @@ spec: services: ``` +## Delete a cluster + +### Termination policy + +:::note + +The termination policy determines how a cluster is deleted. + +::: + +| **terminationPolicy** | **Deleting Operation** | +|:----------------------|:-------------------------------------------------| +| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | +| `Halt` | `Halt` deletes Cluster resources like Pods and Services but retains Persistent Volume Claims (PVCs), allowing for data preservation while stopping other operations. Halt policy is deprecated in v0.9.1 and will have same meaning as DoNotTerminate. | +| `Delete` | `Delete` extends the Halt policy by also removing PVCs, leading to a thorough cleanup while removing all persistent data. | +| `WipeOut` | `WipeOut` deletes all Cluster resources, including volume snapshots and backups in external storage. This results in complete data removal and should be used cautiously, especially in non-production environments, to avoid irreversible data loss. | + +To check the termination policy, execute the following command. + +- `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location. | +| `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Delete`, `WipeOut`. For the detailed definition, you can refer to [Termination Policy](./delete-a-redis-cluster.md#termination-policy). | | `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. | | `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. | | `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. | @@ -235,11 +235,11 @@ KubeBlocks operator has created a new Secret called `mycluster-conn-credential` 1. Get the `username` and `password` for the `kubectl exec` command. ```bash - kubectl get secrets -n demo mycluster-redis-account-default -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-redis-account-default -o jsonpath='{.data.username}' | base64 -d > default - kubectl get secrets -n demo mycluster-redis-account-default -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-redis-account-default -o jsonpath='{.data.password}' | base64 -d > 5bv7czc4 ``` diff --git a/docs/user_docs/kubeblocks-for-redis/cluster-management/delete-a-redis-cluster.md b/docs/user_docs/kubeblocks-for-redis/cluster-management/delete-a-redis-cluster.md index eae925796b5..d767dd584d0 100644 --- a/docs/user_docs/kubeblocks-for-redis/cluster-management/delete-a-redis-cluster.md +++ b/docs/user_docs/kubeblocks-for-redis/cluster-management/delete-a-redis-cluster.md @@ -19,12 +19,12 @@ The termination policy determines how a cluster is deleted. ::: -| **terminationPolicy** | **Deleting Operation** | -|:-- | :-- | -| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | -| `Halt` | `Halt` deletes workload resources such as statefulset, deployment workloads but keep PVCs. | -| `Delete` | `Delete` deletes workload resources and PVCs but keep backups. | -| `WipeOut` | `WipeOut` deletes workload resources, PVCs and all relevant resources included backups. | +| **terminationPolicy** | **Deleting Operation** | +|:----------------------|:-------------------------------------------------| +| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | +| `Halt` | `Halt` deletes Cluster resources like Pods and Services but retains Persistent Volume Claims (PVCs), allowing for data preservation while stopping other operations. Halt policy is deprecated in v0.9.1 and will have same meaning as DoNotTerminate. | +| `Delete` | `Delete` extends the Halt policy by also removing PVCs, leading to a thorough cleanup while removing all persistent data. | +| `WipeOut` | `WipeOut` deletes all Cluster resources, including volume snapshots and backups in external storage. This results in complete data removal and should be used cautiously, especially in non-production environments, to avoid irreversible data loss. | To check the termination policy, execute the following command. diff --git a/docs/user_docs/kubeblocks-for-redis/cluster-management/scale-for-a-redis-cluster.md b/docs/user_docs/kubeblocks-for-redis/cluster-management/scale-for-a-redis-cluster.md index 8712ce60670..ea51cca623e 100644 --- a/docs/user_docs/kubeblocks-for-redis/cluster-management/scale-for-a-redis-cluster.md +++ b/docs/user_docs/kubeblocks-for-redis/cluster-management/scale-for-a-redis-cluster.md @@ -197,7 +197,7 @@ mycluster redis Delete Running Horizontal scaling changes the amount of pods. For example, you can scale out replicas from three to five. -From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to [Horizontal Scale](./../../../api_docs/maintenance/scale/horizontal-scale.md) in API docs for more details and examples. +From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to the [Horizontal Scale tutorial](./../../maintenance/scale/horizontal-scale.md) for more details and examples. ### Before you start diff --git a/docs/user_docs/kubeblocks-for-redis/configuration/configuration.md b/docs/user_docs/kubeblocks-for-redis/configuration/configuration.md index 3cdbbaa721a..317acf51b9f 100644 --- a/docs/user_docs/kubeblocks-for-redis/configuration/configuration.md +++ b/docs/user_docs/kubeblocks-for-redis/configuration/configuration.md @@ -153,7 +153,7 @@ The example below configures `acllog-max-len`. 4. Connect to the database to verify whether the parameter is configured as expected. - The whole searching process has a 30-second delay since it takes some time for kubelet to synchronize modifications to the volume of the pod. + It takes about 30 seconds for the configuration to take effect because the kubelet requires some time to sync changes in the ConfigMap to the Pod's volume. ```bash kbcli cluster connect mycluster -n demo @@ -280,11 +280,11 @@ maxclients 20000 40000 1. Get the username and password. ```bash - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d > default - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d > kpz77mcs ``` @@ -360,11 +360,11 @@ Just in case you cannot find the configuration file of your cluster, you can swi 1. Get the username and password. ```bash - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.username}' | base64 -d > default - kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d + kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.password}' | base64 -d > kpz77mcs ``` diff --git a/docs/user_docs/kubeblocks-for-starrocks/manage-starrocks.md b/docs/user_docs/kubeblocks-for-starrocks/manage-starrocks.md index 587db6410e7..3475270d334 100644 --- a/docs/user_docs/kubeblocks-for-starrocks/manage-starrocks.md +++ b/docs/user_docs/kubeblocks-for-starrocks/manage-starrocks.md @@ -160,7 +160,7 @@ EOF |---------------------------------------|--------------------------------------| | `spec.clusterDefinitionRef` | It specifies the name of the ClusterDefinition for creating a specific type of cluster. | | `spec.clusterVersionRef` | It is the name of the cluster version CRD that defines the cluster version. | -| `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Halt`, `Delete`, `WipeOut`.- `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location. | +| `spec.terminationPolicy` | It is the policy of cluster termination. The default value is `Delete`. Valid values are `DoNotTerminate`, `Delete`, `WipeOut`. For the detailed definition, you can refer to [Termination Policy](#termination-policy). | | `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. | | `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. | | `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. | @@ -353,7 +353,7 @@ mycluster starrocks starrocks-3.1.1 Delete Running Horizontal scaling changes the amount of pods. For example, you can scale out replicas from three to five. -From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to [Horizontal Scale](./../../api_docs/maintenance/scale/horizontal-scale.md) in API docs for more details and examples. +From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to the [Horizontal Scale tutorial](./../maintenance/scale/horizontal-scale.md) for more details and examples. #### Before you start @@ -926,3 +926,76 @@ You can stop/start a cluster to save computing resources. When a cluster is stop + +## Delete a cluster + +### Termination policy + +:::note + +The termination policy determines how a cluster is deleted. + +::: + +| **terminationPolicy** | **Deleting Operation** | +|:----------------------|:-------------------------------------------------| +| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. | +| `Halt` | `Halt` deletes Cluster resources like Pods and Services but retains Persistent Volume Claims (PVCs), allowing for data preservation while stopping other operations. Halt policy is deprecated in v0.9.1 and will have same meaning as DoNotTerminate. | +| `Delete` | `Delete` extends the Halt policy by also removing PVCs, leading to a thorough cleanup while removing all persistent data. | +| `WipeOut` | `WipeOut` deletes all Cluster resources, including volume snapshots and backups in external storage. This results in complete data removal and should be used cautiously, especially in non-production environments, to avoid irreversible data loss. | + +To check the termination policy, execute the following command. + +kmT$Q#%kUs)wVjx8jOLuFe< zA`CBd?2d=m?tNNINf{2Zx_|$E-ZIiLGma{zzdS6OzPFYQ=Axz64>+S7ukPRaAvyVx zv$OMBGsR;K@l%*e{rXYLBx21AVdn17 za^@dDe&oV@iM#&UAy((GR_0!_4-M9F7x(k(*X%AVLSOQI_3`6o7)U}EgU^aB8ydWC zYya(#dGvMx6E=M|=E%>_|CXpNWj@@r$vAU@k`RO6NcpH7)MzOGKDe(Z)8gZ4Q3F7# z?AdM_uV#s!?rsu^Xjw`c_E*Nlro1NU4f=^&Tl@Wc#_ w^=avl>xfXcBD!zT8hbq4=TH(>ul=+SPhwFWQOnA;g&RGwDx#^Uo `J+TW}8h27iv_T4+00vGzv*6OzxJ~*hXl&F$p0ci3+cQ|n4d+)_pmc|?pIV^j1 zX Q0ELbQf4x_#78&*qi_s^9bCQdSGB6KUCE2 zp;d>yk{&?po8vi;XQQ-w;3^ypWpq2e(|oAm0&rSfIxXB0{fT?m7D`x%+evmTzf=X) zY9Dr* I5nd=t8adz6nq_6R+a2JB|jJ$w5{P%yjT4KaXTa1n3+gyrx?Kv{z} zs)gqzLj?|xAp8Q>{>T4Gt@yO_tII@OmJJbRfD}`Lr@(t7e~oH}<%KLU=<*9QEX-_W ze`Nv2T(YvVvNLwaDEu$?Q?#c2-sA-WMn92`NOf2euBoYc^5lu;z#ZRpFv& T2ko1 zMpXv9+$J-9KFMLtMI9y_JYc9|+NyxVYNud85#l*K07}@-U0q#5raxS-+D>!(a7=Um z)j{TK7eb8iCM14i#r8}a7Uy__bjOu!ebck}8M=5WANKt`JS9Hj%dU;;c622^98@GP zo}W<@Nr{Ok;bW8f7xSOF#)c(M*kW)0hLSJ>O}-_sy`re72@Hg4;pF8-2T7eeP1R`N z&L-crYpJN-ph*6uSHG{j*RYL)Bf*SAt4CyPR~*Lz!_J!CAEkcD%W*_KXw9-?Bmtwm zHrtMi=lP$DC)e5)8`K|M3vuCHUQ3)iw+;^4Md111U{?I4!RIN7lT%Zt@pV}Lz9AuA_ laU7KgWlfWg#U8>yj!Iq{Fa+Xn4d{U%**(^ zICx2%?tqos=~b{wND?L{eBh=e#gavAL)@_*2qr>~%OX(44hzfs$MY2XJD+;( $n~4vnN(Piv{=fl)irSrG@phv=0*!cyOsM0BKu#<&N1e>{9q7F0-+= zLs(e&)J|WLQ*oAGv~v1VG_SgWcBW2dgA~Xekn%=SF4*-4`vpq{UHN_5qr1py@(sOR zzs%6*^~EmKdrJe15m*tP!2=i)M6-QF!`Se$@v+u`<@ dD z>Ck98QB$t0ETf)lLVRX%PQ;cfZk0MZWwukHdS4js54u?qD1%@_wEz1-H+N^})o|Pd zzQ3SeU??kD&oIsXy(vM2eM#CL%YrkYY{$A)P$8m{Lzkr6niBp>Pxz{@PC#+#8XBS@ z33C(<_&LCUhHaWW|9bmHQSB NT=@)vEC^$Cd35I6F)Cg*}A-58i}ELGx<9 z%lC40;c#;j!9Bdp(X1YFuIq13+J{@NQyJ_AWlEoQvVdN^?wnHXWR >B_z5be7<1g$T3`Rb^jL>abCT|mO%Y3g|Do$z5SAe~comyQ zTy}%ys0kHg?{RND-G+Fz_sRDlU?9C@8#e&SHSu;m7sP$2RQS8)p`zPi-86m~!bLyv z_m6xo2FTP?LKr|f4e2p4T(Q@ZC}sQ)ZnC+WZZX=*yz8u|gq~hhCHdu1!+aD%3MNN~ z+zzrC&^3$U#;6R3y}NhUeP;)sD^qE4&i?=C(WeUc)IcXEs_ji39il2XDDRt2X9`C; z<(#y1J_O0}Uu8T)tvXZv)z-^%eG`QD0?~nGh}aH?tR9`ZkEj7DD!U!b$a-aIW)mah zyG``i(B8hgq}(e5_6$Kl-?(}61Kj(lg%2*wc50r y;enOEx6V3EVm%3_XItFS5Zxo1hQQqRrlBORfLL)c2mRa>&J`eF~y0g+yP+6p*MG zmI+$dZ&hq7H5yY_c@Y1gp{LuV*66MZa_|@B$3M)_@~wZB?&CB2DN80vB4-AEnO{`2 zmcxE(lfzsuBY7GRvjnW{TY`qTSLv#z1V!zf%U( t2Ikm*;K0d+>5=LTD`VLg0_%ZfiXN<`F^~NG z`Lh(n9)Qv(P DuX+pg!yntIxh?dRt=fz8(F_ !CCm9eogcsik4-8DC_6MCH3 z%gD^^hME@+ac%#hLq&iOcSpVp5}g8OISc(IFH!MV=?;;Rk@ Pz}cbnEM8FT_QOXub$-&W|Y_5%$#LQ&L BE*!}(r+@%PK$=2z%8>GF8imiC z-C@1Ls#%4t1rdXAr3ujt+z86Vw@e!|KXpc#f$BFd^L-H6^3k$>@NW)E5 s%eQOADA1lKIpdy(hl^`eB-8+xhi{ph5W&?ck>Q1Jh#H z?#u~3w)}LXfRb>E2zJzwZBK0U!H|^Kyp;yp!3k_Vnfg#_Ry#FJ#u2$6l(Z7q$-YmY zhA&gyfs#VbHQ+O84_r8B)*i6E;M+Y=#%@&W(-IO+wj6OP$(M72fHaL*R{vPFYSl$W z#kYJy@qC}IPje3|k*2xRMU0lD)gZQb!Wrn!bEX<}3{P-dayJ@QVv+xw*VZxh3yy!U zsJO6XW@HrKe&TatVqU6A4>}BCYXfBw1eG*SR48 sY=PMI*mJUL`fA6rWe&nQJ*(?~J!1sb|`-KmPIMA{RZA5&fMvq=AEj_(Exlz5~ z*#U(op`qS{Uk;_7>4fD$FdaUNK}A|N;jOrACC430xbNX8LxkcXY&9C2v 2uWl_Ua@uP)V~Al*Kk}OnnyG!N=&XU%w7yxSI4EX|u7h@j-V5GQbTc z#7L+dM}lOvCBg!Qc&5c_T4#E-+)CdK+UQnXGd^K8N=t(BE+H#R3#sKIw8r*P0G&a@ z?J^m+a`GM4YUcd Sg``thhjU5H``@Gex6-ekc?K; z0uNK^{rr!R44Iqy&;fucWCKc|$RwzP-H8sjXKlwiiMg6~%<%hG(#5M+uMWMZ=U|WB zJ8dfsA$ES?9g=Is2+9#1-MNyEcX1JsyNxU?)Df4Xt(Mj}!M`G60;mtiqC{O8wr+hW zYB#NkwL@~k*8Zedy{fvpnh14Xx^g9AdFOd@`q#<6Ds6N&0(oxUvc*EoTB$-O$)xA3 z*Zo&o2_9)dNe-(b56loTG}H;mBk?oVT0t4vt_P?{fqdGOXtPAt7vYuL_SIASkE5A| zIxgD~Z5O0(Z%0nr!Y;F!TCJ)C)Hg!9A?22oNZBU{px^I*{*|(nyC>PmvoW1d{n!Q+ z*+29?tFd;&@gBG6u;SL=E49v>h+~{|rrfc6cVX00;HsWXBhSfnzRH(pq4?K{H?mrb zBFcp5@C_7-LAzmG=T2VUi`t#Zf2>cH&@IIBq;nLc`f^4}>J9wuxw$!4clT4))
zKqLkgO 5j2od#EO6AW{w5l^5{%+a|ZSRj7^;SJ^F+s_+J>&w~FbwVyi zEL1rzBk}Q^K1eoFUB}os!QqwiB-w}yx|^;Q#Louh#=nw5bxFb^T#Ed>i`cI$8q4)> zZ6&tDSYdx %ob>cCRfGgn6G8w2pTNl^}>H{m`)GGjSt3>v*|!-lh0t~~G0`}#OE zEO1_*cp=wx(33c_V2iVlkI!;Yf>g!iW&36#fAKr?Q^{<8MPJxr@F9w_mj(Qq{@Qo+ z@TWl81RAc%WC-dm30z4V>&Vd q-3$aob6poSY<5 zo%3K*LLIR0QKGNY-f++10A?W|Bw_=LLmDeJbM_t}iH2AcN`F6jqOJEN4_>i>5%MS_ zBcq+ZO)=?G<8(}tOCwg8KHc{hPy;I)Lq(BNk{EH$6JMUy&Z E+ZtqSBM# z6&3+@o*60lHc7K#1Er?&QfxCj;?p`8?KTd9BnWF5rrj#@x2=T%wh=*YK+;0Hv8;FM z$24 72nes8N*$Y`~-d`*lGHpbpwUzWB0~m8${y zN&c_gQH1_}LJIs)Ogvt5JYMW>e)aA7trIGOelf?pAOD5iu7$JJN9Z&Q7`Lk~$rt )yLFr`SznF5fZah)!H;uYa(1O0`NR30zWu7Y z=Y;F;H2!wn{N4WyCb95amEAmotD$h}zyHZA2r`CK4psZmWwVgmb})oBAi@x(h48L9 zR%WS?S>A-a3MADoLSjViATpSKnf`46ITCI3dP7?Mb8c~AG0g(BhV;czBbkZ`^l@bn zZ#He&;(S;wotS<=I2w12pt}?jOSfeh3~qn^85bj_lGT(dc2Ph z(QwAIDvo5uJBl0;gfz~geBJTpegk3g-`L@g{TS!Yk=}mz=54K^cTEd76MJ>tEENM@ z+%lW|dBJa3;oxt$z}!c7qn{ib6O#{3wi 2SXas~yr=JJk z{`CC)(2j;N9#(aNdV~&AmsEn-!dCb*ry*ZJ7U=5fdBg4$@bV>%6R>qtLVvNtqb2tp zo^uPY5ePqb;liV&B>rp!O>L2o9ab{GkyB$m&+w-K5?*{N;eI1CGxK1x72K#P2fAkP z-i=$gzIEu2lc}(P-cf6i6B)^}c*yr0uU6qYpoy%S1AoS-J_>6L=)_@!g)pu|drt+t z7-A0 fNMsWXA42$jNHBP6Zy6HG+l;Qzmsl+Mxw_we{PcU^8wZu} z)}*AQiseBK$)U0WeexkH`|lYpE-vS*DmFLPsuoU5Md~^J98aD4?Ahqq_*gUZDBG2C z>)9~X?GOIiU4khKYFC;eGqS5L!R1A5r<{=W1;F)0(jbZ|FXG+19yGwSNUV2`jrl+pBy*ma=B9IA zLS>Zvpixa&L-+xLlE57;00?`dB>ab_# z!-AvwtftDFN1ICk-yw z6mN`4H$1l_Vl~Q2G8xIcteBLH@tSaK%5&$=kw}< eI?YFhXg)WuhT zD5OE2na8nV4a%ch%qkk}k@Cmu8rw6>2OcP?+pKjO_`dK)_KxFC_i0^khk27hV`ieo z i{(N3WW;F?>VO~dvM%JNk zvwvV3LBW*y<|j=FdbVIj-{RFy5UK`}Ot$Z|bHcrrzP_pbTi^_Ghs1M#km{KPxgY|h zSvo-gL8vt(k%_`B$=Q^L#l+Z2cL(bZK;)C^7!FjFlk=Xx(EufhRyqU7f>h5>FNz lvoc*DI1VhKG7dew}Iu9m|@5hDd@pL}Q`zIx%AOc^(93DA1tPm(0i#4U_; zzmPK#ZEzZ-dQR`ix0!{-9nd?<(YWSxLTUd{L`)cvjcsGqi;)}1HSR5yl00EO&WXe+ ziL_;}ERimIt;m<880Hi$~gFt!Q 6V*Gf zO8WQ_!k4&StkvDS5>PEDNa!0^t3J^L9;>`wX8*qFUJPYcQE_p8ULJ*%H|r&1NBG^4 z;luHWkp`_};%xliVD)vP#@tIqt|H{QC`d#O91iT1T$#feh<8hHVgC3CFL~6yI$;Ki zJ=Xs!5;0u~4 (7v=!A z;Rc &Er1A~2zi$D?KZa-oc;AMDXD;eWaZ=@ zLuyqHaq@d71(0Ervv zYE|x#w4r^PA-#wFv&qQ8vWnef0`Vp^hhiU&1i2P$CD2i1&NQ(k=uB>Jt9~s>bq5y! zeX;;7NjBRtamlx7TFLMD{D4$ejy+RP^3md|kap6Fz-XT$=g%WQQc@^TDNkulB bwMO5mg2Cldo_22vM2Ls@!WU5N~H`8 z0SR9P-iTYs1A@py1;#ZtrJB4c7B(xkF-S9Jcv*#{62gJM5y|}V{Uq#ODgrvepyGTk zovgET=irDxQObWyTe*#mN^H<^Td3SlUmohaF|70{QKLHH@1TKgFq1&Yc`yx#h>ubX zTL`AxlxDW?$dM!9{BCd_!U@9>lYVc{`;ka^7kLlX!W=)0mH68f!F $c!Y0L^09xI{?wwM@;o0y3ya3aSW@PNH&5T4agdQA mXl32zQpoUv8RM6k@**GrYy?|oHJTn`c7e+r@Gi{RE=WS3Z zF_5&HSoPP9vm&hQKD;H~51RJ<`}avsP(JF@ mIN7kuZ1N%b11R@d_j*L!A>cp+DWXe{C> zTwIE%1?G0;$yuy<)% (8gx5f_p88+Lg{`*)P zfKjX(4s#JvBK>9#fA0{!PjArK5xHQNAj>`kskAWaNYa(}3S*#tRMgI5{D5xPUs-@F zjK67PvUc!FOQy}_2kQx~HEY&rHh;W@9kPoMc7TK4Ajyu|(y)8K) 2djSc^%<~Qp>7k|O_E-@EVY2QWf^el@BPCiI2N?B z(6Q2xHUe#g7n2NLw}zFP5=f6{{`OIPwm4I&2l)GI4c0|7VP 61-Yu z5TVZLy*& !30yc!l*NO zcypvy{{*p{j #dQcTw4@IS+yV7w=lu3pu`&FpW_I)QYHAbb3( zi&fp@y#X5Gv9Yp!Vjy(Ha)Vt+c%M+=Nc9OEvggmAgxia1Kq6u46vnJzY3`XsGXEbz z&X^=ol+e=t#UOXib+d5ICMr*ibrJ)vc&i~T+iQ&sOf4)Py?_6Hex|%!HqP+r)2GC& zEHc8#`mQ2 93jN<7hi;DA+6^89U^7ZPLTK?$l zbV7uLXzhFU>{0%tcPUFBvF!Ut4Zln5^vx|UCWcb-jB}P6IOq8PF7hiQ(2kjoo9-4{ zSu}&^cY_%7v>=KgzwQQzkMaC*(cPJ1vNj!D)3$?ta(_TWq#jt0o1QjMQ&D*_PbW@K z|3o29H%H6%cReR4ajhmq*)y_#iyBixzN9F}!L@7%7`Xr8U13a~2;yO+BNa+!oIb1v z5UMp&Qc}Q>uReUZcqe=NGoVx=fQlJSa7|TAqXCE`ju3k+PW7 !L;TOK2sT|a(293H*{!8t4MmyQvHTg=N5 zX@D03`VXMc5_4TB%eG?$Plg7DhCJY_sb=3xYiN9YbPXT5HgH-~4w4U1N5J0sFvaer zbgZEy(9&QX^uC9W9(Cb%5*%boPIq*Ey|R3o$DYV+*F#kBH;^Nz{Nt>F%T?9_$SZ&W z$@P_=YKX#|G;+~J=!*tRrcH{4Q&L(j8W(;JzT@a!-lmxuPv4Wgx7eW8#N52lae0!% z+SZnce5@?wtaw0{JlfA!R41P}Q=0r-L$bG)2|;U+u~Vw5tk{p(AGg_L=XhZS9=x7H zizs|<##pw;N=duDi`12$D=Ut2wx>APA6k2E|BkwgZx5U~y@qC^`~LKlGn-=9#jaJI zP1U4$xOO^Rc{+(>>9G3)*PY?9t~<~9adCdoa@BMqQJm*|a_UHq_^+4Rr}mbX2bIch zR`(ea4*2ox_)J=rea_gH$ _yRv4E*uchu=%qJzIi3lW(t=NCcje7NPa z4@4!QMQURcIRFA!VY^4ZC+~v6>Vz2j5#37G?75%Y--#KZovxvz`~_{-@8!$un~E&l z=HrAUM~arV_9f7 !@S*azoEb1^t5s8oDqP9A#OXwl{Kw<4x@c8d-= zcGD&^5^+ODfY|(!65`wf47O&fy}ivXDjHJ4Zs&>GY=)e*LKq}I84N4nIcQ?o9E1O9 zY0rK}b-44_sf);%WY5>6?!0_%q$o)sUQuI|N$Ia>T)g16+`*AkuC79F@OX(+0X&NG zQC^EN84eoq%QErp)0o(iJ-ob65IT!jP0NRdnx)3-OMU6uLYSi5^W?1k>N2-(Br1PU z;ciSAd!F1O-K%)5#iKh@^}Rs+xhqQe@8Z8R arA;mm*io&Q%albzd c}JdRM>o z+rF#+cw?s=yoY~`jme|JxW|=MRP4dyhNwe*ps5}q(YeX66 mTH zZu4UkjFYn{5bj>u+*e~Y5lc}&s7C&ATYU2jf$xzA{{e_1GTo%Tf#cnRZrI=%)mu6u zHD>SsiV^?u@3|d#J}6ILFahSVhpA=R9;-WhVf2L9+>b5Tke}TT>>;A92myQnN+Z}0 zBmf+p;SL0jy}>n{*?T~^=Q{52_{_{cA)%(Oo|gjpr(l0U`{}_YFkCwAf}*mSom~!* ztj4dM7ur+l0U9Ye4 k|?oB*a?<>+smR!_wb250s?i>v!;jY zbZ@zZdD}uu2F=^a!{dVn{WLgO7UN66l{14vSKHERd}1~yE#+-l+Rw@9gc71)QgVGJ z;bTdFL4=x25idXcK-!i6T!(L;NV+wiG3>|=0Uf>g<}BS{L!1oq^j57VRLHdV7BOo4 zfXZNMw*v&R5(hYyR#yH5)V&3)U6ew#W=-l+us0ynCOn2C4i4mcrGeUaJ_=!k7JwK= zIjHfE=hreKo*Wx30K;X5T-)KW5GPfs)Epva&*B7T$ux9lrSj|7ZX9u=ejwm;lLrr! z%A|r44I1*b=iPm-n|2{U){Tq{y1qAR>b92AIFs0Pvt*7ddvq2gZ;eW|XFA3(M#q `fM($ek|W;n_~AyW1=2rE*{&vCBFw~_Vs2zH+!VP5R2+gk%C z9PaWtRK9Qve8^%fhb%Qu>0N-pPKb_chm3Tb@pCESi>dm03n@B@8~H!#&l|lmkv)A{ zq+s~J?WpOFJtGeRdXIo}A%hxqEorahV_FlbG+OBKgqq+42PK`Hbmr}^4;A0;@LXz2 zxxo5vK2`)9&dtY%ijW%A4|}<~qOP(3V*n(za)3Eu ICt-U zh()w<+qSE(Z_&}w?b)&8KAH#k&^bA|!&VK@=k~)P2P5wR@ki#$5B`UiIJPp}(GMzd zi+B&k^DxJ1AT7y-iB%vf#%+GK8CQw}4KTsS$ BEEU1_UHfVCzza zX|GMRu-V?wAp662r-iJF7>%Qct1>D*rF6osk3>gV8(Ok*d+nMi56Q6#^a|4%O!~OO z&iNk=@AC81JrgXNko#I4SC$0yzU7Wi!>pZv^r?VAjMfmwC?uE3369K;-?CKBopYTS zL*m+{jKB=+_EVRjX&YD(d7vPiut!25st*yJT|g*Ehc&gWAg6T`%i|u5@kI 9T!{8$^vM-Yk0j26RErco@6e4Kc~%&RHkR#jPEeiLE} z_Gog`JZ$b?I6UqfprF LU$<6J7 zF6F(vw9wNtS#o*~L)Jgt_J!_G9 {01qJ!?mck84HkI-f?NzT zIvc2|wJ PO#hNY^UW_l~p0 $g@uKMyhzEgTX$02u8%3g z&q?3Aijy%=KXwZUJVUK8gCRgv1O!g77VF}!H+m^uv(5(k-^9jt;p)|Gh+^Hu8-vsZ z-9-jVR%Z80%ux9vOR#10=2NDoN8s!IK-0nOf 4}*2 zWd#NOrVl%CcXY{v^+Xdzcf0&fjtwQ8fL!3C2Z#eViQ9*Xp~L*I2|gup<3yr91bQ3? z#JPXJD@+B*D|wI|Pa$)Ln}y6lX5DP}z_M {-z#I+76 z&u$i&*SZ01)3T}!6Qw;Jh!~6F9G49hlp_bpyT-14Hev%)60jJoBWx&?hNe-6Z5~Cl zPxApSC?=QkYI`&;!AZG=W6&PDxcEJNdP+rw1&lEq+2-<)69Jfs3RpP0RqFVOWt&~u z)-O(UCpY)4lJb_haKYk0wzcFf$9BOJ>}m6@g9Fwh!$LYe(jxqmsz%fIbcT{*7XMvq z4^0T8#Q;)3@zDSF>b|daNMPU>uve;FEUPb2ExfcbbM+OyG!=o_xlU(#2vln>2C~i~ z!=ss~3^;jAr%(hruB-2pn`{ys)XV{45KH3%>yA~+@W(C4Y7&FVrit6UN36upVTr8N z!_bEFXzF6Fc;K*+jD*|Swm-|D(=#QNUkK!V-Bg|ocSsBO05 o&*pJ^p!c`@-lz= XY-J2LqJOUa(lv*rJcl*#Hts4l>n)iRZkDW1rLn1J~FM)9< zB1VrtKQ+=4K%A;_cSP*8loY@Hyg8OKF #K6#X+On-d6!R5_Pku51Ku{ z>5p?RLv_tVt0zYyqR au9 -u z2Lo+;d=s--M3*LxOwF+N?5wLwrd; z>U)$gVX(H>`@|>?&hSadSx!IoG``*^lQ=RZRypwju=6u4$t2W#0*ehdVgn+U0#2cg zH{>+8+&M5&wO2?e5Y>M>f8qD+ivd_({||HT8I|R^ef@$ZCe|2Z!$J~ci5(CufS4Vl ziAJ%2SSTt25kUo{3uufTFcwq r(#GT0V-1l{@GS{4QktgK?ar-pPogKIP)?_`XNqSJwH!Nd%|0yp1WB7;Q zo3)|2HMa#ZN?E5?JRquHR=U;^KkdNW=JVC@UEc4Goc0ozPrlw)cO`LM{@91yK?d1@ z__&;3dS5*O`Pz3BnY?N ~6`Uvs=o-e?wZhlH*)o90O$Bti zt8Z@hkP$x|UD@hdl(-vr$D 5BhcB3{I){^$m8iWm{d|t)T zO}+xXS;8n$lgKx2|Buht-`dgR6hr|^RW($epL{=R!O;(G3ChJ~*u(*(&j#P-&`dh8 z!0J($i9j6Dd|c;JUkj&aTf5BJYz~paiEa dA{n$ghq|nxTR |zsS3#ohpC=9)Nx!j66DT=ez3XPX5O_V8p$rq`55&gpVVFrE)RK)P=fw*a zto$;4JJw;_O`Zub4VXWS;`FlLT{FLLYe~Cf4!>AV8+Kx&MmeQdtl6a_Gb`mVRlm5J zxpBDru~qfWwsv;TNcR !V)1CWO0jEaF dJbJHRa(TMd_x_Z7pKEImNm&1{!&OHsLu0*#%a-4d zZk}2reEEgV=z5Z_SY!IZNo@f*hJ!Tr>gFdeJdXeF?Y_cSe@Eq9UEQ#YzpWcYo|=ZZ zPjt&$Zu-s*d&G~0+c}f7iR$d_rkd{61KOv PZ^QY*-*Zw?kM#jHdG#qJ zQY}zXcWZ6!s;dIDaem2|etUx+tMJlhJXiKHvX|O*d)S_ Ve?-iKtJ2no;56N1*c=6oAGcT@4#rn}0f^OuB3E#$d ze-_MF>G;cm12+lRM(?yNrr5ce=ci>eEjC$QNSz%JbG2^?3No=KN_27k-pxSyDhyZ< zo@Cqv xZ8h?r*IMWCau0<8L9Mr)|E9s^Xd;x)6C(E zW%Ad2$en3s7u)Vdou9cQI9+4ivSoG7$ds9?Tclt9z$1OAb8BPGo(W$v^_j^5Q1qWO zR$}Ap*>8NbzrC7Uf0Z+de(O%P&6PFVLi)64T+BXmCf_$A$KuL0!*OHAq*?7BW4N|% zm21G}Wl!81j08rbGL?Rr_n5LeeB!1T3lzYGjf;-bOJi_)13pkx`@5EMW{UHUO_DnM zcXD?LG&&2yaZ+jtF=}mSeST_ajEVADW&M7@MdsAFQs4r=_z~|F7f>h4ST) B)m`B-kf?S;n?7QJ8<4}))H0jS?v zGQr~{Ii5~?i@;v#IcHwwM(l(fK(g#evnL*K+_~<9G(07)AevCBtCB})-eRr4J63=A zc;~&%`(4LTO-bdSHty=hl{Y$Y5K=J1*-cm_$J96HYmK&TrO^KT+3^YLYg;42f|Jw? ziuR7wYbY~{Fx;KPyC?;6>ANU2#JSn|$;+nnM`wyoyqD&`ORBL++u7Lo`ixH7M_b59 z11hcC>+9-*2*}k_^nI;9%DJMmz{HxuT5LZ@9e>F uyS%t;xW2-dQ$CRJ`Bqe&A z^^%nPnMMz(?K^z>$bw@&Wctnv#&hPrevubBrlG*D*R$)Dy)L%4{+kOxE%d<&fUBO$ zrheltQfvlQo4RVd-fJto;oGvn*sbS4)t~XwRD2R(bJxl>`fyxrrlta(L;;kZsx)K@ zWVlrgJ}(V4-CL)Kq(KS<1b<5}EK!=gKAq0Z%PsC+yVf16c>CD}_NSj7E6Iq`(?6>m zorR)jD!n`%1X7|yQkgkCWlDcB-87?qXX?av)NBLW+^DpADjO&{dU_n+HR1S@zQw*F zH9^1XN0u4so*iA2_aLj*Jd3ua&h>ro|L>A)<`&fraV%K%<&v=Fk*P}q4;)zirO8v9 zlp*psF$(`^1_jdYnZ8V!|EOavbmDbJv|PskT0wo?qp>wR>zI5|rB2Y(+wZmP#t`3g zYE!4?HV$)HwCKRCGU*c(Fy0<+Y%p}lkPL=z1;-m-gVrkCMTNgU>iGvdy>l eowm1qUZ Z zMvv+LRgchE!!d1V`6CNBzI~N)XzG^YzosCS3avco9$K`U^g?M`kE}e-b}wc`TsRvM zB$CFBF@=wdy=$_v8;f?=7oAW2ILp7pa`U+tEeo=bJ8IwXb*jqv-C0*B>yOg);olL3 zzA5F2>-Hx7l(ZU?F;9TSH{e{gFHY_2Akx0WPE`#c(p09W@e9;?d-t2+)3b7Nj$mp0 zxUh6=e)O$dx4cvp4Y7KXqLpHdJlh42f?eT-8V3y-p_7g#K5{I-znv~DfH;Y4sLHnK zW%%%;M2Fo7?)v7J0{75u?YZEGJcmG1;8J-3W=L>iSyOYfT<6!fhwU3s30+`5GaQ;a z@rMTyRiH*rf*S+L$v&<7!EXTq#qYG^>%4Vg1J#!G(+8gojeqA-T*g@ur$>0&Ogx*E zA$;tu+Tiz5re&n+h9_EA59j!{TqKVw0JaPO%?W?EW6=7QbYM^gUc=+)D40JO&NB17 zw8&Bf`<=V?Sw*)eMkIw_j>I=nyw-&^`S#?mN|SzExmhvjMS8oGHfydt?dKKyt%XMQ z{h)62j<%z!rw!7{cx`U@)6EGz WM$9S|-Z}Y%SH%k} zlk#L-cssa~6N3xiY4)RgX}wn9#+!oT;r=Y}wT#Zlv0gf}VpkK+Ugkyal}PPc9laAb zm(`KWcYApa2RoB~q<8PHDG2vo3!SQ_cCfv*Oh;ZfY@Ypq7y&Rlk4@e%9|D|=Ai(uV zjrUG=+WKqQo(~#92%DIl>%_KHKMvnU_IMC9w?C6z4-}st5cy{@<$;9q`M7ajOkmR= zw}b46H%_|$)Pu8!I{z#`0DqRPU|obgEZMBjE
4XSTfy_=bPLKl+E+pz}hTwB~B7#QK!JG03W~{m- zK7NA3f}Ip$DlKtdaCb0F+d})CRgue`>CvZbe70pp>e}LTH*tIi{rZi^-CC~ep?bj7 zs_JE!N81?Qjzoo^>;2-+;;|486RfxlRP_=&5Uv^?@g<{5BZVoQ_=hDNwSIJ*Rtss| z_qw`eQY`AY`}37SZByn=F8rB%$Y)f${!Fp@l}9F(!^HdzYHDh<96hcUIt=0zjqdFT z(K(%iZ(?3xui@_Urn$fjd~epGCnQK`K-xQLX?88nhWdpq_pqj0`tm8}cQR%us6A>! zfkIiHLF)aUCkF?KQvY;8ae93hU2hM@dFGTg;Ao$G{P7IRanA`i+XMw~oV(t;K*u0O zM^bYB+=V6Cd*$e6CLZ}!%SJgkuQpWkP(wk*cX2(tcmMsg-}*0fbe Lq;A i8$WETH8WWdvImfcr)_$%C293@ zo{qqej0Eqokz!|>ob{PAf3B(JkC WGd3dQ=fQ~RdN3W+3dU!au*M-MFyGuGx^&W6Uy=`*8G^BkaZ^LeG6 z9;`6xdM$zXWHJfyPs6;G7LwV{uQPwD;r~m=1mMRnjrzH%JAg-kG)^?WS3N)T$xhIq z8u{T&lLl2;aX-_Ksqclt@Bmuyi8Y!LBZ0h_;}%;uW*x9Tea&z#y^yqLPA|h#gh9*v zETXUt0LGb~NI-NjhH-}r%v=2V6mRf_IN;->Z{?@i5~x;_v^c#!pDv=$(4p%$hj$i& ztNb*cT3^4<9}ZQkd2leNtS2HtmFAZ`qcLXp)%DulFFRB%7f&-90`d BAV--TSq(MW+9A zgo{I6lN=d4g4704`oTZmbLh~gOvnvORWL$MOi5u@HLj=f^mLxI_M#;g)!#r_@N{ta z{dVtthqA`1Rh29kxCW$SHXqWd;@lbDqeXNIxc@ &&It0ufcuDB*VBvVRC>UE zl3fB4;5n!F$K{laGjG12Sri&k^I+_T#2||92WJ-!L;4Z&$(`FiNs)K=QNTHID9)P1 zPX`C%I=-}NnOcxU21{)0ucR~wu!uP?-tf*}*4)po$@;-<$@co93uR+1e0NXKIDY+) zSJG$B-W)mGyhk&h5k%r!X+dvWYvXcjqZb7>|Gl$u(>mrf?u$jaP`GyCE3lt|xGGfA zutO)O4L44UEMNX&HZU7Qw#g8MHd0|Yxt(5euHd0@L5fe~uPqCjnC?d4>j{}!B*Owa zIP4FelzryCc3@XolT$1;!;|}nUWGi#`CoQ%<<_fvhb t5osO7{w=*_=A3hDQ^AN5^HaamP|UAvr8 z(b>%>)qXW >z?>hd zlGLmBOo-|AWO2N^+fet$Rl*Muf)tgnaCWJcah};m_>okHrNfa4CiM PAaZbVf zi8jY&f45@C4+iL1n47 Xh3BD+Jb>5o0Q{1 znDM|Y@Z^g^+MJ3ZOZ>a$F v<) z=U9c+^P#RGv>tC42;RGqu+Yor?3;^A$I5ddlyH`>84XsTR0frp7u_;s%Em3s@tjV~ z>>H-~qzgsKZ2blpCMJQgJn{!1bUboFxsh|iu`;~%aKrm-uDGlYORpJyxWN^qd*GCf zp9z%KJbdoq*9^R!&*_=90E7QXZ1HW`%y3uq%fC{6!Qnmp$B {Qy-=T$}D4KK=cf1B7xcOn4u zCzVIWF1rarHsqau#dL4|hDy8beAazhZ$3oKEBrld7?tt`XQmj6TRP2VCqSPX{uJIr zwNp*^X_r c49m^V7J`wV_j`4R5-|^PpG# z{#^d6n9A|AMuje!gn?RynBtl%k21F9vSs!j41Esl-+#mUYGLW4T7%@4&ldG&R0nQM zQSdPT+nPNX4J;s@z+suwc3`I$-yEe|QnF$1jUGC-DRxHo$|+jTZkdU@Q=g$D8%aM) zFu kKvr!+(YPS%9ux7+LP^ZH^oICw-NzJ^p<@k6!0FaUVQ!D()eF6_+7f z+|C-L+`YqX3kdT!0LbPPKDoH+8wH^J4d>StM1`xwIzp20ssq_#?q-J%(rC?m^-o9a zL->4D*y{P;sz~z0Ugt=R_E%rssoI_MWXZr++jd1gg;X^FDi-RH-Y{8e9BgL3$Kjf% zox=@CKbT|SQ )xqk7w}U3zBOZi7Rrb1WWhQS7+oW~X-{2SXKs8?=qS z?7gk|!uyG-q1-4p+kf2dm=~TovVY4mQhKm`tj~$RGTg$T?l0P=1^x9W7(*xUlj01O z{?i8j@ptDuQ^CO@x6)?Y{25X|l#(4w#b@#DZDHXi((*vzU2( 2Am1^c*?5_AZYGCBP?U85tSsdFQo(xOCqmdFeT6*5bRZy!?vQ z_j-DV?zKygYH4Y?`<>&sCtYT@Y#RuyCiNChCrHpd>i{p#K)sNd2O>3P(@=}F@^rV! zc80venudllNN5f@`PF{&7zI=0C9U2)kFUxI2xWjx Q5PMd?7Z!QKQ?FBwfI3+Rc+|iwd=2xQVfrUqQ#(Qri+Wq_QNVv`Ro(>b9_2% z>QuVd%tOwe!y2;sY3@xvM^{N!n7Z-VjPNW=rcpBEgK>CzAA~BKU%x1}|F(YEY-iWO zAuk-Nsw&med|hnRGjrgPH2!O~bA0?`Q^4vUHlG`9^Rbq)iQ)5?c1!H5ubKyTxe@7N z^IL#Vy}zN}|02=}ciQxt=J77q?zO)c7Jqv)YI02s5nGfh!tR#<-wGS61k5I3b-37d zi&oE%s`!tca}>EmumS3ppQ79lWK_7}5G_ tEgk2pF4AW^s6@k_mOZJd$ieujLRb-#yM7& z`PuMf|CktUCoCNR5a$RBl!|Da6)qS?|7_bQjE0|D*7V2xD;ElDrA)%*G^24U?*WgJ zj;vL~sJx#T^-#v8q?GO3{RkO%21H-QPe)vsApSOg<8?iFtix3VXOV4XgDL@|5-ypg z%{jz;%AS%i`eBTU>-AqDl7Vw|=Nw;+z4oF`U!DKglyS-MX5|?`Y(mkJ`Eks;^669Z zmD8ijPy2~#5r{#ci7!-D56~pbIMFl^FhmumJx+1OS8S)bKFt_B8KY$4?5(*Iu8Es* z=TDRC(12njkO=_W2(IM?saZJ-rZP*-0{5?ZNWf-3)R*pV;Y&mCKP*3Xat(Y&?evY( z({rv$KYYHdXQpwWX7m2ZkH=Wh<^m3J0(v;?8>nG5fMNSdcx%biNY1n~DY6*vi>XhC zm;rof0Y8qi*$2Ln%Ss+WvaUSwZ9z+uf}^lBuFUw%_^<`EC<<~o#FMRn#vl&IM-Iv_ zB))46Pv$x~MV%|&Gve7+JDZz*YVrcwZZCT>I7RDT=rw0I^QkK)geEur^2^7?Pa&B1 zJo4bB-B#bm4*J7-{!~`HcTBpLg?^d)x_al2({uK!Rh UzFY2?-Cc(uoSRpp|lLw-(14@omG01|;`;I8ffg}q2yJYv58ZHQZEiLQ~B z*&<=Z^Yj=F;lii0Yj0~f;_HN)%SweMp@wTEE2@OWz3ED=EOaJ7B%tMg!I&ZXjHHhx zqUN>5Q6P(vAmv{)U^^ lA5w-@u(I;)J zf4NN9(WHiG6qtO7GW^kmKD((Z&xbyxmV#YrcMjiRZ2dqS9M&*HB9`w*X8~}L_#XmV z(z_Q{5>Njd^=k3C6iOXcWOZ0M-Ui4KE+BuHJQV%}RhTZs+7CV*(F3GDW6Bj^0CLO} zecep|tPvU-hY1KuRWF%)B;_sR=m(7c#tcxV4>P>4fvl-9agpAJd^730hp?`k3D_43 zx)>0!NdW(M#3(zy{gJe_rPuwYj%U)!`?(usV`^#y@as8nh%05)*qRvTH}Hc7eV-%W zo_j+iz*8k%CM^uT$wNUv?XqL$^7_JKgy6%=&txVK*S(@<5SI0Wj_srW&dA&2^~(ED zt&f56D$&V|9NAy C#Z0 z!3qAcB8vBTdFir@ ;<5m)cScyQ>oeL1k zOxkgGmNjJz@3sVDVbX!2La3y~m5!L;65cYp g2I|^-L zAclKOLbC78b$l#@8A6C;YY@kJm-~_PpwGel8Lp~&f2kv-#VKPekHjn16Q&j0bLmhp zrwFeJQV%>*@n1G=5nd_q=`wS-`Nt;hrU|N{B^KD1>|4$rNbcVySO5P*j@T&wY*)If z i~zU?Av z8eyB6p1#RMMJVC_8 5B{iEz$RyeFZ m|4Zn zp)R`!JA%a?*=INWxc+u0>m8GmRdlbc(=`bkV{>yzUD1#J6R4CyHx(#B2beC#8D_Wd zy1n(iCqCWB#NIJ`uUh(HmVYMoH9sB^Y!~0THfx)CWs;SqT^EbvU9=1TUiZBD%Hznt zSPk3SSiBF2c1TFJW%`~1$Q95-bjjKjcnQj3Spu7i25@BNYCY_#~{q z{oOmsXx3CClgU!%xROb(PXn~887g+(GtyY*i =JC^ygGzUh9SVnBE@UQ3Y;`mY99dL`H=?xELLBp&Fpm`x2FWqM?!D%_ zCgV^oQZ6A%qlx@&>7_mi#70 He7~XkGh##Humh3KVs&w z3;lt?hxj`WJ#X1y^j-};+WXe-90f*UCu=t3E3aaGwndyv?vw6W6n=^)0OHA`{qpz6D8qio9(q1;`mg1OhFtI3&G#;f;aij{`l@AoWwQWQ1#?qwBP@V^51ubo@t%)&EP zV!ZY}iEqoz#7bh%0Y+rZtMLXJi8w?corZA!T>+{WEJ&a}m=`D;_u}BsBs~hyay|e% z;s77 h?9UBu9OlA z_(&<7AW =Wpn32Rr-(|*nex6IG1$q-hI*| z@LY-{g-_iVR$B6|oz?>oZC#OS5&H_jZS-NQW&I3ZncQo>sBLj!SwwQ<>J@7@+!v)v zVnpiTuxodGU20~$-zl#zQ zGoP#rhN2VpJ6Zb;*Hl-Jd{{XuW*i9F`sg8EbC0jLsE(Sho1z<$I_3=i3gMw-^2VmV z(=TCJ4Ref#KI8ezpla4Z_gYZ8)Lvb!VS<`kpDi-VfduqPOa9ys#-^s*RPVCznQH8M zP_3@Wi$kFMNA&kC)3u1YPbxSP{7Dz>AtsbJ|3@$PwP#MywJ-7xC#>j~KX#EY^Z8Kd z?8@k jf@1FAmH+9u|CA zE#LE3vuvOEc#m@_nMYN&iLRWS%XnMF45A>XEBGBb>zI4(hWfd$w#7DY!$<0pXX4S2 z> V8iySvs`!! +vouj;iyez3}%)7tbEUj6Q6-w^mwLM zbYe_H*yU!N*f;r>O|tV3sX2csW!(mwE5=%dp++U=8jC_*Z0egJe6;M(ZCs>ZbmC0$ z-VlGc%$R=77kta6Mbxdn5)i%jl+CZfg^vHZdHmhEr9HEps`e1s!f~pm#!RCR&qB!X z9X34dkoz1R7 @V$h7NX%vlcf^x(UOhiH-W+778 z^eRbTkvByZPiIKFJr$lI{JmWhjyYMk40Bpmw+s;W>XECL?0z#I{f%bC@J|k@k6B4S zqkwPW#aK5YH3a;f5c$Cs5;-i?(V~bjbS$(NT0U%*((;xC16#f!mToP&Gp~BoncSA@ zbQ{|Kw-woYF?zvQFP)R+^?L 6)16uktf`0AUhag0A~C{})woCL*)J(?f#`baYc9f>qbM96OV5ufI^gB8g65 zkV){I!RI}*=9=faW(JS0dO#)%Ra-H^Jl}Vi$;8OEctyvk!_~3x^#X^oo(~K&ssjO6 zyi3sm%7IL+!!xp1gl23>Hp`@LzyZlHax6?j002_Sxq@rvIH2Y6yU&&{zquG}CW?A~ zYpP1|nKO?+iRH9-C9VESqqq)aT=7RL+;F$&`<6|e8 i@+ z7RSn@!%jv_S{F5h5C8J9tC`b6E?F5QiIo_&qzCFeJ-XGM7+XE&;z2Dp< Y86!HXt@z8$7k6BL|yBegzm&62fQ%k+cXVh#?=vJZW@*Vo}N{KZ2<7Yli@_+9j= z0HeKsD<$TXg(p^Wpa(>Z(E-MgCXq^u2UYyA42{DZ6c!>c*s@y9G+>HNhb`a=3&V`B ztxowC;R=kVuI(K?IHKHwzAim20uX?H=cKr2xN$qJ9Q4Ff#(PE>=U1qysDvjfM yPj{w1Qic&QU8odj4WaLa-nBh;?UmUOi@B$(VeksT`egG(ya8#u z)&h4jsz~}I45RB#Gq_4~161r9Uq7F*Dt5fJhU4t14>AjG(B$@n@G>JQbE&_-ztxx8 zx!0rg@5zP?1uVm|dQ2{Oc2`Be x$+`?<*(XiW3hM zs;{4C@$IO}=u96Ml?Ry!BRWaXKF3p*&96iWGT-N dWZt@ z#Kc_g+-q18aE6mUX=!4lO(R6hv@I-b!|o~`xvWcoZNB>aQ|f+7QE-?VisAt&sC*7k z-3sjuy+G`qs7WVY$A~tR;@ufj?=dg6%$b^`Hagx*tQ1+_%f~9k7Ar1|PoOy9iSK7= zjOqFK=Q{?;5E)Qxb6Z``jNFLP29vP|o1B*m`tRlN2xA74_H5MtDr!&gjJcMguV2!x z>|yh9? 5lK|)4mlJPm*ot%o{WE!b2sMLHATb!kf(J znVnMiW$aiQdHK_zxRX1&Zk>Gh)8Ww{mNj(Q7m?EE>aFJqTU~UNdnxzIG ;}11I!FU4WCm^(LX5T z&=`>ktr~LvBrPp1C!VH?Uxr52GPSkK$M!?Ey0m;sUdV{r^nn#Et^PNZwg3cAh;e+i zezCc#ujd4(hiobSgm)z%rD%o?qj47!S_D1Y{IwgP1_<1vAc(lSs)cbF0y5-cIgJHN zLrvVmEb82p)koB6hZzN(uAFH);7DG N88S?4!+68C)Pm7*hXRRa>lMUAW+c Zw3XO}!PK}kr$L$i3*G}(fi?M0-yH^d_8~J_ z=AY{YyI?r&Ak%AM&--1X8~J45z>glA$2|f4_$#}C9Or!4Z||;MctibyHh2$Q=N&zV zEHAH2G&%<>P*hvVWh@h*$y`xcY`$jAMT%osc2b-&6}#kXK^>X$;K4z(;tLloT2xs- zSbyo#?|57AtWL0bK_F!z4%7Rvwr4iPA8gH7!@G}@;1>h+0uxs%p)^trd|Qp`c>W*; zsb8C$k06c(Us2ZaseBgPa*`(VykYbK3NpINIgl`G*gBc|=(2JbpNFRdy^S4bR~TJ$ z@d20@y*L1(>@=TRih tRLctZU3tgL|`mbYkr%Mr3-XR(@?3|W$&^e>8i>4-g=9|T$! zX3|LsSVl`HXo7G&H`7it@}qTJ5#vxb2PDPo*@e8( xsZyKwwvMujBB0;$`0i;i`P_fh`L)p|B_N)Ef(5xm!4T zuz(Brb>ej8DH~6uwxJXn$l}@X4c|2D>aCkmSLbVbK_1TL&027CG>r4D)CoPZ#94kI z6HgHtS-|Zdtm)uM#U=tnhLk@pD6`V=BPps**HjBJX7IkCU!r}R7Rmw nVoekgZm*}%2bGl}&;7K} z0n8NGy8QAL(Mt< Q7`_{pRb>FdYQl9Tmrhh&PuLZq z?)bYG!VTk_jk79RrU!pF&m$}%IIV2J!}hp$;W5*7Hd+O2tc!Yl>OV(IrLFD8{-+TM zb+r+p)%khvv=i>x*sM985un*0dMHQw8w} Ks!%45W z f*3H83BJ}|;TI9Q?OH{#J57QGQ3P752&bQy zmF*;j!3zl2{H5TY`!ttABNY=&jahba6RIbus|_=vY3o8RIWIX y zlk_BxGdD!zwDg*beWZQGwAamLxA#}x{l!q($&GUx6QlWFcK!1obX@0Egq#%j19Td^ z8 ;sOx8}H!(Zp?x*b4F~*>%zDF z^wUw8%6nbkJt(?uPdEIJUp9IHosCnHk_IZ?Aa%k6^Th<|pvaLzkF_on;SB|Ve)YkC z03+RNP0q_OzrZW^ul9N(%Od>Vz-;?NF+g)}x&l!J5^bx 7igQI)?m&g5u zw{6F<_BPL;#p3*6V`n!EjF%!p^sf)UU94V&z3P!8{h0~LTFTIB?@6oq9HQQ5EXF~e z!W@Ztr(S}qcFQ?q@oGdn!hW>j6DDM37yjd0_U_%38xoQ5KRBxec0CxP`MzPzzd!Q* zyI;NjA6(azy8aKYYv*=!_#a%?f=~WWAHj0e|H~g!K_51VHj0}X8-wNEmPf@$FsJ zm7HP?K)125j++q9nN qzOQ8|=gqIK0X=m>^dX0u3ajElXh-6Y-hq3w!(3f?+U4R?|?z;n36PWOV zKEPY++O6B2^z<)Ls8FoJ7}8&*4b7H%k`8 8yP=`#Pg0!&OKaIK3&IA zSbw77qoi8RX6exC%&g@UY0+>f#P3i6=a?d5mW1rm=n>vRk%f7|{hKUS^`X`Cx83_V zB`7o}DEYPjyK}LyT*M2mk!r`8Cd#OA$lo5>{#hY;36 i`lB|ik@wlC$d?bQ1m=oE-rsDaLYo$@l(pns*E_i=sc7q|(*Fr?c5W~Rn%pj zGsI=SoQB=$ljZqWC%_d_T*;h#GwYaqsx|2axDMD(uc8l%TdNCop@SL7$`I%vSlhHlm)`JjW%`tx+=lUmJSWf~i zq%IkY0b3{K=lfA)$U5BOq4CCKZEEM6RvOr=++?0F5dtu*Xls|D;!}W*=jS6P?zwB- z+M;2&$`6&+sCt@CNz2LWkvQMbSz=|K2;Eu^h3Kl$7!Xt^Lh}IoHY}XC-zCVt{7hI> z)KPjC@m*j{&z#!og1f rhk7U5PpqZ5h3 zEPZLbySAXtmVq7>s)&xz428tjM66Nu6+>V-fAoh80&T(bPqjiWkWJG($^P|=etWmp zsQC}Oc3O^N=^D|eh`~;1^?|=-s_#yj2Cv^qhE}{XFpPhDUEFw*W&N!Bb?Y`>iS*ue zs0_s+71@}vb`H<%0W1}0`M=q|^-15|-rgD&Jj#Jz=PW^FKAp?j;Ti5!n^tf5w&KwS z_u4_lY5x*_!@Rq7b?#ba-_CR&P0#)vZoo{O#q;r>0e$VJ;0&h#AZ~=f3Ze@qGKqT; z!1p2=MCuiYX;QBc^|s7WGoB0q8(51B{TE4@XYyqCnZ?I*twzAoz+4>T;afGuDPCir z_)twleEfjmB;-Qq*K{x%Ek}PC0ipM+@#9MYY!v7#iA}3J1ufr~4ch@7WhP-_j8zz# zFA&h)h%hj n*3$G=iG1Za~-5bgK34l2*(K;k;>v}?1H8`Wyi=$Dm)D{YH?vq z((e$Q6*&&f^15JB%81FNB)qV&u%@;)WaCpRwb+&^I2|eoHB)$oErg@3;`JfYPNx6a zt|x-kUg@}&*_#!w3$P$qnxa4|=}>UNtu6f5U%$ZIwCHYA&dhn$D<)5#%<)!;f?5<5 z6r>=`bD9y{Z$x*)!P;=h 1?^HLNFy8;0-;^^~&Se%vf8) zm)VfsfpDTWH(knbT6WbWX47sShG{IdfU&VLdbr*RL6rye=LJ59q~YI5c;RV=L};8> zdK2Ty0T&NB6^1m}yCfiE9Xu^_Us I}t@%17i6f+7qY zc!wJr?NT=y60Ou5T);kq2Y1)=uW IZ-=K4T`&tV}5%=B`K;B>+ou<0qF0V*N}|ZK7mr zb51;?^{E^>UTPwBUyH3`IC)d@nnp2Tf*8g~8yPTtytm{)AvA&+U(PjV^a~1Ml^par zYfFSd(tW_hgvU$t^b#Qf=7JP#x38$2MrrvAH-Zj#C(GY@w|>~3<`8h~*c^c5Etkf= zA?qisQB{F ~jOse@!bZW@CT&qM@6PCTNT5K(5+UyVH5oX+ZjH;gv6m$%5h` zvQF~|U;ae_bt`nA?B+`^LxBxCl-$-3V$#-C5?8K$d-f*dtLt*SuRd| S-w1#XdsmT?J0J8^By@Hc+H(B z@CQ&02GCieqAfnkv@VgcFz2e4R(Vj1E;=F*De1QHF_`;k_?X$pA4Jw5)= 2-- zR?Dqt6fbjx(P+IszRf|HM6d`g-*yjMZ#+4|}XMsb&h*jCvV;cX;yTiAZAU3GILbA?GGDbz`6SG%i9ZyrfY%PoT&p zaJs*vLEwl`pls#c?IK*-aBZP;??xI2wc~dhfJqg@zx-16^C(c3rl69>x>KyG#Xk!Q z{DDJ<^eSt_;)#zPnd^{a cRKKYZ8K@f%WJ<}Kt?xIJ9zEhHnJhZ7B8fKd*roTos zuPrGrzaz6lkOUEjL0AN65>`5NwyBI#^vCbDb2I9)MG(#2y|?nIs3KH _G|lG;MNzH%n0NUr_HB%y#5)V$#Hk zAD?aP_URI!h2;LKP~j@IUpKq_rTZR+?<0WLWA1{3v4MIPvwo4FBcbh-+Mzl$em(dP zp;q73IQ06440AQ=Pl-+7l^EkufUB39n?3+tD=te_jW*EFxmR=kPODJ6h6Fpd*#$vg zg}(RzsDnT~g%wEx-$IC{q&w2`=0TmMYS;xjo~3kq+$rWZwkZ3lB@ptAfc^ X+A%HCIIk@--H`w1v-CwrJdRhDci?- T5FW7@9HRLsbi&c> zlz%i^YhMKSh}&`LGfw*oB}HG6MJHEQu)<_ZduJ sHYkbLwSECnk!b1{4M;O6WUs1)u|3B~O41 zaeMSs6w#P9m>qIMoP~kz&vX$&OJx0$QHYB0+L>`ErWzZ)!ju5eZFKkZ8EI(|1CPk2 zBenyGZ=70|mZ@hNn<9l50 ziV1KpkH(Jp7yVq=U}9Yssa ;Be>wyT6s$C)n>dr2;u&&s?V~5yMvMS;xJY7cDMGPlr zHBq=XWo&R?{JbutT+Yxv>S D)YLrq$gyb{qHLM>=r!p?aZ6FrY8eL7<5BP?yL0b4S9lm*vi*H(Rd;2N zRuz~fs_qU~lB24{Zb4k5AOfmvZhYN!+wWlpCbfTu8h$&erXSyp_Njx}R@k9|w2{Lm zo@O*PW7)^v*o%xDnQ|5b8YfC7fn(?0RZk#)%%jMp(jvv=ytCSZ#6${D%4y;1_utgR z?CVoG7B7aVtnP$X3aO5Gy$raax&+P9bNuf*PgHeW!EVyy;5ssA9ouhj@5|Y-jvI`f zo_A(a<+bHY4&SLKV(%tDmu Iql(xzsX&?JVm5+`rc^>@hdL58;8j-h#?~8gEwzKajL7(=WKU4WVSBO*v+_0 z2%M;nW{S2z%L=KN!aInWL`nTs^Oapj_wbA`k2S_-K}vKp=Abe^ob_4VxT^)y0}A}V z^Uj*sPD@)l4lp@?)-$reXKRjkfk)=i9Q6PT?~QeCgNPEMsu;8(ZdIrC8s?9psR^4b z%j)Ya)sA~lR~~%M0`wRc`Pa3zrsPlA>!9& PxZ})XX!RhTOD28XY1I-88oS7j zWuT5R1!qpXh0U?fX=+yDkZ_q-4st>qvOyXRAhvC}R;B&p8#^zkAFcvsGHhx7!ceFA znzyKP1e=JWwsHns4sdTxj;S6oa^zw|!*u5K!Rb4C)lL2fyreWOwnNwjMPqvH vvp5OQeT3;xt;cT8MzhC3rg zzl~1o(K>&rRSXUN=lNo+LDId!pO5)%*GlF$Tg23h9^H;whXw=NJaL5&`u<@1@ayr@ z(;{PIU46<{jdQeLuzubv9gFnJic(*-h`L9IBC7M{zTxqiVlGw*GMH(?-_!qbakDI> zNpR?Kakh0z#Oc}x_gvx|lO}+bv$N$8a@xm^wmORrIu98 &) zH5bpCHS0phtT7Lk<`k02#qWl$3-Q#yf?Bf6{!6|)rWfCB)(4fO<5e1dlw@U4>j?z9 zKp#-~ZUKE9K5YK5@^Sd7-VY_Y{Mp%Pr1bpoLxt3zrunlupsVoc@{CfB8L5mJ6LQ}z zbOJP}FIj-LMJA>%bC;mZTo{xBmv*npcv_#Z*O4zD+0YS(7k97Np}yCAUUJX~-!+vt zfxbr%)?IhEr0zyyXk1TOmqnQVg0hZYhL4As!9M8gqv8MtV)z>u9Q&cv5vHYRRlIlZ z?7}+xXY?aJSDdL$aZ61nE@PPefy``EQbhZFeDj;{xk%EAm1PB Q;^4NU zrP+a&Lg}g8V}@BVT?b#@$@?YW9LZ-{q2jO;5#izP=Mt
oIN$xl55 VR696Ww}eW&1TS%U7V5R5BLY$bfz4th;_Z!6Qzw{&C)O|QPy8!|pI z?!B%)BRIK)Spgq0{kB4R*T{kW4bZ3i81LKjQ=Fmm5LrB-Amuw${VuZTJNUe5#>dT6 zPzSKdQG8Zfnv9C#BQYG^V2}@sP_%1BI_*up6lgQd;AhTiqDb$u!0cHhFWEd|;8~Z@ z9QE1N@p+l+TuXEJ#jjix=x_hDw5&|?s_A%#Hvfy${a!A7n$=}?<+7(r3-zB_=vz(; zyHI6jVUZJc;r{(a%yC3c$mnt^<4?*Z@r;jP8y{8nj;mL%cC=V%EJ1c~|Jh4Dl;Ijo zbni8nG!7KSV4QaTdn5~93D06u8?C~QO+PbeZ*p99KMc*`?GzLg9L0NS#NwuSrH2jw zyl}TI57kWj^2<)l9{sEwA0iSZ}y(!H^>Phh$l`XKb`4h&CD-rSrxVg+SDI~((+gwhJeLW3o zKFx&Q^7dv`1M@hCL|r%I_J>(n3o(<|coIXgo&j-Ty}`9))#H*=-yO+~{erV!muGCh z;gWc(K&a%n+tKq++}yYkbV$~X(e|tXNR2c;Qt2Atm>l&G6O)l5W8CHG`8z_ dU4X@pX*gqJbq))5dt9CE_VQ`Xbh2emAX__l*a*{fX?e*H!b zf*%m`uwtpYzMfvE8K{&(3UgeJ6P9yAzSkL2l3J-SU~8rVlG5KW^30n?@6a)|)DgH+ zzM+Eh=GR|)MQmq!J-y|nngV5$rPWpA6qEMm93S)bLsi#&xS*d_X+`&7^^#QQs hr&QnQ2{6jP&X3PUB=tTv5!tbKBU+H6E8D$?GpICot%ep+99A zVUJOYkWcVoJpZWe{44t>zQwD1txK+?%Dv0(1Bfx}4plu4@3;l&Er)q+?Uhd~&hC?F zvh>mJU?6iTIRU%ap&d4FnOoN1CtUk?q=zO{;$^VV(9ml0JDX>b>U&4Q(wWXay51kU zLC%^QbSqnOp`xtq;}S=Pc&pd06(l#~!)Cvytslr>#*PWl@;Vi5?ZOW~5QVR${rO{; z%s;<6QthO@AxoVWlt;DJUybkVulAn@ZDwZ=ASC8Z?7w=fUq%}EQZ||(q?Ng$=ztlu z4zAdyzN@0yHBYJ2P+Ub}F{EXy`2HX?y4RE}`F$ro`6bHMSTi`h;OY`}x5^oA0wFEv z_nQky=VSddpL?FsrjhGB!^+Akdd6d-lnR-z*zVv6hiflyhSt;8!ic*3Rkt2J%=kF! zJrl-`9=)2cGi%Fc{bdbR`cEr28+p#vKY!yP?3G(-X?vx;H)GNy> &^#j7++*G81(bAfaQ*LRu_2Vl8^tw50QW<*Emb+Zt5oL2 z0r!vlsGqoiE&y6-;py}>s<~^X8#6%ws&;a6dJP}JVCr~iU7MEath=S3qsVg9eIlae zug9g`x@C(Q)s{;Na}VB0MAf}~)yD=Tz9@)X^mxIqr%2)C**(f+bItbfHmK1Qf_=B} zA@0IU^m9QK#|jmHzOc9qKMyY~C _CL5Uw@ZkHH!Awje`o#>R)o8_C{X&uKa9s99@vbg%4x)iPvyj`Qr4 zq=ihF6IX|e(}DtMzvm@@Jn=3pX6yN#HMY(9A5~P+*irWsiAa>np3|ORp0Z(V $?7d%!#tvuN((c?jNi9u7eebsIk98vG-D;`RGj2Y6 zoR~3M0OJb!MQJ4CE$Uz3>=RsTVC$P7DusxH%8f0G9X+!cjH&;$;KH80d!?EJlsSdq zL)LDHq6FT@LeLe+!Hm_Qm?>Ek>d3H-u={3l^_&5f;W+f~Kf(An{va`2 C+PC!hoR0@0H}0pqrUp;+}p+;ZB2hCPOR<~3m7`k zIV{V;+DB^B5U7)phD{U(zS!-t1!fq~BUqQB*)p5jH*WwC`ck8XT xqXtQs4f_ZJv{xAm?OI&WiS91$NXg7A){#9?ZEtA0HM 8XpK^B^>f$w;bsYAx1@B*8n!2u}tHsh`Eqr16=VNa$xDHV+{j1 zw&EE qiB(V3d6<0EY#B6FKTfpw!V$&AK#d(}sA zp=tJae5S)+#6e&eqd9U}>zgC-zw^25EC>B@s8Hm?&iIY|!#3vvr-*OuYx9n&Tt9pE z?0wV8Z~rmY*ri>tCGU*k<%1w ?Ci8;fSmDsu3ZLmraR-oxuX#G?5^%BEh}{dE*d@q) zwa0tcKUf$V(^K6H^oOV@Vg $^WzxWKB`!0+8@^gxLowW;(RUnCMjV#blY7q$T; chDxWJUFPS^ zg0U&K6x8;AG7KNW_)|IGN1x=elJ1t`e7AI@8fHEjl_E0Jd=+<)Yk!adOL_R9w11?k z-&E_AFaeC5Ojq!ZH!DhriSDh9F6$bAWQRc|nb`iWA%2-`GLD3_v1kPV4|K5ZR15ek zhNP#DRfipO1CUFG>{vtHJ}~azCDLF2`)2VPTl+3E6Wu90EqEx04juYqpuH|1Om@7? z9E1rZez6p*b$Qp}DVzeg-VI-pbqNda+V}8c4c60l^;Z#CUpDmR_W_AeC;m*j3}+tK z|LubJ^6$) GhrhxM7-xB2 p(90732(CQ_p-aK5atAcAder~rZ<>auy#3FM3 zL_+G*uiq@7ge A6rF4C6^FbdU zv1J$tQclVkfw38o9~a!{zH;y0`-7w4aQ+2y!jkB_scH-4#ODNYMqjKwQvm$C_?0e- zQc0DvPGMoMe|&&_s>XXKt>mJMm9EGE&<^j%f5+YZdPuC lI^#2PQ-rr8tAOH9V+wUCHuK)1!?0*gSH-X^v&+l?uSN~vz!)ta7LZXw+zy|^Y zP0FtmnT}?d3!{$NM^&7$#ta5@I65o9My0sDu<0pVR&j!8V%$Vi;V`EKU#nqQ&cN>z zCg|9)Lb#(G5JMUkYi+M1kPG1si~u!;_*6pUnZgKRdkep0?;t~vpqAUZ`NQ^U-PCR< zxJ5{WRdy*Pws=#fRy=KMGEPGv*tf7udj8wc!)t%Y5mk;Xw_rX7qVY1gxT PcDDGxy=T1(c?s)?)6}CphUd&^#o8`xBZpZ>@)Fq*dXG7H!2DNM z-`u~t!Nff4c#i~T@l6QZ#uPe&+l#V+`j|wyuCShZSR9s!eti!UUU$=m9Lh(YV)2d` z#k9xEns1?|K$bRza#2!2&pFXqWA~t8|K fO$tsj6NYA5&_Zsigz14m-%YTE${*_naGRRBNc5j?1D!AyppNx+4q@%SwAZ75W=H zZKX e!{`PCX(m9RSvcrqW^O`~TeTJt3%Mm+Ls~S>t-u32M$pZzZ zF&G(OefIw$VGiGn)NG+PP@HqVcr8oAS9cbc5X3yK*9jc~YsG_5EYmeFgx%j*03ax! zC1Z(woxAmWcy>Ltu{hV#Vc0*^%&{C>mUFiy7s!G_WIhynuZkXQP!QuUfVxZ0wdUd> z2`d5ullbDSSRWmfI=SmV@4>EzM=U#rDN+L8q6wOhc^Mf`oP-dspNjjx*n9J^p7Xx{ z` 2}RaI%9^E!q*a@(p^_z{qQ#QEOext~EK%P!Td5QYp(s+KkV;aiB#Bb) z$9vB6y04kJ=DL3O@jHHh+{b;~j`KW^87KAa^Lf8t%k%YoK3~A0FIkK$`OZ>cRAA@U zxfDzX&;6aon8wB+`r!-HGw9@Y5%gh2ucU%gvu86|p8vCxkP%@0ml5=YY@1H8mFS>> z@3TY|D6C1~!U!*uB~2r}%n%51*tR%MtXQye^36Rjv)I}CI|b*;amNL*5cGN(goNB@ zKclufzB)+I=V{LZ@bIgdW6JDBxH~aAjm(Jthluw4(W uy_PwYJUH(N3s!oRd9V+4o`s}$M zeJD>t>o;`lSRYts@FDIBkrQ8y+0_M1lz0ua%u7qhV)9BR6lwxi)C%4(-FZSYh{Twa zkI31-!+ 2OtbwKtK{vndUV)vJ5#1C?yRmw@o7 z{Bkv->&;v_4x49yrAxT^hPVh$JB1+UPD~#d-BG?Ru?|EqAVfWNbtTX*`Ca2lSxS8i zp)Lt0az2)D0#0umKV@mnJ%+(^sPABh{i_a}vu<6q=I!Fg@y|0>jVr3Dv0Ar{r$ys; zscDj *Q4)5G|42 zQxNx>tD@NX`>z~X+ASng!uDTmyIuqHhhBOZ4elxw&C^Ynec{|HNA|^fgdZ6;W*X*- z&n-<%?u)r6QDyCyo6PrwA3K%icf9{2KOPfaKU9dqJ`b+z%Ih!I{st{nf~MV<`KAD* z8N81@-V*Qzg9m?r;QVck{^a?tw7?~xF#r{N`GaR4o~Tmi4}f0EbfrdTCQGq^(ZhaG zHD#|9Ye_U(zLp4jD-_jM7hRjSR3|rBB2t7C`4dP%c-&zCxi;z1i>(FUfr^at#oF#5 zP-J8GPmcGwBPgIYQKJ_;?BjvUrI=a6pRvA@OtjFTSQPsXe%pq3f!G&M`cNw & z?BeN&s5KK}%3ionIHoTnpo`>7?>J`7<3Z;a2I_!xn_#ECWZ`=kZjn$33LX*i@_+M) zTKNPDXA! $KQK0keOX&_)0UzYHJKIhS zq>dL&fg!+N6e=PH)hfRvdDDkL5P^z9wX+C^E6|ou1T%d5$LM(-W+Y>g@&<2`JG^DW zjG);v 7gE;Nf& z9=4h)3;|@g-D>yZaYYjUP47R2PUUMV_7^)IC3V7W2OrSXjZI^XE%u%Wd-QF_3&;O~ zIh8AQ&wRfcJQ?!I8R%}StgSDx@AO9V7c&YpVP8Q4pplyr8tmP%LkF2bqeeY?cTlKQ zfx7n41m#U?o$&Wdzi;0>3+duFswpU-DGXiVQVG4JM3@v(J02~_d-W=i=B22r>Jd>) z;4ZKMB!q|`%c*w+i9xJ>!g1mv@Zi!Q?
v^Tlg6RltClpjs*KMs@opO8gD*6OOWmzBD!1eY poN(>2&G)yxo0ca0{^~Fhq$Di z3d);JuWH5|UpqQHcA5lCIr5W6WNCD#qyfy@g!d4hIt+shdOx;;M+?pKP!`Y@A(EBw zg1nvn=n4n)Bg)xUABjRn&)0F%g^-gk?djvn35*b%9EWE(d^qGH1_resKQ03>g`Okf zqYU{^I+CVvH!WhERK|Z-^XMdhsCTwB543Z(kN>2e6Trk4w&x7U{?M`a={|OxMSg2N z9aPWL(^Iy36UndfgZ|`ahw=cD#rk0$0S)gR5}FgR!6e=Yq`%*Ag;28^-nE<0kF3|O zduMN~!ir<`MSb%&Gmf6|ke@xGn{wKLwj(bMN;~#)+sYLa<#g9Bu8X}V=XLD)iej(V z5w&T*-qjg->Dq9gu;DvB2A#>#(~@4lIqhrJZpU6GN3C~!b<;e&Xj$ed&EWA<#s_J* zy&M1cL}6eiJ>~R^gjH~7^`6u-mjs(%a@|T0p#6+KJ<7~9x}HTjAS2<)LMZiAEAp%4 zIVx!v!O)mZlfLd{{OKzq4ecWD_wL<0gx_c9A`5}%!YV`NDUHhlRFjCgET$JR`X@s} zhr)SlonY<_`XH@xZ>Y8)rgmr8JV#r*gF^QXbOhc+?c4X?$IN_Z9bw*APR?jjm)YBN z6~m2%CR*ZA=>DTWjiOwAIoq@UaF8xl3;;IxN%E$mqT~Ge^ZmatlKQDo+w?$PTvA1f zVfpH{YdeXFj-HFtj2S8cCEziVK?co+kKe_=H?w!^(zwjdPI-G52E9GI->y8v- 0)F#YdNJXkN5LsZ^c&!i96Nb(h=PJv>1l!G|NWQi zc Y} zPw}W-`imERBsdirR8O@oI29OZ*nJl+`|=tK^o)2_9yfiptPK6#(09(%|IP)>`LbmD z+yk~L9rOG3a*cRYGh-n2MQ5LRyBXm5+m<>$g2>%fPVN9#H#IA(3xzFezkA#a% KQ5Kgv^zY9XQCW0x?0IOL ztt7IF-~8>De27uToB45hnc-VNHyMeOvvU#Tm-c!m4q0@YZCyxvbgQ7CuVhg7{bR&> zz7!fKRk ?d+t+>>?`~EhP-%p&7K8a7HFKDH# ztSrHCeP>!T<7A1%z2)2LgeE`n-3J9^WM~@q)J~E2nP+ci*f>IJ5#Z-HUGWH~FXB7G zMy&-44(VfAdHCRs+-D6TqrZIlB2jYt{ap0#4_1j0$JEC6L(Fe%@8gir57I>n9*yGB z0b1XF_%PCF<;W%v@#J!+o}&~xj9^TXLXmg++VlUK`uF8Lk@9ee&~J*1 qoIr2{(QZI5>!9`2i2`WjZ#AvW`LSbV^o?qt+m>=m8^jCV5i4 zqwnN>xx=H6JouPvY$diwUc7Q;7D=w_ufMhnnNXXbm)8q$N%@-li@1ELlZBq12j}3} zv11`rY;p~dp!;ynmfPD~h|{GcmA5?7vrC_STJm7eGIW4)^-sTWIbFXExEdO7Y>mU{ z^}|t7Q8!Yb%+u0p!wGndkO)HiVHmOo_UYWr6m^ZIBDzn`rb!<}g%qhlVA0E`;4* z^!LE0rDb4dd$l c}hh#cGrI=8oeQGUn E!b9}6o zydvhqR+D%DklDVRJN70;T)_3iSFT)1Z)yDUv1pdW jTh|4aYhNp-OAXYu463fBrn|72?#NBwhRT*-!9jEwM~;l98;* z3G>lub(V<=_?g9$!NwW1Z^8gj2#=WP9G>IK4r=c|jv#2ZaHfFY^oGWG>D`cd9Y>wa zk q4f5B?t*+yQ zwU&tF!fyKhT1y>yeltJSGk=%<>lq;q@i-B6-`wg(dwb!sHQd$YZEn-? 1U+*vV}x^fpRH>KDvaua?+BeKI> sAaK#XD)CT){y^)*3$^*DUE3ucwVg(p@!9H^DQELotdo9nia>-HFtpd^K1 z-|i~pPm?gEmMo(zWNN)%|0cj>%9AJExFf`N!=@MVK4GcT5*>i227dtnWc9F>^}tP= zHf^qcY5G-j UZCI~-W{i^p6siM?c-tHe7K4mrIit~;f3 zorB0K#e=liO7?m0;{8JBU9~T~p($2=gsSlhLpzq|OBWUHQX~D#9AD55`W3^<{(JW9 zk?1IoqZJ!Kpro6OC><_y$>b1|n9g*x-Byf@;O^svBGGFyJSW?5lCi(^)YEtG-r>EV z>XAKBqOtAEf|}aDp_}4g{jCj-3{(loxU}w-I<)UrsE)p(K0-~fZV;Pu$w3GSJb4|Q zeLv}OzGN{-uNb+}Sv-lcnl?|NdwgOdB%L-8P<93f2S2`f PLcrmz^<09Y%oDnU9L%CVtz{QzF%y~l>FGP^*ZHUR)KEyMN^phB^}eKz zTu#VU=;`G6!gqnQKVr29=f6Eb=3W$$kx@~G-mz-;LL;eLiaEE!=THy_;d;nWN{jdn z3|jl)#dsi>@YLtc-@jknRJO3F0le!wrEqFZefc)M3zxs4w-T<(2*hWSAvb({GlMgp za`$dqiEw0Mi?Gmos=8Q7M=lKcJh(I9Gay+BDc0%J+YW%q%T}&z4NH=81y*=5Fq8Uz z8=^^S^UuSRjb%b*V>8k^N_bD*yWd!JYLX1SHYBIsLSzUe%o>Bvlma+lq@gfsr)N zKVo6=-(}`pKB>2yZc;lBNX0AQ`5yzZ5|d_ e{49lLieRK5tD%W@Z|w zV~*k_yG`ajb#!z@?})Wk7dD*flr8#KF}~F1<$=8eds;><>yi^wQ)GDJ;b{1(({1Y4 zp=%%x4w^c30P;*q+IGxHO)EFD=C?aKj~PVdH&s=m3~m|!o>3} n2I|KcuFr>Ur?s z&kr9x>ejdKLD-f$O(rHLDb#3C%}Ny&^0opBJ%?;0HV{&j^ak;etu92P2DuO-=3h zc?xi2XEA30n*BW}$g 5!@ zPQu~tSwZ|i