diff --git a/Makefile b/Makefile index 551adb18..75781377 100644 --- a/Makefile +++ b/Makefile @@ -106,6 +106,10 @@ clean: rm -rf $(BUILD_DEST) @echo "Cleaned $(BUILD_DEST)" +.PHONY: update-fixtures +update-fixtures: + ./hack/update-fixtures.sh + .PHONY: download-gocache download-gocache: @./hack/ci/download-gocache.sh diff --git a/deploy/crd/operatingsystemmanager.k8c.io_operatingsystemconfigs.yaml b/deploy/crd/operatingsystemmanager.k8c.io_operatingsystemconfigs.yaml index 8f2d8ad4..f91e5c59 100644 --- a/deploy/crd/operatingsystemmanager.k8c.io_operatingsystemconfigs.yaml +++ b/deploy/crd/operatingsystemmanager.k8c.io_operatingsystemconfigs.yaml @@ -214,7 +214,6 @@ spec: enum: - flatcar - rhel - - centos - ubuntu - amzn2 - rockylinux diff --git a/deploy/crd/operatingsystemmanager.k8c.io_operatingsystemprofiles.yaml b/deploy/crd/operatingsystemmanager.k8c.io_operatingsystemprofiles.yaml index 2cc52c09..461a797e 100644 --- a/deploy/crd/operatingsystemmanager.k8c.io_operatingsystemprofiles.yaml +++ b/deploy/crd/operatingsystemmanager.k8c.io_operatingsystemprofiles.yaml @@ -245,7 +245,6 @@ spec: enum: - flatcar - rhel - - centos - ubuntu - amzn2 - rockylinux diff --git a/deploy/osps/default/osp-centos.yaml b/deploy/osps/default/osp-centos.yaml deleted file mode 100644 index 0b86fae6..00000000 --- a/deploy/osps/default/osp-centos.yaml +++ /dev/null @@ -1,849 +0,0 @@ -# Copyright 2021 The Operating System Manager contributors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: operatingsystemmanager.k8c.io/v1alpha1 -kind: OperatingSystemProfile -metadata: - name: osp-centos - namespace: kube-system -spec: - osName: "centos" - osVersion: "7.7" - version: "v1.6.0" - provisioningUtility: "cloud-init" - supportedCloudProviders: - - name: "alibaba" - - name: "aws" - - name: "azure" - - name: "digitalocean" - - name: "equinixmetal" - - name: "kubevirt" - - name: "nutanix" - - name: "openstack" - - name: "vsphere" - - bootstrapConfig: - templates: - configureProxyScript: |- - {{- if .HTTPProxy }} - cat < /etc/cloud/cloud.cfg.d/{{ .SecretName }}.cfg - cloud-init clean - CLOUD_INIT_VERSION=$(cloud-init --version | awk '{print $2}') - # Compare the semver values of cloud-init versions to determine the correct command to run. - # This is required because the command line arguments for cloud-init changed in version 24.1, for details: https://github.com/canonical/cloud-init/releases/tag/24.1. - if [[ $(echo -e "24.0.0\n$CLOUD_INIT_VERSION" | sort -V | head -n1) = "24.0.0" ]]; then - cloud-init init --file /etc/cloud/cloud.cfg.d/{{ .SecretName }}.cfg - else - cloud-init --file /etc/cloud/cloud.cfg.d/{{ .SecretName }}.cfg init - fi - - systemctl daemon-reload - - # cloud-init should only run on the first boot. From this point forward we don't need cloud-init anymore. - systemctl disable cloud-init - touch /etc/cloud/cloud-init.disabled - - # Bootstrap phase for the machine is complete. - touch /etc/bootstrap-complete - systemctl disable bootstrap.service - - # Start provisioning phase for the machine. - systemctl restart setup.service - - - path: /etc/systemd/system/bootstrap.service - permissions: 644 - content: - inline: - encoding: b64 - data: | - [Install] - WantedBy=multi-user.target - - [Unit] - Requires=network-online.target - After=network-online.target - [Service] - Type=oneshot - RemainAfterExit=true - EnvironmentFile=-/etc/environment - ExecStart=/opt/bin/supervise.sh /opt/bin/bootstrap - - modules: - runcmd: - - systemctl restart bootstrap.service - - systemctl daemon-reload - - provisioningConfig: - supportedContainerRuntimes: - - name: containerd - files: - - path: /etc/systemd/system/containerd.service.d/environment.conf - content: - inline: - data: | - [Service] - Restart=always - EnvironmentFile=-/etc/environment - - - path: /etc/crictl.yaml - content: - inline: - data: | - runtime-endpoint: unix:///run/containerd/containerd.sock - - - path: /etc/containerd/config.toml - permissions: 600 - content: - inline: - encoding: b64 - data: | - {{ .ContainerRuntimeConfig }} - templates: - containerRuntimeInstallation: |- - yum install -y yum-utils - yum-config-manager --add-repo=https://download.docker.com/linux/rhel/docker-ce.repo - - yum install -y containerd.io-1.7* yum-plugin-versionlock - yum versionlock add containerd.io - - systemctl daemon-reload - systemctl enable --now containerd - - templates: - safeDownloadBinariesScript: |- - {{- /* setup some common directories */}} - opt_bin=/opt/bin - usr_local_bin=/usr/local/bin - cni_bin_dir=/opt/cni/bin - - {{- /* create all the necessary dirs */}} - mkdir -p /etc/cni/net.d /etc/kubernetes/manifests "$opt_bin" "$cni_bin_dir" - {{- /* HOST_ARCH can be defined outside of machine-controller (in kubeone for example) */}} - arch=${HOST_ARCH-} - if [ -z "$arch" ] - then - case $(uname -m) in - x86_64) - arch="amd64" - ;; - aarch64) - arch="arm64" - ;; - *) - echo "unsupported CPU architecture, exiting" - exit 1 - ;; - esac - fi - - {{- /* # CNI variables */}} - CNI_VERSION="${CNI_VERSION:-v1.5.1}" - cni_base_url="https://github.com/containernetworking/plugins/releases/download/$CNI_VERSION" - cni_filename="cni-plugins-linux-$arch-$CNI_VERSION.tgz" - - {{- /* download CNI */}} - curl -Lfo "$cni_bin_dir/$cni_filename" "$cni_base_url/$cni_filename" - - {{- /* download CNI checksum */}} - cni_sum=$(curl -Lf "$cni_base_url/$cni_filename.sha256") - cd "$cni_bin_dir" - - {{- /* verify CNI checksum */}} - sha256sum -c <<<"$cni_sum" - - {{- /* unpack CNI */}} - tar xvf "$cni_filename" - - - {{- /* set ownership of the CNI binaries to root:root. Required due to https://github.com/cilium/cilium/issues/23838 */}} - chown -R root:root "$cni_bin_dir" - - {{- /* # cri-tools variables */}} - {{- if semverCompare "~1.29.0" .KubeVersion }} - CRI_TOOLS_RELEASE="v1.29.0" - {{- else if semverCompare "~1.30.0" .KubeVersion }} - CRI_TOOLS_RELEASE="v1.30.1" - {{- else if semverCompare "~1.31.0" .KubeVersion }} - CRI_TOOLS_RELEASE="v1.31.1" - {{- else }} - {{- /* Fallback to the latest version */}} - CRI_TOOLS_RELEASE="v1.31.1" - {{- end }} - - CRI_TOOLS_RELEASE="${CRI_TOOLS_RELEASE:-v1.29.0}" - cri_tools_base_url="https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRI_TOOLS_RELEASE}" - cri_tools_filename="crictl-${CRI_TOOLS_RELEASE}-linux-${arch}.tar.gz" - - {{- /* download cri-tools */}} - curl -Lfo "$opt_bin/$cri_tools_filename" "$cri_tools_base_url/$cri_tools_filename" - - {{- /* download cri-tools checksum */}} - {{- /* the cri-tools checksum file provides only the checksum without the file name, so we need to handle it specially */}} - cri_tools_sum_value=$(curl -Lf "$cri_tools_base_url/$cri_tools_filename.sha256") - cri_tools_sum="$cri_tools_sum_value $cri_tools_filename" - cd "$opt_bin" - - {{- /* verify cri-tools checksum */}} - sha256sum -c <<<"$cri_tools_sum" - - {{- /* unpack cri-tools and symlink to path so it's available to all users */}} - tar xvf "$cri_tools_filename" - rm -f "$cri_tools_filename" - ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped" - cd - - - {{- /* kubelet */}} - KUBE_VERSION="${KUBE_VERSION:-{{ .KubeVersion }}}" - kube_dir="$opt_bin/kubernetes-$KUBE_VERSION" - kube_base_url="https://dl.k8s.io/$KUBE_VERSION/bin/linux/$arch" - kube_sum_file="$kube_dir/sha256" - - {{- /* create versioned kube dir */}} - mkdir -p "$kube_dir" - : >"$kube_sum_file" - - for bin in kubelet kubeadm kubectl; do - {{- /* download kube binary */}} - curl -Lfo "$kube_dir/$bin" "$kube_base_url/$bin" - chmod +x "$kube_dir/$bin" - - {{- /* download kube binary checksum */}} - sum=$(curl -Lf "$kube_base_url/$bin.sha256") - - {{- /* save kube binary checksum */}} - echo "$sum $kube_dir/$bin" >>"$kube_sum_file" - done - - {{- /* check kube binaries checksum */}} - sha256sum -c "$kube_sum_file" - - for bin in kubelet kubeadm kubectl; do - {{- /* link kube binaries from verioned dir to $opt_bin */}} - ln -sf "$kube_dir/$bin" "$opt_bin"/$bin - done - - files: - - path: /opt/bin/health-monitor.sh - permissions: 755 - content: - inline: - encoding: b64 - data: | - #!/usr/bin/env bash - - # Copyright 2016 The Kubernetes Authors. - # - # Licensed under the Apache License, Version 2.0 (the "License"); - # you may not use this file except in compliance with the License. - # You may obtain a copy of the License at - # - # http://www.apache.org/licenses/LICENSE-2.0 - # - # Unless required by applicable law or agreed to in writing, software - # distributed under the License is distributed on an "AS IS" BASIS, - # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - # See the License for the specific language governing permissions and - # limitations under the License. - - # This script is for master and node instance health monitoring, which is - # packed in kube-manifest tarball. It is executed through a systemd service - # in cluster/gce/gci/.yaml. The env variables come from an env - # file provided by the systemd service. - - # This script is a slightly adjusted version of - # https://github.com/kubernetes/kubernetes/blob/e1a1aa211224fcd9b213420b80b2ae680669683d/cluster/gce/gci/health-monitor.sh - # Adjustments are: - # * Kubelet health port is 10248 not 10255 - # * Removal of all all references to the KUBE_ENV file - - set -o nounset - set -o pipefail - - # We simply kill the process when there is a failure. Another systemd service will - # automatically restart the process. - function container_runtime_monitoring() { - local -r max_attempts=5 - local attempt=1 - local -r container_runtime_name="${CONTAINER_RUNTIME_NAME:-docker}" - # We still need to use 'docker ps' when container runtime is "docker". This is because - # dockershim is still part of kubelet today. When kubelet is down, crictl pods - # will also fail, and docker will be killed. This is undesirable especially when - # docker live restore is disabled. - local healthcheck_command="docker ps" - if [[ "${CONTAINER_RUNTIME:-docker}" != "docker" ]]; then - healthcheck_command="crictl pods" - fi - # Container runtime startup takes time. Make initial attempts before starting - # killing the container runtime. - until timeout 60 ${healthcheck_command} > /dev/null; do - if ((attempt == max_attempts)); then - echo "Max attempt ${max_attempts} reached! Proceeding to monitor container runtime healthiness." - break - fi - echo "$attempt initial attempt \"${healthcheck_command}\"! Trying again in $attempt seconds..." - sleep "$((2 ** attempt++))" - done - while true; do - if ! timeout 60 ${healthcheck_command} > /dev/null; then - echo "Container runtime ${container_runtime_name} failed!" - if [[ "$container_runtime_name" == "docker" ]]; then - # Dump stack of docker daemon for investigation. - # Log file name looks like goroutine-stacks-TIMESTAMP and will be saved to - # the exec root directory, which is /var/run/docker/ on Ubuntu and COS. - pkill -SIGUSR1 dockerd - fi - systemctl kill --kill-who=main "${container_runtime_name}" - # Wait for a while, as we don't want to kill it again before it is really up. - sleep 120 - else - sleep "${SLEEP_SECONDS}" - fi - done - } - - function kubelet_monitoring() { - echo "Wait for 2 minutes for kubelet to be functional" - sleep 120 - local -r max_seconds=10 - local output="" - while true; do - local failed=false - - if journalctl -u kubelet -n 1 | grep -q "use of closed network connection"; then - failed=true - echo "Kubelet stopped posting node status. Restarting" - elif ! output=$(curl -m "${max_seconds}" -f -s -S http://127.0.0.1:10248/healthz 2>&1); then - failed=true - # Print the response and/or errors. - echo "$output" - fi - - if [[ "$failed" == "true" ]]; then - echo "Kubelet is unhealthy!" - systemctl kill kubelet - # Wait for a while, as we don't want to kill it again before it is really up. - sleep 60 - else - sleep "${SLEEP_SECONDS}" - fi - done - } - - ############## Main Function ################ - if [[ "$#" -ne 1 ]]; then - echo "Usage: health-monitor.sh " - exit 1 - fi - - SLEEP_SECONDS=10 - component=$1 - echo "Start kubernetes health monitoring for ${component}" - if [[ "${component}" == "container-runtime" ]]; then - container_runtime_monitoring - elif [[ "${component}" == "kubelet" ]]; then - kubelet_monitoring - else - echo "Health monitoring for component ${component} is not supported!" - fi - - - path: /etc/systemd/journald.conf.d/max_disk_use.conf - content: - inline: - encoding: b64 - data: | - [Journal] - SystemMaxUse=5G - - - path: /opt/load-kernel-modules.sh - permissions: 755 - content: - inline: - encoding: b64 - data: | - #!/usr/bin/env bash - set -euo pipefail - - modprobe ip_vs - modprobe ip_vs_rr - modprobe ip_vs_wrr - modprobe ip_vs_sh - - if modinfo nf_conntrack_ipv4 &> /dev/null; then - modprobe nf_conntrack_ipv4 - else - modprobe nf_conntrack - fi - - - path: /etc/sysctl.d/k8s.conf - content: - inline: - encoding: b64 - data: | - net.bridge.bridge-nf-call-ip6tables = 1 - net.bridge.bridge-nf-call-iptables = 1 - kernel.panic_on_oops = 1 - kernel.panic = 10 - net.ipv4.ip_forward = 1 - {{- if or (eq .NetworkIPFamily "IPv4+IPv6") (eq .NetworkIPFamily "IPv6+IPv4") (eq .NetworkIPFamily "IPv6") }} - net.ipv6.conf.all.forwarding = 1 - # Configure Linux to accept router advertisements to ensure the default - # IPv6 route is not removed from the routing table when the Docker service starts. - # For more information: https://github.com/docker/for-linux/issues/844 - net.ipv6.conf.all.accept_ra = 2 - {{- end }} - vm.overcommit_memory = 1 - fs.inotify.max_user_watches = 1048576 - fs.inotify.max_user_instances = 8192 - - - path: /etc/selinux/config - content: - inline: - encoding: b64 - data: | - # This file controls the state of SELinux on the system. - # SELINUX= can take one of these three values: - # enforcing - SELinux security policy is enforced. - # permissive - SELinux prints warnings instead of enforcing. - # disabled - No SELinux policy is loaded. - SELINUX=permissive - # SELINUXTYPE= can take one of three two values: - # targeted - Targeted processes are protected, - # minimum - Modification of targeted policy. Only selected processes are protected. - # mls - Multi Level Security protection. - SELINUXTYPE=targeted - - - path: /opt/bin/setup - permissions: 755 - content: - inline: - encoding: b64 - data: | - #!/bin/bash - set -xeuo pipefail - - setenforce 0 || true - - {{- /* As we added some modules and don't want to reboot, restart the service */}} - systemctl restart systemd-modules-load.service - sysctl --system - - # Override hostname if /etc/machine-name exists - if [ -x "$(command -v hostnamectl)" ] && [ -s /etc/machine-name ]; then - machine_name=$(cat /etc/machine-name) - hostnamectl set-hostname ${machine_name} - fi - - yum install -y \ - device-mapper-persistent-data \ - lvm2 \ - ebtables \ - ethtool \ - nfs-utils \ - bash-completion \ - sudo \ - socat \ - wget \ - curl \ - {{- if or (eq .CloudProviderName "vsphere") (eq .CloudProviderName "vmware-cloud-director") }} - open-vm-tools \ - {{- end }} - {{- if eq .CloudProviderName "nutanix" }} - iscsi-initiator-utils \ - {{- end }} - ipvsadm - - systemctl disable --now firewalld || true - - {{- /* iscsid service is required on Nutanix machines for CSI driver to attach volumes. */}} - {{- if eq .CloudProviderName "nutanix" }} - systemctl enable --now iscsid - {{ end }} - - {{- template "containerRuntimeInstallation" }} - - {{- template "safeDownloadBinariesScript" }} - - mkdir -p /etc/systemd/system/kubelet.service.d/ - # set kubelet nodeip environment variable - /opt/bin/setup_net_env.sh - - {{ if eq .CloudProviderName "vsphere" }} - systemctl enable --now vmtoolsd.service - {{ end -}} - - {{- /* fetch kubelet bootstrapping kubeconfig */}} - curl -s -k -v --header 'Authorization: Bearer {{ .Token }}' {{ .ServerURL }}/api/v1/namespaces/cloud-init-settings/secrets/{{ .BootstrapKubeconfigSecretName }} | jq '.data["kubeconfig"]' -r| base64 -d > /etc/kubernetes/bootstrap-kubelet.conf - - systemctl enable --now kubelet - systemctl enable --now --no-block kubelet-healthcheck.service - systemctl disable setup.service - - - path: /etc/systemd/system/kubelet.service - content: - inline: - encoding: b64 - data: | - [Unit] - After={{ .ContainerRuntime }}.service - Requires={{ .ContainerRuntime }}.service - - Description=kubelet: The Kubernetes Node Agent - Documentation=https://kubernetes.io/docs/home/ - - [Service] - User=root - Restart=always - StartLimitInterval=0 - RestartSec=10 - CPUAccounting=true - MemoryAccounting=true - - Environment="PATH=/opt/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/" - EnvironmentFile=-/etc/environment - - ExecStartPre=/bin/bash /opt/disable-swap.sh - ExecStartPre=/bin/bash /opt/load-kernel-modules.sh - ExecStartPre=/bin/bash /opt/bin/setup_net_env.sh - ExecStart=/opt/bin/kubelet \ - --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \ - --kubeconfig=/var/lib/kubelet/kubeconfig \ - --config=/etc/kubernetes/kubelet.conf \ - --cert-dir=/etc/kubernetes/pki \ - {{- if .ExternalCloudProvider }} - --cloud-provider=external \ - {{- /* In-tree cloud providers have been disabled starting from k8s 1.29. For more information: https://github.com/kubernetes/kubernetes/pull/117503 */}} - {{- else if and (.InTreeCCMAvailable) (semverCompare "<1.29" .KubeVersion) }} - --cloud-provider={{- .CloudProviderName }} \ - --cloud-config=/etc/kubernetes/cloud-config \ - {{- end }} - {{- if ne .CloudProviderName "aws" }} - --hostname-override=${KUBELET_HOSTNAME} \ - {{- else if and (eq .CloudProviderName "aws") (.ExternalCloudProvider) }} - --hostname-override=${KUBELET_HOSTNAME} \ - {{- end }} - --exit-on-lock-contention \ - --lock-file=/tmp/kubelet.lock \ - {{- if .PauseImage }} - --pod-infra-container-image={{ .PauseImage }} \ - {{- end }} - {{- if .InitialTaints }} - --register-with-taints={{- .InitialTaints }} \ - {{- end }} - {{- if eq .ContainerRuntime "containerd" }} - --container-runtime-endpoint=unix:///run/containerd/containerd.sock \ - {{- end }} - {{- /* If external or in-tree CCM is in use we don't need to set --node-ip as the cloud provider will know what IPs to return. */}} - {{- if not (and (or (eq .NetworkIPFamily "IPv4+IPv6") (eq .NetworkIPFamily "IPv6+IPv4")) (or (.InTreeCCMAvailable) (.ExternalCloudProvider))) }} - --node-ip ${KUBELET_NODE_IP} - {{- end }} - - [Install] - WantedBy=multi-user.target - - - path: /etc/kubernetes/cloud-config - permissions: 600 - content: - inline: - encoding: b64 - data: | - {{ .CloudConfig }} - - - path: /opt/bin/setup_net_env.sh - permissions: 755 - content: - inline: - encoding: b64 - data: | - #!/usr/bin/env bash - echodate() { - echo "[$(date -Is)]" "$@" - } - - # get the default interface IP address - {{- if eq .NetworkIPFamily "IPv6" }} - DEFAULT_IFC_IP=$(ip -o -6 route get 1:: | grep -oP "src \K\S+") - {{- else if eq .NetworkIPFamily "IPv4+IPv6" }} - DEFAULT_IFC_IPv4=$(ip -o route get 1 | grep -oP "src \K\S+") - DEFAULT_IFC_IPv6=$(ip -o -6 route get 1:: | grep -oP "src \K\S+") - - if [ -z "${DEFAULT_IFC_IPv6}" ] - then - echodate "Failed to get IPv6 address for the default route interface" - exit 1 - fi - DEFAULT_IFC_IP=$DEFAULT_IFC_IPv4,$DEFAULT_IFC_IPv6 - {{- else if eq .NetworkIPFamily "IPv6+IPv4" }} - DEFAULT_IFC_IPv4=$(ip -o route get 1 | grep -oP "src \K\S+") - DEFAULT_IFC_IPv6=$(ip -o -6 route get 1:: | grep -oP "src \K\S+") - - if [ -z "${DEFAULT_IFC_IPv6}" ] - then - echodate "Failed to get IPv6 address for the default route interface" - exit 1 - fi - - DEFAULT_IFC_IP=$DEFAULT_IFC_IPv6,$DEFAULT_IFC_IPv4 - {{- else }} - DEFAULT_IFC_IP=$(ip -o route get 1 | grep -oP "src \K\S+") - {{- end }} - - if [ -z "${DEFAULT_IFC_IP}" ] - then - echodate "Failed to get IP address for the default route interface" - exit 1 - fi - - # get the full hostname - FULL_HOSTNAME=$(hostname -f) - # if /etc/machine-name is not empty then use the hostname from there - if [ -s /etc/machine-name ]; then - FULL_HOSTNAME=$(cat /etc/machine-name) - fi - - # write the nodeip_env file - # we need the line below because flatcar has the same string "coreos" in that file - if grep -q coreos /etc/os-release - then - echo "KUBELET_NODE_IP=${DEFAULT_IFC_IP}\nKUBELET_HOSTNAME=${FULL_HOSTNAME}" > /etc/kubernetes/nodeip.conf - else - mkdir -p /etc/systemd/system/kubelet.service.d - echo -e "[Service]\nEnvironment=\"KUBELET_NODE_IP=${DEFAULT_IFC_IP}\"\nEnvironment=\"KUBELET_HOSTNAME=${FULL_HOSTNAME}\"" > /etc/systemd/system/kubelet.service.d/nodeip.conf - fi - - - path: /etc/kubernetes/pki/ca.crt - content: - inline: - encoding: b64 - data: | - {{ .KubernetesCACert }} - - - path: /etc/systemd/system/setup.service - permissions: 644 - content: - inline: - encoding: b64 - data: | - [Install] - WantedBy=multi-user.target - - [Unit] - Requires=network-online.target - After=network-online.target - - [Service] - Type=oneshot - RemainAfterExit=true - EnvironmentFile=-/etc/environment - ExecStart=/opt/bin/supervise.sh /opt/bin/setup - - - path: /etc/profile.d/opt-bin-path.sh - permissions: 644 - content: - inline: - encoding: b64 - data: | - export PATH="/opt/bin:$PATH" - - - path: /etc/kubernetes/kubelet.conf - content: - inline: - encoding: b64 - data: | - apiVersion: kubelet.config.k8s.io/v1beta1 - kind: KubeletConfiguration - authentication: - anonymous: - enabled: false - webhook: - cacheTTL: 2m - enabled: true - x509: - clientCAFile: /etc/kubernetes/pki/ca.crt - authorization: - mode: Webhook - webhook: - cacheAuthorizedTTL: 5m0s - cacheUnauthorizedTTL: 30s - cgroupDriver: systemd - clusterDNS: - {{- range .ClusterDNSIPs }} - - "{{ . }}" - {{- end }} - clusterDomain: cluster.local - {{- if .ContainerLogMaxSize }} - containerLogMaxSize: {{ .ContainerLogMaxSize }} - {{- else }} - containerLogMaxSize: 100Mi - {{- end }} - {{- if .ContainerLogMaxFiles }} - containerLogMaxFiles: {{ .ContainerLogMaxFiles }} - {{- else }} - containerLogMaxFiles: 5 - {{- end }} - featureGates: - {{- if .KubeletFeatureGates -}} - {{ range $key, $val := .KubeletFeatureGates }} - {{ $key }}: {{ $val }} - {{- end -}} - {{- end }} - protectKernelDefaults: true - readOnlyPort: 0 - rotateCertificates: true - serverTLSBootstrap: true - staticPodPath: /etc/kubernetes/manifests - # Enable parallel image pulling. - serializeImagePulls: false - # Set max parallel image pulls to 10. - maxParallelImagePulls: 10 - kubeReserved: - {{- if .KubeReserved -}} - {{ range $key, $val := .KubeReserved }} - {{ $key }}: {{ $val }} - {{- end -}} - {{- else }} - cpu: 200m - ephemeral-storage: 1Gi - memory: 200Mi - {{- end }} - systemReserved: - {{- if .SystemReserved -}} - {{ range $key, $val := .SystemReserved }} - {{ $key }}: {{ $val }} - {{- end -}} - {{- else }} - cpu: 200m - ephemeral-storage: 1Gi - memory: 200Mi - {{- end }} - evictionHard: - {{- if .EvictionHard -}} - {{ range $key, $val := .EvictionHard }} - {{ $key }}: {{ $val }} - {{- end -}} - {{- else }} - imagefs.available: 15% - memory.available: 100Mi - nodefs.available: 10% - nodefs.inodesFree: 5% - {{- end }} - {{- if .MaxPods }} - maxPods: {{ .MaxPods }} - {{- end }} - tlsCipherSuites: - - TLS_AES_128_GCM_SHA256 - - TLS_AES_256_GCM_SHA384 - - TLS_CHACHA20_POLY1305_SHA256 - - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 - - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 - volumePluginDir: /var/lib/kubelet/volumeplugins - - - path: /etc/systemd/system/kubelet-healthcheck.service - permissions: 644 - content: - inline: - encoding: b64 - data: | - [Unit] - Requires=kubelet.service - After=kubelet.service - - [Service] - EnvironmentFile=-/etc/environment - ExecStart=/opt/bin/health-monitor.sh kubelet - - [Install] - WantedBy=multi-user.target - - - path: /opt/disable-swap.sh - permissions: 755 - content: - inline: - encoding: b64 - data: | - #!/usr/bin/env bash - set -euo pipefail - - # Make sure we always disable swap - Otherwise the kubelet won't start as for some cloud - # providers swap gets enabled on reboot or after the setup script has finished executing. - sed -i.orig '/.*swap.*/d' /etc/fstab - swapoff -a diff --git a/docs/compatibility-matrix.md b/docs/compatibility-matrix.md index 4f2e4ef7..70c55e3f 100644 --- a/docs/compatibility-matrix.md +++ b/docs/compatibility-matrix.md @@ -10,16 +10,16 @@ Currently supported K8S versions are: ## Operating System -| | Ubuntu | CentOS | Flatcar | Amazon Linux 2 | RHEL | Rocky Linux | -|---|---|---|---|---|---|---| -| AWS | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | -| Azure | ✓ | ✓ | ✓ | x | ✓ | ✓ | -| Digitalocean | ✓ | ✓ | x | x | x | ✓ | -| Equinix Metal | ✓ | ✓ | ✓ | x | x | ✓ | -| Google Cloud Platform | ✓ | x | ✓ | x | x | x | -| Hetzner | ✓ | x | x | x | x | ✓ | -| KubeVirt | ✓ | ✓ | ✓ | x | ✓ | ✓ | -| Nutanix | ✓ | ✓ | x | x | x | x | -| Openstack | ✓ | ✓ | ✓ | x | ✓ | ✓ | -| VMware Cloud Director | ✓ | x | ✓ | x | x | x | -| VSphere | ✓ | ✓ | ✓ | x | ✓ | ✓ | +| | Ubuntu | Flatcar | Amazon Linux 2 | RHEL | Rocky Linux | +|---|---|---|---|---|---| +| AWS | ✓ | ✓ | ✓ | ✓ | ✓ | +| Azure | ✓ | ✓ | x | ✓ | ✓ | +| Digitalocean | ✓ | x | x | x | ✓ | +| Equinix Metal | ✓ | ✓ | x | x | ✓ | +| Google Cloud Platform | ✓ | ✓ | x | x | x | +| Hetzner | ✓ | x | x | x | ✓ | +| KubeVirt | ✓ | ✓ | x | ✓ | ✓ | +| Nutanix | ✓ | x | x | x | x | +| Openstack | ✓ | ✓ | x | ✓ | ✓ | +| VMware Cloud Director | ✓ | ✓ | x | x | x | +| VSphere | ✓ | ✓ | x | ✓ | ✓ | diff --git a/hack/kkp/operatingsystemmanager.k8c.io_customoperatingsystemprofiles.yaml b/hack/kkp/operatingsystemmanager.k8c.io_customoperatingsystemprofiles.yaml index 55468ae1..82107fcf 100644 --- a/hack/kkp/operatingsystemmanager.k8c.io_customoperatingsystemprofiles.yaml +++ b/hack/kkp/operatingsystemmanager.k8c.io_customoperatingsystemprofiles.yaml @@ -235,7 +235,6 @@ spec: enum: - flatcar - rhel - - centos - ubuntu - amzn2 - rockylinux diff --git a/pkg/admission/machinedeployment/mutation/mutation.go b/pkg/admission/machinedeployment/mutation/mutation.go index bd823fdb..e5d76e82 100644 --- a/pkg/admission/machinedeployment/mutation/mutation.go +++ b/pkg/admission/machinedeployment/mutation/mutation.go @@ -110,7 +110,6 @@ func MutateMachineDeployment(md *clusterv1alpha1.MachineDeployment) error { switch providerConfig.OperatingSystem { case providerconfigtypes.OperatingSystemUbuntu, - providerconfigtypes.OperatingSystemCentOS, providerconfigtypes.OperatingSystemFlatcar, providerconfigtypes.OperatingSystemAmazonLinux2, providerconfigtypes.OperatingSystemRockyLinux, diff --git a/pkg/controllers/osc/resources/operating_system_config.go b/pkg/controllers/osc/resources/operating_system_config.go index 1cfe58df..c28c26e4 100644 --- a/pkg/controllers/osc/resources/operating_system_config.go +++ b/pkg/controllers/osc/resources/operating_system_config.go @@ -35,7 +35,6 @@ import ( "k8c.io/operating-system-manager/pkg/containerruntime" osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" "k8c.io/operating-system-manager/pkg/providerconfig/amzn2" - "k8c.io/operating-system-manager/pkg/providerconfig/centos" "k8c.io/operating-system-manager/pkg/providerconfig/flatcar" "k8c.io/operating-system-manager/pkg/providerconfig/rhel" "k8c.io/operating-system-manager/pkg/providerconfig/rockylinux" @@ -294,7 +293,6 @@ type filesData struct { type operatingSystemConfig struct { AmazonLinuxConfig amzn2.Config - CentOSConfig centos.Config FlatcarConfig flatcar.Config RhelConfig rhel.Config UbuntuConfig ubuntu.Config @@ -426,13 +424,6 @@ func setOperatingSystemConfig(os providerconfigtypes.OperatingSystem, operatingS } data.AmazonLinuxConfig = *config return nil - case providerconfigtypes.OperatingSystemCentOS: - config, err := centos.LoadConfig(operatingSystemSpec) - if err != nil { - return err - } - data.CentOSConfig = *config - return nil case providerconfigtypes.OperatingSystemFlatcar: config, err := flatcar.LoadConfig(operatingSystemSpec) if err != nil { diff --git a/pkg/controllers/osc/testdata/osc-rhel-8.x-cloud-init-modules.yaml b/pkg/controllers/osc/testdata/osc-rhel-8.x-cloud-init-modules.yaml index 90f4bd6d..aaf3d1cb 100644 --- a/pkg/controllers/osc/testdata/osc-rhel-8.x-cloud-init-modules.yaml +++ b/pkg/controllers/osc/testdata/osc-rhel-8.x-cloud-init-modules.yaml @@ -316,7 +316,7 @@ spec: systemctl disable --now firewalld || true yum install -y yum-utils - yum-config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo + yum-config-manager --add-repo=https://download.docker.com/linux/rhel/docker-ce.repo yum-config-manager --save --setopt=docker-ce-stable.module_hotfixes=true yum install -y containerd.io-1.6* yum-plugin-versionlock diff --git a/pkg/controllers/osc/testdata/osp-rhel-aws-cloud-init-modules.yaml b/pkg/controllers/osc/testdata/osp-rhel-aws-cloud-init-modules.yaml index d92d377c..f6fc9f0a 100644 --- a/pkg/controllers/osc/testdata/osp-rhel-aws-cloud-init-modules.yaml +++ b/pkg/controllers/osc/testdata/osp-rhel-aws-cloud-init-modules.yaml @@ -151,7 +151,7 @@ spec: templates: containerRuntimeInstallation: |- yum install -y yum-utils - yum-config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo + yum-config-manager --add-repo=https://download.docker.com/linux/rhel/docker-ce.repo {{- /* Due to DNF modules we have to do this on docker-ce repo More info at: https://bugzilla.redhat.com/show_bug.cgi?id=1756473 diff --git a/pkg/controllers/osc/testdata/secret-osc-rhel-8.x-cloud-init-modules-provisioning.yaml b/pkg/controllers/osc/testdata/secret-osc-rhel-8.x-cloud-init-modules-provisioning.yaml index 90d82be9..7836968a 100644 --- a/pkg/controllers/osc/testdata/secret-osc-rhel-8.x-cloud-init-modules-provisioning.yaml +++ b/pkg/controllers/osc/testdata/secret-osc-rhel-8.x-cloud-init-modules-provisioning.yaml @@ -1,6 +1,6 @@ apiVersion: v1 data: - cloud-config: I2Nsb3VkLWNvbmZpZwoKc3NoX3B3YXV0aDogZmFsc2UKCnNzaF9hdXRob3JpemVkX2tleXM6Ci0gJ3NzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQURBUUFCQUFBQ0FRRGRPSWhZbXpDSzVEU1ZMdTNjJwp3cml0ZV9maWxlczoKLSBwYXRoOiAnL29wdC9iaW4vaGVhbHRoLW1vbml0b3Iuc2gnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBJeUV2ZFhOeUwySnBiaTlsYm5ZZ1ltRnphQW9LSXlCRGIzQjVjbWxuYUhRZ01qQXhOaUJVYUdVZ1MzVmlaWEp1WlhSbGN5QkJkWFJvYjNKekxnb2pDaU1nVEdsalpXNXpaV1FnZFc1a1pYSWdkR2hsSUVGd1lXTm9aU0JNYVdObGJuTmxMQ0JXWlhKemFXOXVJREl1TUNBb2RHaGxJQ0pNYVdObGJuTmxJaWs3Q2lNZ2VXOTFJRzFoZVNCdWIzUWdkWE5sSUhSb2FYTWdabWxzWlNCbGVHTmxjSFFnYVc0Z1kyOXRjR3hwWVc1alpTQjNhWFJvSUhSb1pTQk1hV05sYm5ObExnb2pJRmx2ZFNCdFlYa2diMkowWVdsdUlHRWdZMjl3ZVNCdlppQjBhR1VnVEdsalpXNXpaU0JoZEFvakNpTWdJQ0FnSUdoMGRIQTZMeTkzZDNjdVlYQmhZMmhsTG05eVp5OXNhV05sYm5ObGN5OU1TVU5GVGxORkxUSXVNQW9qQ2lNZ1ZXNXNaWE56SUhKbGNYVnBjbVZrSUdKNUlHRndjR3hwWTJGaWJHVWdiR0YzSUc5eUlHRm5jbVZsWkNCMGJ5QnBiaUIzY21sMGFXNW5MQ0J6YjJaMGQyRnlaUW9qSUdScGMzUnlhV0oxZEdWa0lIVnVaR1Z5SUhSb1pTQk1hV05sYm5ObElHbHpJR1JwYzNSeWFXSjFkR1ZrSUc5dUlHRnVJQ0pCVXlCSlV5SWdRa0ZUU1ZNc0NpTWdWMGxVU0U5VlZDQlhRVkpTUVU1VVNVVlRJRTlTSUVOUFRrUkpWRWxQVGxNZ1QwWWdRVTVaSUV0SlRrUXNJR1ZwZEdobGNpQmxlSEJ5WlhOeklHOXlJR2x0Y0d4cFpXUXVDaU1nVTJWbElIUm9aU0JNYVdObGJuTmxJR1p2Y2lCMGFHVWdjM0JsWTJsbWFXTWdiR0Z1WjNWaFoyVWdaMjkyWlhKdWFXNW5JSEJsY20xcGMzTnBiMjV6SUdGdVpBb2pJR3hwYldsMFlYUnBiMjV6SUhWdVpHVnlJSFJvWlNCTWFXTmxibk5sTGdvS0l5QlVhR2x6SUhOamNtbHdkQ0JwY3lCbWIzSWdiV0Z6ZEdWeUlHRnVaQ0J1YjJSbElHbHVjM1JoYm1ObElHaGxZV3gwYUNCdGIyNXBkRzl5YVc1bkxDQjNhR2xqYUNCcGN3b2pJSEJoWTJ0bFpDQnBiaUJyZFdKbExXMWhibWxtWlhOMElIUmhjbUpoYkd3dUlFbDBJR2x6SUdWNFpXTjFkR1ZrSUhSb2NtOTFaMmdnWVNCemVYTjBaVzFrSUhObGNuWnBZMlVLSXlCcGJpQmpiSFZ6ZEdWeUwyZGpaUzluWTJrdlBHMWhjM1JsY2k5dWIyUmxQaTU1WVcxc0xpQlVhR1VnWlc1MklIWmhjbWxoWW14bGN5QmpiMjFsSUdaeWIyMGdZVzRnWlc1MkNpTWdabWxzWlNCd2NtOTJhV1JsWkNCaWVTQjBhR1VnYzNsemRHVnRaQ0J6WlhKMmFXTmxMZ29LSXlCVWFHbHpJSE5qY21sd2RDQnBjeUJoSUhOc2FXZG9kR3g1SUdGa2FuVnpkR1ZrSUhabGNuTnBiMjRnYjJZS0l5Qm9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZhM1ZpWlhKdVpYUmxjeTlyZFdKbGNtNWxkR1Z6TDJKc2IySXZaVEZoTVdGaE1qRXhNakkwWm1Oa09XSXlNVE0wTWpCaU9EQmlNbUZsTmpnd05qWTVOamd6WkM5amJIVnpkR1Z5TDJkalpTOW5ZMmt2YUdWaGJIUm9MVzF2Ym1sMGIzSXVjMmdLSXlCQlpHcDFjM1J0Wlc1MGN5QmhjbVU2Q2lNZ0tpQkxkV0psYkdWMElHaGxZV3gwYUNCd2IzSjBJR2x6SURFd01qUTRJRzV2ZENBeE1ESTFOUW9qSUNvZ1VtVnRiM1poYkNCdlppQmhiR3dnWVd4c0lISmxabVZ5Wlc1alpYTWdkRzhnZEdobElFdFZRa1ZmUlU1V0lHWnBiR1VLQ25ObGRDQXRieUJ1YjNWdWMyVjBDbk5sZENBdGJ5QndhWEJsWm1GcGJBb0tJeUJYWlNCemFXMXdiSGtnYTJsc2JDQjBhR1VnY0hKdlkyVnpjeUIzYUdWdUlIUm9aWEpsSUdseklHRWdabUZwYkhWeVpTNGdRVzV2ZEdobGNpQnplWE4wWlcxa0lITmxjblpwWTJVZ2QybHNiQW9qSUdGMWRHOXRZWFJwWTJGc2JIa2djbVZ6ZEdGeWRDQjBhR1VnY0hKdlkyVnpjeTRLWm5WdVkzUnBiMjRnWTI5dWRHRnBibVZ5WDNKMWJuUnBiV1ZmYlc5dWFYUnZjbWx1WnlncElIc0tJQ0JzYjJOaGJDQXRjaUJ0WVhoZllYUjBaVzF3ZEhNOU5Rb2dJR3h2WTJGc0lHRjBkR1Z0Y0hROU1Rb2dJR3h2WTJGc0lDMXlJR052Ym5SaGFXNWxjbDl5ZFc1MGFXMWxYMjVoYldVOUlpUjdRMDlPVkVGSlRrVlNYMUpWVGxSSlRVVmZUa0ZOUlRvdFpHOWphMlZ5ZlNJS0lDQWpJRmRsSUhOMGFXeHNJRzVsWldRZ2RHOGdkWE5sSUNka2IyTnJaWElnY0hNbklIZG9aVzRnWTI5dWRHRnBibVZ5SUhKMWJuUnBiV1VnYVhNZ0ltUnZZMnRsY2lJdUlGUm9hWE1nYVhNZ1ltVmpZWFZ6WlFvZ0lDTWdaRzlqYTJWeWMyaHBiU0JwY3lCemRHbHNiQ0J3WVhKMElHOW1JR3QxWW1Wc1pYUWdkRzlrWVhrdUlGZG9aVzRnYTNWaVpXeGxkQ0JwY3lCa2IzZHVMQ0JqY21samRHd2djRzlrY3dvZ0lDTWdkMmxzYkNCaGJITnZJR1poYVd3c0lHRnVaQ0JrYjJOclpYSWdkMmxzYkNCaVpTQnJhV3hzWldRdUlGUm9hWE1nYVhNZ2RXNWtaWE5wY21GaWJHVWdaWE53WldOcFlXeHNlU0IzYUdWdUNpQWdJeUJrYjJOclpYSWdiR2wyWlNCeVpYTjBiM0psSUdseklHUnBjMkZpYkdWa0xnb2dJR3h2WTJGc0lHaGxZV3gwYUdOb1pXTnJYMk52YlcxaGJtUTlJbVJ2WTJ0bGNpQndjeUlLSUNCcFppQmJXeUFpSkh0RFQwNVVRVWxPUlZKZlVsVk9WRWxOUlRvdFpHOWphMlZ5ZlNJZ0lUMGdJbVJ2WTJ0bGNpSWdYVjA3SUhSb1pXNEtJQ0FnSUdobFlXeDBhR05vWldOclgyTnZiVzFoYm1ROUltTnlhV04wYkNCd2IyUnpJZ29nSUdacENpQWdJeUJEYjI1MFlXbHVaWElnY25WdWRHbHRaU0J6ZEdGeWRIVndJSFJoYTJWeklIUnBiV1V1SUUxaGEyVWdhVzVwZEdsaGJDQmhkSFJsYlhCMGN5QmlaV1p2Y21VZ2MzUmhjblJwYm1jS0lDQWpJR3RwYkd4cGJtY2dkR2hsSUdOdmJuUmhhVzVsY2lCeWRXNTBhVzFsTGdvZ0lIVnVkR2xzSUhScGJXVnZkWFFnTmpBZ0pIdG9aV0ZzZEdoamFHVmphMTlqYjIxdFlXNWtmU0ErSUM5a1pYWXZiblZzYkRzZ1pHOEtJQ0FnSUdsbUlDZ29ZWFIwWlcxd2RDQTlQU0J0WVhoZllYUjBaVzF3ZEhNcEtUc2dkR2hsYmdvZ0lDQWdJQ0JsWTJodklDSk5ZWGdnWVhSMFpXMXdkQ0FrZTIxaGVGOWhkSFJsYlhCMGMzMGdjbVZoWTJobFpDRWdVSEp2WTJWbFpHbHVaeUIwYnlCdGIyNXBkRzl5SUdOdmJuUmhhVzVsY2lCeWRXNTBhVzFsSUdobFlXeDBhR2x1WlhOekxpSUtJQ0FnSUNBZ1luSmxZV3NLSUNBZ0lHWnBDaUFnSUNCbFkyaHZJQ0lrWVhSMFpXMXdkQ0JwYm1sMGFXRnNJR0YwZEdWdGNIUWdYQ0lrZTJobFlXeDBhR05vWldOclgyTnZiVzFoYm1SOVhDSWhJRlJ5ZVdsdVp5QmhaMkZwYmlCcGJpQWtZWFIwWlcxd2RDQnpaV052Ym1SekxpNHVJZ29nSUNBZ2MyeGxaWEFnSWlRb0tESWdLaW9nWVhSMFpXMXdkQ3NyS1NraUNpQWdaRzl1WlFvZ0lIZG9hV3hsSUhSeWRXVTdJR1J2Q2lBZ0lDQnBaaUFoSUhScGJXVnZkWFFnTmpBZ0pIdG9aV0ZzZEdoamFHVmphMTlqYjIxdFlXNWtmU0ErSUM5a1pYWXZiblZzYkRzZ2RHaGxiZ29nSUNBZ0lDQmxZMmh2SUNKRGIyNTBZV2x1WlhJZ2NuVnVkR2x0WlNBa2UyTnZiblJoYVc1bGNsOXlkVzUwYVcxbFgyNWhiV1Y5SUdaaGFXeGxaQ0VpQ2lBZ0lDQWdJR2xtSUZ0YklDSWtZMjl1ZEdGcGJtVnlYM0oxYm5ScGJXVmZibUZ0WlNJZ1BUMGdJbVJ2WTJ0bGNpSWdYVjA3SUhSb1pXNEtJQ0FnSUNBZ0lDQWpJRVIxYlhBZ2MzUmhZMnNnYjJZZ1pHOWphMlZ5SUdSaFpXMXZiaUJtYjNJZ2FXNTJaWE4wYVdkaGRHbHZiaTRLSUNBZ0lDQWdJQ0FqSUV4dlp5Qm1hV3hsSUc1aGJXVWdiRzl2YTNNZ2JHbHJaU0JuYjNKdmRYUnBibVV0YzNSaFkydHpMVlJKVFVWVFZFRk5VQ0JoYm1RZ2QybHNiQ0JpWlNCellYWmxaQ0IwYndvZ0lDQWdJQ0FnSUNNZ2RHaGxJR1Y0WldNZ2NtOXZkQ0JrYVhKbFkzUnZjbmtzSUhkb2FXTm9JR2x6SUM5MllYSXZjblZ1TDJSdlkydGxjaThnYjI0Z1ZXSjFiblIxSUdGdVpDQkRUMU11Q2lBZ0lDQWdJQ0FnY0d0cGJHd2dMVk5KUjFWVFVqRWdaRzlqYTJWeVpBb2dJQ0FnSUNCbWFRb2dJQ0FnSUNCemVYTjBaVzFqZEd3Z2EybHNiQ0F0TFd0cGJHd3RkMmh2UFcxaGFXNGdJaVI3WTI5dWRHRnBibVZ5WDNKMWJuUnBiV1ZmYm1GdFpYMGlDaUFnSUNBZ0lDTWdWMkZwZENCbWIzSWdZU0IzYUdsc1pTd2dZWE1nZDJVZ1pHOXVKM1FnZDJGdWRDQjBieUJyYVd4c0lHbDBJR0ZuWVdsdUlHSmxabTl5WlNCcGRDQnBjeUJ5WldGc2JIa2dkWEF1Q2lBZ0lDQWdJSE5zWldWd0lERXlNQW9nSUNBZ1pXeHpaUW9nSUNBZ0lDQnpiR1ZsY0NBaUpIdFRURVZGVUY5VFJVTlBUa1JUZlNJS0lDQWdJR1pwQ2lBZ1pHOXVaUXA5Q2dwbWRXNWpkR2x2YmlCcmRXSmxiR1YwWDIxdmJtbDBiM0pwYm1jb0tTQjdDaUFnWldOb2J5QWlWMkZwZENCbWIzSWdNaUJ0YVc1MWRHVnpJR1p2Y2lCcmRXSmxiR1YwSUhSdklHSmxJR1oxYm1OMGFXOXVZV3dpQ2lBZ2MyeGxaWEFnTVRJd0NpQWdiRzlqWVd3Z0xYSWdiV0Y0WDNObFkyOXVaSE05TVRBS0lDQnNiMk5oYkNCdmRYUndkWFE5SWlJS0lDQjNhR2xzWlNCMGNuVmxPeUJrYndvZ0lDQWdiRzlqWVd3Z1ptRnBiR1ZrUFdaaGJITmxDZ29nSUNBZ2FXWWdhbTkxY201aGJHTjBiQ0F0ZFNCcmRXSmxiR1YwSUMxdUlERWdmQ0JuY21Wd0lDMXhJQ0oxYzJVZ2IyWWdZMnh2YzJWa0lHNWxkSGR2Y21zZ1kyOXVibVZqZEdsdmJpSTdJSFJvWlc0S0lDQWdJQ0FnWm1GcGJHVmtQWFJ5ZFdVS0lDQWdJQ0FnWldOb2J5QWlTM1ZpWld4bGRDQnpkRzl3Y0dWa0lIQnZjM1JwYm1jZ2JtOWtaU0J6ZEdGMGRYTXVJRkpsYzNSaGNuUnBibWNpQ2lBZ0lDQmxiR2xtSUNFZ2IzVjBjSFYwUFNRb1kzVnliQ0F0YlNBaUpIdHRZWGhmYzJWamIyNWtjMzBpSUMxbUlDMXpJQzFUSUdoMGRIQTZMeTh4TWpjdU1DNHdMakU2TVRBeU5EZ3ZhR1ZoYkhSb2VpQXlQaVl4S1RzZ2RHaGxiZ29nSUNBZ0lDQm1ZV2xzWldROWRISjFaUW9nSUNBZ0lDQWpJRkJ5YVc1MElIUm9aU0J5WlhOd2IyNXpaU0JoYm1RdmIzSWdaWEp5YjNKekxnb2dJQ0FnSUNCbFkyaHZJQ0lrYjNWMGNIVjBJZ29nSUNBZ1pta0tDaUFnSUNCcFppQmJXeUFpSkdaaGFXeGxaQ0lnUFQwZ0luUnlkV1VpSUYxZE95QjBhR1Z1Q2lBZ0lDQWdJR1ZqYUc4Z0lrdDFZbVZzWlhRZ2FYTWdkVzVvWldGc2RHaDVJU0lLSUNBZ0lDQWdjM2x6ZEdWdFkzUnNJR3RwYkd3Z2EzVmlaV3hsZEFvZ0lDQWdJQ0FqSUZkaGFYUWdabTl5SUdFZ2QyaHBiR1VzSUdGeklIZGxJR1J2YmlkMElIZGhiblFnZEc4Z2EybHNiQ0JwZENCaFoyRnBiaUJpWldadmNtVWdhWFFnYVhNZ2NtVmhiR3g1SUhWd0xnb2dJQ0FnSUNCemJHVmxjQ0EyTUFvZ0lDQWdaV3h6WlFvZ0lDQWdJQ0J6YkdWbGNDQWlKSHRUVEVWRlVGOVRSVU5QVGtSVGZTSUtJQ0FnSUdacENpQWdaRzl1WlFwOUNnb2pJeU1qSXlNakl5TWpJeU1qSXlCTllXbHVJRVoxYm1OMGFXOXVJQ01qSXlNakl5TWpJeU1qSXlNakl5TUthV1lnVzFzZ0lpUWpJaUF0Ym1VZ01TQmRYVHNnZEdobGJnb2dJR1ZqYUc4Z0lsVnpZV2RsT2lCb1pXRnNkR2d0Ylc5dWFYUnZjaTV6YUNBOFkyOXVkR0ZwYm1WeUxYSjFiblJwYldVdmEzVmlaV3hsZEQ0aUNpQWdaWGhwZENBeENtWnBDZ3BUVEVWRlVGOVRSVU5QVGtSVFBURXdDbU52YlhCdmJtVnVkRDBrTVFwbFkyaHZJQ0pUZEdGeWRDQnJkV0psY201bGRHVnpJR2hsWVd4MGFDQnRiMjVwZEc5eWFXNW5JR1p2Y2lBa2UyTnZiWEJ2Ym1WdWRIMGlDbWxtSUZ0YklDSWtlMk52YlhCdmJtVnVkSDBpSUQwOUlDSmpiMjUwWVdsdVpYSXRjblZ1ZEdsdFpTSWdYVjA3SUhSb1pXNEtJQ0JqYjI1MFlXbHVaWEpmY25WdWRHbHRaVjl0YjI1cGRHOXlhVzVuQ21Wc2FXWWdXMXNnSWlSN1kyOXRjRzl1Wlc1MGZTSWdQVDBnSW10MVltVnNaWFFpSUYxZE95QjBhR1Z1Q2lBZ2EzVmlaV3hsZEY5dGIyNXBkRzl5YVc1bkNtVnNjMlVLSUNCbFkyaHZJQ0pJWldGc2RHZ2diVzl1YVhSdmNtbHVaeUJtYjNJZ1kyOXRjRzl1Wlc1MElDUjdZMjl0Y0c5dVpXNTBmU0JwY3lCdWIzUWdjM1Z3Y0c5eWRHVmtJU0lLWm1rSwoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL2pvdXJuYWxkLmNvbmYuZC9tYXhfZGlza191c2UuY29uZicKICBwZXJtaXNzaW9uczogJzA2NDQnCiAgZW5jb2Rpbmc6ICdiNjQnCiAgY29udGVudDogfC0KICAgIFcwcHZkWEp1WVd4ZENsTjVjM1JsYlUxaGVGVnpaVDAxUndvPQoKLSBwYXRoOiAnL29wdC9sb2FkLWtlcm5lbC1tb2R1bGVzLnNoJwogIHBlcm1pc3Npb25zOiAnMDc1NScKICBlbmNvZGluZzogJ2I2NCcKICBjb250ZW50OiB8LQogICAgSXlFdmRYTnlMMkpwYmk5bGJuWWdZbUZ6YUFwelpYUWdMV1YxYnlCd2FYQmxabUZwYkFvS2JXOWtjSEp2WW1VZ2FYQmZkR0ZpYkdWekNtMXZaSEJ5YjJKbElHbHdYM1p6Q20xdlpIQnliMkpsSUdsd1gzWnpYM0p5Q20xdlpIQnliMkpsSUdsd1gzWnpYM2R5Y2dwdGIyUndjbTlpWlNCcGNGOTJjMTl6YUFvS2FXWWdiVzlrYVc1bWJ5QnVabDlqYjI1dWRISmhZMnRmYVhCMk5DQW1QaUF2WkdWMkwyNTFiR3c3SUhSb1pXNEtJQ0J0YjJSd2NtOWlaU0J1Wmw5amIyNXVkSEpoWTJ0ZmFYQjJOQXBsYkhObENpQWdiVzlrY0hKdlltVWdibVpmWTI5dWJuUnlZV05yQ21acENnPT0KCi0gcGF0aDogJy9ldGMvc3lzY3RsLmQvazhzLmNvbmYnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBibVYwTG1KeWFXUm5aUzVpY21sa1oyVXRibVl0WTJGc2JDMXBjRFowWVdKc1pYTWdQU0F4Q201bGRDNWljbWxrWjJVdVluSnBaR2RsTFc1bUxXTmhiR3d0YVhCMFlXSnNaWE1nUFNBeENtdGxjbTVsYkM1d1lXNXBZMTl2Ymw5dmIzQnpJRDBnTVFwclpYSnVaV3d1Y0dGdWFXTWdQU0F4TUFwdVpYUXVhWEIyTkM1cGNGOW1iM0ozWVhKa0lEMGdNUXAyYlM1dmRtVnlZMjl0YldsMFgyMWxiVzl5ZVNBOUlERUtabk11YVc1dmRHbG1lUzV0WVhoZmRYTmxjbDkzWVhSamFHVnpJRDBnTVRBME9EVTNOZ3BtY3k1cGJtOTBhV1o1TG0xaGVGOTFjMlZ5WDJsdWMzUmhibU5sY3lBOUlEZ3hPVElLCgotIHBhdGg6ICcvZXRjL3NlbGludXgvY29uZmlnJwogIHBlcm1pc3Npb25zOiAnMDY0NCcKICBlbmNvZGluZzogJ2I2NCcKICBjb250ZW50OiB8LQogICAgSXlCVWFHbHpJR1pwYkdVZ1kyOXVkSEp2YkhNZ2RHaGxJSE4wWVhSbElHOW1JRk5GVEdsdWRYZ2diMjRnZEdobElITjVjM1JsYlM0S0l5QlRSVXhKVGxWWVBTQmpZVzRnZEdGclpTQnZibVVnYjJZZ2RHaGxjMlVnZEdoeVpXVWdkbUZzZFdWek9nb2pJQ0FnSUNCbGJtWnZjbU5wYm1jZ0xTQlRSVXhwYm5WNElITmxZM1Z5YVhSNUlIQnZiR2xqZVNCcGN5QmxibVp2Y21ObFpDNEtJeUFnSUNBZ2NHVnliV2x6YzJsMlpTQXRJRk5GVEdsdWRYZ2djSEpwYm5SeklIZGhjbTVwYm1keklHbHVjM1JsWVdRZ2IyWWdaVzVtYjNKamFXNW5MZ29qSUNBZ0lDQmthWE5oWW14bFpDQXRJRTV2SUZORlRHbHVkWGdnY0c5c2FXTjVJR2x6SUd4dllXUmxaQzRLVTBWTVNVNVZXRDF3WlhKdGFYTnphWFpsQ2lNZ1UwVk1TVTVWV0ZSWlVFVTlJR05oYmlCMFlXdGxJRzl1WlNCdlppQjBhSEpsWlNCMGQyOGdkbUZzZFdWek9nb2pJQ0FnSUNCMFlYSm5aWFJsWkNBdElGUmhjbWRsZEdWa0lIQnliMk5sYzNObGN5QmhjbVVnY0hKdmRHVmpkR1ZrTEFvaklDQWdJQ0J0YVc1cGJYVnRJQzBnVFc5a2FXWnBZMkYwYVc5dUlHOW1JSFJoY21kbGRHVmtJSEJ2YkdsamVTNGdUMjVzZVNCelpXeGxZM1JsWkNCd2NtOWpaWE56WlhNZ1lYSmxJSEJ5YjNSbFkzUmxaQzRLSXlBZ0lDQWdiV3h6SUMwZ1RYVnNkR2tnVEdWMlpXd2dVMlZqZFhKcGRIa2djSEp2ZEdWamRHbHZiaTRLVTBWTVNVNVZXRlJaVUVVOWRHRnlaMlYwWldRSwoKLSBwYXRoOiAnL29wdC9iaW4vc2V0dXAnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBJeUV2WW1sdUwySmhjMmdLYzJWMElDMTRaWFZ2SUhCcGNHVm1ZV2xzQ2dwelpYUmxibVp2Y21ObElEQWdmSHdnZEhKMVpRcHplWE4wWlcxamRHd2djbVZ6ZEdGeWRDQnplWE4wWlcxa0xXMXZaSFZzWlhNdGJHOWhaQzV6WlhKMmFXTmxDbk41YzJOMGJDQXRMWE41YzNSbGJRb0tJeUJQZG1WeWNtbGtaU0JvYjNOMGJtRnRaU0JwWmlBdlpYUmpMMjFoWTJocGJtVXRibUZ0WlNCbGVHbHpkSE1LYVdZZ1d5QXRlQ0FpSkNoamIyMXRZVzVrSUMxMklHaHZjM1J1WVcxbFkzUnNLU0lnWFNBbUppQmJJQzF6SUM5bGRHTXZiV0ZqYUdsdVpTMXVZVzFsSUYwN0lIUm9aVzRLSUNCdFlXTm9hVzVsWDI1aGJXVTlKQ2hqWVhRZ0wyVjBZeTl0WVdOb2FXNWxMVzVoYldVcENpQWdhRzl6ZEc1aGJXVmpkR3dnYzJWMExXaHZjM1J1WVcxbElDUjdiV0ZqYUdsdVpWOXVZVzFsZlFwbWFRb0tlWFZ0SUdsdWMzUmhiR3dnTFhrZ1hBb2dJR1JsZG1salpTMXRZWEJ3WlhJdGNHVnljMmx6ZEdWdWRDMWtZWFJoSUZ3S0lDQnNkbTB5SUZ3S0lDQmxZblJoWW14bGN5QmNDaUFnWlhSb2RHOXZiQ0JjQ2lBZ2JtWnpMWFYwYVd4eklGd0tJQ0JpWVhOb0xXTnZiWEJzWlhScGIyNGdYQW9nSUhOMVpHOGdYQW9nSUhOdlkyRjBJRndLSUNCM1oyVjBJRndLSUNCamRYSnNJRndLSUNCcGNIWnpZV1J0Q2dwemVYTjBaVzFqZEd3Z1pHbHpZV0pzWlNBdExXNXZkeUJtYVhKbGQyRnNiR1FnZkh3Z2RISjFaUXA1ZFcwZ2FXNXpkR0ZzYkNBdGVTQjVkVzB0ZFhScGJITUtlWFZ0TFdOdmJtWnBaeTF0WVc1aFoyVnlJQzB0WVdSa0xYSmxjRzg5YUhSMGNITTZMeTlrYjNkdWJHOWhaQzVrYjJOclpYSXVZMjl0TDJ4cGJuVjRMMk5sYm5SdmN5OWtiMk5yWlhJdFkyVXVjbVZ3YndwNWRXMHRZMjl1Wm1sbkxXMWhibUZuWlhJZ0xTMXpZWFpsSUMwdGMyVjBiM0IwUFdSdlkydGxjaTFqWlMxemRHRmliR1V1Ylc5a2RXeGxYMmh2ZEdacGVHVnpQWFJ5ZFdVS0NubDFiU0JwYm5OMFlXeHNJQzE1SUdOdmJuUmhhVzVsY21RdWFXOHRNUzQyS2lCNWRXMHRjR3gxWjJsdUxYWmxjbk5wYjI1c2IyTnJDbmwxYlNCMlpYSnphVzl1Ykc5amF5QmhaR1FnWTI5dWRHRnBibVZ5WkM1cGJ3b0tjM2x6ZEdWdFkzUnNJR1JoWlcxdmJpMXlaV3h2WVdRS2MzbHpkR1Z0WTNSc0lHVnVZV0pzWlNBdExXNXZkeUJqYjI1MFlXbHVaWEprQ2dwdmNIUmZZbWx1UFM5dmNIUXZZbWx1Q25WemNsOXNiMk5oYkY5aWFXNDlMM1Z6Y2k5c2IyTmhiQzlpYVc0S1kyNXBYMkpwYmw5a2FYSTlMMjl3ZEM5amJta3ZZbWx1Q20xclpHbHlJQzF3SUM5bGRHTXZZMjVwTDI1bGRDNWtJQzlsZEdNdmEzVmlaWEp1WlhSbGN5OXRZVzVwWm1WemRITWdJaVJ2Y0hSZlltbHVJaUFpSkdOdWFWOWlhVzVmWkdseUlncGhjbU5vUFNSN1NFOVRWRjlCVWtOSUxYMEthV1lnV3lBdGVpQWlKR0Z5WTJnaUlGMEtkR2hsYmdwallYTmxJQ1FvZFc1aGJXVWdMVzBwSUdsdUNuZzRObDgyTkNrS0lDQWdJR0Z5WTJnOUltRnRaRFkwSWdvZ0lDQWdPenNLWVdGeVkyZzJOQ2tLSUNBZ0lHRnlZMmc5SW1GeWJUWTBJZ29nSUNBZ096c0tLaWtLSUNBZ0lHVmphRzhnSW5WdWMzVndjRzl5ZEdWa0lFTlFWU0JoY21Ob2FYUmxZM1IxY21Vc0lHVjRhWFJwYm1jaUNpQWdJQ0JsZUdsMElERUtJQ0FnSURzN0NtVnpZV01LWm1rS1EwNUpYMVpGVWxOSlQwNDlJaVI3UTA1SlgxWkZVbE5KVDA0NkxYWXhMalV1TVgwaUNtTnVhVjlpWVhObFgzVnliRDBpYUhSMGNITTZMeTluYVhSb2RXSXVZMjl0TDJOdmJuUmhhVzVsY201bGRIZHZjbXRwYm1jdmNHeDFaMmx1Y3k5eVpXeGxZWE5sY3k5a2IzZHViRzloWkM4a1EwNUpYMVpGVWxOSlQwNGlDbU51YVY5bWFXeGxibUZ0WlQwaVkyNXBMWEJzZFdkcGJuTXRiR2x1ZFhndEpHRnlZMmd0SkVOT1NWOVdSVkpUU1U5T0xuUm5laUlLWTNWeWJDQXRUR1p2SUNJa1kyNXBYMkpwYmw5a2FYSXZKR051YVY5bWFXeGxibUZ0WlNJZ0lpUmpibWxmWW1GelpWOTFjbXd2SkdOdWFWOW1hV3hsYm1GdFpTSUtZMjVwWDNOMWJUMGtLR04xY213Z0xVeG1JQ0lrWTI1cFgySmhjMlZmZFhKc0x5UmpibWxmWm1sc1pXNWhiV1V1YzJoaE1qVTJJaWtLWTJRZ0lpUmpibWxmWW1sdVgyUnBjaUlLYzJoaE1qVTJjM1Z0SUMxaklEdzhQQ0lrWTI1cFgzTjFiU0lLZEdGeUlIaDJaaUFpSkdOdWFWOW1hV3hsYm1GdFpTSUtjbTBnTFdZZ0lpUmpibWxmWm1sc1pXNWhiV1VpQ21Oa0lDMEtZMmh2ZDI0Z0xWSWdjbTl2ZERweWIyOTBJQ0lrWTI1cFgySnBibDlrYVhJaUNncERVa2xmVkU5UFRGTmZVa1ZNUlVGVFJUMGlKSHREVWtsZlZFOVBURk5mVWtWTVJVRlRSVG90ZGpFdU1qa3VNSDBpQ21OeWFWOTBiMjlzYzE5aVlYTmxYM1Z5YkQwaWFIUjBjSE02THk5bmFYUm9kV0l1WTI5dEwydDFZbVZ5Ym1WMFpYTXRjMmxuY3k5amNta3RkRzl2YkhNdmNtVnNaV0Z6WlhNdlpHOTNibXh2WVdRdkpIdERVa2xmVkU5UFRGTmZVa1ZNUlVGVFJYMGlDbU55YVY5MGIyOXNjMTltYVd4bGJtRnRaVDBpWTNKcFkzUnNMU1I3UTFKSlgxUlBUMHhUWDFKRlRFVkJVMFY5TFd4cGJuVjRMU1I3WVhKamFIMHVkR0Z5TG1kNklncGpkWEpzSUMxTVptOGdJaVJ2Y0hSZlltbHVMeVJqY21sZmRHOXZiSE5mWm1sc1pXNWhiV1VpSUNJa1kzSnBYM1J2YjJ4elgySmhjMlZmZFhKc0x5UmpjbWxmZEc5dmJITmZabWxzWlc1aGJXVWlDbU55YVY5MGIyOXNjMTl6ZFcxZmRtRnNkV1U5SkNoamRYSnNJQzFNWmlBaUpHTnlhVjkwYjI5c2MxOWlZWE5sWDNWeWJDOGtZM0pwWDNSdmIyeHpYMlpwYkdWdVlXMWxMbk5vWVRJMU5pSXBDbU55YVY5MGIyOXNjMTl6ZFcwOUlpUmpjbWxmZEc5dmJITmZjM1Z0WDNaaGJIVmxJQ1JqY21sZmRHOXZiSE5mWm1sc1pXNWhiV1VpQ21Oa0lDSWtiM0IwWDJKcGJpSUtjMmhoTWpVMmMzVnRJQzFqSUR3OFBDSWtZM0pwWDNSdmIyeHpYM04xYlNJS2RHRnlJSGgyWmlBaUpHTnlhVjkwYjI5c2MxOW1hV3hsYm1GdFpTSUtjbTBnTFdZZ0lpUmpjbWxmZEc5dmJITmZabWxzWlc1aGJXVWlDbXh1SUMxelppQWlKRzl3ZEY5aWFXNHZZM0pwWTNSc0lpQWlKSFZ6Y2w5c2IyTmhiRjlpYVc0aUwyTnlhV04wYkNCOGZDQmxZMmh2SUNKemVXMWliMnhwWXlCc2FXNXJJR2x6SUhOcmFYQndaV1FpQ21Oa0lDMEtTMVZDUlY5V1JWSlRTVTlPUFNJa2UwdFZRa1ZmVmtWU1UwbFBUam90ZGpFdU16RXVNSDBpQ210MVltVmZaR2x5UFNJa2IzQjBYMkpwYmk5cmRXSmxjbTVsZEdWekxTUkxWVUpGWDFaRlVsTkpUMDRpQ210MVltVmZZbUZ6WlY5MWNtdzlJbWgwZEhCek9pOHZaR3d1YXpoekxtbHZMeVJMVlVKRlgxWkZVbE5KVDA0dlltbHVMMnhwYm5WNEx5UmhjbU5vSWdwcmRXSmxYM04xYlY5bWFXeGxQU0lrYTNWaVpWOWthWEl2YzJoaE1qVTJJZ3B0YTJScGNpQXRjQ0FpSkd0MVltVmZaR2x5SWdvNklENGlKR3QxWW1WZmMzVnRYMlpwYkdVaUNncG1iM0lnWW1sdUlHbHVJR3QxWW1Wc1pYUWdhM1ZpWldGa2JTQnJkV0psWTNSc095Qmtid29nSUNBZ1kzVnliQ0F0VEdadklDSWthM1ZpWlY5a2FYSXZKR0pwYmlJZ0lpUnJkV0psWDJKaGMyVmZkWEpzTHlSaWFXNGlDaUFnSUNCamFHMXZaQ0FyZUNBaUpHdDFZbVZmWkdseUx5UmlhVzRpQ2lBZ0lDQnpkVzA5SkNoamRYSnNJQzFNWmlBaUpHdDFZbVZmWW1GelpWOTFjbXd2SkdKcGJpNXphR0V5TlRZaUtRb2dJQ0FnWldOb2J5QWlKSE4xYlNBZ0pHdDFZbVZmWkdseUx5UmlhVzRpSUQ0K0lpUnJkV0psWDNOMWJWOW1hV3hsSWdwa2IyNWxDbk5vWVRJMU5uTjFiU0F0WXlBaUpHdDFZbVZmYzNWdFgyWnBiR1VpQ2dwbWIzSWdZbWx1SUdsdUlHdDFZbVZzWlhRZ2EzVmlaV0ZrYlNCcmRXSmxZM1JzT3lCa2J3b2dJQ0FnYkc0Z0xYTm1JQ0lrYTNWaVpWOWthWEl2SkdKcGJpSWdJaVJ2Y0hSZlltbHVJaThrWW1sdUNtUnZibVVLQ2tSRlJrRlZURlJmU1VaRFgwNUJUVVU5SkNocGNDQXRieUJ5YjNWMFpTQm5aWFFnTVNBZ2ZDQm5jbVZ3SUMxdlVDQWlaR1YySUZ4TFhGTXJJaWtLU1VaRFgwTkdSMTlHU1V4RlBTOWxkR012YzNselkyOXVabWxuTDI1bGRIZHZjbXN0YzJOeWFYQjBjeTlwWm1ObVp5MGtSRVZHUVZWTVZGOUpSa05mVGtGTlJRb2pJRVZ1WVdKc1pTQkpVSFkySUdGdVpDQkVTRU5RZGpZZ2IyNGdkR2hsSUdSbFptRjFiSFFnYVc1MFpYSm1ZV05sQ21keVpYQWdTVkJXTmtsT1NWUWdKRWxHUTE5RFJrZGZSa2xNUlNBbUppQnpaV1FnTFdrZ0p5OUpVRlkyU1U1SlZDb3ZZeUJKVUZZMlNVNUpWRDE1WlhNbklDUkpSa05mUTBaSFgwWkpURVVnZkh3Z1pXTm9ieUFpU1ZCV05rbE9TVlE5ZVdWeklpQStQaUFrU1VaRFgwTkdSMTlHU1V4RkNtZHlaWEFnUkVoRFVGWTJReUFrU1VaRFgwTkdSMTlHU1V4RklDWW1JSE5sWkNBdGFTQW5MMFJJUTFCV05rTXFMMk1nUkVoRFVGWTJRejE1WlhNbklDUkpSa05mUTBaSFgwWkpURVVnZkh3Z1pXTm9ieUFpUkVoRFVGWTJRejE1WlhNaUlENCtJQ1JKUmtOZlEwWkhYMFpKVEVVS1ozSmxjQ0JKVUZZMlgwRlZWRTlEVDA1R0lDUkpSa05mUTBaSFgwWkpURVVnSmlZZ2MyVmtJQzFwSUNjdlNWQldObDlCVlZSUFEwOU9SaW92WXlCSlVGWTJYMEZWVkU5RFQwNUdQWGxsY3ljZ0pFbEdRMTlEUmtkZlJrbE1SU0I4ZkNCbFkyaHZJQ0pKVUZZMlgwRlZWRTlEVDA1R1BYbGxjeUlnUGo0Z0pFbEdRMTlEUmtkZlJrbE1SUW9LSXlCU1pYTjBZWEowSUU1bGRIZHZjbXROWVc1aFoyVnlJSFJ2SUdGd2NHeDVJR1p2Y2lCSlVIWTJJR052Ym1acFozTUtjM2x6ZEdWdFkzUnNJSEpsYzNSaGNuUWdUbVYwZDI5eWEwMWhibUZuWlhJS0l5Qk1aWFFnVG1WMGQyOXlhMDFoYm1GblpYSWdZWEJ3YkhrZ2RHaGxJRVJJUTFCMk5pQmpiMjVtYVdkekNuTnNaV1Z3SURNS0NtMXJaR2x5SUMxd0lDOWxkR012YzNsemRHVnRaQzl6ZVhOMFpXMHZhM1ZpWld4bGRDNXpaWEoyYVdObExtUXZDaU1nYzJWMElHdDFZbVZzWlhRZ2JtOWtaV2x3SUdWdWRtbHliMjV0Wlc1MElIWmhjbWxoWW14bENpOXZjSFF2WW1sdUwzTmxkSFZ3WDI1bGRGOWxibll1YzJnS0NncGpkWEpzSUMxeklDMXJJQzEySUMwdGFHVmhaR1Z5SUNkQmRYUm9iM0pwZW1GMGFXOXVPaUJDWldGeVpYSWdkRzl3TFhObFkzSmxkQ2NnYUhSMGNITTZMeTltYjI4dVltRnlPalkwTkRNdllYQnBMM1l4TDI1aGJXVnpjR0ZqWlhNdlkyeHZkV1F0YVc1cGRDMXpaWFIwYVc1bmN5OXpaV055WlhSekwydDFZbVV0YzNsemRHVnRMVzl6Y0MxeWFHVnNMV0YzY3kxcmRXSmxiR1YwTFdKdmIzUnpkSEpoY0MxamIyNW1hV2NnZkNCcWNTQW5MbVJoZEdGYkltdDFZbVZqYjI1bWFXY2lYU2NnTFhKOElHSmhjMlUyTkNBdFpDQStJQzlsZEdNdmEzVmlaWEp1WlhSbGN5OWliMjkwYzNSeVlYQXRhM1ZpWld4bGRDNWpiMjVtQ2dwemVYTjBaVzFqZEd3Z1pXNWhZbXhsSUMwdGJtOTNJR3QxWW1Wc1pYUUtjM2x6ZEdWdFkzUnNJR1Z1WVdKc1pTQXRMVzV2ZHlBdExXNXZMV0pzYjJOcklHdDFZbVZzWlhRdGFHVmhiSFJvWTJobFkyc3VjMlZ5ZG1salpRcHplWE4wWlcxamRHd2daR2x6WVdKc1pTQnpaWFIxY0M1elpYSjJhV05sQ2c9PQoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LnNlcnZpY2UnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBXMVZ1YVhSZENrRm1kR1Z5UFdOdmJuUmhhVzVsY21RdWMyVnlkbWxqWlFwU1pYRjFhWEpsY3oxamIyNTBZV2x1WlhKa0xuTmxjblpwWTJVS0NrUmxjMk55YVhCMGFXOXVQV3QxWW1Wc1pYUTZJRlJvWlNCTGRXSmxjbTVsZEdWeklFNXZaR1VnUVdkbGJuUUtSRzlqZFcxbGJuUmhkR2x2Ymoxb2RIUndjem92TDJ0MVltVnlibVYwWlhNdWFXOHZaRzlqY3k5b2IyMWxMd29LVzFObGNuWnBZMlZkQ2xWelpYSTljbTl2ZEFwU1pYTjBZWEowUFdGc2QyRjVjd3BUZEdGeWRFeHBiV2wwU1c1MFpYSjJZV3c5TUFwU1pYTjBZWEowVTJWalBURXdDa05RVlVGalkyOTFiblJwYm1jOWRISjFaUXBOWlcxdmNubEJZMk52ZFc1MGFXNW5QWFJ5ZFdVS0NrVnVkbWx5YjI1dFpXNTBQU0pRUVZSSVBTOXZjSFF2WW1sdU9pOWlhVzQ2TDNWemNpOXNiMk5oYkM5elltbHVPaTkxYzNJdmJHOWpZV3d2WW1sdU9pOTFjM0l2YzJKcGJqb3ZkWE55TDJKcGJqb3ZjMkpwYmk4aUNrVnVkbWx5YjI1dFpXNTBSbWxzWlQwdEwyVjBZeTlsYm5acGNtOXViV1Z1ZEFvS1JYaGxZMU4wWVhKMFVISmxQUzlpYVc0dlltRnphQ0F2YjNCMEwyUnBjMkZpYkdVdGMzZGhjQzV6YUFwRmVHVmpVM1JoY25SUWNtVTlMMkpwYmk5aVlYTm9JQzl2Y0hRdmJHOWhaQzFyWlhKdVpXd3RiVzlrZFd4bGN5NXphQXBGZUdWalUzUmhjblJRY21VOUwySnBiaTlpWVhOb0lDOXZjSFF2WW1sdUwzTmxkSFZ3WDI1bGRGOWxibll1YzJnS1JYaGxZMU4wWVhKMFBTOXZjSFF2WW1sdUwydDFZbVZzWlhRZ1hBb2dJQzB0WW05dmRITjBjbUZ3TFd0MVltVmpiMjVtYVdjOUwyVjBZeTlyZFdKbGNtNWxkR1Z6TDJKdmIzUnpkSEpoY0MxcmRXSmxiR1YwTG1OdmJtWWdYQW9nSUMwdGEzVmlaV052Ym1acFp6MHZkbUZ5TDJ4cFlpOXJkV0psYkdWMEwydDFZbVZqYjI1bWFXY2dYQW9nSUMwdFkyOXVabWxuUFM5bGRHTXZhM1ZpWlhKdVpYUmxjeTlyZFdKbGJHVjBMbU52Ym1ZZ1hBb2dJQzB0WTJWeWRDMWthWEk5TDJWMFl5OXJkV0psY201bGRHVnpMM0JyYVNCY0NpQWdMUzFsZUdsMExXOXVMV3h2WTJzdFkyOXVkR1Z1ZEdsdmJpQmNDaUFnTFMxc2IyTnJMV1pwYkdVOUwzUnRjQzlyZFdKbGJHVjBMbXh2WTJzZ1hBb2dJQzB0WTI5dWRHRnBibVZ5TFhKMWJuUnBiV1V0Wlc1a2NHOXBiblE5ZFc1cGVEb3ZMeTl5ZFc0dlkyOXVkR0ZwYm1WeVpDOWpiMjUwWVdsdVpYSmtMbk52WTJzZ1hBb2dJQzB0Ym05a1pTMXBjQ0FrZTB0VlFrVk1SVlJmVGs5RVJWOUpVSDBLQ2x0SmJuTjBZV3hzWFFwWFlXNTBaV1JDZVQxdGRXeDBhUzExYzJWeUxuUmhjbWRsZEFvPQoKLSBwYXRoOiAnL2V0Yy9rdWJlcm5ldGVzL2Nsb3VkLWNvbmZpZycKICBwZXJtaXNzaW9uczogJzA2MDAnCiAgZW5jb2Rpbmc6ICdiNjQnCiAgY29udGVudDogfC0KICAgIENnPT0KCi0gcGF0aDogJy9vcHQvYmluL3NldHVwX25ldF9lbnYuc2gnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBJeUV2ZFhOeUwySnBiaTlsYm5ZZ1ltRnphQXBsWTJodlpHRjBaU2dwSUhzS0lDQmxZMmh2SUNKYkpDaGtZWFJsSUMxSmN5bGRJaUFpSkVBaUNuMEtDaU1nWjJWMElIUm9aU0JrWldaaGRXeDBJR2x1ZEdWeVptRmpaU0JKVUNCaFpHUnlaWE56Q2tSRlJrRlZURlJmU1VaRFgwbFFQU1FvYVhBZ0xXOGdJSEp2ZFhSbElHZGxkQ0F4SUh3Z1ozSmxjQ0F0YjFBZ0luTnlZeUJjUzF4VEt5SXBDZ3BwWmlCYklDMTZJQ0lrZTBSRlJrRlZURlJmU1VaRFgwbFFmU0lnWFFwMGFHVnVDaUFnWldOb2IyUmhkR1VnSWtaaGFXeGxaQ0IwYnlCblpYUWdTVkFnWVdSa2NtVnpjeUJtYjNJZ2RHaGxJR1JsWm1GMWJIUWdjbTkxZEdVZ2FXNTBaWEptWVdObElnb2dJR1Y0YVhRZ01RcG1hUW9LSXlCblpYUWdkR2hsSUdaMWJHd2dhRzl6ZEc1aGJXVUtSbFZNVEY5SVQxTlVUa0ZOUlQwa0tHaHZjM1J1WVcxbElDMW1LUW9qSUdsbUlDOWxkR012YldGamFHbHVaUzF1WVcxbElHbHpJRzV2ZENCbGJYQjBlU0IwYUdWdUlIVnpaU0IwYUdVZ2FHOXpkRzVoYldVZ1puSnZiU0IwYUdWeVpRcHBaaUJiSUMxeklDOWxkR012YldGamFHbHVaUzF1WVcxbElGMDdJSFJvWlc0S0lDQkdWVXhNWDBoUFUxUk9RVTFGUFNRb1kyRjBJQzlsZEdNdmJXRmphR2x1WlMxdVlXMWxLUXBtYVFvS0l5QjNjbWwwWlNCMGFHVWdibTlrWldsd1gyVnVkaUJtYVd4bENpTWdkMlVnYm1WbFpDQjBhR1VnYkdsdVpTQmlaV3h2ZHlCaVpXTmhkWE5sSUdac1lYUmpZWElnYUdGeklIUm9aU0J6WVcxbElITjBjbWx1WnlBaVkyOXlaVzl6SWlCcGJpQjBhR0YwSUdacGJHVUthV1lnWjNKbGNDQXRjU0JqYjNKbGIzTWdMMlYwWXk5dmN5MXlaV3hsWVhObENuUm9aVzRLSUNCbFkyaHZJQ0pMVlVKRlRFVlVYMDVQUkVWZlNWQTlKSHRFUlVaQlZVeFVYMGxHUTE5SlVIMWNia3RWUWtWTVJWUmZTRTlUVkU1QlRVVTlKSHRHVlV4TVgwaFBVMVJPUVUxRmZTSWdQaUF2WlhSakwydDFZbVZ5Ym1WMFpYTXZibTlrWldsd0xtTnZibVlLWld4elpRb2dJRzFyWkdseUlDMXdJQzlsZEdNdmMzbHpkR1Z0WkM5emVYTjBaVzB2YTNWaVpXeGxkQzV6WlhKMmFXTmxMbVFLSUNCbFkyaHZJQzFsSUNKYlUyVnlkbWxqWlYxY2JrVnVkbWx5YjI1dFpXNTBQVndpUzFWQ1JVeEZWRjlPVDBSRlgwbFFQU1I3UkVWR1FWVk1WRjlKUmtOZlNWQjlYQ0pjYmtWdWRtbHliMjV0Wlc1MFBWd2lTMVZDUlV4RlZGOUlUMU5VVGtGTlJUMGtlMFpWVEV4ZlNFOVRWRTVCVFVWOVhDSWlJRDRnTDJWMFl5OXplWE4wWlcxa0wzTjVjM1JsYlM5cmRXSmxiR1YwTG5ObGNuWnBZMlV1WkM5dWIyUmxhWEF1WTI5dVpncG1hUW89CgotIHBhdGg6ICcvZXRjL2t1YmVybmV0ZXMvcGtpL2NhLmNydCcKICBwZXJtaXNzaW9uczogJzA2NDQnCiAgZW5jb2Rpbmc6ICdiNjQnCiAgY29udGVudDogfC0KICAgIExTMHRMUzFDUlVkSlRpQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENrMUpTVVZYYWtORFFUQkxaMEYzU1VKQlowbEtRVXhtVW14WGMwazRXVkZJVFVFd1IwTlRjVWRUU1dJelJGRkZRa0pSVlVGTlNITjRRM3BCU2tKblRsWUtRa0ZaVkVGc1ZsUk5VWE4zUTFGWlJGWlJVVWxGZDBwRVVWUkZWMDFDVVVkQk1WVkZRbmhOVGxVeVJuVkpSVnA1V1ZjMWFtRllUbXBpZWtWVlRVSkpSd3BCTVZWRlEyaE5URkZ1U21oYVIxcHdaRWh3Y0dKdFRYaEZha0ZSUW1kT1ZrSkJUVlJEVjNoMldUSkdjMkZIT1hwa1JFVmtUVUp6UjBOVGNVZFRTV0l6Q2tSUlJVcEJVbGxQV1c1S2FGcEZRbXRaVnpWdVdWTTFhbUl5TUhkSWFHTk9UVlJSZDA1NlJURk5ha0V3VG1wQk1WZG9ZMDVOVkdOM1RsUkJNRTFxUVRBS1RtcEJNVmRxUWpkTlVYTjNRMUZaUkZaUlVVZEZkMHBXVlhwRlRFMUJhMGRCTVZWRlEwSk5RMUV3UlhoR2FrRlZRbWRPVmtKQlkxUkVWazVvWW1sQ1J3cGpiVVoxV1RKc2Vsa3lPSGhHUkVGVFFtZE9Wa0pCYjFSRE1FcDVXVmRTYldGWVVqWmhWelZxVFZKSmQwVkJXVVJXVVZGRVJYZHNjMkl5VG1oaVIyaDJDbU16VVhoSVZFRmlRbWRyY1docmFVYzVkekJDUTFGRlYwUnRTbmxaVjFKQldrZEdkVm95UlhWWk1qbDBUVWxKUWtscVFVNUNaMnR4YUd0cFJ6bDNNRUlLUVZGRlJrRkJUME5CVVRoQlRVbEpRa05uUzBOQlVVVkJkRFZtUVdwd05HWlVZMlZyVjFWVVpucHpjREJyZVdsb01VOVpZbk5IVERCTFdERmxVbUpUVXdwU09FOWtNQ3M1VVRZeVNIbHVlU3RIUm5kTlZHSTBRUzlMVlRodGMzTnZTSFpqWTJWVFFVRmlkMlppZUVaTEx5dHpOVEZVYjJKeFZXNVBVbHB5VDI5VUNscHFhMVY1WjJKNVdFUlRTems1V1VKaVkxSXhVR2x3T0haM1RWUnRORmhMZFV4MFEybG5aVUpDWkdwcVFWRmtaMVZQTWpoTVJVNUhiSE5OYm0xbFdXc0tTbVpQUkZaSGJsWnRjalZNZEdJNVFVNUJPRWxMZVZSbWMyNUlTalJwVDBOVEwxQnNVR0pWYWpKeE4xbHViMVpNY0c5elZVSk5iR2RWWWk5RGVXdFlNd3B0VDI5TVlqUjVTa3BSZVVFdmFWTlVObHA0YVVsRmFqTTJSRFI1VjFvMWJHYzNXVXBzSzFWcGFVSlJTRWREYmxCa1IzbHBjSEZXTURabGVEQm9aVmxYQ21OaGFWYzRURmRhVTFWUk9UTnFVU3RYVmtOSU9HaFVOMFJSVHpGa2JYTjJWVzFZYkhFdlNtVkJiSGRSTDFGSlJFRlJRVUp2TkVoblRVbElaRTFDTUVjS1FURlZaRVJuVVZkQ1FsSmpRVkpQZEdoVE5GQTBWVGQyVkdacVFubEROVFk1VWpkRk5rUkRRbkpSV1VSV1VqQnFRa2xIYkUxSlIybG5RbEpqUVZKUGRBcG9VelJRTkZVM2RsUm1ha0o1UXpVMk9WSTNSVFpMUmk5d1NEQjNaWHBGVEUxQmEwZEJNVlZGUW1oTlExWldUWGhEZWtGS1FtZE9Wa0pCWjFSQmEwNUNDazFTV1hkR1FWbEVWbEZSU0VWM01WUlpWelJuVW01S2FHSnRUbkJqTWs1MlRWSlJkMFZuV1VSV1VWRkxSWGQwUTJOdFJtdGFiV3d3Wlcxc2RWbDZSVk1LVFVKQlIwRXhWVVZCZUUxS1lrYzVhbGxYZUc5aU0wNHdUVkl3ZDBkM1dVcExiMXBKYUhaalRrRlJhMEpHWnpWcFkyMUdhMUZIVW1oaWJXUm9URzFPZGdwaVdVbEtRVXhtVW14WGMwazRXVkZJVFVGM1IwRXhWV1JGZDFGR1RVRk5Ra0ZtT0hkRVVWbEtTMjlhU1doMlkwNUJVVVZHUWxGQlJHZG5SVUpCUnpab0NsVTVaamx6VGtnd0x6WnZRbUpIUjNreVJWWlZNRlZuU1ZSVlVVbHlSbGR2T1hKR2EzSlhOV3N2V0d0RWFsRnRLek5zZW1wVU1HbEhValJKZUVVdlFXOEtaVlUyYzFGb2RXRTNkM0pYWlVaRmJqUTNSMHc1T0d4dVEzTktaRVEzYjFwT2FFWnRVVGsxVkdJdlRHNUVWV3B6TlZscU9XSnlVREJPVjNwWVpsbFZOQXBWU3pKYWJrbE9TbEpqU25CQ09HbFNRMkZEZUVVNFJHUmpWVVl3V0hGSlJYRTJjRUV5TnpKemJtOU1iV2xZVEUxMlRtd3phMWxGWkcwcmFtVTJkbTlFQ2pVNFUwNVdSVlZ6ZW5SNlVYbFliVXBGYUVOd2QxWkpNRUUyVVVOcWVsaHFLM0YyY0cxM00xcGFTR2s0U25kWVpXazRXbHBDVEZSVFJrSnJhVGhhTjI0S2MwZzVRa0pJTXpndlUzcFZiVUZPTkZGSVUxQjVNV2RxY1cwd01FOUJSVGhPWVZsRWEyZ3ZZbnBGTkdRM2JVeEhSMDFYY0M5WFJUTkxVRk4xT0RKSVJncHJVR1UyV0c5VFltbE1iUzlyZUdzek1sUXdQUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09CgotIHBhdGg6ICcvZXRjL3N5c3RlbWQvc3lzdGVtL3NldHVwLnNlcnZpY2UnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBXMGx1YzNSaGJHeGRDbGRoYm5SbFpFSjVQVzExYkhScExYVnpaWEl1ZEdGeVoyVjBDZ3BiVlc1cGRGMEtVbVZ4ZFdseVpYTTlibVYwZDI5eWF5MXZibXhwYm1VdWRHRnlaMlYwQ2tGbWRHVnlQVzVsZEhkdmNtc3RiMjVzYVc1bExuUmhjbWRsZEFvS1cxTmxjblpwWTJWZENsUjVjR1U5YjI1bGMyaHZkQXBTWlcxaGFXNUJablJsY2tWNGFYUTlkSEoxWlFwRmJuWnBjbTl1YldWdWRFWnBiR1U5TFM5bGRHTXZaVzUyYVhKdmJtMWxiblFLUlhobFkxTjBZWEowUFM5dmNIUXZZbWx1TDNOMWNHVnlkbWx6WlM1emFDQXZiM0IwTDJKcGJpOXpaWFIxY0FvPQoKLSBwYXRoOiAnL2V0Yy9wcm9maWxlLmQvb3B0LWJpbi1wYXRoLnNoJwogIHBlcm1pc3Npb25zOiAnMDY0NCcKICBlbmNvZGluZzogJ2I2NCcKICBjb250ZW50OiB8LQogICAgWlhod2IzSjBJRkJCVkVnOUlpOXZjSFF2WW1sdU9pUlFRVlJJSWdvPQoKLSBwYXRoOiAnL2V0Yy9rdWJlcm5ldGVzL2t1YmVsZXQuY29uZicKICBwZXJtaXNzaW9uczogJzA2NDQnCiAgZW5jb2Rpbmc6ICdiNjQnCiAgY29udGVudDogfC0KICAgIFlYQnBWbVZ5YzJsdmJqb2dhM1ZpWld4bGRDNWpiMjVtYVdjdWF6aHpMbWx2TDNZeFltVjBZVEVLYTJsdVpEb2dTM1ZpWld4bGRFTnZibVpwWjNWeVlYUnBiMjRLWVhWMGFHVnVkR2xqWVhScGIyNDZDaUFnWVc1dmJubHRiM1Z6T2dvZ0lDQWdaVzVoWW14bFpEb2dabUZzYzJVS0lDQjROVEE1T2dvZ0lDQWdZMnhwWlc1MFEwRkdhV3hsT2lBdlpYUmpMMnQxWW1WeWJtVjBaWE12Y0d0cEwyTmhMbU55ZEFwaGRYUm9iM0pwZW1GMGFXOXVPZ29nSUcxdlpHVTZJRmRsWW1odmIyc0tJQ0IzWldKb2IyOXJPZ29nSUNBZ1kyRmphR1ZCZFhSb2IzSnBlbVZrVkZSTU9pQTFiVEJ6Q2lBZ0lDQmpZV05vWlZWdVlYVjBhRzl5YVhwbFpGUlVURG9nTXpCekNtTm5jbTkxY0VSeWFYWmxjam9nYzNsemRHVnRaQXBqYkhWemRHVnlSRTVUT2dvdElDSXhNQzR3TGpBdU1DSUtZMngxYzNSbGNrUnZiV0ZwYmpvZ1kyeDFjM1JsY2k1c2IyTmhiQXBqYjI1MFlXbHVaWEpNYjJkTllYaFRhWHBsT2lBeE1EQk5hUXBqYjI1MFlXbHVaWEpNYjJkTllYaEdhV3hsY3pvZ05RcG1aV0YwZFhKbFIyRjBaWE02Q2lBZ1IzSmhZMlZtZFd4T2IyUmxVMmgxZEdSdmQyNDZJSFJ5ZFdVS0lDQkpaR1Z1ZEdsbWVWQnZaRTlUT2lCbVlXeHpaUXB3Y205MFpXTjBTMlZ5Ym1Wc1JHVm1ZWFZzZEhNNklIUnlkV1VLY21WaFpFOXViSGxRYjNKME9pQXdDbkp2ZEdGMFpVTmxjblJwWm1sallYUmxjem9nZEhKMVpRcHpaWEoyWlhKVVRGTkNiMjkwYzNSeVlYQTZJSFJ5ZFdVS2MzUmhkR2xqVUc5a1VHRjBhRG9nTDJWMFl5OXJkV0psY201bGRHVnpMMjFoYm1sbVpYTjBjd29qSUVWdVlXSnNaU0J3WVhKaGJHeGxiQ0JwYldGblpTQndkV3hzYVc1bkxncHpaWEpwWVd4cGVtVkpiV0ZuWlZCMWJHeHpPaUJtWVd4elpRb2pJRk5sZENCdFlYZ2djR0Z5WVd4c1pXd2dhVzFoWjJVZ2NIVnNiSE1nZEc4Z01UQXVDbTFoZUZCaGNtRnNiR1ZzU1cxaFoyVlFkV3hzY3pvZ01UQUthM1ZpWlZKbGMyVnlkbVZrT2dvZ0lHTndkVG9nTWpBd2JRb2dJR1Z3YUdWdFpYSmhiQzF6ZEc5eVlXZGxPaUF4UjJrS0lDQnRaVzF2Y25rNklESXdNRTFwQ25ONWMzUmxiVkpsYzJWeWRtVmtPZ29nSUdOd2RUb2dNakF3YlFvZ0lHVndhR1Z0WlhKaGJDMXpkRzl5WVdkbE9pQXhSMmtLSUNCdFpXMXZjbms2SURJd01FMXBDbVYyYVdOMGFXOXVTR0Z5WkRvS0lDQnBiV0ZuWldaekxtRjJZV2xzWVdKc1pUb2dNVFVsQ2lBZ2JXVnRiM0o1TG1GMllXbHNZV0pzWlRvZ01UQXdUV2tLSUNCdWIyUmxabk11WVhaaGFXeGhZbXhsT2lBeE1DVUtJQ0J1YjJSbFpuTXVhVzV2WkdWelJuSmxaVG9nTlNVS2RHeHpRMmx3YUdWeVUzVnBkR1Z6T2dvdElGUk1VMTlCUlZOZk1USTRYMGREVFY5VFNFRXlOVFlLTFNCVVRGTmZRVVZUWHpJMU5sOUhRMDFmVTBoQk16ZzBDaTBnVkV4VFgwTklRVU5JUVRJd1gxQlBURmt4TXpBMVgxTklRVEkxTmdvdElGUk1VMTlGUTBSSVJWOUZRMFJUUVY5WFNWUklYMEZGVTE4eE1qaGZSME5OWDFOSVFUSTFOZ290SUZSTVUxOUZRMFJJUlY5RlEwUlRRVjlYU1ZSSVgwRkZVMTh5TlRaZlIwTk5YMU5JUVRNNE5Bb3RJRlJNVTE5RlEwUklSVjlGUTBSVFFWOVhTVlJJWDBOSVFVTklRVEl3WDFCUFRGa3hNekExQ2kwZ1ZFeFRYMFZEUkVoRlgxSlRRVjlYU1ZSSVgwRkZVMTh4TWpoZlIwTk5YMU5JUVRJMU5nb3RJRlJNVTE5RlEwUklSVjlTVTBGZlYwbFVTRjlCUlZOZk1qVTJYMGREVFY5VFNFRXpPRFFLTFNCVVRGTmZSVU5FU0VWZlVsTkJYMWRKVkVoZlEwaEJRMGhCTWpCZlVFOU1XVEV6TURVS2RtOXNkVzFsVUd4MVoybHVSR2x5T2lBdmRtRnlMMnhwWWk5cmRXSmxiR1YwTDNadmJIVnRaWEJzZFdkcGJuTUsKCi0gcGF0aDogJy9ldGMvc3lzdGVtZC9zeXN0ZW0va3ViZWxldC1oZWFsdGhjaGVjay5zZXJ2aWNlJwogIHBlcm1pc3Npb25zOiAnMDY0NCcKICBlbmNvZGluZzogJ2I2NCcKICBjb250ZW50OiB8LQogICAgVzFWdWFYUmRDbEpsY1hWcGNtVnpQV3QxWW1Wc1pYUXVjMlZ5ZG1salpRcEJablJsY2oxcmRXSmxiR1YwTG5ObGNuWnBZMlVLQ2x0VFpYSjJhV05sWFFwRmJuWnBjbTl1YldWdWRFWnBiR1U5TFM5bGRHTXZaVzUyYVhKdmJtMWxiblFLUlhobFkxTjBZWEowUFM5dmNIUXZZbWx1TDJobFlXeDBhQzF0YjI1cGRHOXlMbk5vSUd0MVltVnNaWFFLQ2x0SmJuTjBZV3hzWFFwWFlXNTBaV1JDZVQxdGRXeDBhUzExYzJWeUxuUmhjbWRsZEFvPQoKLSBwYXRoOiAnL29wdC9kaXNhYmxlLXN3YXAuc2gnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBJeUV2ZFhOeUwySnBiaTlsYm5ZZ1ltRnphQXB6WlhRZ0xXVjFieUJ3YVhCbFptRnBiQW9LSXlCTllXdGxJSE4xY21VZ2QyVWdZV3gzWVhseklHUnBjMkZpYkdVZ2MzZGhjQ0F0SUU5MGFHVnlkMmx6WlNCMGFHVWdhM1ZpWld4bGRDQjNiMjRuZENCemRHRnlkQ0JoY3lCbWIzSWdjMjl0WlNCamJHOTFaQW9qSUhCeWIzWnBaR1Z5Y3lCemQyRndJR2RsZEhNZ1pXNWhZbXhsWkNCdmJpQnlaV0p2YjNRZ2IzSWdZV1owWlhJZ2RHaGxJSE5sZEhWd0lITmpjbWx3ZENCb1lYTWdabWx1YVhOb1pXUWdaWGhsWTNWMGFXNW5MZ3B6WldRZ0xXa3ViM0pwWnlBbkx5NHFjM2RoY0M0cUwyUW5JQzlsZEdNdlpuTjBZV0lLYzNkaGNHOW1aaUF0WVFvPQoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL3N5c3RlbS9jb250YWluZXJkLnNlcnZpY2UuZC9lbnZpcm9ubWVudC5jb25mJwogIHBlcm1pc3Npb25zOiAnMDY0NCcKICBjb250ZW50OiB8LQogICAgW1NlcnZpY2VdCiAgICBSZXN0YXJ0PWFsd2F5cwogICAgRW52aXJvbm1lbnRGaWxlPS0vZXRjL2Vudmlyb25tZW50CiAgICAKCi0gcGF0aDogJy9ldGMvY3JpY3RsLnlhbWwnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGNvbnRlbnQ6IHwtCiAgICBydW50aW1lLWVuZHBvaW50OiB1bml4Oi8vL3J1bi9jb250YWluZXJkL2NvbnRhaW5lcmQuc29jawogICAgCgotIHBhdGg6ICcvZXRjL2NvbnRhaW5lcmQvY29uZmlnLnRvbWwnCiAgcGVybWlzc2lvbnM6ICcwNjAwJwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBkbVZ5YzJsdmJpQTlJRElLQ2x0dFpYUnlhV056WFFwaFpHUnlaWE56SUQwZ0lqRXlOeTR3TGpBdU1Ub3hNek00SWdvS1czQnNkV2RwYm5OZENsdHdiSFZuYVc1ekxpSnBieTVqYjI1MFlXbHVaWEprTG1keWNHTXVkakV1WTNKcElsMEtjMkZ1WkdKdmVGOXBiV0ZuWlNBOUlDSXhPVEl1TVRZNExqRXdNQzR4TURBNk5UQXdNQzlyZFdKbGNtNWxkR1Z6TDNCaGRYTmxPbll6TGpFaUNsdHdiSFZuYVc1ekxpSnBieTVqYjI1MFlXbHVaWEprTG1keWNHTXVkakV1WTNKcElpNWpiMjUwWVdsdVpYSmtYUXBiY0d4MVoybHVjeTRpYVc4dVkyOXVkR0ZwYm1WeVpDNW5jbkJqTG5ZeExtTnlhU0l1WTI5dWRHRnBibVZ5WkM1eWRXNTBhVzFsYzEwS1czQnNkV2RwYm5NdUltbHZMbU52Ym5SaGFXNWxjbVF1WjNKd1l5NTJNUzVqY21raUxtTnZiblJoYVc1bGNtUXVjblZ1ZEdsdFpYTXVjblZ1WTEwS2NuVnVkR2x0WlY5MGVYQmxJRDBnSW1sdkxtTnZiblJoYVc1bGNtUXVjblZ1WXk1Mk1pSUtXM0JzZFdkcGJuTXVJbWx2TG1OdmJuUmhhVzVsY21RdVozSndZeTUyTVM1amNta2lMbU52Ym5SaGFXNWxjbVF1Y25WdWRHbHRaWE11Y25WdVl5NXZjSFJwYjI1elhRcFRlWE4wWlcxa1EyZHliM1Z3SUQwZ2RISjFaUXBiY0d4MVoybHVjeTRpYVc4dVkyOXVkR0ZwYm1WeVpDNW5jbkJqTG5ZeExtTnlhU0l1Y21WbmFYTjBjbmxkQ2x0d2JIVm5hVzV6TGlKcGJ5NWpiMjUwWVdsdVpYSmtMbWR5Y0dNdWRqRXVZM0pwSWk1eVpXZHBjM1J5ZVM1dGFYSnliM0p6WFFwYmNHeDFaMmx1Y3k0aWFXOHVZMjl1ZEdGcGJtVnlaQzVuY25CakxuWXhMbU55YVNJdWNtVm5hWE4wY25rdWJXbHljbTl5Y3k0aVpHOWphMlZ5TG1sdklsMEtaVzVrY0c5cGJuUWdQU0JiSW1oMGRIQnpPaTh2Y21WbmFYTjBjbmt1Wkc5amEyVnlMV051TG1OdmJTSmRDbHR3YkhWbmFXNXpMaUpwYnk1amIyNTBZV2x1WlhKa0xtZHljR011ZGpFdVkzSnBJaTV5WldkcGMzUnllUzVqYjI1bWFXZHpYUXBiY0d4MVoybHVjeTRpYVc4dVkyOXVkR0ZwYm1WeVpDNW5jbkJqTG5ZeExtTnlhU0l1Y21WbmFYTjBjbmt1WTI5dVptbG5jeTRpTVRBdU1DNHdMakU2TlRBd01DSmRDbHR3YkhWbmFXNXpMaUpwYnk1amIyNTBZV2x1WlhKa0xtZHljR011ZGpFdVkzSnBJaTV5WldkcGMzUnllUzVqYjI1bWFXZHpMaUl4TUM0d0xqQXVNVG8xTURBd0lpNTBiSE5kQ21sdWMyVmpkWEpsWDNOcmFYQmZkbVZ5YVdaNUlEMGdkSEoxWlFwYmNHeDFaMmx1Y3k0aWFXOHVZMjl1ZEdGcGJtVnlaQzVuY25CakxuWXhMbU55YVNJdWNtVm5hWE4wY25rdVkyOXVabWxuY3k0aU1Ua3lMakUyT0M0eE1EQXVNVEF3T2pVd01EQWlYUXBiY0d4MVoybHVjeTRpYVc4dVkyOXVkR0ZwYm1WeVpDNW5jbkJqTG5ZeExtTnlhU0l1Y21WbmFYTjBjbmt1WTI5dVptbG5jeTRpTVRreUxqRTJPQzR4TURBdU1UQXdPalV3TURBaUxuUnNjMTBLYVc1elpXTjFjbVZmYzJ0cGNGOTJaWEpwWm5rZ1BTQjBjblZsQ2dvPQoKcmhfc3Vic2NyaXB0aW9uOgogICAgYXV0by1hdHRhY2g6IGZhbHNlCiAgICBwYXNzd29yZDogCiAgICB1c2VybmFtZTogCg== + cloud-config: I2Nsb3VkLWNvbmZpZwoKc3NoX3B3YXV0aDogZmFsc2UKCnNzaF9hdXRob3JpemVkX2tleXM6Ci0gJ3NzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQURBUUFCQUFBQ0FRRGRPSWhZbXpDSzVEU1ZMdTNjJwp3cml0ZV9maWxlczoKLSBwYXRoOiAnL29wdC9iaW4vaGVhbHRoLW1vbml0b3Iuc2gnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBJeUV2ZFhOeUwySnBiaTlsYm5ZZ1ltRnphQW9LSXlCRGIzQjVjbWxuYUhRZ01qQXhOaUJVYUdVZ1MzVmlaWEp1WlhSbGN5QkJkWFJvYjNKekxnb2pDaU1nVEdsalpXNXpaV1FnZFc1a1pYSWdkR2hsSUVGd1lXTm9aU0JNYVdObGJuTmxMQ0JXWlhKemFXOXVJREl1TUNBb2RHaGxJQ0pNYVdObGJuTmxJaWs3Q2lNZ2VXOTFJRzFoZVNCdWIzUWdkWE5sSUhSb2FYTWdabWxzWlNCbGVHTmxjSFFnYVc0Z1kyOXRjR3hwWVc1alpTQjNhWFJvSUhSb1pTQk1hV05sYm5ObExnb2pJRmx2ZFNCdFlYa2diMkowWVdsdUlHRWdZMjl3ZVNCdlppQjBhR1VnVEdsalpXNXpaU0JoZEFvakNpTWdJQ0FnSUdoMGRIQTZMeTkzZDNjdVlYQmhZMmhsTG05eVp5OXNhV05sYm5ObGN5OU1TVU5GVGxORkxUSXVNQW9qQ2lNZ1ZXNXNaWE56SUhKbGNYVnBjbVZrSUdKNUlHRndjR3hwWTJGaWJHVWdiR0YzSUc5eUlHRm5jbVZsWkNCMGJ5QnBiaUIzY21sMGFXNW5MQ0J6YjJaMGQyRnlaUW9qSUdScGMzUnlhV0oxZEdWa0lIVnVaR1Z5SUhSb1pTQk1hV05sYm5ObElHbHpJR1JwYzNSeWFXSjFkR1ZrSUc5dUlHRnVJQ0pCVXlCSlV5SWdRa0ZUU1ZNc0NpTWdWMGxVU0U5VlZDQlhRVkpTUVU1VVNVVlRJRTlTSUVOUFRrUkpWRWxQVGxNZ1QwWWdRVTVaSUV0SlRrUXNJR1ZwZEdobGNpQmxlSEJ5WlhOeklHOXlJR2x0Y0d4cFpXUXVDaU1nVTJWbElIUm9aU0JNYVdObGJuTmxJR1p2Y2lCMGFHVWdjM0JsWTJsbWFXTWdiR0Z1WjNWaFoyVWdaMjkyWlhKdWFXNW5JSEJsY20xcGMzTnBiMjV6SUdGdVpBb2pJR3hwYldsMFlYUnBiMjV6SUhWdVpHVnlJSFJvWlNCTWFXTmxibk5sTGdvS0l5QlVhR2x6SUhOamNtbHdkQ0JwY3lCbWIzSWdiV0Z6ZEdWeUlHRnVaQ0J1YjJSbElHbHVjM1JoYm1ObElHaGxZV3gwYUNCdGIyNXBkRzl5YVc1bkxDQjNhR2xqYUNCcGN3b2pJSEJoWTJ0bFpDQnBiaUJyZFdKbExXMWhibWxtWlhOMElIUmhjbUpoYkd3dUlFbDBJR2x6SUdWNFpXTjFkR1ZrSUhSb2NtOTFaMmdnWVNCemVYTjBaVzFrSUhObGNuWnBZMlVLSXlCcGJpQmpiSFZ6ZEdWeUwyZGpaUzluWTJrdlBHMWhjM1JsY2k5dWIyUmxQaTU1WVcxc0xpQlVhR1VnWlc1MklIWmhjbWxoWW14bGN5QmpiMjFsSUdaeWIyMGdZVzRnWlc1MkNpTWdabWxzWlNCd2NtOTJhV1JsWkNCaWVTQjBhR1VnYzNsemRHVnRaQ0J6WlhKMmFXTmxMZ29LSXlCVWFHbHpJSE5qY21sd2RDQnBjeUJoSUhOc2FXZG9kR3g1SUdGa2FuVnpkR1ZrSUhabGNuTnBiMjRnYjJZS0l5Qm9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZhM1ZpWlhKdVpYUmxjeTlyZFdKbGNtNWxkR1Z6TDJKc2IySXZaVEZoTVdGaE1qRXhNakkwWm1Oa09XSXlNVE0wTWpCaU9EQmlNbUZsTmpnd05qWTVOamd6WkM5amJIVnpkR1Z5TDJkalpTOW5ZMmt2YUdWaGJIUm9MVzF2Ym1sMGIzSXVjMmdLSXlCQlpHcDFjM1J0Wlc1MGN5QmhjbVU2Q2lNZ0tpQkxkV0psYkdWMElHaGxZV3gwYUNCd2IzSjBJR2x6SURFd01qUTRJRzV2ZENBeE1ESTFOUW9qSUNvZ1VtVnRiM1poYkNCdlppQmhiR3dnWVd4c0lISmxabVZ5Wlc1alpYTWdkRzhnZEdobElFdFZRa1ZmUlU1V0lHWnBiR1VLQ25ObGRDQXRieUJ1YjNWdWMyVjBDbk5sZENBdGJ5QndhWEJsWm1GcGJBb0tJeUJYWlNCemFXMXdiSGtnYTJsc2JDQjBhR1VnY0hKdlkyVnpjeUIzYUdWdUlIUm9aWEpsSUdseklHRWdabUZwYkhWeVpTNGdRVzV2ZEdobGNpQnplWE4wWlcxa0lITmxjblpwWTJVZ2QybHNiQW9qSUdGMWRHOXRZWFJwWTJGc2JIa2djbVZ6ZEdGeWRDQjBhR1VnY0hKdlkyVnpjeTRLWm5WdVkzUnBiMjRnWTI5dWRHRnBibVZ5WDNKMWJuUnBiV1ZmYlc5dWFYUnZjbWx1WnlncElIc0tJQ0JzYjJOaGJDQXRjaUJ0WVhoZllYUjBaVzF3ZEhNOU5Rb2dJR3h2WTJGc0lHRjBkR1Z0Y0hROU1Rb2dJR3h2WTJGc0lDMXlJR052Ym5SaGFXNWxjbDl5ZFc1MGFXMWxYMjVoYldVOUlpUjdRMDlPVkVGSlRrVlNYMUpWVGxSSlRVVmZUa0ZOUlRvdFpHOWphMlZ5ZlNJS0lDQWpJRmRsSUhOMGFXeHNJRzVsWldRZ2RHOGdkWE5sSUNka2IyTnJaWElnY0hNbklIZG9aVzRnWTI5dWRHRnBibVZ5SUhKMWJuUnBiV1VnYVhNZ0ltUnZZMnRsY2lJdUlGUm9hWE1nYVhNZ1ltVmpZWFZ6WlFvZ0lDTWdaRzlqYTJWeWMyaHBiU0JwY3lCemRHbHNiQ0J3WVhKMElHOW1JR3QxWW1Wc1pYUWdkRzlrWVhrdUlGZG9aVzRnYTNWaVpXeGxkQ0JwY3lCa2IzZHVMQ0JqY21samRHd2djRzlrY3dvZ0lDTWdkMmxzYkNCaGJITnZJR1poYVd3c0lHRnVaQ0JrYjJOclpYSWdkMmxzYkNCaVpTQnJhV3hzWldRdUlGUm9hWE1nYVhNZ2RXNWtaWE5wY21GaWJHVWdaWE53WldOcFlXeHNlU0IzYUdWdUNpQWdJeUJrYjJOclpYSWdiR2wyWlNCeVpYTjBiM0psSUdseklHUnBjMkZpYkdWa0xnb2dJR3h2WTJGc0lHaGxZV3gwYUdOb1pXTnJYMk52YlcxaGJtUTlJbVJ2WTJ0bGNpQndjeUlLSUNCcFppQmJXeUFpSkh0RFQwNVVRVWxPUlZKZlVsVk9WRWxOUlRvdFpHOWphMlZ5ZlNJZ0lUMGdJbVJ2WTJ0bGNpSWdYVjA3SUhSb1pXNEtJQ0FnSUdobFlXeDBhR05vWldOclgyTnZiVzFoYm1ROUltTnlhV04wYkNCd2IyUnpJZ29nSUdacENpQWdJeUJEYjI1MFlXbHVaWElnY25WdWRHbHRaU0J6ZEdGeWRIVndJSFJoYTJWeklIUnBiV1V1SUUxaGEyVWdhVzVwZEdsaGJDQmhkSFJsYlhCMGN5QmlaV1p2Y21VZ2MzUmhjblJwYm1jS0lDQWpJR3RwYkd4cGJtY2dkR2hsSUdOdmJuUmhhVzVsY2lCeWRXNTBhVzFsTGdvZ0lIVnVkR2xzSUhScGJXVnZkWFFnTmpBZ0pIdG9aV0ZzZEdoamFHVmphMTlqYjIxdFlXNWtmU0ErSUM5a1pYWXZiblZzYkRzZ1pHOEtJQ0FnSUdsbUlDZ29ZWFIwWlcxd2RDQTlQU0J0WVhoZllYUjBaVzF3ZEhNcEtUc2dkR2hsYmdvZ0lDQWdJQ0JsWTJodklDSk5ZWGdnWVhSMFpXMXdkQ0FrZTIxaGVGOWhkSFJsYlhCMGMzMGdjbVZoWTJobFpDRWdVSEp2WTJWbFpHbHVaeUIwYnlCdGIyNXBkRzl5SUdOdmJuUmhhVzVsY2lCeWRXNTBhVzFsSUdobFlXeDBhR2x1WlhOekxpSUtJQ0FnSUNBZ1luSmxZV3NLSUNBZ0lHWnBDaUFnSUNCbFkyaHZJQ0lrWVhSMFpXMXdkQ0JwYm1sMGFXRnNJR0YwZEdWdGNIUWdYQ0lrZTJobFlXeDBhR05vWldOclgyTnZiVzFoYm1SOVhDSWhJRlJ5ZVdsdVp5QmhaMkZwYmlCcGJpQWtZWFIwWlcxd2RDQnpaV052Ym1SekxpNHVJZ29nSUNBZ2MyeGxaWEFnSWlRb0tESWdLaW9nWVhSMFpXMXdkQ3NyS1NraUNpQWdaRzl1WlFvZ0lIZG9hV3hsSUhSeWRXVTdJR1J2Q2lBZ0lDQnBaaUFoSUhScGJXVnZkWFFnTmpBZ0pIdG9aV0ZzZEdoamFHVmphMTlqYjIxdFlXNWtmU0ErSUM5a1pYWXZiblZzYkRzZ2RHaGxiZ29nSUNBZ0lDQmxZMmh2SUNKRGIyNTBZV2x1WlhJZ2NuVnVkR2x0WlNBa2UyTnZiblJoYVc1bGNsOXlkVzUwYVcxbFgyNWhiV1Y5SUdaaGFXeGxaQ0VpQ2lBZ0lDQWdJR2xtSUZ0YklDSWtZMjl1ZEdGcGJtVnlYM0oxYm5ScGJXVmZibUZ0WlNJZ1BUMGdJbVJ2WTJ0bGNpSWdYVjA3SUhSb1pXNEtJQ0FnSUNBZ0lDQWpJRVIxYlhBZ2MzUmhZMnNnYjJZZ1pHOWphMlZ5SUdSaFpXMXZiaUJtYjNJZ2FXNTJaWE4wYVdkaGRHbHZiaTRLSUNBZ0lDQWdJQ0FqSUV4dlp5Qm1hV3hsSUc1aGJXVWdiRzl2YTNNZ2JHbHJaU0JuYjNKdmRYUnBibVV0YzNSaFkydHpMVlJKVFVWVFZFRk5VQ0JoYm1RZ2QybHNiQ0JpWlNCellYWmxaQ0IwYndvZ0lDQWdJQ0FnSUNNZ2RHaGxJR1Y0WldNZ2NtOXZkQ0JrYVhKbFkzUnZjbmtzSUhkb2FXTm9JR2x6SUM5MllYSXZjblZ1TDJSdlkydGxjaThnYjI0Z1ZXSjFiblIxSUdGdVpDQkRUMU11Q2lBZ0lDQWdJQ0FnY0d0cGJHd2dMVk5KUjFWVFVqRWdaRzlqYTJWeVpBb2dJQ0FnSUNCbWFRb2dJQ0FnSUNCemVYTjBaVzFqZEd3Z2EybHNiQ0F0TFd0cGJHd3RkMmh2UFcxaGFXNGdJaVI3WTI5dWRHRnBibVZ5WDNKMWJuUnBiV1ZmYm1GdFpYMGlDaUFnSUNBZ0lDTWdWMkZwZENCbWIzSWdZU0IzYUdsc1pTd2dZWE1nZDJVZ1pHOXVKM1FnZDJGdWRDQjBieUJyYVd4c0lHbDBJR0ZuWVdsdUlHSmxabTl5WlNCcGRDQnBjeUJ5WldGc2JIa2dkWEF1Q2lBZ0lDQWdJSE5zWldWd0lERXlNQW9nSUNBZ1pXeHpaUW9nSUNBZ0lDQnpiR1ZsY0NBaUpIdFRURVZGVUY5VFJVTlBUa1JUZlNJS0lDQWdJR1pwQ2lBZ1pHOXVaUXA5Q2dwbWRXNWpkR2x2YmlCcmRXSmxiR1YwWDIxdmJtbDBiM0pwYm1jb0tTQjdDaUFnWldOb2J5QWlWMkZwZENCbWIzSWdNaUJ0YVc1MWRHVnpJR1p2Y2lCcmRXSmxiR1YwSUhSdklHSmxJR1oxYm1OMGFXOXVZV3dpQ2lBZ2MyeGxaWEFnTVRJd0NpQWdiRzlqWVd3Z0xYSWdiV0Y0WDNObFkyOXVaSE05TVRBS0lDQnNiMk5oYkNCdmRYUndkWFE5SWlJS0lDQjNhR2xzWlNCMGNuVmxPeUJrYndvZ0lDQWdiRzlqWVd3Z1ptRnBiR1ZrUFdaaGJITmxDZ29nSUNBZ2FXWWdhbTkxY201aGJHTjBiQ0F0ZFNCcmRXSmxiR1YwSUMxdUlERWdmQ0JuY21Wd0lDMXhJQ0oxYzJVZ2IyWWdZMnh2YzJWa0lHNWxkSGR2Y21zZ1kyOXVibVZqZEdsdmJpSTdJSFJvWlc0S0lDQWdJQ0FnWm1GcGJHVmtQWFJ5ZFdVS0lDQWdJQ0FnWldOb2J5QWlTM1ZpWld4bGRDQnpkRzl3Y0dWa0lIQnZjM1JwYm1jZ2JtOWtaU0J6ZEdGMGRYTXVJRkpsYzNSaGNuUnBibWNpQ2lBZ0lDQmxiR2xtSUNFZ2IzVjBjSFYwUFNRb1kzVnliQ0F0YlNBaUpIdHRZWGhmYzJWamIyNWtjMzBpSUMxbUlDMXpJQzFUSUdoMGRIQTZMeTh4TWpjdU1DNHdMakU2TVRBeU5EZ3ZhR1ZoYkhSb2VpQXlQaVl4S1RzZ2RHaGxiZ29nSUNBZ0lDQm1ZV2xzWldROWRISjFaUW9nSUNBZ0lDQWpJRkJ5YVc1MElIUm9aU0J5WlhOd2IyNXpaU0JoYm1RdmIzSWdaWEp5YjNKekxnb2dJQ0FnSUNCbFkyaHZJQ0lrYjNWMGNIVjBJZ29nSUNBZ1pta0tDaUFnSUNCcFppQmJXeUFpSkdaaGFXeGxaQ0lnUFQwZ0luUnlkV1VpSUYxZE95QjBhR1Z1Q2lBZ0lDQWdJR1ZqYUc4Z0lrdDFZbVZzWlhRZ2FYTWdkVzVvWldGc2RHaDVJU0lLSUNBZ0lDQWdjM2x6ZEdWdFkzUnNJR3RwYkd3Z2EzVmlaV3hsZEFvZ0lDQWdJQ0FqSUZkaGFYUWdabTl5SUdFZ2QyaHBiR1VzSUdGeklIZGxJR1J2YmlkMElIZGhiblFnZEc4Z2EybHNiQ0JwZENCaFoyRnBiaUJpWldadmNtVWdhWFFnYVhNZ2NtVmhiR3g1SUhWd0xnb2dJQ0FnSUNCemJHVmxjQ0EyTUFvZ0lDQWdaV3h6WlFvZ0lDQWdJQ0J6YkdWbGNDQWlKSHRUVEVWRlVGOVRSVU5QVGtSVGZTSUtJQ0FnSUdacENpQWdaRzl1WlFwOUNnb2pJeU1qSXlNakl5TWpJeU1qSXlCTllXbHVJRVoxYm1OMGFXOXVJQ01qSXlNakl5TWpJeU1qSXlNakl5TUthV1lnVzFzZ0lpUWpJaUF0Ym1VZ01TQmRYVHNnZEdobGJnb2dJR1ZqYUc4Z0lsVnpZV2RsT2lCb1pXRnNkR2d0Ylc5dWFYUnZjaTV6YUNBOFkyOXVkR0ZwYm1WeUxYSjFiblJwYldVdmEzVmlaV3hsZEQ0aUNpQWdaWGhwZENBeENtWnBDZ3BUVEVWRlVGOVRSVU5QVGtSVFBURXdDbU52YlhCdmJtVnVkRDBrTVFwbFkyaHZJQ0pUZEdGeWRDQnJkV0psY201bGRHVnpJR2hsWVd4MGFDQnRiMjVwZEc5eWFXNW5JR1p2Y2lBa2UyTnZiWEJ2Ym1WdWRIMGlDbWxtSUZ0YklDSWtlMk52YlhCdmJtVnVkSDBpSUQwOUlDSmpiMjUwWVdsdVpYSXRjblZ1ZEdsdFpTSWdYVjA3SUhSb1pXNEtJQ0JqYjI1MFlXbHVaWEpmY25WdWRHbHRaVjl0YjI1cGRHOXlhVzVuQ21Wc2FXWWdXMXNnSWlSN1kyOXRjRzl1Wlc1MGZTSWdQVDBnSW10MVltVnNaWFFpSUYxZE95QjBhR1Z1Q2lBZ2EzVmlaV3hsZEY5dGIyNXBkRzl5YVc1bkNtVnNjMlVLSUNCbFkyaHZJQ0pJWldGc2RHZ2diVzl1YVhSdmNtbHVaeUJtYjNJZ1kyOXRjRzl1Wlc1MElDUjdZMjl0Y0c5dVpXNTBmU0JwY3lCdWIzUWdjM1Z3Y0c5eWRHVmtJU0lLWm1rSwoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL2pvdXJuYWxkLmNvbmYuZC9tYXhfZGlza191c2UuY29uZicKICBwZXJtaXNzaW9uczogJzA2NDQnCiAgZW5jb2Rpbmc6ICdiNjQnCiAgY29udGVudDogfC0KICAgIFcwcHZkWEp1WVd4ZENsTjVjM1JsYlUxaGVGVnpaVDAxUndvPQoKLSBwYXRoOiAnL29wdC9sb2FkLWtlcm5lbC1tb2R1bGVzLnNoJwogIHBlcm1pc3Npb25zOiAnMDc1NScKICBlbmNvZGluZzogJ2I2NCcKICBjb250ZW50OiB8LQogICAgSXlFdmRYTnlMMkpwYmk5bGJuWWdZbUZ6YUFwelpYUWdMV1YxYnlCd2FYQmxabUZwYkFvS2JXOWtjSEp2WW1VZ2FYQmZkR0ZpYkdWekNtMXZaSEJ5YjJKbElHbHdYM1p6Q20xdlpIQnliMkpsSUdsd1gzWnpYM0p5Q20xdlpIQnliMkpsSUdsd1gzWnpYM2R5Y2dwdGIyUndjbTlpWlNCcGNGOTJjMTl6YUFvS2FXWWdiVzlrYVc1bWJ5QnVabDlqYjI1dWRISmhZMnRmYVhCMk5DQW1QaUF2WkdWMkwyNTFiR3c3SUhSb1pXNEtJQ0J0YjJSd2NtOWlaU0J1Wmw5amIyNXVkSEpoWTJ0ZmFYQjJOQXBsYkhObENpQWdiVzlrY0hKdlltVWdibVpmWTI5dWJuUnlZV05yQ21acENnPT0KCi0gcGF0aDogJy9ldGMvc3lzY3RsLmQvazhzLmNvbmYnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBibVYwTG1KeWFXUm5aUzVpY21sa1oyVXRibVl0WTJGc2JDMXBjRFowWVdKc1pYTWdQU0F4Q201bGRDNWljbWxrWjJVdVluSnBaR2RsTFc1bUxXTmhiR3d0YVhCMFlXSnNaWE1nUFNBeENtdGxjbTVsYkM1d1lXNXBZMTl2Ymw5dmIzQnpJRDBnTVFwclpYSnVaV3d1Y0dGdWFXTWdQU0F4TUFwdVpYUXVhWEIyTkM1cGNGOW1iM0ozWVhKa0lEMGdNUXAyYlM1dmRtVnlZMjl0YldsMFgyMWxiVzl5ZVNBOUlERUtabk11YVc1dmRHbG1lUzV0WVhoZmRYTmxjbDkzWVhSamFHVnpJRDBnTVRBME9EVTNOZ3BtY3k1cGJtOTBhV1o1TG0xaGVGOTFjMlZ5WDJsdWMzUmhibU5sY3lBOUlEZ3hPVElLCgotIHBhdGg6ICcvZXRjL3NlbGludXgvY29uZmlnJwogIHBlcm1pc3Npb25zOiAnMDY0NCcKICBlbmNvZGluZzogJ2I2NCcKICBjb250ZW50OiB8LQogICAgSXlCVWFHbHpJR1pwYkdVZ1kyOXVkSEp2YkhNZ2RHaGxJSE4wWVhSbElHOW1JRk5GVEdsdWRYZ2diMjRnZEdobElITjVjM1JsYlM0S0l5QlRSVXhKVGxWWVBTQmpZVzRnZEdGclpTQnZibVVnYjJZZ2RHaGxjMlVnZEdoeVpXVWdkbUZzZFdWek9nb2pJQ0FnSUNCbGJtWnZjbU5wYm1jZ0xTQlRSVXhwYm5WNElITmxZM1Z5YVhSNUlIQnZiR2xqZVNCcGN5QmxibVp2Y21ObFpDNEtJeUFnSUNBZ2NHVnliV2x6YzJsMlpTQXRJRk5GVEdsdWRYZ2djSEpwYm5SeklIZGhjbTVwYm1keklHbHVjM1JsWVdRZ2IyWWdaVzVtYjNKamFXNW5MZ29qSUNBZ0lDQmthWE5oWW14bFpDQXRJRTV2SUZORlRHbHVkWGdnY0c5c2FXTjVJR2x6SUd4dllXUmxaQzRLVTBWTVNVNVZXRDF3WlhKdGFYTnphWFpsQ2lNZ1UwVk1TVTVWV0ZSWlVFVTlJR05oYmlCMFlXdGxJRzl1WlNCdlppQjBhSEpsWlNCMGQyOGdkbUZzZFdWek9nb2pJQ0FnSUNCMFlYSm5aWFJsWkNBdElGUmhjbWRsZEdWa0lIQnliMk5sYzNObGN5QmhjbVVnY0hKdmRHVmpkR1ZrTEFvaklDQWdJQ0J0YVc1cGJYVnRJQzBnVFc5a2FXWnBZMkYwYVc5dUlHOW1JSFJoY21kbGRHVmtJSEJ2YkdsamVTNGdUMjVzZVNCelpXeGxZM1JsWkNCd2NtOWpaWE56WlhNZ1lYSmxJSEJ5YjNSbFkzUmxaQzRLSXlBZ0lDQWdiV3h6SUMwZ1RYVnNkR2tnVEdWMlpXd2dVMlZqZFhKcGRIa2djSEp2ZEdWamRHbHZiaTRLVTBWTVNVNVZXRlJaVUVVOWRHRnlaMlYwWldRSwoKLSBwYXRoOiAnL29wdC9iaW4vc2V0dXAnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBJeUV2WW1sdUwySmhjMmdLYzJWMElDMTRaWFZ2SUhCcGNHVm1ZV2xzQ2dwelpYUmxibVp2Y21ObElEQWdmSHdnZEhKMVpRcHplWE4wWlcxamRHd2djbVZ6ZEdGeWRDQnplWE4wWlcxa0xXMXZaSFZzWlhNdGJHOWhaQzV6WlhKMmFXTmxDbk41YzJOMGJDQXRMWE41YzNSbGJRb0tJeUJQZG1WeWNtbGtaU0JvYjNOMGJtRnRaU0JwWmlBdlpYUmpMMjFoWTJocGJtVXRibUZ0WlNCbGVHbHpkSE1LYVdZZ1d5QXRlQ0FpSkNoamIyMXRZVzVrSUMxMklHaHZjM1J1WVcxbFkzUnNLU0lnWFNBbUppQmJJQzF6SUM5bGRHTXZiV0ZqYUdsdVpTMXVZVzFsSUYwN0lIUm9aVzRLSUNCdFlXTm9hVzVsWDI1aGJXVTlKQ2hqWVhRZ0wyVjBZeTl0WVdOb2FXNWxMVzVoYldVcENpQWdhRzl6ZEc1aGJXVmpkR3dnYzJWMExXaHZjM1J1WVcxbElDUjdiV0ZqYUdsdVpWOXVZVzFsZlFwbWFRb0tlWFZ0SUdsdWMzUmhiR3dnTFhrZ1hBb2dJR1JsZG1salpTMXRZWEJ3WlhJdGNHVnljMmx6ZEdWdWRDMWtZWFJoSUZ3S0lDQnNkbTB5SUZ3S0lDQmxZblJoWW14bGN5QmNDaUFnWlhSb2RHOXZiQ0JjQ2lBZ2JtWnpMWFYwYVd4eklGd0tJQ0JpWVhOb0xXTnZiWEJzWlhScGIyNGdYQW9nSUhOMVpHOGdYQW9nSUhOdlkyRjBJRndLSUNCM1oyVjBJRndLSUNCamRYSnNJRndLSUNCcGNIWnpZV1J0Q2dwemVYTjBaVzFqZEd3Z1pHbHpZV0pzWlNBdExXNXZkeUJtYVhKbGQyRnNiR1FnZkh3Z2RISjFaUXA1ZFcwZ2FXNXpkR0ZzYkNBdGVTQjVkVzB0ZFhScGJITUtlWFZ0TFdOdmJtWnBaeTF0WVc1aFoyVnlJQzB0WVdSa0xYSmxjRzg5YUhSMGNITTZMeTlrYjNkdWJHOWhaQzVrYjJOclpYSXVZMjl0TDJ4cGJuVjRMM0pvWld3dlpHOWphMlZ5TFdObExuSmxjRzhLZVhWdExXTnZibVpwWnkxdFlXNWhaMlZ5SUMwdGMyRjJaU0F0TFhObGRHOXdkRDFrYjJOclpYSXRZMlV0YzNSaFlteGxMbTF2WkhWc1pWOW9iM1JtYVhobGN6MTBjblZsQ2dwNWRXMGdhVzV6ZEdGc2JDQXRlU0JqYjI1MFlXbHVaWEprTG1sdkxURXVOaW9nZVhWdExYQnNkV2RwYmkxMlpYSnphVzl1Ykc5amF3cDVkVzBnZG1WeWMybHZibXh2WTJzZ1lXUmtJR052Ym5SaGFXNWxjbVF1YVc4S0NuTjVjM1JsYldOMGJDQmtZV1Z0YjI0dGNtVnNiMkZrQ25ONWMzUmxiV04wYkNCbGJtRmliR1VnTFMxdWIzY2dZMjl1ZEdGcGJtVnlaQW9LYjNCMFgySnBiajB2YjNCMEwySnBiZ3AxYzNKZmJHOWpZV3hmWW1sdVBTOTFjM0l2Ykc5allXd3ZZbWx1Q21OdWFWOWlhVzVmWkdseVBTOXZjSFF2WTI1cEwySnBiZ3B0YTJScGNpQXRjQ0F2WlhSakwyTnVhUzl1WlhRdVpDQXZaWFJqTDJ0MVltVnlibVYwWlhNdmJXRnVhV1psYzNSeklDSWtiM0IwWDJKcGJpSWdJaVJqYm1sZlltbHVYMlJwY2lJS1lYSmphRDBrZTBoUFUxUmZRVkpEU0MxOUNtbG1JRnNnTFhvZ0lpUmhjbU5vSWlCZENuUm9aVzRLWTJGelpTQWtLSFZ1WVcxbElDMXRLU0JwYmdwNE9EWmZOalFwQ2lBZ0lDQmhjbU5vUFNKaGJXUTJOQ0lLSUNBZ0lEczdDbUZoY21Ob05qUXBDaUFnSUNCaGNtTm9QU0poY20wMk5DSUtJQ0FnSURzN0Npb3BDaUFnSUNCbFkyaHZJQ0oxYm5OMWNIQnZjblJsWkNCRFVGVWdZWEpqYUdsMFpXTjBkWEpsTENCbGVHbDBhVzVuSWdvZ0lDQWdaWGhwZENBeENpQWdJQ0E3T3dwbGMyRmpDbVpwQ2tOT1NWOVdSVkpUU1U5T1BTSWtlME5PU1Y5V1JWSlRTVTlPT2kxMk1TNDFMakY5SWdwamJtbGZZbUZ6WlY5MWNtdzlJbWgwZEhCek9pOHZaMmwwYUhWaUxtTnZiUzlqYjI1MFlXbHVaWEp1WlhSM2IzSnJhVzVuTDNCc2RXZHBibk12Y21Wc1pXRnpaWE12Wkc5M2JteHZZV1F2SkVOT1NWOVdSVkpUU1U5T0lncGpibWxmWm1sc1pXNWhiV1U5SW1OdWFTMXdiSFZuYVc1ekxXeHBiblY0TFNSaGNtTm9MU1JEVGtsZlZrVlNVMGxQVGk1MFozb2lDbU4xY213Z0xVeG1ieUFpSkdOdWFWOWlhVzVmWkdseUx5UmpibWxmWm1sc1pXNWhiV1VpSUNJa1kyNXBYMkpoYzJWZmRYSnNMeVJqYm1sZlptbHNaVzVoYldVaUNtTnVhVjl6ZFcwOUpDaGpkWEpzSUMxTVppQWlKR051YVY5aVlYTmxYM1Z5YkM4a1kyNXBYMlpwYkdWdVlXMWxMbk5vWVRJMU5pSXBDbU5rSUNJa1kyNXBYMkpwYmw5a2FYSWlDbk5vWVRJMU5uTjFiU0F0WXlBOFBEd2lKR051YVY5emRXMGlDblJoY2lCNGRtWWdJaVJqYm1sZlptbHNaVzVoYldVaUNuSnRJQzFtSUNJa1kyNXBYMlpwYkdWdVlXMWxJZ3BqWkNBdENtTm9iM2R1SUMxU0lISnZiM1E2Y205dmRDQWlKR051YVY5aWFXNWZaR2x5SWdvS1ExSkpYMVJQVDB4VFgxSkZURVZCVTBVOUlpUjdRMUpKWDFSUFQweFRYMUpGVEVWQlUwVTZMWFl4TGpJNUxqQjlJZ3BqY21sZmRHOXZiSE5mWW1GelpWOTFjbXc5SW1oMGRIQnpPaTh2WjJsMGFIVmlMbU52YlM5cmRXSmxjbTVsZEdWekxYTnBaM012WTNKcExYUnZiMnh6TDNKbGJHVmhjMlZ6TDJSdmQyNXNiMkZrTHlSN1ExSkpYMVJQVDB4VFgxSkZURVZCVTBWOUlncGpjbWxmZEc5dmJITmZabWxzWlc1aGJXVTlJbU55YVdOMGJDMGtlME5TU1Y5VVQwOU1VMTlTUlV4RlFWTkZmUzFzYVc1MWVDMGtlMkZ5WTJoOUxuUmhjaTVuZWlJS1kzVnliQ0F0VEdadklDSWtiM0IwWDJKcGJpOGtZM0pwWDNSdmIyeHpYMlpwYkdWdVlXMWxJaUFpSkdOeWFWOTBiMjlzYzE5aVlYTmxYM1Z5YkM4a1kzSnBYM1J2YjJ4elgyWnBiR1Z1WVcxbElncGpjbWxmZEc5dmJITmZjM1Z0WDNaaGJIVmxQU1FvWTNWeWJDQXRUR1lnSWlSamNtbGZkRzl2YkhOZlltRnpaVjkxY213dkpHTnlhVjkwYjI5c2MxOW1hV3hsYm1GdFpTNXphR0V5TlRZaUtRcGpjbWxmZEc5dmJITmZjM1Z0UFNJa1kzSnBYM1J2YjJ4elgzTjFiVjkyWVd4MVpTQWtZM0pwWDNSdmIyeHpYMlpwYkdWdVlXMWxJZ3BqWkNBaUpHOXdkRjlpYVc0aUNuTm9ZVEkxTm5OMWJTQXRZeUE4UER3aUpHTnlhVjkwYjI5c2MxOXpkVzBpQ25SaGNpQjRkbVlnSWlSamNtbGZkRzl2YkhOZlptbHNaVzVoYldVaUNuSnRJQzFtSUNJa1kzSnBYM1J2YjJ4elgyWnBiR1Z1WVcxbElncHNiaUF0YzJZZ0lpUnZjSFJmWW1sdUwyTnlhV04wYkNJZ0lpUjFjM0pmYkc5allXeGZZbWx1SWk5amNtbGpkR3dnZkh3Z1pXTm9ieUFpYzNsdFltOXNhV01nYkdsdWF5QnBjeUJ6YTJsd2NHVmtJZ3BqWkNBdENrdFZRa1ZmVmtWU1UwbFBUajBpSkh0TFZVSkZYMVpGVWxOSlQwNDZMWFl4TGpNeExqQjlJZ3ByZFdKbFgyUnBjajBpSkc5d2RGOWlhVzR2YTNWaVpYSnVaWFJsY3kwa1MxVkNSVjlXUlZKVFNVOU9JZ3ByZFdKbFgySmhjMlZmZFhKc1BTSm9kSFJ3Y3pvdkwyUnNMbXM0Y3k1cGJ5OGtTMVZDUlY5V1JWSlRTVTlPTDJKcGJpOXNhVzUxZUM4a1lYSmphQ0lLYTNWaVpWOXpkVzFmWm1sc1pUMGlKR3QxWW1WZlpHbHlMM05vWVRJMU5pSUtiV3RrYVhJZ0xYQWdJaVJyZFdKbFgyUnBjaUlLT2lBK0lpUnJkV0psWDNOMWJWOW1hV3hsSWdvS1ptOXlJR0pwYmlCcGJpQnJkV0psYkdWMElHdDFZbVZoWkcwZ2EzVmlaV04wYkRzZ1pHOEtJQ0FnSUdOMWNtd2dMVXhtYnlBaUpHdDFZbVZmWkdseUx5UmlhVzRpSUNJa2EzVmlaVjlpWVhObFgzVnliQzhrWW1sdUlnb2dJQ0FnWTJodGIyUWdLM2dnSWlScmRXSmxYMlJwY2k4a1ltbHVJZ29nSUNBZ2MzVnRQU1FvWTNWeWJDQXRUR1lnSWlScmRXSmxYMkpoYzJWZmRYSnNMeVJpYVc0dWMyaGhNalUySWlrS0lDQWdJR1ZqYUc4Z0lpUnpkVzBnSUNScmRXSmxYMlJwY2k4a1ltbHVJaUErUGlJa2EzVmlaVjl6ZFcxZlptbHNaU0lLWkc5dVpRcHphR0V5TlRaemRXMGdMV01nSWlScmRXSmxYM04xYlY5bWFXeGxJZ29LWm05eUlHSnBiaUJwYmlCcmRXSmxiR1YwSUd0MVltVmhaRzBnYTNWaVpXTjBiRHNnWkc4S0lDQWdJR3h1SUMxelppQWlKR3QxWW1WZlpHbHlMeVJpYVc0aUlDSWtiM0IwWDJKcGJpSXZKR0pwYmdwa2IyNWxDZ3BFUlVaQlZVeFVYMGxHUTE5T1FVMUZQU1FvYVhBZ0xXOGdjbTkxZEdVZ1oyVjBJREVnSUh3Z1ozSmxjQ0F0YjFBZ0ltUmxkaUJjUzF4VEt5SXBDa2xHUTE5RFJrZGZSa2xNUlQwdlpYUmpMM041YzJOdmJtWnBaeTl1WlhSM2IzSnJMWE5qY21sd2RITXZhV1pqWm1jdEpFUkZSa0ZWVEZSZlNVWkRYMDVCVFVVS0l5QkZibUZpYkdVZ1NWQjJOaUJoYm1RZ1JFaERVSFkySUc5dUlIUm9aU0JrWldaaGRXeDBJR2x1ZEdWeVptRmpaUXBuY21Wd0lFbFFWalpKVGtsVUlDUkpSa05mUTBaSFgwWkpURVVnSmlZZ2MyVmtJQzFwSUNjdlNWQldOa2xPU1ZRcUwyTWdTVkJXTmtsT1NWUTllV1Z6SnlBa1NVWkRYME5HUjE5R1NVeEZJSHg4SUdWamFHOGdJa2xRVmpaSlRrbFVQWGxsY3lJZ1BqNGdKRWxHUTE5RFJrZGZSa2xNUlFwbmNtVndJRVJJUTFCV05rTWdKRWxHUTE5RFJrZGZSa2xNUlNBbUppQnpaV1FnTFdrZ0p5OUVTRU5RVmpaREtpOWpJRVJJUTFCV05rTTllV1Z6SnlBa1NVWkRYME5HUjE5R1NVeEZJSHg4SUdWamFHOGdJa1JJUTFCV05rTTllV1Z6SWlBK1BpQWtTVVpEWDBOR1IxOUdTVXhGQ21keVpYQWdTVkJXTmw5QlZWUlBRMDlPUmlBa1NVWkRYME5HUjE5R1NVeEZJQ1ltSUhObFpDQXRhU0FuTDBsUVZqWmZRVlZVVDBOUFRrWXFMMk1nU1ZCV05sOUJWVlJQUTA5T1JqMTVaWE1uSUNSSlJrTmZRMFpIWDBaSlRFVWdmSHdnWldOb2J5QWlTVkJXTmw5QlZWUlBRMDlPUmoxNVpYTWlJRDQrSUNSSlJrTmZRMFpIWDBaSlRFVUtDaU1nVW1WemRHRnlkQ0JPWlhSM2IzSnJUV0Z1WVdkbGNpQjBieUJoY0hCc2VTQm1iM0lnU1ZCMk5pQmpiMjVtYVdkekNuTjVjM1JsYldOMGJDQnlaWE4wWVhKMElFNWxkSGR2Y210TllXNWhaMlZ5Q2lNZ1RHVjBJRTVsZEhkdmNtdE5ZVzVoWjJWeUlHRndjR3g1SUhSb1pTQkVTRU5RZGpZZ1kyOXVabWxuY3dwemJHVmxjQ0F6Q2dwdGEyUnBjaUF0Y0NBdlpYUmpMM041YzNSbGJXUXZjM2x6ZEdWdEwydDFZbVZzWlhRdWMyVnlkbWxqWlM1a0x3b2pJSE5sZENCcmRXSmxiR1YwSUc1dlpHVnBjQ0JsYm5acGNtOXViV1Z1ZENCMllYSnBZV0pzWlFvdmIzQjBMMkpwYmk5elpYUjFjRjl1WlhSZlpXNTJMbk5vQ2dvS1kzVnliQ0F0Y3lBdGF5QXRkaUF0TFdobFlXUmxjaUFuUVhWMGFHOXlhWHBoZEdsdmJqb2dRbVZoY21WeUlIUnZjQzF6WldOeVpYUW5JR2gwZEhCek9pOHZabTl2TG1KaGNqbzJORFF6TDJGd2FTOTJNUzl1WVcxbGMzQmhZMlZ6TDJOc2IzVmtMV2x1YVhRdGMyVjBkR2x1WjNNdmMyVmpjbVYwY3k5cmRXSmxMWE41YzNSbGJTMXZjM0F0Y21obGJDMWhkM010YTNWaVpXeGxkQzFpYjI5MGMzUnlZWEF0WTI5dVptbG5JSHdnYW5FZ0p5NWtZWFJoV3lKcmRXSmxZMjl1Wm1sbklsMG5JQzF5ZkNCaVlYTmxOalFnTFdRZ1BpQXZaWFJqTDJ0MVltVnlibVYwWlhNdlltOXZkSE4wY21Gd0xXdDFZbVZzWlhRdVkyOXVaZ29LYzNsemRHVnRZM1JzSUdWdVlXSnNaU0F0TFc1dmR5QnJkV0psYkdWMENuTjVjM1JsYldOMGJDQmxibUZpYkdVZ0xTMXViM2NnTFMxdWJ5MWliRzlqYXlCcmRXSmxiR1YwTFdobFlXeDBhR05vWldOckxuTmxjblpwWTJVS2MzbHpkR1Z0WTNSc0lHUnBjMkZpYkdVZ2MyVjBkWEF1YzJWeWRtbGpaUW89CgotIHBhdGg6ICcvZXRjL3N5c3RlbWQvc3lzdGVtL2t1YmVsZXQuc2VydmljZScKICBwZXJtaXNzaW9uczogJzA2NDQnCiAgZW5jb2Rpbmc6ICdiNjQnCiAgY29udGVudDogfC0KICAgIFcxVnVhWFJkQ2tGbWRHVnlQV052Ym5SaGFXNWxjbVF1YzJWeWRtbGpaUXBTWlhGMWFYSmxjejFqYjI1MFlXbHVaWEprTG5ObGNuWnBZMlVLQ2tSbGMyTnlhWEIwYVc5dVBXdDFZbVZzWlhRNklGUm9aU0JMZFdKbGNtNWxkR1Z6SUU1dlpHVWdRV2RsYm5RS1JHOWpkVzFsYm5SaGRHbHZiajFvZEhSd2N6b3ZMMnQxWW1WeWJtVjBaWE11YVc4dlpHOWpjeTlvYjIxbEx3b0tXMU5sY25acFkyVmRDbFZ6WlhJOWNtOXZkQXBTWlhOMFlYSjBQV0ZzZDJGNWN3cFRkR0Z5ZEV4cGJXbDBTVzUwWlhKMllXdzlNQXBTWlhOMFlYSjBVMlZqUFRFd0NrTlFWVUZqWTI5MWJuUnBibWM5ZEhKMVpRcE5aVzF2Y25sQlkyTnZkVzUwYVc1blBYUnlkV1VLQ2tWdWRtbHliMjV0Wlc1MFBTSlFRVlJJUFM5dmNIUXZZbWx1T2k5aWFXNDZMM1Z6Y2k5c2IyTmhiQzl6WW1sdU9pOTFjM0l2Ykc5allXd3ZZbWx1T2k5MWMzSXZjMkpwYmpvdmRYTnlMMkpwYmpvdmMySnBiaThpQ2tWdWRtbHliMjV0Wlc1MFJtbHNaVDB0TDJWMFl5OWxiblpwY205dWJXVnVkQW9LUlhobFkxTjBZWEowVUhKbFBTOWlhVzR2WW1GemFDQXZiM0IwTDJScGMyRmliR1V0YzNkaGNDNXphQXBGZUdWalUzUmhjblJRY21VOUwySnBiaTlpWVhOb0lDOXZjSFF2Ykc5aFpDMXJaWEp1Wld3dGJXOWtkV3hsY3k1emFBcEZlR1ZqVTNSaGNuUlFjbVU5TDJKcGJpOWlZWE5vSUM5dmNIUXZZbWx1TDNObGRIVndYMjVsZEY5bGJuWXVjMmdLUlhobFkxTjBZWEowUFM5dmNIUXZZbWx1TDJ0MVltVnNaWFFnWEFvZ0lDMHRZbTl2ZEhOMGNtRndMV3QxWW1WamIyNW1hV2M5TDJWMFl5OXJkV0psY201bGRHVnpMMkp2YjNSemRISmhjQzFyZFdKbGJHVjBMbU52Ym1ZZ1hBb2dJQzB0YTNWaVpXTnZibVpwWnowdmRtRnlMMnhwWWk5cmRXSmxiR1YwTDJ0MVltVmpiMjVtYVdjZ1hBb2dJQzB0WTI5dVptbG5QUzlsZEdNdmEzVmlaWEp1WlhSbGN5OXJkV0psYkdWMExtTnZibVlnWEFvZ0lDMHRZMlZ5ZEMxa2FYSTlMMlYwWXk5cmRXSmxjbTVsZEdWekwzQnJhU0JjQ2lBZ0xTMWxlR2wwTFc5dUxXeHZZMnN0WTI5dWRHVnVkR2x2YmlCY0NpQWdMUzFzYjJOckxXWnBiR1U5TDNSdGNDOXJkV0psYkdWMExteHZZMnNnWEFvZ0lDMHRZMjl1ZEdGcGJtVnlMWEoxYm5ScGJXVXRaVzVrY0c5cGJuUTlkVzVwZURvdkx5OXlkVzR2WTI5dWRHRnBibVZ5WkM5amIyNTBZV2x1WlhKa0xuTnZZMnNnWEFvZ0lDMHRibTlrWlMxcGNDQWtlMHRWUWtWTVJWUmZUazlFUlY5SlVIMEtDbHRKYm5OMFlXeHNYUXBYWVc1MFpXUkNlVDF0ZFd4MGFTMTFjMlZ5TG5SaGNtZGxkQW89CgotIHBhdGg6ICcvZXRjL2t1YmVybmV0ZXMvY2xvdWQtY29uZmlnJwogIHBlcm1pc3Npb25zOiAnMDYwMCcKICBlbmNvZGluZzogJ2I2NCcKICBjb250ZW50OiB8LQogICAgQ2c9PQoKLSBwYXRoOiAnL29wdC9iaW4vc2V0dXBfbmV0X2Vudi5zaCcKICBwZXJtaXNzaW9uczogJzA3NTUnCiAgZW5jb2Rpbmc6ICdiNjQnCiAgY29udGVudDogfC0KICAgIEl5RXZkWE55TDJKcGJpOWxibllnWW1GemFBcGxZMmh2WkdGMFpTZ3BJSHNLSUNCbFkyaHZJQ0piSkNoa1lYUmxJQzFKY3lsZElpQWlKRUFpQ24wS0NpTWdaMlYwSUhSb1pTQmtaV1poZFd4MElHbHVkR1Z5Wm1GalpTQkpVQ0JoWkdSeVpYTnpDa1JGUmtGVlRGUmZTVVpEWDBsUVBTUW9hWEFnTFc4Z0lISnZkWFJsSUdkbGRDQXhJSHdnWjNKbGNDQXRiMUFnSW5OeVl5QmNTMXhUS3lJcENncHBaaUJiSUMxNklDSWtlMFJGUmtGVlRGUmZTVVpEWDBsUWZTSWdYUXAwYUdWdUNpQWdaV05vYjJSaGRHVWdJa1poYVd4bFpDQjBieUJuWlhRZ1NWQWdZV1JrY21WemN5Qm1iM0lnZEdobElHUmxabUYxYkhRZ2NtOTFkR1VnYVc1MFpYSm1ZV05sSWdvZ0lHVjRhWFFnTVFwbWFRb0tJeUJuWlhRZ2RHaGxJR1oxYkd3Z2FHOXpkRzVoYldVS1JsVk1URjlJVDFOVVRrRk5SVDBrS0dodmMzUnVZVzFsSUMxbUtRb2pJR2xtSUM5bGRHTXZiV0ZqYUdsdVpTMXVZVzFsSUdseklHNXZkQ0JsYlhCMGVTQjBhR1Z1SUhWelpTQjBhR1VnYUc5emRHNWhiV1VnWm5KdmJTQjBhR1Z5WlFwcFppQmJJQzF6SUM5bGRHTXZiV0ZqYUdsdVpTMXVZVzFsSUYwN0lIUm9aVzRLSUNCR1ZVeE1YMGhQVTFST1FVMUZQU1FvWTJGMElDOWxkR012YldGamFHbHVaUzF1WVcxbEtRcG1hUW9LSXlCM2NtbDBaU0IwYUdVZ2JtOWtaV2x3WDJWdWRpQm1hV3hsQ2lNZ2QyVWdibVZsWkNCMGFHVWdiR2x1WlNCaVpXeHZkeUJpWldOaGRYTmxJR1pzWVhSallYSWdhR0Z6SUhSb1pTQnpZVzFsSUhOMGNtbHVaeUFpWTI5eVpXOXpJaUJwYmlCMGFHRjBJR1pwYkdVS2FXWWdaM0psY0NBdGNTQmpiM0psYjNNZ0wyVjBZeTl2Y3kxeVpXeGxZWE5sQ25Sb1pXNEtJQ0JsWTJodklDSkxWVUpGVEVWVVgwNVBSRVZmU1ZBOUpIdEVSVVpCVlV4VVgwbEdRMTlKVUgxY2JrdFZRa1ZNUlZSZlNFOVRWRTVCVFVVOUpIdEdWVXhNWDBoUFUxUk9RVTFGZlNJZ1BpQXZaWFJqTDJ0MVltVnlibVYwWlhNdmJtOWtaV2x3TG1OdmJtWUtaV3h6WlFvZ0lHMXJaR2x5SUMxd0lDOWxkR012YzNsemRHVnRaQzl6ZVhOMFpXMHZhM1ZpWld4bGRDNXpaWEoyYVdObExtUUtJQ0JsWTJodklDMWxJQ0piVTJWeWRtbGpaVjFjYmtWdWRtbHliMjV0Wlc1MFBWd2lTMVZDUlV4RlZGOU9UMFJGWDBsUVBTUjdSRVZHUVZWTVZGOUpSa05mU1ZCOVhDSmNia1Z1ZG1seWIyNXRaVzUwUFZ3aVMxVkNSVXhGVkY5SVQxTlVUa0ZOUlQwa2UwWlZURXhmU0U5VFZFNUJUVVY5WENJaUlENGdMMlYwWXk5emVYTjBaVzFrTDNONWMzUmxiUzlyZFdKbGJHVjBMbk5sY25acFkyVXVaQzl1YjJSbGFYQXVZMjl1WmdwbWFRbz0KCi0gcGF0aDogJy9ldGMva3ViZXJuZXRlcy9wa2kvY2EuY3J0JwogIHBlcm1pc3Npb25zOiAnMDY0NCcKICBlbmNvZGluZzogJ2I2NCcKICBjb250ZW50OiB8LQogICAgTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVVlhha05EUVRCTFowRjNTVUpCWjBsS1FVeG1VbXhYYzBrNFdWRklUVUV3UjBOVGNVZFRTV0l6UkZGRlFrSlJWVUZOU0hONFEzcEJTa0puVGxZS1FrRlpWRUZzVmxSTlVYTjNRMUZaUkZaUlVVbEZkMHBFVVZSRlYwMUNVVWRCTVZWRlFuaE5UbFV5Um5WSlJWcDVXVmMxYW1GWVRtcGlla1ZWVFVKSlJ3cEJNVlZGUTJoTlRGRnVTbWhhUjFwd1pFaHdjR0p0VFhoRmFrRlJRbWRPVmtKQlRWUkRWM2gyV1RKR2MyRkhPWHBrUkVWa1RVSnpSME5UY1VkVFNXSXpDa1JSUlVwQlVsbFBXVzVLYUZwRlFtdFpWelZ1V1ZNMWFtSXlNSGRJYUdOT1RWUlJkMDU2UlRGTmFrRXdUbXBCTVZkb1kwNU5WR04zVGxSQk1FMXFRVEFLVG1wQk1WZHFRamROVVhOM1ExRlpSRlpSVVVkRmQwcFdWWHBGVEUxQmEwZEJNVlZGUTBKTlExRXdSWGhHYWtGVlFtZE9Wa0pCWTFSRVZrNW9ZbWxDUndwamJVWjFXVEpzZWxreU9IaEdSRUZUUW1kT1ZrSkJiMVJETUVwNVdWZFNiV0ZZVWpaaFZ6VnFUVkpKZDBWQldVUldVVkZFUlhkc2MySXlUbWhpUjJoMkNtTXpVWGhJVkVGaVFtZHJjV2hyYVVjNWR6QkNRMUZGVjBSdFNubFpWMUpCV2tkR2RWb3lSWFZaTWpsMFRVbEpRa2xxUVU1Q1oydHhhR3RwUnpsM01FSUtRVkZGUmtGQlQwTkJVVGhCVFVsSlFrTm5TME5CVVVWQmREVm1RV3B3TkdaVVkyVnJWMVZVWm5wemNEQnJlV2xvTVU5WlluTkhUREJMV0RGbFVtSlRVd3BTT0U5a01DczVVVFl5U0hsdWVTdEhSbmROVkdJMFFTOUxWVGh0YzNOdlNIWmpZMlZUUVVGaWQyWmllRVpMTHl0ek5URlViMkp4Vlc1UFVscHlUMjlVQ2xwcWExVjVaMko1V0VSVFN6azVXVUppWTFJeFVHbHdPSFozVFZSdE5GaExkVXgwUTJsblpVSkNaR3BxUVZGa1oxVlBNamhNUlU1SGJITk5ibTFsV1dzS1NtWlBSRlpIYmxadGNqVk1kR0k1UVU1Qk9FbExlVlJtYzI1SVNqUnBUME5UTDFCc1VHSlZhakp4TjFsdWIxWk1jRzl6VlVKTmJHZFZZaTlEZVd0WU13cHRUMjlNWWpSNVNrcFJlVUV2YVZOVU5scDRhVWxGYWpNMlJEUjVWMW8xYkdjM1dVcHNLMVZwYVVKUlNFZERibEJrUjNscGNIRldNRFpsZURCb1pWbFhDbU5oYVZjNFRGZGFVMVZST1ROcVVTdFhWa05JT0doVU4wUlJUekZrYlhOMlZXMVliSEV2U21WQmJIZFJMMUZKUkVGUlFVSnZORWhuVFVsSVpFMUNNRWNLUVRGVlpFUm5VVmRDUWxKalFWSlBkR2hUTkZBMFZUZDJWR1pxUW5sRE5UWTVVamRGTmtSRFFuSlJXVVJXVWpCcVFrbEhiRTFKUjJsblFsSmpRVkpQZEFwb1V6UlFORlUzZGxSbWFrSjVRelUyT1ZJM1JUWkxSaTl3U0RCM1pYcEZURTFCYTBkQk1WVkZRbWhOUTFaV1RYaERla0ZLUW1kT1ZrSkJaMVJCYTA1Q0NrMVNXWGRHUVZsRVZsRlJTRVYzTVZSWlZ6Um5VbTVLYUdKdFRuQmpNazUyVFZKUmQwVm5XVVJXVVZGTFJYZDBRMk50Um10YWJXd3daVzFzZFZsNlJWTUtUVUpCUjBFeFZVVkJlRTFLWWtjNWFsbFhlRzlpTTA0d1RWSXdkMGQzV1VwTGIxcEphSFpqVGtGUmEwSkdaelZwWTIxR2ExRkhVbWhpYldSb1RHMU9kZ3BpV1VsS1FVeG1VbXhYYzBrNFdWRklUVUYzUjBFeFZXUkZkMUZHVFVGTlFrRm1PSGRFVVZsS1MyOWFTV2gyWTA1QlVVVkdRbEZCUkdkblJVSkJSelpvQ2xVNVpqbHpUa2d3THpadlFtSkhSM2t5UlZaVk1GVm5TVlJWVVVseVJsZHZPWEpHYTNKWE5Xc3ZXR3RFYWxGdEt6TnNlbXBVTUdsSFVqUkplRVV2UVc4S1pWVTJjMUZvZFdFM2QzSlhaVVpGYmpRM1IwdzVPR3h1UTNOS1pFUTNiMXBPYUVadFVUazFWR0l2VEc1RVZXcHpOVmxxT1dKeVVEQk9WM3BZWmxsVk5BcFZTekphYmtsT1NsSmpTbkJDT0dsU1EyRkRlRVU0UkdSalZVWXdXSEZKUlhFMmNFRXlOekp6Ym05TWJXbFlURTEyVG13emExbEZaRzByYW1VMmRtOUVDalU0VTA1V1JWVnplblI2VVhsWWJVcEZhRU53ZDFaSk1FRTJVVU5xZWxocUszRjJjRzEzTTFwYVNHazRTbmRZWldrNFdscENURlJUUmtKcmFUaGFOMjRLYzBnNVFrSklNemd2VTNwVmJVRk9ORkZJVTFCNU1XZHFjVzB3TUU5QlJUaE9ZVmxFYTJndllucEZOR1EzYlV4SFIwMVhjQzlYUlROTFVGTjFPREpJUmdwclVHVTJXRzlUWW1sTWJTOXJlR3N6TWxRd1BRb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENnPT0KCi0gcGF0aDogJy9ldGMvc3lzdGVtZC9zeXN0ZW0vc2V0dXAuc2VydmljZScKICBwZXJtaXNzaW9uczogJzA2NDQnCiAgZW5jb2Rpbmc6ICdiNjQnCiAgY29udGVudDogfC0KICAgIFcwbHVjM1JoYkd4ZENsZGhiblJsWkVKNVBXMTFiSFJwTFhWelpYSXVkR0Z5WjJWMENncGJWVzVwZEYwS1VtVnhkV2x5WlhNOWJtVjBkMjl5YXkxdmJteHBibVV1ZEdGeVoyVjBDa0ZtZEdWeVBXNWxkSGR2Y21zdGIyNXNhVzVsTG5SaGNtZGxkQW9LVzFObGNuWnBZMlZkQ2xSNWNHVTliMjVsYzJodmRBcFNaVzFoYVc1QlpuUmxja1Y0YVhROWRISjFaUXBGYm5acGNtOXViV1Z1ZEVacGJHVTlMUzlsZEdNdlpXNTJhWEp2Ym0xbGJuUUtSWGhsWTFOMFlYSjBQUzl2Y0hRdlltbHVMM04xY0dWeWRtbHpaUzV6YUNBdmIzQjBMMkpwYmk5elpYUjFjQW89CgotIHBhdGg6ICcvZXRjL3Byb2ZpbGUuZC9vcHQtYmluLXBhdGguc2gnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBaWGh3YjNKMElGQkJWRWc5SWk5dmNIUXZZbWx1T2lSUVFWUklJZ289CgotIHBhdGg6ICcvZXRjL2t1YmVybmV0ZXMva3ViZWxldC5jb25mJwogIHBlcm1pc3Npb25zOiAnMDY0NCcKICBlbmNvZGluZzogJ2I2NCcKICBjb250ZW50OiB8LQogICAgWVhCcFZtVnljMmx2YmpvZ2EzVmlaV3hsZEM1amIyNW1hV2N1YXpoekxtbHZMM1l4WW1WMFlURUthMmx1WkRvZ1MzVmlaV3hsZEVOdmJtWnBaM1Z5WVhScGIyNEtZWFYwYUdWdWRHbGpZWFJwYjI0NkNpQWdZVzV2Ym5sdGIzVnpPZ29nSUNBZ1pXNWhZbXhsWkRvZ1ptRnNjMlVLSUNCNE5UQTVPZ29nSUNBZ1kyeHBaVzUwUTBGR2FXeGxPaUF2WlhSakwydDFZbVZ5Ym1WMFpYTXZjR3RwTDJOaExtTnlkQXBoZFhSb2IzSnBlbUYwYVc5dU9nb2dJRzF2WkdVNklGZGxZbWh2YjJzS0lDQjNaV0pvYjI5ck9nb2dJQ0FnWTJGamFHVkJkWFJvYjNKcGVtVmtWRlJNT2lBMWJUQnpDaUFnSUNCallXTm9aVlZ1WVhWMGFHOXlhWHBsWkZSVVREb2dNekJ6Q21ObmNtOTFjRVJ5YVhabGNqb2djM2x6ZEdWdFpBcGpiSFZ6ZEdWeVJFNVRPZ290SUNJeE1DNHdMakF1TUNJS1kyeDFjM1JsY2tSdmJXRnBiam9nWTJ4MWMzUmxjaTVzYjJOaGJBcGpiMjUwWVdsdVpYSk1iMmROWVhoVGFYcGxPaUF4TURCTmFRcGpiMjUwWVdsdVpYSk1iMmROWVhoR2FXeGxjem9nTlFwbVpXRjBkWEpsUjJGMFpYTTZDaUFnUjNKaFkyVm1kV3hPYjJSbFUyaDFkR1J2ZDI0NklIUnlkV1VLSUNCSlpHVnVkR2xtZVZCdlpFOVRPaUJtWVd4elpRcHdjbTkwWldOMFMyVnlibVZzUkdWbVlYVnNkSE02SUhSeWRXVUtjbVZoWkU5dWJIbFFiM0owT2lBd0NuSnZkR0YwWlVObGNuUnBabWxqWVhSbGN6b2dkSEoxWlFwelpYSjJaWEpVVEZOQ2IyOTBjM1J5WVhBNklIUnlkV1VLYzNSaGRHbGpVRzlrVUdGMGFEb2dMMlYwWXk5cmRXSmxjbTVsZEdWekwyMWhibWxtWlhOMGN3b2pJRVZ1WVdKc1pTQndZWEpoYkd4bGJDQnBiV0ZuWlNCd2RXeHNhVzVuTGdwelpYSnBZV3hwZW1WSmJXRm5aVkIxYkd4ek9pQm1ZV3h6WlFvaklGTmxkQ0J0WVhnZ2NHRnlZV3hzWld3Z2FXMWhaMlVnY0hWc2JITWdkRzhnTVRBdUNtMWhlRkJoY21Gc2JHVnNTVzFoWjJWUWRXeHNjem9nTVRBS2EzVmlaVkpsYzJWeWRtVmtPZ29nSUdOd2RUb2dNakF3YlFvZ0lHVndhR1Z0WlhKaGJDMXpkRzl5WVdkbE9pQXhSMmtLSUNCdFpXMXZjbms2SURJd01FMXBDbk41YzNSbGJWSmxjMlZ5ZG1Wa09nb2dJR053ZFRvZ01qQXdiUW9nSUdWd2FHVnRaWEpoYkMxemRHOXlZV2RsT2lBeFIya0tJQ0J0WlcxdmNuazZJREl3TUUxcENtVjJhV04wYVc5dVNHRnlaRG9LSUNCcGJXRm5aV1p6TG1GMllXbHNZV0pzWlRvZ01UVWxDaUFnYldWdGIzSjVMbUYyWVdsc1lXSnNaVG9nTVRBd1RXa0tJQ0J1YjJSbFpuTXVZWFpoYVd4aFlteGxPaUF4TUNVS0lDQnViMlJsWm5NdWFXNXZaR1Z6Um5KbFpUb2dOU1VLZEd4elEybHdhR1Z5VTNWcGRHVnpPZ290SUZSTVUxOUJSVk5mTVRJNFgwZERUVjlUU0VFeU5UWUtMU0JVVEZOZlFVVlRYekkxTmw5SFEwMWZVMGhCTXpnMENpMGdWRXhUWDBOSVFVTklRVEl3WDFCUFRGa3hNekExWDFOSVFUSTFOZ290SUZSTVUxOUZRMFJJUlY5RlEwUlRRVjlYU1ZSSVgwRkZVMTh4TWpoZlIwTk5YMU5JUVRJMU5nb3RJRlJNVTE5RlEwUklSVjlGUTBSVFFWOVhTVlJJWDBGRlUxOHlOVFpmUjBOTlgxTklRVE00TkFvdElGUk1VMTlGUTBSSVJWOUZRMFJUUVY5WFNWUklYME5JUVVOSVFUSXdYMUJQVEZreE16QTFDaTBnVkV4VFgwVkRSRWhGWDFKVFFWOVhTVlJJWDBGRlUxOHhNamhmUjBOTlgxTklRVEkxTmdvdElGUk1VMTlGUTBSSVJWOVNVMEZmVjBsVVNGOUJSVk5mTWpVMlgwZERUVjlUU0VFek9EUUtMU0JVVEZOZlJVTkVTRVZmVWxOQlgxZEpWRWhmUTBoQlEwaEJNakJmVUU5TVdURXpNRFVLZG05c2RXMWxVR3gxWjJsdVJHbHlPaUF2ZG1GeUwyeHBZaTlyZFdKbGJHVjBMM1p2YkhWdFpYQnNkV2RwYm5NSwoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LWhlYWx0aGNoZWNrLnNlcnZpY2UnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGVuY29kaW5nOiAnYjY0JwogIGNvbnRlbnQ6IHwtCiAgICBXMVZ1YVhSZENsSmxjWFZwY21WelBXdDFZbVZzWlhRdWMyVnlkbWxqWlFwQlpuUmxjajFyZFdKbGJHVjBMbk5sY25acFkyVUtDbHRUWlhKMmFXTmxYUXBGYm5acGNtOXViV1Z1ZEVacGJHVTlMUzlsZEdNdlpXNTJhWEp2Ym0xbGJuUUtSWGhsWTFOMFlYSjBQUzl2Y0hRdlltbHVMMmhsWVd4MGFDMXRiMjVwZEc5eUxuTm9JR3QxWW1Wc1pYUUtDbHRKYm5OMFlXeHNYUXBYWVc1MFpXUkNlVDF0ZFd4MGFTMTFjMlZ5TG5SaGNtZGxkQW89CgotIHBhdGg6ICcvb3B0L2Rpc2FibGUtc3dhcC5zaCcKICBwZXJtaXNzaW9uczogJzA3NTUnCiAgZW5jb2Rpbmc6ICdiNjQnCiAgY29udGVudDogfC0KICAgIEl5RXZkWE55TDJKcGJpOWxibllnWW1GemFBcHpaWFFnTFdWMWJ5QndhWEJsWm1GcGJBb0tJeUJOWVd0bElITjFjbVVnZDJVZ1lXeDNZWGx6SUdScGMyRmliR1VnYzNkaGNDQXRJRTkwYUdWeWQybHpaU0IwYUdVZ2EzVmlaV3hsZENCM2IyNG5kQ0J6ZEdGeWRDQmhjeUJtYjNJZ2MyOXRaU0JqYkc5MVpBb2pJSEJ5YjNacFpHVnljeUJ6ZDJGd0lHZGxkSE1nWlc1aFlteGxaQ0J2YmlCeVpXSnZiM1FnYjNJZ1lXWjBaWElnZEdobElITmxkSFZ3SUhOamNtbHdkQ0JvWVhNZ1ptbHVhWE5vWldRZ1pYaGxZM1YwYVc1bkxncHpaV1FnTFdrdWIzSnBaeUFuTHk0cWMzZGhjQzRxTDJRbklDOWxkR012Wm5OMFlXSUtjM2RoY0c5bVppQXRZUW89CgotIHBhdGg6ICcvZXRjL3N5c3RlbWQvc3lzdGVtL2NvbnRhaW5lcmQuc2VydmljZS5kL2Vudmlyb25tZW50LmNvbmYnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGNvbnRlbnQ6IHwtCiAgICBbU2VydmljZV0KICAgIFJlc3RhcnQ9YWx3YXlzCiAgICBFbnZpcm9ubWVudEZpbGU9LS9ldGMvZW52aXJvbm1lbnQKICAgIAoKLSBwYXRoOiAnL2V0Yy9jcmljdGwueWFtbCcKICBwZXJtaXNzaW9uczogJzA2NDQnCiAgY29udGVudDogfC0KICAgIHJ1bnRpbWUtZW5kcG9pbnQ6IHVuaXg6Ly8vcnVuL2NvbnRhaW5lcmQvY29udGFpbmVyZC5zb2NrCiAgICAKCi0gcGF0aDogJy9ldGMvY29udGFpbmVyZC9jb25maWcudG9tbCcKICBwZXJtaXNzaW9uczogJzA2MDAnCiAgZW5jb2Rpbmc6ICdiNjQnCiAgY29udGVudDogfC0KICAgIGRtVnljMmx2YmlBOUlESUtDbHR0WlhSeWFXTnpYUXBoWkdSeVpYTnpJRDBnSWpFeU55NHdMakF1TVRveE16TTRJZ29LVzNCc2RXZHBibk5kQ2x0d2JIVm5hVzV6TGlKcGJ5NWpiMjUwWVdsdVpYSmtMbWR5Y0dNdWRqRXVZM0pwSWwwS2MyRnVaR0p2ZUY5cGJXRm5aU0E5SUNJeE9USXVNVFk0TGpFd01DNHhNREE2TlRBd01DOXJkV0psY201bGRHVnpMM0JoZFhObE9uWXpMakVpQ2x0d2JIVm5hVzV6TGlKcGJ5NWpiMjUwWVdsdVpYSmtMbWR5Y0dNdWRqRXVZM0pwSWk1amIyNTBZV2x1WlhKa1hRcGJjR3gxWjJsdWN5NGlhVzh1WTI5dWRHRnBibVZ5WkM1bmNuQmpMbll4TG1OeWFTSXVZMjl1ZEdGcGJtVnlaQzV5ZFc1MGFXMWxjMTBLVzNCc2RXZHBibk11SW1sdkxtTnZiblJoYVc1bGNtUXVaM0p3WXk1Mk1TNWpjbWtpTG1OdmJuUmhhVzVsY21RdWNuVnVkR2x0WlhNdWNuVnVZMTBLY25WdWRHbHRaVjkwZVhCbElEMGdJbWx2TG1OdmJuUmhhVzVsY21RdWNuVnVZeTUyTWlJS1czQnNkV2RwYm5NdUltbHZMbU52Ym5SaGFXNWxjbVF1WjNKd1l5NTJNUzVqY21raUxtTnZiblJoYVc1bGNtUXVjblZ1ZEdsdFpYTXVjblZ1WXk1dmNIUnBiMjV6WFFwVGVYTjBaVzFrUTJkeWIzVndJRDBnZEhKMVpRcGJjR3gxWjJsdWN5NGlhVzh1WTI5dWRHRnBibVZ5WkM1bmNuQmpMbll4TG1OeWFTSXVjbVZuYVhOMGNubGRDbHR3YkhWbmFXNXpMaUpwYnk1amIyNTBZV2x1WlhKa0xtZHljR011ZGpFdVkzSnBJaTV5WldkcGMzUnllUzV0YVhKeWIzSnpYUXBiY0d4MVoybHVjeTRpYVc4dVkyOXVkR0ZwYm1WeVpDNW5jbkJqTG5ZeExtTnlhU0l1Y21WbmFYTjBjbmt1YldseWNtOXljeTRpWkc5amEyVnlMbWx2SWwwS1pXNWtjRzlwYm5RZ1BTQmJJbWgwZEhCek9pOHZjbVZuYVhOMGNua3VaRzlqYTJWeUxXTnVMbU52YlNKZENsdHdiSFZuYVc1ekxpSnBieTVqYjI1MFlXbHVaWEprTG1keWNHTXVkakV1WTNKcElpNXlaV2RwYzNSeWVTNWpiMjVtYVdkelhRcGJjR3gxWjJsdWN5NGlhVzh1WTI5dWRHRnBibVZ5WkM1bmNuQmpMbll4TG1OeWFTSXVjbVZuYVhOMGNua3VZMjl1Wm1sbmN5NGlNVEF1TUM0d0xqRTZOVEF3TUNKZENsdHdiSFZuYVc1ekxpSnBieTVqYjI1MFlXbHVaWEprTG1keWNHTXVkakV1WTNKcElpNXlaV2RwYzNSeWVTNWpiMjVtYVdkekxpSXhNQzR3TGpBdU1UbzFNREF3SWk1MGJITmRDbWx1YzJWamRYSmxYM05yYVhCZmRtVnlhV1o1SUQwZ2RISjFaUXBiY0d4MVoybHVjeTRpYVc4dVkyOXVkR0ZwYm1WeVpDNW5jbkJqTG5ZeExtTnlhU0l1Y21WbmFYTjBjbmt1WTI5dVptbG5jeTRpTVRreUxqRTJPQzR4TURBdU1UQXdPalV3TURBaVhRcGJjR3gxWjJsdWN5NGlhVzh1WTI5dWRHRnBibVZ5WkM1bmNuQmpMbll4TG1OeWFTSXVjbVZuYVhOMGNua3VZMjl1Wm1sbmN5NGlNVGt5TGpFMk9DNHhNREF1TVRBd09qVXdNREFpTG5Sc2MxMEthVzV6WldOMWNtVmZjMnRwY0Y5MlpYSnBabmtnUFNCMGNuVmxDZ289CgpyaF9zdWJzY3JpcHRpb246CiAgICBhdXRvLWF0dGFjaDogZmFsc2UKICAgIHBhc3N3b3JkOiAKICAgIHVzZXJuYW1lOiAK immutable: true kind: Secret metadata: diff --git a/pkg/crd/osm/v1alpha1/common_types.go b/pkg/crd/osm/v1alpha1/common_types.go index 2e9c0310..8b8e9464 100644 --- a/pkg/crd/osm/v1alpha1/common_types.go +++ b/pkg/crd/osm/v1alpha1/common_types.go @@ -21,13 +21,12 @@ import ( ) // OperatingSystem represents supported operating system. -// +kubebuilder:validation:Enum=flatcar;rhel;centos;ubuntu;amzn2;rockylinux +// +kubebuilder:validation:Enum=flatcar;rhel;ubuntu;amzn2;rockylinux type OperatingSystem string const ( OperatingSystemFlatcar OperatingSystem = "flatcar" OperatingSystemRHEL OperatingSystem = "rhel" - OperatingSystemCentOS OperatingSystem = "centos" OperatingSystemUbuntu OperatingSystem = "ubuntu" OperatingSystemAmazonLinux2 OperatingSystem = "amzn2" OperatingSystemRockyLinux OperatingSystem = "rockylinux" diff --git a/pkg/providerconfig/centos/centos.go b/pkg/providerconfig/centos/centos.go deleted file mode 100644 index b4fd371e..00000000 --- a/pkg/providerconfig/centos/centos.go +++ /dev/null @@ -1,47 +0,0 @@ -/* -Copyright 2021 The Operating System Manager contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package centos - -import ( - "encoding/json" - - "k8s.io/apimachinery/pkg/runtime" -) - -// Config contains specific configuration for CentOS. -type Config struct { - DistUpgradeOnBoot bool `json:"distUpgradeOnBoot"` -} - -func DefaultConfig(operatingSystemSpec runtime.RawExtension) runtime.RawExtension { - if operatingSystemSpec.Raw == nil { - operatingSystemSpec.Raw, _ = json.Marshal(Config{}) - } - - return operatingSystemSpec -} - -// LoadConfig retrieves the CentOS configuration from raw data. -func LoadConfig(r runtime.RawExtension) (*Config, error) { - r = DefaultConfig(r) - cfg := Config{} - - if err := json.Unmarshal(r.Raw, &cfg); err != nil { - return nil, err - } - return &cfg, nil -}