diff --git a/control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller_test.go b/control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller_test.go index dffc60c8d6a3..7e5df70382b8 100644 --- a/control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller_test.go +++ b/control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller_test.go @@ -1153,6 +1153,19 @@ func TestControlPlaneComponents(t *testing.T) { }, subDirSuffix: "ModernTLS", }, + { + name: "Default feature set, etcd snapshot restore", + featureSet: configv1.Default, + subDirSuffix: "EtcdRestore", + mutateHCP: func(hcp *hyperv1.HostedControlPlane) { + hcp.Spec.Etcd.Managed = &hyperv1.ManagedEtcdSpec{ + Storage: hyperv1.ManagedEtcdStorageSpec{ + Type: hyperv1.PersistentVolumeEtcdStorage, + RestoreSnapshotURL: []string{"https://example.com/etcd-snapshot.db"}, + }, + } + }, + }, } for _, tt := range tests { diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_cloud_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_cloud_config_configmap.yaml new file mode 100644 index 000000000000..1eab657951e3 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_cloud_config_configmap.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + aws.conf: "[Global]\nZone = \nVPC = \nKubernetesClusterID = \nSubnetID = \nClusterServiceLoadBalancerHealthProbeMode + = Shared\nNLBSecurityGroupMode = Managed" +kind: ConfigMap +metadata: + name: aws-cloud-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_cloud_controller_manager_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_cloud_controller_manager_controlplanecomponent.yaml new file mode 100644 index 000000000000..a64cafeb723c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_cloud_controller_manager_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: aws-cloud-controller-manager + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: aws-cloud-controller-manager Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment aws-cloud-controller-manager rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: aws-cloud-config diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_cloud_controller_manager_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_cloud_controller_manager_deployment.yaml new file mode 100644 index 000000000000..6729427577f9 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_cloud_controller_manager_deployment.yaml @@ -0,0 +1,171 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: aws-cloud-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: cloud-controller-manager + strategy: + type: Recreate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: cloud-token,tmp-dir + component.hypershift.openshift.io/config-hash: b7e59b60 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: cloud-controller-manager + hypershift.openshift.io/control-plane-component: aws-cloud-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - --cloud-provider=aws + - --use-service-account-credentials=false + - --kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + - --cloud-config=/etc/cloud/aws.conf + - --configure-cloud-routes=false + - --leader-elect=true + - --leader-elect-lease-duration=137s + - --leader-elect-renew-deadline=107s + - --leader-elect-retry-period=26s + - --leader-elect-resource-namespace=openshift-cloud-controller-manager + - --authentication-kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + - --authorization-kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + command: + - /bin/aws-cloud-controller-manager + env: + - name: AWS_SHARED_CREDENTIALS_FILE + value: /etc/kubernetes/secrets/cloud-provider/credentials + - name: AWS_SDK_LOAD_CONFIG + value: "true" + - name: AWS_EC2_METADATA_DISABLED + value: "true" + image: aws-cloud-controller-manager + imagePullPolicy: IfNotPresent + name: cloud-controller-manager + resources: + requests: + cpu: 75m + memory: 60Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/cloud + name: cloud-config + - mountPath: /etc/aws + name: cloud-controller-creds + - mountPath: /etc/kubernetes/kubeconfig + name: kubeconfig + - mountPath: /etc/kubernetes/secrets/cloud-provider + name: cloud-creds + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - mountPath: /tmp + name: tmp-dir + initContainers: + - args: + - --token-audience=openshift + - --service-account-namespace=kube-system + - --service-account-name=kube-controller-manager + - --token-file=/var/run/secrets/openshift/serviceaccount/token + - --kubeconfig=/etc/kubernetes/kubeconfig + command: + - /usr/bin/control-plane-operator + - token-minter + image: token-minter + imagePullPolicy: IfNotPresent + name: cloud-token-minter + resources: + requests: + cpu: 10m + memory: 30Mi + restartPolicy: Always + startupProbe: + exec: + command: + - test + - -f + - /var/run/secrets/openshift/serviceaccount/token + failureThreshold: 30 + periodSeconds: 1 + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - mountPath: /etc/kubernetes + name: kubeconfig + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - configMap: + defaultMode: 420 + name: aws-cloud-config + name: cloud-config + - name: cloud-controller-creds + secret: + defaultMode: 416 + secretName: cloud-controller-creds + - name: cloud-creds + secret: + defaultMode: 416 + secretName: cloud-controller-creds + - emptyDir: + medium: Memory + name: cloud-token + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-node-termination-handler/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_node_termination_handler_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-node-termination-handler/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_node_termination_handler_controlplanecomponent.yaml new file mode 100644 index 000000000000..c2074dca1d8d --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-node-termination-handler/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_node_termination_handler_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: aws-node-termination-handler + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: aws-node-termination-handler Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment aws-node-termination-handler rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Secret + name: aws-node-termination-handler-creds diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-node-termination-handler/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_node_termination_handler_creds_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-node-termination-handler/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_node_termination_handler_creds_secret.yaml new file mode 100644 index 000000000000..39b947313712 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-node-termination-handler/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_node_termination_handler_creds_secret.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + credentials: W2RlZmF1bHRdCnJvbGVfYXJuID0gYXJuOmF3czppYW06OjEyMzQ1Njc4OTAxMjpyb2xlL3Rlc3Qtbm9kZS1wb29sLW1hbmFnZW1lbnQtcm9sZQp3ZWJfaWRlbnRpdHlfdG9rZW5fZmlsZSA9IC92YXIvcnVuL3NlY3JldHMvb3BlbnNoaWZ0L3NlcnZpY2VhY2NvdW50L3Rva2VuCnN0c19yZWdpb25hbF9lbmRwb2ludHMgPSByZWdpb25hbAo= +kind: Secret +metadata: + name: aws-node-termination-handler-creds + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-node-termination-handler/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_node_termination_handler_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-node-termination-handler/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_node_termination_handler_deployment.yaml new file mode 100644 index 000000000000..8a827b2607b2 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/aws-node-termination-handler/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_node_termination_handler_deployment.yaml @@ -0,0 +1,231 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: aws-node-termination-handler + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: aws-node-termination-handler + strategy: {} + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp,token,cloud-token,tmp-dir + component.hypershift.openshift.io/config-hash: 2e848593 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: aws-node-termination-handler + hypershift.openshift.io/control-plane-component: aws-node-termination-handler + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - env: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: ENABLE_SPOT_INTERRUPTION_DRAINING + value: "true" + - name: ENABLE_SCHEDULED_EVENT_DRAINING + value: "true" + - name: ENABLE_REBALANCE_MONITORING + value: "true" + - name: ENABLE_REBALANCE_DRAINING + value: "true" + - name: ENABLE_SQS_TERMINATION_DRAINING + value: "true" + - name: AWS_REGION + - name: QUEUE_URL + value: https://sqs.us-east-1.amazonaws.com/123456789012/test-queue + - name: DELETE_SQS_MSG_IF_NODE_NOT_FOUND + value: "false" + - name: DRY_RUN + value: "false" + - name: CORDON_ONLY + value: "false" + - name: TAINT_NODE + value: "true" + - name: EXCLUDE_FROM_LOAD_BALANCERS + value: "false" + - name: JSON_LOGGING + value: "false" + - name: LOG_LEVEL + value: info + - name: WEBHOOK_URL + - name: WORKERS + value: "20" + - name: METADATA_TRIES + value: "3" + - name: KUBERNETES_SERVICE_HOST + value: kube-apiserver + - name: KUBERNETES_SERVICE_PORT + value: "6443" + - name: AWS_SHARED_CREDENTIALS_FILE + value: /etc/aws/credentials + - name: ENABLE_KUBERNETES_EVENTS + value: "true" + image: aws-node-termination-handler + imagePullPolicy: IfNotPresent + name: aws-node-termination-handler + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 50m + memory: 64Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /tmp + name: tmp + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: token + - mountPath: /etc/aws + name: credentials + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - args: + - | + # Extract CA certificate from kubeconfig and write to expected location + grep certificate-authority-data /etc/kubernetes/kubeconfig | awk '{print $2}' | base64 -d > /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + + /usr/bin/control-plane-operator token-minter \ + --service-account-namespace=openshift-cluster-version \ + --service-account-name=default \ + --token-audience=https://test-oidc-bucket.s3.us-east-1.amazonaws.com/test-cluster \ + --token-file=/var/run/secrets/kubernetes.io/serviceaccount/token \ + --kubeconfig=/etc/kubernetes/kubeconfig + command: + - /bin/sh + - -c + image: token-minter + imagePullPolicy: IfNotPresent + name: token-minter-kube + resources: + requests: + cpu: 10m + memory: 30Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: token + - mountPath: /etc/kubernetes + name: svc-kubeconfig + - mountPath: /tmp + name: tmp-dir + enableServiceLinks: false + initContainers: + - args: + - --token-audience=openshift + - --service-account-namespace=kube-system + - --service-account-name=capa-controller-manager + - --token-file=/var/run/secrets/openshift/serviceaccount/token + - --kubeconfig=/etc/kubernetes/kubeconfig + command: + - /usr/bin/control-plane-operator + - token-minter + image: token-minter + imagePullPolicy: IfNotPresent + name: cloud-token-minter + resources: + requests: + cpu: 10m + memory: 30Mi + restartPolicy: Always + startupProbe: + exec: + command: + - test + - -f + - /var/run/secrets/openshift/serviceaccount/token + failureThreshold: 30 + periodSeconds: 1 + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - mountPath: /etc/kubernetes + name: svc-kubeconfig + nodeSelector: + kubernetes.io/os: linux + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: tmp + - emptyDir: + medium: Memory + name: token + - name: svc-kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - name: credentials + secret: + defaultMode: 416 + secretName: aws-node-termination-handler-creds + - emptyDir: + medium: Memory + name: cloud-token + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_config_configmap.yaml new file mode 100644 index 000000000000..854f8ab89828 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_config_configmap.yaml @@ -0,0 +1,42 @@ +apiVersion: v1 +data: + cloud.conf: |- + { + "cloud": "", + "tenantId": "", + "useManagedIdentityExtension": false, + "useFederatedWorkloadIdentityExtension": true, + "subscriptionId": "", + "aadClientId": "myClientID", + "aadClientSecret": "", + "aadClientCertPath": "", + "aadFederatedTokenFile": "/var/run/secrets/openshift/serviceaccount/token", + "aadMSIDataPlaneIdentityPath": "", + "resourceGroup": "", + "location": "", + "vnetName": "myVnetName", + "vnetResourceGroup": "myResourceGroupName", + "subnetName": "mySubnetName", + "securityGroupName": "myNSGName", + "securityGroupResourceGroup": "myResourceGroupName", + "routeTableName": "", + "cloudProviderBackoff": true, + "cloudProviderBackoffDuration": 6, + "useInstanceMetadata": true, + "loadBalancerSku": "standard", + "disableOutboundSNAT": true, + "loadBalancerName": "", + "clusterServiceLoadBalancerHealthProbeMode": "shared" + } +kind: ConfigMap +metadata: + name: azure-cloud-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_config_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_config_secret.yaml new file mode 100644 index 000000000000..daa214bfed83 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_config_secret.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +data: + cloud.conf: ewogICJjbG91ZCI6ICIiLAogICJ0ZW5hbnRJZCI6ICIiLAogICJ1c2VNYW5hZ2VkSWRlbnRpdHlFeHRlbnNpb24iOiBmYWxzZSwKICAidXNlRmVkZXJhdGVkV29ya2xvYWRJZGVudGl0eUV4dGVuc2lvbiI6IHRydWUsCiAgInN1YnNjcmlwdGlvbklkIjogIiIsCiAgImFhZENsaWVudElkIjogIm15Q2xpZW50SUQiLAogICJhYWRDbGllbnRTZWNyZXQiOiAiIiwKICAiYWFkQ2xpZW50Q2VydFBhdGgiOiAiIiwKICAiYWFkRmVkZXJhdGVkVG9rZW5GaWxlIjogIi92YXIvcnVuL3NlY3JldHMvb3BlbnNoaWZ0L3NlcnZpY2VhY2NvdW50L3Rva2VuIiwKICAiYWFkTVNJRGF0YVBsYW5lSWRlbnRpdHlQYXRoIjogIiIsCiAgInJlc291cmNlR3JvdXAiOiAiIiwKICAibG9jYXRpb24iOiAiIiwKICAidm5ldE5hbWUiOiAibXlWbmV0TmFtZSIsCiAgInZuZXRSZXNvdXJjZUdyb3VwIjogIm15UmVzb3VyY2VHcm91cE5hbWUiLAogICJzdWJuZXROYW1lIjogIm15U3VibmV0TmFtZSIsCiAgInNlY3VyaXR5R3JvdXBOYW1lIjogIm15TlNHTmFtZSIsCiAgInNlY3VyaXR5R3JvdXBSZXNvdXJjZUdyb3VwIjogIm15UmVzb3VyY2VHcm91cE5hbWUiLAogICJyb3V0ZVRhYmxlTmFtZSI6ICIiLAogICJjbG91ZFByb3ZpZGVyQmFja29mZiI6IHRydWUsCiAgImNsb3VkUHJvdmlkZXJCYWNrb2ZmRHVyYXRpb24iOiA2LAogICJ1c2VJbnN0YW5jZU1ldGFkYXRhIjogdHJ1ZSwKICAibG9hZEJhbGFuY2VyU2t1IjogInN0YW5kYXJkIiwKICAiZGlzYWJsZU91dGJvdW5kU05BVCI6IHRydWUsCiAgImxvYWRCYWxhbmNlck5hbWUiOiAiIiwKICAiY2x1c3RlclNlcnZpY2VMb2FkQmFsYW5jZXJIZWFsdGhQcm9iZU1vZGUiOiAic2hhcmVkIgp9 +kind: Secret +metadata: + name: azure-cloud-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_controller_manager_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_controller_manager_controlplanecomponent.yaml new file mode 100644 index 000000000000..c5e2893c0ad9 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_controller_manager_controlplanecomponent.yaml @@ -0,0 +1,30 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: azure-cloud-controller-manager + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: azure-cloud-controller-manager Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment azure-cloud-controller-manager rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Secret + name: azure-cloud-config + - group: "" + kind: ConfigMap + name: azure-cloud-config + - group: "" + kind: ServiceAccount + name: azure-cloud-controller-manager diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_controller_manager_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_controller_manager_deployment.yaml new file mode 100644 index 000000000000..355ee94448ad --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_controller_manager_deployment.yaml @@ -0,0 +1,155 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: azure-cloud-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: cloud-controller-manager + strategy: + type: Recreate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: cloud-token,tmp-dir + component.hypershift.openshift.io/config-hash: 5e25069a + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: cloud-controller-manager + hypershift.openshift.io/control-plane-component: azure-cloud-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - --cloud-config=/etc/cloud/cloud.conf + - --cloud-provider=azure + - --controllers=*,-cloud-node + - --configure-cloud-routes=false + - --bind-address=127.0.0.1 + - --leader-elect=true + - --route-reconciliation-period=10s + - --kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + - --leader-elect-lease-duration=137s + - --leader-elect-renew-deadline=107s + - --leader-elect-retry-period=26s + - --leader-elect-resource-namespace=openshift-cloud-controller-manager + - --v=4 + - --cluster-name= + command: + - /bin/azure-cloud-controller-manager + image: azure-cloud-controller-manager + imagePullPolicy: IfNotPresent + name: cloud-controller-manager + resources: + requests: + cpu: 75m + memory: 60Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/cloud + name: cloud-config + - mountPath: /etc/kubernetes/kubeconfig + name: kubeconfig + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - mountPath: /tmp + name: tmp-dir + initContainers: + - args: + - --token-audience=openshift + - --service-account-namespace=kube-system + - --service-account-name=azure-cloud-provider + - --token-file=/var/run/secrets/openshift/serviceaccount/token + - --kubeconfig=/etc/kubernetes/kubeconfig + command: + - /usr/bin/control-plane-operator + - token-minter + image: token-minter + imagePullPolicy: IfNotPresent + name: cloud-token-minter + resources: + requests: + cpu: 10m + memory: 30Mi + restartPolicy: Always + startupProbe: + exec: + command: + - test + - -f + - /var/run/secrets/openshift/serviceaccount/token + failureThreshold: 30 + periodSeconds: 1 + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - mountPath: /etc/kubernetes + name: kubeconfig + priorityClassName: hypershift-control-plane + serviceAccountName: azure-cloud-controller-manager + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - name: cloud-config + secret: + defaultMode: 416 + secretName: azure-cloud-config + - emptyDir: + medium: Memory + name: cloud-token + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_controller_manager_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_controller_manager_serviceaccount.yaml new file mode 100644 index 000000000000..fdb16245a03c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/azure-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_azure_cloud_controller_manager_serviceaccount.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + annotations: + azure.workload.identity/client-id: myClientID + azure.workload.identity/tenant-id: "" + name: azure-cloud-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..2bba4a9d1350 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_controlplanecomponent.yaml @@ -0,0 +1,27 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: catalog-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: catalog-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment catalog-operator rollout to finish: 0 out of + 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Service + name: catalog-operator-metrics + - group: monitoring.coreos.com + kind: ServiceMonitor + name: catalog-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_deployment.yaml new file mode 100644 index 000000000000..eb227e6bd6de --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_deployment.yaml @@ -0,0 +1,205 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: catalog-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: catalog-operator + strategy: + type: RollingUpdate + template: + metadata: + annotations: + alpha.image.policy.openshift.io/resolve-names: '*' + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: catalog-operator + hypershift.openshift.io/control-plane-component: catalog-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - --namespace + - openshift-marketplace + - --configmapServerImage=$(OPERATOR_REGISTRY_IMAGE) + - --opmImage=$(OPERATOR_REGISTRY_IMAGE) + - --util-image + - $(OLM_OPERATOR_IMAGE) + - --writeStatusName + - operator-lifecycle-manager-catalog + - --tls-cert + - /srv-cert/tls.crt + - --tls-key + - /srv-cert/tls.key + - --client-ca + - /client-ca/ca.crt + - --kubeconfig + - /etc/openshift/kubeconfig/kubeconfig + command: + - /bin/catalog + env: + - name: RELEASE_VERSION + value: 4.18.0 + - name: KUBECONFIG + value: /etc/openshift/kubeconfig/kubeconfig + - name: OLM_OPERATOR_IMAGE + value: operator-lifecycle-manager + - name: OPERATOR_REGISTRY_IMAGE + value: operator-registry + - name: GRPC_PROXY + value: socks5://127.0.0.1:8090 + - name: NO_PROXY + value: kube-apiserver + image: operator-lifecycle-manager + imagePullPolicy: IfNotPresent + livenessProbe: + httpGet: + path: /healthz + port: 8443 + scheme: HTTPS + initialDelaySeconds: 60 + name: catalog-operator + ports: + - containerPort: 8443 + name: metrics + readinessProbe: + httpGet: + path: /healthz + port: 8443 + scheme: HTTPS + resources: + requests: + cpu: 10m + memory: 80Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /srv-cert + name: srv-cert + readOnly: true + - mountPath: /client-ca + name: profile-collector + readOnly: true + - mountPath: /etc/openshift/kubeconfig + name: kubeconfig + readOnly: true + - mountPath: /tmp + name: tmp-dir + - args: + - run + command: + - /usr/bin/control-plane-operator + - konnectivity-socks5-proxy + env: + - name: KUBECONFIG + value: /etc/kubernetes/secrets/kubeconfig/kubeconfig + image: controlplane-operator + name: konnectivity-proxy-socks5 + resources: + requests: + cpu: 10m + memory: 30Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/secrets/kubeconfig + name: kubeconfig + - mountPath: /etc/konnectivity/proxy-client + name: konnectivity-proxy-cert + - mountPath: /etc/konnectivity/proxy-ca + name: konnectivity-proxy-ca + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + - --kubeconfig=/var/kubeconfig/kubeconfig + - --required-api=operators.coreos.com,v1alpha1,CatalogSource + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/kubeconfig + name: kubeconfig + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: srv-cert + secret: + defaultMode: 416 + secretName: catalog-operator-serving-cert + - name: profile-collector + secret: + defaultMode: 416 + secretName: metrics-client + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - name: konnectivity-proxy-cert + secret: + defaultMode: 416 + secretName: konnectivity-client + - configMap: + name: konnectivity-ca-bundle + name: konnectivity-proxy-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_metrics_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_metrics_service.yaml new file mode 100644 index 000000000000..74ffc92af079 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_metrics_service.yaml @@ -0,0 +1,26 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: catalog-operator + name: catalog-operator-metrics + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: https-metrics + port: 8443 + protocol: TCP + targetPort: metrics + selector: + app: catalog-operator + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_servicemonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_servicemonitor.yaml new file mode 100644 index 000000000000..0a8e3abfcd60 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/catalog-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalog_operator_servicemonitor.yaml @@ -0,0 +1,53 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + hypershift.openshift.io/metrics-endpoint: https-metrics + hypershift.openshift.io/metrics-job: catalog-operator-metrics + hypershift.openshift.io/metrics-namespace: openshift-operator-lifecycle-manager + hypershift.openshift.io/metrics-service: catalog-operator-metrics + name: catalog-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + endpoints: + - metricRelabelings: + - action: drop + regex: etcd_(debugging|disk|server).* + sourceLabels: + - __name__ + - action: replace + replacement: "" + targetLabel: _id + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + targetPort: metrics + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: + secret: + key: tls.crt + name: metrics-client + keySecret: + key: tls.key + name: metrics-client + serverName: catalog-operator-metrics + namespaceSelector: + matchNames: + - hcp-namespace + selector: + matchLabels: + app: catalog-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/certified-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_certified_operators_catalog_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/certified-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_certified_operators_catalog_controlplanecomponent.yaml new file mode 100644 index 000000000000..73d7074883df --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/certified-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_certified_operators_catalog_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: certified-operators-catalog + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: certified-operators-catalog Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment certified-operators-catalog rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Service + name: certified-operators diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/certified-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_certified_operators_catalog_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/certified-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_certified_operators_catalog_deployment.yaml new file mode 100644 index 000000000000..cad71545e5e2 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/certified-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_certified_operators_catalog_deployment.yaml @@ -0,0 +1,171 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + image.openshift.io/triggers: '[{"from":{"kind":"ImageStreamTag","name":"catalogs:certified-operators"},"fieldPath":"spec.template.spec.initContainers[?(@.name==\"extract-content\")].image"}, + {"from":{"kind":"ImageStreamTag","name":"catalogs:certified-operators"},"fieldPath":"spec.template.spec.containers[?(@.name==\"registry\")].image"}]' + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: certified-operators-catalog + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + olm.catalogSource: certified-operators + strategy: {} + template: + metadata: + annotations: + alpha.image.policy.openshift.io/resolve-names: '*' + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: utilities,catalog-content,tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: certified-operators-catalog + hypershift.openshift.io/control-plane-component: certified-operators-catalog + hypershift.openshift.io/hosted-control-plane: hcp-namespace + olm.catalogSource: certified-operators + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - serve + - /extracted-catalog/catalog + - --cache-dir=/extracted-catalog/cache + command: + - /bin/opm + image: catalogs:certified-operators + imagePullPolicy: IfNotPresent + livenessProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 3 + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: registry + ports: + - containerPort: 50051 + name: grpc + protocol: TCP + readinessProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 3 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 10m + memory: 160Mi + securityContext: + readOnlyRootFilesystem: true + startupProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 15 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /extracted-catalog + name: catalog-content + - mountPath: /tmp + name: tmp-dir + initContainers: + - args: + - /bin/copy-content + - /utilities/copy-content + command: + - cp + image: operator-lifecycle-manager + name: extract-utilities + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /utilities + name: utilities + - args: + - --catalog.from=/configs + - --catalog.to=/extracted-catalog/catalog + - --cache.from=/tmp/cache + - --cache.to=/extracted-catalog/cache + command: + - /utilities/copy-content + image: from:imagestream + name: extract-content + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /utilities + name: utilities + - mountPath: /extracted-catalog + name: catalog-content + nodeSelector: + kubernetes.io/os: linux + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: utilities + - emptyDir: {} + name: catalog-content + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/certified-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_certified_operators_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/certified-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_certified_operators_service.yaml new file mode 100644 index 000000000000..42459619a460 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/certified-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_certified_operators_service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: certified-operators + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: grpc + port: 50051 + protocol: TCP + targetPort: 50051 + selector: + olm.catalogSource: certified-operators + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cloud-credential-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cloud_credential_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cloud-credential-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cloud_credential_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..024fc1515dc7 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cloud-credential-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cloud_credential_operator_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: cloud-credential-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: cloud-credential-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment cloud-credential-operator rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Secret + name: cloud-credential-operator-service-account-kubeconfig diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cloud-credential-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cloud_credential_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cloud-credential-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cloud_credential_operator_deployment.yaml new file mode 100644 index 000000000000..8a9ea7d8189d --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cloud-credential-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cloud_credential_operator_deployment.yaml @@ -0,0 +1,125 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: cloud-credential-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: cloud-credential-operator + strategy: + type: Recreate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: 741638a5741638a5741638a5741638a5 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: cloud-credential-operator + hypershift.openshift.io/control-plane-component: cloud-credential-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - operator + - --kubeconfig=/etc/kubernetes/kubeconfig + command: + - /usr/bin/cloud-credential-operator + env: + - name: RELEASE_VERSION + value: 4.18.0 + - name: KUBECONFIG + value: /etc/kubernetes/kubeconfig + image: cloud-credential-operator + imagePullPolicy: IfNotPresent + name: cloud-credential-operator + resources: + requests: + cpu: 10m + memory: 75Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes + name: service-account-kubeconfig + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + - --kubeconfig=/var/kubeconfig/kubeconfig + - --required-api=operator.openshift.io,v1,CloudCredential + - --wait-for-infrastructure-resource + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/kubeconfig + name: service-account-kubeconfig + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: service-account-kubeconfig + secret: + defaultMode: 416 + secretName: cloud-credential-operator-service-account-kubeconfig + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cloud-credential-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cloud_credential_operator_service_account_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cloud-credential-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cloud_credential_operator_service_account_kubeconfig_secret.yaml new file mode 100644 index 000000000000..04d5f5b84ed9 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cloud-credential-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cloud_credential_operator_service_account_kubeconfig_secret.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +data: + ca.crt: "" + kubeconfig: "" + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + name: cloud-credential-operator-service-account-kubeconfig + namespace: hcp-namespace + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_controlplanecomponent.yaml new file mode 100644 index 000000000000..072286f82fb0 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_controlplanecomponent.yaml @@ -0,0 +1,33 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: cluster-autoscaler + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: cluster-autoscaler Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment cluster-autoscaler rollout to finish: 0 out of + 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: monitoring.coreos.com + kind: PodMonitor + name: cluster-autoscaler + - group: rbac.authorization.k8s.io + kind: Role + name: cluster-autoscaler + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: cluster-autoscaler + - group: "" + kind: ServiceAccount + name: cluster-autoscaler diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_deployment.yaml new file mode 100644 index 000000000000..2948dd778b6c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_deployment.yaml @@ -0,0 +1,171 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: cluster-autoscaler + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: cluster-autoscaler + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: cluster-autoscaler + hypershift.openshift.io/control-plane-component: cluster-autoscaler + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - args: + - --cloud-provider=clusterapi + - --node-group-auto-discovery=clusterapi:namespace=$(MY_NAMESPACE) + - --kubeconfig=/mnt/kubeconfig/target-kubeconfig + - --clusterapi-cloud-config-authoritative + - --skip-nodes-with-local-storage=false + - --alsologtostderr + - --leader-elect-lease-duration=137s + - --leader-elect-retry-period=26s + - --leader-elect-renew-deadline=107s + - --balance-similar-node-groups=true + - --v=4 + - --expander=priority,least-waste + - --balancing-ignore-label=hypershift.openshift.io/nodePool + - --balancing-ignore-label=topology.ebs.csi.aws.com/zone + - --balancing-ignore-label=topology.disk.csi.azure.com/zone + - --balancing-ignore-label=ibm-cloud.kubernetes.io/worker-id + - --balancing-ignore-label=vpc-block-csi-driver-labels + - --balancing-ignore-label=hypershift.openshift.io/nodepool-globalps-enabled + - --balancing-ignore-label=lifecycle + - --balancing-ignore-label=k8s.amazonaws.com/eniConfig + - --balancing-ignore-label=topology.k8s.aws/zone-id + command: + - /usr/bin/cluster-autoscaler + env: + - name: MY_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: cluster-autoscaler + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 5 + httpGet: + path: /health-check + port: 8085 + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 60 + successThreshold: 1 + timeoutSeconds: 5 + name: cluster-autoscaler + ports: + - containerPort: 8085 + name: metrics + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /health-check + port: 8085 + scheme: HTTP + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 10m + memory: 60Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /mnt/kubeconfig + name: kubeconfig + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + priorityClassName: hypershift-control-plane + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + serviceAccount: cluster-autoscaler + serviceAccountName: cluster-autoscaler + terminationGracePeriodSeconds: 10 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: kubeconfig + secret: + defaultMode: 416 + items: + - key: value + path: target-kubeconfig + secretName: -kubeconfig + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_podmonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_podmonitor.yaml new file mode 100644 index 000000000000..d5f4f9a343d1 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_podmonitor.yaml @@ -0,0 +1,33 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: cluster-autoscaler + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + namespaceSelector: + matchNames: + - hcp-namespace + podMetricsEndpoints: + - interval: 30s + metricRelabelings: + - action: replace + replacement: "" + targetLabel: _id + path: /metrics + port: metrics + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: http + selector: + matchLabels: + app: cluster-autoscaler diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_role.yaml new file mode 100644 index 000000000000..1268ce7f921b --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_role.yaml @@ -0,0 +1,41 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: cluster-autoscaler + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - cluster.x-k8s.io + resources: + - machinedeployments + - machinedeployments/scale + - machines + - machinesets + - machinesets/scale + - machinepools + - machinepools/scale + verbs: + - '*' +- apiGroups: + - infrastructure.cluster.x-k8s.io + resources: + - '*' + verbs: + - get + - list + - watch +- apiGroups: + - capi-provider.agent-install.openshift.io + resources: + - agentmachinetemplates + verbs: + - get + - list diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_rolebinding.yaml new file mode 100644 index 000000000000..f1e9f7ade4ae --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: cluster-autoscaler + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: cluster-autoscaler +subjects: +- kind: ServiceAccount + name: cluster-autoscaler + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_serviceaccount.yaml new file mode 100644 index 000000000000..01e94158ef64 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-autoscaler/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_autoscaler_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: cluster-autoscaler + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_image_registry_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_image_registry_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..cb1801ad794d --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_image_registry_operator_controlplanecomponent.yaml @@ -0,0 +1,27 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: cluster-image-registry-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: cluster-image-registry-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment cluster-image-registry-operator rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: image-registry-controller-config + - group: monitoring.coreos.com + kind: PodMonitor + name: cluster-image-registry-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_image_registry_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_image_registry_operator_deployment.yaml new file mode 100644 index 000000000000..42b20da37b9c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_image_registry_operator_deployment.yaml @@ -0,0 +1,239 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: cluster-image-registry-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + name: cluster-image-registry-operator + strategy: + type: Recreate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: cloud-token,apiserver-token,tmp-dir + component.hypershift.openshift.io/config-hash: 7ab93c6087ecf31a + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: cluster-image-registry-operator + hypershift.openshift.io/control-plane-component: cluster-image-registry-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + name: cluster-image-registry-operator + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - -c + - | + #!/bin/bash + set -euo pipefail + + while true; do + if [[ -f /var/run/secrets/kubernetes.io/serviceaccount/token ]]; then + break + fi + echo "Waiting for client token" + sleep 2 + done + + echo "openshift-image-registry" > "/var/run/secrets/kubernetes.io/serviceaccount/namespace" + cp "/etc/certificate/ca/ca.crt" "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" + export KUBERNETES_SERVICE_HOST=kube-apiserver + export KUBERNETES_SERVICE_PORT=$KUBE_APISERVER_SERVICE_PORT + + while true; do + if curl --fail --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" "https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}/apis/config.openshift.io/v1/featuregates" &> /dev/null; then + break + fi + echo "Waiting for access to featuregates resource" + sleep 2 + done + + exec /usr/bin/cluster-image-registry-operator \ + --config=/var/run/configmaps/image-registry-controller-config/config.yaml \ + --files=/var/run/configmaps/image-registry-controller-config/config.yaml \ + --files="/etc/secrets/tls.crt" \ + --files="/etc/secrets/tls.key" + command: + - /bin/bash + env: + - name: RELEASE_VERSION + value: 4.18.0 + - name: WATCH_NAMESPACE + value: openshift-image-registry + - name: OPERATOR_NAME + value: cluster-image-registry-operator + - name: OPERATOR_IMAGE + value: cluster-image-registry-operator + - name: IMAGE + value: docker-registry + - name: IMAGE_PRUNER + value: cli + - name: AZURE_ENVIRONMENT_FILEPATH + value: /tmp/azurestackcloud.json + - name: OPERATOR_IMAGE_VERSION + value: 4.18.0 + image: cluster-image-registry-operator + imagePullPolicy: IfNotPresent + name: cluster-image-registry-operator + ports: + - containerPort: 60000 + name: metrics + protocol: TCP + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/certificate/ca + name: ca-bundle + - mountPath: /etc/secrets + name: serving-cert + - mountPath: /var/run/configmaps/image-registry-controller-config + name: image-registry-controller-config + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: apiserver-token + - mountPath: /tmp + name: tmp-dir + initContainers: + - args: + - --token-audience=openshift + - --service-account-namespace=openshift-image-registry + - --service-account-name=cluster-image-registry-operator + - --token-file=/var/run/secrets/openshift/serviceaccount/token + - --kubeconfig=/etc/kubernetes/kubeconfig + command: + - /usr/bin/control-plane-operator + - token-minter + image: token-minter + imagePullPolicy: IfNotPresent + name: cloud-token-minter + resources: + requests: + cpu: 10m + memory: 30Mi + restartPolicy: Always + startupProbe: + exec: + command: + - test + - -f + - /var/run/secrets/openshift/serviceaccount/token + failureThreshold: 30 + periodSeconds: 1 + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - mountPath: /etc/kubernetes + name: kubeconfig + - args: + - --token-audience=https://test-oidc-bucket.s3.us-east-1.amazonaws.com/test-cluster + - --service-account-namespace=openshift-image-registry + - --service-account-name=cluster-image-registry-operator + - --token-file=/var/run/secrets/openshift/serviceaccount/token + - --kubeconfig=/etc/kubernetes/kubeconfig + command: + - /usr/bin/control-plane-operator + - token-minter + image: token-minter + imagePullPolicy: IfNotPresent + name: apiserver-token-minter + resources: + requests: + cpu: 10m + memory: 30Mi + restartPolicy: Always + startupProbe: + exec: + command: + - test + - -f + - /var/run/secrets/openshift/serviceaccount/token + failureThreshold: 30 + periodSeconds: 1 + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/secrets/openshift/serviceaccount + name: apiserver-token + - mountPath: /etc/kubernetes + name: kubeconfig + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: serving-cert + secret: + defaultMode: 416 + secretName: cluster-image-registry-operator + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - name: ca-bundle + secret: + defaultMode: 416 + secretName: root-ca + - configMap: + defaultMode: 420 + name: image-registry-controller-config + name: image-registry-controller-config + - emptyDir: + medium: Memory + name: cloud-token + - emptyDir: + medium: Memory + name: apiserver-token + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_image_registry_operator_podmonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_image_registry_operator_podmonitor.yaml new file mode 100644 index 000000000000..e1e604e3598b --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_image_registry_operator_podmonitor.yaml @@ -0,0 +1,42 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: cluster-image-registry-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + namespaceSelector: + matchNames: + - hcp-namespace + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + interval: 60s + metricRelabelings: + - action: replace + replacement: "" + targetLabel: _id + path: /metrics + port: metrics + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: {} + serverName: cluster-image-registry-operator + selector: + matchLabels: + name: cluster-image-registry-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_image_registry_controller_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_image_registry_controller_config_configmap.yaml new file mode 100644 index 000000000000..4924d530c1f5 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-image-registry-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_image_registry_controller_config_configmap.yaml @@ -0,0 +1,38 @@ +apiVersion: v1 +data: + config.yaml: | + apiVersion: config.openshift.io/v1 + authentication: {} + authorization: {} + kind: GenericControllerConfig + leaderElection: + leaseDuration: 0s + renewDeadline: 0s + retryPeriod: 0s + servingInfo: + bindAddress: :60000 + bindNetwork: "" + certFile: "" + cipherSuites: + - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 + - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + keyFile: "" + maxRequestsInFlight: 0 + minTLSVersion: VersionTLS12 + requestTimeoutSeconds: 0 +kind: ConfigMap +metadata: + name: image-registry-controller-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..fef21fd01d01 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_controlplanecomponent.yaml @@ -0,0 +1,30 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: cluster-network-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: cluster-network-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment cluster-network-operator rollout to finish: 0 + out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: rbac.authorization.k8s.io + kind: Role + name: cluster-network-operator + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: cluster-network-operator + - group: "" + kind: ServiceAccount + name: cluster-network-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_deployment.yaml new file mode 100644 index 000000000000..f708a7d5cd60 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_deployment.yaml @@ -0,0 +1,386 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: cluster-network-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + name: cluster-network-operator + strategy: + type: Recreate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: configs,client-token,tmp-dir + component.hypershift.openshift.io/config-hash: 87ecf31a + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + target.workload.openshift.io/management: '{"effect": "PreferredDuringScheduling"}' + labels: + app: cluster-network-operator + hypershift.openshift.io/control-plane-component: cluster-network-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + name: cluster-network-operator + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - args: + - start + - --listen=0.0.0.0:9104 + - --kubeconfig=/configs/hosted + - --namespace=openshift-network-operator + - --extra-clusters=management=/configs/management + command: + - /usr/bin/cluster-network-operator + env: + - name: HYPERSHIFT + value: "true" + - name: CA_CONFIG_MAP + value: root-ca + - name: CA_CONFIG_MAP_KEY + value: ca.crt + - name: OVN_NB_RAFT_ELECTION_TIMER + value: "10" + - name: OVN_SB_RAFT_ELECTION_TIMER + value: "16" + - name: OVN_NORTHD_PROBE_INTERVAL + value: "5000" + - name: OVN_CONTROLLER_INACTIVITY_PROBE + value: "180000" + - name: OVN_NB_INACTIVITY_PROBE + value: "60000" + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: HOSTED_CLUSTER_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: HOSTED_CLUSTER_NAME + value: hcp + - name: TOKEN_AUDIENCE + value: https://test-oidc-bucket.s3.us-east-1.amazonaws.com/test-cluster + - name: RELEASE_VERSION + value: 4.18.0 + - name: OPENSHIFT_RELEASE_IMAGE + value: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + - name: APISERVER_OVERRIDE_HOST + - name: APISERVER_OVERRIDE_PORT + value: "0" + - name: MULTUS_ADMISSION_CONTROLLER_IMAGE + value: multus-admission-controller + - name: OVN_CONTROL_PLANE_IMAGE + value: ovn-kubernetes + - name: CLOUD_NETWORK_CONFIG_CONTROLLER_IMAGE + value: cloud-network-config-controller + - name: TOKEN_MINTER_IMAGE + value: token-minter + - name: CLI_CONTROL_PLANE_IMAGE + value: cli + - name: SOCKS5_PROXY_IMAGE + value: socks5-proxy + - name: KUBE_PROXY_IMAGE + value: kube-proxy + - name: KUBE_RBAC_PROXY_IMAGE + value: kube-rbac-proxy + - name: MULTUS_IMAGE + value: multus-cni + - name: CNI_PLUGINS_IMAGE + value: container-networking-plugins + - name: BOND_CNI_PLUGIN_IMAGE + value: network-interface-bond-cni + - name: WHEREABOUTS_CNI_IMAGE + value: multus-whereabouts-ipam-cni + - name: ROUTE_OVERRRIDE_CNI_IMAGE + value: multus-route-override-cni + - name: MULTUS_NETWORKPOLICY_IMAGE + value: multus-networkpolicy + - name: OVN_IMAGE + value: ovn-kubernetes + - name: EGRESS_ROUTER_CNI_IMAGE + value: egress-router-cni + - name: NETWORK_METRICS_DAEMON_IMAGE + value: network-metrics-daemon + - name: NETWORK_CHECK_SOURCE_IMAGE + value: cluster-network-operator + - name: NETWORK_CHECK_TARGET_IMAGE + value: cluster-network-operator + - name: NETWORKING_CONSOLE_PLUGIN_IMAGE + value: networking-console-plugin + - name: CLI_IMAGE + value: cli + - name: FRR_K8S_IMAGE + value: metallb-frr + - name: PROXY_INTERNAL_APISERVER_ADDRESS + value: "true" + image: cluster-network-operator + imagePullPolicy: IfNotPresent + name: cluster-network-operator + resources: + requests: + cpu: 10m + memory: 100Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /configs + name: configs + - mountPath: /var/run/secrets/kubernetes.io/hosted + name: client-token + - mountPath: /etc/certificate/ca + name: ca-bundle + - mountPath: /tmp + name: tmp-dir + - args: + - --service-account-namespace + - openshift-network-operator + - --service-account-name + - cluster-network-operator + - --token-file + - /var/client-token/token + - --kubeconfig + - /etc/kubernetes/kubeconfig + - --token-audience + - https://test-oidc-bucket.s3.us-east-1.amazonaws.com/test-cluster + command: + - /usr/bin/control-plane-operator + - token-minter + image: token-minter + imagePullPolicy: IfNotPresent + name: client-token-minter + resources: + requests: + cpu: 10m + memory: 30Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/client-token + name: client-token + - mountPath: /etc/kubernetes + name: hosted-etc-kube + - mountPath: /tmp + name: tmp-dir + - args: + - run + - --disable-resolver=true + command: + - /usr/bin/control-plane-operator + - konnectivity-socks5-proxy + env: + - name: KUBECONFIG + value: /etc/kubernetes/secrets/kubeconfig/kubeconfig + image: controlplane-operator + name: konnectivity-proxy-socks5 + resources: + requests: + cpu: 10m + memory: 30Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/secrets/kubeconfig + name: hosted-etc-kube + - mountPath: /etc/konnectivity/proxy-client + name: konnectivity-proxy-cert + - mountPath: /etc/konnectivity/proxy-ca + name: konnectivity-proxy-ca + - mountPath: /tmp + name: tmp-dir + dnsPolicy: ClusterFirst + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + - --kubeconfig=/var/kubeconfig/kubeconfig + - --required-api=operator.openshift.io,v1,Network + - --required-api=network.operator.openshift.io,v1,EgressRouter + - --required-api=network.operator.openshift.io,v1,OperatorPKI + - --wait-for-infrastructure-resource + - --wait-for-cluster-rolebinding=cluster-network-operator + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/kubeconfig + name: hosted-etc-kube + - args: + - --kubeconfig=/etc/hosted-kubernetes/kubeconfig + - -n=openshift-network-operator + - delete + - --ignore-not-found=true + - deployment + - network-operator + command: + - /usr/bin/kubectl + image: cli + imagePullPolicy: IfNotPresent + name: remove-old-cno + resources: + requests: + cpu: 10m + memory: 50Mi + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/hosted-kubernetes + name: hosted-etc-kube + - args: + - --service-account-namespace + - openshift-network-operator + - --service-account-name + - cluster-network-operator + - --token-file + - /var/client-token/token + - --kubeconfig + - /etc/kubernetes/kubeconfig + - --oneshot + - --token-audience + - https://test-oidc-bucket.s3.us-east-1.amazonaws.com/test-cluster + command: + - /usr/bin/control-plane-operator + - token-minter + image: token-minter + imagePullPolicy: IfNotPresent + name: init-client-token-minter + resources: + requests: + cpu: 10m + memory: 10Mi + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/client-token + name: client-token + - mountPath: /etc/kubernetes + name: hosted-etc-kube + - args: + - -c + - | + #!/bin/bash + set -xeuo pipefail + + kc=/configs/management + # Use brackets only for IPv6 addresses (contain colons), not for IPv4 or hostnames + # This is required for CVE-2025-47912 compliance: Go's net/url rejects IPv4 in brackets + case "${KUBERNETES_SERVICE_HOST}" in + *:*) server="https://[${KUBERNETES_SERVICE_HOST}]:${KUBERNETES_SERVICE_PORT}" ;; + *) server="https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}" ;; + esac + kubectl --kubeconfig $kc config set clusters.default.server "$server" + kubectl --kubeconfig $kc config set clusters.default.certificate-authority /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + kubectl --kubeconfig $kc config set users.admin.tokenFile /var/run/secrets/kubernetes.io/serviceaccount/token + kubectl --kubeconfig $kc config set contexts.default.cluster default + kubectl --kubeconfig $kc config set contexts.default.user admin + kubectl --kubeconfig $kc config set contexts.default.namespace $(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace) + kubectl --kubeconfig $kc config use-context default + + + kc=/configs/hosted + kubectl --kubeconfig $kc config set clusters.default.server "https://kube-apiserver:${KUBE_APISERVER_SERVICE_PORT}" + kubectl --kubeconfig $kc config set clusters.default.certificate-authority /etc/certificate/ca/ca.crt + kubectl --kubeconfig $kc config set users.admin.tokenFile /var/run/secrets/kubernetes.io/hosted/token + kubectl --kubeconfig $kc config set contexts.default.cluster default + kubectl --kubeconfig $kc config set contexts.default.user admin + kubectl --kubeconfig $kc config set contexts.default.namespace openshift-network-operator + kubectl --kubeconfig $kc config use-context default + command: + - /bin/bash + image: cli + imagePullPolicy: IfNotPresent + name: rewrite-config + resources: + requests: + cpu: 10m + memory: 50Mi + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/hosted-kubernetes + name: hosted-etc-kube + - mountPath: /configs + name: configs + - mountPath: /var/run/secrets/kubernetes.io/hosted + name: client-token + - mountPath: /etc/certificate/ca + name: ca-bundle + priorityClassName: hypershift-control-plane + serviceAccount: cluster-network-operator + serviceAccountName: cluster-network-operator + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: hosted-etc-kube + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - emptyDir: {} + name: configs + - emptyDir: {} + name: client-token + - name: ca-bundle + secret: + defaultMode: 416 + secretName: root-ca + - name: konnectivity-proxy-cert + secret: + defaultMode: 416 + secretName: konnectivity-client + - configMap: + name: konnectivity-ca-bundle + name: konnectivity-proxy-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_role.yaml new file mode 100644 index 000000000000..8094dbe47085 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_role.yaml @@ -0,0 +1,78 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: cluster-network-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - "" + resourceNames: + - openshift-service-ca.crt + - root-ca + resources: + - configmaps + verbs: + - get + - list + - watch +- apiGroups: + - "" + resourceNames: + - ovnkube-identity-cm + resources: + - configmaps + verbs: + - list + - get + - watch + - create + - patch + - update +- apiGroups: + - apps + resources: + - statefulsets + - deployments + verbs: + - list + - watch +- apiGroups: + - apps + resourceNames: + - multus-admission-controller + - network-node-identity + resources: + - deployments + verbs: + - '*' +- apiGroups: + - "" + resourceNames: + - multus-admission-controller + - network-node-identity + resources: + - services + verbs: + - '*' +- apiGroups: + - hypershift.openshift.io + resources: + - hostedcontrolplanes + verbs: + - get + - list + - watch +- apiGroups: + - hypershift.openshift.io + resources: + - hostedcontrolplanes/status + verbs: + - '*' diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_rolebinding.yaml new file mode 100644 index 000000000000..98e5c71d5684 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: cluster-network-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: cluster-network-operator +subjects: +- kind: ServiceAccount + name: cluster-network-operator + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_serviceaccount.yaml new file mode 100644 index 000000000000..d4b99529554c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-network-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_network_operator_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: cluster-network-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..6d57a7096909 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_controlplanecomponent.yaml @@ -0,0 +1,36 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: cluster-node-tuning-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: cluster-node-tuning-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment cluster-node-tuning-operator rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: rbac.authorization.k8s.io + kind: Role + name: cluster-node-tuning-operator + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: cluster-node-tuning-operator + - group: "" + kind: Service + name: node-tuning-operator + - group: "" + kind: ServiceAccount + name: cluster-node-tuning-operator + - group: monitoring.coreos.com + kind: ServiceMonitor + name: node-tuning-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_deployment.yaml new file mode 100644 index 000000000000..dc71ab4c2407 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_deployment.yaml @@ -0,0 +1,156 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: cluster-node-tuning-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + name: cluster-node-tuning-operator + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + target.workload.openshift.io/management: '{"effect": "PreferredDuringScheduling"}' + labels: + app: cluster-node-tuning-operator + hypershift.openshift.io/control-plane-component: cluster-node-tuning-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + name: cluster-node-tuning-operator + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - args: + - -v=0 + command: + - cluster-node-tuning-operator + env: + - name: RELEASE_VERSION + value: 4.18.0 + - name: HYPERSHIFT + value: "true" + - name: MY_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: WATCH_NAMESPACE + value: openshift-cluster-node-tuning-operator + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: RESYNC_PERIOD + value: "600" + - name: CLUSTER_NODE_TUNED_IMAGE + value: cluster-node-tuning-operator + - name: KUBECONFIG + value: /etc/kubernetes/kubeconfig + image: cluster-node-tuning-operator + imagePullPolicy: IfNotPresent + name: cluster-node-tuning-operator + ports: + - containerPort: 60000 + name: metrics + protocol: TCP + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/secrets + name: node-tuning-operator-tls + - mountPath: /tmp/metrics-client-ca + name: metrics-client-ca + - mountPath: /var/run/configmaps/trusted-ca/ + name: trusted-ca + - mountPath: /etc/kubernetes + name: hosted-kubeconfig + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + restartPolicy: Always + serviceAccount: cluster-node-tuning-operator + serviceAccountName: cluster-node-tuning-operator + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: node-tuning-operator-tls + secret: + defaultMode: 416 + secretName: node-tuning-operator-tls + - name: metrics-client-ca + secret: + defaultMode: 416 + secretName: metrics-client + - configMap: + defaultMode: 420 + items: + - key: ca-bundle.crt + path: tls-ca-bundle.pem + name: trusted-ca + optional: true + name: trusted-ca + - name: hosted-kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_role.yaml new file mode 100644 index 000000000000..d0e5fb439ec0 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_role.yaml @@ -0,0 +1,22 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: cluster-node-tuning-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - "" + resources: + - configmaps + - configmaps/finalizers + - events + verbs: + - '*' diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_rolebinding.yaml new file mode 100644 index 000000000000..40b527c0b46d --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: cluster-node-tuning-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: cluster-node-tuning-operator +subjects: +- kind: ServiceAccount + name: cluster-node-tuning-operator + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_serviceaccount.yaml new file mode 100644 index 000000000000..e79d3bbb3c2f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_node_tuning_operator_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: cluster-node-tuning-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_node_tuning_operator_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_node_tuning_operator_service.yaml new file mode 100644 index 000000000000..e1e24e12ae5f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_node_tuning_operator_service.yaml @@ -0,0 +1,26 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + name: node-tuning-operator + name: node-tuning-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: metrics + port: 60000 + protocol: TCP + targetPort: 60000 + selector: + name: cluster-node-tuning-operator + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_node_tuning_operator_servicemonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_node_tuning_operator_servicemonitor.yaml new file mode 100644 index 000000000000..0036de09bb55 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-node-tuning-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_node_tuning_operator_servicemonitor.yaml @@ -0,0 +1,50 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + hypershift.openshift.io/metrics-endpoint: "60000" + hypershift.openshift.io/metrics-job: node-tuning-operator + hypershift.openshift.io/metrics-namespace: openshift-cluster-node-tuning-operator + hypershift.openshift.io/metrics-service: node-tuning-operator + name: node-tuning-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + endpoints: + - metricRelabelings: + - action: replace + replacement: "" + targetLabel: _id + path: /metrics + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + targetPort: 60000 + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: + secret: + key: tls.crt + name: metrics-client + keySecret: + key: tls.key + name: metrics-client + serverName: node-tuning-operator.hcp-namespace.svc + namespaceSelector: + matchNames: + - hcp-namespace + selector: + matchLabels: + name: node-tuning-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-policy-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_policy_controller_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-policy-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_policy_controller_config_configmap.yaml new file mode 100644 index 000000000000..b2339d0d211f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-policy-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_policy_controller_config_configmap.yaml @@ -0,0 +1,174 @@ +apiVersion: v1 +data: + config.yaml: | + apiVersion: openshiftcontrolplane.config.openshift.io/v1 + build: + additionalTrustedCA: "" + buildDefaults: null + buildOverrides: null + imageTemplateFormat: + format: "" + latest: false + controllers: null + deployer: + imageTemplateFormat: + format: "" + latest: false + dockerPullSecret: + internalRegistryHostname: "" + registryURLs: null + featureGates: + - AWSEFSDriverVolumeMetrics=true + - AdditionalRoutingCapabilities=true + - AdminNetworkPolicy=true + - AlibabaPlatform=true + - AzureWorkloadIdentity=true + - BareMetalLoadBalancer=true + - BuildCSIVolumes=true + - ChunkSizeMiB=true + - CloudDualStackNodeIPs=true + - DisableKubeletCloudCredentialProviders=true + - ExternalOIDC=true + - GCPLabelsTags=true + - HardwareSpeed=true + - IngressControllerLBSubnetsAWS=true + - KMSv1=true + - ManagedBootImages=true + - ManagedBootImagesAWS=true + - MultiArchInstallAWS=true + - MultiArchInstallGCP=true + - NetworkDiagnosticsConfig=true + - NetworkLiveMigration=true + - NetworkSegmentation=true + - NodeDisruptionPolicy=true + - OpenShiftPodSecurityAdmission=true + - PersistentIPsForVirtualization=true + - PrivateHostedZoneAWS=true + - SetEIPForNLBIngressController=true + - VSphereControlPlaneMachineSet=true + - VSphereDriverConfiguration=true + - VSphereMultiVCenters=true + - VSphereStaticIPs=true + - ValidatingAdmissionPolicy=true + - AWSClusterHostedDNS=false + - AutomatedEtcdBackup=false + - BootcNodeManagement=false + - CPMSMachineNamePrefix=false + - ClusterAPIInstall=false + - ClusterAPIInstallIBMCloud=false + - ClusterMonitoringConfig=false + - ClusterVersionOperatorConfiguration=false + - ConsolePluginContentSecurityPolicy=false + - DNSNameResolver=false + - DualReplica=false + - DyanmicServiceEndpointIBMCloud=false + - DynamicResourceAllocation=false + - EtcdBackendQuota=false + - EventedPLEG=false + - Example=false + - Example2=false + - GCPClusterHostedDNS=false + - GCPCustomAPIEndpoints=false + - GatewayAPI=false + - GatewayAPIController=false + - HighlyAvailableArbiter=false + - ImageStreamImportMode=false + - IngressControllerDynamicConfigurationManager=false + - InsightsConfig=false + - InsightsConfigAPI=false + - InsightsOnDemandDataGather=false + - InsightsRuntimeExtractor=false + - KMSEncryptionProvider=false + - MachineAPIMigration=false + - MachineAPIOperatorDisableMachineHealthCheckController=false + - MachineAPIProviderOpenStack=false + - MachineConfigNodes=false + - MaxUnavailableStatefulSet=false + - MetricsCollectionProfiles=false + - MinimumKubeletVersion=false + - MixedCPUsAllocation=false + - MultiArchInstallAzure=false + - NewOLM=false + - NewOLMCatalogdAPIV1Metas=false + - NodeSwap=false + - NutanixMultiSubnets=false + - OVNObservability=false + - OnClusterBuild=false + - PinnedImages=false + - PlatformOperators=false + - ProcMountType=false + - RouteAdvertisements=false + - RouteExternalCertificate=false + - SELinuxChangePolicy=false + - SELinuxMount=false + - ServiceAccountTokenNodeBinding=false + - ShortCertRotation=false + - SignatureStores=false + - SigstoreImageVerification=false + - SigstoreImageVerificationPKI=false + - TranslateStreamCloseWebsocketRequests=false + - UpgradeStatus=false + - UserNamespacesPodSecurityStandards=false + - UserNamespacesSupport=false + - VSphereConfigurableMaxAllowedBlockVolumesPerNode=false + - VSphereHostVMGroupZonal=false + - VSphereMultiDisk=false + - VSphereMultiNetworks=false + - VolumeAttributesClass=false + - VolumeGroupSnapshot=false + imageImport: + disableScheduledImport: false + maxScheduledImageImportsPerMinute: 0 + scheduledImageImportMinimumIntervalSeconds: 0 + ingress: + ingressIPNetworkCIDR: "" + kind: OpenShiftControllerManagerConfig + leaderElection: + leaseDuration: 0s + renewDeadline: 0s + retryPeriod: 0s + network: + clusterNetworks: null + networkPluginName: "" + serviceNetworkCIDR: "" + vxlanPort: 0 + resourceQuota: + concurrentSyncs: 0 + minResyncPeriod: 0s + syncPeriod: 0s + securityAllocator: + mcsAllocatorRange: "" + mcsLabelsPerProject: 0 + uidAllocatorRange: "" + serviceAccount: + managedNames: null + serviceServingCert: + signer: null + servingInfo: + bindAddress: 0.0.0.0:10357 + bindNetwork: tcp + certFile: /etc/kubernetes/certs/tls.crt + cipherSuites: + - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 + - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + clientCA: /etc/kubernetes/client-ca/ca.crt + keyFile: /etc/kubernetes/certs/tls.key + maxRequestsInFlight: 0 + minTLSVersion: VersionTLS12 + requestTimeoutSeconds: 0 +kind: ConfigMap +metadata: + name: cluster-policy-controller-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-policy-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_policy_controller_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-policy-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_policy_controller_controlplanecomponent.yaml new file mode 100644 index 000000000000..d9562dc8c859 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-policy-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_policy_controller_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: cluster-policy-controller + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: cluster-policy-controller Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment cluster-policy-controller rollout to finish: + 0 out of 2 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: cluster-policy-controller-config diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-policy-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_policy_controller_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-policy-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_policy_controller_deployment.yaml new file mode 100644 index 000000000000..aff5610a1c1f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-policy-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_policy_controller_deployment.yaml @@ -0,0 +1,152 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: cluster-policy-controller + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 2 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: cluster-policy-controller + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: affa15d1 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: cluster-policy-controller + hypershift.openshift.io/control-plane-component: cluster-policy-controller + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: cluster-policy-controller + hypershift.openshift.io/control-plane-component: cluster-policy-controller + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: cluster-policy-controller + hypershift.openshift.io/control-plane-component: cluster-policy-controller + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - start + - --config + - /etc/kubernetes/config/config.yaml + - --kubeconfig + - /etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + - --namespace=openshift-kube-controller-manager + command: + - cluster-policy-controller + env: + - name: POD_NAMESPACE + value: openshift-kube-controller-manager + image: cluster-policy-controller + imagePullPolicy: IfNotPresent + name: cluster-policy-controller + resources: + requests: + cpu: 10m + memory: 200Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/client-ca + name: client-ca + - mountPath: /etc/kubernetes/config + name: config + - mountPath: /etc/kubernetes/secrets/svc-kubeconfig + name: kubeconfig + - mountPath: /etc/kubernetes/certs + name: serving-cert + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - configMap: + defaultMode: 420 + name: cluster-policy-controller-config + name: config + - name: serving-cert + secret: + defaultMode: 416 + secretName: cluster-policy-controller-cert + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - configMap: + defaultMode: 420 + name: client-ca + name: client-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..6ec51810052d --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_controlplanecomponent.yaml @@ -0,0 +1,30 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: cluster-storage-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: cluster-storage-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment cluster-storage-operator rollout to finish: 0 + out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: rbac.authorization.k8s.io + kind: Role + name: cluster-storage-operator + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: cluster-storage-operator + - group: "" + kind: ServiceAccount + name: cluster-storage-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_deployment.yaml new file mode 100644 index 000000000000..0dc9bcc2a764 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_deployment.yaml @@ -0,0 +1,221 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: cluster-storage-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + name: cluster-storage-operator + strategy: {} + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + openshift.io/required-scc: restricted-v2 + target.workload.openshift.io/management: '{"effect": "PreferredDuringScheduling"}' + labels: + app: cluster-storage-operator + hypershift.openshift.io/control-plane-component: cluster-storage-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + name: cluster-storage-operator + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - args: + - start + - -v=2 + - --terminate-on-files=/var/run/secrets/serving-cert/tls.crt + - --terminate-on-files=/var/run/secrets/serving-cert/tls.key + - --guest-kubeconfig=/etc/guest-kubeconfig/kubeconfig + command: + - cluster-storage-operator + - start + env: + - name: OPERATOR_IMAGE_VERSION + value: 4.18.0 + - name: OPERAND_IMAGE_VERSION + value: 4.18.0 + - name: AWS_EBS_DRIVER_OPERATOR_IMAGE + value: aws-ebs-csi-driver-operator + - name: AWS_EBS_DRIVER_IMAGE + value: aws-ebs-csi-driver + - name: GCP_PD_DRIVER_OPERATOR_IMAGE + value: gcp-pd-csi-driver-operator + - name: GCP_PD_DRIVER_IMAGE + value: gcp-pd-csi-driver + - name: OPENSTACK_CINDER_DRIVER_OPERATOR_IMAGE + value: openstack-cinder-csi-driver-operator + - name: OPENSTACK_CINDER_DRIVER_IMAGE + value: openstack-cinder-csi-driver + - name: OVIRT_DRIVER_OPERATOR_IMAGE + value: ovirt-csi-driver-operator + - name: OVIRT_DRIVER_IMAGE + value: ovirt-csi-driver + - name: MANILA_DRIVER_OPERATOR_IMAGE + value: csi-driver-manila-operator + - name: MANILA_DRIVER_IMAGE + value: csi-driver-manila + - name: MANILA_NFS_DRIVER_IMAGE + value: csi-driver-nfs + - name: PROVISIONER_IMAGE + value: csi-external-provisioner + - name: ATTACHER_IMAGE + value: csi-external-attacher + - name: RESIZER_IMAGE + value: csi-external-resizer + - name: SNAPSHOTTER_IMAGE + value: csi-external-snapshotter + - name: NODE_DRIVER_REGISTRAR_IMAGE + value: csi-node-driver-registrar + - name: LIVENESS_PROBE_IMAGE + value: csi-livenessprobe + - name: VSPHERE_PROBLEM_DETECTOR_OPERATOR_IMAGE + value: vsphere-problem-detector + - name: AZURE_DISK_DRIVER_OPERATOR_IMAGE + value: azure-disk-csi-driver-operator + - name: AZURE_DISK_DRIVER_IMAGE + value: azure-disk-csi-driver + - name: AZURE_FILE_DRIVER_OPERATOR_IMAGE + value: azure-file-csi-driver-operator + - name: AZURE_FILE_DRIVER_IMAGE + value: azure-file-csi-driver + - name: KUBE_RBAC_PROXY_IMAGE + value: kube-rbac-proxy + - name: VMWARE_VSPHERE_DRIVER_OPERATOR_IMAGE + value: vsphere-csi-driver-operator + - name: VMWARE_VSPHERE_DRIVER_IMAGE + value: vsphere-csi-driver + - name: VMWARE_VSPHERE_SYNCER_IMAGE + value: vsphere-csi-driver-syncer + - name: CLUSTER_CLOUD_CONTROLLER_MANAGER_OPERATOR_IMAGE + value: cluster-cloud-controller-manager-operator + - name: IBM_VPC_BLOCK_DRIVER_OPERATOR_IMAGE + value: ibm-vpc-block-csi-driver-operator + - name: IBM_VPC_BLOCK_DRIVER_IMAGE + value: ibm-vpc-block-csi-driver + - name: POWERVS_BLOCK_CSI_DRIVER_OPERATOR_IMAGE + value: powervs-block-csi-driver-operator + - name: POWERVS_BLOCK_CSI_DRIVER_IMAGE + value: powervs-block-csi-driver + - name: HYPERSHIFT_IMAGE + value: token-minter + - name: AWS_EBS_DRIVER_CONTROL_PLANE_IMAGE + value: aws-ebs-csi-driver + - name: AZURE_DISK_DRIVER_CONTROL_PLANE_IMAGE + value: azure-disk-csi-driver + - name: LIVENESS_PROBE_CONTROL_PLANE_IMAGE + value: csi-livenessprobe + - name: AZURE_FILE_DRIVER_CONTROL_PLANE_IMAGE + value: azure-file-csi-driver + - name: OPENSTACK_CINDER_DRIVER_CONTROL_PLANE_IMAGE + value: openstack-cinder-csi-driver + - name: MANILA_DRIVER_CONTROL_PLANE_IMAGE + value: csi-driver-manila + - name: KUBE_RBAC_PROXY_CONTROL_PLANE_IMAGE + value: kube-rbac-proxy + - name: TOOLS_IMAGE + value: tools + - name: VOLUME_DATA_SOURCE_VALIDATOR_IMAGE + value: volume-data-source-validator + image: cluster-storage-operator + imagePullPolicy: IfNotPresent + name: cluster-storage-operator + ports: + - containerPort: 8443 + name: metrics + resources: + requests: + cpu: 10m + memory: 20Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/guest-kubeconfig + name: guest-kubeconfig + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + - --kubeconfig=/var/kubeconfig/kubeconfig + - --required-api=operator.openshift.io,v1,Storage + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/kubeconfig + name: guest-kubeconfig + priorityClassName: hypershift-control-plane + securityContext: + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + serviceAccountName: cluster-storage-operator + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: guest-kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_role.yaml new file mode 100644 index 000000000000..28e6f1d4fe04 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_role.yaml @@ -0,0 +1,74 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: cluster-storage-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - '*' +- apiGroups: + - apps + resources: + - deployments + - replicasets + verbs: + - '*' +- apiGroups: + - policy + resources: + - poddisruptionbudgets + verbs: + - '*' +- apiGroups: + - "" + resources: + - serviceaccounts + - services + - configmaps + - pods + - endpoints + - events + - secrets + verbs: + - '*' +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - update +- apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + - rolebindings + verbs: + - watch + - list + - get + - create + - delete + - patch + - update +- apiGroups: + - hypershift.openshift.io + resources: + - hostedcontrolplanes + verbs: + - watch + - list + - get diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_rolebinding.yaml new file mode 100644 index 000000000000..895db322eff4 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: cluster-storage-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: cluster-storage-operator +subjects: +- kind: ServiceAccount + name: cluster-storage-operator + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_serviceaccount.yaml new file mode 100644 index 000000000000..bfcb5ca86399 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-storage-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_storage_operator_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: cluster-storage-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..8a501d355002 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_controlplanecomponent.yaml @@ -0,0 +1,27 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: cluster-version-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: cluster-version-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment cluster-version-operator rollout to finish: 0 + out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Service + name: cluster-version-operator + - group: monitoring.coreos.com + kind: ServiceMonitor + name: cluster-version-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_deployment.yaml new file mode 100644 index 000000000000..acbb43f16bd3 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_deployment.yaml @@ -0,0 +1,397 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: cluster-version-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: cluster-version-operator + k8s-app: cluster-version-operator + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: payload,update-payloads,tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: cluster-version-operator + hypershift.openshift.io/control-plane-component: cluster-version-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + k8s-app: cluster-version-operator + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - start + - --release-image + - $(RELEASE_IMAGE) + - --enable-auto-update=false + - --kubeconfig + - /etc/openshift/kubeconfig/kubeconfig + - --listen=0.0.0.0:8443 + - --serving-cert-file=/etc/kubernetes/certs/server/tls.crt + - --serving-key-file=/etc/kubernetes/certs/server/tls.key + - --hypershift=true + - --v=4 + - --tls-min-version=VersionTLS12 + - --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + command: + - cluster-version-operator + env: + - name: PAYLOAD_OVERRIDE + value: /var/payload + - name: CLUSTER_PROFILE + value: ibm-cloud-managed + - name: RELEASE_IMAGE + value: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + - name: NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + image: cluster-version-operator + imagePullPolicy: IfNotPresent + name: cluster-version-operator + ports: + - containerPort: 8443 + name: https + protocol: TCP + resources: + requests: + cpu: 20m + memory: 70Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/openshift/kubeconfig + name: kubeconfig + - mountPath: /var/payload + name: payload + - mountPath: /etc/kubernetes/certs/server + name: server-crt + - mountPath: /etc/cvo/updatepayloads + name: update-payloads + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + - --kubeconfig=/var/kubeconfig/kubeconfig + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/kubeconfig + name: kubeconfig + - args: + - -c + - |- + cp -R /manifests /var/payload/ + rm -f /var/payload/manifests/*_deployment.yaml + rm -f /var/payload/manifests/*_servicemonitor.yaml + rm -f /var/payload/manifests/0000_50_cluster-update-console-plugin_* + cp -R /release-manifests /var/payload/ + for file in $(find /var/payload/manifests/ -name "*.yaml"); do + IFS=',' read -ra feature_sets <<< "$(cat $file | grep "release.openshift.io/feature-set:" | awk '{print $2}')" + if [[ "${#feature_sets[@]}" -gt 0 ]] && ! [[ " ${feature_sets[*]} " =~ "Default" ]]; then + rm -vf $file + fi + done + rm -f /var/payload/release-manifests/0000_50_olm_00-pprof-config.yaml + rm -f /var/payload/release-manifests/0000_50_olm_00-pprof-rbac.yaml + rm -f /var/payload/release-manifests/0000_50_olm_00-pprof-secret.yaml + rm -f /var/payload/release-manifests/0000_50_olm_01-olm-operator.serviceaccount.yaml + rm -f /var/payload/release-manifests/0000_50_olm_02-services.yaml + rm -f /var/payload/release-manifests/0000_50_olm_06-psm-operator.deployment.yaml + rm -f /var/payload/release-manifests/0000_50_olm_06-psm-operator.deployment.ibm-cloud-managed.yaml + rm -f /var/payload/release-manifests/0000_50_olm_06-psm-operator.service.yaml + rm -f /var/payload/release-manifests/0000_50_olm_06-psm-operator.servicemonitor.yaml + rm -f /var/payload/release-manifests/0000_50_olm_00-packageserver.pdb.yaml + rm -f /var/payload/release-manifests/0000_50_olm_07-olm-operator.deployment.ibm-cloud-managed.yaml + rm -f /var/payload/release-manifests/0000_50_olm_07-olm-operator.deployment.yaml + rm -f /var/payload/release-manifests/0000_50_olm_07-collect-profiles.cronjob.yaml + rm -f /var/payload/release-manifests/0000_50_olm_08-catalog-operator.deployment.ibm-cloud-managed.yaml + rm -f /var/payload/release-manifests/0000_50_olm_08-catalog-operator.deployment.yaml + rm -f /var/payload/release-manifests/0000_50_olm_15-packageserver.clusterserviceversion.yaml + rm -f /var/payload/release-manifests/0000_50_olm_99-operatorstatus.yaml + rm -f /var/payload/release-manifests/0000_90_olm_00-service-monitor.yaml + rm -f /var/payload/release-manifests/0000_50_operator-marketplace_04_service_account.yaml + rm -f /var/payload/release-manifests/0000_50_operator-marketplace_05_role.yaml + rm -f /var/payload/release-manifests/0000_50_operator-marketplace_06_role_binding.yaml + rm -f /var/payload/release-manifests/0000_50_operator-marketplace_07_configmap.yaml + rm -f /var/payload/release-manifests/0000_50_operator-marketplace_08_service.yaml + rm -f /var/payload/release-manifests/0000_50_operator-marketplace_09_operator-ibm-cloud-managed.yaml + rm -f /var/payload/release-manifests/0000_50_operator-marketplace_09_operator.yaml + rm -f /var/payload/release-manifests/0000_50_operator-marketplace_10_clusteroperator.yaml + rm -f /var/payload/release-manifests/0000_50_operator-marketplace_11_service_monitor.yaml + rm -f /var/payload/release-manifests/0000_70_dns-operator_02-deployment-ibm-cloud-managed.yaml + rm -f /var/payload/release-manifests/0000_50_cluster-ingress-operator_02-deployment-ibm-cloud-managed.yaml + rm -f /var/payload/release-manifests/0000_70_cluster-network-operator_03_deployment-ibm-cloud-managed.yaml + rm -f /var/payload/release-manifests/0000_80_machine-config_01_containerruntimeconfigs.crd.yaml + rm -f /var/payload/release-manifests/0000_80_machine-config_01_kubeletconfigs.crd.yaml + rm -f /var/payload/release-manifests/0000_80_machine-config_01_machineconfigs.crd.yaml + rm -f /var/payload/release-manifests/0000_80_machine-config_01_machineconfigpools-Default.crd.yaml + rm -f /var/payload/release-manifests/0000_50_cluster-node-tuning-operator_20-performance-profile.crd.yaml + rm -f /var/payload/release-manifests/0000_50_cluster-node-tuning-operator_50-operator-ibm-cloud-managed.yaml + rm -f /var/payload/release-manifests/0000_50_cluster-image-registry-operator_07-operator-ibm-cloud-managed.yaml + rm -f /var/payload/release-manifests/0000_50_cluster-image-registry-operator_07-operator-service.yaml + rm -f /var/payload/release-manifests/0000_90_cluster-image-registry-operator_02_operator-servicemonitor.yaml + rm -f /var/payload/release-manifests/0000_50_cluster-storage-operator_10_deployment-ibm-cloud-managed.yaml + rm -f /var/payload/release-manifests/0000_50_cloud-credential-operator_01-operator-config.yaml + rm -f /var/payload/release-manifests/0000_50_cluster-authentication-operator_02_config.cr.yaml + rm -f /var/payload/release-manifests/0000_90_etcd-operator_03_prometheusrule.yaml + rm -f /var/payload/release-manifests/0000_50_cluster-csi-snapshot-controller-operator_07_deployment-ibm-cloud-managed.yaml + rm -f /var/payload/release-manifests/0000_03_marketplace-operator_02_operatorhub.cr.yaml + cat > /var/payload/release-manifests/0000_01_cleanup.yaml < /tmp/clusterversion.json < /dev/null || oc create ns openshift-config + oc get ns openshift-config-managed &> /dev/null || oc create ns openshift-config-managed + oc apply -f /var/payload/manifests/0000_00_cluster-version-operator_01_clusterversions* + oc apply -f /tmp/clusterversion.json + while true; do + echo "Applying CVO bootstrap manifests..." + if oc apply -f /var/payload/manifests; then + echo "Bootstrap manifests applied successfully." + break + fi + sleep 1 + done + command: + - /bin/bash + env: + - name: KUBECONFIG + value: /etc/kubernetes/kubeconfig + - name: CLUSTER_VERSION_JSON + value: '{"kind":"ClusterVersion","apiVersion":"config.openshift.io/v1","metadata":{"name":"version"},"spec":{"clusterID":"","capabilities":{"baselineCapabilitySet":"None","additionalEnabledCapabilities":["Build","CSISnapshot","CloudControllerManager","CloudCredential","Console","DeploymentConfig","ImageRegistry","Ingress","Insights","MachineAPI","NodeTuning","OperatorLifecycleManager","OperatorLifecycleManagerV1","Storage","marketplace","openshift-samples"]},"signatureStores":null},"status":{"desired":{"version":"","image":""},"observedGeneration":0,"versionHash":"","capabilities":{},"availableUpdates":null}}' + image: cli + imagePullPolicy: IfNotPresent + name: bootstrap + resources: + requests: + cpu: 10m + memory: 10Mi + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes + name: kubeconfig + - mountPath: /var/payload + name: payload + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: payload + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - emptyDir: {} + name: update-payloads + - name: server-crt + secret: + defaultMode: 416 + secretName: cvo-server + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_service.yaml new file mode 100644 index 000000000000..1c23d65b7095 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_service.yaml @@ -0,0 +1,29 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: cluster-version-operator + k8s-app: cluster-version-operator + name: cluster-version-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ipFamilyPolicy: PreferDualStack + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: https + selector: + app: cluster-version-operator + k8s-app: cluster-version-operator + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_servicemonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_servicemonitor.yaml new file mode 100644 index 000000000000..d45436129d30 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/cluster-version-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_cluster_version_operator_servicemonitor.yaml @@ -0,0 +1,48 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + hypershift.openshift.io/metrics-endpoint: metrics + hypershift.openshift.io/metrics-job: cluster-version-operator + hypershift.openshift.io/metrics-namespace: openshift-cluster-version + hypershift.openshift.io/metrics-service: cluster-version-operator + name: cluster-version-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + endpoints: + - metricRelabelings: + - action: drop + regex: etcd_(debugging|disk|server).* + sourceLabels: + - __name__ + - action: replace + replacement: "" + targetLabel: _id + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + targetPort: https + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: {} + serverName: cluster-version-operator + namespaceSelector: + matchNames: + - hcp-namespace + selector: + matchLabels: + app: cluster-version-operator + k8s-app: cluster-version-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/community-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_community_operators_catalog_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/community-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_community_operators_catalog_controlplanecomponent.yaml new file mode 100644 index 000000000000..9ea7e5e4e7d4 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/community-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_community_operators_catalog_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: community-operators-catalog + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: community-operators-catalog Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment community-operators-catalog rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Service + name: community-operators diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/community-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_community_operators_catalog_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/community-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_community_operators_catalog_deployment.yaml new file mode 100644 index 000000000000..9f6db6682ba2 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/community-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_community_operators_catalog_deployment.yaml @@ -0,0 +1,171 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + image.openshift.io/triggers: '[{"from":{"kind":"ImageStreamTag","name":"catalogs:community-operators"},"fieldPath":"spec.template.spec.initContainers[?(@.name==\"extract-content\")].image"}, + {"from":{"kind":"ImageStreamTag","name":"catalogs:community-operators"},"fieldPath":"spec.template.spec.containers[?(@.name==\"registry\")].image"}]' + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: community-operators-catalog + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + olm.catalogSource: community-operators + strategy: {} + template: + metadata: + annotations: + alpha.image.policy.openshift.io/resolve-names: '*' + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: utilities,catalog-content,tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: community-operators-catalog + hypershift.openshift.io/control-plane-component: community-operators-catalog + hypershift.openshift.io/hosted-control-plane: hcp-namespace + olm.catalogSource: community-operators + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - serve + - /extracted-catalog/catalog + - --cache-dir=/extracted-catalog/cache + command: + - /bin/opm + image: catalogs:community-operators + imagePullPolicy: IfNotPresent + livenessProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 3 + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: registry + ports: + - containerPort: 50051 + name: grpc + protocol: TCP + readinessProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 3 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 10m + memory: 160Mi + securityContext: + readOnlyRootFilesystem: true + startupProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 15 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /extracted-catalog + name: catalog-content + - mountPath: /tmp + name: tmp-dir + initContainers: + - args: + - /bin/copy-content + - /utilities/copy-content + command: + - cp + image: operator-lifecycle-manager + name: extract-utilities + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /utilities + name: utilities + - args: + - --catalog.from=/configs + - --catalog.to=/extracted-catalog/catalog + - --cache.from=/tmp/cache + - --cache.to=/extracted-catalog/cache + command: + - /utilities/copy-content + image: from:imagestream + name: extract-content + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /utilities + name: utilities + - mountPath: /extracted-catalog + name: catalog-content + nodeSelector: + kubernetes.io/os: linux + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: utilities + - emptyDir: {} + name: catalog-content + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/community-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_community_operators_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/community-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_community_operators_service.yaml new file mode 100644 index 000000000000..b601475daca2 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/community-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_community_operators_service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: community-operators + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: grpc + port: 50051 + protocol: TCP + targetPort: 50051 + selector: + olm.catalogSource: community-operators + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_config_configmap.yaml new file mode 100644 index 000000000000..a0cd5267b7ab --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_config_configmap.yaml @@ -0,0 +1,38 @@ +apiVersion: v1 +data: + config.yaml: | + apiVersion: config.openshift.io/v1 + authentication: {} + authorization: {} + kind: GenericControllerConfig + leaderElection: + leaseDuration: 0s + renewDeadline: 0s + retryPeriod: 0s + servingInfo: + bindAddress: 0.0.0.0:8443 + bindNetwork: tcp4 + certFile: "" + cipherSuites: + - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 + - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + keyFile: "" + maxRequestsInFlight: 0 + minTLSVersion: VersionTLS12 + requestTimeoutSeconds: 0 +kind: ConfigMap +metadata: + name: control-plane-pki-operator-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..da37d9b8c855 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_controlplanecomponent.yaml @@ -0,0 +1,33 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: control-plane-pki-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: control-plane-pki-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment control-plane-pki-operator rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: control-plane-pki-operator-config + - group: rbac.authorization.k8s.io + kind: Role + name: control-plane-pki-operator + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: control-plane-pki-operator + - group: "" + kind: ServiceAccount + name: control-plane-pki-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_deployment.yaml new file mode 100644 index 000000000000..4e71a33f8312 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_deployment.yaml @@ -0,0 +1,139 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: control-plane-pki-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: control-plane-pki-operator + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: 1a4fc37c + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: control-plane-pki-operator + hypershift.openshift.io/control-plane-component: control-plane-pki-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - args: + - operator + - --namespace + - $(HOSTED_CONTROL_PLANE_NAMESPACE) + - --config=/var/run/configmaps/control-plane-pki-operator-config/config.yaml + - --terminate-on-files=/var/run/configmaps/control-plane-pki-operator-config/config.yaml + command: + - /usr/bin/control-plane-pki-operator + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: HOSTED_CONTROL_PLANE_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: HOSTED_CONTROL_PLANE_NAME + value: hcp + - name: CERT_ROTATION_SCALE + value: 0s + image: controlplane-pki-operator + imagePullPolicy: IfNotPresent + name: control-plane-pki-operator + ports: + - containerPort: 8443 + name: metrics + protocol: TCP + resources: + requests: + cpu: 10m + memory: 80Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/pki/ca-trust/extracted/pem + name: openshift-config-managed-trusted-ca-bundle + readOnly: true + - mountPath: /var/run/configmaps/control-plane-pki-operator-config + name: control-plane-pki-operator-config + readOnly: true + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + serviceAccount: control-plane-pki-operator + serviceAccountName: control-plane-pki-operator + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - configMap: + defaultMode: 420 + items: + - key: ca-bundle.crt + path: tls-ca-bundle.pem + name: openshift-config-managed-trusted-ca-bundle + optional: true + name: openshift-config-managed-trusted-ca-bundle + - configMap: + defaultMode: 420 + name: control-plane-pki-operator-config + name: control-plane-pki-operator-config + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_role.yaml new file mode 100644 index 000000000000..4603b3c7b2f4 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_role.yaml @@ -0,0 +1,89 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: control-plane-pki-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - hypershift.openshift.io + resources: + - hostedcontrolplanes + verbs: + - get +- apiGroups: + - hypershift.openshift.io + resources: + - hostedcontrolplanes/status + verbs: + - patch +- apiGroups: + - "" + resources: + - configmaps + - secrets + - events + verbs: + - get + - list + - watch + - create + - delete + - update + - patch +- apiGroups: + - "" + resources: + - pods + verbs: + - get + - list + - watch +- apiGroups: + - apps + resources: + - deployments + - replicasets + verbs: + - get +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - delete + - update + - patch +- apiGroups: + - certificates.hypershift.openshift.io + resources: + - certificatesigningrequestapprovals + verbs: + - get + - list + - watch +- apiGroups: + - certificates.hypershift.openshift.io + resources: + - certificaterevocationrequests + verbs: + - get + - list + - watch +- apiGroups: + - certificates.hypershift.openshift.io + resources: + - certificaterevocationrequests/status + verbs: + - patch diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_rolebinding.yaml new file mode 100644 index 000000000000..7319f47be897 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: control-plane-pki-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: control-plane-pki-operator +subjects: +- kind: ServiceAccount + name: control-plane-pki-operator + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_serviceaccount.yaml new file mode 100644 index 000000000000..97e3169f1c22 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: control-plane-pki-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..fa828e2e4a57 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_controlplanecomponent.yaml @@ -0,0 +1,30 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: csi-snapshot-controller-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: csi-snapshot-controller-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment csi-snapshot-controller-operator rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ServiceAccount + name: csi-snapshot-controller-operator + - group: rbac.authorization.k8s.io + kind: Role + name: csi-snapshot-controller-operator-role + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: csi-snapshot-controller-operator-role diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_deployment.yaml new file mode 100644 index 000000000000..07016bf089fa --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_deployment.yaml @@ -0,0 +1,136 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: csi-snapshot-controller-operator + hypershift.openshift.io/managed-by: control-plane-operator + name: csi-snapshot-controller-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: csi-snapshot-controller-operator + strategy: {} + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + target.workload.openshift.io/management: '{"effect": "PreferredDuringScheduling"}' + labels: + app: csi-snapshot-controller-operator + hypershift.openshift.io/control-plane-component: csi-snapshot-controller-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - args: + - start + - -v=2 + - --guest-kubeconfig=/etc/guest-kubeconfig/kubeconfig + env: + - name: OPERAND_IMAGE + value: csi-snapshot-controller + - name: OPERATOR_IMAGE_VERSION + value: 4.18.0 + - name: OPERAND_IMAGE_VERSION + value: 4.18.0 + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + image: cluster-csi-snapshot-controller-operator + imagePullPolicy: IfNotPresent + name: csi-snapshot-controller-operator + resources: + requests: + cpu: 10m + memory: 65Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/guest-kubeconfig + name: guest-kubeconfig + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + - --kubeconfig=/var/kubeconfig/kubeconfig + - --required-api=operator.openshift.io,v1,CSISnapshotController + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/kubeconfig + name: guest-kubeconfig + priorityClassName: hypershift-control-plane + securityContext: + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + serviceAccountName: csi-snapshot-controller-operator + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: guest-kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_role_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_role_role.yaml new file mode 100644 index 000000000000..f136fdbecb92 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_role_role.yaml @@ -0,0 +1,95 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: csi-snapshot-controller-operator-role + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch +- apiGroups: + - apps + resources: + - deployments + - replicasets + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - policy + resources: + - poddisruptionbudgets + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - serviceaccounts + - services + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - pods + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - update +- apiGroups: + - "" + resources: + - secrets + verbs: + - list + - watch +- apiGroups: + - hypershift.openshift.io + resources: + - hostedcontrolplanes + verbs: + - watch + - list + - get diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_role_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_role_rolebinding.yaml new file mode 100644 index 000000000000..72d4c057fd6c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_role_rolebinding.yaml @@ -0,0 +1,24 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + addonmanager.kubernetes.io/mode: Reconcile + kubernetes.io/cluster-service: "true" + name: csi-snapshot-controller-operator-role + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: csi-snapshot-controller-operator-role +subjects: +- kind: ServiceAccount + name: csi-snapshot-controller-operator + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_serviceaccount.yaml new file mode 100644 index 000000000000..b0bfc013379d --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/csi-snapshot-controller-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_csi_snapshot_controller_operator_serviceaccount.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + labels: + app: csi-snapshot-controller-operator + name: csi-snapshot-controller-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/dns-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_dns_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/dns-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_dns_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..f4d7a6afac65 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/dns-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_dns_operator_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: dns-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: dns-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment dns-operator rollout to finish: 0 out of 1 new + replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Secret + name: dns-operator-service-account-kubeconfig diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/dns-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_dns_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/dns-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_dns_operator_deployment.yaml new file mode 100644 index 000000000000..1306b80065cd --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/dns-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_dns_operator_deployment.yaml @@ -0,0 +1,130 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: dns-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + name: dns-operator + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: 741638a5741638a5741638a5741638a5 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + target.workload.openshift.io/management: '{"effect": "PreferredDuringScheduling"}' + labels: + app: dns-operator + hypershift.openshift.io/control-plane-component: dns-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + name: dns-operator + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - command: + - dns-operator + env: + - name: RELEASE_VERSION + value: 4.18.0 + - name: IMAGE + value: coredns + - name: OPENSHIFT_CLI_IMAGE + value: cli + - name: KUBE_RBAC_PROXY_IMAGE + value: kube-rbac-proxy + - name: KUBECONFIG + value: /etc/kubernetes/kubeconfig + image: cluster-dns-operator + imagePullPolicy: IfNotPresent + name: dns-operator + resources: + requests: + cpu: 10m + memory: 29Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes + name: service-account-kubeconfig + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + - --kubeconfig=/var/kubeconfig/kubeconfig + - --required-api=operator.openshift.io,v1,DNS + - --wait-for-labeled-pods-gone=openshift-dns-operator/name=dns-operator + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/kubeconfig + name: service-account-kubeconfig + priorityClassName: hypershift-control-plane + terminationGracePeriodSeconds: 2 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: service-account-kubeconfig + secret: + defaultMode: 416 + secretName: dns-operator-service-account-kubeconfig + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/dns-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_dns_operator_service_account_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/dns-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_dns_operator_service_account_kubeconfig_secret.yaml new file mode 100644 index 000000000000..e986beaa250c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/dns-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_dns_operator_service_account_kubeconfig_secret.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +data: + ca.crt: "" + kubeconfig: "" + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + name: dns-operator-service-account-kubeconfig + namespace: hcp-namespace + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_ca_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_ca_secret.yaml new file mode 100644 index 000000000000..c777c9343095 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_ca_secret.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + name: endpoint-resolver-ca + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: kubernetes.io/tls diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_controlplanecomponent.yaml new file mode 100644 index 000000000000..a3778f5e08e3 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_controlplanecomponent.yaml @@ -0,0 +1,39 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: endpoint-resolver + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: endpoint-resolver Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment endpoint-resolver rollout to finish: 0 out of + 2 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Secret + name: endpoint-resolver-ca + - group: rbac.authorization.k8s.io + kind: Role + name: endpoint-resolver + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: endpoint-resolver + - group: "" + kind: Service + name: endpoint-resolver + - group: "" + kind: ServiceAccount + name: endpoint-resolver + - group: "" + kind: Secret + name: endpoint-resolver-serving-cert diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_deployment.yaml new file mode 100644 index 000000000000..34830f3cc338 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_deployment.yaml @@ -0,0 +1,138 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: endpoint-resolver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 2 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: endpoint-resolver + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: 741638a5741638a5 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: endpoint-resolver + hypershift.openshift.io/control-plane-component: endpoint-resolver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - args: + - --tls-cert-file + - /etc/endpoint-resolver/serving-cert/tls.crt + - --tls-key-file + - /etc/endpoint-resolver/serving-cert/tls.key + command: + - /usr/bin/control-plane-operator + - endpoint-resolver + env: + - name: MY_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: controlplane-operator + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 6 + httpGet: + path: /healthz + port: 9444 + scheme: HTTPS + initialDelaySeconds: 30 + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 5 + name: endpoint-resolver + ports: + - containerPort: 9444 + name: https + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 9444 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 5m + memory: 20Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/endpoint-resolver/serving-cert + name: serving-cert + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + serviceAccount: endpoint-resolver + serviceAccountName: endpoint-resolver + terminationGracePeriodSeconds: 10 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: serving-cert + secret: + defaultMode: 416 + secretName: endpoint-resolver-serving-cert + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_role.yaml new file mode 100644 index 000000000000..b536a5f82684 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_role.yaml @@ -0,0 +1,22 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: endpoint-resolver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - "" + resources: + - pods + verbs: + - get + - list + - watch diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_rolebinding.yaml new file mode 100644 index 000000000000..266b6361936f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: endpoint-resolver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: endpoint-resolver +subjects: +- kind: ServiceAccount + name: endpoint-resolver + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_service.yaml new file mode 100644 index 000000000000..031dda1ef4df --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: endpoint-resolver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: https + port: 443 + protocol: TCP + targetPort: 9444 + selector: + app: endpoint-resolver + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_serviceaccount.yaml new file mode 100644 index 000000000000..00b9b24bcd10 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: endpoint-resolver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_serving_cert_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_serving_cert_secret.yaml new file mode 100644 index 000000000000..16838d50e655 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/endpoint-resolver/EtcdRestore/zz_fixture_TestControlPlaneComponents_endpoint_resolver_serving_cert_secret.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + name: endpoint-resolver-serving-cert + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: kubernetes.io/tls diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_client_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_client_service.yaml new file mode 100644 index 000000000000..5b38919b362b --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_client_service.yaml @@ -0,0 +1,30 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: etcd + name: etcd-client + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: etcd-client + port: 2379 + protocol: TCP + targetPort: client + - name: metrics + port: 2381 + protocol: TCP + targetPort: metrics + selector: + app: etcd + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_controlplanecomponent.yaml new file mode 100644 index 000000000000..ac44d424b8fa --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_controlplanecomponent.yaml @@ -0,0 +1,42 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: etcd + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: 'StatefulSet etcd is not available: 0/3 replicas ready' + reason: WaitingForAvailable + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for statefulset etcd rollout to finish: 0 out of 3 new replicas + have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Service + name: etcd-discovery + - group: rbac.authorization.k8s.io + kind: Role + name: etcd-self-register + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: etcd-self-register + - group: "" + kind: ServiceAccount + name: etcd + - group: policy + kind: PodDisruptionBudget + name: etcd + - group: "" + kind: Service + name: etcd-client + - group: monitoring.coreos.com + kind: ServiceMonitor + name: etcd diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_discovery_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_discovery_service.yaml new file mode 100644 index 000000000000..b1dd84e017f1 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_discovery_service.yaml @@ -0,0 +1,30 @@ +apiVersion: v1 +kind: Service +metadata: + name: etcd-discovery + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + clusterIP: None + ports: + - name: peer + port: 2380 + protocol: TCP + targetPort: peer + - name: etcd-client + port: 2379 + protocol: TCP + targetPort: client + publishNotReadyAddresses: true + selector: + app: etcd + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_poddisruptionbudget.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_poddisruptionbudget.yaml new file mode 100644 index 000000000000..4ef86b74ffe0 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_poddisruptionbudget.yaml @@ -0,0 +1,23 @@ +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: etcd + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + selector: + matchLabels: + app: etcd + unhealthyPodEvictionPolicy: AlwaysAllow +status: + currentHealthy: 0 + desiredHealthy: 0 + disruptionsAllowed: 0 + expectedPods: 0 diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_self_register_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_self_register_role.yaml new file mode 100644 index 000000000000..3e97f78628bf --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_self_register_role.yaml @@ -0,0 +1,28 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: etcd-self-register + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - discovery.k8s.io + resources: + - endpointslices + verbs: + - get + - create + - update +- apiGroups: + - "" + resources: + - pods + verbs: + - get diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_self_register_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_self_register_rolebinding.yaml new file mode 100644 index 000000000000..f8cada01fe44 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_self_register_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: etcd-self-register + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: etcd-self-register +subjects: +- kind: ServiceAccount + name: etcd + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_serviceaccount.yaml new file mode 100644 index 000000000000..00f053fdf28b --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: etcd + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_servicemonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_servicemonitor.yaml new file mode 100644 index 000000000000..28dae579be4c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_servicemonitor.yaml @@ -0,0 +1,49 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + hypershift.openshift.io/metrics-endpoint: etcd-metrics + hypershift.openshift.io/metrics-job: etcd + hypershift.openshift.io/metrics-namespace: openshift-etcd + hypershift.openshift.io/metrics-service: etcd + name: etcd + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + endpoints: + - metricRelabelings: + - action: replace + replacement: "" + targetLabel: _id + port: metrics + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + tlsConfig: + ca: + configMap: + key: ca.crt + name: etcd-ca + cert: + secret: + key: etcd-client.crt + name: etcd-metrics-client-tls + keySecret: + key: etcd-client.key + name: etcd-metrics-client-tls + serverName: etcd-client + namespaceSelector: + matchNames: + - hcp-namespace + selector: + matchLabels: + app: etcd diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_statefulset.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_statefulset.yaml new file mode 100644 index 000000000000..6d1269e13eb7 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/etcd/EtcdRestore/zz_fixture_TestControlPlaneComponents_etcd_statefulset.yaml @@ -0,0 +1,491 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: etcd + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + persistentVolumeClaimRetentionPolicy: + whenDeleted: Retain + whenScaled: Retain + podManagementPolicy: Parallel + replicas: 3 + revisionHistoryLimit: 10 + selector: + matchLabels: + app: etcd + serviceName: etcd-discovery + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: cluster-state,tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: etcd + hypershift.openshift.io/control-plane-component: etcd + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: etcd + hypershift.openshift.io/control-plane-component: etcd + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: etcd + hypershift.openshift.io/control-plane-component: etcd + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: true + containers: + - command: + - /bin/sh + - -c + - ETCD_INITIAL_CLUSTER_STATE=$(cat /etc/etcd/clusterstate/state) /usr/bin/etcd + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: ETCD_NAME + value: $(HOSTNAME) + - name: ETCD_QUOTA_BACKEND_BYTES + value: "8589934592" + - name: ETCD_DATA_DIR + value: /var/lib/data + - name: ETCD_INITIAL_ADVERTISE_PEER_URLS + value: https://$(HOSTNAME).etcd-discovery.$(NAMESPACE).svc:2380 + - name: ETCD_LISTEN_PEER_URLS + value: https://$(POD_IP):2380 + - name: ETCD_LISTEN_CLIENT_URLS + value: https://$(POD_IP):2379,https://localhost:2379 + - name: ETCD_ADVERTISE_CLIENT_URLS + value: https://$(HOSTNAME).etcd-discovery.$(NAMESPACE).svc:2379 + - name: ETCD_LISTEN_METRICS_URLS + value: https://0.0.0.0:2382 + - name: ETCD_SNAPSHOT_COUNT + value: "10000" + - name: ETCD_PEER_CLIENT_CERT_AUTH + value: "true" + - name: ETCD_PEER_CERT_FILE + value: /etc/etcd/tls/peer/peer.crt + - name: ETCD_PEER_KEY_FILE + value: /etc/etcd/tls/peer/peer.key + - name: ETCD_PEER_TRUSTED_CA_FILE + value: /etc/etcd/tls/etcd-ca/ca.crt + - name: ETCD_CLIENT_CERT_AUTH + value: "true" + - name: ETCD_CERT_FILE + value: /etc/etcd/tls/server/server.crt + - name: ETCD_KEY_FILE + value: /etc/etcd/tls/server/server.key + - name: ETCD_TRUSTED_CA_FILE + value: /etc/etcd/tls/etcd-ca/ca.crt + - name: ETCD_ENABLE_PPROF + value: "true" + - name: ETCD_INITIAL_CLUSTER + value: etcd-0=https://etcd-0.etcd-discovery.hcp-namespace.svc:2380,etcd-1=https://etcd-1.etcd-discovery.hcp-namespace.svc:2380,etcd-2=https://etcd-2.etcd-discovery.hcp-namespace.svc:2380 + - name: ETCD_TLS_MIN_VERSION + value: TLS1.2 + - name: ETCD_CIPHER_SUITES + value: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + image: etcd + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 5 + httpGet: + path: healthz + port: 9980 + scheme: HTTPS + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 30 + name: etcd + ports: + - containerPort: 2379 + name: client + protocol: TCP + - containerPort: 2380 + name: peer + protocol: TCP + readinessProbe: + failureThreshold: 15 + httpGet: + path: readyz + port: 9980 + scheme: HTTPS + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 10 + resources: + requests: + cpu: 300m + memory: 600Mi + securityContext: + readOnlyRootFilesystem: true + startupProbe: + failureThreshold: 18 + httpGet: + path: readyz + port: 9980 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/lib + name: data + - mountPath: /etc/etcd/tls/peer + name: peer-tls + - mountPath: /etc/etcd/tls/server + name: server-tls + - mountPath: /etc/etcd/tls/client + name: client-tls + - mountPath: /etc/etcd/tls/etcd-ca + name: etcd-ca + - mountPath: /etc/etcd/clusterstate + name: cluster-state + - mountPath: /tmp + name: tmp-dir + - args: + - grpc-proxy + - start + - --endpoints=https://localhost:2382 + - --key=/etc/etcd/tls/peer/peer.key + - --key-file=/etc/etcd/tls/server/server.key + - --cert=/etc/etcd/tls/peer/peer.crt + - --cert-file=/etc/etcd/tls/server/server.crt + - --cacert=/etc/etcd/tls/etcd-ca/ca.crt + - --trusted-ca-file=/etc/etcd/tls/etcd-metrics-ca/ca.crt + - --listen-addr=127.0.0.1:2383 + - --metrics-addr=https://0.0.0.0:2381 + - --advertise-client-url= + - --tls-min-version=TLS1.2 + - --listen-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + command: + - etcd + image: etcd + imagePullPolicy: IfNotPresent + name: etcd-metrics + ports: + - containerPort: 2381 + name: metrics + protocol: TCP + resources: + requests: + cpu: 40m + memory: 200Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/etcd/tls/peer + name: peer-tls + - mountPath: /etc/etcd/tls/server + name: server-tls + - mountPath: /etc/etcd/tls/etcd-ca + name: etcd-ca + - mountPath: /etc/etcd/tls/etcd-metrics-ca + name: etcd-metrics-ca + - mountPath: /tmp + name: tmp-dir + - args: + - readyz + - --target=https://localhost:2379 + - --listen-port=9980 + - --serving-cert-file=/etc/etcd/tls/server/server.crt + - --serving-key-file=/etc/etcd/tls/server/server.key + - --client-cert-file=/etc/etcd/tls/client/etcd-client.crt + - --client-key-file=/etc/etcd/tls/client/etcd-client.key + - --client-cacert-file=/etc/etcd/tls/etcd-ca/ca.crt + - --listen-tls-min-version=TLS1.2 + - --listen-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + command: + - cluster-etcd-operator + image: cluster-etcd-operator + imagePullPolicy: IfNotPresent + name: healthz + ports: + - containerPort: 9980 + name: healthz + protocol: TCP + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/etcd/tls/server + name: server-tls + - mountPath: /etc/etcd/tls/client + name: client-tls + - mountPath: /etc/etcd/tls/etcd-ca + name: etcd-ca + - mountPath: /tmp + name: tmp-dir + initContainers: + - args: + - -c + - exec control-plane-operator resolve-dns --self-register ${HOSTNAME}.etcd-discovery.${NAMESPACE}.svc + command: + - /bin/bash + env: + - name: NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + image: controlplane-operator + imagePullPolicy: IfNotPresent + name: ensure-dns + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + - command: + - /bin/sh + - -ce + - | + # If /var/lib/data is not empty we exit early, since this means an etcd database already exists + mkdir -p /var/lib/data + [ "$(ls -A /var/lib/data)" ] && echo "/var/lib/data not empty, not restoring snapshot" && exit 0 + + RESTORE_URL_VAR="RESTORE_URL_ETCD" + RESTORE_URL=${!RESTORE_URL_VAR} + + # When downloading from S3, curl can succeed even if the object doesn't exist + # and also when a pre-signed URL is expired. + # In this case we get an XML file which can be detected with `file` so we show + # the contents via the logs then exit with an error status + curl -o /tmp/snapshot "${RESTORE_URL}" + head -c 5 /tmp/snapshot | grep -q ' /etc/etcd/clusterstate/state + + if [[ ! -f /var/lib/data/member/snap/db ]]; then + echo "No existing etcd data found" + echo "Checking if cluster is functional" + if etcdctl member list; then + echo "Cluster is functional" + MEMBER_ID=$(etcdctl member list -w simple | grep "${HOSTNAME}" | awk -F, '{ print $1 }') + if [[ -n "${MEMBER_ID}" ]]; then + echo "A member with this name (${HOSTNAME}) already exists, removing" + etcdctl member remove "${MEMBER_ID}" + echo "Adding new member" + etcdctl member add ${HOSTNAME} --peer-urls https://${HOSTNAME}.etcd-discovery.${NAMESPACE}.svc:2380 + echo "existing" > /etc/etcd/clusterstate/state + else + echo "A member does not exist with name (${HOSTNAME}), nothing to do" + fi + else + echo "Cannot list members in cluster, so likely not up yet" + fi + else + echo "Snapshot db exists, member has data" + fi + command: + - /bin/bash + env: + - name: NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: etcd + imagePullPolicy: IfNotPresent + name: reset-member + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/lib + name: data + - mountPath: /etc/etcd/tls/server + name: server-tls + - mountPath: /etc/etcd/tls/etcd-ca + name: etcd-ca + - mountPath: /etc/etcd/clusterstate + name: cluster-state + priorityClassName: hypershift-etcd + restartPolicy: Always + schedulerName: default-scheduler + serviceAccountName: etcd + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: peer-tls + secret: + defaultMode: 416 + secretName: etcd-peer-tls + - name: server-tls + secret: + defaultMode: 416 + secretName: etcd-server-tls + - name: client-tls + secret: + defaultMode: 416 + secretName: etcd-client-tls + - configMap: + defaultMode: 420 + name: etcd-ca + name: etcd-ca + - configMap: + defaultMode: 420 + name: etcd-metrics-ca + name: etcd-metrics-ca + - emptyDir: {} + name: cluster-state + - emptyDir: {} + name: tmp-dir + updateStrategy: + rollingUpdate: + partition: 0 + type: RollingUpdate + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 8Gi + volumeMode: Filesystem + status: {} +status: + availableReplicas: 0 + replicas: 0 diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/featuregate-generator/EtcdRestore/zz_fixture_TestControlPlaneComponents_featuregate_generator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/featuregate-generator/EtcdRestore/zz_fixture_TestControlPlaneComponents_featuregate_generator_controlplanecomponent.yaml new file mode 100644 index 000000000000..03cf7d45f447 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/featuregate-generator/EtcdRestore/zz_fixture_TestControlPlaneComponents_featuregate_generator_controlplanecomponent.yaml @@ -0,0 +1,19 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: featuregate-generator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: Job status unknown + reason: Unknown + status: "False" + type: Available + - lastTransitionTime: null + message: Job status unknown + reason: Unknown + status: "False" + type: RolloutComplete diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/featuregate-generator/EtcdRestore/zz_fixture_TestControlPlaneComponents_featuregate_generator_job.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/featuregate-generator/EtcdRestore/zz_fixture_TestControlPlaneComponents_featuregate_generator_job.yaml new file mode 100644 index 000000000000..5963cfc64fb0 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/featuregate-generator/EtcdRestore/zz_fixture_TestControlPlaneComponents_featuregate_generator_job.yaml @@ -0,0 +1,149 @@ +apiVersion: batch/v1 +kind: Job +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: featuregate-generator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + backoffLimit: 5 + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: manifests,work,tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: featuregate-generator + hypershift.openshift.io/control-plane-component: featuregate-generator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - args: + - sync-fg-configmap + command: + - /usr/bin/control-plane-operator + env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: PAYLOAD_VERSION + value: 4.18.0 + image: controlplane-operator + imagePullPolicy: IfNotPresent + name: apply + resources: + requests: + cpu: 30m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /manifests + name: manifests + - mountPath: /tmp + name: tmp-dir + initContainers: + - args: + - |- + #!/bin/sh + cd /work + mkdir input output manifests + + touch /work/manifests/99_feature-gate.yaml + cat </work/manifests/99_feature-gate.yaml + $(FEATURE_GATE_YAML) + EOF + + /usr/bin/render \ + --asset-output-dir /work/output \ + --rendered-manifest-dir=/work/manifests \ + --cluster-profile=ibm-cloud-managed \ + --payload-version=$(PAYLOAD_VERSION) + + cp /work/manifests/* /output + command: + - /bin/bash + - -c + env: + - name: PAYLOAD_VERSION + value: 4.18.0 + - name: FEATURE_GATE_YAML + value: | + apiVersion: config.openshift.io/v1 + kind: FeatureGate + metadata: + name: cluster + spec: {} + status: + featureGates: null + image: cluster-config-api + imagePullPolicy: IfNotPresent + name: render-feature-gates + resources: + requests: + cpu: 30m + memory: 50Mi + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /output + name: manifests + - mountPath: /work + name: work + priorityClassName: hypershift-control-plane + restartPolicy: Never + serviceAccountName: control-plane-operator + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: manifests + - emptyDir: {} + name: work + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/gcp-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_gcp_cloud_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/gcp-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_gcp_cloud_config_configmap.yaml new file mode 100644 index 000000000000..364f6b56319e --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/gcp-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_gcp_cloud_config_configmap.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +data: + cloud.conf: |- + [Global] + project-id = my-project + network-name = my-network + node-tags = -worker + multizone = true + token-url = "nil" +kind: ConfigMap +metadata: + name: gcp-cloud-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/gcp-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_gcp_cloud_controller_manager_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/gcp-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_gcp_cloud_controller_manager_controlplanecomponent.yaml new file mode 100644 index 000000000000..30e15cabe3a6 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/gcp-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_gcp_cloud_controller_manager_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: gcp-cloud-controller-manager + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: gcp-cloud-controller-manager Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment gcp-cloud-controller-manager rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: gcp-cloud-config diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/gcp-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_gcp_cloud_controller_manager_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/gcp-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_gcp_cloud_controller_manager_deployment.yaml new file mode 100644 index 000000000000..2eea788e4996 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/gcp-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_gcp_cloud_controller_manager_deployment.yaml @@ -0,0 +1,162 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: gcp-cloud-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: cloud-controller-manager + strategy: + type: Recreate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: cloud-token,tmp-dir + component.hypershift.openshift.io/config-hash: eafd03f7 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: cloud-controller-manager + hypershift.openshift.io/control-plane-component: gcp-cloud-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - --cloud-provider=gce + - --use-service-account-credentials=false + - --kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + - --cloud-config=/etc/cloud/cloud.conf + - --configure-cloud-routes=false + - --controllers=*,-nodeipam + - --leader-elect=true + - --leader-elect-lease-duration=137s + - --leader-elect-renew-deadline=107s + - --leader-elect-retry-period=26s + - --leader-elect-resource-namespace=openshift-cloud-controller-manager + - --authentication-kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + - --authorization-kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + command: + - /bin/gcp-cloud-controller-manager + env: + - name: GOOGLE_APPLICATION_CREDENTIALS + value: /etc/gcp/credentials/application_default_credentials.json + image: gcp-cloud-controller-manager + imagePullPolicy: IfNotPresent + name: cloud-controller-manager + resources: + requests: + cpu: 75m + memory: 60Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/cloud + name: cloud-config + - mountPath: /etc/kubernetes/kubeconfig + name: kubeconfig + - mountPath: /etc/gcp/credentials + name: cloud-credentials + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - mountPath: /tmp + name: tmp-dir + initContainers: + - args: + - --token-audience=openshift + - --service-account-namespace=kube-system + - --service-account-name=cloud-controller-manager + - --token-file=/var/run/secrets/openshift/serviceaccount/token + - --kubeconfig=/etc/kubernetes/kubeconfig + command: + - /usr/bin/control-plane-operator + - token-minter + image: token-minter + imagePullPolicy: IfNotPresent + name: cloud-token-minter + resources: + requests: + cpu: 10m + memory: 30Mi + restartPolicy: Always + startupProbe: + exec: + command: + - test + - -f + - /var/run/secrets/openshift/serviceaccount/token + failureThreshold: 30 + periodSeconds: 1 + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - mountPath: /etc/kubernetes + name: kubeconfig + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - configMap: + defaultMode: 420 + name: gcp-cloud-config + name: cloud-config + - name: cloud-credentials + secret: + defaultMode: 416 + secretName: cloud-controller-manager-creds + - emptyDir: + medium: Memory + name: cloud-token + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..5e316e757c9d --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_controlplanecomponent.yaml @@ -0,0 +1,33 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: hosted-cluster-config-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: hosted-cluster-config-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment hosted-cluster-config-operator rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: monitoring.coreos.com + kind: PodMonitor + name: hosted-cluster-config-operator + - group: rbac.authorization.k8s.io + kind: Role + name: hosted-cluster-config-operator + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: hosted-cluster-config-operator + - group: "" + kind: ServiceAccount + name: hosted-cluster-config-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_deployment.yaml new file mode 100644 index 000000000000..4026af4525b9 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_deployment.yaml @@ -0,0 +1,216 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: hosted-cluster-config-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: hosted-cluster-config-operator + strategy: + type: Recreate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: hosted-cluster-config-operator + hypershift.openshift.io/control-plane-component: hosted-cluster-config-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - command: + - /usr/bin/control-plane-operator + - hosted-cluster-config-operator + - --initial-ca-file=/etc/kubernetes/root-ca/ca.crt + - --cluster-signer-ca-file=/etc/kubernetes/cluster-signer-ca/ca.crt + - --target-kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + - --namespace + - $(POD_NAMESPACE) + - --platform-type + - AWS + - --enable-ci-debug-output=false + - --hosted-control-plane=hcp + - --konnectivity-address= + - --konnectivity-port=0 + - --oauth-address= + - --oauth-port=0 + - --registry-overrides + - registry=override + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: KUBE_FEATURE_WatchListClient + value: "false" + - name: OPENSHIFT_RELEASE_VERSION + value: 4.18.0 + - name: KUBERNETES_VERSION + value: 1.30.1 + - name: OPERATE_ON_RELEASE_IMAGE + value: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + - name: OPENSHIFT_IMG_OVERRIDES + value: registry=override + - name: HOSTED_CLUSTER_CONFIG_OPERATOR_IMAGE + value: hosted-cluster-config-operator + - name: MANAGED_SERVICE + value: ARO-HCP + image: hosted-cluster-config-operator + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 5 + httpGet: + path: /healthz + port: 6060 + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 60 + successThreshold: 1 + timeoutSeconds: 5 + name: hosted-cluster-config-operator + ports: + - containerPort: 8080 + name: metrics + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /readyz + port: 6060 + scheme: HTTP + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 60m + memory: 80Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/cluster-signer-ca + name: cluster-signer-ca + - mountPath: /etc/kubernetes/kubeconfig + name: kubeconfig + - mountPath: /etc/kubernetes/root-ca + name: root-ca + - mountPath: /etc/pki/ca-trust/extracted/pem + name: openshift-config-managed-trusted-ca-bundle + readOnly: true + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + - --kubeconfig=/var/kubeconfig/kubeconfig + - --required-api=imageregistry.operator.openshift.io,v1,Config + - --required-api=config.openshift.io,v1,Infrastructure + - --required-api=config.openshift.io,v1,DNS + - --required-api=config.openshift.io,v1,Ingress + - --required-api=config.openshift.io,v1,Network + - --required-api=config.openshift.io,v1,Proxy + - --required-api=config.openshift.io,v1,Build + - --required-api=config.openshift.io,v1,Image + - --required-api=config.openshift.io,v1,Project + - --required-api=config.openshift.io,v1,ClusterVersion + - --required-api=config.openshift.io,v1,FeatureGate + - --required-api=config.openshift.io,v1,ClusterOperator + - --required-api=config.openshift.io,v1,OperatorHub + - --required-api=operator.openshift.io,v1,Network + - --required-api=operator.openshift.io,v1,CloudCredential + - --required-api=operator.openshift.io,v1,Storage + - --required-api=operator.openshift.io,v1,CSISnapshotController + - --required-api=operator.openshift.io,v1,ClusterCSIDriver + - --required-api=operator.openshift.io,v1,IngressController + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/kubeconfig + name: kubeconfig + priorityClassName: hypershift-control-plane + schedulerName: default-scheduler + serviceAccount: hosted-cluster-config-operator + serviceAccountName: hosted-cluster-config-operator + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: kubeconfig + secret: + defaultMode: 416 + secretName: hcco-kubeconfig + - configMap: + defaultMode: 420 + name: root-ca + name: root-ca + - configMap: + defaultMode: 420 + name: kubelet-client-ca + name: cluster-signer-ca + - configMap: + defaultMode: 420 + items: + - key: ca-bundle.crt + path: tls-ca-bundle.pem + name: openshift-config-managed-trusted-ca-bundle + optional: true + name: openshift-config-managed-trusted-ca-bundle + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_podmonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_podmonitor.yaml new file mode 100644 index 000000000000..8fa45a5bbe39 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_podmonitor.yaml @@ -0,0 +1,30 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: hosted-cluster-config-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + namespaceSelector: + matchNames: + - hcp-namespace + podMetricsEndpoints: + - metricRelabelings: + - action: replace + replacement: "" + targetLabel: _id + port: metrics + relabelings: + - action: replace + replacement: "" + targetLabel: _id + selector: + matchLabels: + app: hosted-cluster-config-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_role.yaml new file mode 100644 index 000000000000..aab18f8ec27a --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_role.yaml @@ -0,0 +1,111 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: hosted-cluster-config-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - "" + resources: + - pods + verbs: + - get + - patch + - update + - create + - list + - watch +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - patch + - update + - create + - list + - watch + - delete +- apiGroups: + - apps + resources: + - deployments + verbs: + - get + - patch + - update + - list + - watch +- apiGroups: + - hypershift.openshift.io + resources: + - hostedcontrolplanes + verbs: + - get + - list + - watch +- apiGroups: + - hypershift.openshift.io + resources: + - hostedcontrolplanes/status + verbs: + - patch + - update +- apiGroups: + - hypershift.openshift.io + resources: + - hostedcontrolplanes/finalizers + verbs: + - get + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create + - get + - list + - update +- apiGroups: + - "" + resources: + - secrets + - services + verbs: + - get + - list + - watch + - patch + - update +- apiGroups: + - cluster.x-k8s.io + resources: + - machinesets + - machines + verbs: + - get + - patch + - update + - delete + - list + - watch +- apiGroups: + - route.openshift.io + resources: + - routes + verbs: + - get + - list + - watch diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_rolebinding.yaml new file mode 100644 index 000000000000..21a9dd8e9bbb --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: hosted-cluster-config-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: hosted-cluster-config-operator +subjects: +- kind: ServiceAccount + name: hosted-cluster-config-operator + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_serviceaccount.yaml new file mode 100644 index 000000000000..33b14c67356b --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/hosted-cluster-config-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_hosted_cluster_config_operator_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: hosted-cluster-config-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_proxy_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_proxy_controlplanecomponent.yaml new file mode 100644 index 000000000000..60b1b771a984 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_proxy_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: ignition-server-proxy + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: ignition-server-proxy Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment ignition-server-proxy rollout to finish: 0 out + of 2 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Service + name: ignition-server-proxy diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_proxy_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_proxy_deployment.yaml new file mode 100644 index 000000000000..7eced87e90dd --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_proxy_deployment.yaml @@ -0,0 +1,150 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: ignition-server-proxy + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 2 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: ignition-server-proxy + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: ignition-server-proxy + hypershift.openshift.io/control-plane-component: ignition-server-proxy + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/request-serving-component: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: ignition-server-proxy + hypershift.openshift.io/control-plane-component: ignition-server-proxy + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/request-serving-component: "true" + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: ignition-server-proxy + hypershift.openshift.io/control-plane-component: ignition-server-proxy + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/request-serving-component: "true" + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - -c + - | + #!/bin/bash + set -e + cat /etc/ssl/serving-cert/tls.crt /etc/ssl/serving-cert/tls.key > /tmp/tls.pem + cat < /tmp/haproxy.conf + defaults + mode http + timeout connect 5s + timeout client 30s + timeout server 30s + + frontend ignition-server + bind :::8443 v4v6 ssl crt /tmp/tls.pem alpn http/1.1 + default_backend ignition_servers + + backend ignition_servers + server ignition-server ignition-server:443 check ssl ca-file /etc/ssl/root-ca/ca.crt alpn http/1.1 + EOF + haproxy -f /tmp/haproxy.conf + command: + - /bin/bash + image: haproxy-router + imagePullPolicy: IfNotPresent + name: haproxy + ports: + - containerPort: 8443 + name: https + protocol: TCP + resources: + requests: + cpu: 10m + memory: 20Mi + securityContext: + capabilities: + add: + - NET_BIND_SERVICE + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/ssl/serving-cert + name: serving-cert + - mountPath: /etc/ssl/root-ca + name: root-ca + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: serving-cert + secret: + defaultMode: 416 + secretName: ignition-server-serving-cert + - configMap: + defaultMode: 420 + name: root-ca + name: root-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_proxy_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_proxy_service.yaml new file mode 100644 index 000000000000..966047c59ca8 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_proxy_service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: ignition-server-proxy + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: https + port: 443 + protocol: TCP + targetPort: https + selector: + app: ignition-server-proxy + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_ca_cert_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_ca_cert_secret.yaml new file mode 100644 index 000000000000..0bbf81cd4d92 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_ca_cert_secret.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + name: ignition-server-ca-cert + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: kubernetes.io/tls diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_controlplanecomponent.yaml new file mode 100644 index 000000000000..b600cb2c71a0 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_controlplanecomponent.yaml @@ -0,0 +1,45 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: ignition-server + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: ignition-server Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment ignition-server rollout to finish: 0 out of 2 + new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Secret + name: ignition-server-ca-cert + - group: monitoring.coreos.com + kind: PodMonitor + name: ignition-server + - group: rbac.authorization.k8s.io + kind: Role + name: ignition-server + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: ignition-server + - group: route.openshift.io + kind: Route + name: ignition-server + - group: "" + kind: Service + name: ignition-server + - group: "" + kind: ServiceAccount + name: ignition-server + - group: "" + kind: Secret + name: ignition-server-serving-cert diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_deployment.yaml new file mode 100644 index 000000000000..ea22bb4e008f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_deployment.yaml @@ -0,0 +1,229 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: ignition-server + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 2 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: ignition-server + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: payloads,bootstrap-manifests,manifests,shared,tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: ignition-server + hypershift.openshift.io/control-plane-component: ignition-server + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: ignition-server + hypershift.openshift.io/control-plane-component: ignition-server + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: ignition-server + hypershift.openshift.io/control-plane-component: ignition-server + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: true + containers: + - args: + - --cert-file + - /var/run/secrets/ignition/serving-cert/tls.crt + - --key-file + - /var/run/secrets/ignition/serving-cert/tls.key + - --feature-gate-manifest=/shared/99_feature-gate.yaml + - --registry-overrides + - registry=override + - --platform + - AWS + command: + - /usr/bin/control-plane-operator + - ignition-server + env: + - name: MY_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: OPENSHIFT_IMG_OVERRIDES + value: registry=override + image: controlplane-operator + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 6 + httpGet: + path: /healthz + port: 9090 + scheme: HTTPS + initialDelaySeconds: 120 + periodSeconds: 60 + successThreshold: 1 + timeoutSeconds: 5 + name: ignition-server + ports: + - containerPort: 9090 + name: https + protocol: TCP + - containerPort: 8080 + name: metrics + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 9090 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 10m + memory: 40Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/secrets/ignition/serving-cert + name: serving-cert + - mountPath: /payloads + name: payloads + - mountPath: /usr/share/bootkube/manifests/bootstrap-manifests + name: bootstrap-manifests + - mountPath: /usr/share/bootkube/manifests/manifests + name: manifests + - mountPath: /shared + name: shared + - mountPath: /etc/pki/ca-trust/extracted/pem + name: openshift-config-managed-trusted-ca-bundle + readOnly: true + - mountPath: /tmp + name: tmp-dir + initContainers: + - args: + - -c + - | + #!/bin/bash + set -e + cd /tmp + mkdir input output manifests + + touch /tmp/manifests/99_feature-gate.yaml + cat </tmp/manifests/99_feature-gate.yaml + $(FEATURE_GATE_YAML) + + EOF + + cp /tmp/manifests/99_feature-gate.yaml /shared/99_feature-gate.yaml + command: + - /bin/bash + env: + - name: FEATURE_GATE_YAML + value: | + apiVersion: config.openshift.io/v1 + kind: FeatureGate + metadata: + name: cluster + spec: {} + status: + featureGates: null + image: cluster-config-api + name: fetch-feature-gate + resources: + requests: + cpu: 10m + memory: 40Mi + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /shared + name: shared + priorityClassName: hypershift-control-plane + serviceAccount: ignition-server + serviceAccountName: ignition-server + terminationGracePeriodSeconds: 10 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: serving-cert + secret: + defaultMode: 416 + secretName: ignition-server + - emptyDir: {} + name: payloads + - emptyDir: {} + name: bootstrap-manifests + - emptyDir: {} + name: manifests + - emptyDir: {} + name: shared + - configMap: + defaultMode: 420 + items: + - key: ca-bundle.crt + path: tls-ca-bundle.pem + name: openshift-config-managed-trusted-ca-bundle + optional: true + name: openshift-config-managed-trusted-ca-bundle + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_podmonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_podmonitor.yaml new file mode 100644 index 000000000000..0ab803ccc8c8 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_podmonitor.yaml @@ -0,0 +1,30 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: ignition-server + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + namespaceSelector: + matchNames: + - hcp-namespace + podMetricsEndpoints: + - metricRelabelings: + - action: replace + replacement: "" + targetLabel: _id + port: metrics + relabelings: + - action: replace + replacement: "" + targetLabel: _id + selector: + matchLabels: + app: ignition-server diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_role.yaml new file mode 100644 index 000000000000..55ca473e59aa --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_role.yaml @@ -0,0 +1,53 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: ignition-server + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + - watch + - update + - patch + - delete +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - events + verbs: + - '*' +- apiGroups: + - hypershift.openshift.io + resources: + - hostedcontrolplanes + verbs: + - get + - list + - watch +- apiGroups: + - hypershift.openshift.io + resources: + - hostedcontrolplanes/status + verbs: + - '*' diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_rolebinding.yaml new file mode 100644 index 000000000000..91f42b35ca24 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: ignition-server + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: ignition-server +subjects: +- kind: ServiceAccount + name: ignition-server + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_route.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_route.yaml new file mode 100644 index 000000000000..34053c2ecd4f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_route.yaml @@ -0,0 +1,25 @@ +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + labels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + name: ignition-server + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + tls: + insecureEdgeTerminationPolicy: None + termination: passthrough + to: + kind: Service + name: ignition-server-proxy + weight: null + wildcardPolicy: None +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_service.yaml new file mode 100644 index 000000000000..abd05d517610 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: ignition-server + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: https + port: 443 + protocol: TCP + targetPort: 9090 + selector: + app: ignition-server + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_serviceaccount.yaml new file mode 100644 index 000000000000..c9bf14993eba --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: ignition-server + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_serving_cert_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_serving_cert_secret.yaml new file mode 100644 index 000000000000..8d31186916f3 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ignition-server/EtcdRestore/zz_fixture_TestControlPlaneComponents_ignition_server_serving_cert_secret.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + name: ignition-server-serving-cert + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: kubernetes.io/tls diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..2b602ac0ee47 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_controlplanecomponent.yaml @@ -0,0 +1,27 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: ingress-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: ingress-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment ingress-operator rollout to finish: 0 out of + 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: monitoring.coreos.com + kind: PodMonitor + name: ingress-operator + - group: "" + kind: Secret + name: ingress-operator-service-account-kubeconfig diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_deployment.yaml new file mode 100644 index 000000000000..27adb8312862 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_deployment.yaml @@ -0,0 +1,230 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: ingress-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + name: ingress-operator + strategy: + type: Recreate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: cloud-token,tmp-dir + component.hypershift.openshift.io/config-hash: 741638a5741638a5741638a5741638a5 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + target.workload.openshift.io/management: '{"effect": "PreferredDuringScheduling"}' + labels: + app: ingress-operator + hypershift.openshift.io/control-plane-component: ingress-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + name: ingress-operator + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - command: + - ingress-operator + - start + - --namespace + - openshift-ingress-operator + - --image + - $(IMAGE) + - --haproxy-image + - 2.8=$(HAPROXY_28_IMAGE) + - --haproxy-image + - 3.2=$(HAPROXY_32_IMAGE) + - --default-haproxy-version + - $(DEFAULT_HAPROXY_VERSION) + - --canary-image + - $(CANARY_IMAGE) + - --release-version + - $(RELEASE_VERSION) + - --metrics-listen-addr + - 0.0.0.0:60000 + env: + - name: RELEASE_VERSION + value: 4.18.0 + - name: IMAGE + value: haproxy-router + - name: HAPROXY_28_IMAGE + value: haproxy-router-haproxy28 + - name: HAPROXY_32_IMAGE + value: haproxy-router-haproxy32 + - name: DEFAULT_HAPROXY_VERSION + value: "3.2" + - name: CANARY_IMAGE + value: cluster-ingress-operator + - name: KUBECONFIG + value: /etc/kubernetes/kubeconfig + - name: HTTP_PROXY + value: http://127.0.0.1:8090 + - name: HTTPS_PROXY + value: http://127.0.0.1:8090 + - name: NO_PROXY + value: kube-apiserver + image: cluster-ingress-operator + imagePullPolicy: IfNotPresent + name: ingress-operator + ports: + - containerPort: 60000 + name: metrics + protocol: TCP + resources: + requests: + cpu: 10m + memory: 80Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes + name: service-account-kubeconfig + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - mountPath: /tmp + name: tmp-dir + - args: + - run + - --connect-directly-to-cloud-apis=true + command: + - /usr/bin/control-plane-operator + - konnectivity-https-proxy + env: + - name: KUBECONFIG + value: /etc/kubernetes/secrets/kubeconfig/kubeconfig + image: controlplane-operator + name: konnectivity-proxy-https + resources: + requests: + cpu: 10m + memory: 30Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/secrets/kubeconfig + name: admin-kubeconfig + - mountPath: /etc/konnectivity/proxy-client + name: konnectivity-proxy-cert + - mountPath: /etc/konnectivity/proxy-ca + name: konnectivity-proxy-ca + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + - --kubeconfig=/var/kubeconfig/kubeconfig + - --required-api=route.openshift.io,v1,Route + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/kubeconfig + name: service-account-kubeconfig + - args: + - --token-audience=openshift + - --service-account-namespace=openshift-ingress-operator + - --service-account-name=ingress-operator + - --token-file=/var/run/secrets/openshift/serviceaccount/token + - --kubeconfig=/etc/kubernetes/kubeconfig + command: + - /usr/bin/control-plane-operator + - token-minter + image: token-minter + imagePullPolicy: IfNotPresent + name: cloud-token-minter + resources: + requests: + cpu: 10m + memory: 30Mi + restartPolicy: Always + startupProbe: + exec: + command: + - test + - -f + - /var/run/secrets/openshift/serviceaccount/token + failureThreshold: 30 + periodSeconds: 1 + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/secrets/openshift/serviceaccount + name: cloud-token + - mountPath: /etc/kubernetes + name: admin-kubeconfig + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: admin-kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - name: service-account-kubeconfig + secret: + defaultMode: 416 + secretName: ingress-operator-service-account-kubeconfig + - name: konnectivity-proxy-cert + secret: + defaultMode: 416 + secretName: konnectivity-client + - configMap: + name: konnectivity-ca-bundle + name: konnectivity-proxy-ca + - emptyDir: + medium: Memory + name: cloud-token + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_podmonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_podmonitor.yaml new file mode 100644 index 000000000000..a6938a2a7d2b --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_podmonitor.yaml @@ -0,0 +1,35 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: ingress-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + namespaceSelector: + matchNames: + - hcp-namespace + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + interval: 60s + metricRelabelings: + - action: replace + replacement: "" + targetLabel: _id + path: /metrics + port: metrics + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: http + selector: + matchLabels: + name: ingress-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_service_account_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_service_account_kubeconfig_secret.yaml new file mode 100644 index 000000000000..57cdeb0082a4 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/ingress-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_ingress_operator_service_account_kubeconfig_secret.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +data: + ca.crt: "" + kubeconfig: "" + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + name: ingress-operator-service-account-kubeconfig + namespace: hcp-namespace + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/konnectivity-agent/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_agent_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/konnectivity-agent/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_agent_controlplanecomponent.yaml new file mode 100644 index 000000000000..ca4af87c608f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/konnectivity-agent/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_agent_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: konnectivity-agent + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: konnectivity-agent Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment konnectivity-agent rollout to finish: 0 out of + 2 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ServiceAccount + name: konnectivity-agent diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/konnectivity-agent/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_agent_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/konnectivity-agent/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_agent_deployment.yaml new file mode 100644 index 000000000000..70f23e83145a --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/konnectivity-agent/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_agent_deployment.yaml @@ -0,0 +1,173 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: konnectivity-agent + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 2 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: konnectivity-agent + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: konnectivity-agent + hypershift.openshift.io/control-plane-component: konnectivity-agent + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: konnectivity-agent + hypershift.openshift.io/control-plane-component: konnectivity-agent + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: konnectivity-agent + hypershift.openshift.io/control-plane-component: konnectivity-agent + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - --logtostderr=true + - --ca-cert + - /etc/konnectivity/ca/ca.crt + - --agent-cert + - /etc/konnectivity/agent/tls.crt + - --agent-key + - /etc/konnectivity/agent/tls.key + - --proxy-server-host + - konnectivity-server + - --proxy-server-port + - "8091" + - --health-server-port + - "2041" + - --keepalive-time + - 30s + - --probe-interval + - 5s + - --sync-interval + - 5s + - --sync-interval-cap + - 30s + - --v + - "3" + - --agent-identifiers + - ipv4=&ipv4=&ipv4= + command: + - /usr/bin/proxy-agent + image: apiserver-network-proxy + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 6 + httpGet: + path: healthz + port: 2041 + scheme: HTTP + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 5 + name: konnectivity-agent + readinessProbe: + failureThreshold: 1 + httpGet: + path: readyz + port: 2041 + scheme: HTTP + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 40m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + startupProbe: + failureThreshold: 60 + httpGet: + path: healthz + port: 2041 + scheme: HTTP + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 5 + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/konnectivity/agent + name: agent-certs + - mountPath: /etc/konnectivity/ca + name: konnectivity-ca + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + serviceAccountName: konnectivity-agent + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: agent-certs + secret: + defaultMode: 416 + secretName: konnectivity-agent + - configMap: + defaultMode: 420 + name: konnectivity-ca-bundle + name: konnectivity-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/konnectivity-agent/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_agent_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/konnectivity-agent/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_agent_serviceaccount.yaml new file mode 100644 index 000000000000..94deec3ef3a2 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/konnectivity-agent/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_agent_serviceaccount.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + labels: + kubernetes.io/cluster-service: "true" + name: konnectivity-agent + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_admin_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_admin_kubeconfig_secret.yaml new file mode 100644 index 000000000000..4967f0e9163a --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_admin_kubeconfig_secret.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +data: + kubeconfig: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBabUZyWlE9PQogICAgc2VydmVyOiBodHRwczovL2FwaS5oY3AuaHlwZXJzaGlmdC5sb2NhbDowCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgbmFtZXNwYWNlOiBkZWZhdWx0CiAgICB1c2VyOiBhZG1pbgogIG5hbWU6IGFkbWluCmN1cnJlbnQtY29udGV4dDogYWRtaW4Ka2luZDogQ29uZmlnCnVzZXJzOgotIG5hbWU6IGFkbWluCiAgdXNlcjoKICAgIGNsaWVudC1jZXJ0aWZpY2F0ZS1kYXRhOiBabUZyWlE9PQogICAgY2xpZW50LWtleS1kYXRhOiBabUZyWlE9PQo= +kind: Secret +metadata: + labels: + hypershift.openshift.io/kubeconfig: external + name: admin-kubeconfig + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_auth_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_auth_config_configmap.yaml new file mode 100644 index 000000000000..a525c743557c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_auth_config_configmap.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +data: + auth.json: '{"kind":"AuthenticationConfiguration","apiVersion":"apiserver.config.k8s.io/v1alpha1","jwt":[]}' +kind: ConfigMap +metadata: + name: auth-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_pod_identity_webhook_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_pod_identity_webhook_kubeconfig_secret.yaml new file mode 100644 index 000000000000..b0d6afd4b4a8 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_aws_pod_identity_webhook_kubeconfig_secret.yaml @@ -0,0 +1,23 @@ +apiVersion: v1 +data: + ca.crt: "" + kubeconfig: "" + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + annotations: + hypershiftlite.openshift.io/ca-hash: "" + labels: + hypershift.openshift.io/kubeconfig: local + name: aws-pod-identity-webhook-kubeconfig + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_bootstrap_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_bootstrap_kubeconfig_secret.yaml new file mode 100644 index 000000000000..a9119708100a --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_bootstrap_kubeconfig_secret.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +data: + kubeconfig: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBabUZyWlE9PQogICAgc2VydmVyOiBodHRwczovLzowCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgbmFtZXNwYWNlOiBkZWZhdWx0CiAgICB1c2VyOiBhZG1pbgogIG5hbWU6IGFkbWluCmN1cnJlbnQtY29udGV4dDogYWRtaW4Ka2luZDogQ29uZmlnCnVzZXJzOgotIG5hbWU6IGFkbWluCiAgdXNlcjoKICAgIGNsaWVudC1jZXJ0aWZpY2F0ZS1kYXRhOiBabUZyWlE9PQogICAgY2xpZW50LWtleS1kYXRhOiBabUZyWlE9PQo= +kind: Secret +metadata: + labels: + hypershift.openshift.io/kubeconfig: bootstrap + name: bootstrap-kubeconfig + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_hcco_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_hcco_kubeconfig_secret.yaml new file mode 100644 index 000000000000..b5b28d62f9b8 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_hcco_kubeconfig_secret.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +data: + kubeconfig: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBabUZyWlE9PQogICAgc2VydmVyOiBodHRwczovL2t1YmUtYXBpc2VydmVyOjY0NDMKICBuYW1lOiBjbHVzdGVyCmNvbnRleHRzOgotIGNvbnRleHQ6CiAgICBjbHVzdGVyOiBjbHVzdGVyCiAgICBuYW1lc3BhY2U6IGRlZmF1bHQKICAgIHVzZXI6IGFkbWluCiAgbmFtZTogYWRtaW4KY3VycmVudC1jb250ZXh0OiBhZG1pbgpraW5kOiBDb25maWcKdXNlcnM6Ci0gbmFtZTogYWRtaW4KICB1c2VyOgogICAgY2xpZW50LWNlcnRpZmljYXRlLWRhdGE6IFptRnJaUT09CiAgICBjbGllbnQta2V5LWRhdGE6IFptRnJaUT09Cg== +kind: Secret +metadata: + labels: + hypershift.openshift.io/kubeconfig: service + name: hcco-kubeconfig + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_audit_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_audit_config_configmap.yaml new file mode 100644 index 000000000000..81a1ee23cb87 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_audit_config_configmap.yaml @@ -0,0 +1,61 @@ +apiVersion: v1 +data: + policy.yaml: | + apiVersion: audit.k8s.io/v1 + kind: Policy + metadata: + name: policy + omitManagedFields: true + omitStages: + - RequestReceived + rules: + - level: None + nonResourceURLs: + - /api* + - /version + - /healthz + - /readyz + - /livez + userGroups: + - system:authenticated + - system:unauthenticated + - level: None + namespaces: + - "" + resources: + - group: apiserver.openshift.io + resources: + - apirequestcounts + - apirequestcounts/* + users: + - system:apiserver + - level: RequestResponse + resources: + - group: user.openshift.io + resources: + - identities + - group: oauth.openshift.io + resources: + - oauthaccesstokens + - oauthauthorizetokens + verbs: + - create + - update + - patch + - delete + - level: Metadata + omitStages: + - RequestReceived + profile: Default +kind: ConfigMap +metadata: + name: kas-audit-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_authentication_token_webhook_config_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_authentication_token_webhook_config_secret.yaml new file mode 100644 index 000000000000..d678c18db8e9 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_authentication_token_webhook_config_secret.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + kubeconfig: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBabUZyWlE9PQogICAgc2VydmVyOiBodHRwczovL29wZW5zaGlmdC1vYXV0aC1hcGlzZXJ2ZXIuaGNwLW5hbWVzcGFjZS5zdmM6NDQzL2FwaXMvb2F1dGgub3BlbnNoaWZ0LmlvL3YxL3Rva2VucmV2aWV3cwogIG5hbWU6IGxvY2FsLWNsdXN0ZXIKY29udGV4dHM6Ci0gY29udGV4dDoKICAgIGNsdXN0ZXI6IGxvY2FsLWNsdXN0ZXIKICAgIHVzZXI6IG9wZW5zaGlmdC1hdXRoZW50aWNhdG9yCiAgbmFtZTogbG9jYWwtY29udGV4dApjdXJyZW50LWNvbnRleHQ6IGxvY2FsLWNvbnRleHQKa2luZDogQ29uZmlnCnVzZXJzOgotIG5hbWU6IG9wZW5zaGlmdC1hdXRoZW50aWNhdG9yCiAgdXNlcjoKICAgIGNsaWVudC1jZXJ0aWZpY2F0ZS1kYXRhOiBabUZyWlE9PQogICAgY2xpZW50LWtleS1kYXRhOiBabUZyWlE9PQo= +kind: Secret +metadata: + name: kas-authentication-token-webhook-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_bootstrap_container_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_bootstrap_container_kubeconfig_secret.yaml new file mode 100644 index 000000000000..4dbede787ed0 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_bootstrap_container_kubeconfig_secret.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +data: + kubeconfig: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBabUZyWlE9PQogICAgc2VydmVyOiBodHRwczovL2xvY2FsaG9zdDo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgbmFtZXNwYWNlOiBkZWZhdWx0CiAgICB1c2VyOiBhZG1pbgogIG5hbWU6IGFkbWluCmN1cnJlbnQtY29udGV4dDogYWRtaW4Ka2luZDogQ29uZmlnCnVzZXJzOgotIG5hbWU6IGFkbWluCiAgdXNlcjoKICAgIGNsaWVudC1jZXJ0aWZpY2F0ZS1kYXRhOiBabUZyWlE9PQogICAgY2xpZW50LWtleS1kYXRhOiBabUZyWlE9PQo= +kind: Secret +metadata: + labels: + hypershift.openshift.io/kubeconfig: local + name: kas-bootstrap-container-kubeconfig + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_config_configmap.yaml new file mode 100644 index 000000000000..931c01d767e3 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_config_configmap.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +data: + config.json: '{"kind":"KubeAPIServerConfig","apiVersion":"kubecontrolplane.config.openshift.io/v1","servingInfo":{"bindAddress":"0.0.0.0:6443","bindNetwork":"tcp4","certFile":"/etc/kubernetes/certs/server/tls.crt","keyFile":"/etc/kubernetes/certs/server/tls.key","namedCertificates":[{"certFile":"/etc/kubernetes/certs/server-private/tls.crt","keyFile":"/etc/kubernetes/certs/server-private/tls.key"}],"minTLSVersion":"VersionTLS12","cipherSuites":["TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"],"maxRequestsInFlight":0,"requestTimeoutSeconds":0},"corsAllowedOrigins":["//127\\.0\\.0\\.1(:|$)","//localhost(:|$)"],"auditConfig":{"enabled":false,"auditFilePath":"","maximumFileRetentionDays":0,"maximumRetainedFiles":0,"maximumFileSizeMegabytes":0,"policyFile":"","policyConfiguration":null,"logFormat":"","webHookKubeConfig":"","webHookMode":""},"storageConfig":{"ca":"","certFile":"","keyFile":"","storagePrefix":""},"admission":{"pluginConfig":{"PodSecurity":{"location":"","configuration":{"kind":"PodSecurityConfiguration","apiVersion":"pod-security.admission.config.k8s.io/v1","defaults":{"enforce":"restricted","enforce-version":"latest","audit":"restricted","audit-version":"latest","warn":"restricted","warn-version":"latest"},"exemptions":{"usernames":["system:serviceaccount:openshift-infra:build-controller"]}}},"network.openshift.io/ExternalIPRanger":{"location":"","configuration":{"allowIngressIP":false,"apiVersion":"network.openshift.io/v1","externalIPNetworkCIDRs":[],"kind":"ExternalIPRangerAdmissionConfig"}},"network.openshift.io/RestrictedEndpointsAdmission":{"location":"","configuration":{"apiVersion":"network.openshift.io/v1","kind":"RestrictedEndpointsAdmissionConfig","restrictedCIDRs":["10.132.0.0/14"]}}}},"kubeClientConfig":{"kubeConfig":"","connectionOverrides":{"acceptContentTypes":"","contentType":"","qps":0,"burst":0}},"authConfig":{"requestHeader":null,"webhookTokenAuthenticators":null,"oauthMetadataFile":"/etc/kubernetes/oauth/oauthMetadata.json"},"aggregatorConfig":{"proxyClientInfo":{"certFile":"","keyFile":""}},"kubeletClientInfo":{"port":0,"ca":"","certFile":"","keyFile":""},"servicesSubnet":"","servicesNodePortRange":"","consolePublicURL":"https://console-openshift-console.hcp.","userAgentMatchingConfig":{"requiredClients":null,"deniedClients":null,"defaultRejectionMessage":""},"imagePolicyConfig":{"internalRegistryHostname":"image-registry.openshift-image-registry.svc:5000","externalRegistryHostnames":[]},"projectConfig":{"defaultNodeSelector":""},"serviceAccountPublicKeyFiles":["/etc/kubernetes/secrets/svcacct-key/service-account.pub"],"oauthConfig":null,"apiServerArguments":{"advertise-address":["172.20.0.1"],"allow-privileged":["true"],"anonymous-auth":["true"],"api-audiences":["https://test-oidc-bucket.s3.us-east-1.amazonaws.com/test-cluster"],"audit-log-format":["json"],"audit-log-maxbackup":["1"],"audit-log-maxsize":["10"],"audit-log-path":["/var/log/kube-apiserver/audit.log"],"audit-policy-file":["/etc/kubernetes/audit/policy.yaml"],"authentication-token-webhook-config-file":["/etc/kubernetes/auth-token-webhook/kubeconfig"],"authentication-token-webhook-version":["v1"],"authorization-mode":["Scope","SystemMasters","RBAC","Node"],"client-ca-file":["/etc/kubernetes/certs/client-ca/ca.crt"],"disable-admission-plugins":[],"egress-selector-config-file":["/etc/kubernetes/egress-selector/config.yaml"],"enable-admission-plugins":["CertificateApproval","CertificateSigning","CertificateSubjectRestriction","DefaultIngressClass","DefaultStorageClass","DefaultTolerationSeconds","LimitRanger","MutatingAdmissionWebhook","NamespaceLifecycle","NodeRestriction","OwnerReferencesPermissionEnforcement","PersistentVolumeClaimResize","PodNodeSelector","PodTolerationRestriction","Priority","ResourceQuota","RuntimeClass","ServiceAccount","StorageObjectInUseProtection","TaintNodesByCondition","ValidatingAdmissionPolicy","ValidatingAdmissionWebhook","config.openshift.io/DenyDeleteClusterConfiguration","config.openshift.io/ValidateAPIServer","config.openshift.io/ValidateAuthentication","config.openshift.io/ValidateConsole","config.openshift.io/ValidateFeatureGate","config.openshift.io/ValidateImage","config.openshift.io/ValidateOAuth","config.openshift.io/ValidateProject","config.openshift.io/ValidateScheduler","image.openshift.io/ImagePolicy","network.openshift.io/ExternalIPRanger","network.openshift.io/RestrictedEndpointsAdmission","quota.openshift.io/ClusterResourceQuota","quota.openshift.io/ValidateClusterResourceQuota","route.openshift.io/IngressAdmission","scheduling.openshift.io/OriginPodNodeEnvironment","security.openshift.io/DefaultSecurityContextConstraints","security.openshift.io/SCCExecRestrictions","security.openshift.io/SecurityContextConstraint","security.openshift.io/ValidateSecurityContextConstraints","storage.openshift.io/CSIInlineVolumeSecurity","authorization.openshift.io/RestrictSubjectBindings","authorization.openshift.io/ValidateRoleBindingRestriction"],"enable-aggregator-routing":["true"],"enable-logs-handler":["false"],"endpoint-reconciler-type":["none"],"etcd-cafile":["/etc/kubernetes/certs/etcd-ca/ca.crt"],"etcd-certfile":["/etc/kubernetes/certs/etcd/etcd-client.crt"],"etcd-keyfile":["/etc/kubernetes/certs/etcd/etcd-client.key"],"etcd-prefix":["kubernetes.io"],"etcd-servers":["https://etcd-client.hcp-namespace.svc:2379"],"event-ttl":["3h"],"feature-gates":["AWSClusterHostedDNS=false","AWSEFSDriverVolumeMetrics=true","AdditionalRoutingCapabilities=true","AdminNetworkPolicy=true","AlibabaPlatform=true","AutomatedEtcdBackup=false","AzureWorkloadIdentity=true","BareMetalLoadBalancer=true","BootcNodeManagement=false","BuildCSIVolumes=true","CPMSMachineNamePrefix=false","ChunkSizeMiB=true","CloudDualStackNodeIPs=true","ClusterAPIInstall=false","ClusterAPIInstallIBMCloud=false","ClusterMonitoringConfig=false","ClusterVersionOperatorConfiguration=false","ConsolePluginContentSecurityPolicy=false","DNSNameResolver=false","DisableKubeletCloudCredentialProviders=true","DualReplica=false","DyanmicServiceEndpointIBMCloud=false","DynamicResourceAllocation=false","EtcdBackendQuota=false","EventedPLEG=false","Example2=false","Example=false","ExternalOIDC=true","GCPClusterHostedDNS=false","GCPCustomAPIEndpoints=false","GCPLabelsTags=true","GatewayAPI=false","GatewayAPIController=false","HardwareSpeed=true","HighlyAvailableArbiter=false","ImageStreamImportMode=false","IngressControllerDynamicConfigurationManager=false","IngressControllerLBSubnetsAWS=true","InsightsConfig=false","InsightsConfigAPI=false","InsightsOnDemandDataGather=false","InsightsRuntimeExtractor=false","KMSEncryptionProvider=false","KMSv1=true","MachineAPIMigration=false","MachineAPIOperatorDisableMachineHealthCheckController=false","MachineAPIProviderOpenStack=false","MachineConfigNodes=false","ManagedBootImages=true","ManagedBootImagesAWS=true","MaxUnavailableStatefulSet=false","MetricsCollectionProfiles=false","MinimumKubeletVersion=false","MixedCPUsAllocation=false","MultiArchInstallAWS=true","MultiArchInstallAzure=false","MultiArchInstallGCP=true","NetworkDiagnosticsConfig=true","NetworkLiveMigration=true","NetworkSegmentation=true","NewOLM=false","NewOLMCatalogdAPIV1Metas=false","NodeDisruptionPolicy=true","NodeSwap=false","NutanixMultiSubnets=false","OVNObservability=false","OnClusterBuild=false","OpenShiftPodSecurityAdmission=true","PersistentIPsForVirtualization=true","PinnedImages=false","PlatformOperators=false","PrivateHostedZoneAWS=true","ProcMountType=false","RouteAdvertisements=false","RouteExternalCertificate=false","SELinuxChangePolicy=false","SELinuxMount=false","ServiceAccountTokenNodeBinding=false","SetEIPForNLBIngressController=true","ShortCertRotation=false","SignatureStores=false","SigstoreImageVerification=false","SigstoreImageVerificationPKI=false","StructuredAuthenticationConfiguration=true","TranslateStreamCloseWebsocketRequests=false","UpgradeStatus=false","UserNamespacesPodSecurityStandards=false","UserNamespacesSupport=false","VSphereConfigurableMaxAllowedBlockVolumesPerNode=false","VSphereControlPlaneMachineSet=true","VSphereDriverConfiguration=true","VSphereHostVMGroupZonal=false","VSphereMultiDisk=false","VSphereMultiNetworks=false","VSphereMultiVCenters=true","VSphereStaticIPs=true","ValidatingAdmissionPolicy=true","VolumeAttributesClass=false","VolumeGroupSnapshot=false"],"goaway-chance":["0.001"],"http2-max-streams-per-connection":["2000"],"kubelet-certificate-authority":["/etc/kubernetes/certs/kubelet-ca/ca.crt"],"kubelet-client-certificate":["/etc/kubernetes/certs/kubelet/tls.crt"],"kubelet-client-key":["/etc/kubernetes/certs/kubelet/tls.key"],"kubelet-preferred-address-types":["InternalIP"],"kubelet-read-only-port":["0"],"kubernetes-service-node-port":["0"],"max-mutating-requests-inflight":["1000"],"max-requests-inflight":["3000"],"min-request-timeout":["3600"],"proxy-client-cert-file":["/etc/kubernetes/certs/aggregator/tls.crt"],"proxy-client-key-file":["/etc/kubernetes/certs/aggregator/tls.key"],"requestheader-allowed-names":["kube-apiserver-proxy","system:kube-apiserver-proxy","system:openshift-aggregator"],"requestheader-client-ca-file":["/etc/kubernetes/certs/aggregator-ca/ca.crt"],"requestheader-extra-headers-prefix":["X-Remote-Extra-"],"requestheader-group-headers":["X-Remote-Group"],"requestheader-username-headers":["X-Remote-User"],"runtime-config":["admissionregistration.k8s.io/v1beta1=true"],"service-account-issuer":["https://test-oidc-bucket.s3.us-east-1.amazonaws.com/test-cluster"],"service-account-jwks-uri":["https://test-oidc-bucket.s3.us-east-1.amazonaws.com/test-cluster/openid/v1/jwks"],"service-account-lookup":["true"],"service-account-signing-key-file":["/etc/kubernetes/secrets/svcacct-key/service-account.key"],"service-node-port-range":["30000-32767"],"shutdown-delay-duration":["70s"],"shutdown-send-retry-after":["true"],"shutdown-watch-termination-grace-period":["25s"],"storage-backend":["etcd3"],"storage-media-type":["application/vnd.kubernetes.protobuf"],"strict-transport-security-directives":["max-age=31536000,includeSubDomains,preload"],"tls-cert-file":["/etc/kubernetes/certs/server/tls.crt"],"tls-private-key-file":["/etc/kubernetes/certs/server/tls.key"]},"minimumKubeletVersion":""}' +kind: ConfigMap +metadata: + name: kas-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_egress_selector_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_egress_selector_config_configmap.yaml new file mode 100644 index 000000000000..ec3edf0152f4 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kas_egress_selector_config_configmap.yaml @@ -0,0 +1,34 @@ +apiVersion: v1 +data: + config.yaml: | + apiVersion: apiserver.k8s.io/v1beta1 + egressSelections: + - connection: + proxyProtocol: Direct + name: controlplane + - connection: + proxyProtocol: Direct + name: etcd + - connection: + proxyProtocol: HTTPConnect + transport: + tcp: + tlsConfig: + caBundle: /etc/kubernetes/certs/konnectivity-ca/ca.crt + clientCert: /etc/kubernetes/certs/konnectivity-client/tls.crt + clientKey: /etc/kubernetes/certs/konnectivity-client/tls.key + url: https://konnectivity-server-local:8090 + name: cluster + kind: EgressSelectorConfiguration +kind: ConfigMap +metadata: + name: kas-egress-selector-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_server_local_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_server_local_service.yaml new file mode 100644 index 000000000000..0ebfb14f6e7a --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_konnectivity_server_local_service.yaml @@ -0,0 +1,23 @@ +apiVersion: v1 +kind: Service +metadata: + name: konnectivity-server-local + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - port: 8090 + protocol: TCP + targetPort: 8090 + selector: + app: kube-apiserver + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_controlplanecomponent.yaml new file mode 100644 index 000000000000..8e6b5ff02f9f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_controlplanecomponent.yaml @@ -0,0 +1,75 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: kube-apiserver + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: kube-apiserver Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment kube-apiserver rollout to finish: 0 out of 3 + new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: kas-audit-config + - group: "" + kind: ConfigMap + name: auth-config + - group: "" + kind: Secret + name: kas-authentication-token-webhook-config + - group: "" + kind: Secret + name: aws-pod-identity-webhook-kubeconfig + - group: "" + kind: Secret + name: bootstrap-kubeconfig + - group: "" + kind: Secret + name: -kubeconfig + - group: "" + kind: ConfigMap + name: kas-egress-selector-config + - group: "" + kind: Secret + name: admin-kubeconfig + - group: "" + kind: Secret + name: hcco-kubeconfig + - group: "" + kind: Secret + name: kas-bootstrap-container-kubeconfig + - group: "" + kind: ConfigMap + name: kas-config + - group: "" + kind: Service + name: konnectivity-server-local + - group: "" + kind: Secret + name: localhost-kubeconfig + - group: "" + kind: ConfigMap + name: oauth-metadata + - group: policy + kind: PodDisruptionBudget + name: kube-apiserver + - group: monitoring.coreos.com + kind: PrometheusRule + name: recording-rules + - group: "" + kind: Secret + name: service-network-admin-kubeconfig + - group: monitoring.coreos.com + kind: ServiceMonitor + name: kube-apiserver diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_deployment.yaml new file mode 100644 index 000000000000..92d2cb6cdef7 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_deployment.yaml @@ -0,0 +1,602 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: kube-apiserver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 3 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: kube-apiserver + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: bootstrap-manifests,logs,tmp-dir + component.hypershift.openshift.io/config-hash: 0fd3eed819dc307e1d8949e2360eec75741638a5741638a5741638a5741638a5794dc8cc8b110e88a2a4098ca2a4098ce7e69167 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: kube-apiserver + hypershift.openshift.io/control-plane-component: kube-apiserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/request-serving-component: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: kube-apiserver + hypershift.openshift.io/control-plane-component: kube-apiserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/request-serving-component: "true" + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: kube-apiserver + hypershift.openshift.io/control-plane-component: kube-apiserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/request-serving-component: "true" + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - kube-apiserver + - --openshift-config=/etc/kubernetes/config/config.json + - --v=2 + command: + - hyperkube + env: + - name: HOST_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + image: hyperkube + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 6 + httpGet: + path: livez?exclude=etcd + port: client + scheme: HTTPS + initialDelaySeconds: 300 + periodSeconds: 180 + successThreshold: 1 + timeoutSeconds: 160 + name: kube-apiserver + ports: + - containerPort: 6443 + name: client + protocol: TCP + readinessProbe: + failureThreshold: 18 + httpGet: + path: readyz + port: client + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + resources: + requests: + cpu: 350m + memory: 2Gi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/certs/aggregator-ca + name: aggregator-ca + - mountPath: /etc/kubernetes/certs/aggregator + name: aggregator-crt + - mountPath: /etc/kubernetes/audit + name: audit-config + - mountPath: /etc/kubernetes/auth + name: auth-config + - mountPath: /etc/kubernetes/auth-token-webhook + name: auth-token-webhook-config + - mountPath: /etc/kubernetes/certs/client-ca + name: client-ca + - mountPath: /etc/kubernetes/egress-selector + name: egress-selector-config + - mountPath: /etc/kubernetes/certs/etcd-ca + name: etcd-ca + - mountPath: /etc/kubernetes/certs/etcd + name: etcd-client-crt + - mountPath: /etc/kubernetes/config + name: kas-config + - mountPath: /etc/kubernetes/certs/konnectivity-ca + name: konnectivity-ca + - mountPath: /etc/kubernetes/certs/konnectivity-client + name: konnectivity-client + - mountPath: /etc/kubernetes/certs/kubelet-ca + name: kubelet-client-ca + - mountPath: /etc/kubernetes/certs/kubelet + name: kubelet-client-crt + - mountPath: /var/log/kube-apiserver + name: logs + - mountPath: /etc/kubernetes/oauth + name: oauth-metadata + - mountPath: /etc/kubernetes/certs/server + name: server-crt + - mountPath: /etc/kubernetes/certs/server-private + name: server-private-crt + - mountPath: /etc/kubernetes/secrets/svcacct-key + name: svcacct-key + - mountPath: /tmp + name: tmp-dir + workingDir: /var/log/kube-apiserver + - command: + - /usr/bin/control-plane-operator + - kas-bootstrap + - --resources-path + - /work + env: + - name: KUBECONFIG + value: /var/secrets/kas-bootstrap-container-kubeconfig/kubeconfig + - name: KUBECONFIG_ADMIN + value: /var/secrets/localhost-kubeconfig/kubeconfig + image: controlplane-operator + imagePullPolicy: IfNotPresent + name: bootstrap + resources: + requests: + cpu: 10m + memory: 10Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /work + name: bootstrap-manifests + - mountPath: /var/secrets/localhost-kubeconfig + name: localhost-kubeconfig + - mountPath: /var/secrets/kas-bootstrap-container-kubeconfig + name: kas-bootstrap-container-kubeconfig + - mountPath: /tmp + name: tmp-dir + - args: + - --logtostderr=true + - --log-file-max-size=0 + - --cluster-cert + - /etc/konnectivity/cluster/tls.crt + - --cluster-key + - /etc/konnectivity/cluster/tls.key + - --cluster-ca-cert + - /etc/konnectivity/ca/ca.crt + - --server-cert + - /etc/konnectivity/server/tls.crt + - --server-key + - /etc/konnectivity/server/tls.key + - --server-ca-cert + - /etc/konnectivity/ca/ca.crt + - --server-port + - "8090" + - --agent-port + - "8091" + - --health-port + - "2041" + - --admin-port=8093 + - --mode=http-connect + - --proxy-strategies=destHost,defaultRoute + - --keepalive-time + - 30s + - --frontend-keepalive-time + - 30s + - --server-count + - "3" + - --tls-min-version=VersionTLS12 + - --cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + command: + - /usr/bin/proxy-server + image: apiserver-network-proxy + imagePullPolicy: IfNotPresent + lifecycle: + preStop: + exec: + command: + - /bin/sh + - -c + - sleep 70 + livenessProbe: + failureThreshold: 3 + httpGet: + path: healthz + port: 2041 + scheme: HTTP + initialDelaySeconds: 120 + periodSeconds: 60 + successThreshold: 1 + timeoutSeconds: 30 + name: konnectivity-server + readinessProbe: + failureThreshold: 3 + httpGet: + path: healthz + port: 2041 + scheme: HTTP + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/konnectivity/cluster + name: cluster-certs + - mountPath: /etc/konnectivity/ca + name: konnectivity-ca + - mountPath: /etc/konnectivity/server + name: server-certs + - mountPath: /tmp + name: tmp-dir + - args: + - -c + - | + set -o errexit + set -o nounset + set -o pipefail + + function cleanup() { + pkill -P $$$ + wait + exit + } + trap cleanup SIGTERM + + /usr/bin/tail -c+1 -F /var/log/kube-apiserver/audit.log & + wait $! + command: + - /bin/bash + image: cli + imagePullPolicy: IfNotPresent + name: audit-logs + resources: + requests: + cpu: 5m + memory: 10Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/log/kube-apiserver + name: logs + - mountPath: /tmp + name: tmp-dir + - command: + - /usr/bin/aws-pod-identity-webhook + - --annotation-prefix=eks.amazonaws.com + - --in-cluster=false + - --kubeconfig=/var/run/app/kubeconfig/kubeconfig + - --logtostderr + - --port=4443 + - --aws-default-region= + - --tls-cert=/var/run/app/certs/tls.crt + - --tls-key=/var/run/app/certs/tls.key + - --token-audience=openshift + - --tls-min-version=VersionTLS12 + - --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + image: aws-pod-identity-webhook + imagePullPolicy: IfNotPresent + name: aws-pod-identity-webhook + resources: + requests: + cpu: 10m + memory: 25Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/app/certs + name: aws-pod-identity-webhook-serving-certs + - mountPath: /var/run/app/kubeconfig + name: aws-pod-identity-webhook-kubeconfig + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /bin/sh + - -c + - 'echo ''Image for kube-apiserver pre-pulled: hyperkube''; exit 0' + image: hyperkube + imagePullPolicy: IfNotPresent + name: pre-pull-image-kube-apiserver + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + - args: + - -c + - | + #!/bin/sh + cd /tmp + mkdir input output manifests + + touch /tmp/manifests/99_feature-gate.yaml + cat </tmp/manifests/99_feature-gate.yaml + $(FEATURE_GATE_YAML) + EOF + + touch /tmp/manifests/hcco-rolebinding.yaml + cat </tmp/manifests/hcco-rolebinding.yaml + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRoleBinding + metadata: + name: hcco-cluster-admin + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin + subjects: + - apiGroup: rbac.authorization.k8s.io + kind: User + name: system:hosted-cluster-config + EOF + + touch /tmp/manifests/00_kas-bootstrap-container-rolebinding.yaml + cat </tmp/manifests/00_kas-bootstrap-container-rolebinding.yaml + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRoleBinding + metadata: + name: kas-bootstrap-container-cluster-admin + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin + subjects: + - apiGroup: rbac.authorization.k8s.io + kind: User + name: system:kas-bootstrap-container + EOF + + /usr/bin/render \ + --asset-output-dir /tmp/output \ + --rendered-manifest-dir=/tmp/manifests \ + --cluster-profile=ibm-cloud-managed \ + --payload-version=$(PAYLOAD_VERSION) + cp /tmp/output/manifests/* /work + cp /tmp/manifests/* /work + command: + - /bin/bash + env: + - name: PAYLOAD_VERSION + value: 4.18.0 + - name: FEATURE_GATE_YAML + value: | + apiVersion: config.openshift.io/v1 + kind: FeatureGate + metadata: + name: cluster + spec: {} + status: + featureGates: null + image: cluster-config-api + imagePullPolicy: IfNotPresent + name: init-bootstrap-render + resources: + requests: + cpu: 30m + memory: 50Mi + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /work + name: bootstrap-manifests + - args: + - -c + - | + #!/bin/sh + cd /tmp + mkdir input output manifests + + /usr/bin/authentication-operator render \ + --asset-output-dir /tmp/output \ + --rendered-manifest-dir=/tmp/manifests \ + --cluster-profile=ibm-cloud-managed \ + --payload-version=$(PAYLOAD_VERSION) + + cp /tmp/output/* /work + command: + - /bin/bash + env: + - name: PAYLOAD_VERSION + value: 4.18.0 + - name: FEATURE_GATE_YAML + value: | + apiVersion: config.openshift.io/v1 + kind: FeatureGate + metadata: + name: cluster + spec: {} + status: + featureGates: null + image: cluster-authentication-operator + imagePullPolicy: IfNotPresent + name: init-auth-bootstrap-render + resources: + requests: + cpu: 30m + memory: 50Mi + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /work + name: bootstrap-manifests + - args: + - -c + - | + #!/bin/sh + while ! nslookup etcd-client.$(POD_NAMESPACE).svc; do sleep 1; done + command: + - /bin/bash + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: cli + imagePullPolicy: IfNotPresent + name: wait-for-etcd + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + priorityClassName: hypershift-api-critical + schedulerName: default-scheduler + terminationGracePeriodSeconds: 135 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: bootstrap-manifests + - name: localhost-kubeconfig + secret: + defaultMode: 416 + secretName: localhost-kubeconfig + - name: kas-bootstrap-container-kubeconfig + secret: + defaultMode: 416 + secretName: kas-bootstrap-container-kubeconfig + - emptyDir: {} + name: logs + - configMap: + defaultMode: 420 + name: kas-config + name: kas-config + - configMap: + defaultMode: 420 + name: auth-config + name: auth-config + - configMap: + defaultMode: 420 + name: kas-audit-config + name: audit-config + - configMap: + defaultMode: 420 + name: konnectivity-ca-bundle + name: konnectivity-ca + - name: server-crt + secret: + defaultMode: 416 + secretName: kas-server-crt + - name: server-private-crt + secret: + defaultMode: 416 + secretName: kas-server-private-crt + - name: aggregator-crt + secret: + defaultMode: 416 + secretName: kas-aggregator-crt + - configMap: + defaultMode: 420 + name: aggregator-client-ca + name: aggregator-ca + - name: svcacct-key + secret: + defaultMode: 416 + secretName: sa-signing-key + - configMap: + defaultMode: 420 + name: etcd-ca + name: etcd-ca + - name: etcd-client-crt + secret: + defaultMode: 416 + secretName: etcd-client-tls + - configMap: + defaultMode: 420 + name: oauth-metadata + name: oauth-metadata + - name: auth-token-webhook-config + secret: + defaultMode: 416 + secretName: kas-authentication-token-webhook-config + - configMap: + defaultMode: 420 + name: client-ca + name: client-ca + - name: kubelet-client-crt + secret: + defaultMode: 416 + secretName: kas-kubelet-client-crt + - configMap: + defaultMode: 420 + name: client-ca + name: kubelet-client-ca + - name: konnectivity-client + secret: + defaultMode: 416 + secretName: konnectivity-client + - configMap: + defaultMode: 420 + name: kas-egress-selector-config + name: egress-selector-config + - name: kubeconfig + secret: + defaultMode: 416 + secretName: localhost-kubeconfig + - name: server-certs + secret: + defaultMode: 416 + secretName: konnectivity-server + - name: cluster-certs + secret: + defaultMode: 416 + secretName: konnectivity-cluster + - name: aws-pod-identity-webhook-serving-certs + secret: + defaultMode: 416 + secretName: aws-pod-identity-webhook-serving-cert + - name: aws-pod-identity-webhook-kubeconfig + secret: + defaultMode: 416 + secretName: aws-pod-identity-webhook-kubeconfig + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_poddisruptionbudget.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_poddisruptionbudget.yaml new file mode 100644 index 000000000000..3fc9ea0e0c03 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_poddisruptionbudget.yaml @@ -0,0 +1,23 @@ +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: kube-apiserver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + selector: + matchLabels: + app: kube-apiserver + unhealthyPodEvictionPolicy: AlwaysAllow +status: + currentHealthy: 0 + desiredHealthy: 0 + disruptionsAllowed: 0 + expectedPods: 0 diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_servicemonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_servicemonitor.yaml new file mode 100644 index 000000000000..76077e0e3314 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_apiserver_servicemonitor.yaml @@ -0,0 +1,94 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + hypershift.openshift.io/metrics-endpoint: https + hypershift.openshift.io/metrics-job: apiserver + hypershift.openshift.io/metrics-namespace: default + hypershift.openshift.io/metrics-service: kubernetes + name: kube-apiserver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + endpoints: + - metricRelabelings: + - action: drop + regex: etcd_(debugging|disk|server).* + sourceLabels: + - __name__ + - action: drop + regex: apiserver_admission_controller_admission_latencies_seconds_.* + sourceLabels: + - __name__ + - action: drop + regex: apiserver_admission_step_admission_latencies_seconds_.* + sourceLabels: + - __name__ + - action: drop + regex: scheduler_(e2e_scheduling_latency_microseconds|scheduling_algorithm_predicate_evaluation|scheduling_algorithm_priority_evaluation|scheduling_algorithm_preemption_evaluation|scheduling_algorithm_latency_microseconds|binding_latency_microseconds|scheduling_latency_seconds) + sourceLabels: + - __name__ + - action: drop + regex: apiserver_(request_count|request_latencies|request_latencies_summary|dropped_requests|storage_data_key_generation_latencies_microseconds|storage_transformation_failures_total|storage_transformation_latencies_microseconds|proxy_tunnel_sync_latency_secs) + sourceLabels: + - __name__ + - action: drop + regex: docker_(operations|operations_latency_microseconds|operations_errors|operations_timeout) + sourceLabels: + - __name__ + - action: drop + regex: reflector_(items_per_list|items_per_watch|list_duration_seconds|lists_total|short_watches_total|watch_duration_seconds|watches_total) + sourceLabels: + - __name__ + - action: drop + regex: etcd_(helper_cache_hit_count|helper_cache_miss_count|helper_cache_entry_count|request_cache_get_latencies_summary|request_cache_add_latencies_summary|request_latencies_summary) + sourceLabels: + - __name__ + - action: drop + regex: transformation_(transformation_latencies_microseconds|failures_total) + sourceLabels: + - __name__ + - action: drop + regex: network_plugin_operations_latency_microseconds|sync_proxy_rules_latency_microseconds|rest_client_request_latency_seconds + sourceLabels: + - __name__ + - action: drop + regex: apiserver_request_duration_seconds_bucket;(0.15|0.25|0.3|0.35|0.4|0.45|0.6|0.7|0.8|0.9|1.25|1.5|1.75|2.5|3|3.5|4.5|6|7|8|9|15|25|30|50)(\.0)? + sourceLabels: + - __name__ + - le + - action: replace + replacement: "" + targetLabel: _id + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + targetPort: client + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: + secret: + key: tls.crt + name: metrics-client + keySecret: + key: tls.key + name: metrics-client + serverName: kube-apiserver + namespaceSelector: + matchNames: + - hcp-namespace + selector: + matchLabels: + app: kube-apiserver diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubeconfig_secret.yaml new file mode 100644 index 000000000000..09459c72e822 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubeconfig_secret.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +data: + value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBabUZyWlE9PQogICAgc2VydmVyOiBodHRwczovL2t1YmUtYXBpc2VydmVyOjY0NDMKICBuYW1lOiBjbHVzdGVyCmNvbnRleHRzOgotIGNvbnRleHQ6CiAgICBjbHVzdGVyOiBjbHVzdGVyCiAgICBuYW1lc3BhY2U6IGRlZmF1bHQKICAgIHVzZXI6IGFkbWluCiAgbmFtZTogYWRtaW4KY3VycmVudC1jb250ZXh0OiBhZG1pbgpraW5kOiBDb25maWcKdXNlcnM6Ci0gbmFtZTogYWRtaW4KICB1c2VyOgogICAgY2xpZW50LWNlcnRpZmljYXRlLWRhdGE6IFptRnJaUT09CiAgICBjbGllbnQta2V5LWRhdGE6IFptRnJaUT09Cg== +kind: Secret +metadata: + labels: + cluster.x-k8s.io/cluster-name: "" + hypershift.openshift.io/kubeconfig: capi + name: -kubeconfig + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_localhost_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_localhost_kubeconfig_secret.yaml new file mode 100644 index 000000000000..58d2a14ca8f6 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_localhost_kubeconfig_secret.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +data: + kubeconfig: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBabUZyWlE9PQogICAgc2VydmVyOiBodHRwczovL2xvY2FsaG9zdDo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgbmFtZXNwYWNlOiBkZWZhdWx0CiAgICB1c2VyOiBhZG1pbgogIG5hbWU6IGFkbWluCmN1cnJlbnQtY29udGV4dDogYWRtaW4Ka2luZDogQ29uZmlnCnVzZXJzOgotIG5hbWU6IGFkbWluCiAgdXNlcjoKICAgIGNsaWVudC1jZXJ0aWZpY2F0ZS1kYXRhOiBabUZyWlE9PQogICAgY2xpZW50LWtleS1kYXRhOiBabUZyWlE9PQo= +kind: Secret +metadata: + labels: + hypershift.openshift.io/kubeconfig: local + name: localhost-kubeconfig + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_metadata_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_metadata_configmap.yaml new file mode 100644 index 000000000000..632258f6f90e --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_metadata_configmap.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +data: + oauthMetadata.json: '{"authorization_endpoint":"https://:0/oauth/authorize","code_challenge_methods_supported":["plain","S256"],"grant_types_supported":["authorization_code","implicit"],"issuer":"https://:0","response_types_supported":["code","token"],"scopes_supported":["user:check-access","user:full","user:info","user:list-projects","user:list-scoped-projects"],"token_endpoint":"https://:0/oauth/token"}' +kind: ConfigMap +metadata: + name: oauth-metadata + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_recording_rules_prometheusrule.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_recording_rules_prometheusrule.yaml new file mode 100644 index 000000000000..822d0d01697f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_recording_rules_prometheusrule.yaml @@ -0,0 +1,61 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: recording-rules + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + groups: + - name: hypershift.rules + rules: + - expr: sum by (instance) (apiserver_storage_objects) + labels: + _id: "" + record: instance:etcd_object_counts:sum + - expr: sum(rate(apiserver_request_total{job="apiserver"}[10m])) BY (code) + labels: + _id: "" + record: code:apiserver_request_total:rate:sum + - expr: | + max_over_time(sum(apiserver_current_inflight_requests{apiserver=~"openshift-apiserver|kube-apiserver"}) by (apiserver,request_kind)[2m:]) + labels: + _id: "" + record: cluster:apiserver_current_inflight_requests:sum:max_over_time:2m + - expr: sum by(plugin_name, volume_mode)(pv_collector_total_pv_count) + labels: + _id: "" + record: cluster:kube_persistentvolume_plugin_type_counts:sum + - expr: sum by (instance) (etcd_mvcc_db_total_size_in_bytes{job=~"etcd.*"}) + labels: + _id: "" + record: instance:etcd_mvcc_db_total_size_in_bytes:sum + - expr: histogram_quantile(0.99, sum by (instance, le) (rate(etcd_disk_wal_fsync_duration_seconds_bucket{job=~"etcd.*"}[5m]))) + labels: + _id: "" + quantile: "0.99" + record: instance:etcd_disk_wal_fsync_duration_seconds:histogram_quantile + - expr: histogram_quantile(0.99, sum by (instance, le) (rate(etcd_network_peer_round_trip_time_seconds_bucket{job=~"etcd.*"}[5m]))) + labels: + _id: "" + quantile: "0.99" + record: instance:etcd_network_peer_round_trip_time_seconds:histogram_quantile + - expr: sum by (instance) (etcd_mvcc_db_total_size_in_use_in_bytes{job=~"etcd.*"}) + labels: + _id: "" + record: instance:etcd_mvcc_db_total_size_in_use_in_bytes:sum + - expr: histogram_quantile(0.99, sum by (instance, le) (rate(etcd_disk_backend_commit_duration_seconds_bucket{job=~"etcd.*"}[5m]))) + labels: + _id: "" + quantile: "0.99" + record: instance:etcd_disk_backend_commit_duration_seconds:histogram_quantile + - expr: count by (_id) (nto_profile_calculated_total{profile!~"openshift-node",profile!~"openshift-control-plane",profile!~"openshift"}) + labels: + _id: "" + record: nto_custom_profiles:count diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_service_network_admin_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_service_network_admin_kubeconfig_secret.yaml new file mode 100644 index 000000000000..7cacf729e659 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_service_network_admin_kubeconfig_secret.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +data: + kubeconfig: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBabUZyWlE9PQogICAgc2VydmVyOiBodHRwczovL2t1YmUtYXBpc2VydmVyOjY0NDMKICBuYW1lOiBjbHVzdGVyCmNvbnRleHRzOgotIGNvbnRleHQ6CiAgICBjbHVzdGVyOiBjbHVzdGVyCiAgICBuYW1lc3BhY2U6IGRlZmF1bHQKICAgIHVzZXI6IGFkbWluCiAgbmFtZTogYWRtaW4KY3VycmVudC1jb250ZXh0OiBhZG1pbgpraW5kOiBDb25maWcKdXNlcnM6Ci0gbmFtZTogYWRtaW4KICB1c2VyOgogICAgY2xpZW50LWNlcnRpZmljYXRlLWRhdGE6IFptRnJaUT09CiAgICBjbGllbnQta2V5LWRhdGE6IFptRnJaUT09Cg== +kind: Secret +metadata: + labels: + hypershift.openshift.io/kubeconfig: service + name: service-network-admin-kubeconfig + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kcm_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kcm_config_configmap.yaml new file mode 100644 index 000000000000..e825465b315c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kcm_config_configmap.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +data: + config.json: | + apiVersion: kubecontrolplane.config.openshift.io/v1 + extendedArguments: + leader-elect: + - "true" + leader-elect-renew-deadline: + - 12s + leader-elect-retry-period: + - 3s + kind: KubeControllerManagerConfig + projectConfig: + defaultNodeSelector: "" + serviceServingCert: + certFile: "" +kind: ConfigMap +metadata: + name: kcm-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_controlplanecomponent.yaml new file mode 100644 index 000000000000..16a5e5c2a4b5 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_controlplanecomponent.yaml @@ -0,0 +1,36 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: kube-controller-manager + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: kube-controller-manager Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment kube-controller-manager rollout to finish: 0 + out of 2 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: kcm-config + - group: "" + kind: Secret + name: kube-controller-manager-kubeconfig + - group: "" + kind: ConfigMap + name: recycler-config + - group: "" + kind: Service + name: kube-controller-manager + - group: monitoring.coreos.com + kind: ServiceMonitor + name: kube-controller-manager diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_deployment.yaml new file mode 100644 index 000000000000..e9b07a2f1e57 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_deployment.yaml @@ -0,0 +1,330 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: kube-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 2 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: kube-controller-manager + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: logs,certs,tmp-dir + component.hypershift.openshift.io/config-hash: 1252551487ecf31a87ecf31ab4d55cfed6265674 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: kube-controller-manager + hypershift.openshift.io/control-plane-component: kube-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: kube-controller-manager + hypershift.openshift.io/control-plane-component: kube-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: kube-controller-manager + hypershift.openshift.io/control-plane-component: kube-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - --openshift-config=/etc/kubernetes/config/config.json + - --kubeconfig=/etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + - --authentication-kubeconfig=/etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + - --authorization-kubeconfig=/etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + - --cert-dir=/var/run/kubernetes + - --cluster-signing-cert-file=/etc/kubernetes/certs/cluster-signer/ca.crt + - --cluster-signing-key-file=/etc/kubernetes/certs/cluster-signer/ca.key + - --configure-cloud-routes=false + - --controllers=* + - --controllers=-ttl + - --controllers=-bootstrapsigner + - --controllers=-tokencleaner + - --controllers=selinux-warning-controller + - --enable-dynamic-provisioning=true + - --flex-volume-plugin-dir=/etc/kubernetes/kubelet-plugins/volume/exec + - --pv-recycler-pod-template-filepath-nfs=/etc/kubernetes/recycler-config/recycler-pod.yaml + - --kube-api-burst=300 + - --kube-api-qps=150 + - --leader-elect-resource-lock=leases + - --leader-elect=true + - --leader-elect-renew-deadline=12s + - --leader-elect-retry-period=3s + - --root-ca-file=/etc/kubernetes/certs/root-ca/ca.crt + - --secure-port=10257 + - --service-account-private-key-file=/etc/kubernetes/certs/service-signer/service-account.key + - --use-service-account-credentials=true + - --cluster-signing-duration=17520h + - --tls-cert-file=/etc/kubernetes/certs/server/tls.crt + - --tls-private-key-file=/etc/kubernetes/certs/server/tls.key + - --terminated-pod-gc-threshold=1000 + - --concurrent-gc-syncs=5 + - --cluster-cidr=10.132.0.0/14 + - --service-cluster-ip-range= + - --allocate-node-cidrs=false + - --node-monitor-grace-period=50s + - --tls-min-version=VersionTLS12 + - --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + - --feature-gates=AWSEFSDriverVolumeMetrics=true + - --feature-gates=AdditionalRoutingCapabilities=true + - --feature-gates=AdminNetworkPolicy=true + - --feature-gates=AlibabaPlatform=true + - --feature-gates=AzureWorkloadIdentity=true + - --feature-gates=BareMetalLoadBalancer=true + - --feature-gates=BuildCSIVolumes=true + - --feature-gates=ChunkSizeMiB=true + - --feature-gates=CloudDualStackNodeIPs=true + - --feature-gates=DisableKubeletCloudCredentialProviders=true + - --feature-gates=ExternalOIDC=true + - --feature-gates=GCPLabelsTags=true + - --feature-gates=HardwareSpeed=true + - --feature-gates=IngressControllerLBSubnetsAWS=true + - --feature-gates=KMSv1=true + - --feature-gates=ManagedBootImages=true + - --feature-gates=ManagedBootImagesAWS=true + - --feature-gates=MultiArchInstallAWS=true + - --feature-gates=MultiArchInstallGCP=true + - --feature-gates=NetworkDiagnosticsConfig=true + - --feature-gates=NetworkLiveMigration=true + - --feature-gates=NetworkSegmentation=true + - --feature-gates=NodeDisruptionPolicy=true + - --feature-gates=OpenShiftPodSecurityAdmission=true + - --feature-gates=PersistentIPsForVirtualization=true + - --feature-gates=PrivateHostedZoneAWS=true + - --feature-gates=SetEIPForNLBIngressController=true + - --feature-gates=VSphereControlPlaneMachineSet=true + - --feature-gates=VSphereDriverConfiguration=true + - --feature-gates=VSphereMultiVCenters=true + - --feature-gates=VSphereStaticIPs=true + - --feature-gates=ValidatingAdmissionPolicy=true + - --feature-gates=AWSClusterHostedDNS=false + - --feature-gates=AutomatedEtcdBackup=false + - --feature-gates=BootcNodeManagement=false + - --feature-gates=CPMSMachineNamePrefix=false + - --feature-gates=ClusterAPIInstall=false + - --feature-gates=ClusterAPIInstallIBMCloud=false + - --feature-gates=ClusterMonitoringConfig=false + - --feature-gates=ClusterVersionOperatorConfiguration=false + - --feature-gates=ConsolePluginContentSecurityPolicy=false + - --feature-gates=DNSNameResolver=false + - --feature-gates=DualReplica=false + - --feature-gates=DyanmicServiceEndpointIBMCloud=false + - --feature-gates=DynamicResourceAllocation=false + - --feature-gates=EtcdBackendQuota=false + - --feature-gates=EventedPLEG=false + - --feature-gates=Example=false + - --feature-gates=Example2=false + - --feature-gates=GCPClusterHostedDNS=false + - --feature-gates=GCPCustomAPIEndpoints=false + - --feature-gates=GatewayAPI=false + - --feature-gates=GatewayAPIController=false + - --feature-gates=HighlyAvailableArbiter=false + - --feature-gates=ImageStreamImportMode=false + - --feature-gates=IngressControllerDynamicConfigurationManager=false + - --feature-gates=InsightsConfig=false + - --feature-gates=InsightsConfigAPI=false + - --feature-gates=InsightsOnDemandDataGather=false + - --feature-gates=InsightsRuntimeExtractor=false + - --feature-gates=KMSEncryptionProvider=false + - --feature-gates=MachineAPIMigration=false + - --feature-gates=MachineAPIOperatorDisableMachineHealthCheckController=false + - --feature-gates=MachineAPIProviderOpenStack=false + - --feature-gates=MachineConfigNodes=false + - --feature-gates=MaxUnavailableStatefulSet=false + - --feature-gates=MetricsCollectionProfiles=false + - --feature-gates=MinimumKubeletVersion=false + - --feature-gates=MixedCPUsAllocation=false + - --feature-gates=MultiArchInstallAzure=false + - --feature-gates=NewOLM=false + - --feature-gates=NewOLMCatalogdAPIV1Metas=false + - --feature-gates=NodeSwap=false + - --feature-gates=NutanixMultiSubnets=false + - --feature-gates=OVNObservability=false + - --feature-gates=OnClusterBuild=false + - --feature-gates=PinnedImages=false + - --feature-gates=PlatformOperators=false + - --feature-gates=ProcMountType=false + - --feature-gates=RouteAdvertisements=false + - --feature-gates=RouteExternalCertificate=false + - --feature-gates=SELinuxChangePolicy=false + - --feature-gates=SELinuxMount=false + - --feature-gates=ServiceAccountTokenNodeBinding=false + - --feature-gates=ShortCertRotation=false + - --feature-gates=SignatureStores=false + - --feature-gates=SigstoreImageVerification=false + - --feature-gates=SigstoreImageVerificationPKI=false + - --feature-gates=TranslateStreamCloseWebsocketRequests=false + - --feature-gates=UpgradeStatus=false + - --feature-gates=UserNamespacesPodSecurityStandards=false + - --feature-gates=UserNamespacesSupport=false + - --feature-gates=VSphereConfigurableMaxAllowedBlockVolumesPerNode=false + - --feature-gates=VSphereHostVMGroupZonal=false + - --feature-gates=VSphereMultiDisk=false + - --feature-gates=VSphereMultiNetworks=false + - --feature-gates=VolumeAttributesClass=false + - --feature-gates=VolumeGroupSnapshot=false + command: + - hyperkube + - kube-controller-manager + image: hyperkube + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: healthz + port: 10257 + scheme: HTTPS + initialDelaySeconds: 45 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + name: kube-controller-manager + ports: + - containerPort: 10257 + name: client + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: healthz + port: 10257 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + resources: + requests: + cpu: 100m + memory: 600Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/kubernetes + name: certs + - mountPath: /etc/kubernetes/certs/cluster-signer + name: cluster-signer + - mountPath: /etc/kubernetes/config + name: kcm-config + - mountPath: /etc/kubernetes/secrets/svc-kubeconfig + name: kubeconfig + - mountPath: /var/log/kube-controller-manager + name: logs + - mountPath: /etc/kubernetes/recycler-config + name: recycler-config + - mountPath: /etc/kubernetes/certs/root-ca + name: root-ca + - mountPath: /etc/kubernetes/certs/server + name: server-crt + - mountPath: /etc/kubernetes/certs/service-signer + name: service-signer + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + priorityClassName: hypershift-control-plane + restartPolicy: Always + schedulerName: default-scheduler + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - configMap: + defaultMode: 420 + name: kcm-config + name: kcm-config + - configMap: + defaultMode: 420 + name: root-ca + name: root-ca + - emptyDir: {} + name: logs + - name: kubeconfig + secret: + defaultMode: 416 + secretName: kube-controller-manager-kubeconfig + - name: cluster-signer + secret: + defaultMode: 416 + secretName: cluster-signer-ca + - emptyDir: {} + name: certs + - name: service-signer + secret: + defaultMode: 416 + secretName: sa-signing-key + - name: server-crt + secret: + defaultMode: 416 + secretName: kcm-server + - configMap: + defaultMode: 420 + name: recycler-config + name: recycler-config + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_kubeconfig_secret.yaml new file mode 100644 index 000000000000..cd4b3f8a7661 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_kubeconfig_secret.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +data: + kubeconfig: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBabUZyWlE9PQogICAgc2VydmVyOiBodHRwczovL2t1YmUtYXBpc2VydmVyOjY0NDMKICBuYW1lOiBjbHVzdGVyCmNvbnRleHRzOgotIGNvbnRleHQ6CiAgICBjbHVzdGVyOiBjbHVzdGVyCiAgICBuYW1lc3BhY2U6IGRlZmF1bHQKICAgIHVzZXI6IGFkbWluCiAgbmFtZTogYWRtaW4KY3VycmVudC1jb250ZXh0OiBhZG1pbgpraW5kOiBDb25maWcKdXNlcnM6Ci0gbmFtZTogYWRtaW4KICB1c2VyOiB7fQo= +kind: Secret +metadata: + labels: + hypershift.openshift.io/kubeconfig: service + name: kube-controller-manager-kubeconfig + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_service.yaml new file mode 100644 index 000000000000..c6e03bac1900 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_service.yaml @@ -0,0 +1,29 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: kube-controller-manager + name: kube-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + internalTrafficPolicy: Cluster + ipFamilyPolicy: PreferDualStack + ports: + - name: client + port: 10257 + protocol: TCP + targetPort: client + selector: + app: kube-controller-manager + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_servicemonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_servicemonitor.yaml new file mode 100644 index 000000000000..a19c42b585c4 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_controller_manager_servicemonitor.yaml @@ -0,0 +1,61 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + hypershift.openshift.io/metrics-endpoint: https + hypershift.openshift.io/metrics-job: kube-controller-manager + hypershift.openshift.io/metrics-namespace: openshift-kube-controller-manager + hypershift.openshift.io/metrics-service: kube-controller-manager + name: kube-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + endpoints: + - metricRelabelings: + - action: drop + regex: etcd_(debugging|disk|request|server).* + sourceLabels: + - __name__ + - action: drop + regex: rest_client_request_latency_seconds_(bucket|count|sum) + sourceLabels: + - __name__ + - action: drop + regex: root_ca_cert_publisher_sync_duration_seconds_(bucket|count|sum) + sourceLabels: + - __name__ + - action: replace + replacement: "" + targetLabel: _id + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + targetPort: client + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: + secret: + key: tls.crt + name: metrics-client + keySecret: + key: tls.key + name: metrics-client + serverName: kube-controller-manager + namespaceSelector: + matchNames: + - hcp-namespace + selector: + matchLabels: + app: kube-controller-manager diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_recycler_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_recycler_config_configmap.yaml new file mode 100644 index 000000000000..f92fd4bb9f53 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_recycler_config_configmap.yaml @@ -0,0 +1,46 @@ +apiVersion: v1 +data: + recycler-pod.yaml: | + apiVersion: v1 + kind: Pod + metadata: + name: recycler-pod + namespace: openshift-infra + annotations: + target.workload.openshift.io/management: '{"effect": "PreferredDuringScheduling"}' + spec: + activeDeadlineSeconds: 60 + restartPolicy: Never + serviceAccountName: pv-recycler-controller + containers: + - name: recycler-container + image: tools + command: + - "/bin/bash" + args: + - "-c" + - "test -e /scrub && rm -rf /scrub/..?* /scrub/.[!.]* /scrub/* && test -z \"$(ls -A /scrub)\" || exit 1" + volumeMounts: + - mountPath: /scrub + name: vol + securityContext: + runAsUser: 0 + priorityClassName: openshift-user-critical + resources: + requests: + memory: 50Mi + cpu: 10m + volumes: + - name: vol +kind: ConfigMap +metadata: + name: recycler-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_configmap.yaml new file mode 100644 index 000000000000..27e253d6df54 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_configmap.yaml @@ -0,0 +1,35 @@ +apiVersion: v1 +data: + config.json: | + { + "kind": "KubeSchedulerConfiguration", + "apiVersion": "kubescheduler.config.k8s.io/v1", + "leaderElection": { + "leaderElect": true, + "leaseDuration": "2m17s", + "renewDeadline": "1m47s", + "retryPeriod": "26s", + "resourceLock": "", + "resourceName": "", + "resourceNamespace": "" + }, + "clientConnection": { + "kubeconfig": "/etc/kubernetes/kubeconfig/kubeconfig", + "acceptContentTypes": "", + "contentType": "", + "qps": 0, + "burst": 0 + } + } +kind: ConfigMap +metadata: + name: kube-scheduler + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_controlplanecomponent.yaml new file mode 100644 index 000000000000..5aea35dd97af --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_controlplanecomponent.yaml @@ -0,0 +1,33 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: kube-scheduler + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: kube-scheduler Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment kube-scheduler rollout to finish: 0 out of 2 + new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: kube-scheduler + - group: "" + kind: Secret + name: kube-scheduler-kubeconfig + - group: "" + kind: Service + name: kube-scheduler + - group: monitoring.coreos.com + kind: ServiceMonitor + name: kube-scheduler diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_deployment.yaml new file mode 100644 index 000000000000..4cfcd4435ea3 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_deployment.yaml @@ -0,0 +1,259 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: kube-scheduler + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 2 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: kube-scheduler + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: 022a8a3ab4d55cfe + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: kube-scheduler + hypershift.openshift.io/control-plane-component: kube-scheduler + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: kube-scheduler + hypershift.openshift.io/control-plane-component: kube-scheduler + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: kube-scheduler + hypershift.openshift.io/control-plane-component: kube-scheduler + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - --config=/etc/kubernetes/config/config.json + - --tls-cert-file=/etc/kubernetes/certs/tls.crt + - --tls-private-key-file=/etc/kubernetes/certs/tls.key + - --secure-port=10259 + - --authentication-kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + - --authorization-kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + - -v=2 + - --tls-min-version=VersionTLS12 + - --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + - --feature-gates=AWSEFSDriverVolumeMetrics=true + - --feature-gates=AdditionalRoutingCapabilities=true + - --feature-gates=AdminNetworkPolicy=true + - --feature-gates=AlibabaPlatform=true + - --feature-gates=AzureWorkloadIdentity=true + - --feature-gates=BareMetalLoadBalancer=true + - --feature-gates=BuildCSIVolumes=true + - --feature-gates=ChunkSizeMiB=true + - --feature-gates=CloudDualStackNodeIPs=true + - --feature-gates=DisableKubeletCloudCredentialProviders=true + - --feature-gates=ExternalOIDC=true + - --feature-gates=GCPLabelsTags=true + - --feature-gates=HardwareSpeed=true + - --feature-gates=IngressControllerLBSubnetsAWS=true + - --feature-gates=KMSv1=true + - --feature-gates=ManagedBootImages=true + - --feature-gates=ManagedBootImagesAWS=true + - --feature-gates=MultiArchInstallAWS=true + - --feature-gates=MultiArchInstallGCP=true + - --feature-gates=NetworkDiagnosticsConfig=true + - --feature-gates=NetworkLiveMigration=true + - --feature-gates=NetworkSegmentation=true + - --feature-gates=NodeDisruptionPolicy=true + - --feature-gates=OpenShiftPodSecurityAdmission=true + - --feature-gates=PersistentIPsForVirtualization=true + - --feature-gates=PrivateHostedZoneAWS=true + - --feature-gates=SetEIPForNLBIngressController=true + - --feature-gates=VSphereControlPlaneMachineSet=true + - --feature-gates=VSphereDriverConfiguration=true + - --feature-gates=VSphereMultiVCenters=true + - --feature-gates=VSphereStaticIPs=true + - --feature-gates=ValidatingAdmissionPolicy=true + - --feature-gates=AWSClusterHostedDNS=false + - --feature-gates=AutomatedEtcdBackup=false + - --feature-gates=BootcNodeManagement=false + - --feature-gates=CPMSMachineNamePrefix=false + - --feature-gates=ClusterAPIInstall=false + - --feature-gates=ClusterAPIInstallIBMCloud=false + - --feature-gates=ClusterMonitoringConfig=false + - --feature-gates=ClusterVersionOperatorConfiguration=false + - --feature-gates=ConsolePluginContentSecurityPolicy=false + - --feature-gates=DNSNameResolver=false + - --feature-gates=DualReplica=false + - --feature-gates=DyanmicServiceEndpointIBMCloud=false + - --feature-gates=DynamicResourceAllocation=false + - --feature-gates=EtcdBackendQuota=false + - --feature-gates=EventedPLEG=false + - --feature-gates=Example=false + - --feature-gates=Example2=false + - --feature-gates=GCPClusterHostedDNS=false + - --feature-gates=GCPCustomAPIEndpoints=false + - --feature-gates=GatewayAPI=false + - --feature-gates=GatewayAPIController=false + - --feature-gates=HighlyAvailableArbiter=false + - --feature-gates=ImageStreamImportMode=false + - --feature-gates=IngressControllerDynamicConfigurationManager=false + - --feature-gates=InsightsConfig=false + - --feature-gates=InsightsConfigAPI=false + - --feature-gates=InsightsOnDemandDataGather=false + - --feature-gates=InsightsRuntimeExtractor=false + - --feature-gates=KMSEncryptionProvider=false + - --feature-gates=MachineAPIMigration=false + - --feature-gates=MachineAPIOperatorDisableMachineHealthCheckController=false + - --feature-gates=MachineAPIProviderOpenStack=false + - --feature-gates=MachineConfigNodes=false + - --feature-gates=MaxUnavailableStatefulSet=false + - --feature-gates=MetricsCollectionProfiles=false + - --feature-gates=MinimumKubeletVersion=false + - --feature-gates=MixedCPUsAllocation=false + - --feature-gates=MultiArchInstallAzure=false + - --feature-gates=NewOLM=false + - --feature-gates=NewOLMCatalogdAPIV1Metas=false + - --feature-gates=NodeSwap=false + - --feature-gates=NutanixMultiSubnets=false + - --feature-gates=OVNObservability=false + - --feature-gates=OnClusterBuild=false + - --feature-gates=PinnedImages=false + - --feature-gates=PlatformOperators=false + - --feature-gates=ProcMountType=false + - --feature-gates=RouteAdvertisements=false + - --feature-gates=RouteExternalCertificate=false + - --feature-gates=SELinuxChangePolicy=false + - --feature-gates=SELinuxMount=false + - --feature-gates=ServiceAccountTokenNodeBinding=false + - --feature-gates=ShortCertRotation=false + - --feature-gates=SignatureStores=false + - --feature-gates=SigstoreImageVerification=false + - --feature-gates=SigstoreImageVerificationPKI=false + - --feature-gates=TranslateStreamCloseWebsocketRequests=false + - --feature-gates=UpgradeStatus=false + - --feature-gates=UserNamespacesPodSecurityStandards=false + - --feature-gates=UserNamespacesSupport=false + - --feature-gates=VSphereConfigurableMaxAllowedBlockVolumesPerNode=false + - --feature-gates=VSphereHostVMGroupZonal=false + - --feature-gates=VSphereMultiDisk=false + - --feature-gates=VSphereMultiNetworks=false + - --feature-gates=VolumeAttributesClass=false + - --feature-gates=VolumeGroupSnapshot=false + command: + - hyperkube + - kube-scheduler + image: hyperkube + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 5 + httpGet: + path: /livez + port: 10259 + scheme: HTTPS + initialDelaySeconds: 60 + periodSeconds: 60 + successThreshold: 1 + timeoutSeconds: 5 + name: kube-scheduler + ports: + - containerPort: 10259 + name: client + protocol: TCP + resources: + requests: + cpu: 25m + memory: 150Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/certs + name: serving-cert + - mountPath: /etc/kubernetes/kubeconfig + name: kubeconfig + - mountPath: /etc/kubernetes/config + name: scheduler-config + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - configMap: + defaultMode: 420 + name: kube-scheduler + name: scheduler-config + - name: serving-cert + secret: + defaultMode: 416 + secretName: scheduler-server + - name: kubeconfig + secret: + defaultMode: 416 + secretName: kube-scheduler-kubeconfig + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_kubeconfig_secret.yaml new file mode 100644 index 000000000000..f7066bd26267 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_kubeconfig_secret.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +data: + kubeconfig: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBabUZyWlE9PQogICAgc2VydmVyOiBodHRwczovL2t1YmUtYXBpc2VydmVyOjY0NDMKICBuYW1lOiBjbHVzdGVyCmNvbnRleHRzOgotIGNvbnRleHQ6CiAgICBjbHVzdGVyOiBjbHVzdGVyCiAgICBuYW1lc3BhY2U6IGRlZmF1bHQKICAgIHVzZXI6IGFkbWluCiAgbmFtZTogYWRtaW4KY3VycmVudC1jb250ZXh0OiBhZG1pbgpraW5kOiBDb25maWcKdXNlcnM6Ci0gbmFtZTogYWRtaW4KICB1c2VyOiB7fQo= +kind: Secret +metadata: + labels: + hypershift.openshift.io/kubeconfig: service + name: kube-scheduler-kubeconfig + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_service.yaml new file mode 100644 index 000000000000..27d98cf99d2d --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_service.yaml @@ -0,0 +1,29 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: kube-scheduler + name: kube-scheduler + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + internalTrafficPolicy: Cluster + ipFamilyPolicy: PreferDualStack + ports: + - name: client + port: 10259 + protocol: TCP + targetPort: client + selector: + app: kube-scheduler + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_servicemonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_servicemonitor.yaml new file mode 100644 index 000000000000..99f0a3b282e1 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-scheduler/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_scheduler_servicemonitor.yaml @@ -0,0 +1,73 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + hypershift.openshift.io/metrics-endpoint: https + hypershift.openshift.io/metrics-job: kube-scheduler + hypershift.openshift.io/metrics-namespace: openshift-kube-scheduler + hypershift.openshift.io/metrics-service: kube-scheduler + name: kube-scheduler + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + endpoints: + - metricRelabelings: + - action: replace + replacement: "" + targetLabel: _id + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + targetPort: client + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: + secret: + key: tls.crt + name: metrics-client + keySecret: + key: tls.key + name: metrics-client + serverName: kube-scheduler + - metricRelabelings: + - action: replace + replacement: "" + targetLabel: _id + path: /metrics/resources + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + targetPort: client + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: + secret: + key: tls.crt + name: metrics-client + keySecret: + key: tls.key + name: metrics-client + serverName: kube-scheduler + namespaceSelector: + matchNames: + - hcp-namespace + selector: + matchLabels: + app: kube-scheduler diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-storage-version-migrator/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_storage_version_migrator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-storage-version-migrator/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_storage_version_migrator_controlplanecomponent.yaml new file mode 100644 index 000000000000..3bca5b47ade3 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-storage-version-migrator/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_storage_version_migrator_controlplanecomponent.yaml @@ -0,0 +1,20 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: kube-storage-version-migrator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: kube-storage-version-migrator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment kube-storage-version-migrator rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-storage-version-migrator/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_storage_version_migrator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-storage-version-migrator/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_storage_version_migrator_deployment.yaml new file mode 100644 index 000000000000..56e4c5277e49 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kube-storage-version-migrator/EtcdRestore/zz_fixture_TestControlPlaneComponents_kube_storage_version_migrator_deployment.yaml @@ -0,0 +1,117 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: kube-storage-version-migrator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: kube-storage-version-migrator + strategy: {} + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: kube-storage-version-migrator + hypershift.openshift.io/control-plane-component: kube-storage-version-migrator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - --alsologtostderr + - --v=2 + - --kubeconfig=/etc/kubernetes/kubeconfig + command: + - migrator + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: kube-storage-version-migrator + imagePullPolicy: IfNotPresent + name: migrator + resources: + requests: + cpu: 10m + memory: 200Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes + name: kubeconfig + readOnly: true + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + securityContext: + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_config_configmap.yaml new file mode 100644 index 000000000000..780a8a20faf6 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_config_configmap.yaml @@ -0,0 +1,26 @@ +apiVersion: v1 +data: + cloud-config: | + kubeconfig: "" + loadBalancer: + enabled: true + creationPollInterval: 0 + selectorless: true + instancesV2: + enabled: true + zoneAndRegionEnabled: false + namespace: hcp-namespace + infraLabels: + hypershift.openshift.io/infra-id: "" +kind: ConfigMap +metadata: + name: kubevirt-cloud-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_controlplanecomponent.yaml new file mode 100644 index 000000000000..03b426c673e6 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_controlplanecomponent.yaml @@ -0,0 +1,34 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: kubevirt-cloud-controller-manager + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: kubevirt-cloud-controller-manager Deployment Available condition not + found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment kubevirt-cloud-controller-manager rollout to + finish: 0 out of 2 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: kubevirt-cloud-config + - group: rbac.authorization.k8s.io + kind: Role + name: kubevirt-cloud-controller-manager + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: kubevirt-cloud-controller-manager + - group: "" + kind: ServiceAccount + name: kubevirt-cloud-controller-manager diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_deployment.yaml new file mode 100644 index 000000000000..b84879a1e7e4 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_deployment.yaml @@ -0,0 +1,129 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: kubevirt-cloud-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 2 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: cloud-controller-manager + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: b833e1fe + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: cloud-controller-manager + hypershift.openshift.io/control-plane-component: kubevirt-cloud-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: cloud-controller-manager + hypershift.openshift.io/control-plane-component: kubevirt-cloud-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: cloud-controller-manager + hypershift.openshift.io/control-plane-component: kubevirt-cloud-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: true + containers: + - args: + - --cloud-provider=kubevirt + - --cloud-config=/etc/cloud/cloud-config + - --kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + - --authentication-skip-lookup + - --cluster-name=cluster_name + command: + - /bin/kubevirt-cloud-controller-manager + image: kubevirt-cloud-controller-manager + imagePullPolicy: IfNotPresent + name: cloud-controller-manager + resources: + requests: + cpu: 75m + memory: 60Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/cloud + name: cloud-config + - mountPath: /etc/kubernetes/kubeconfig + name: kubeconfig + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + serviceAccountName: kubevirt-cloud-controller-manager + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - configMap: + defaultMode: 420 + name: kubevirt-cloud-config + name: cloud-config + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_role.yaml new file mode 100644 index 000000000000..736a5d09f4b4 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_role.yaml @@ -0,0 +1,37 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: kubevirt-cloud-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - kubevirt.io + resources: + - virtualmachines + verbs: + - get + - list + - watch +- apiGroups: + - kubevirt.io + resources: + - virtualmachineinstances + verbs: + - get + - list + - watch + - update +- apiGroups: + - "" + resources: + - services + verbs: + - '*' diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_rolebinding.yaml new file mode 100644 index 000000000000..a185d2acb0fe --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: kubevirt-cloud-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: kubevirt-cloud-controller-manager +subjects: +- kind: ServiceAccount + name: kubevirt-cloud-controller-manager + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_serviceaccount.yaml new file mode 100644 index 000000000000..4b26d4cf868a --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_cloud_controller_manager_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: kubevirt-cloud-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_driver_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_driver_config_configmap.yaml new file mode 100644 index 000000000000..5addaa3b7e20 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_driver_config_configmap.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +data: + infraClusterLabels: hypershift.openshift.io/infra-id= + infraClusterNamespace: hcp-namespace + infraStorageClassEnforcement: | + allowDefault: true + allowAll: false +kind: ConfigMap +metadata: + name: driver-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_controller_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_controller_controlplanecomponent.yaml new file mode 100644 index 000000000000..74d54763182f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_controller_controlplanecomponent.yaml @@ -0,0 +1,36 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: kubevirt-csi-controller + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: kubevirt-csi-controller Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment kubevirt-csi-controller rollout to finish: 0 + out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: driver-config + - group: rbac.authorization.k8s.io + kind: Role + name: kubevirt-csi + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: kubevirt-csi + - group: "" + kind: ServiceAccount + name: kubevirt-csi + - group: "" + kind: Secret + name: kubevirt-csi-controller-service-account-kubeconfig diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_controller_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_controller_deployment.yaml new file mode 100644 index 000000000000..4db401485d97 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_controller_deployment.yaml @@ -0,0 +1,250 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: kubevirt-csi-controller + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: kubevirt-csi-driver + strategy: {} + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: socket-dir,tmp-dir + component.hypershift.openshift.io/config-hash: 741638a5741638a5741638a5741638a5 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: kubevirt-csi-driver + hypershift.openshift.io/control-plane-component: kubevirt-csi-controller + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - args: + - --endpoint=$(CSI_ENDPOINT) + - --infra-cluster-namespace=$(INFRACLUSTER_NAMESPACE) + - --tenant-cluster-kubeconfig=/var/run/secrets/tenantcluster/kubeconfig + - --infra-cluster-labels=$(INFRACLUSTER_LABELS) + - --run-node-service=false + - --run-controller-service=true + - --v=5 + env: + - name: CSI_ENDPOINT + value: unix:///var/lib/csi/sockets/pluginproxy/csi.sock + - name: KUBE_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: INFRACLUSTER_NAMESPACE + valueFrom: + configMapKeyRef: + key: infraClusterNamespace + name: driver-config + - name: INFRACLUSTER_LABELS + valueFrom: + configMapKeyRef: + key: infraClusterLabels + name: driver-config + - name: INFRA_STORAGE_CLASS_ENFORCEMENT + valueFrom: + configMapKeyRef: + key: infraStorageClassEnforcement + name: driver-config + image: kubevirt-csi-driver + imagePullPolicy: IfNotPresent + name: csi-driver + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/lib/csi/sockets/pluginproxy/ + name: socket-dir + - mountPath: /var/run/secrets/tenantcluster + name: service-account-kubeconfig + - mountPath: /tmp + name: tmp-dir + - args: + - --csi-address=$(ADDRESS) + - --default-fstype=ext4 + - --v=5 + - --kubeconfig=/var/run/secrets/tenantcluster/kubeconfig + - --timeout=3m + - --retry-interval-max=1m + env: + - name: ADDRESS + value: /var/lib/csi/sockets/pluginproxy/csi.sock + image: csi-external-provisioner + imagePullPolicy: IfNotPresent + name: csi-provisioner + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/lib/csi/sockets/pluginproxy/ + name: socket-dir + - mountPath: /var/run/secrets/tenantcluster + name: service-account-kubeconfig + - mountPath: /tmp + name: tmp-dir + - args: + - --csi-address=$(ADDRESS) + - --v=5 + - --kubeconfig=/var/run/secrets/tenantcluster/kubeconfig + - --timeout=3m + - --retry-interval-max=1m + env: + - name: ADDRESS + value: /var/lib/csi/sockets/pluginproxy/csi.sock + image: csi-external-attacher + imagePullPolicy: IfNotPresent + name: csi-attacher + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/lib/csi/sockets/pluginproxy/ + name: socket-dir + - mountPath: /var/run/secrets/tenantcluster + name: service-account-kubeconfig + - mountPath: /tmp + name: tmp-dir + - args: + - --csi-address=/csi/csi.sock + - --probe-timeout=3s + - --health-port=10301 + image: csi-livenessprobe + imagePullPolicy: IfNotPresent + name: csi-liveness-probe + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /csi + name: socket-dir + - mountPath: /var/run/secrets/tenantcluster + name: service-account-kubeconfig + - mountPath: /tmp + name: tmp-dir + - args: + - --v=5 + - --csi-address=/csi/csi.sock + - --kubeconfig=/var/run/secrets/tenantcluster/kubeconfig + - --timeout=3m + image: csi-external-snapshotter + imagePullPolicy: IfNotPresent + name: csi-snapshotter + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /csi + name: socket-dir + - mountPath: /var/run/secrets/tenantcluster + name: service-account-kubeconfig + - mountPath: /tmp + name: tmp-dir + - args: + - --v=5 + - --csi-address=/csi/csi.sock + - --kubeconfig=/var/run/secrets/tenantcluster/kubeconfig + - --timeout=3m + - --handle-volume-inuse-error=false + image: csi-external-resizer + imagePullPolicy: IfNotPresent + name: csi-resizer + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /csi + name: socket-dir + - mountPath: /var/run/secrets/tenantcluster + name: service-account-kubeconfig + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + serviceAccount: kubevirt-csi + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: socket-dir + - name: service-account-kubeconfig + secret: + defaultMode: 416 + secretName: kubevirt-csi-controller-service-account-kubeconfig + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_controller_service_account_kubeconfig_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_controller_service_account_kubeconfig_secret.yaml new file mode 100644 index 000000000000..04eb3e78b47c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_controller_service_account_kubeconfig_secret.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +data: + ca.crt: "" + kubeconfig: "" + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + name: kubevirt-csi-controller-service-account-kubeconfig + namespace: hcp-namespace + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_role.yaml new file mode 100644 index 000000000000..dfad81b74444 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_role.yaml @@ -0,0 +1,54 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: kubevirt-csi + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - cdi.kubevirt.io + resources: + - datavolumes + verbs: + - get + - create + - delete +- apiGroups: + - kubevirt.io + resources: + - virtualmachineinstances + - virtualmachines + verbs: + - list + - get +- apiGroups: + - subresources.kubevirt.io + resources: + - virtualmachineinstances/addvolume + - virtualmachineinstances/removevolume + - virtualmachines/addvolume + - virtualmachines/removevolume + verbs: + - update +- apiGroups: + - snapshot.storage.k8s.io + resources: + - volumesnapshots + verbs: + - get + - create + - delete +- apiGroups: + - "" + resources: + - persistentvolumeclaims + verbs: + - get + - patch diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_rolebinding.yaml new file mode 100644 index 000000000000..1e6b18d0cfe3 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: kubevirt-csi + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: kubevirt-csi +subjects: +- kind: ServiceAccount + name: kubevirt-csi + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_serviceaccount.yaml new file mode 100644 index 000000000000..e0dc0fab0edc --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/kubevirt-csi-controller/EtcdRestore/zz_fixture_TestControlPlaneComponents_kubevirt_csi_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: kubevirt-csi + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_config_configmap.yaml new file mode 100644 index 000000000000..e651beb76341 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_config_configmap.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + config.yaml: | + nodeclientcert: + disabled: false +kind: ConfigMap +metadata: + name: machine-approver-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_controlplanecomponent.yaml new file mode 100644 index 000000000000..e22c4a62183e --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_controlplanecomponent.yaml @@ -0,0 +1,33 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: machine-approver + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: machine-approver Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment machine-approver rollout to finish: 0 out of + 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: machine-approver-config + - group: rbac.authorization.k8s.io + kind: Role + name: machine-approver + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: machine-approver + - group: "" + kind: ServiceAccount + name: machine-approver diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_deployment.yaml new file mode 100644 index 000000000000..821e293ea760 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_deployment.yaml @@ -0,0 +1,134 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: machine-approver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: machine-approver + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: a53d18cd + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: machine-approver + hypershift.openshift.io/control-plane-component: machine-approver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + name: machine-approver + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - args: + - --config=/var/run/configmaps/config/config.yaml + - -v=3 + - --logtostderr + - --apigroup=cluster.x-k8s.io + - --workload-cluster-kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + - --disable-status-controller + - --machine-namespace=hcp-namespace + - --tls-min-version=VersionTLS12 + - --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + command: + - /usr/bin/machine-approver + image: cluster-machine-approver + imagePullPolicy: IfNotPresent + name: machine-approver + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/kubeconfig + name: kubeconfig + - mountPath: /var/run/configmaps/config + name: config + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + priorityClassName: hypershift-control-plane + restartPolicy: Always + serviceAccount: machine-approver + serviceAccountName: machine-approver + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - configMap: + defaultMode: 420 + name: machine-approver-config + optional: true + name: config + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_role.yaml new file mode 100644 index 000000000000..a237fafb2be2 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_role.yaml @@ -0,0 +1,23 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: machine-approver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - cluster.x-k8s.io + resources: + - machines + - machines/status + verbs: + - get + - list + - watch diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_rolebinding.yaml new file mode 100644 index 000000000000..db28bd6405f2 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: machine-approver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: machine-approver +subjects: +- kind: ServiceAccount + name: machine-approver + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_serviceaccount.yaml new file mode 100644 index 000000000000..51330faf59a6 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/machine-approver/EtcdRestore/zz_fixture_TestControlPlaneComponents_machine_approver_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: machine-approver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_ca_cert_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_ca_cert_secret.yaml new file mode 100644 index 000000000000..ae8bf213b62f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_ca_cert_secret.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + name: metrics-proxy-ca-cert + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: kubernetes.io/tls diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_config_configmap.yaml new file mode 100644 index 000000000000..bfb1edfd3a71 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_config_configmap.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +data: + config.yaml: | + components: null + endpointResolver: + caFile: /etc/metrics-proxy/certs/endpoint-resolver-ca/tls.crt + url: https://endpoint-resolver.hcp-namespace.svc +kind: ConfigMap +metadata: + name: metrics-proxy-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_controlplanecomponent.yaml new file mode 100644 index 000000000000..048d66a784d7 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_controlplanecomponent.yaml @@ -0,0 +1,39 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: metrics-proxy + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: metrics-proxy Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment metrics-proxy rollout to finish: 0 out of 2 new + replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Secret + name: metrics-proxy-ca-cert + - group: route.openshift.io + kind: Route + name: metrics-proxy + - group: "" + kind: ConfigMap + name: metrics-proxy-config + - group: "" + kind: Service + name: metrics-proxy + - group: "" + kind: ServiceAccount + name: metrics-proxy + - group: "" + kind: Secret + name: metrics-proxy-serving-cert diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_deployment.yaml new file mode 100644 index 000000000000..a7d8789ac4d5 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_deployment.yaml @@ -0,0 +1,164 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: metrics-proxy + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 2 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: metrics-proxy + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: 741638a5741638a587ecf31a87ecf31af44079cb + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: metrics-proxy + hypershift.openshift.io/control-plane-component: metrics-proxy + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/request-serving-component: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - --tls-cert-file + - /etc/metrics-proxy/serving-cert/tls.crt + - --tls-key-file + - /etc/metrics-proxy/serving-cert/tls.key + - --client-ca-file + - /etc/metrics-proxy/client-ca/ca.crt + - --config-file + - /etc/metrics-proxy/config/config.yaml + - --metrics-set + - All + command: + - /usr/bin/control-plane-operator + - metrics-proxy + env: + - name: MY_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: controlplane-operator + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 6 + httpGet: + path: /healthz + port: 9443 + scheme: HTTPS + initialDelaySeconds: 120 + periodSeconds: 60 + successThreshold: 1 + timeoutSeconds: 5 + name: metrics-proxy + ports: + - containerPort: 9443 + name: https + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 9443 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 10m + memory: 40Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/metrics-proxy/serving-cert + name: serving-cert + - mountPath: /etc/metrics-proxy/client-ca + name: client-ca + - mountPath: /etc/metrics-proxy/config + name: scrape-config + - mountPath: /etc/metrics-proxy/certs/endpoint-resolver-ca + name: endpoint-resolver-ca + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + serviceAccount: metrics-proxy + serviceAccountName: metrics-proxy + terminationGracePeriodSeconds: 10 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: serving-cert + secret: + defaultMode: 416 + secretName: metrics-proxy-serving-cert + - name: client-ca + secret: + defaultMode: 416 + secretName: cluster-signer-ca + - configMap: + defaultMode: 420 + name: metrics-proxy-config + optional: true + name: scrape-config + - name: endpoint-resolver-ca + secret: + defaultMode: 416 + optional: true + secretName: endpoint-resolver-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_route.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_route.yaml new file mode 100644 index 000000000000..a97ad1f34a7d --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_route.yaml @@ -0,0 +1,25 @@ +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + labels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + name: metrics-proxy + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + tls: + insecureEdgeTerminationPolicy: None + termination: passthrough + to: + kind: Service + name: metrics-proxy + weight: null + wildcardPolicy: None +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_service.yaml new file mode 100644 index 000000000000..c64b85c1ef77 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: metrics-proxy + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: https + port: 443 + protocol: TCP + targetPort: 9443 + selector: + app: metrics-proxy + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_serviceaccount.yaml new file mode 100644 index 000000000000..4a07a16996ae --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: metrics-proxy + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_serving_cert_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_serving_cert_secret.yaml new file mode 100644 index 000000000000..4729c7a3b4cf --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/metrics-proxy/EtcdRestore/zz_fixture_TestControlPlaneComponents_metrics_proxy_serving_cert_secret.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + name: metrics-proxy-serving-cert + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: kubernetes.io/tls diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_audit_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_audit_configmap.yaml new file mode 100644 index 000000000000..5f1dddd5365a --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_audit_configmap.yaml @@ -0,0 +1,26 @@ +apiVersion: v1 +data: + policy.yaml: | + apiVersion: audit.k8s.io/v1 + kind: Policy + rules: + - level: None + nonResourceURLs: + - "/healthz*" + - "/logs" + - "/metrics" + - "/version" + - level: Metadata + profile: Default +kind: ConfigMap +metadata: + name: oauth-openshift-audit + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_configmap.yaml new file mode 100644 index 000000000000..d4aedc500ac0 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_configmap.yaml @@ -0,0 +1,79 @@ +apiVersion: v1 +data: + config.yaml: | + admission: {} + apiVersion: osin.config.openshift.io/v1 + auditConfig: + auditFilePath: "" + enabled: false + logFormat: "" + maximumFileRetentionDays: 0 + maximumFileSizeMegabytes: 0 + maximumRetainedFiles: 0 + policyConfiguration: null + policyFile: "" + webHookKubeConfig: "" + webHookMode: "" + corsAllowedOrigins: null + kind: OsinServerConfig + kubeClientConfig: + connectionOverrides: + acceptContentTypes: "" + burst: 400 + contentType: "" + qps: 400 + kubeConfig: /etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + oauthConfig: + alwaysShowProviderSelection: false + assetPublicURL: "" + grantConfig: + method: deny + serviceAccountMethod: prompt + identityProviders: [] + loginURL: https://:0 + masterCA: /etc/kubernetes/certs/master-ca/ca.crt + masterPublicURL: https://:0 + masterURL: https://oauth-openshift.hcp-namespace.svc.cluster.local:6443 + sessionConfig: + sessionMaxAgeSeconds: 300 + sessionName: ssn + sessionSecretsFile: /etc/kubernetes/secrets/session/v4-0-config-system-session + templates: + error: /etc/kubernetes/secrets/templates/error/errors.html + login: /etc/kubernetes/secrets/templates/login/login.html + providerSelection: /etc/kubernetes/secrets/templates/providers/providers.html + tokenConfig: + accessTokenMaxAgeSeconds: 86400 + authorizeTokenMaxAgeSeconds: 300 + servingInfo: + bindAddress: 0.0.0.0:6443 + bindNetwork: tcp + certFile: /etc/kubernetes/certs/serving-cert/tls.crt + cipherSuites: + - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 + - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + keyFile: /etc/kubernetes/certs/serving-cert/tls.key + maxRequestsInFlight: 1000 + minTLSVersion: VersionTLS12 + requestTimeoutSeconds: 300 + storageConfig: + ca: "" + certFile: "" + keyFile: "" + storagePrefix: "" +kind: ConfigMap +metadata: + name: oauth-openshift + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_controlplanecomponent.yaml new file mode 100644 index 000000000000..d55fb2671556 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_controlplanecomponent.yaml @@ -0,0 +1,42 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: oauth-openshift + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: oauth-openshift Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment oauth-openshift rollout to finish: 0 out of 3 + new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: oauth-openshift-audit + - group: "" + kind: ConfigMap + name: oauth-openshift + - group: "" + kind: Secret + name: oauth-openshift-default-error-template + - group: "" + kind: Secret + name: oauth-openshift-default-login-template + - group: "" + kind: Secret + name: oauth-openshift-default-provider-selection-template + - group: policy + kind: PodDisruptionBudget + name: oauth-openshift + - group: "" + kind: Secret + name: oauth-openshift-session diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_default_error_template_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_default_error_template_secret.yaml new file mode 100644 index 000000000000..34af2836e9ea --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_default_error_template_secret.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + errors.html: PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuLXVzIiBkYXRhLXRlc3QtaWQ9ImxvZ2luIj4KICA8aGVhZD4KICAgIDx0aXRsZT4KICAgICAgCiAgICAgICAge3sgLkxvY2FsZS5FcnJvciB9fQogICAgICAKICAgICAgIMK3IFJlZCBIYXQgT3BlblNoaWZ0IENvbnRhaW5lciBQbGF0Zm9ybQogICAgPC90aXRsZT4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9ImRhdGE6aW1hZ2UveC1pY29uO2Jhc2U2NCxBQUFCQUFRQU1EQUFBQUVBSUFDb0pRQUFSZ0FBQUNBZ0FBQUJBQ0FBcUJBQUFPNGxBQUFRRUFBQUFRQWdBR2dFQUFDV05nQUFRRUFBQUFFQUlBQW9RZ0FBL2pvQUFDZ0FBQUF3QUFBQVlBQUFBQUVBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNqTHlIYlppOGgyNTB2SWR2SUx5SGI1QzhoMi9Zdklkdi9MeUhiL2k4aDIvUXZJZHZqTHlIYnh5OGgyNWt2SWR0Z0x5SGJIUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNFTHlIYlhTOGgyOEF2SWR2bUx5SGI4UzhoMi9vdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9rdklkdnhMeUhiNXk4aDI3c3ZJZHRhTUNEY0JRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyMkl2SWR2V0x5SGI5UzhoMi80dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzB2SWR2NEx5SGIxQzhoMjEwdklkc0NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzeUx5SGJ3QzhoMi9vdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL2k4aDIvOHZJZHUrTHlIYktBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjJndklkdnFMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI5aThoMjFzdklkc0VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkMEpMeUhiaFM4aDIvMHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHQ5THlIYkNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURFaHl3MHZJZGlMTHlIYS95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi80dklkdjlMeUhiL2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJqQzhoMndnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNmdFbkl1b1BKeUxxRGljaTZnUUFBQUFBTWlITENEUWd2WUEwSUwzL01pSEgvekFoMC84dklkbi9MeUhhL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9ZdklkdnZMeUhiNlM4aDI5QXZJZHU5THlIYnZ5OGgyOUl2SWR2b0x5SGI3eThoMi9jdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIzOHZJZHNGQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZoWW5JdXJHSnlMcXZDY2k2bDBtSXU0ZU1TREVZalFndS93MElMbi9OQ0M1L3pRZ3VmOHpJTC8vTVNITC96QWgxZjh2SWRuL0x5SGEveThoMi84dklkdnZMeUhiemk4aDIzZ3ZJZHN3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiTXk4aDIzMHZJZHZKTHlIYjhpOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR0Y0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlIcUF5Y2k2bm9uSXVyL0p5THEveWNpNnY4bkl1ajVMQ0haNnpFZ3h2OHpJTC8rTkNDOC96UWd1djgwSUxuL05DQzQvelFndXY4ekljUC9NU0hSOXk4aDJzZ3ZJZHRYQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJXQzhoMjhRdklkdjRMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjRMeUhiS1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFJQ2NpNnZZbkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcy95Y2k3UDRwSXVMK0x5SFA1alFndmMwMElMcmhOQ0M2K3pRZ3V2ODBJTG53TXlDL2l6SWZ1d29BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3OHZJZHVITHlIYjZ5OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnZ5OGgyd1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxakNjaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1djJKU0x3Y3lzaDRoQTBJTDFHTkNDOGxEUWd1OFl6SUwxbUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJaUzhoMitRdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjEwQUFBQUFBQUFBQUFBQUFBQW5JdW9SSnlMcTd5Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXFmSnlMcERnQUFBQUFBQUFBQUFBQUFBQzRqMFFrQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDIyVXZJZHZzTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI5Y3ZJZHNGQUFBQUFBQUFBQUFuSXVwYkp5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dFVuSXVvM0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR1SUx5SGIrQzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL3N2SWR0WEFBQUFBQUFBQUFBbkl1cTRKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEvQ2NpNm93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc1FMeUhid2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi8wdklkdThBQUFBQUFBQUFBQW5JdXBnSnlMcXB5Y2k2dVVuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxMlNjaTZrQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYldTOGgyL0F2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHZzTHlIYkd3QUFBQUFBQUFBQUp5THFHQ2NpNmtRbkl1cDFKeUxxdHljaTZ2WW5JdXIvSnlMcnRSZ24vd0VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1CdktBUzhoM01zdklkei9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2MEx5SGJZQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcUlpY2k2MGNvSXVhUUtpSGZsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBaDBvWXZJZGYzTHlIZC95OGgzUDh2SWR2L0x5SGIveThoMi84dklkdjZMeUhibWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeUlNbENNeURHN3pRZ3c3RTBJTU5zTkNEREd3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxQVFBQUFBQUFBQUFBQUFBQUFETWh2MHN6SU1Ed015REYvekVoei84dklkbi9MeUhkL3k4aDNQOHZJZHYvTHlIYnhnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTFJTUZpTkNERC96UWd4UDgwSU1Qdk5DREQyRFFndzZnMElNTlVOQ0hEQndBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2ajRuSXVwREFBQUFBRHdmblJFMElManBOQ0M2L3pRZ3ZmOHpJTC8vTWlERy96RWgwUDh2SWR2L0x5SGQzUUFBQUFBQUFBQUFBQUFBQUM4aDJ3d3ZJZHVYTHlIY1lEUWh4UnM2SWF4L09TR3gvemNodWY4MElNRC9OQ0RFL3pRZ3hQdzBJTVB2TkNERHlqUWd3eTRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNm5Bbkl1cmRKeUxxMVNZaTdZUXhJTVByTlNDNC96UWd1UDgwSUxuL05DQzcvelFndmY4eklMLy9NaURHNURFZ3pCUUFBQUFBQUFBQUFDOGgyeEF2SWR2Zkx5SGI5UzhoMnVZeUljM2xOeUczL0RvaHJmMDZJYTMvT1NHei96WWd2UDgwSU1QL05DREUzRFFneERBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZud25JdXIxSnlMcS95Y2k2dllvSXVmOUtpTGYreThoei9reklMNzdOQ0M1L3pRZ3V2ODBJTHIvTkNDNzVqSWh3U01BQUFBQUFBQUFBQzhoMnhBdklkdmdMeUhiL3k4aDIvOHZJZHIvTHlIYS9qRWgxUHMwSWNUNE9TRzAvVG9ocmY4NkliRC9PQ0cxMERZaHVpc0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2cEluSXVyN0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZmOG9JdWovTGlIUWhEUWd2YkEwSUx6L05DQzY3VFFndlNZQUFBQUFBQUFBQUM4aDJ3OHZJZHZUTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhadURVaHYxMDZJYTZsT1NHdnlEa2hyekFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNnJNbkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5UG9Kam9mckFNeUlNVVhNeURCV3pRZ3ZCWUFBQUFBQUFBQUFDOGgyd3d2SWR1OEx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnlpOGgyek1BQUFBQU55RzhCamNodXdJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxSVNjaTZzc25JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1cjVJeWJ1QVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMndrdklkdVlMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI2aThoMjFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcVlDY2k2dWduSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXJIQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3VXZJZHRvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIzd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFxU2NpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVxQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzd0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyN3d2SWRzbkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b2xKeUxxc0NjaTZ1OG5JdXI0SnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1b3hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc1VMeUhiMkM4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi80dklkdGpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2akVuSXVxTkp5THEweWNpNnVzbkl1cjhKeUxxL3ljaTZ0UUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNLTHlIYmdpOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHZDTHlIYkt3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxQXljaTZrd25JdXVnS0NMbjdTa2k1SFVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJNaThoMi8wdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJrQzhoMnc0QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1pSEpzRE1neFo0MElNTlFOQ0RES3pRZ3d3MEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiRUM4aDI2RXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIzb3ZJZHNKQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkVTOGgyeW92SWRzUkFBQUFBQUFBQUFBM0liaG1OU0RBK3pRZ3cvODBJTVQvTkNERDBqUWd3NGswSU1OTE5DRERKalFnd3djQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyejR2SWR2MUx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL2t2SWR0K0x5SGJFUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzVEx5SGJoeThoMjhZdklkdVlMaUhkVnpRaHcxbzZJYkRzT0NHei96Y2d1ZjgxSUwzL05TREIvelFneFA4MElNVCtOQ0REdmpRZ3cyNEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMnd3dklkdUtMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhibmk4aDJ6Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMnpVdklkdWlMeUhiK1M4aDIvOHZJZHYvTHlIYytURWgwZlEwSWNYOE55Rzcremtoc3ZzNkliRC9PQ0MwL3pjZ3VmODJJTDcvTlNEQi96UWd3NThBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNsTHlIYnhpOGgyLzh2SWR2K0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyODh2SWR0K0x5SGJOd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc3pMeUhiZkM4aDI5SXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoM1A4dUlkNy9NQ0hZK3pJaHovODJJY0xVT2lHdXRUb2hydXc1SWJIL09DQzIyeklneHhzQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJTQzhoMitNdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiemk4aDI1NHZJZHR1THlIYlNpOGgyekV2SWRzakx5SGJKQzhoMnpBdklkdElMeUhiYlM4aDI1b3ZJZHZOTHlIYi9DOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYy95OGgzZkl1SWVGRk9DRzFJVGtoc1U4NkliRi9PaUd1WGdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMaUhiQXk4aDIyTXZJZHZ2THlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2ekx5SGIzUzhoMjg0dklkdkZMeUhieFM4aDI4MHZJZHZiTHlIYjh5OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIvUzhoMjE0QUFBQUFBQUFBQUFBQUFBQUFGdjhCTUNIS0JBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyd1l2SWR0c0x5SGI3eThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjhMeUhiWXk4aDJ3TUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdUlkc0ZMeUhiWEM4aDIrTXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIrc3ZJZHRWTHlIYkJRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTGlIYkF5OGgyem92SWR2Q0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYndDOGgyemd2SWR3Q0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc1VMeUhiZWk4aDIvTXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL1F2SWR0M0x5SGJHd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkJTOGgyeVF2SWR1T0x5SGI5aThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2ekx5SGJrUzhoMnlndklkc0ZBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc0VMeUhhRmk4aDIya3ZJZHZDTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJ5QzhoMjJjdklkc2FMeUhiQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyd0V2SWRzQ0x5SGJEeThoMjBZdklkdDJMeUhibXk4aDI3VXZJZHZBTHlIYnhDOGgyN2N2SWR1Zkx5SGJlUzhoMjBjdklkc1VBQUFBQUM4aDJ3RUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvLy8vLy8vOEFBUC8vLy8vLy93QUEvLy93QS8vL0FBRC8vNEFBZi84QUFQLytBQUFmL3dBQS8vZ0FBQWYvQUFELzhBQUFBLzhBQVAvQUFBQUIvd0FBLzRBQUFBQi9BQUQvQUFBQUFIOEFBT2NBRC93QVB3QUE0QUEvL3dBZkFBREFBSC8vZ0E4QUFJQTUvLy9nRHdBQWdELy8vL0FIQUFDQWYvLy84QWNBQUFCLy8vLzRBd0FBZ1AvLy8vd0RBQUR3Ly8vLy9BTUFBUHovLy8vOEFRQUEvbi8vLy80QkFBRCtELy8vL2dFQUFPNEQvLy93QVFBQTRBUC8vL0FCQUFEZ0EvLy80QUVBQU9BVC8vL2dId0FBNEIvLy8rQWZBQURnSC8vLzRCOEFBUEFmLy8vQUh3QUE4QS8vLzhBL0FBRHdELy8vOEQ4QUFQQUgvLy8rZndBQStBUC8vLzgvQUFENEEvLy8vd2NBQVB3Qi8vL0dBUUFBL0FCLy80QUFBQUQrQUQvL0FBRUFBUDhBQi9nQVB3QUEvNEFBQUFCL0FBRC93QUFBQVA4QUFQL2dBQUFCL3dBQS8vQUFBQVAvQUFELy9BQUFELzhBQVAvK0FBQWYvd0FBLy8vQUFQLy9BQUQvLy93UC8vOEFBUC8vLy8vLy93QUEvLy8vLy8vL0FBQW9BQUFBSUFBQUFFQUFBQUFCQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzQk1DTFpCQzhoMjFNdklkdThMeUhiL2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2VUx5SGJkQzhoM0E0dklkc0NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiSlM4aDI3UXZJZHYxTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyODR2SWR0YkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkJTOGgyNEF2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHZITHlIYkdRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoNHdRdklkdmNMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjZMeUhiUWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXlJY29QTVNIUDR5OGgyZjh2SWR6L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL2N2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzR2SWR2L0x5SGJTZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2cnduSXVwWkFBQUFBRE1ndmVRMElMci9OQ0M2L3pJaHhmOHdJZGYvTHlIYi95OGgyLzh2SWR2OEx5SGJxQzhoMnpJQUFBQUFBQUFBQUFBQUFBQXZJZHNaTHlIYmZpOGgyL0l2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYktRQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1cVBKeUxxL3ljaTZ2OG5JdWo3S3lIYi96QWh5L28wSUx6L05DQzUvelFndWY4eklMLy9NQ0hVakM4aDJ4Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiQXk4aDIxWXZJZHY0THlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdmlMeUhiQ0FBQUFBQUFBQUFBSnlMcUZ5Y2k2dlFuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxyOXlVaTh4YzBJTHh2TkNDNzNqTWd2MVVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMndjdklkdmVMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR0eUFBQUFBQUFBQUFBbkl1cFpKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dnduSXVvN0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgzQkV2SWR2NUx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHNOQUFBQUFDY2k2c1FuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxendBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ5OHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjNzQUFBQUFKeUxxRmljaTZxTW5JdXIvSnlMcS95Y2k2djhuSXVvOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjY4dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYndpOGgyd0VBQUFBQUFBQUFBQ2NpNmdrbkl1cEpLU0xrdkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUNIVFZpOGgyUDh2SWQzL0x5SGIveThoMi84dklkdnNMeUhiQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUExSU1LWE5DREQvelFndzUwMElNTW1OQ0REQ2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFCaWNpNmdrMkliVWJOQ0M1L3pNaHcvOHdJZFAvTHlIWi95OGgyLzh2SWQwSEFBQUFBQUFBQUFBdklkdVFMeUhiR2pvaHJiYzRJYmYvTkNEQy96UWd4UDgwSU1Qbk5DRERZUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdW84SnlMcTRpWWk3cFF6SUw3L05TQzQvelFndWY4MElMei9NeURDL3pJZ3lTNEFBQUFBQUFBQUFDOGgyL1l2SWR2L01TSFIvRFlodnZzNUliTDhPU0d6L3pZZ3ZQODFJTUJnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNmtjbkl1citKeUxxL3lZaTdmOHFJdUQ3THlITTlEUWd1K0EwSUxyL015RzlSQUFBQUFBQUFBQUFMeUhiNkM4aDIvOHZJZHYvTHlIYi95OGgyLzh6SWN0ZU9pR3Z2amtocjJZQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcVppY2k2djhuSXVyL0p5THEveWNpNnY4bkl1clVMU0xXQkRNZ3d5MDBJTDBoQUFBQUFBQUFBQUF2SWR2TEx5SGIveThoMi84dklkdi9MeUhiL3k4aDNISUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1cXlKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2ckFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI1b3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJ4Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcUNpY2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxV1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJYQzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYxTHlIYkVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b09KeUxxWHljaTZ0NG5JdXIvSnlMcS95Y2k2djhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNiTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdXJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNmkwbkl1cWRLaUxpbHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdXRMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR0NEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEUWd4RWcwSU1QL05DREQ0elFndzFjQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgydzB2SWR2Mkx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHQ0QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzNkx5SGIxaThoMjZZeUljMXZPaUd2L3pnaHRQODJJTHovTkNERC96UWd4UFUwSU1Pb0FBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI0QXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdS9MeUhiRXk4aDJnSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc0pMeUhiY2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR6OU5DSEcrVG9oc1BJNklhMzVPQ0czL3pRZ3dXRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjdJdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2N0x5SGIwaThoMjRjdklkdE1MeUhiTVM4aDJ6NHZJZHR0THlIYnV5OGgyK3d2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHo2THlIZUZ6a2hzU001SWJOV1RpTm5BUUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdJZHNCSHlEZkFTOGgyOGd2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI5UzhoMnkwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI2c3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIrNHZJZHdVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjJVdklkdnZMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR1YUx5SGJEZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR1Tkx5SGI5QzhoMi93dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9jdklkdkZMeUhiSHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNMTHlIYk15OGgyMmd2SWR1Zkx5SGJ3eThoMjlFdklkdk1MeUhic0M4aDIzOHZJZHRDTHlIYkdnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvLy8vLy8vLy8vLy9nUC8vL0FBZi8vQUFCLy9nQUFQL3dBQUIvWUEvQVBnQS84QjRHLy9nZUQvLzhEQS8vL2c0Zi8vNEgzLy8vQjhmLy93ZEIvL3dIQWYvOEJ3WC8vQjhILy9nZkEvLzRQNFAvL0QrQi8vOC9nZi8vbjhELytRUEFQL0FINEFlQVAvQUFBSC80QUFELy9nQUIvLzhBQi8vLzhILy8vLy8vL0tBQUFBQkFBQUFBZ0FBQUFBUUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNITHlIYlRpOGgyOU12SWR2L0x5SGIveThoMi84dklkdXNMeUhiS3k4aDJ3SUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdUlkOGxMeUhiM0M4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdTJMeUhiQlM4aDJ3RUFBQUFBSnlMcUJDY2k2aUl5SU1Bd01pSE4vekFoMS84dklkci9MeUhiNnk4aDI5QXZJZHZBTHlIYjJTOGgyL2N2SWR2L0x5SGIveThoMjc4QUFBQUFBQUFBQUNjaTZqOG5JdXI0S0NMbTh5OGh6K0EwSUx2Nk1pREdraTRoNFJJQUFBQUFBQUFBQUM4aDJ3SXZJZHNnTHlIYjBTOGgyLzh2SWR2L0x5SGJuQUFBQUFBbkl1cThKeUxxL3ljaTZ2WVhKZjhHQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3WXZJZHZzTHlIYi95OGgyL0F2SWRzUkp5THFQaWNpNnRFbkl1dW9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiTWk4aDNQOHZJZHYvTHlIYlNnQUFBQUFBQUFBQU5TRytuVE1neFhNeklNVWxBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFEU29pNERzekljVHRNU0hRL3pBaDFwUXZJZHNVTHlIYjZqTWh5L2s1SWJUL055RzZvd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2aTRuSXVyL0tTTGsvakVoeCtNMElMdXpMeUhiRFM4aDIrNHZJZHovTGlIZXpVVWhmdzRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdXBxSnlMcS95Y2k2djhsSXZGSU5CL0ZCQUFBQUFBdklkdmFMeUhiL3k4aDIvOHZJZHNaQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxWFNjaTZ2UW5JdXIvQUFBQUFBQUFBQUFBQUFBQUx5SGJVUzhoMi84dklkdi9MeUhicEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGdneXdVQUFBQUFNaURLdURRZ3hIVXpJTVVaQUFBQUFBQUFBQUF2SWR2TUx5SGIveThoMi84dklkdTFMeUhiRHk4aDJ3UXZJZHNDTHlIYkJTOGgyeDR2SWR2bkx5SGEvallod1B3NEliVDFOU0RBNFFBQUFBQUFBQUFBTHlIYklDOGgyL3d2SWR2L0x5SGIveThoMi9FdklkdkhMeUhidkM4aDI5RXZJZHYvTHlIYi95OGgyLzh2SWQyc09DRzVDandocGhJQUFBQUFBQUFBQUFBQUFBQXZJZHNPTHlIYjJDOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvb3ZJZHV3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3Z3ZJZHMrTHlIYm5TOGgyOWd2SWR2bkx5SGJ5aThoMjRFdklkc3FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRDhId0FBOEFjQUFPQURBQUNENFFBQUgvRUFBSi81QUFEZitBQUFoL0FBQUkvekFBQ1A4d0FBeC9zQUFNUGdBQURnQXdBQThBY0FBUHdmQUFELy93QUFLQUFBQUVBQUFBQ0FBQUFBQVFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNwTHlIYmVDOGgyN2d2SWR2Y0x5SGI3UzhoMi9ndklkditMeUhiL3k4aDIvd3ZJZHZ6THlIYjVpOGgyOVV2SWR1ZUx5SGJWU2NTNHdNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc05MeUhiUkM4aDI1Z3ZJZHYwTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiMEM4aDIzTXZJZHN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdUtMeUhiOUM4aDIvMHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYit5OGgyK012SU50TEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1DSGJDeThoMjRNdklkdjBMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjlJdklkdGFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1DSGJRQzhoMi9ndklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI5QXZIdHdOQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzQkx5SGJyaThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYitTOGgyM2NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzakx5SGI3UzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJyUzhnMndnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWQxS0x5SGI5eThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdmNMeUhiRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF1SWQxQUx5SGIvaThoMi80dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI5c3ZJZHNSQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF6SU1WVU5DQysvekVoMGY4dklkMy9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYjZpOGgyeEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1bzNKeUxxTndBQUFBQUFBQUFBQUFBQUFBQUFBQUF3SWRBZU5DQzg4elFndXY4MElMai9OQ0M4L3pJZ3lQOHdJZFAvTHlIYy95OGgzUDh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2YUx5SGJyQzhoMjRZdklkdHBMeUhiVlM4aDIxUXZJZHRkTHlIYmRDOGgyNUl2SWR1OUx5SGI4QzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2Q0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b0JKeUxxNUNjaTZ2OG5JdXJySnlMcWFpY2k2Z2N3SXQ0TE15QzkrVFFndXY4MElMci9OQ0M2L3pRZ3V2ODBJTHIvTkNDNi96UWd1djh5SWN6L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyNTB2SXRzU0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkczVMeUhiMGk4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjdFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxb2ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyMktTTGoyREFoeWZzMElMbjhOQ0M0L3pRZ3V2ODBJTHIvTkNDNi96UWd1djgwSUxyL05DQzUvelFndS84eklNTC9NU0hPL3pBaDJmOHZJZHYyTHlIYmN6QWgyeEVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNzTHlIYm9pOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MaUhhUlFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxTUNjaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1di9KeUxyK2kwaDFma3pJTUQ3TkNDOC96UWd1djgwSUxyL05DQzYvelFndXY4MElMci9OQ0M2L3pRZ3VmOHlJTWpOS1NMekN3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzN0x5SGI3UzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHRJZGNGQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZxUW5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXYvSnlMcS95b2k0YnN6SU1CN05DQzg2VFFndXY4MElMci9OQ0M2L3pRZ3V2OHlJTUowQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoM0FvdklkdXlMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnBqRWgyd0VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNnaTZnOG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dE1BQUFBQUFBQUFBQUFBQUFBeklNTkNOQ0M5cnpRZ3UrRXpJTDlkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI1WXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL3d2SWRzWEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdXF2SnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dmNuSXVvZUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXlJTUVLTENmS0FRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYmppOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJ4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JK2tSSnlMcThpY2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVwb0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkFRQUFBQUF2SWR2Q0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkc3RBQUFBQUFBQUFBQUFBQUFBSnlMcU9TY2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVySEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1pVGJDQzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhialFBQUFBQUFBQUFBQUFBQUFDY2k2bzRuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THFVUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdE5MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIrTUFBQUFBQUFBQUFBQUFBQUFuSXVxWUp5THE4U2NpNnY0bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEraWNpNmdFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiQkM4aDI5c3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTUNIYk1BQUFBQUFBQUFBQUFBQUFBQ2dpNnhRbkl1cEZKeUxxc3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNm9jQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXVJZHRRTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyNlFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JK29NSnlMcWdTY2k2dFFuSXVyN0p5THEveWNpNnY4b0l1b1VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyK2t2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2MUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFsSXV3Rkp5UHFHeWNpNm9BbUl1dlVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR0L0x5SGMveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIrUzhoMngwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFOU0RCM3pRZ3c3STBJTU5XTkNEREZ3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU5TQzVTek1odi84eUljei9NQ0hWL3k4aDNQOHZJZHovTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi93dklkczVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNaURCQ2pRZ3cvODBJTVAvTkNERC96UWd3LzAwSDhPNk15RERLZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRFFndWlzMElMcjdOQ0M2L3pRZ3V2ODBJTHovTVNITS95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiVGdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURjZ3UxUTFJTUgvTkNERS96UWd3LzgwSU1QL05DREQvelFndy84MElNUGFOQ0REa2pRZnd6Y0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2g2bGtuSXVxSUp5THNLZ0FBQUFBM0lMUU5OQ0M2K1RRZ3V2ODBJTHIvTkNDNi96UWd1ZjgwSUxyL015REQvekVoemY4d0lkai9MeUhkL3k4aDNHd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjdBdklkdFJMeUhjQ3dBQUFBQTVJYktOT2lHcy96Z2hzLzgxSUwvL05DREMvelFndy84MElNUC9OQ0REL3pRZ3cvODBJTVAvTkNERDBnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFuSXV0cUp5THEveWNpNnY4bkl1cldKU0x3U0RNZ3ZmUTBJTHIvTkNDNi96UWd1djgwSUxyL05DQzYvelFndXY4MElMci9OQ0M0L3pNZ3d2OHhJYytMQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdmdMeUhiL3k4aDIrNHZJZHk0TmlIQTJEb2hxLzQ2SWF6L09pR3Qvemtoc1A4NEliWC9OU0MvL3pRZ3hQODBJTVAvTkNERC96UWd3N3NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFkQ2NpNnY4bkl1ci9KeUxxL3ljaTZ2OG9JdWY3S2lMZCtEQWh5dmsxSUxqOU5DQzUvelFndXY4MElMci9OQ0M2L3pRZ3V2ODBJTHIvTkNDOHF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiNFM4aDIvOHZJZHYvTHlIYi95OGgzUDh2SWRyNU5DSEY4emdodFAwNklhNzhPaUdzL3pvaHJQODVJYkgvTmlDNy96VWd3ZjgwSU1PZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNnBNbkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXV6L0p5THE5aTBoMVBjeUlNSHpOQ0M3K1RRZ3V2ODBJTHIvTkNDNi96TWd2SzBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI5NHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkcitNQ0hXL0RRaHh2VTVJYS85T2lHdC96b2hyZjg2SWE3L09TR3lvZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1ckdKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxwb2prZ3JoTXlJTU9CTkNDOStqUWd1djgwSUxxdUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHZUTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHovTGlIZmhEa2hzVXc1SWEreE9pR3U2amtoc0s4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljajZuWUFBQUFBQUFBQUFBQUFBQUF5SU1kTU5DQy9hd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYnd5OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyN1FBQUFBQU5pQzhBVGtoc0FRNEliZ1hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxTFNjaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdW8rQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyNm92SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2Vk1DRGJCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZuSW5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXI2SnlMcUhnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR1TEx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI3UzhoMnhFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdXJCSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcTZDY2k2ZzhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJWeThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklOczJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdW9lSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2czBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMnh3dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhidndBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcXZ5Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVwdEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiNHk4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHhJZHNwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2aFFuSXVwSUp5THF3Q2NpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDIyOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b2RKeUxxaVNjaTZ0RW5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THFvd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNVTHlIYitTOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh3SXRzZUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdW9FSmlIcEdDY2k2cFFuSXVyL0p5THEvU2NpNmp3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUNIYkF5OGgyOHd2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI2aTRoMndvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU15TEtHakFnei9BeklNWmdPQ0REQ2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR0YUx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdW5BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRFFndzVvMElNUC9OQ0REL3pRZ3cvODBJTU9vTkNEREhqVWd4QVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjkwdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI1NEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUMwaDJ4SXZJZHNiQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGdodGw0MElNUC9OQ0RFL3pRZ3cvODBJTVAvTkNERC96UWd3LzgwSU1QWE5DRERralFnd3lrQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkcEJMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYmh5c2gyUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ4QXZJZHZaTHlIYi95OGgyOGN2SWR4Rkx5SGRFVGtocnprNklhMy9PaUdzL3pnaHRmODFJTC8vTkNEQy96UWd3LzgwSU1QL05DREQvelFndy84MElNUC9OQ0REMlRVZ3cwMEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLUmJYQVM4aDI5Y3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2SUx4cllCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ6a3ZJZHZyTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMitveElkRHJOeUczOHpzaHF2ODZJYXovT2lHdC96b2hyLzg0SWJQL05pQysvelFneFA4MElNUC9OQ0REL3pRZ3cvODBJTU9rQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNjTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9jdklkdE9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeURhRGpBaDI0QXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDNmOHdJZGozTkNIRDhEZ2h0dnM2SWE3Nk9pR3Qvem9oclA4NklhLy9OeUc0L3pVZ3YvODBJTUw0WXlDZkFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyMmd2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL2k4aDIrZ3ZJZHM4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiY1M4aDIva3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWRyK01DSFk4VFlodVpzNUliSC9PaUd0L3pvaHJmODZJYTMvT1NHeGJRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJ0QzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyOWt2SWR1REx5SGJRUzhoMnhNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUxpSGFIeThoMjFBdklkdVhMeUhiN3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjJFQUFBQUFBQUFBQURZaHVWRTRJYlNuT1NHd3lUZ2V0QWNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdlNMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiK0M4aDI4c3ZJZHVvTHlIYnB5OGgyN0l2SWR2U0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjN3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeURiRnk4aDIrb3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjZFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdJTmdKTHlIYjRpOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjZVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDNGgydzh2SWR2S0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoM0g0dk05VUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF5SWRvQkFBQUFBQzhoMjY0dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI5aThoMjJ3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBM0ZONEJMeUhiVEM4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI1QzRmM0IwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJOXNTTHlIYnFTOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2MUx5SGJmZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3SWRvWkx5SGIxUzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR1Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkbzFMeUhia1M4aDIvUXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYjFpOGgyM0V2SWRzZEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTGlIYlN5OGgyN3N2SWR2c0x5SGI5UzhoMi80dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjhMeUhiOHk4aDIrY3ZJZHVqTHlIWktRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJDQzhoMnlBdklkczBMeUhiVWk4aDIzY3ZJZHVTTHlIYm5TOGgyNlV2SWR1Zkx5SGJqaThoMjNFdklkdEtMeUhiTUM4aDJ4b3ZJZHNDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy84QUgvLy8vLy8vOEFBRC8vLy8vLytBQUFCLy8vLy8vZ0FBQUIvLy8vLzhBQUFBQi8vLy8vQUFBQUFELy8vLzRBQUFBQUQvLy8vQUFBQUFBSC8vLzRBQUFBQUFQLy8vQUFBQUFBQWYvLzRBQUI4QUFBLy9IQUFCLy9BQUIvNEFBQS8vL0FBSC9nQUFILy8vQUFQOEFCQi8vLytBQWZ3QVBQLy8vOEFCK0FCLy8vLy80QUQ0QVAvLy8vL3dBUGdBLy8vLy8vZ0FjQUgvLy8vLy9BQndBZi8vLy8vOEFINEIvLy8vLy80QVA0UC8vLy8vL2dBLzgvLy8vLy8vQUQvNS8vLy8vLzhBUC9nLy8vLy8vd0EvK0FmLy8vLzNBRDl3QWYvLy8vRUFId0FCLy8vLzhBQWZBQUgvLy8vZ0FCOEFBZi8vLytBQ0h3QVIvLy8vNEFmL0FCLy8vLy9nQi84QUgvLy8vK0FIL3dBZi8vLy93QWYvZ0IvLy8vL0FCLytBRC8vLy80QVAvNEFQLy8vLzRBLy93QWYvLy8vNEQvL0FCLy8vLy84Zi84QUQvLy8vLzkvLzRBSC8vLy8vZy8vZ0FQLy8vLytBZi9BQWYvLy94d0FmOEFBLy8vK0FBQS80QUIvLy9nQUFIL3dBQi8vOEFBQS8vQUFBLytBQUR6LytBQUFBQUFBZi8vOEFBQUFBQUIvLy80QUFBQUFBUC8vL3dBQUFBQUQvLy8vZ0FBQUFBZi8vLy9nQUFBQUQvLy8vL0FBQUFBLy8vLy8vQUFBQUgvLy8vLy9BQUFELy8vLy8vL2dBQS8vLy8vLy8vK0QvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy93PT0iPgoKICAgIDxzdHlsZT4KICAgICAgQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiAnUmVkSGF0VGV4dCc7IHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R1JnQUJBQUFBQUkwaEFCSUFBQUFCSlV3QUFRQUFBQUNMaUFBQUFaa0FBQVJqQUFBQUFBQUFBQUJDUVZORkFBQUJsQUFBQURvQUFBQTZpeVdVc1VSVFNVY0FBSXVBQUFBQUNBQUFBQWdBQUFBQlIxQlBVd0FBQWRBQUFBMEVBQUFpS2cwWmhCdEhVMVZDQUFBTzFBQUFBdWNBQUFZb2NBTnY4RTlUTHpJQUFCRzhBQUFBV0FBQUFHQm1CNERSWTIxaGNBQUFFaFFBQUFQdkFBQUZ0RzlNL1ZkamRuUWdBQUNEbUFBQUFFMEFBQUI0TElmKytXWndaMjBBQUlQb0FBQUc4Z0FBRGhXZU5oUE9aMkZ6Y0FBQWc1QUFBQUFJQUFBQUNBQUFBQkJuYkhsbUFBQVdCQUFBWGNnQUFNaFM3Y2swc0dobFlXUUFBSFBNQUFBQU5nQUFBRFlVcTQ3WGFHaGxZUUFBZEFRQUFBQWhBQUFBSkFmakJIVm9iWFI0QUFCMEtBQUFBeUlBQUFhYWNBeFFGbXh2WTJFQUFIZE1BQUFEVUFBQUExREx1dnhKYldGNGNBQUFlcHdBQUFBZ0FBQUFJQUw3RHpCdVlXMWxBQUI2dkFBQUF3OEFBQWxSS0tqSlYzQnZjM1FBQUgzTUFBQUZ3UUFBQ2duMHBwL1ljSEpsY0FBQWl0d0FBQUNpQUFBQXZlRzJYaU1BQVFBQUFBZ0FBQUFFQUE0QUFtbGtaVzl5YjIxdUFBSkVSa3hVQUE1c1lYUnVBQTRBQmdBQUFBQUFBUUFDQUFnQURBQUIvMklBQVFBQUFBQjQycldaRFhCVTFSWEh6OTNOUXRoQVFvQWtKRkFNOGhVZ2hFOFJKZGgyYXAxcHRhTWlXbXRyOGFPZE9pV2lZTEV6ZGNaT3JSVmFwNHI0RVVHczFBOEVRZm1JUUVCQVJhcEFsVUdzOGtJSUpEVnAyRTBvQmtOTWpjbnQ3OTU5dTluZExMQ2s5WjM1di9keVA4NDk5OXh6Ly9lOGpTZ1I4Y3Nkc2xFOGwxOXgxU3hKTDduMVYzTWxUMUlvRjYzRjFBK1dsRy9mOU4xOEdmNmRtYlB5cFhEbTFUL0lseW16Wmw2Wkw4VnVHK1UrUGU3VDZ6NVQzS2RQZXN6NStmeTVNdExlQysxOWtyMVBzL2ZMN1AxeXhqTGpuZjF1dERJTzhQdVdpeHJVejlxYUxWTmxsc3lYeGJMWmsrcEo5Njd3cnZTdVRabWI4blRLOHlsdnBmelRsK0x6Ky9yNnNuM1RmTi8zbFVoUHlkTU5NaGlVNmhaWnFodFVrUTZvWXQya1p1aFBUSzMwcHJhRjJnQzFoMVNPZnB2YVJXcTJmdGIyYmFKMnQ1U0tuNW9LYXBiUXI0cmFENlVYZlRQeFdBWjltNnptSEYyamlzUkRxM0kxZytkczdXQnBUL3FuZ2Y0Z0N3eGl0TkU4eDRDeG9CQ01BOU5CTVpnQkxnTTNnQitDRzhHUHdFM2d4K0FuNEdid1V6QWJQS2dQeWgvQVEyQWhXQVFXZ3lYZ1NmQVVWcFRxUGJJTXJPVHZsOEVxc0JxOEF0YUF0V0FkV0E4MmdJMmdETHdPTm9ITm9CeHNCZHZBRzJBNzJBRU9BUWRVZ01PZ0Vod0JWZUFvT0FhcVFRQUVRUU5vMUFkVkQ5QVRwSUpld0EvU1FHL1FCNlNEREpBRnNzRXRlcmU2bGZrcWZOMG1QNU1IZEN0ekR6TDNJSE1QeWtLaWV4SFB4V0FKZUlLNGVaS3lVbFpvR2M5bndITDZQQXYrQXA0REs4QmZ3ZlBnQmZBaWVBbXNwUC9MWUJWWURWNEJhOEJhc0E2c0J4dkFSbEFHWGdlYndHWlFEcmFDYmVBTnNCM3NBSWVBQXlyQVlWQUpqb0FxY0JRY0E5V2dGcnZyd0w5QVBUZ09BdGdlQkEyZ0VYd0Yya0VIME1RbU8xc3B3RTdCcjBIOEdzU3ZRZndheEs5Qi9CckVyMEg4R3NTdlFmd2FWSDExaDhvRS9VQi9NQUJrMFQvYnhucVZHcVhYcUFJd0ZoU0pWMDBBRThFa01CbGNvaytwNmFCWWJ5TFNqNGxTeFhqYTNBZkxCRmJHWVdVY1ZzWmhWUnhXeFdGVkhMc0tLM20rREZhQjFlQVZzQWFzQmV2QWVyQUJiQVJsNEhXd0NXd0c1V0FyMkFiZUFOdkJEbkFJT0tBQ0hBYVY0QWlvQWtmQk1WQ3RIYnpqNEIwSDd6aDR4OEU3RHQ1eDhJNkRkeHk4NCtBZEJ5dno5RTVtMG91OTB5Wkw4Y2tjZkZJaVBqVlh0NnQ1K2tNMUh3NjVoNTN2Z1FjOHZIVll2bGdCWDdUUjV6TVRwZlQ1akxhbVhadWtVdE5NVFFVMWUvSGF6YXBFTjZKdERacjIwS0tlRm5sNm16d3NDMmoxSm4wZGF1dm9YMHVMZGxxMEUvc1B5NUNZdStuam9MbUtQaDFvcnFkZkFNMEIrdTIwZlZJc1k4MWxySG02R1UzTmtxcHlKQU1lZEtqWlQvdlBhWCtLMmpwVFM1K0E5Q0lDS2xuMURPd3NZM1YzcWptU3h1eTk2SGxSelpOME0zdnhaSzAzakp5ZG4zdVZUSk9KbkFDbmRaTnVBUTNhNFY2amE4U2pqK2tPVzJyS20rUi92UFFUK2pibUcvNnJVUyt4SjlBdWREdjZVOGFxb2F4Qzc0ZGwzNkpzdTM1ZmJ6M1BFVmJyQmR4YjdCd0N1bDAvSkY0WVFjUUhiNXNUTk5TcVh0THhrNWdaNlUvRnovcCtEVmQzdGVwbCtuNThuNEcxV1pLaFQrbnRlTW1yRDFvdm5iUXIwNHl2S3FWSUg3QmVQSzczbmVjUXFYaW1RNWZwRTdvczdCTTBkZGpTZHFLdTA1WjJGeTNHaTZiMmZPYXV0K2syRUsydjladzlreHpCUms2dEx0VjFlazFNLzAvd1VDMFI3WW5YcUUvWSt6Rm1XSDhldnZLNCtOb3ZmTldzNi9XUmhCYkV0ejNWN1dHOFg0UGxKL1VLL1psZUZsUDJ1Vm50TTZ5M3g4NjJBODQ3LzdHYTlhcjRPVkJXQ1RNbjhKcHVURXJuU2owdnpFdWROaEc1ZStHaFN2MEJ1VmZvS3RDdjJabzk4TXpwRUpOd2RuWnpIWktPOU9TdVRMaWlCb1oxOUdOd0I3a0UxcGRURm1MWExhYU10K2k5MkVDWnVWdk9nV3RTV2E4L3dUWVpzRUxHR1R6VlpQZ2lkQkp3RnZXTWxFWmZnMk5iUi8zbGdhMGF6eEtCNmJTcUNLK0J0ZFZyT1pxekp4eEo5bHdhRWpXSHpxdTNaYWptU0V3a2lDN09oZVAyWHNFYU5uRkNPSndNRVN2ZGVaeHh0MnVUS1ljNHBoNk93WllFamJMZ2x3L01lWWxXdjJ0SkhhdXhpMUVQNmwxMmpyVzZXb1lZMnkyM1ZrVE54SS8zNjNYUTVkdGQvTlhXSlU2eWJRUXUwRy9yZTEwTnBmcEc3bTh5bjZONmcxMmg2bkJjMm5wejFyV0hyTlgzV1l0cTliZjBhdDQySkp4bmpiWHRZenkwQjUxTldPaUZjZnd4alVKemErbkszUFRlN1hxcnhucXBJY0VRZmpjRE9PbGExY29JSGZaa2FpRXJDcTlIZ1BtM1JNNXNUMlFFRTBrZDlEN202dklubUVOTHFDVnkwckpOcTJWTmZ6aWUzSGp6U200azF0RVRqaG1UUWJDamlENVRZczdjaE5uTUF2MnhIVHZrOFRMOUJYYVp1S3F3NDU2d3ZQU09qRFRjZ2pjKzF1WkxKaHhkWnU5OVNNWm9Zbng1bHowVWp0WVRVWDkxdUZiNHVqVHNlVTZHcXo5alJPKzFIamx0NTlETzZlTzE0emE1MHVDdXcwaTdMMDlhTHVsY2N6OSthblBQK2pvYjgxMUhlRXhmRDMrYU5lcEQrM3E5eGV4UXpiY3FiM3VRWFpRNVpNQkZjR3FyM29jOEZlTFcwRzZpendIWXk1d1lXK2l6SjhFa3lKU3cwQk9KQkkvbEFMK2J0N1lZbjdNNmhqWENjZFVZeFcrbWQ2TmxNODlaY3dDeGR0Zkh0aUtxUEFuUDUrYkU3NTNzRXVzcis1ZWZuTTZzU0dQWHZtWWZ4ZThndmpiZFRJdWNKcVllYjRiV05vQnZLOFBqNnYvZ2tlclk3SWVZYW8zUEpjTDErckNOZlp2emRjazN2QkdQTktPMVhoOE83My85RHFOV3hjeWgvZXgrZFRtcUVrNk16b1ZDclBnUEd4M3RaOHhiaG5manBNdy82MDVwWVRSUDhsbHBoREhPbk10NDNQT3N3NTVoZmp4V0FWY2NDVVcxZStLMXNnK00zL1pGNWEyaGVMUHNiVm0xbFJiYlk4YmVGOW5GNXZjWjRkd2dKdlNydW9SNDZpK0RRSTVoR2R2bUNPTTJ3MUNkOGZoTnd5ZDZLNlZ2UmFJaElNUG9GYlczM05hRFFtekpPR1I1dWx3dkpDTGl2T1NlMEI1Sml5b3pKNDhUZDFKNlkySS9MUzZUQzRTdGlZNUkrMTM0VVRLNWJFUjNiN3N2YWpySFFrczlzZHFZS0NkMXo5ekFPWG0wSS93dEZPWDV6aEVDYURGZVRqU0N5VGErU0NJWGpZc2pzNWM2YzB3YkJhMko3YlE1VXFZOUg5d3pLZlpjdExzc25xRlRLWHZYN2p4L0VyYlZtYnlIMFgzMnpHaUo1RXVlcUM4N2xTRFhmNDR2K2JiRXAyaUNOYzJNNG9aa3JHcUx5aW84U2VpM01ZY1hRL2I3N1lsWFpYZGhrK3VsbXRnZGIvWVZYd0luelhmNG1UTGoyQWpFUzQxMlJkcnNDWlRjbDgwdWEwTkRFaTJQRUV2VjFzcWEwRHJvMCt6VDBPeDluZXNRRTB2bWZIOUI3MmNObXpwL2cvbS9md2x1Wjk0RGt2eU8yMlJzMVYvQ2o2MXV6bWUrRDZxTnYxMHYxc1RPd2Z6cVlYL3oySGp1VlRCbkZtTzBrVXVrdXJsZzlEcjRYTTIrTHJtRUIzYXJ0OWxpY3I5MzlZbmtIWDRybnRqelB1NzBENVVkc0ZHWUVacnpPV2F4RDBaT3MwemN3alBOM1cxdXpKdE1LZDVPVHZnMlRuMnZmbytkbEphRW42cG81NGt3UmxyVXVkd1Jacng0amtJY1JxaExSbjhYcGc3Tm9EYjZ0NHd1YzJpMjN6ak40ZGJkdm56SjdyNXUvM0xTM2Q5VEZOOXhQZkQzQU1uamk3bEVGc3JEc2tTV3FodzFUbzFYeFdxR3VscGRxNjVUczFXSm1xdm00WVYrUk90RDlGd2s1ZktBYkpNRFVpWWZLWS9zVXoxVWpueXBScW14cWplOUo2dE1OWTMrQTlVVjZudHFDSHF1VmhlaTYxbzFESDNYcWVIcWVtUUVtbTlYSTlVdmtiR01jWThxVkkrb1I5VVVWWXBNTmY4TlZJL2JmZGFYTER5VHYvdkpWQ1NYL0dDQWZjdkNwaXhta1NNREtVMWhIaWJuTVA5VEMwbG01QzBESFdISnN0cGlaU3JJUW45SXBzWkpidVJwUmc1THVEYkxsY3pJbTdFcDI5b1Zsb0d1bUsrOXJwTG55aUJYQmxzWkowVXlXaTZXTVhoZ1BIOWRqQlNDY2JhbWlMSUpNbEVtOFp3c1U2aVpMQmZaT2lOakltL2owQkVXbzJFOE1pWk94cmxqaEdTaTdUWFVsWXV0RExVWXlpaUZib201d2lNVXVUSW04bGFFYlJPc2ZXR1o1RXBSWkp4b21lTEtaRmN1c2hLNkVyVWZHeEZqaSs4Y2tUNE0rUVl5ek9ZYmhtR0d1eEsrTGlBbk4raVQ0RXQyaUN1ZDE0VlJHSkZndkI0MkJrYkUxUlhZREhhVTlKS1JTRy9lQ3JxMWIyTnRFV3VEaC8zclF4VDI5eVRLREU5N0dTMmRtdjZJMTFya3RiRTR5RVppaW8yOGI5aTR5N2RSNTdOUk45UjZxb2NkcFNjK0tVRG5hTmJZYS8wK1dxYkxaYnhmaVhqa0Jwbk4rKzN5QzNyZklYUFFlYWZjUys5ZnkyL1FkcC9jajU3Znl1L1E4d0NTTGI5SGN1UkJPQ1FQdGxtSXR4Y2hlZkpIK1RQbGo4aWpXTFFZeVpQSGtGellhQW52anlPNThnVFNXNTVFK3NoVFNMcVVJcVBrYVNSRGxpSUZzZ3pwSzg4Z21iSmNYbUxFbGJJV0RhL0thMmhZSjV0NTM0TGt3bDg3ZU44cGJ6UHVMdG1OYi82RzVNaTdTSmE4aCtUSUhpUkw5aUk1c2svK3p2djdTSTU4Z09US2ZqbkkrMGZ5Q2UrSHBCcHROZklwNzdWeUhEc0Qwb2lkSjVBYytiZDhnYld0MG9hZFg0bVd2a3JnekV3NE0wUHlWRjgxUUFhcUxKVXRmV0RlSExrUUZpMlFYbXEwR2lQOTRNV3h2QmVxUWhtamlsU1JqRkFUMUdUeHc2N1RaSUM2UkYwaXFlcFNkU252MDlWMDNvdFZzWXlFZVdmSWNNTzkwbDlkbzY2UndXcW1tc2w5bHByRkhlNlZOTGgzdGd4VHQ2aGJ4YXR1VTdkVEFnL0xCV3FPbWlQallPTVNLVkozcWp0bENOdy9WeWFvdTlSZHZOK3Q3cWJOUEU2RHNXcSttaS9qWWUxN3hQSTJZOEhia3ZaZmNtNU5mSGphbGRSSlRCTmhGQWZ3Ly90YVNpbWxyQW9xWWtWRXhJM040b0k3SUx1bWFZd2hKRkJaVEtBVVExdEVSZFNLVzcwWUR4NE1McUFZWTR3SDQ4SGdFZy9HZy9GZ1BCZ1B4SU14aGlBeHhoaGpqQW0rZVF3RzRvRjZtTitibWRkNTgvcDkzM3dnQUJhTUdNYWdpa3VyWExCNTNINHZWc0xJOXpFeHdUbkFCQ3NTa0lwMFpHRTFDckNCejQzYmFrdnNjT3h3dXV4d09uZFYyK0YxT1N2dENPbFBFU0lSZzBRc3hCSXN4eHFzeFViSlJFUEJEQnVTa0lJMFpDQWJPWENnU004WkVJVll6TUU4TE1KU3JFQXVDckZKenhtNWFoem1ZajdzeU9RTzg3QU9tL1ZjQkIveFNNWUNMTVl5ckVJKzFtTUx0cnJkSGo4RnhaQjRVYndzRG9wM0d0Mitacm92UGhTZmlzL0ZsK0xySm05SE83MFZSOFFQNHFqNFJmemUwdWx1cEYrYUNxSkp0SW9KWW9xbm85R2owc1FNTVZ2TThRYmFPNVZETEJLM2kyVmlqZWp5K1hKeVZhM1lJTGFJSHJGVDdHYnpWSy9ZSjRiRUMrSWxzWi9OVjRQaWJmR2UrRUFjRnAvNUF2dDg2b1g0U253anZoUGZpeDk5Z1FNK05TWitGWCtJdnpVTlNqVHoybEY4MEg5RWJkM01ibFFZbXNOUVRkTXc3VHc2REkxaEdCR0dwakMwaEtGMUZtUDRxODNnNzZhQXY3WmlWTUdGT2pUQkF6OTZKa2VlVEpOalFIbjZUT3pWNHg0OTF1blJxOGN1UFhici96YW9YOS9TNDAwOUR1cnhPdGZPNG4xQXNVYnNSeHRHTWM1WG1iQ1FpU0xKVEZGa29XaXlVZ3paS0pZejZZaWdPSXFuQkVxa0pMNjI4K0dnUWpZTkpxcWdTcXFpYXFxaEJxNmN5bk5uNGIxQjhaalo2QndNVkVRZUNrblVPamJTK2IvblAzbi9JWHdUeDJXMytzUXFqQ0daTzRuN3Q1ZXBIclMzejN3djd2S1RNL2VrWWxSZ04vZllTMzcyR0FYWTQ5VEZucUNEYkpDNjJaTjBpTzJqdyt3cE9zS2VwaDcyREIzbHFzUTdxYmFLbXRIS3ZYM20zZ3c4dmtFZXgzNWM0OHdBaG5qOWFHdm9MSWJ4Q0kveFJGdTlsTU96cHppV1VEa1BlVDNWeTY4VXRWRTczeWRxSlovTVJUTFhPc3UxcnVBcTF4dmdPYnJCOHpVMFZVdXJ3elZLYVNlVlVUblYvd0doU3UwREFIamFZMkJoRW1lY3dNREt3TURVeFJUQndNRGdEYUVaNHhoU0dGV0Fvb3lzekN4TWpHek16RUE1ZGlCbVpJQUNYMmR2SDBZSEJvYi9mNWwvL1R2UHdNRDhpOUZRZ1lGaE1raU84UVhUSGlDbHdNQU1BQlg4RGJONDJxMlVkM1JVUlJTSHY5L0xnaUlpQ0FRQ2hNM3NJcUhYaEpJQW9VZ1RVWG9nQ2IxM1FoY1ZqQVdrUzY5UlVVRlI0V0FYQmJGeHdONUZRREM3MkJzcWlLSkkxcnRMd1BLWGYvak9tZlBtenBsM1o5NmQ3eHNnamxqenlpT2lUNkpGaXNYRmRkcmlFdndhbThPNWVmL2hpVk5kRGRRWWpkQmlWZFFBZFZOMzlkRlMxVlJIMVZCTGpkVTRqZGNFVGRRazVXcXlwbWlxYXFtMlZtdWwxcWkrQmxHTTRsekV4YmIySlpUa1VrcHhHYVVwdytXVXBSemxpYWNDRlVtZ0VwV3BZanV1aWw4OTFFbzlsYTMrU3VBV2J1VTI1aktQMjVuUEFoYXlpTVVzWVNsM3NJemxyR0FscTFqTkd0YXlqdlZzWUtONktVTzlsV1A3RDFLRE9qU2tEMW5ra3M4OTNNWGRiR0V6VzluQmt6ekc0N3pJUGw1bUx3ZjRpQ01jNGpBaGpuT0NIL2xKbVZxcmtScWxmbXF0TFBab3FJWm9tQ29wU2F1b3hrRFFzbWlaTkZyNWZ4Vk5jZkxaYXhNRmFxQjYybkJoUEYwdFZBY2ZWMUNUUVdUenNUcXBzeG9yUlEzVlNDdHNTaUd6TlYvRDFWeHBpbGNGOVZVSHBhcUpsaEFnaFNSU2FVcGJycVE5SGNta24zMlJ3d1FtTVpudHFxd3FTbFJWK2VWVVhRRWxLNGd2YnBQTnlhU05uVU1GNjVXaUFXa1daVE9ZNjVsanE4L3hxbmpOdk4zZWZ1K29mNjcvcEl0ekpWMjhxK3o4THVpU1hVT1g0dEpkZTVmclpya0ZibHNnR0ZnZVdCa3NHNHdQRGo3akZVWWlaeU9SMksrVndsbVYwMjF2T1F6aEJqYXBpNWRnZVhkNSs3eUQvanovQ2VlNUVxNmNTM0NKenNYeU5uWnBzYnpUWE42Lzhxb29yeUtub2pXRHlGNWJJWEMraW9VekM0K2Q3NGN6d21uaDFLSitzZkNBOElSUUpOdys3QXY3UW9XaG5hRzJvVEtoMGdXekM1WVdwQll2NzIzUjFpSXZlbHFiYU8wNmEzbk0wd0V2SXpyc3RmSGFlVjI5ekhQNXZKNWVwcGNOLzRzbi8zRGk3M3hmWU5WbnBFUkpXMmNzclRmZWtveTBPQ05tZ3pZYWRZbkc0VExOMEV4akwxOVpSa1YxVFpmUGVGcW9CVnFrQnNaVWt0V29ab3o0YXNaOFV6dVBGT09sWXhFdjZlWkFUb3laUVdScHViRTdPVVpPcnAzV2VQYVlHZm5teGhhelk3T1J1OVhjMkJHelk1LzVFYlhqR2ZQamlCbHl5T3c0Ykt3V21DSEhvNDd3Qjk4YnQ5VzUxeGk0azJUdW94YjNVNWNIcWNkRDFPWUI2dk93Y2JlTlpqeEZJeDZoQ1U4WWhUdHB6S08wWkJjdGVKWU1ucU1WdTQzTkYyak44M1RoTlRyekN1MTRpYXQ0bFE1c3B4UDd1WnJYNmNvYnZNazF2RVUzM3VGYTNxWTc3OUtEOSt4azM2YzNIOUtMRDJqTzB3emdFL3B5a1A0Y2pmcG0xSWNaeXFmRzZER0c4UmtqK1pJUmZNRndQbWNzM3pLR2J4ak4xOHl3bTNJcVB4c2xQekNkWDVqQ1NhWnh5cHc1dzQyY1pUWTNHVW8zeXlOUFloUmZNWTd2ek1CZ2tYL0o1bUtBV2Z6T1RFNGJaNzh4aDBqTTh0U1k3MDNzWnVtcjFuOEN6Ym9xQndCNDJzeTlDWGdrVjNVb2ZHOVZWMVV2YWttOTcvdXUxdDVxdFRTanBVYlNqSGJON2huTnZuZzhIbzkzc0EzR1lHTThkckRCZ0EwNEdFSWdBVjZXQjloSklDOWdZc0lqWm5YeWVKLzVrZ0FKWkNFWVFnekdyTUhUZXVmY1cxVzlhbWFjNVArK2YyeEpNK3BiNTU1Nzdybm5ucjBJSlJNYjc2UFBDQzhRa2ZoVU55R1VYQkFvcGJjVEFyOFJIYUxzSy9vY0NjY0VmZkJxY2MvTEg0TmZFNEZZNE50RHdsTkVJVmJTcXhhczFFVG9DakVSZ1pxRWEyR0VlMVVTQVlxSHJoRmlNY013eGVGd3lFcWdXS0lsbXNvbEZGZEN0RkRQRWVyWXU3ZjZ4YjNucWVXQzhOVEZ1Vzk5aXdib01aaDNIZUNmQXZpZHhFZmlaRkxkb2xCSmhCbEVJcGxFNmF4TUJZRWNaL01vMUdTaXh3bWJLK0R2N29wRi9QRkEzT1hvOG5YN2V1Sm14VjkwSllhOUhyZXNlUEY3S2tGVG50THdhSGtrSzdMdnFaUmpuWVpPdkdwMmZQdWUxMTlUL1FiMWZQR0wwNnVyby9OWDdWLzRtdkRVeWQzait4emRoOVFENTRVN2Z6d3pPanB6OFl1TEV4TUwxVjhnSFNnWjIvaVo4Q0hoQ3lSQmh0UitqOXNrbWdoRFV4Uk9Fa0VJcjVvb2pEb0oyRVhvR2lVQm43UGJMSk1FVFVpS3Q1Z1pIcTM0WkRtVjdCZktJMU5DYWRqclU3TFpWTEpUOExpakFuMy94TTNaNGRKdkxDKy82WGlsY3VMZTVkVUhoMHE1V3llMlhyTlVMQzZkM1RyY1g2cE1qSis4YjNuNXdzbXhpVXE1ZjZSdjdmems1UG0xUHR3ZnBOOXZBLzA2U0FEM1I2clJDM0NqeDAyVTBhdlRUb2lqeXg3b0RNQkFXMEpXZk1XU296UWNCUVE2aFpRckJYK2ZBdHo2aGZYblY5OTRaS1IwNU41VjZRTWZHRHUxVUNnc3dPNk1IbjNqMHRJYmo0NEtkMXo4cStMeTJZbUpzOHRGb0FuT3ZSWG10cEVCdFJkd0VVMkNlQlpJb0NOZ01rbkhaU3BKSGdtWUEwYlpIUGhIVVVJd2VjS2ovN2RPLzZGNkUvVldmMERmSlR3MSsvUFppN05FZzEwQjJCWlNVTE90c0NWZ0JvOEp3VnFJeGNGWUxsaUQ2dUF3bmRVWEFPS3ZaNnQvV2R2RDUyRVA4MlJRN1hNNUJVbUFIWlFJOEpucExHd2kyNzR3MG8yY2hQRVJzdVp3NXpQNXRLeUVpeFRwMUg3L2tIU1ZWRGtoUEY5YXYzTis2ZDRUbGNyeGU1ZDJ2bjE0SkhmSDlOWXpTejNGeFd1MmpCeWFMWnArU0xmUW5RdDNIeDFsdTNuZnlmRXQ0eVA5SmI2Yk8vc3k2c0hTSE1QeklLejlQa2JYbkpxR2Y1dEVham9yVUZ5M0xBbWk2QkZiNlFscmg2OFVmRCs0U2g5WlhhM2VLRHhWL1FJZHZ6aEhwNnFmNCtzL0FOOC9CSEJGRWxDOWpJd0MxWTR1bHdDY0xSd0hWdkdJOG1lY1FETTdQTk5GNG1wRWtRV0tOQk1FMkYzWUM0MU1ya3hTaEJOUDRkQWxzN21LMTR2SHpsRVM3Rys1ZmYxTmtSMkJROXQybjE2bDVqZTg2L2krOE95T200L1JQK2F3Y1krdkJ0aFdrbEdURmhuT0VzZ1d5dFpwRWdWQjhBaUltWlZZblU2SGhDSUZjQU9wUWxQVXNiNUs5NTJxdnBmZWNLNzZoN0RRUDZFcjFkK3J2by91ckQ2cHdSMEN1QktKcVdIT2lwUUt4MFdxZzVTSTVIQ1lRR0l3dW5rQUdJaTRpNzh4eDU4RlBKRDI4S3hOcGlJOHVvSmtjcStLZ0prSG1NTHBjSnFBMnpJVXlGMXl1WkRxOUdQVmx4Yk8vK0FINXhlSGhhR0x2d1VZZGRLZlhKd1RUaHJyZkpEeGNsUU5LYkF3WTVrYVNnQ3hHMEc2U2xRRWNOU1ZXdDlGSHhjV2QxU1BDSXVBMlZQQ0hBRGJmZkhqWENhUHc1NjhDSHpzSWptMnduYXNtOC9uMHdpeWtYR2pnZ0tIdko1emhSZEhqOTI5dUhEUHNkSFJZL2NzTE41OWJIU3RaK0gwK1BqcGhSNzlKejJHa21mczVJVmwvU2NLSDEwSXdVOWREcTJ6dlhUaDZZSWJnZ29tQ3ZJYlVOS1BMRnRyaDQyUUxydk4xZUhDblUwbkZMWU5YSEtEaUdheUNNWDFPazJjdWZQT004OTk1U3RmV2RpN1YzanExcU5IYjYzK2svQ2E2dk1yMjlSbGpRN2ZablR3a1FHVXlnUDlBUkg0UmphQnRCQldKRW9XMjFPbU41L25sQUV4cU9UcTVUS1F4emM2V200ZzBXZ2xKN3c0VVpvWjI1WS9NbHhQcDR0SHM3MzFwTXJNUm83Ull6c2ZIRm9xTGdWQ2RlVDZ4TG5jRGRQMUpITTVyaU02elE0QnplekVTOGJVc3BrS0VoTklBcFdFczNqZGFaU1R0UnUycTVNUVozZW50OHNMajlnZDNvU1pIUXJ0MW5PbHhBYnl4YTUrM2M3WmQrMS8rR3RmL2VwWHR5TUZiejYwL1l5citoVmFySDRkeVBqUzBzVGtFaitINFkyZkM5dUZ2eVFGbERjZU4vQThQK1E2N2VCSW5BUUNSc1Mxdmt3eGhiU3JhSWQ4Skp2TFpiUGxrVkZESnNvZXQ5Zm53eHNZK1M0YkhwaSthVzczZGZQN2J6bXhmdjkxYS9kdnk0Kytkbkx4Mk5TT20yKzZKajkvYW56UFcyOFkyenE4ZTJKa3JNdmwyTHZqNE0zRi9vbDg3K0pvLzRqTjVUNjAxcmMyRnQvS2NRUmFyVEE5SktGR1RVZ1EvWmJSRHpWWFBWQk91TW9KVHdwT1pWZ1lmSEZWZU0zYzNNWGZFRjRETUpiaDNMd2VZRGhJU1BXTDdFekQwNFlVUzdtU0dsOEE0aUMvSEc1ZGtMMytQZmU4OFRkWGJ6cDY5S1pWbW4vTC8vaklXK2s3cTllZnYvZmU4L1NkaUp1dUk4bUlHeHpwNXVNTjhHVWlPNW5FU1ZBVUdaU0dxaS9zK2ZHTE82cy9oT1A5c0hEclJaUTlQVURvQSt3dUJ6Z2Rpb25KSGhDRWlLaEpGejVPUjdjRUVqK1JFaEVRL0MrbVJOcTE5dGphSFI5ZC91aHJsaDliZXhJZ2ZrYVl2Zmkwc0EyRXhoNkFDeWRPZUJPVGFTRERiV1pKTUxVSU5hZVRTNkJTaWpLNElrMkpadzdSem90SC92clpRNyttM1VlL1E2K2plK0NPOWxhZnFMNlREckU5NlFDNGR3SmNNMG1wY2NWRXhYWXJOeE96MDhsVzd1QkxkOUJ3OWNlSHZ2MmQvZFVmMFNoOWYvWEQ5SEQxUlBWZkFGNEc0RTB3T1FuNmhFd0JTUUFwck9CY3FQZXgzUkpCcGRGdlFMajZRWEt5bTZGTUpkaDBtdkZrUUJUdkZ6cXF1K21mamdKVHo0NWUvTFF3dTdIQjkwaDh0NUNGODBXb1FnUGtPdkljMmFKV2JGeWpsV1RwQXU3U2hRYmRWdEZPSHFWZG5mWU9xNFdhcWRuaGNKcVZkTkdBK1VFRFpvUnNCNWh6NmpZTzArZnQ3akpKUzJZcUFXQkpQdGNXc3IwREZ1YnNDTmdEQm5RTFFDZWtEYzVCQm4rSE9tdW5rb3h6QUcxa1NiNWdVUVM0MFJveE4ydndPd0IraDdNRHVLYXIwNWpCV28vL293YjhHTmtLOEJmVTdSeC9NNVZ0aWxVRTdLVkczQzBhN0lBZnNRYzlQQlZJdVJ3ZFBydlBtS0dEcllIYkQrSTFUSDl3a2hsMTJnbjZBOG9XSXBwUm56TVQyV1NXbTNWR1hBOVhHaDNkOEdDWGcvK3hLaEd3S2tDOTg1VThLZmhLR05hRnNGQXRIZm4zNTQ3L3F2cTF2ZFV2N1FNakE5U251Wi9OdnF6WkdXMW82WWNqL3h5WlZpZU10UUloU1FzWmxYb3lkblVBRnpSdFUyMmZ6aHV3dzJ5ZndKWXhZQk1rNHRsWEJobG90eEVRVUY4TEFxNDNxcTRJd0lIQm9oMW9LSzZJVktUTHkwK0VkaDFVWThCZkpsRTJhWUNaaXNoVUhqUk5Fc0phQ0hRRWZRUUZGSVF6ZFFQRnRYVzFtNUJ3Q0tZSk9qeVpyTU9NQ2lYb1dUTEs4cEp1dTZDVXJ6UVlkS1BENlpnOWFPbnN6TGtIdHd5TWhPdnR1OVJVTEJTVjVaekZPbHpJekdRMGM4K2cxUXNHcmVLTVZtLzZCQ2ZWOGhNOXNKNkNqU3BXT0RWS0hkK1p6ZkpKSXN2QjFRWU9ES2s1V0psWmtjM24yanhUUDNKZGpWNmVYUTM4SGpid0M0RVc4UnpacGE0R3FGbXlVNFdkTzNIRlQ2VWxHR0dXSmZNNXdFQWhzdEorWGtxVDhVakk2M1owTlp3K05oZXpLUmxQS3BwTStpam5TYTlITW5INzBpU1pnQ3NGNEVyRDBwVHJMRTJCWmpQcFZORHZjbGdVbWhTU2lwTFExc0ZoUDI3QVRwSTNBK3hsZFNGTkpaTUdYMWd4eTBLYkdaUzZHVklwZ2FZS3FVSStsODNVNXJId2VaaE41V0IyY1lYc1UzY1hlOUF1VmlKd25KM1VKRG1vYURMaFlaZE1BdHNXVU0vT0VFVmhPeGxlTlRlWXpBTjkrV3c0NkhWMzJTMnduNlJDSzVhYTZheG9ObjNOdkVCN3Z0SXZibXBQRDkyM1lPOHRUdzBseDl4aFI5NGJTMmFTRWQvMk82NGFhbTloajA3UWlsQk01Y3RPWjd5eksrejNCUS9KRXlmZU1OOXFjN2ZadDJDTnRpYkpvQzJzV3JxQUJCWk0veG5hR3ZNOGFzd1RoV2VmUXlsYTR3OEoxRVJCTXAxcnp4NXBtS0FubitwUDk5ZkFtd0U4d0daK0E4WWZabzAvVG5IWkh3YitvQ3NXblRGQUlKcWJmQW9LTnhwRG9hNU8wR01Tb1VROEZvMkFYaHJzQ2xJNzdVaGFsU1NYL1FINDlqVElyMjZTSUJQcXVFUXBJQWNFT0dzQjNWWTR6czFJUlJHUG0vbVY3blFRRXZEQlJyc2NDV2NDSHV0S29OUkhIVGRWYnZCWGVPQUc4T2craTllZU9GSG50ZmpJUjNTL0JaMmNvWk0xMThVdlozNnAreTYwOVc5bGUyalJ6dDZydWN5R2t3d1hBU2lURnpieGFKaTVSNE5TdUZGaHViUUQ3eWFRMmRraU1lQiswSUFiSVRzQjdydzY1L2M1dWszeWtvWHEwdUtTMEFFeTlianN3YzZnTVlNVlp5QzFPUjQzNWtpeU9ZRC9Pa0UrMFJXcldiamNHaXg4Rmp2TVluZlpYYWdkR1BQWW11YXAwU2hZbTBkV2dQa1VXYm1BazZIVzlGK2Y1MUZqbmhpN0UyQWVDMVU2ekRZUktDWnZSaThybnlFWVFJckZvNEYwTU8xMjJ2MmRmbU1lKzZielJNa3pNSStxVGhLRmJZdDhCWnZTQkp4dlNodGErY0UyWjJjVjFnQmtJcGNna3JtT1NOMTI0S29HNkFiczh3YnNNTnNId0J0ZzQrVURDdFIvQmpMM1RXd01NdCtFRnkxb09KNWdjM1RERGRjRm9sdlVUQVFZNTBGNHpBZ01pR3VaRk5PNlE4VU1SWE1UWFJaY05KZTVhQlptcThmbzRpNzZIcm80UGRIaHM1b2R0bmlFQ3FzWC93ZzBBN0JLWG41eDY0eEptQktFZUZyekE0R2Vzd2R3aUpHNzFDNFBsUlF2YUdQQ0N0em91b2FUYjd0QUJSYW9LSUNiSkxFckpTR0RRcEF4aHFMT0paOXA5NFRDZFI2WU1KYkpNZDNTZ3JwbG5WTXkxVWI1cVhkVU51ayttdU95U2V2NS83c01aUDVRSnF0c21xeDZrTjhCYmhmempRTGdQaEJacUw4cUZFWFdwWHlseFo3aHdaNUtzY0o4cGhtTGtxdnBPTSt6YzJIVFpJZzJSeEVnc25rRUxrZ3NJRWdvVThFM242T25wMmV3WjlEaDRuTllsWUkyUi9VRjlPc2FjNlJoSllTTXE2UGFPZ3lZZUZhVTArMWR2UTRPMUl4QURid2ZOV0JHZ1kyZUk5dlVLUjJtQW1TaEtESXVUWlNoZ1o1eXNWeFBGSUhaNDk4R25uQVJIOW1xam1FQXhTWUx4QXBjUWF5Z3pWck5aMDBVR2FQRElqQnVKUVE1QXNhN0hQb2Z1eExqTEZFR1F3aStTc3pqQWJ5U0tDZE83TitQUHVDOWUxZXJOOUpIcWpjS2xzbmI0Yy9reFYvUTZlcGYwSHNmZ1BVeEh6UGJsdzV0WDg3QittWlZ0WTFzNXg3b2E3a0gycUpaRFplUjZTQTFhSnpCdC9QN2RlTjlBQi85MllJb1hFQjM4d1YyS0xVQUJhV2c5RW5VUkUwZ1daSWN4c2EzNGNrUTQwOE9JN0x4R29BQmNxcTd5MkkyQ1VzU2hhTU84TTdWUXdJbzFHNlRuTEtUUVpNUkdzRDZMa0R3MWVFVFpMREs2ckJNQlJiSUVjUUxzZ2tVSGVHQzVxMWswQ1Q0S2Rra214V1VVZ1pQMGVEOUJLQllHSDl3ZUxHTkd6azhpWXBtRXhoM0FKSGpKWE5JVGdkaTV2YzZ3czV3aDFYcWxyc1pQQXVIUjlETDhVUWR2T2pHandCZUQ5ZzNJbHVtMExMSU9pQzRTTURwbXpEa2orclc2Ti9ZQlRCWVZBaVhSNHpGbWVvV1o1YUE4alZTSVM0SE5uNG1Xb0EvTlRpa2s3d01qKzM2WklkTkVKbVI1Z0dSN0RKUlhTTThpU2VDbTJNKy9sdEd2VlZkS1kwSUtHL2hLbkYxZDFxVWhyazJmZ1V6V05uZHhuRU9zMzJCZFV2b2hvUjFuNzBjeHBSWU53TGtNK3dPMjZkMjZSYXlVRzhoZXpVZ0xZYXhxOTRnMWp4TDZ5b2NDUURtQlZ0WUR6dTB1UTRPckxaY0FpMTJMK2ZqNTJCbFBjeW01R3NNYmR6RjdUd25sVURvbWNCWWNGQmhDUTBsRVEwbGtabEtEZHdEaW5ZQWJTT3J1Y2FGYks4d1B2TjZ0dWVkMmpuK0I0QTlwcGFkY0lPYkZWZ2J5RmV3eWk1ZzVJZ3hRV1BzQms2dEQvNXp1VElweGRCbFFKNWVMVHdGTUx1NFBDVndFdEdyYjFWTXpNY0grSUZ4YzVxNyttUXRWTU45Wk5SR2JVNG5JS2padURzeEZzUHc2OWJrd1BzQnZ6NjFCNDFCOUxXWUx0UWlORnFJZ0ZKMjNPQTZjTUFXcHd5OWVrajRNdEhocEFnR3RSQ09kcldMeDRIZHZKZUhBMnNiWW12cnJsc2JPMmRJcHRPWFJjYkFwUVlqU3EzVnYrVlJEeGw0enFRSnBIb29BSUYyZGloT3M1TkRVaEFkMUgxZzE0UlpGZ1BBNkRyTWhMNXRzSXpwU3J2QWxaM1lQUjRXdUNvcjVRcndaY1dqZ0xaeS91alIxU2Vlb0EvOWRIRnBrYjZoK3VkdlhucnpEK2RxT3UrRGpQNU96YzU1TXo5ZlpsSGdXNm1iZVEyT1d3ZEd1Und5WEZnR2pNY05HRWx5Qm1DTXFxVU9zQlVaSEdGRnFUTVlHeURaYkRhSHplRndJVHl6QmcvMjRFRkdQNmUyQnk4QnNuQTNHRGpWc1ZjTFF2WHJldGlBRVdMMzE1UzYxVThWVXdmb2p3eVd1T0tqcGlXQXAwZ21wcjh3UjJ3RDRGUW1sZWE0RlJBM0ZsdGo5SEpwOVBvVGdGc0VEWlF2ajBvWE5nc1Y1L09aR240Y3pnY05PQkh5ZG9CVFVVZEdTbjI5SnRNU0hIc0Fab0xUM2xiUktRd05GRVo3UmhHbW9tUWFZTlp3Q3pLWW9PZjBBQ0RLSFE2NEQ5VFVIc2RDb1RCUUdIQjRFU3B1UlEzbW93Yk1HTGtmWUlKV29sREpJcHRGRTBYdlFqdG9vK1dld3NTV3NqcXFEdllYUm5wR0VLcVY0d3FTYkl3UThhZkExMzdTaTVJT1Q1Y2ttczRxUUhUTm1XK1JCVWtpeDgwOEFCRU1VSkpPQm5xRHZUNHY2aFQyRHB1RitLbmZxbmlMQ1QxQUI1cTUxNHZlWDFsV0VwNk1wdnNhanArM0xiN2hjTGw4K0EyTHdwbnEydmlTOHJHUEtvdGI2Sk1YMzFFK05wZlB6eDByang3Ym5zdHRQNmJydzNQNU42N01ydDNYTTdlOWQvbnMxcTFubDN1THk5ZHUzWHJ0OGliMDlwTnJ1ZjRoVXlRMXVSU2hld3U5SHI1NzJXSTdXQW55UGk0SGdSR0ExTENCWnpmWFMvTTF2WlRET1cvQUNUTWVZUEVTVUVUcFpvcG9NMFlzNHEvSGtVTmdxNWJJbnk4L2tjZDczUTQzVEc4eEh1c1daTWtVb25BbnJZVFliNFdtMzY0dlAyR0JCM3dnZkVFRm9HeEcyTkdUR0ZLS2s3WFE4aE8yelQ3MnNJL3psM3BhamZHckNqL1d3NURNMU5OamtldnI2NnFscDVCMzVic3hROE9YcW1Ba2tyc0RLeVhGQ0VIbVJMZlhSN2wvVUJySjVpaGFxVlBDdXhkM0Q3Qlk3dmpaNHREeUx2ejczWXZqNTRyYk1nbDZKckdyRjhPNlFqaVRyRDZlM05XSC81Qk9EL0VjbkZSczR0UVFqKzZtNHpRemZqWkxQeEVJb1lOd3k5bHNkU1VRWVNGeFk2OGVOdllxUk43SmJZaFJrRkU5ek1ZdE40a25pbkdpZGhzSVlpcFh6d2NzZHN6NHlhdkpxU004Tm1UaFVlU2FCMGlMSjF0cThXUTlOZ1NLT3cwRkEzNmVRMFU3YWFmRG05UmlReHorNHdiOEpKem81OGdlZFdjQWpCNmNBK3p6ZWorVE5vdTFOb3Z1QWZmN2NSNS8xQitOaEVQQmhyazZ0TG5nUGpqRTdnT3ZkaDk4QVNDQUxXSnBpSWhyNXRzcldRZy94eXkrTFQ0RzhIMGFyYWJKMTBsSkhmUjZCQjdyYmlmYmExRnZoN012VTB6WFpEdUg5MTREWGhKTzBOZFJ5dlV5M3pyQ3JMc1FONE5hTEJhSGlrTU9OOEkyYzlnc0Z1OWlzWGlWL0kzcTVySDRLZmhXQXF0c0dKakRCTnEzRlk1TkRwbEdScVpwQmIxS1pGazZDU2NsSWVFcHM4UHd0REVjTDBEcFRGdUVRbHl4djJMUVZ3WVZqNmt0blVrN0k1bGl5cXhFcnpSM0lOWGU1Wis5YkVxQjBOSGk5NTk3N1dXekRFWWJ2Zi9yeXRiMnZCT3M3VFg2K3ZsZWIzTHpYbkt2RVhiMXg3alhCdXcwK1RqY25LQkgxdmlTS1VLWFo4cGFma1FYNXN1WjBNVWt3YWFjeFN3SDNjc0VOb3k4cHJrUHVuRW5NSFdKcFVwdzUwSHExWS8vUkJoODhUM3ZXWDJjM2tLVnVibnFyeWFyWDZVakhGZUV6K1NCWCtQNUFlNHZ0N0o0Z2JsTy9WTmFzak1zRmtvdFhSYTBEMndOTVU3a2R3ZkRPNHF4ZUZDU0JZejdBMFhOc0g0ekdMMFl6U0JuNEpJMFNjZUI3ekFObEJscGZCbnBUTktpeElwU0s1K2t0S1VoRzlIM05mSkR3SW5yZEhUMWxoK3AyL0xUUEZOa1Jpanl2WGtCOFRMV215Wi9CQXNDSFYzYkU3bGxrV0NSMjR3WW42TEh2L1c4cUE2NDgwYlVJUVFGdXBvSnZaT0NLR25XcmN6WHBHVnBlam85TUx3am5YRHcvSjZTcDZSbFIzbHE2VDJyenpWa1I3ME4wNlBlUm45US9kNnFxcTRBL3N1R1hSalFaTjRiTlArTElaVmFNbUJBUzArNVVqVTV4MkY4MElBUmdkVThoM0l6R3ZGNTYzWFlGa2h1VnlqZ2lydmpDSyttdnpiakZHVHd5dXF3dTBWL2JjM09jYmtDcmdEWXFRQlIxMTA1dkVjTmVESG1Gd2NkdTE1M2JZRVVqN2xkMlhTc0o5NFQ5THVpN2loQ3RHNktvNThNNlhxYW9mTzFRODdyOGpyNWFyUEZkbkFTekdhQ3MxblQ5OXJRbisrQWZzZHpHT2NOR0dGR0w3QkZERjN2c3BndzJiQzhFV0I1VHhseWxXcnRvRVN3QStzS0s5dzFFcEtBK1ppZXhYMDFLR09ZdEVtZ1A4ZlBBTkF6VFlQUW9XT0JTVEtaUE0rT0JVV2dUYlpBY3hyVmJXZUdCdXBjSnZsZVdrdXJ1dk1EcnVSRXhIQ2VKQ2VUaldsV0JqMWVNT2dSWi9TNGdTY05aQ3hVUnVlSURPYUtvckJMS3JqYVFwK1Ftb0tUcDhpU2NxNDJ2bVhVdXVyYmxFc01QQjQyOEFpUm8xd1d4a0d2Y3pPOUx0WkdyMnVaQmszUCt2MW0rVitNWjBMYW1mMTd6bnQyczhSeXdiUXNKU3BmYU00S3c3d3doNkxrNitBOGFzQ0p3YjNDOE5QaG1LbHNWU3lpQktpZWE0UVVDbloxSm1MQlRDampjWFVHdWdJTXJrM2o2V2I4L09RZFhCN29jQlV0aXdhRlN3UFl6czVPUjZmRHhhRFY3cjltZUVIeVo5eWU3UUp5Y1poYWhwTlpFZG9DZFhlNkhXNEcxYUt0bmVXa01aZ1JqWWFIdWMxbVJ2OFhPaGNNdnhPbGRXbXBsTUxkWktVV2FuRzZkRjlSTTZ3Z3FlaDVQYUtKdzlPY2E1aEtRMFFOb3N3aFdxMlVXcnV0M2N3cnh1Q2FHK0ErYXNDTmtUN3VEOVJ4QkJsaGtjd2llcVEwWjRYQ1lmcThnQ09OaEx3Slg4TFJaZlhZUEJ5eWxidVQydURzQjQyQStXcnFZSXNtN29CdklBQkQxMjdGRzVxQlZMaXZpK1hrTVhoUmpaNTdPQTBVdktkNWZsNU56MjNNMU5PdU5Vclp2VytsVnFmRHhTNUdBKzdqQnR3azZRZTRpK29POUNucHNNV2FYdEVLWFZNRWJEWkswY1BFb3ZGOERrdkRISThhYzBUSmgzamN0QTUzVEtCZ0xvNjJxQVBhMU5sdDgzWjROZEJtL1Y0ZjJ2Z0YvVXY2WTlDTEN1UjFxdHRCQmJFYnRCY1FLalNkQ29wY1UrZkpXUlJZbURLemp1bHVNVzdubWhSQk0zUlRiVWFZVEI0K1RPSG04THJxb1NTZlRjUUNmamlZSFlwRXdqUnNWcnhGWDFKWG9WSHZTY0xsUFlyLzhvRDZBNUtVUytReVU2Ny9hZTMwbVQwOXkzRjFLamxmREEwZjZqMTBlaUcrOXB0em80WHQwZGhNWVd6T3NuZG0yeTZYYTNaaTB1MGQ4L3ZXOTFhZkdrOGtIaXVPaE1QSG5JNWg3dGRaM3ZpVjRCUytRZHdrUVk2cG5RRy8zV3d5aVhTbHd5WUlTOHRQSk5Da3g4dUMzUk5zSWVRazFVMzZVUDBuTEVLQUh4TnRoWjFlVHlUa1NYZ1RHVmNhSzRneW12ME9XbHpGZ2F1S0NqbFlvRWZYOGdSbmFtcmZZUC9PeU1KaWVOZlF3TjZKMUV2RlJaOS9zV2Z4MUttZmxvL001akpKVmZoS1YvVXJ5Vnh1OXNqOXFmaVA0dW56dTNhZFoxZGFHZmJ2bjJEL1ltM3JlV0sxZXA1NFhUMVBqTVl1VjgvanBUMzUrVUJmNm1SNWVGM05acllkTEkyZVNnOEVsN0xwNmI3UTFlUFJjRittSnpkM3RGdytNcGZMcDB2aFJHUjRMcmZ6ZWtiYjhzYXY2SzgxMmg1WE84TWhCNTVWdXVKeUNsU25yZTRQaVhIbmdDVG9YQlNxZmNKT3RPRThZTFR0Z3AvUmdBOUF1L09nNGZtTGlYTGpBb0RFbVhwdW9YOFUzaldJTkVVYTk2MUZGcXYzbmxvc0xnQjVDNHVudHFVeVFORVJwSEVxUVJOZEY3TS8zWFUrR2Z0SkxIVWRYOGN2NksrQnRrRllCMGllSUp3MGJzV2p3b3VxZlAwS09JYmhVQ3dhU29RVFNVOCtxV0J4UldOYXZnY2RmNGljQ0F5UXlHYnBQL1FjS3BYV3QyVUF1NkhCUFJQSjZodWxxN2RuNXdQdm5yaktTc3ZtL1dPSk9LUHkwZGxjZHR2aEVlL1M2WkNQTGx3MU8zT0EyMHIwcVBCOXNMcCtSN1dhUVJKWUtGcHgzTEkyeWltOHF6THpOS0JEeW9lSDBXT1kwMEdNR29FSU9kZDJoT2V5VUM0RkFPMWxLeXFDbVZTM29rVEFTTlBPdDRlYnlGcWtOeFcrWVdXSE8ySHZEblgzWkI5NmFQRUcrdno1aFRYSk5HT1Nlb3JYVFZUMzBmK3A4VlFSOXVJRm9IRWZ1VXQxNUhOUnUwbVNmYUM1ZTFtS0IvZkNKY0E0NUY2NFdKM1lNWkkrRWlKUHJCQjhxMndnMlh3Y0UxUzlQWmxVS09CMmRuWGFMQ1JPNHlpb3BEcG1LK3NaSTVyRjFpeXFxRmZudlA2MXlNTDUwME9uZTJKOVM1bVpIZUZkWDZweG9ZdzhPSUk4bUp5K3VISG9WTWcvNXZPcWswZFNtZi9ZZFQ0VmU1RnhJOU4vNGR0MzRGeTVVSmR5aXF5R0NiNlJKVjBYaTYyYWpDSkdqTEtEWXNzRGYxenVvRFIxY09ucVdGNE1ydzJ0blY2Y244alBlRkc2UEYzc3ZYcFg5Zk0wcDY1a005WGZSSnB2WlhWV1h5STJ1SHRoUmtPVWhGZFIvdmswZTdFRE5IR2UrQXZTM0VadE1oREpwVXR6TVBkOE1Pbk4zbGpNNjRsRk94ZUZFL2lYbU1jYmUwM1ZUNS9IdmQzNDRVWlJteWVFa1k5dTJOQXV1SWRZN1lzK0kyeU5qd2RpVVMxSkNKaHdUdncrdDdNalpBL3hpWldtaWNWYUtnOXE3N0tPeEEwZFBxdkZZWTJGRjZlRkUxRWZZdU9MdnZ3Vmt6QXRDTkdrTUhIeHMxdG5ESHAvRytodEpYbFF5MlZSeEhBV0p6anlPZFBpT0syeHRzdk5DN0VxamtwSm9hbWNaM254K1lPL3BPS0pmMFBxbHI3NS9BYjUvdmVOZlNUdkJMZ2ljYXBkR0IxR2VLaitVc1ZYZEFHNTNya29mT05pVnZnS0h3dWk4OGVnQXh6NDA3UkZGRkdPTGo4UndWZ3dPM01uRVI5QXhxeElJcnZxOFZEaUw3aDg0a2ZCK0pDbkMyVklKdVZOdWRJcExWMm81R0hjNFd2aUVXOFR2eXowbFhhNnczdktpMGNYdDFXeVUxNUJXSnlwWkNhODlQbVZucDZSNHNEZ21WM1Z2NlNGNmVWc3p1cTE4YittMDlWMzFYZ1gxdUVpcTU4RTFzVmNCYjRNRjVPZWxFa095Y1JEc0NHNEg1Z2t3YUE4dndxMFQ5WlZ1ODdhS2ExV1VzTitNOTZteis5czVtd3VUMzR1ZEROOFlpUUxxb3Ntd3ZIQzFDUmVoSzU1M0hENlk1NVlQaTNCM2xaMElhNlZvdm00ajRhNSs4cnA2WVBEcFFOcU9nTS9odzlNWi81OS92angrZmxqeDM0NmVtUXVtNTA3TWpwNmJEWUhvdnlCODd0M1gzLzk3dDNubVE0eUlEaEJwdUU5ZVY2MUJQd3UwU1N4L1VWWkZtR1ZVeHBsUUVpeEN6M09mQ3dCM09ZRUk1RlNkdzAxajFsWDNWNFBXR2hNR2VGWEpuUEYrRFNhNlV2SjVoeXVlb1ZrZVNHOGU4aVFYRHZERHhucXlOZUVQOXVSeWRYdXpPcFBoTHZyOVJHazZ3Q1QwN2ltYTFWTE9PUzBtOUFwd3RjVUJod04rWXlyazduYzFaWVU1NklaeDVDMlE5WlZGMlVLQUtySklKUGQxSzIweW1UZ2pNM2tNR29BaXczU1Y2bXRadXJpUEhXbU1yK3U2UUNjYjVmb2k4UkJ6bkE5dUtQYkNtY0pKQzljdGtzaHRRTitVUDRyQVNOSk9NVEo1REhmT0MwWEk4UlNONWpJMU5iV2tLVGhJSTVNU2svUzBFNGp2eWVSbTEzei9YYXZyU1BVMFRmcm9zK2ZMbzJMZUQyT0RGVC9TUGUxLzRKK0FIZzUxNjd1TFdZNFcrUGlXdkVWMUwzaHhSYk9GWmR6NVIwOS9idm1aMCt2RGgvcVQyZFhjb05iTWdON0ZyZmZzSHZpbXVuQmVHUTRHMDFhT3UxVDVlbGQwVmdwRk9oSlIrUG1McnM2T24wd3cvR0xBMzZIaEx0QlR4bFdCMEFYSkU2d1ZJUVZXUUoxRUZVR2VodzV3c2R5UGRIZkVaZldnQm91TElZT0Z5c3NPYXpDMUFXK3B4N21tTGx3NXN6aVc5NlN5THFpYm5ldlozcmJqWFJxNG43SFl4UFZyNk55dlUyUko5bmNDeHUvcEg4UDl3ektuUTR3VmFnaGR3QUZOaWx3N1VrdGhnNXlSLzh0MHp4cmhLdkpIUWQ2Rm9NZ3Bqa3lXS3hjNXA0aXh5TTdVT0FzY3VsRG42OStZOXRLTmszUFZmMGdnYzdzb2xzUkg4eEUrVmZBcDZuR3p0ZXV4cTdFUzlqKzVvczczLysrdFM4QndGZlJ0MWI5eFBDVHZ4L2d0TmJZK1ZwcTdFcjFOWFkvV0xoLy9wcmJ0dDEyWnZ1RitWY0R6RHZwL2V6TFR4OUV1SmpaOHcyQWEwT3BhRlZNMUZSRHNhNlkyVVl3TzRZeGJDVlh3amlsTDVWVDdKOTY4c0FERi9aKy9ETUhIbm5Ici8vOXovN3MzeTUrNFF1NDVvMUJzRkZ3RDRBL081SHhpWjNkNzVwczA0eVZnTEEya25LeW1tUmZoUzlkcnN2SC9jUDRVN3ZmK1Z1N2YrS2JIclg2N1YwT2N6aXp0cE4rcjNvVGZjZkZQOWs2SkpxMmlTeGZrb0lsUytodnczeWIxTi81cnFUK3JrQUQxUi9RbTZyL1NxTmI2UFYwZHJ6NkNKMEJXNXpaeThMbndCYS9GOERKTkFBbStYdFV0eFBXNHdDNzJRcS95cVJEZFhaekx6RXJvbUlXN3pHc1kwWGh4bm05RVczUnpaL0J5dzAzTEdxTGJsRUhCTnJmMTFzczVKTHhJRXV1TXNzMElrU3NSdjBGeC9sWkErZklyd2g1bnhwcWgvTm9lYURmcEN4cDJjcFdxaEF6WUhOdU05dmZRTHYzVWtOYlVZNzBGZ1ZhR2lxTzlZNDFvMjNqZFIzTmRBNEN6djlEOWZkU3hkeUt0NlRSdXQ5bUVZQjJRTUVhK2N6bVZtcGJkYlNITC8rQWdieFZSejVXQk9ReERqWTQwTi9Yakg0SFV0M0EvMmtELzlpUEVQOUw4RW1mam9EZDBpRXFpaG5tYTRlNlRVZDk2TExqRGN4dE91YVpzUW9TZm1xaU1qTTJNenhZSE8wZGJjYS9rM0dOU0lZM2ZpSE93WjB5U0Nwa0IzbDUrWWwrVkRuUlBlVHJGdEEvSk5HcC9uek9KRXVtbFZEREJ6YUw4Y0U2RjdVWkM2VTJLc2xVT21jM0M0Z2ducjNZS2hCQkJ0T3JROUR6TEhDT3dVMEdrOXJZVldLMTFqMm5qbUp0c0VSdDUrQWtTN0pGT250bEQ0S0JtaG9lb21UNzdNU1c4c2hRWmJpQzlsNGlIZ3BvcnFsQk90aTV1V3ZLcDZsUXVrblA0d1U1c0NzMTI1NWZFTmxzanQyci83THo5TlVOYnF2cGc2N1kwVkhENk04cytQdDdEcFVtemlSeVorak01SDQwLzYrNitIZHpvOE43WXJKVmpHM3ZHWnV6N0p0UmQ3bWNNNXBuYTZDdk9HUjRCWVlTOFhMLzBERDlGRG9IcW45ZkhPa3Rka2E3M2E3aGVobFFPMC8rcnhIeTI1Zm14OGFEY1YxN2ZyVFUrUEZ5NDl1SUFYYVMrb3NndnRxSmdScmVqeGw0aDBFT3ZPdFNlSVBRTWhNRk1EbDdKVUpyODZHdkhGdk5ueG9BZlFQUHpTUjVobU1VcnpsVnpYU3MwZzlTMGsrSmtnUkZLSVZPWWpnL2lkWWgrc2Z5aWgvV3VLeXBsZ1hBMUt4UWN6Mm1pZ0pLc2tYUUhCaTF0SVllWXl3TDlaNnBlMFNXUGZ5NTJpVkNDWnlDVWw5dkxoT1AxdmpmZWtuWGJMdFkyUlc0YTJsVHduSDM1ZHkzVGRuSURkNWNuVWZFb01FamNlQ1JqMStLUjRhSW1WZ3RadXM1TzdWMFVFVzBLSnZlY0lhOExWL1JNLzk1bVd2dytxZU1kWVF1RXZMSGFueU1XcFZlYW1sejc4a3JGYXBmMXJnbWkyaTIxTEN5V3BXVGJaV05oalZkL3BuV05VVUV1bTBhMldXd2Y3UDdqL21sbWJ5NWordEowNlNwNHRNa21DVGhIb0R1WHEyNXErVTZkN1ZBMDZsa1FxdjRqQXR4WGhSc3dIN0dnSjBNRWZKNjFaNnNyd2hlZm1JWWJ4NTlHb3kvTkV5azFFMFVVcFB0Q29nYkI4RVJTU1FFbXNnbGNuVzF5b0JXcllhNHZPRmd2dmd5dVZ2MThCcGltZGNRaXlZODRNaCttR21ZQkxneS9QNVdyU0xsT2xiOUlaelJrNUppV1ArVllvTmtRdS9aZkJSelV0WVhISk15M0JyL21YSmp6ZDBmUHpqVVdtM2N2M004MFM0QWtDeVl4aHV6alE1THhka0R3NjBoZ1RiOEVJUTlXMU9Yay9XVnhtd1RCTml4ZTFpR1RQdDl1TlFtR1BNOHJjMkRzYkpIQUlFNWRadkJlZWd4WVFUY2pPK1NNRU0rbStoTjl0YmdtM1g0WXh1L0VqNG1mSU5reVFXUjVlOVQ5Ry9kb1haR3drNkJSVG13c0VxTGNxQTdtcVg3ZUZlYjRoMktFZS9JdEJ1anRFWStYSlRWeUNkaVFULzFVRTgrYmVheFVoNXZFY1lBSjR6aEFTYnBGTmpZaWhrYmR3aWlqZ25vUWhLTEZaNEZCVmZIaE4wQXNvRkp1ekVXYXR3VkJpYUVSZkJndWpBWTZhNDhtSW5obGpoTXVXYTFYekllODhnamk1T1RtOFprSGgwKzBuVisrT0wvcmd2TDZQNVRzTzlZL3kvTmRjQXMzcnIrWDl5TkN2WXRjekpUNW1QR1o3cXd4d3VjUFl5Y1l0VGJjQUh3U3BxVUs0VXR3SlI2dnpFY0h6ZjNGNnRiTzN4L1hlY2xOdFY0KzllTXQrL25zbTZjWUtWMGlNZUxGQmtyMGU3UjRrYlh3bmE3VjgxdGcwZVJNTzV3UEJaT1JwSkpUejVsMGZJME9QeG5EZmdSTnpzN0hINS9YeTZyMTJOcnhZMHNQdFYraW5RcUVpNFdVb1Bwd2RvMFBHbkltT2NaWTU0a3pQT2dhazFUUlE0eEM1b0wxYjdtSldGOUhTekswblpHMEVPTVFtN0tFMnp4bWZhRFFjaW1BRU85bVVBTlIxc2pqalZhQndISHZlcXVOQ0RFY1dTVFlmMzRQVVpxR3Q1bjdlZTd4R1RHWEU4YmM4V3NCTHREaEJyaWdLeXdXMVpBazhKcHJHMm5HUnhBdW8rT0RHd1ozTUw3R05RbXM4TmtMWE9oM0hvSW5sMVVkelRPaHNkUnU2RTMzK0RtS2F3TjY2blJ6djlEUWxiVVJXMkdScXBkeTlkajNweHMyUlJ3YStNa3hoeVBHWE9FM1hWbmdkVjVVNnp6dmlTVGJnYWU1NEFWV1J3aFJzNnBYVkVSYmdzSFNLMXV1RjFGemJFWEpqVzNPZXZhYUloNVZpa1g1MzVZWTk2V0lldHFwMVpTbmNtazlLNkVlb3lob1VDOEtkNmdiclY2T3BtZ2FBZzgzREF4STRvcUNnMTZaeTIyVmdZN0FXUEwvYUF0M0tWMjlvUHVvbWUwaWJvbFF4UmlraFFUVUVtV2F3cWM1dU52U0cvTDZFTzFOTGQyVCtES0hJTURwZUdCOG1BWlNKcko1QzBndURQeUpqbHZsNHBhaDhkajVhRTZIYjdRTDF3eWl1Mk5LTW5KbWc2Zm5FNXVGdFhXWXpOZTRlc2tUVWJJWWRXWllKV3RhY3hLUlpleEJYTUllbGd4cEJZZThyR2dUUzAxemcwMEFIWVR6OVgvZWwzdHltWUcrek1qMlpGWXhPUEMvQWVhUStzY05DTmZ4V2ZVV1dqTEh2WDY0RFBSS00xQkNsRTVzdDliamtRejI4TFhoQTV0blVxcGh5dERCNll6eVlrOWc5T25BNWJSbnJuVVpGOHcyRGVabWo5eFVyRDNWTHFEbHBHT2hIZTJaK3ZFSDV5YnZXbXRtSnM1UEZJNk9KMm0wNlh0dC9aYy9FRjRhRGFiblIwS24xdGRQYWZKdDZJbTYzK0R5M3JnMTk5Uy9ZVjhyTk1reVg0d0NuMHMzcjFsdkRUTUhIVVlWdWxoM2plSzNyZW0rTGVsTmY3ZFh4dmNKaEJ1YVEyRVJ3WUhCRm9wRDB3TVR2UVZzK2x3ME9QcTd1cXcwb1NRc0JrK1JvNzM1d3k4ZzREMzc2bWVRWmluQ1hlVEZnc2FaTDQzYXNhTGhIa0ttbEMzdHFJKzB2eEltd1ZZV3hjUUc0QUZESlFIeWlPbDRhSG1KVENEUmVUNGl4SDRXNW9Na1lkVlIyOHg2UUF0S2tSbElVZ2xXYzh3UUFNY3RFaUNLcExoWVZJVUFRakhUbVY5WFVHZk1aWUZyL0VCc3ZuNGRRdytvRUVWaS9pOUxtZVgzWlNXMG81dXErSXYwbFNsSkw2U3ZJUHk0dmJ5cml2SlBSQk9mZnJsdjcraS9BTmpqNS9XOWhqdnFNZmdnOGRWUnd0M2NscWhVMWd4bjJ5N3UyMFljN0IrK0N0Z1RYNnZ0bVZOU3BZMmZpWWNGZjZEbE1qcUp6dnRMR1dDWjdhNHRUWlg1MWdSTVlhaG1PendHNy9XYXF4cjhzUFdWOHpuMHNsTUFZUEJ0RDVNbG1zS3A2SFFZTEUwakVuemJJUk9nYTZIa3ZNelU5ZnNIajJVTFVSMzVFdmI4a1BMNVlIS2JHWFg1TTU5QzNmZGVPSjIrRHU5M2VQdjhQc1d5dHNQeEpPRDRmQklNVlhzRGppSE1uM0QrWUhDME9UcEkxV0ovc2NkYno2K1Zwcm8wZnFPWUZYV3Y0TCtIOEo2eDZCTmtHVEtnMnRBYjFpWUNUbFFsazBuZ1hTWUM2QTNwWVB4SVF5anUvUzJJWWJLM2hKUjN6MDF0ZmlPZDlSbmpFd3l6ZnhEVGFGMWdkV0lmMGQ4TjVGSmtDeXA4NmhwQjZ5QUVhcmFoRjR3WXpFcnVjQkxuQTJjOUVaNVlHVVFKYWdFZlI2bm83TUR6Rm1aeU5qanhWOTA1UlE0QXo0UkZQSm0zTDU4N09qV1c5ZHUvZlJpYUcxWVIwLzBIVHg0OTkwdmYxLzRjdld2ZS9yTzdFUVVwMWNaaXNESDA0Q2prOG1xajNKOS9XR3RjbHJBbStZZVZtVmlxak1yV3BvNmJHeHNmQTJldERNNS9WR3Rwd01la3FhZURnRHVYRDJnVFhvNi9BMzJZRER3d1o0T0NHdE1MZk9lRHRqT1FVVDk2UjZDeWV0U0hjRDJiUjBRNXIvQUFINVdQNnIxZFRnQnY2bW9JNnlwZ3lDZTVKbndjaDJ3UzNWMllPZGZ5d2NDUytOQlhyTytTVWFRSGM0Wjc5TmpsbW1IMENGem45REdzK3o1MmpyOUc1aG53M3B1OC9WeG5Fek5DMnh1N2NCd0FWbDBqL0Fsc01NZlpMMGRIaUxmZ2c4T3F2c1RWQkhpWUEwSUt6YVRSVVQ4SkZhVWFiWUtPb2FyckhkYkIyV2RkcUlScHdNUkx1UXpxVWh2dEpldnZ4NTl1MmI3Yi93YnpQQXkwMjAvcXZWNHVJN1gzTE1lRDJnM1h3NTFZZU0vTmdMa295elhLVWx1d2k1Qmdzbkw3SllPR0tWMWVZakxkWGxQa3VUVFhIQ2FSNDdKeWdqcktTR2VhVGZTeE5Na2tvbDREQjBZN1pPalhPMTBQa2ZKU05ScWN0RTY2eEszTG42Z3lSL0wwcmlBUHM4QUxtSG12L3lvMWgvaVJ2aGdtenJWMUI5Q0JKR0VmU0UwemJTUkM5dDFpTUF6QXZ2Tno4akg2czdJbExvVm5Xc0NpL0ZpbVR4Mmg0REg4QlF6ZjErVGVhOTFpWENuWEdtRjk2UmFycjZBT1Y0QTl5MWFmZFNiWVh3SkxpUEZ4UEs5c1B4K3FkWlV3YmNxQ2ZXOVZGbWZDSStzK1dLMG5ERWdTRXN2Y04rbXZjQTl6UWxqOVBsdmF1bGlBcGRWNHJzQUFRVWhzcmNkWU5JMzF1ZDU5U1FTazhta21CUVc3UThVWFNVbDVRSTUrZkhUYjUvdFdCVGZkZWZMM3hXK2ZIRVUxbm9JbnQ3QmZGZHY3VUs1bCtvajJNa2J0R1NLS1lRc09PN1Z0c0hoZElwNjc0dDA5UVh5ZmthanR6SjVtZjRsd2M3REpwWUp4L3FPbkc1OFNKdExOZVpDWGVIdTZ0ZlI5NEk2K1JJZWVIenduQzRYdWJ4eG12ajU1cjJJYVRjOGJ5TkIxV2V6Z3Z6RjFFWWduSllyNTJlNWNoVk10L01vY0Jrb2xoT0x4NDR0bnFDREszUm5WL1ZiUzh2TDFYZkRQMWlkQzh1YlJONTVHNWYzdzRTYy82VExWSmVGRmlleVJDU1pHSjVIM1lKVWpKUzBOTHJJSldZaFM2eVpXSDErbW1Ma3B6bEFoUHE4SHVxbXdHVXBwMW12dFdFNFBHUGdrTFFUOGhIVmhoM0NHQ0tDaGtoU1I0VGRpUTJvbUhWVXVCc21xK09qajJ6RXlCaXRwbkNBWG5DenlhaDEwRDQ5SHVEcmtBY0xrSDA2K29adkNNOEoyTjBhL25oTzNndWdqamRTTWNoN2xaMXVTNytvL3VFcm9SeXAwZTVUQnUxQ0RrTHVWMTFKYXBhOFZKRVpDdUpLZ3FMYmxjV2JqVTZtWm5QTjA2dGpaREV3S2hEZFoxWWIxNGljeFVBT2FGTXNaTk94U05EZlFodVdTOGo0NisyY3Y3YXhtNVpJSmpES2lSSGkwQklNNWJvRVE2OEhReHlndHNhOWNleG9rQ3JXNEQxcndJdUVtYVRyTFdiU0p0T1NndFdLQkR0dXRBV1pUSGc5aFZ5aVA5bXZnK1dPNGpaNEJnSHVkblVteWFvV21mTWRVYTQ3QWd5NFVnYzhBY0IxNTdzTzNtTFU3SEQ0VHh2d1kwN21lYmZLRmhGZDdncHRCR3l1QTl6ZmgzaVBEUGVOOVk5eDM3c08zb2JnMFQ3N3VmaDIrbU9RSjMxa0hIc3FnZ1VyeHdKK2xuY0h1eTJJaW5EV1loVXcySS83SEZ1MW1ZRXJUQ2Z4RFJ0eDA5cEFmejVYTHZXUEQ0d1hlM0o5K2I1MEp1bEpwenN3d1V3enFqWUw1Nk5MSUtNNVBwb3pQbWV1aTBhdm5SNm9jM2xnREgvbXhsajAvQXhtZ1Fxdm0rUWVrR3FsUGg4VVg4dFNIN2lmcll6TjV1YU92c1JDOS9jYkdhTHQ5c3ovVTRMOTk0aTJWODAwbFpzM0s1MEFEcXZuQkExbXFBNW1Jazk0MWJJa21ZNWozdkJtdStUMTVOblcxMWpXMHNoYmp4a3d3MkdpVmJDeTZQUFpWNElpNGZ2TjhuTkRKRU1HeUp0NWJvZ0xsQ1RTMXh1UGRZSFlOQVdwd0h0Nk5QMVc1RDA5OElHQTRRdEVQa1o5ZzNWNWlnaE1oYXA5eHNxa3RCRjZYYWc3bHlVa081QWJTR05maEZEZWxXZTVzNXQxNTFBcVlCRzZtUG50NHFhZzZQV09UMFNUeUNmNUhaSGtKUHdkczROejg1R0U0bkw4bzJzb1BIL3N3L1BIM2ZoWGFURjV1SVNzNGZQMkxDWVBqV0Myc045YitHVnF5azg5M1k3cnF5K2QzNTJhQ2xUL3JkdFJmOVkrWmRBN0ZHY3hnWDZxbUpLc2NyTVBLemYxanUyS3dpeXR6ZmUxVWg0ZVJQbldzcThvZTY5aHZQSW9sMjMvUk1pYnRFeFlLeVdTdzJaaVJ6REUva24xZjY3clJXTU5NckNXRml2cmFiRXBHSUh5Unh2Um1DTXI2em15M2FDWWVOd3U2cVRPVE1xcDE5NzFBRVpIMkozS2NVdCtocERQOG9tNzNWUXkxZkJETnRGL1JmVmZhVGdtZEJ6MUdIRU5TNjAwTDFRTEpqTlU5WUdOeU9xRDY0TEp2Tml2elNDNGJyMHVGNlZZQzg3dVBMNHdDKzhqa29PN2RvbSthS3dyL1d0Qzd0Qm96cEduSzFhZWZkeUc1b0ZhdDRVV2FrZjB6MTRSblZsK01lT0JkM0lldUVpd0hzcm83dEN3ZyszU2poM09vdEhqd1lEM2pBRXYrYmVFM0t4MjlOUjFIZUVVVCt1Z0ZXTnJXb0dIMUVTN0hpV3h4dlRkTHExcGxMdW90NjVnUFJ0WTN2UWszbEk4YjNvUTFJRUI1dTdicENlSUJoYTduT0xDMHBtMEk1UXBwckI3d3hVbFZTdWJ0Z081UktyMXFhWFdxUHpJb1VzbVgwL3NsN1kwQmVmRlRKdTlEUDR0eTh2b3Flc0N3cWlKM1RBMFRhQWRRVnVvcWZXYVFIb2FzTlBueUNXNmdHekdJVHhmL0lod040bWg3UmlnWmhLa0ZyT3dZclVJNGhLWWlnb2xaa3JPWW5VZ3orSmx2bFhMU1dLeHhDMXIwWEFLcTg3NGl4WmdVMWdndXViWndxK21OSEtXU1A3d3czV3A1SStXYjJlNTVMZVg3Nmtsa3dzTXI5ZUkzWEE3aGZDKzlGQ0o4ZzYvVmd1RnhTM2htQXNtcXJlNjh4a05mZU15VDJqSGZvS1JJcTBvS1hHVHJIYmFzeGJZOG9HbTFIYVJkbjIrbW15ZjN4NEhIc2JjK242eVUxM0IzUHBlcHlDWkV0UnNpVlBGYk9KK1FPQmhpMW0yZ0o1TEZMTnlacE9jKzJJaGszWjZtRCtRVWE0dGlwdTJzMm5NeDVkYkdOYWZMN1NrNkRlbGp4eTNibUY4RkFjK2dqVUJINzJMODlHckNYbzJuYkE2RjZzY3dQZDNMV2x0bERaWmpNUEpLYzU2RXJCYW0zR2ozdmNjMXZ1NlJGYnZ5OHE1dUxRSnM1Yzg4ZHRSancvR1dSRnFnTDE3QW5NamhQdmJEY0xzSUZkVHFVMEdYd2psTXlwK042bTAwU3QrV3lwdHZpQSswbFg5Y3FxKzF1Wmw0YmE2V2h1Z0U2dHRZR2Y1M1Z3dUQ2SmRhemZYVlRuRUc0eFdwVjNKUTdydGtKYjZoM3Jyek9GSzYzWXR4K0ZaQTRkSUJ5RTNxWjBhRW5IUTBFMjZXUlptYjVEQkRoSnQ4WWkzZk55Q2d3Zm1wMERqcERlcDQyRnB3S05HaXlEZ2NTZmExOWlCQVV0VWRmdWFHY053YW1HOUxCT2pIU3JaVFFhMUlOUnFNd05LaGwzSWNYcmF3Q2ttRVBMYXh2MUpzRGZUZ0pUQWlLMGI3YzFXYkRMdHg3UWdFMEVUaXRKNjgwbEhxY093cFp2cDVQOW5RbTVwd29sb2ErZnp0ZDJzVFBzeHJUdkdDT1QzQU9zMDdKaU9pMkN0d3lYaEkrU0dSbHhpQ0Y4NnpzMmN0dFJKdFJ2UmlnZWxZYlpKTlE2Mk50SGtNUU9QTVBETzJVWTh3dXpsTjdEaXM1dnhidFBIVjA0SnJGRUswSi9UNThHMi9RaWZ6WjMyZ0JESGFtNHJ5d2RBaDk5eXFQWnJzZTdYbXRZWFJydE5xeE1VcVRhN2tTREF3UWEwN0lEbW9kd2FhdmlNQWRCNkZNYVp2bXJGa2t0UEpvTTNXR0tUeE4vNlJqa1ZSNG4rZmJNWG1VV1FsbmlaVkpNVFdhdVIwb3VtakgxaGViMThYK0t3TDI5czNKZE00MnR6cUNLZGE4c2xoYzNIL1ZmTzBhY00zRUpkRFQ0cGhtU0xUNnJSMTdRcG9wdU1hOGZVRFQ2cGV0bkQ2c1BZMmZwTmZqZmN4WFF4b3dOUHZjeHZMaHN6bXZBWWNKNDI0S0RXTnExTzZIQlkreDFETkRVQ3VtUVBubWI4L0FQTXBxanJFTVRFaTlJR2Jtc1RuamJ3Z2dlWW42UytBNCs1VWFpM0FHMXN3Z013V2QwYWcvazRwNkdiNGRpRm5lTkpKNnRnYTdCdlc4clpITTZSRkxiaDBYQnNoaGY4RWMrSkJ0MjdCbFBrK25mTkU5Y0NGU1FKM0RnT044STJOOEorMm9BZCt5N3o3ZFhqeWxxSkdYNjRGckRJOWZVOGorQnJNcklaZC84WE9IM3JhYUZoTGRQTjBBYnA1MEt3V3V5RjFla3htTy9sOUlXcG1ycmFOUG9HNnN2M05tdktZOEI5eG9DYi9DWWhyMU03R3p2eWJHclQxMCt5cVUzZlpoQ1k5SmZvNGNOeGV0ckFLYnFIN1gxdHJmVnB5VzFYdW5rUG53VGRTazhKLzV2bC83NTMrWWtrOWxkcGJPUURqQitrQUhzbDFQWVRFM3l5emg4TUc2VUFFbmIya1loUk5qTEdibHQ5azJ2RFlBbU5vOXIzK0xIVXhSK2JDa2s4TFVVakg1MWEyN3NqUEJvWUdneU5KMzA5QzhtRm5aUEJyYThxRmVLalh1OUlyRGhDdDZyRDVTbTdmYWpZMjkwOTRIYnVtSDQ1Ny9lOU9wWnh1K1k3N1ZtZUY1Mm1XK2p2QVYyd3hqOE10eDlJQVpHZTBadGxBS2JwYkQ1dHNnU0xycWJLL296dTVBV00wdEh5Zkw0d1B4S05qc3dYOHZQbEtGMVlHNnVzcmxiRzFtaTFzRmlPUnN1TGhjSUMvbHdvYk4yN1oyTHJucjFBbkRUc3lldUV6NUVJOWdXczllWFJYdlJnd29BbFdkZmo1NFR1Tm5yelJHaEVrb0ZXbS9UbVFheStGNm40czdFVndJWmhsZS9aR2NsNXQwVEdWbGZwcTN6K25tZ01VR1lveGNPOXZzRHVyVnQyazFwZkhxMDIvMzZzelhkUXJUWWZVOFQ5TGJYNW9sR1kxMXk3ei8ybGRWMlBXbXYzVzRhc3MrWVRldmNlVno2bEtJSFd0UEhTZjdaOXoxVFZiMlNKTS8vb3IzZytHaWhtVExZc0V2S2thbUZaK3JVMVo0eFVacndSbWdsZ2JpUkFZYlBCNWxacTlEV09iU1NOdVExcDNJM3AvYTU4dXZaZVJyNldaNDIxUk5LRVBLRjJHMnZSVXNDMVRQKzZUUEJMTGlmVGJtQ2JwUlJxNHk2L0RIODZoVW9KSnBqWExVWHJ4ZHk4SjBGWXgxK29kc3pkMXRZaWFQdVNxOHZpWnRWSVRVdXhOQzZsdVBsd1MrdUNCcHBITnk3TDBtWlp3UlFzUzA4VXIxdVlyV21QbmpiV0Znc1M4dGtXZnNzMlpvczNMOHZhdUt5ZVRVZGJXMWZWM3pTNGNWSFdOb3VLWTFvNnBmVnA2WFZMczdmZk0vL0xoUHl2MW5YcDJlUHQxOVhFZVQyYmptN0RmdjFOZzYrQUI5bG1zZnp4elhqd01XTTlZZURCMzI5WlQ2SXVVLzF5aDZoMVlQdERwSS83cnl4QWwrTUJ3UTF5UEVkR3lFc2NZYzlBUHdoeldYRlRMRGtUU1JRN3JtRmh0dlo3L1hmaWlodXNIOTFvVEFML0c2dkR5S2xaRXJSbUt5eGVsRERoT2hNc2tNTXlZTTYwZjhBZ1I2cDFtSm5uMStOZ25SZzVmUlFqQlE0bGJVZGlDekVuSWFXaDNoN3NiWkxKdXJBbUp0VHUwbWhqa0Y3NkhtbXlUS3QvdHZtMTBtU28xdFVpNmZ5RU5xckdUL2d1dUsrMjhGTVBVWWpGckZqT2RWQ3pEVWFaNVhPWE9mdjlsM3lpemZrZmJ2UEFmNnNNK0pTeHhsQ2VrUCtEdWQwV09VM051dXdXVndhb2Znbmhlbm1LdWNYQ1BPQ1hsWFg5bDN4aWsvVTJQM0Q1OWZvcEhhK01EUGNWVVQ5dEZPTWl5Vzlrd1ZEcElsdkpQRGxBOXF0N3VxZ3NlTXlDSW8vSEJWRXBVUXUrQnBZU1FhYkNPWmhlTkNraUZsZGJ6Q2JMV1oxdlk2dTY1WjZRMXZidFdsbmFNYWRPcFN1RjlFZ2E2K1JjZGRrR1JvK2ZXaFJaYnV5L2czeWMxYjdYSzZXOHR3Q0xOTEdIWm1Lamk0WGlTbGdaelNrMnhlTHQ5Q1lzVGpmOHN0Z2Q3UXpFbzVGUFRjNis5WTVyYnhzdHhlS0QrWUZ4dXJneU9ycTBORnBacnY3ejZ0ekJjL0hZSDhzZGNqSkx0MlJuaGlLeFlHR0EwbmxSY0R1OWxTajhKbXd5S1ZHM3kwMnQ0a2ovOWoxVFkrSGVibXNoSEI2eSt2YVBsQmNYeStXRmhlcnZwZ3NEZWE4WDdBcHFUYkd6d2VuNVZlQ2JicTYzaUJ2a0J2VzZicUNxMXdKVTNaSUFxbzR3cWw1OSt1Z1JrM1dwZzFvSkdITzJjNitJeW9mV1R4NWZ2K2JRTmZ0M3J5N1BiOTgyemFpZHNSdjllVGtlZjJIZ0VRUThibFZ2T2dRVHRlSWlyZGc3Qkt1TjJxeXM4clk5RmphYmU3VXRLaUN5anE4ZlAzYjB5T0ZHWkRvNU1pYU9DNnN6bUNiTDVEQTVyaDV4VWJNcDBDRll6Sk5wUWJKVXFFMW1YTVlyQjBCU21qRlhrbmUyd0dpa3pTcmJzUHBBN3orcWxXd25sTFdEKzNhdExTM016ZkFwSGQwZFNwU1ZEdEQvVDNpTzlpeHVMMWUvOTkvRWVjS3BUMWNqLzEzTVorejVueHQ3SHIxemcxeXJubW5IZTV2dE1qQ2oxWFp5ODcwK3RIN2kyUHJWaDY1dVpUdk5IK1VTdmsreTVBR1duL3dndlFtZS80SEtPdXRicVdMMDZleXBkZGkwNmZVUFlhM1pab2RWRkZuS0dxM3YycGxIaEJWQStBckdlMTdoREZjT0hDL25ZQ1lUREdUeUdkQ0srU3RyZWI5UGg3M21PeFRyYVBCV1JvUGZWenZDQVh5cGlyV3VXMm1rZlo5UnBXSGhvWGJkUnBXR3RWNEd6aVZCc0RkOE9MVWw4TGloU0pJYkx3a1BDODh3WFdzYnZ2bGdhbXN4azB4RVE1MG1LK1poZ0JtLzJQWkZOK09WMGxBeGkyMjhNbUM0NXd5MXBKS3RKV0ZqTWdDY1NsYXE3L1ZpU1VsbFZNc3dFNDN1TVlvc0N3LzNoU2RqeFZmTlhIdjM5S0lyRlRtNXNIMjlNajVjT0ZVS0pLeHo5cDVZWEszdURzVEdNNWx5cHFkeStQRGk4TUhrK0UyOXZ0R0JmTms3Rk93ZnZHRjk0bERlMXJ1WTMzRnM5L1RRV2pMYWY3SS9mMkxFcHQ3Y0h5N1I3OGJHc3dudmFESXpORjY5WVdvWlR2Mk5KWHRNWlJHQmg0UUZla3I0SEZBaTlxUjg5WnpxeHRkRlVIU0IzVjVYYmYya1RPWmN2bFR1SnpmUHYxMzQzSjEzOGh6ZUorSForOWl6QWZac3A1YTlURzkzZEF0QUdIeUtscFFVVFp4Kyt5dzhoaC9mSU15aVR4RGtYSTQ5RThicEtDOGV3VlJzTmkwckN6SHBFSGhwQ0QzTjYwQ0VXU3o5WVBNZkZPYm94NFJQRVI4Wlk3RDY3QlNkeS9oT3hRN0tFb2xoLytHOFl5YlV1dlk2UlNyc1RtVlNyRWtlVzFTT2gyOUxOWGNNYk01REpYc3A3YzJsRTEzZGJtdkpQcFQwZ0tiWTdmSUpjOVpTMmVWMWhkUDhaNFRUNFkzQ2FmcUk4QmpRUVZzVDBwRFFBNmpiNEtzM0tMNWRzSUdXMUpNbzAwZXFQeEllR3huaE1NNENYWDVYZUpiWXlRQ0RrYlpaMGFlMEpIQlBrbER2U1RMTHhFN3RvdUxsc0dySmpCVmdNcmxRc1EzYjkwMU03dXNzMlVhRld3WjdPN2JPem03dDZCdGc4eHdWMXNsZkNFOFRtNDRyZTNQSk9pdUV3cmtJd09jVkJUcjgrcXFDdDNraUVROThDZXNScnplQ1gyaXYzQ2VzMC9jeW1ENVNZbER6SXFQQU9yNUtBSnMvWS9zNnNodGJ1cm9jSFQ2N3I5Wkp0bm1HVXQzZlA0bXp1YVBSMzlaKzFtYXR6WTd6djF1WW9MZUxRVGIvT0p1L1g2OFF4VElkSXF4THJGRFVoTEpoVXl4bzNjeTV1a1JRS2c5czJ6YlFQelBUSDhrWHd0RjhYcGlBZjZwcS84QzJmQ0VXeWVjanNRTEg0MlpoQjMySm5RZUZaQmdlUWI1OUI5ajJIVWVpMEozNFZodUQvZUIwWk9EcnhYMXYzMDc3OXo4S3ArU3V1KzdpNTJRZWZkejE1MFN2VnRET1dQTTVjV0crWWlyM0IwZU9UT0l4ZVVZN0pqRDhpL1NYTkNCOEdmQnlxZDM2ZTZhOWRJMmZVc1RoMlpYQW1QRGwvd3RqZTZzdmtJOXMvRDZNOWFzZXdwRFgzTldJT252QUJ3OGNCZDNnd0tmaGx4L2JjTkNIMkd0SXIyVjRXbXZ2eGxsK3dzVXNTNU1vaUtaYkNTK2hPVmZIYjRqYmJ2UXNzaEhDUFpzTldmOVQ5Z1lkYkhXSUMyM3pGaDFNMUtRUE5iMDlwNmY1eFRuNHlod0UrTHNiQVhvVjZTWXVVbVE0eDYyTXRpNEw2OVNMeDQwWXB5MlQwU1ZadTZBb25XeXdNOGUzMWR1UytVV3QxbUY4NDVma2Q4Z1pYdXNnTkRSc3J4MjF5bkJOUDd1UkYrTEV6c1M5dm5qYzU0MXpPS0dOMCtURHJGakYwU0pyY2U4UHJPMGVYL3FlL2s1QW1KUCtCUFNqSE12bngrOXY1ZTh6RllXVGVCNGFlOGRqN1NSL1ozeERUUmR4dzV4L1FIOUNjZ0RCVE44S21sYitWN3lhRHJhS0NpTFdyTjNIdGdxaHhiQ3JEMFpIT0JDSjkvb0RYRURxbkNFTUZ3YnBXeHduK3FmOGZhMW1reUxJRXF2bHd2N1dnRTR3Z0FoeHBhTWVMYTBaajhEWEIvSlNKRjM0dGlNVDFkbDYxVmhnWEZpVFRJVFlMS1l1cVl1Slh4bkViMFVzaVVyZFVkOXRXYmFFZVZWVTdGbUJWTW5YWTE3OHB6Zkc1dG15OFJMNVhlR0xiSjd6eTA5a1dXOTdmWVp3UXkyYjF1Q3UvbU4yZE5nWVZyZHVZbEtSbks2TllLRjNaeHMwOFFWQzlTenhVQjJhOUtVcVlOYUlaM0xqbC9Rcnd1ZEJNeWxnRE5QbFpFRjBnaEVSZ2ozYitMdUVlUjBmOC8zRVRXdXhhQ1lWTGNRS21ZSWIzMk5BUVJQeHBiS2d3dWhLaXBMVGs1dGtzUTRYZWppZURJdlRwblIvVHlHNWEzeGdUM3dzZit0TTczSWxOdlMvdk5Fb29rWFArd05UZlZON2tyRllPZGsvMWQrYkhaOE05cXVaMG5MMVN3MTRsemQrVGY5QitBTEQrdzJmeERjSXNEYzNXL1EzL2pCY3cxb3VMcXppRkc5MW9MMjBjZE1oTE5aK0tRQkE5czZtOWJ0ZzNibVNGN1MyeHBPT2pxalIranZxdzVkZi9yN05sazhyZGNzSFh1Z1RGUEtud2d2YW1kWlZMMDB5ZzJCN0haeHBRZmtlTzlOYllPem5oUmZnNU9SSlRQaFFveFJ3Q0VhL0lJQUp5c2NMN0I3eXFFNTI3VnhBdVhPN2Z2Y2daSjhHL1dvK3cvZU1PZWpWOEd3TzVuaGErSkF4RjhCaDZnRjdxUlRDY1ppTTJMRW1sMUEyWUsvalZxejRHTG9Bc2d2aC9pNnoySERzWmxBcENjTmFQOGpXNE50RUowVjk5THJLMktyd0FxS082NFpuNkp5MjdxUWFrMFJXNGNkWER0WUF3U0k2RURQR0VRTUFKUTNJaTVWeEJnaEF3UjBJQ0J5bXp4T0p4TlVJVnNGUnpDTnNhRU1rRWNtSlNGRHNpMXVoQi8vdVc3dSsvVzM2L0l1LytObExmRjlINGR1Wk9oamFtNUo5cXdMVm04cnJNRmlIWFdXY2dlQUFnRjZBZzdBVmM0Ym9HSk9WWStRN3ZDYlhaZ1oxQ2pGaXk2TUlrQ0dsd01XcmRDZ2RWb3o3eWk1ZVNTc2dIcUFsSXg0MmZKcDEvT1Z0N2xtdEk0T0JMMnFYUVp1d3lUYUxtYUdGNUVrd3RQaDM2bWZZVlo4emtPU0kwbzMvczFHaXZ5Yzh4WHMxc1pmRTRRSUR0TDVYazBKTGRKQytiYkY2ODdQaW0xKytnOUdudUZFU0ZQWWMxMGxZVkR4QU5KMUVTbEg0ZUtWNjh3bzh3Y2Jmc2pGTS91UXk4L2djSmNjdHMzOGxQdmp5N2V5WmVYS1JkdEZuWU9XeHkraTVsYnJUL1lmNWlZazhmRjBjTHhhM2JDa1d4OWwrVEpEdmtnL1RQZXdtRmNtLzQ2NjJxdVlDNWJlVXlIc1RUSkwvb0EvUzhVdnBVcTZFSnpGSlY2dC9UTWVuR2M3NHpQZXY1Sm4vV2QxWDk0eHd4eFU4STJ5NStFemRNK0taSzNoR3pMLzh0K3dacEFITkFnMGVCZjdhRHJaeVd3cUlna1VSN0tKZDFQdXBUZEt0UUlNNzRaa2Q4RXk3dVRUQnBZMzlQaHM3ZnlWalljMDRkdUZLeHNKYWNlemlwY2V5L2tNWmVnenVlenVSLzlnbTB1RmlaWVJkQStoQ0F6dC8rWFczWmsrZFAzOHFlK3ZyZnY3NGp4ZEtFOTk0ODV1L01URTgveUkrVzlwSTB4MXdseG5QWnR6c0NrV2ZHcHBtT3paOW1KTHRHd1U2Q3Z5dE1GNDFYajZORG9majJzblFaTGZFMzROWm9xTXZ2dmlIZi9nMzRxTVRMMytYeTV3U3dFZ2JNTFFuZVlJL1FvUERZc2gvMWd6Q2tTb2hDT0dwbDIrWUVFTWNSZytzL3lxd093WXhDd3o3azZhcEtQV0RvcWVBOFdRR3Nra3JxS1lUYkNJblNiWExWVTlGek9RU3VVeUtOWFpYWksrdmRvZUNWZ0dhZWhsdTFWd3VXMHQ0QUpYRDUwWHZTTFhmbGV6dkNuZDNlakt1d2tSYzZNNTdDNldscFZMQm0rOFc0aE1GVjhiVDJSM3U2ays2K2wyOUkrWGkvanZMYzFTU3g4eEtyTHpZYzJaOGRYSjEvRXpQWWptbW1NZGtpVzRmdWJOeXVMUDdNSzVwWkNOTFQ4QytzRFhoTytzVmtPbjlZR21rcVNTbVdIWU1ya2dTeExPa3Z0eGVqNUhWMWdRcVFqWlgwNHRBVS9DV1lET1N1QWp1YkVXclpCU1hpTDZkdDd6Q05kSEhybkJSbEV6Ui9mVE5zTmNPckJwbkNVbllJMEtXVE5UT0ZUL3ROV0ZremUvRXcweHpjTjhydVVxdTRzdVZsSXBQOGRIek53c2p3czJSMjI4TlgwOUg2UG5vcSs2ZzcxNTg4TUhGdnNXRjN2azMzYnVqZDJGUjR5djRkZy9NWlNOYVp5YS8xa0pETTJxcDFvZ0xIWEJlK0RkOElLRnZtNWYrYzk4YmE3cGxJemIyT2xUZWRBdkxEMHFzL09CVER6eWczbjgvL2ZUNEY3ODRYdDNlTUtlTG5PSnpKdUYrZzcyejhIWTcvTzExNG5IZWxzSktMUmFQQlpOVTROOHliM0hZTkZ3YndnS08yT2Zmb2YreEtiRml5U2dpS1JsRkpJQVR3K3IrKzc4NC9pbEVETDRCbCt6WStDdXdxcDRCL09heHMwVWNwaHBLK09CV0ZkSG9GVmUwRjhIcWVYR2c0SU9PR2M0a21hT3diVE9aMGNybXhVUmViNDU1RUxYQm1pdWZmdWJRVXMvQlFpUS9IK3NmU1dhdlhaaXNEQWFDaDVmeUI0dVIvRUswdjV6T25GMmNyQXdGZ3JjSnN0QmI3dW05RVgrT0ZQcXVtbHdPK01wZWYwOG1rck9uQTl0Rys3ZlpYU09KeVpXZ3IrelRmenNEdisxMGxhNEZPc3FENlZpeE93Ti9rd1l6OERmK1BuYllHMkVZOXFhVE9Fa0l6eFFtc01zaXV0bkpPWXp5YXNKTHI2NTJ1N3E2UU52d3VFTHVVSmV6eStub2hrYzd3YVpQZElBc1NqaTRWVkZLNE91aUhOallNUVhNd1gwdkU2TkhiNy90S08yYnVlV1dXMTQ3T2pxOWN5ZE52T3JRa1Zzdnp0RkU5ZHYwQkkxVS81bEdkazV2VzhNN2pSNmozd2E4REorSlJMbmFoUW9tWm9QcVBoT0g0VE54bFZ3cFVaeDhVbjF5NW0xdmc4ZVBWWCtIaHF2L292VjdwWDBDNmc4aE1zSGdEWmxCRG5yWk8wa1ZLaTU1S053blhCYWVhM1ViWkF3ZkkvVTFWQnp6ZHVGYWJoeVZsLzBoZXlRdGpTbnFrS3NZV2c0RTdlR1VQRzZHZnhYbzcrYzdyUDE5eXZaVmUxZmVidTNyeDcrQnpyV3hjUWY5OHNZVHI4RGZLS0cvOGN2VjhxN3hjZmgwaCtBa2IyTjZjbFFOMWQyRlRNMnVmOVFGb21LM2JkRXFPTC8xTGJoSDRUa2FoZWV5OUNqVFNZOWl2VDc2QWhxOFhKcmF2Yk50ZnhReXRuR3o4QVZCSmJOa0w3bE9QV3VqVm1HTml0WnRZS1Ztc1paNEpZZjVDd1NqQjRMMUhteDdSeFVUZW9Tc0lyV2VzMURSYkJPSUpKTHJpQ1RMMHJwV2dTWEpvTTd0MmJXd1kzcXlYQ29XMHNtZzM5bHQ3N0FvWkpiT2RtREQzR1I5VmEvTUR5RDZlckU1Ym9QN3Q5eVFLNGhIVHN0Y3pETGZQdVlhbk55eU05aTdOUkVlY2txVmpCS09EODMyTEp6Wk1ubmRhbC9memh1MkZmZWtIZmtqUTR0dk9Ed3ljdWl1aGRuYjlnMEZlNmZTc2Y0T1gvbjZjbzhuaDhtWmJudC9xSGU2ZEVETnFJTmh0elB3MlhUdTVQejR5Zm44OElIYjUyWnUzZFB2Y1JlOHZ2S3hOeTd2Zk9EMDJNQ2VXN2IxN3h5UGUxMWUzM3NISjV3T3E4OStuZGUveFByVi9nTG8rUVhZRGJ6c0h5Qi9wL282Z0tZN2dhWXpRTk1jbzJrZWFjcFRRZ2JxU1dneXNkQmlXSXVzVzYyMWRseDZYVnVJK3p6NjJ1MUEwK04xRDZtRHhnNWU4cm5hSSt1czYvVGUzWXZ6NnRUb0NIOHhtOHZSaVcxaTVvUzVEcTBIc3dqci9abndYYmpMWFNSSHRwTjV4djhUVTVORGd5WlpZdGNlR0VjQzY0Z3VtMWc0VlJFeHN3MXVKWEZkNi9zZ3d2Rk1aL0x3SjQxdkYyZHlvQ1ZCdEo0M3B1RGZUU21hZFF3elZqN3krb1dGTnh3cGw0KzhZV0hoOVVmS3dqMzl1MjZjbXJ4aDU4REF6aHNtcDI3YzFWOGRDZlZQcDdQemdaUnJKRGk4ZmZ0d2FOQ2JERzdQcHFmN1EvVFl5bjBueDhaT1hGaFp1WEJpYk96a2ZTc3p0KzBmSHQ1LzI0eitNenMzSEltRzgxNy82dGpZQ3R3SW9XaGthQTVqemVOMGpINVMrRExMZiswRFMrOUdSbzNUZVNwYjZFb0hac01MTXJiZ3B2aUtNWXg3MnFuWllzS01Damd4RmhrT0gzT08yNWh6M01xYzR3UDk4YmpIVGNud1lQL293R2k4TDk3WFcrd3BwQkw4UFZrMkMzRlJWNmZodG04OExmVk84MHBaaTRDQmVaenlWT0JLWlIvK0lyK2pGSW1VZHVUaFp6UUtQK2NPSHB5Yk9YaFFYQWpISE4xOTZYd1MvblE1dXVsWWJIU3BwMmRwTktiL1RCNWZXRGgrZkdIK3hOSlRzVkIzUkZtYm4vL0F0S09ycXh1d0hxQWZGdll5L2NTRm5YMUFEeEpNQW5BRDlnS1FoUHZSZ3Bja2NnQi9FbFpKUkNUMHdtTXhRTGRaamhZcHZ1REdnZXFSRCt4T3VQdFQ1UlNkTGUvZFd5NElKMC9TZlBXSDN6M1djMVI0NmhPZnFINy9PODkrNVIrb0wvc2k2dXk5d0lzZkFGNHNZU2UwZkU1UUxQWU9BYU5QVnFyWU1LbFNQaXRoZXpiMElKd2xGb3NXYnRWVHFTUGlHcjVpcExjbjdmQTZuSm1rdzlVQnVvZ0xMdmlTa21xNE1rQXp5V3BGT0tVcHNjYUlTa0pKeVBLemxIN1A4ZGZ1Mi9hTm5rZ09GMSs3L2FZUCtFNGRnYXVBSGpuZE1icHlhbXpISGIzbDVOSEt2dHZkMU82c1hvUVBqbG5kMXRMUm04dEQrY21aZDcyMkJQK3llYTNERTZkMzVLYW5Dc01qTngwZHRucmhyUFZ0ZklMK1V2Z0ZTWkVpclBFdU5kU1hDUVY5WG90a2d2L2hMcFFveTdSM2diUmY1dUhaS1BOZ3lmanIrN1Vlc09mMEJCMjNTWHVIckRHQVlMSTU5b21DYlZyWHVrVkp3bTZXUnp6UW44dkN4S21ZSTRaNXhMNnkxc216ck9sTW9LbDVHUmx5SGsxWDhvaStNdGVQY2g2bU1WMGN1NzQzWFRqUVcxcGV1dUh3NFBEeFFpYTVraXZ0bnIvbDBFcDRZbUhvL2FHSnBZSGxrNlo4YWpTV01mMmkwN2R6Ni9KeDA2NDlVaUV4QWxmdzk3cjhxMU9yWitTVDlCL04zeEsyRG1TSFgyWDV2a2tkeWcxb2Zzc0g2VDhCd2xHU3dUb0pHOXgvcVdRdzRIRTZGSUZHc0Y1QzVJcUg3aWZIUW1aMGxNZVl5eUpLb2o1SEdOczVTV1hlcnIxdVJRNHRaT3dSWVRFT1dhYm12dFh4ZUh4c3JXOTQ4RUJpd0tjbVUxTyt2dmhWQTArdFRVeXMzWDZMWEp3NU1EUjAxVXhSdnVWbU1aY29CZUppOWExQ05OQ1h6SnR1cHRkdnY4Wk9iN0tmNFRwTng4WTNoY1BDWDVKZTFGNjlIa1J1cFpCUG0wU0pMQUtuU3RUd1QzUHRsUVhMUTh5ZXl6S2xCWjJreUpCZzRkUVkwZWVEWTROMm5NL0xVTTg5VzVyeGpnYm1pczR1Mlh2bXNNVjcvYzFYM2VTZTZWeWRXSnR6ZEh6aE13N0Y3dnpjc09xdEpLL2VFYkpHZTlOOUE2YU9nY1RyeDh2My90YjZmdGYwN1BVbkY4YlA1U1pjZVdzZ245cFM2T2E0NHp1ajRaejc4TjNiWnRZN1Q4SmdFM2FhQW4yZldFRzhFZk5aRTM4SFBOUDNmY0FhRHFjRC8zZDBvNnBmWVhvK2Yvc1U0S3g0dFBOKy9za24zL2JDb1c5L1ovOExEejlCbjN4eTljbXZyWTdRNjZvZnBvZXI3eDRSbGt2dmZ6LzNNYUpUN1FMZ0VBS1p1Nmp1NkxRSXRNTXFFQnZZR2J5elNoZDdOODF4Zk5NMldDYmRkc0ZtODloZ3kyUFJTQmo3alBBaVJYZk5BSEdnQVlJbm0zMlZGUFlGbU9GWHFwSlNYUERCdHVXVHR3M2Y4ZER5elBLbjRldkVxNGR2ZjVEOS9maW5oei85elMyUGJQa20vT0UvcU9jUkxUN3ljOWpuWi9qZHdLSStSaU0vTFJTS1NRd282dXRGdTl6d3NyMVdzVTZYSnM0czVQT0xWMCt3bnd0bkpnN2ZjT09oUXpmZWFDMGZ2N0J6NTRYalpmM250Zy9lZi84SDhZdS9yNHY4STlQTEUycFVNb21pN2xCMTF4eXFxSmJyZmQyVmN1VWZGMjUrU0hqcTRweHc0L0RNbFA3T3I1OEIzd1l4WG9RdmNTYTFsMzVwQm52alM3K0NKT2pQNUxTWGZqVUdORmhtbENKbVBNUFVQNVRlTnoyMHY5UXplc3Zrc2RkWi9ZWDRqK2k1TWgwZTNaRWYyWkhySHg0ZU9ndTYzc0JvQ3VRbXRtb2phYUJySjhqOFh1VEJXRlFRVFQzQWlCWXp0cFpjMFFLWVovVTY5WEI5ZzlGTU9wSE9wUEVrNlMrTXJvdGdsa3ZEclRFWE1QK0V6c3kyUStXRjF3OE85aDdkdW5KcS84emVYZVB6QjlYUi9iMkRBM2ZNRE83Wm1sell1dVBBWjN1WFJxUERRd085dVoxVDR5dFRPOFlxcTduK3dhR1JTR20rVURuZzZEcktlVGNIM3haaEg2ekVqbS9xczhQZFpHSFdESng2a2QxUzEycmRnYlErZGgwMjdHVEhMZlpna1RyNFdRRlRnaVljOVBtVEorZXI5OU5YVjc5RHM4SlQxYW5wVDM5Nm5INnhPa1hQSTUweVFDY3p6QlhGYUpSRUpTSHFkQkJXQVFDSVNIQTluOU1EMFc2ajVTdGNpRUNoRkg4dm9BdmRqNHEyWFUwQlg2RFM5bTc2Y1BVSlczNnBjTTNkdjNIRDl0Y005ZlVmSGw4NWNXSWx2MUpBTzI3Nkp5N25iVWZQdm5Gd1lLaVlPN3EwL1NxWFI0OGJDbVBDNTBrY2RuQkIzVzRIMDdZVFBVRnVBUmdUTmxDaEpnbno4V29wUDlpYVZ1WnZSa2ttV09GVGI3TFg3M1YydDM5bnNIWXoxN29DaUN3WmoyTk9sK0hjRlByMnZIcStlQ0Naam0xUG5yOWJ5TjB3WHJwcUtwV2VQckJsOUpxTTdmcGQ4OGRQbW9mV1g3ZDQxVnV2cmdTOFkwNzNSOTQrUEpiWXNtdGdhUDlFaXQ1WEdiejZ6bU03ZGh6bThod1RNTHJaMmNxb1NZazIrSDRhM3puSXJkNFNUZUFMOEs2aFI2cUg2VXZWM3hQdVVzY3Uzc1YxNnkyd1o3M0EyekdRY2hXc0x2U2I0VDdHTjJyb1cyWklFVFBWWDkwSm5OM1htNGhUVE9PdTlGVnltWGd4VVhSMDRUdklMUVpwUm8ydVNqcGpNOHJVU1JaWHZaUXBqUjZlelJ4ZG1GeE5idDB6Z04yM1ZpY1hqbVJtam95cTZ3ZTNxUWZYcDVmUG5sMkdMMnUwdkZpY3Z0cmhPRmpKelE2R3c0T3p1Y3BCaCtPMFdsd2FpZEwzTEk2T0x1Slg5WGYyVFU3czNUc3h1WStmZ3hMd3dIQ05CMkR2VFJLV09Ob3BIbUxzdnlZS0p2R2NzZk5obzBjS2UzdElleDZnZFRZajU5Ukt6YUIwc1ZRdmJYWHhLK01CNGZPYk1rSDFyaG9UZ0EwWW9ldDBSdmdMc0FIZkFGdC9yRjdlajlYSiszSFNHdVczNlAyOVBmRGNBOEpUQU9OdUJnTWtOYlprMUNYMUNFcnFNbmJ2aEJHS1U3VG9mVnBkY05qc2JPNTcySE5ZZ3d4S01CRWFwUE5ZVFRxWHNhYVRCbWpBbThsTEZwWi83Z2I4dzhMbkFNWWJHWXhKZFVzMEFwSTFCOXRoMXZhRTBtVWpQVVNUcm1PR2RCM1hwR3RLdHVnNXdWN0FhNHl0NTE0R0UrUmRKOGc3YXh0NU40TElsUVZBaTdmN0JISG5WQ3hhbmJVUGNBc3lPRzlpY0VEcXl5RE5ZaTRxbWlRbmE0YmRMTkJHRElFMnJnazBadzJ2TU1EckV6NEw4TzVqOElEL3dFNkdhVVVoNG1ndmc4WnFNbWdjcTY0RnFsZGRzNWN5QllTQTJjTHlMQnl3NWlqRDlRS0REUkpCYnBBSUkwd2lzS1hpTmpxY0pvdmUyeThLZUJYWUh0elBub1hUNzFMYW4vNnh1dE1QQ0dVendZQkF3V0lmekE3eWhJM09EdW9YL0JhRHR3SUF1NGV0K1FGOXpiQldrd1NHSjNZNmFIdm14b3d6TjA0M1hUTlFQckx4YXpwRFQ3UGNyenErNzYzait6NnkxcEx6WmE1NzdWbFR2dGZIdCszZXZXM2JuajNiZXN2bDNtSzVMRjI5YTlmVnAzZnZQdDIvTURXMXVEZzF0WUJ5RjIrVEIyQXRMVHBOSGs5S29hYlRtQTJkNW9IUzlCN21ZTXdIKzFKNlgyODc0TzdmUktmcHJaMmFBdE5wL01UdkJaM0dqRHBOcFVXbmtSWFFHVU52Q1hyeU1mLy82KzFxWTl1Nnl2QTU1L3AreFhZUzIvSEh0YS90K1B2YWp1Tm1YdUxaVGt3KzJvVzI2Y2VTbHJhRE5XMXAxM1dBMWlJS1ZCT29xN1NJaVIrbHloQVNVamJCcUZva29tNmR1bCtWMERvVm1FQ2RoRUJGNnVnZi92QURhZnRCRVdLYncvdWVlKzA0cnR1Q2tJZ1VPNDdQUGZjOUgrOTdudnVlNTd4dlhnK0g2L0hSR1QzeGxTdnBjMXJTcXlYY1drTFRxL25JcHNHalErYmFNUUI5cDlPanhFQ05DK3VnY1dtKzBZTWpJblhUdUtHV3hoVXNqWXRMaW42ZlgvdCtPR001czZtK3ZacWExaVBCeDdUazhGQXFwa2R6UmtRYjBxS2hxZmpqV3pMeGRQRndvZUwzcFFmY2c4RmcxSWdIQTFIM1FOS3ZqZVgxdkNyamxqanhnZUJQUUw4L0FzTVkySFhaRGd5akFJWnA0djNSc2d5NHNEZVhLOTM4NVN2bjZjRVBjL3YzWi8vODRVWHNGei8wU3hEdUVVRnRON0VMQVcxM2RkVjJvNlh0aFJaOGdUNHBseEcvUTl0OVhlR0xvZHhldGZYSDNkVW50NDhuYWhGTkwvcFR4YUcwSnpXdytsYnVoQ3pUV3JFMDZmWVlibGMyR2swcnNzbHZBTGtLOUFoTWd5VHFrRXJSeHlZd3ZiKzczUmhhdHhzd1hFR05aOWJtZkNwK2FEdEFBMHE3R2pTZFc4M3h5clRobGl0VDg4L00rZk5lcnp2ZE56cnVMa2RMTTU4ZjE0WmRjaWsxbUN1SWk5djNQbWUzNTFYNzNKUlBxdzJQVEYvemVmTWxJeEpPODNubWdwY0kxNVg3TUlyQkxWSzJEYU1vZ0ZFOEFESzlRdVVYZjZET245T1JRcWJ4UHNjbkVXaC9GdWFybnlSSUVTMlVXK3B1b1liYUxCU2ZxVnFBa253MldVd1ZvK0ZBUWtzNHdWeFF2OXBxL2diU3RxL1RJclFuZ3Y5WmRTNFgxeE5iU3FYWlpEaWVuNnVFczlsdzFEQ2lpV0l4a1N4dUVpdjVhRkZWODdveE5tYkFyRldMMFh6bGc4RkFJQllMQkFZdkpvT2haREtFQjJOaFBEVm9UMjU5UEdFY2JXSVBQazA4d0NZT3RXeGlnVDV3UEQyZGVMbEpWdlMzWVpBZlBYUTg2WkdIRFNqY0ZsNyswc25kOERhNUc2VUVMUjJvMEZlcTdEcmlDbWpvY1NpYnBxZWhVSnArVDhHZGc3UDBhZmowTlBkWDdwSWxVUkNwRm1DU0RWQ1lKTXdKQ3U0azhMUUdJc0ZFczg4VGlURnBINUVrdHFqSzhDZmI1WFF5NWt3NVFkL0NJZDhBNW82Qnh3M0YweVBIdVcvU3hEVFc4ODdHZTUrakdHTHpkWDd2ZnJ3M0FXVzNLVDRxOHNRV3ZlanR0bE9GMkloaU95dFJKb3JzbE5DREVtRlVPaFczaTIzN01OMlVlRWlHYThUZG9jbWhEZVhaMGtPTEg1aU1vUEJhd0FuTGtYZkE0OGJkMjFZREhNMEdJQzRDK1MreEd5RDV0MHo1bnpYbGZ3RmpaNXM3UC93SjFMRG16RGhJOFFSVkZYRk9RZXR0dG1XOGw4TGlSeDNrYkErVlZGVTZ4VU8yQ2lMWWlUYTZMY2g2QXIzRHFySVAzaFQxa0IzcVVYZGJoL2RxRytxUWx2NnJLaWFuaVN4aThxS3pIYldRLzd3U1BJdFNMTmFxeFVxeFVoN0RQQzl1VjhCOG9PNlRjN3pERUFldmZjSit3OTZGbnZxRzJWOG5zYisraTRpR0xKdmt6THdkODJzU2xaRVQxbm5LNTduUkVMazNBbTlwTyt6QVVDRmU5RmFXdXBTMjR2RnlOUnd3SS9malpXYStBZHpJbU16a2M5RklYNi9BUm9xNTBmeW95VEVNNjZHZ0dTYkhKTWcwYzRLQ3pMYkJqVEtUakNrenlzN3V3bit2bUxLUDlGSFdhMHBqcDdLVGRrcnZjUURhQVBuZFBmMlN6V3BCcGVzMVhkcGdYaXpoeFlMVmp2TE1kSG1zMlphdHM5TTdablpNMU1hbXlsTVBhOWNBMzZtaFpJWmNvTGRZMmN3ekQzYU1DT2gvRjAxZm5jVk5FUWgzdzd2NnVWTWtzYjRCVHpQamx5K1BYN3AwNFozNjFhdDF2b2JNMEZsNkMzQ3RnTnlXQis5M1N2NDhQMXR4cTNHYXZseXZtODk3TTJ0cklNdFdrS1VQTTNpMHkwR0lMSkRqQ3BWbGFSR3o1a283SFE1SG42UFBiUXFHZVZQYUJmTmczWlp3bHhxblY5K3FyNjdXRzNjbnpGaU4rOGxQNk85WUFlNGp2ZDFqUSs0UTUxc2cyVUxPZkNlMXZKeGVYczY4K2tQajFaOGFLeXZabFJWajViWHNheURERFBrMnlQY0ZMbDhJWTJJaVBSTGtnMW5IWkdyeVVrUXdJQWM0SndXV050SDJsS3ZmQWNyazkvYUhYQ0VVdU5kcElsdDg1bTQveVNERFN0cE9kNmFxUlNLK1E3OS9zOGtuL2x1VGszcXhYditnalo4SzgzT0cvQjM2L1k4d004K1RWUkRyUE5sTmRtMS9VOE1vWmkwNmM0dUowV1RkdHJKbDRERFoxb2NKdWM3ZE1uN2dmSGtSK21BSFlPS3ZtOVRlSEJnSHdYYXloNnFFcUtkYXZJN25aTE5TbVZlS1pCNnlDMCsxMlFUYnkxaFdYWHBvMFM3OER3a2p1N2E1WHkzWDY5ekNsNWEyL1BiZVF0VjZmL0ZNL2RqRW1UTVR4K3BuVU40SU9VNWZZdk1ZZ2ZsdEFKMlA1UXZNRDAzN1l1TTlPcEZxZkVLbDQvKzRWN3o1YXo0dkZxRHNPKzFsUGFLWVNhWE8wSW5HZXlrcU52N0Y1cTNDak5Ub1pjNi8rdC9Pc25nZThHenovdmo4UXEyNnNGQk5qWTJsMHVVeXZieDN2THF3cHpLK2QxUFZTSTJOcHJNVjNLTW5uMk5MYkJsUVZoa2pzWHRjZHRVbWtPQ0F3bXhNZ1BVV0JnN3dpYnVIa1cwNmNpQUkxMi9NeGdhTDBBR2JGWGlhNFRacnNaQXNwOHF4YUVGRTZuM0dPbmdLU21HZVZiWHlza21vSU5ZUnBsWkdOblAzZFRIempCWU9CdzhhQjJQenc4UHpzWU9aeFdBa3JGbWY5OFRld094cVZwYTFzRDZ5ZVJLKzJETTh2QkJiekM2R0lwSFFvckVZV3lqeXp3ZERrV2hJNGJGenJIQS8yZG5SQ0xRWHVhWFhPSjZ4Y25BMC9XZXR4eSt0TXdkSHdsWENYRVhYTnNNUGpkS1ZUNzlKVnhwZmhwR3F3Y1dmMGlxTXRYOXlBSzBQak5OeHdqbTJZRTh3OTZnbjVnSjRXNlB2VGpkZW90WEdyLzVwY2hSTnJpam5TWkpIY0JSbjEwcjBZM29QOE0yNVNidERoaW5sNXNsT3Q3L3BSM0lXaG9UZEVIY09MYnhtYTI3bDY4M3YyK1BOaFp0bHJLL1pZdGV2RDVnOExpL3hZbDZwQlBLNFBLMXdnQzRyUkdER20zRDlZRzZ5TU92YnRpMjhheVJSRDJ5bDl4cS9uOTZaVGRHVERYczFIdmU0L3dxd3BvUC8zanhEdUpFRHoyZnpJM2p3OTUwKzVGMWx3c0QvQzIrZVlJZ3NRaitHYXhYTW5HSmxNNUhKTnJSQXlEcFNpTUlrWDc3a2tqTWVqNXh4L2VtTlRhRHlGOW5oMjJsYWI5eEkzZm5zeDJaL2lHdTNvSjdySGZWczdhaUh1c3ArUVNqN1hUUnNWWFQ5czlkdnB4czNhRDExaHoyN0FhTjNuQ3VRTmlCMHZtNlN0UmVFdThJT1hGdEpIak5SOURvRmlrRUprU1crclMwbERSalpKY0lFZ2UwalZvb3BKandWR3pSOXZsb3FLMGxhWGxTWjJISk4rTmRkRTVMa0w2WEh5bktUUG9IZThJOGFMdm9Sdko0Y3paN1l1ZVZyM2lQMjBWZ0VPc2hJQklSajFPWGJqdzlYZWpaN2daZHk5U1JydVltRkp5dXBjRHpzY3dTZGtWRDFjVDNXOTlXY3J1ZndGeVZkLzVHdnNxTnN5NkhOSS84R0U0ZERYQUFCQUFBQUFRREVEYVJiQ1Y4UFBQVUFEd1BvQUFBQUFOalE4N1VBQUFBQTJORlduLy9HL3U0RUlBUHVBQUFBQmdBQ0FBQUFBQUFBZU5wallHUmdZUDcxN3p3REE0dk4vMlAvRDdNb01BQkZrQUhqTWdDdGJBZGZBQUFBZU5xTmxIOW96SEVZeDkvUDg1M3ljOEtObHAyZloyNW5SOHh4dHgrVXRSMDdReWtiR2t2Q0xERi8rTU9QcEVSTmlRai9LQkYvcWltRjhvOTBKcW1OdFdGcisyTWt6UjlTeW9uTysvUFozZlhkRWZ2amRjL24rZng2bnVmOWZMNm5pbko4QXR6b1pZelQ2OWlxM1Fqckc5cG1zZ3RibmRuMGUxR1BuNmpUZWt3MWM3cVQ4dzIwZzdRQlJQUThiUkh0V2M0ZFJJRTJrWGJFekozT0tRUzRQa0hQWUtJMllJR040OEs1T3RMUFlQTEl4dVQxSGZrMnQzOHhtTExjYS9KM28wUE1aYmllV3Z4TURwQVA1Q3Y5OWJTOXppYlUwU2JvajZmdGN0VzhVWGNNMTI1cFFhNk40OEpvNFNiSHg1aFpjMVl2bzFNYW8xYzJUVmxRWDZ2bktEQjZ1N0c2dXpFOVNKT0xwUnBGVEg0aHBOVWtpSkFjWmp3ejlpT0dBWlJoSVBsWlB0bHh6S2xsRE01ckZkZDV6dXlUUnA1L2lnSTVpamxjV3l2Zk1Ga2YwZitJU2ZJVmsrVUZpbXdjRjg0UkxNdWVNNWc4c3VGYkNPdDZoRXg4azR2SjhaK1kvSXpka0tySlVKV3lKMUdqaXpGTi9ja3UzcmVhOTNXU0h2SWU3Mnl0TCtXQnRVUGtCNG1iZFZOL1NvUFZzaFRiYUgwU3dUYko1enYxcHpUeHU3Ung0VHdaNmFleHVqVWlRQlphL2JLaG5tNnMzdFIzVkZCL043WVBidGlURE5jd1Z6cFl6MVg0TW5yOWozejQveURHV0licm1LY1RjSTYwa1FPa25wd2llOFdMQnAyTjB4eGZVUThPbVhWNWpYWWtVTXp4WFhJTGZZaVFtZGIydzZPWHJHOG9WZkJ1OEMzMElXaDhPWWFnSEVjcDRwZ3ArM2ltbTdVZUp4ZFJURmJ3R3kzV1ExZ2hyNUlkMG9ORk1oOHRzZ1ZSU1FCT0YvLzM0dVFFbVVYNlVDN1BVS0dGNUQ0cW5KdW8rTnNjNzQyUkVtbENGU21SVnZhd0Zjc2xqbFZ5ano3Uk1LcTFsYmFBNTB5dm55ZVR6SzFhZG5NK3lmOEVoM2dSbGkvOEw3aUJKZnFXZVJZaXFHT3A3VDUrb3hkSUd4Yng3VWVraE4rUGo5U3dQL3V4VUV2NTNUYnozR0o0ZFE4MWFXYk1IZkRpTnZKWTN6UytTNC9VWUxxRU1FT3FxVVVBVXlTS1dSem4yMzEzdU0rWDJyY3V0Uzg2Y3ArdTRYczdnVHpkVGg2eUI0UHc1cFF6M2xSVVpwalB2aHFiUnp5b2xFNmU3Y1JtYWxPbWoxbGJJVnAwSmNya09UV0lJSnJ1V2FadkNZd3htRmhVSDA2LytmME41TVZFc0FBQUFBQUFHZ0FhQUJvQUdnQWFBRW9BbmdEcUFTZ0JWZ0dBQWRRQ0FBSWFBa2dDZEFLU0Fyd0M1QU11QTJnRHlBUU1CRjRFZ0FTc0JOQUUvQVVvQlZBRmZnV29CZGdHQ0FZNkJuNEdyQWJZQjBJSGtnZklCL1lJS2dpa0NOZ0pCZ2s0Q1lZSnNnbmtDaGdLVEFxQUNxNEszQXNLQzB3THVnd0lERG9NYkF5V0RNUU5CZzAyRFZnTmZnMm1EYzROOEE0VURrb09iQTY4RHVvUEZBODZEMTRQZ2cra0Q4b1AraEFjRUVRUVpoQ1NFTFlRNEJFS0VUWVJtQkcrRWVJU0NCSzRFdVlURmhOTUUzd1RwQlBTRkpvVXlCVHVGUjRWU2hXV0Zib1Y5aFlZRmtBV2FCYVNGcllXMkJiOEYyQVhwQmZRRi9RWUlCaElHSElZbUJqRUdQSVpHaGxHR1hnWnBob2lHb1lhMEJzMEc0UWIraHg4SExRYzZCMDBIV0FkZGgzYUhpSWVaQjdPSHpZZmlCL1lJQllnWGlDQ0lLNGcyQ0VRSVQ0aG1DSHlJbElpc2lPYUkvWWtUaVVJSld3bDBpWUFKa3dtMmljT0p6NG5pQ2dBS0Jvb1NDaDRLS3dvL2lrMEtXb3BuQ25PS2Y0cVlpcndLMjRyeWl3cUxMd3RGaTJJTGM0dUlDNUNMbWd1a2k2OEx0d3ZBaTg4TDE0dnpDLzZNQ1l3VGpCMk1Kd3d1RERTTVBJeEdERmFNYm94K0RKSU1uQXluRExNTXZvemRqT2dNOG96OGpTQ05MWTFCRFZ3TmJnMTREWWtOcDQyekRid056dzNoamZ3T0JvNGhEakdPUW81VkRtZU9lUTZLRHBvT3ZRN1FqdVNPN1k3NGp3S1BEUThYRHlLUExvODVEMFFQVm85aUQ0VVBsSStuRDhTUDNnLzNFQktRTFpCSGtHQVFrWkN1RU1zUTlSRUdFUmVSUkpGVWtYVVJqWkd0a2JVUnU1SEZFZFlSM3BIcmtmWVNCaElYRWlDU0toSXZraldTVEJKYUVtTVNhSkp4a25vU2hKS1JrcWFTdlpMZGt1TVM2Qkx2a3ZZUytwTUFrd2NURUJNWWt5Q1RLWk0xa3p5VFFwTkpFMUtUVXBOU2sxS1RVcE5TazFrVFg1Tm1FMnlUY3hONWszOFRoSk9LRTQrVGx4T2VrNmNUcjVQS0UrU1Q4aFFBbEJPVU5CUkhGRkVVWkJSc0ZITVVlNVNsbE1PVTVSVUdGUlVWTVJWVWxXdVZneFdUbGFpVnVoWENsZE9WNnhYNGxndVdKWll2Rmt3V1poWnVsbldXZmhhSWxwR1dtNWFuRnE2V3VoYkZsdFNXM1JidEZ3T1hFQmNqRnpvWFF4ZGRGM1FYZVplSkY2RVh4eGZkbC9pWUFwZ0tHQmNZSGhneG1ENllWSmhhR0YrWWNCaU9HSmVZbnBpa0dMMll4QmpLR004WTFwamZtT2lZN2hqdUdRZVpDa0FBUUFBQWFjQVhBQUVBR2NBQ1FBQ0FDZ0FWQUNOQUFBQWpBNFZBQVVBQW5qYTdaTExidE5BRklhUGt6U2x0RlFJQ1lHb1FHY0JFbGNuYlJHb3phcXFWSUdhS3IxRVNDeWRaT0tZT3JGbFQwajdCSWdWYkhnQW5nQUViOENXQjJEUFM3RGxuL0VKVGRKeVd5Q0JSQ3g3dmptWGY4NlpFeUs2NHZUSW9lejNHRy9HRHMxaGwzR09wa2tKNStreWhjSUZ4RHdYbnFJRmVpVmNwSFAwVm5nYUtoK0VUOUZaWjBGNEJueEwrRFM5ZENyQ3MzVEIrU2c4UitlZHo4Sm5FUE5GZUo0dTVaNmhFcWN3ZzkyNzNHdGhoeTdtOTRSek5KL2ZGODdUYXY1UXVJQ1k5OEpUZEMvL1ViaElWd3VPOERTOUsxd1RQa1ZjK0NROEEvNGlmTnJocVF2Q3MrUVc3d3ZQMGMyaUVqN2pjUEdGOER6ZG5YNnpIc1dIU2VCM05DK1ZGMWU0M2xHOHExcjh3Tk84blVSUFZGUHpXbDkzb2lUbDZ4MnQ0M1MxVlBJRDNlazMzR2JVTFNFV29iVjJPMmdHWGlqYmphaW5id3hWNnVwQTd5cS9IM3JKb2xzdUwxZTIxamVybFN6UStPNkljelQra1VyU0lPcHhsc0RqVXBPSmY2eURiZFhUbnA5NFhTNnhLWHB5WCs4RUtadEkzb3ZhZXVBbGltRUlnNmJxcFNpZzMydXBoRFhLMlh0WTVWcXNlbGx3TlF1NHpVZGRMcnBzeFNUWHlIaFB2U0QwR3FIaUFXcGxqemZXZHRqVHEyeGFRQWRwTXdsaW5icHBFTHBSNHBkcUcxWHhEQVlEdDl2Y0QvVmhyRXlIWW82SDFkdXUvOUxhVC9EUU9rVVUweUVsRkpCUEhkTEV0RVJsV3FRVlVCMFdoWFVYM3hiV0IrVFppRzNFUi9RRTFxYmRyMUVmYXdlMmhGTHNyMXNsRGVXVVZxbUV4NGUraWVoVGcxeGtSZFNGTmRQTlZHdlV4aFBBRjJBZlRuZzNrTkhEZXVOWUxYWHNEMERHN2tNL2hEMUIvUzY2S05NeVZXZ0xYVzVTRlRTcU9NeTdNNUg1UGYxSFdFMTNnYTJFeDA3Z0gxYjFzeFAvdlJsc3cycklnMmFDYnhmbmxmQU9iL3BuZnROVFlLc2Nhakx0Z2RxZ2diMFQwM0VXRWRwNmpGNHFOOUFIdCt3MDJQYWpiUFpENkRJNmlHM3NxSEoxVE9FMkxDZk4wcnc4VXRuNHVjTnFQSHFLTjdDVGErQnJQQU81VitNMTU2N1JqbVdOZStkdlU4aG1rRUxUekRtR0xjV0pxZFZ5N2RSOCtHdklyMDdrRE96ajRoYWJ0STlvamYrSzZYSTR3L0hvK05qZEg4MzYvNzMvenIzL1VzNVhiWC9weUFCNDJtMVNDWFFUVlJTOXQ0UUpKQVVLS0lJYnlPcEdiWkkyVGQyZ1N3cUYwa3BMS0NDaTA4azBHWnJPbE1ta3BiaUFBZ3FDb3FLNGdpRHVDd0x1b09DK3I4ZDkzL1c0N3g3MUhKZGs1cHNFY2M2WmMvLzcvNy83M3Z2M29nRDI5M2NJVWZ6UHh4dlNmd0Y3b1JkZEdJMHhHSXR4T0JTSDRYQWNnU014SHNVNENpWHd3WThBU2xHR0lNb1JRZ1dPeGpFNEZzZmhLZmJHRTJqRkJiaU5FdDFRc0FWLzRtOUUyWWQ5NmFFWEtndlpEMC9pYWZiSE14ekFJZzdFRi9pTmd6aVkrM0JmRHNHejNBL1A0WG44Z1JjNGxNTzRQdy9nZ1R5SUIzTTRSL0FRZk1TUkhNWFJhTU9MSElPWEVNTld2TXl4SEljTGNUc1A1V0U4bkVmZ0V4N0o4U3ptVVN5aGozNThnMWNZd0t1STR6V1dzb3hCbGpQRUNoN05ZM2dzdnVKeDJNbmpPUUdmY1NKcUVFWXRKbUV5NmpBRlUxR1BhV2hBSTA3QWREU2hHVE1Rd1V5MFlCWm1ZdzVPeEZ5Y0JJMlZhRWNDR3pHZlZheUdqZzc4UmNCZ0RjT3NKZkU2SjZHVGsxa0hFMGxPd1FKT1pUMm40VXY4emdZMjhnU3M1SFEyd1dJenV0RE5HVWd4d3BsczRTek81aHlleUxrOGlmTjRNajdtS1pUWmlvWG9vWUpUY1JxMllSR2pWTEVKcDdPTk1jYXA0VlBPWnpzVDdLQk9nNTM0Rm1kd0FaYmdUQ3lteVNRdHB0akZiaTVrRHhmaGE1NktIVHlOcCtOem5vSDEyTURGWE1JemVSYVhjaG1YODJ5ZXd4VmN5WE81aXF0NUhzL0hnM2dJZlZHTjgvQUczc1JiZUJ2djRIeThpL2Z4SWRmd0FyeUhEekFRQTNBUURzWXRjR0V6UnVJYTNJMTdjQ2Z1d3FONGpCZnlJdXpDYnR5RW16RUlFM0F5enVGYVhzeEx1STZYNGhFVVlUdnU0R1c4bkZmd1NsN0Y5ZkNpRU1kakl1YmhGUFREV1hnWVoyTUZLaUdqQ2g3MHhpaHV3Q3FjaTlXOEdtNHN3M0tzZzRUQjJBZjdZZ2oydzFBTXcvNDRBQWR5STM3QWovaUptM2dOTi9OYVhzZnJlUU52NUUyOG1iZndWdDdHTGJ5ZFczRS9mc1l2K0JWOThEajY0enVzeGZlNEZ5T3dCc054Q0paeUc3ZnpEdDdKdTNnMzcrRzl2STg3dUpQMzh3SHU0bTVYUTZTK3ZxQzZ5YTIzSmp0bFJaVXFXMDIxUzNWWGRzaUthZWp1U2lObTZHcTd0MXJSVENYVjBaWlFGM3FxbzRZbEs0cXFXMUtOSXFkdnBjRTBaRXNLMjdsUzJONzBoTFBYM0dHSHJWZFlqN25EZ25GU2p0R2QwclVTbjkvdm1aUk5jVTF1bFUzdjVOd2RxYzRtTDZpYjRxNFR2ZFU1VEZLZHBTV2lxbmZLZndrRFFhbGVWbEtXS3RYYkhZbmRLbGQ5dW96VTRCdzE1QjJWbGttTmRwVitqZkdVSHBQTlZFZENUbG51UnFlZzFPU2tOT1dsbEFXbFpudFhoR0Z2ODMvYThQdENyaG5wWWFRWmVXbEJ2emlybENKT3hjZ2VGU05peElnell1K0lxZWt4S1dJUEtyWFlCZnUyUkRYVlZKTmFVbXFKbVhLWDZtM0pWZmJPem51NTJmYXhOTWRPODh6SnFTYzdXc3VpbUN5VVVmSzBWbkszbzduKy9ZRnlTWFhFVmgyeDFaellxaEJiVFl1dENzcllYbUlIUExHYzJQR00yUEc4bGpXYjNLTmxyeFJvODkyYTZGTVR1bXVPN3ZQMzByMjhzRDFtcXFxZWtQV29wa2dKUjdaRXZnbXFYWW1NQ1hUblNNODNRVkF5SEVtTVBTUXhoQWxNSjhYTU4wRzVsTXczUWEwM3VaY0pLbHhXeGdSV3Zna0M0cXhLU2prVlUzdFVUSWw1VThJRUtkc0VLY2NFM1k0SnVyTW02SFpNMEoxbmdwNjhGKzF4VExESU1jR2k3TVAyVVF3enF1bHlvbzljbkZUaWhwSG9KOXQzc3BIZG1vZ0d5VGxLc1ZVay85dENOc011SmFMK3dsM1owQmxHaElWeVpxWnNvajJhaUhySGl1V0U1WWs1NWRQTEFYa215c1JGTWNYbzZKQ2RNVEliL1hPT3lvUmUrNm1iRTBhWDNPN05QSFNKdjZRazRBOFdaUWpOcExvZ1pWaHFRbTJ6QnVkdlJGc1RtYjJNTXVucmZvRUJnUlVDS3dWV09lZ3JHOVNwbXBvUnpkUk9QMGEwV0pFN1BmR2V6cmlxMjB0Vmo4ckp1TFBzK0hmcEZibVp0U1JiR1hDRlU2YmhjSmFYQ0N3VldDWXdLTEJjWUVpZzZDMGs4a0krZ1dLR2tKZ2hKUGhDZ2k4aytFS0NMeVQ0UWpaZmV0UlNnVUdCMVFKckhLd3FjMXhjVlNXdzJza1BpTG9CcDY2dndpZlFpZjArTzY4MlhGdHJZMjF0VFdHeFpiV2xqVy9FTmQzNkIrKzI5Y0VBQUFBQUFRQUIvLzhBRDNqYVkyQWdBRHlBMElIQmdXa1BBd1BUUmNZWERBei85WmwvL1R2UGRQei9WeUQvdy8vdi83VkJmQVlqSU5SbDBHV01ZMkFBOFJsVC92OUdGbWZhd3hnSDFuZUlNUkpFQXdETUtpT0xBQUFBZU5xdFYydGJHOGNWbnRVTmpBRURrckNiZGQxUnhxSXVPNUpKNnpqRVZoeXl5Nkk0U2xLQmNidnJOTzB1RXU3OWt2UkdyK245b3Z5WnM2Sjk2bnpMVDh0N1psWUtPT0ErZlo3eVFlZWRtWGZtWE9mTVFrSkxFZytqTUpheTkwUXM3dmFvOHVCUlJMZGN1aEVuaitYb1lVU0ZadnJSckpnVmc0RTZjQnNORWpHSlFHMlBoU09DeEcrUm8wa21qMXRVMEtxaEdpMHFhams4THRicXdnK29Hc2drOGJOQ0xmQ3paakdnUXJCL0pHbGVBUVRwa0VyOW8zR2hVTUF4MURpODJ1RFo4V0xkOGE5S1FPV1BxMDRWYTRwRVB6cU14NnRPd1Nnc2FTcDZWQThpMWtlclFaQVRYRG1VOUhHZlNtdVB4amVjaFNBY2hGUUpvd1lWbS9IZU94SEk3aWlTMU85amFndHMybVMwR2NjeXMyeFlkQU5UK1VqU0JxOXZNUFBqZmlRUmpWRXFhYTRmSlppUnZEYkg2RGFqMjRtYnhISHNJbG8wSHd4STdFVWtla3h1WU96MjZCcWphNzMweVpJWU1PTkpXUnpFOFRDTnlmSGlPUGNnbGtQNG8veTRSV1V0WVVHcG1jS25tYUFmMFl6eWFWYjV5QUMySkMycW1IQWpFbktZelJ6NGtoZlpYZGVhejc5VVRNSUJsZGNiV0F6a1NJNmdLOXNvTnhHaDNTanB1K2xlSEttNEVVdmFlaEJoemVXNDVLYTBhRWJUaGNBYmk0Sk44eXlHeWxjb0YrV25WRGg0VE00QWh0RE1lb3N1YU1uV0xzS3RramlRZkFKdEpURlRrbTFqN1p3ZVgxZ1VRZWl2TjZhRmMxR2ZMcVI1ZTRyandZUUFyaWN5SEttVWsycUNMVnhPQ0VrWFJrNnNSR3BWdW0xVkxKeXpuYTVqbDNBL2RlM2twa1Z0SERwZW1CZkZFRnBjMVlqWFVjU1hkRllvaERSTXQxdTBwRUdWa2k0RmIvQUJBTWdRTGZGb0Q2TWxrNjlsSExSa2dpSVJnd0UwMDNLUXlGRWlhUmxoYTlHSzd1MUhXV200SFYrbmhVTjExS0txN3UxR3ZRZDIwbTFndm1ybWF6b1RLOEhES0Z0WkNjaEpmVnIyK01xaHRQenNFdjhzNFllY1ZlU2kyT3hIR1ljUC92b2paQmhxbDlZYkN0c20yTFhydkFVM21XZGllTktGL1YzTW5rN1dPU25NaEtncXhDc2djVy9zT0k3SlZsMkxUQlRDL1loV2xDOURXa1Q1TFNpVUhFcXhocGtFTnZ6bnloVkhMSXVxOEgyZkkxR0RJVmpMYXJNZWZlaTV6eU51cTNDMjdyWG9zczRjbGxjUWVKYWYwMW1SNVhNNks3RjBkVlptZVZWbkZaYWYxOWtNeTJzNm0yWDVCWjFkWU9scE5Va0VWUktFWE1rMk9lL3l0V21SUHJHNE9sMTh6eTYyVGl5dVRSZmZ0NHRTQzdya25lY3crL3B2NnlzN2V0Sy9CdnlUc090NStNZFN3VCtXMStFZnl5YjhZN2tHLzFoK0VmNnh2QUgvV0g0Si9yRmNoMzhzMjFwMlRPWGUxRkI3SlpIb2ZrNFNtTnppTnJhNWVEYzAzZlRvSmk3bUM3Z1RYWGxPV2xXNnFiakRQNVBoc3ZkZm51UTZXNnlFWEhyMHducFdkdXBoaE83SVhuN2xSSGpPNDl6UzhrVmorWXM0elhMQ3orckUvVDNURnA0WHEvOFMvTGQ5VDIxbXQ1dzYrM29iOFlBRFo5dVBXNU51dHVnbDNiN2NhZEhtZjZPaXdnZWd2NHdVaWRXbWJNc3U5d2FFOXY1bzFGVmROSk1JTHlEYUw1Nm1UY2VwMXhEaE8yaGlxM1FadEJMNmF0UFFzbm5oMDhYQU94eTFsWlNkRWM2OGU1b20yL1k4cXVBMjVHeEpDVGVYcmQzb3VDVEwwajB1clpXZmkzMXV1WFBvM3Nyc1VEc0pWWUtuNzIzQ2JjOCtUNlVnR1NvcTQzWEZjaWxJWGVDRVc5N1RlMUtZaG9kQTdTREhDaHAyK09tYUM0d1duSGVHRW1XYmF3V1hHTWtvbytES256a1ZKN0lSVFRhaWlOKzhwWDZxQzRYUW1jUkNZcmE4bHNkQ2RSQ21WNlpMTkdmV2QxU1hsWElXNzAxRHlNN1lTSlBZajlxeWc1ZWRyYzhuSmR1VnA0SXFUWXp1bi95SXNVazhxOXJ6YkNrdStWZFBXQkpNMHBYd2w4N1RMazlTdklYKzBlWW83dERsSU9xN2VGeGxKMjVuRzA0TjkvYTFVNnQ3YnYvVXFuL20zbWZ0Q0RUZDhaNmxjRnZUWFc4RTI3akc0TlM1VkNTMFRSdllFUnFYdVQ3WGJPUlRmS241MW5VdVVJWHIwOGJOcytmdjZHd09qODVreS85WTB0My9WeFd6VDl6SE9ncXQ2a1M5Tk9MY3ppNGE4QjF2RXBYWE1icnJOVlFlbDl5YmFRanVJd1IxZSszeFdZSWJYbTNUYmR6eU44Nlo3K0U0cDFhbGw0RGYxUFF5eEZzY3hSRGhsanQ0Z1NmUmVsdHpRZE5iZ0YvVll5RjJBUG9BRG9OZFBYYk16QjZBbVhuQW5DN0FQbk1ZUEdRT2c2OHhoOEhYOVRGNllRQVVBVGtHeGZyWXNYT1BnT3pjTzh4ekdIMkRlUWE5eXp5RHZzazhnNzdGT2tPQWhIVXlTRmtuZ3dQV3lXREFuTmNCaHN4aGNNZ2NCbytadytEYnhxNXRvTzhZdXhoOTE5akY2SHZHTGtiZk4zWXgrb0d4aTlFUGpWMk1mbVRzWXZSanhMZ3pUZUJQeklpMkFOK3o4RFhBOXpub1p1Umo5Rk84dFRublp4WXk1K2VHNCtTY1gyRHpLOU5UZjJsR1pzZVJoYnpqVnhZeS9kYzRKeWY4eGtJbS9OWkNKdndPM0h2VDgzNXZSb2IrZ1lWTS80T0ZUUDhqZHVhRVAxbkloRDlieUlTL2dQdnE5THkvbXBHaC84MUNwdi9kUXFiL0F6dHp3ajh0Wk1MSVFpWjhxTWNYelNjdVZkeHhxVkFNOGQ4VDJtRHNlelI3U01Yci9hUEpZOTM2QlBXZ0Evb0FBSGphWS9EZXdYQWlLR0lqSTJOZjVBYkduUndNSEF6SkJSc1oySjIyTURESU16Tm9nWmpialZqVVdJUTRtTGtnUEFzbUhTWVpOakNQeTJrUHp3SE9BeXdIR0pnWnVJRjhYcWM5REE1Z0NPTHZCSklNTGh0VkdEc0NJelk0ZEVTQStDa3VHelZBL0IwY0RCQUJCcGRJNlkzcUlLRmRIQTBNakN3T0hja2hNQWtRMkc3Q29zRWl3c0hNcDdXRDhYL3JCcGJlalV3TUxwdFpVOWdZWEZ3QTU2VXUrUUFBQUFBQUFRQUFBQUI0MnRXVXdXN1VNQkNHNzMyS2tVOGdRZExsQkZYU3FpcUtRQ3phMGk3Y3AvRnNZdXJZWVR6WmROOGVwODYyV3dTb044UXR0c2FmdjM5c3B6aTc2eXhzaVlQeHJsU0w3RmdCdWRwcjQ1cFNmVjFYcjkrcXM5T2pvaU5CallLblJ3REY0TXlQZ1l3R28wdFYreTdyNmxzcnU1NnlLOUlmVU5aMEoxZlVEQlpaNWZjcnR1UzBaM0RZVWFrdXlRazJqQjNrOFBuaTAxTEJ3TFpVclVoL2t1ZmpPRDd5SW53bTFFemFTSmkrSDBaLzVMRzNjYjd5ZzlPOGV3Nyt1Y2ozRkV6amlKOHkrMzMxQk14bjRmekF1TkFVYWphOXhDYlAyMG5zRVZpY3VreE9wVW1BZFdzQ1ZONEpYUHVOak1nRWNjS2FtbHdnRFRFUE1VaExjUDF4Q2F1NGJ5cGVwb0pYOEMwZEpDeXlSWlpnODlvSmcxczBGbThzd1dpa0JZVHEvQXVnbk1BY0l5bUdMQmliZVc3eVZiVXM4c2t6NWZrbFE3RW5IM2JpTndqMTN3YWVTZW42K1g3SHBtbmxyMmt1OWxYdzVuanhMdm9ReEJjQjhVbkFKZnZ2VkF1Y0Q5SjZEdkJpY2doUm9vbHF3ODM5elVtdlo3WFptTnFnbllkVDNwZUhXazlVQ21IVTFDSGYvbnV4QTVVaWYveGgvQVJnVkcycSkgZm9ybWF0KCJ3b2ZmIik7IGZvbnQtd2VpZ2h0OiA0MDA7IGZvbnQtc3R5bGU6IG5vcm1hbDsgfQpAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICdSZWRIYXRUZXh0Jzsgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHUmdBQkFBQUFBSkdzQUJJQUFBQUJNQkFBQVFBQUFBQ1FGQUFBQVpnQUFBUmlBQUFBQUFBQUFBQkNRVk5GQUFBQmxBQUFBRG9BQUFBNml5V1VzVVJUU1VjQUFKQU1BQUFBQ0FBQUFBZ0FBQUFCUjFCUFV3QUFBZEFBQUEwREFBQWlLZzZkaGFSSFUxVkNBQUFPMUFBQUF1Y0FBQVlvY0FOdjhFOVRMeklBQUJHOEFBQUFVZ0FBQUdCbGM0RzBZMjFoY0FBQUVoQUFBQVB2QUFBRnRHOU0vVmRqZG5RZ0FBQ0lKQUFBQUU0QUFBQjRMVGYvbkdad1oyMEFBSWgwQUFBRzhnQUFEaFdlTmhQT1oyRnpjQUFBaUJ3QUFBQUlBQUFBQ0FBQUFCQm5iSGxtQUFBV0FBQUFZaUlBQU5LaUNCbTJRMmhsWVdRQUFIZ2tBQUFBTmdBQUFEWVV2NDdNYUdobFlRQUFlRndBQUFBaEFBQUFKQWYzQkpKb2JYUjRBQUI0Z0FBQUF5MEFBQWFhbFRWSThHeHZZMkVBQUh1d0FBQURVQUFBQTFDeGl1U0xiV0Y0Y0FBQWZ3QUFBQUFnQUFBQUlBTDdEekJ1WVcxbEFBQi9JQUFBQXpZQUFBbkdPRFZZR1hCdmMzUUFBSUpZQUFBRndRQUFDZ24wcHAvWWNISmxjQUFBajJnQUFBQ2lBQUFBdmVHMlhpTUFBUUFBQUFnQUFBQUVBQTRBQW1sa1pXOXliMjF1QUFKRVJreFVBQTVzWVhSdUFBNEFCZ0FBQUFBQUFRQUNBQWdBREFBQi8ySUFBUUFBQUFCNDJyV1pDM0NVMVJYSHowMTJGN0tRaEFDYkpRSGwvUTdoS1lJRVp6cFZaNnAyVktTMnRiWkliYWVPeENoWTI1bDJ4azZwQlRwTWxhS0NLRldxQXZKb3cwTVFRUmdxRHkxV29LQ3lFUElxYWhKaHU1TkFraWFtM3Y3dTNlL2I3Q1lMTExSK1ovN2ZkL2MrenJuMzNIUFBPZCszb2tURUx3L0tGa203NlpiYlowcFc4ZXlmbGtpK2VLZ1hyY1cwOXhQUDErNjllWUFNK2ZxTW1RT2tZTVlkM3h3Z2syYk91RzJBRkRsOWxQTk1jNTdwenRQalBMM2ltL1BqZVNVeXpONEw3SDJDdlUreDl4dnQvU1prR1htWHZodXV5QUYrNzBwUmZYdmF1ZWJLWkprcDgyU0piRS9ybXBhVnZpcDlUZnBHVDRubmVjOHJucjJlZjNvOVhyKzNoemZYTzhWN3E3ZFl1a2krcnBOK1lMbHVraFc2VGhYcXNDclM5V3E2UG1aYVFUOWFsdXN3clJVcXFBL1R1a2pOMGkvYnNmVzA3cGZsNHFlbGpKYWxqQ3VuOVdQSllHd0FqV1V6dHQ1eUR1cGFWU2crZXUxVzAzbk8waUZtMm9YeDNVQXZFQUI5a1RhUzV5Z3dHaFNBTVdBYUtBTFR3WTNnSHZCdDhCM3dYWEF2K0I2NEQzd2YvQURNQWsvcW8vSmJzQUFzQkl2QUVyQVVQQWVXTVl2bCtxQzhBTmJ3ZXkxNEhhd0Q2OEVHc0JHVWdrMWdNOWdDdG9JM3dEYXdIZXdBYjRHZFlCZDRHK3dHSjBBSW5BU25RQms0RGNwQkJhZ0VWYUFPZkE3T2duUDZxUEtCTHFBcnlBQiswQTEwQjVrZ0MyU0RBTWdGOSt2OWFqYnJWZWk2UVg0azgzVWJhNCt3OWdocmo4aENySHNSenlWZ0tYaFdmUEljZGN2Wm9SZDR2Z2hXTXVhUDRDWHdNbGdGL2dSZUFhK0MxOEJxc0lieGE4SHJZQjFZRHphQWphQVViQUtid1Jhd0Zid0J0b0h0WUFkNEMrd0V1OERiWURjNEFVTGdKRGdGeXNCcFVBNHFRQ1dvQXA4dzcwL0JaNkFHMUlJNjV2NDVPQXZPZ1Rid0gvQWwwTmdtSjFzcHdFbEJyeEgwR2tHdkVmUWFRYThSOUJwQnJ4SDBHa0d2RWZRYVVUMTBxOG9CUFVFdjBCc0VHSjlyYmIxY0RkY2IxQWd3R2hSS2hob0h4b01KWUNLWXFpK29hYUJJYjhQU3o0aFNSV2phM0FmSk9IWW14TTZFMkprUXV4SmlWMExzU3NqdXdocWVhOEhyWUIxWUR6YUFqYUFVYkFLYndSYXdGYndCdG9IdFlBZDRDK3dFdThEYllEYzRBVUxnSkRnRnlzQnBVQTRxUUNXbzBpRzBFMEk3SWJRVFFqc2h0Qk5DT3lHMEUwSTdJYlFUUWpzaFpwbXZEM0QyditUc05NZ0sxalVIblJUck5sV2ltOVZjYkhFZVB1UXhUbjRhZnNCSHFkWDZpNWNZMDhDWWo0eVZNdVlqK29ab2JaQ3V0TFRRVWtiTE1iVDJFTndhNGJZQlRrZm9VVU9QZkwxVEZzdDhlbTFuN0JGYXF4bGZRWTltZWpSais0dGxlTUxkakFuQnVad3hyWEN1WVZ3WXptSEdIYkJqUE5aamxTQnJybTZCVTR0MFZVSEp4ZytHYURuczlMOUFhN1ZwWlV5WTNRM3FLblk5bTNtV3Nyc0gxQnpKVk1YVWwraXRhcTUwTjZ1WHRNQW00NUZ6QitUZExsTmtQQkhndks3WFRhQk9oN2pYYW14WG45R3R0dGJVMTh2L2VPbW45SDJzMS8zVnFKZmloMFh2Z1hkSWY0cXNTdXJLOUdIcHI5K2hicS8raDM3ekNpV3MxaVhjbSt3YXdycFp6NWNNUElLSUY3OXRJbWkwVjQxMFIwOWlWcVEvRlQvNyt4VmNWOHRWTDlOUDZFcE9vMS9ZYVgxQjcwVkwrRmlycGJQY0szVUx1cXFTcWZvUXZjL29hcjN2Q2tWNDBFeXJMdFdmNlZJbllodTVyYmEyR2F0cm4wdXpneWFqUmRONkpXdlhPM1VEaU9mWGR0bVJLVXF3bGxPaFY3SDZEUW5qajZHaEN1eloxNUdqL3N6ZXo3RENtaXZRbGMvQlYzNmhxeFpkbzA4bG5VSEh2aGV1V2t6R1Z6RHpzL29sL1pGZWxsQlhBZXJJM0M2aVUxYmJpcys3Y2xrdCtwV09hNkN1Q3MrY1JHdTZNU1dlcGZweDF5KzF6MG52dzViZWgzTzVQdUpVNWVxdHR1VUlmdVo4MUpNUU82OXlIMUsyOU5TdUFMNmlFZzk3UkMvQWQvandhc2YwYnVxaTNuV3pxYU1VZnhicnFKUG9EckYzUWJ4Q0crZHBMMk5LVFV0U1RkVWJIeHFOQk1TaTNySGErR3RRWXUrNFh6NzhlK01sTExBN3ZjcmNQYkJ6emJBK210amplZzRibDRiSHJhSDk2bUk5VkV2TUpwSllGeFpaYmU5bCtpQTh3K3g2VnZzc25YVmM5TFJya3lsSGZVeU50ZS9LSkoyQytKZDNUTHlFcTkrWlNUVzdzUWVwUi9VZXU4WUtmVnlHbTdsYjMxb1d0eEkvMnEvUkVSUEJUR1RrVjBNbk84bXhGbGlpZCtuWkRvZFYrajd1MjFuUENiM2U3bERFdFV2YmJtSmRjM1MyK25FN28zcDlzMTVOYVgzU2RWWmE2U2ZwZFJDZTljd3dBNC9qVCtnVVhWdFRaOC9ONlAyT3RtcWpYaUNKQ0wrVEFaeDFadFdHaEZZYm1acklTdHo5Q0xQK3Bsak05c1VrR0V0cVpmUVpoNWMveVJxYW9qMmhzOWJidEZtdjZYZnR5YkczRE1tTDJUcDhYSnV4K2c4WTZ6TTFKdVlteldaSzlFa3JPNnJ4VXJKSm43V3JNaXMzWXYzU2NkNFJRMVliSnpsbC9waDFtYlAzTVJtanNmR1ZuYzZRYTYyUnVGK3RXTDY1dkowNjlyNnNoN3RJeE1PTzlscU5uTGRyYUNiNlpGaTU5UTdWT2Z0UVlNL2xXZXRMMnZmY2o1NGFuRmhmYlcyK3M0UUYrbGJlWGMwZTlhSi9qZDVzVHFoZXE5K2xkQkRhUTEySURIZ3FQclVObjd0UEw0NzYxdWhwWXN5SGVDOFRNWGkzaFZQbmkweUpHZnBpbHVDelBzRHY1SzFOUnVmc2hmRWFybDAxeHZrM003clJlalBmSlhNQXNmT3VTZXlGVmZtU3h1ZVc1T1YyNzVLb0svdkxUMDVuN0tTeDg5Z2ttdlZIYmNOb241eW1Jb0ZidVhQK3d1aTJ5cFdyejFtYlRNaCtzS20yanJtRTI0N2VXOTJjcjFPK2tSSFRpUEVsTmZwRDkvenI0MGd0VDFoRDg2WDE2dmdvYzFMaWM2R29WL3pBV2tmelJmT1dZVmNSS1hNdWVWSStRWm92OWF3MDVqRXVuc3Y0bkhqV2FrK1RINDJWa1hHY2lscTFFL0hhT0FkR2Ivdmk4dGFvdlZudmJlTmVHejMySnNqZUZ6dkZZZjJ1OVVFUmUwN21ZeS81MGgvMDRuZlVHNTlDYm92OTh1ZmE0ODNHbitnM3FYOC9aZzFoR2N5b3VMUGw5TzRmOVpiSVdVZS8zZVI3RnpwcXlZblFQc21NcXpPUjUzTXorNFRNSjk2YU16dGtjbUYzTnZFV2FkOExUNmVTeThaNGQ3SG5vclpkRmx4cXNOWEdaTzhnTnVicXFLWXZhUjJ0N3J0UUxDTUl4MGtJVzUvZmtsUUMyWWI5SHBxQ2hNU3pISXR6cmhXMEpaK256WkVDTmo0NE1Ta3hMdHBUMXRHUG1DKy9oNnduOGFjd3QycXJ3VEJ2MC9WV0QyNis1SXQ3czB0UGt1dS9wdC9qUkNlTm9rbjJOQkRuRzFLWlZVTmNWdUZMZ2IrMU9iUVluYi9mUnJ4eWV3cnJIUzFWSnA1NGM2NTRFL2pTdklkZkxETk90RUJqWi9iK2hZMUFxYjNaN0xGenFFdWg1eWxyYWJYUmMyVy96WnpubkVaWDcyM2Zod1JiOHR1b2U1ZzlyRy8vQnZOL2Z4UGN5N3E3cGZnZXQxR3k3UDhFUG16SDQwVHVSdXZCSW80V2F4UFhZTDU2MkVqejZ1VjN3Y1FzZE9JaGwvQTR1V0Q4UG5nZHp0NU91WVFQNzFaanM4WFV2bmYxaXVVZGZrdSt4SGpmSWZvN2tkVmFZWFowelpkWnhUNDhjcWIxeEUwOE01M1Q1dGk4eVpRNnpwTUkzMERVenlDM0RDUjYxNHRJS0tlZkwrWXhNdVBpY3F2cjhUcjZLQ2lFaE9wVStIZnkxTkVWMU1kL3kraTBoaFliMVZyYzNsZDlaYVY2K3E3Nnk4blZmazlSa212ZTBzbmQ4NldmRk10Q1dTeExaWVVLcWpGcXJDcFMwOVVkNmk1MXQ1cWxpbFdKbWt2czZJbTFMbURrSXRraDgyV25ISld0Y2x5bHlTSGxVMEZwVmNQVmFOV2QwUk5WanByQytEN3FGdlVOZFMxODdsQ0Q0SFdYR2d5L3U5VVE5UzFvS0p3ZlVNUFVROUJvWkR5bUN0UlQ2bWsxU1MySEpwdC9BOVV6OXB6MXdENXkrTjFUSmtONVdIeHZXd293cHdDckNFb2ZhajAyMitoci8xT0xVazZzbEEwUGx3S1dXeUpOQmdINFIybHlCOHFMUFkxa2w5eldnRU01c1pLWlU2NmRsMHQ5SEVxSFIyZktkNml2US8wc2paRkNHU25YeXlnME1KWmYxME1GWUl4dEthUnVuSXlYQ1R3bnlpUmFKc3AxdHMzUXFGaHBERHhjTWh6R1FxTTYwQmhIUnBURzIxRURIYnJlMGtDTGdVZ3BjR3JNNVVvb2RHaFVyRlRJM01iWitiazB3YUhDbUp4NG11VFFSSWV1c3hTOWt2VWZIU016Ris5bExIMHdkQTAwbUhKWExMNmJESEhJdmZyTEFJdE1rN1YxdUs1MUtQSDdrb3VoU2Q4cWpBME03ZEEyd25nRDNnRXplR2NZUmk0NzNOWmMrWlU0RjdGelNPUDhlaUhGL0x0Z1pkMmdkS1JsMGRJTFNyY3pTcmUyMk5kYW9zZGEzalhXN2daWXEvTmFxeHRvTmVXelVycWdreEh3SE1rZXAxdTlqNVJwY2lQbDI2QTB1VWRtVVg1QWZzTG9CMlVPUEIrV256SDY1L0lMdVAxU25vRFByK1RYOEprUDVjcHZvS0E4aVEvSng5c3NSTnVMb0h6NW5meWUrcWZrYVdhMEJNcVhQMEI1ZUtPbGxKK0I4dVJacUxzOEIyWEtNaWhMbGtQRDVYa29XMVpBSStRRnFJZThDT1hJU2xtTnhEV3lFUTUvbHIvQW9WUzJVMzRUeXNOLzdhYThSLzZLM0hka1A3bzVBQVhsSUJTUWQ2R2d2QWNGNUc5UVVBN0orNVQvRGdYbEF5aFBEc3N4eXNmbFk4b25wQXB1MVhLRzhpZFN5enpyNUJ6ekRFTkIrWmMwTTl0L3l4Zk1zMDIwOUZDQ3o4ekJaMlpMdnVxaGVrc2ZGVkM1a29ubkRjb2d2T2dJeVZBajFTanBpVjhjVGJsQUZjZ29WYWdLWmFnYXB5YUtIKzg2UlhxcnFXcXFkRlUzcUJzb1QxUFRLQmVwSWhtRzU1MHVRNHp2bFY3cVRuV245Rk16MUF6dU05Vk03dmhlNllidm5TV0QxZjFxdHFTckg2b0hxTUVQUzM4MVI4MlJNWGpqWWlsVUQ2dUg1VnA4ZjRtTVU0K29SeWcvcWg2bHoxeWl3V2cxVDgyVHNYanR4OFQ2YldUaHQ2WGJmd0V6TEVxTkFIamFsZFJKVEJOaEZBZncvL3RhU2ltbHJBb3FZa1ZFeEkzTjRvSTdJTHVtYVl3aEpGQlpUS0FVUTF0RVJkU0tXNzBZRHg0TUxxQVlZNHdINDhIZ0VnL0dnL0ZnUEJnUHhJTXhoaUF4eGhoampBbStlUXdHNG9GNm1OK2JtZGQ1OC9wOTMzd2dBQmFNR01hZ2lrdXJYTEI1M0g0dlZzTEk5ekV4d1RuQUJDc1NrSXAwWkdFMUNyQ0J6NDNiYWt2c2NPeHd1dXh3T25kVjIrRjFPU3Z0Q09sUEVTSVJnMFFzeEJJc3h4cXN4VWJKUkVQQkRCdVNrSUkwWkNBYk9YQ2dTTThaRUlWWXpNRThMTUpTckVBdUNyRkp6eG01YWh6bVlqN3N5T1FPODdBT20vVmNCQi94U01ZQ0xNWXlyRUkrMW1NTHRycmRIajhGeFpCNFVid3NEb3AzR3QyK1pyb3ZQaFNmaXMvRmwrTHJKbTlITzcwVlI4UVA0cWo0UmZ6ZTB1bHVwRithQ3FKSnRJb0pZb3FubzlHajBzUU1NVnZNOFFiYU81VkRMQkszaTJWaWplankrWEp5VmEzWUlMYUlIckZUN0dielZLL1lKNGJFQytJbHNaL05WNFBpYmZHZStFQWNGcC81QXZ0ODZvWDRTbndqdmhQZml4OTlnUU0rTlNaK0ZYK0l2elVOU2pUejJsRjgwSDlFYmQzTWJsUVltc05RVGRNdzdUdzZESTFoR0JHR3BqQzBoS0YxRm1QNHE4M2c3NmFBdjdaaVZNR0ZPalRCQXo5NkprZWVUSk5qUUhuNlRPelY0eDQ5MXVuUnE4Y3VQWGJyL3phb1g5L1M0MDA5RHVyeE90Zk80bjFBc1Vic1J4dEdNYzVYbWJDUWlTTEpURkZrb1dpeVVnelpLSll6NllpZ09JcW5CRXFrSkw2MjgrR2dRallOSnFxZ1NxcWlhcXFoQnE2Y3luTm40YjFCOFpqWjZCd01WRVFlQ2tuVU9qYlMrYi9uUDNuL0lYd1R4MlczK3NRcWpDR1pPNG43dDVlcEhyUzN6M3d2N3ZLVE0vZWtZbFJnTi9mWVMzNzJHQVhZNDlURm5xQ0RiSkM2MlpOMGlPMmp3K3dwT3NLZXBoNzJEQjNscXNRN3FiYUttdEhLdlgzbTNndzh2a0VleDM1YzQ4d0Fobmo5YUd2b0xJYnhDSS94UkZ1OWxNT3pwemlXVURrUGVUM1Z5NjhVdFZFNzN5ZHFKWi9NUlRMWE9zdTFydUFxMXh2Z09ickI4elUwVlV1cnd6VkthU2VWVVRuVi93R2hTdTBEQUhqYVkyQmgwbVg4d3NES3dNRFV4UlRCd01EZ0RhRVo0eGhTR0hXQW9veHN6TXhnQWlqSERzU01ERkRnNit6dEErTDgvOHY4Njk5NUJnYm1YNHlHQ2d3TWswRnlqRitaOWdBcEJRWm1BRHZWRGdJQUFIamFyWlIzZEZSRkZJZS8zOHVDSWlJSUJBS0V6ZXdpb2RlRWtnQ2hTQk5SZWlBSnZYZENGeFdNQmFSTHIxRlJRVkhoWUJjRnNYSEEza1ZBTUx2WUd5cUlva2pXdTB2QThwZC8rTTZaOCtiT21YZG4zcDN2R3lDT1dQUEtJNkpQb2tXS3hjVjEydUlTL0JxYnc3bDUvK0dKVTEwTjFCaU4wR0pWMUFCMVUzZjEwVkxWVkVmVlVFdU4xVGlOMXdSTjFDVGxhckttYUtwcXFiWldhNlhXcUw0R1VZemlYTVRGdHZZbGxPUlNTbkVacFNuRDVaU2xIT1dKcHdJVlNhQVNsYWxpTzY2S1h6M1VTajJWcmY1SzRCWnU1VGJtTW8vYm1jOENGcktJeFN4aEtYZXdqT1dzWUNXcldNMGExcktPOVd4Z28zb3BRNzJWWS9zUFVvTTZOS1FQV2VTU3p6M2N4ZDFzWVROYjJjR1RQTWJqdk1nK1htWXZCL2lJSXh6aU1DR09jNElmK1VtWldxdVJHcVYrYXEwczltaW9obWlZS2lsSnE2akdRTkN5YUprMFd2bC9GVTF4OHRsckV3VnFvSHJhY0dFOFhTMVVCeDlYVUpOQlpQT3hPcW16R2l0RkRkVklLMnhLSWJNMVg4UFZYR21LVndYMVZRZWxxb21XRUNDRkpGSnBTbHV1cEQwZHlhU2ZmWkhEQkNZeG1lMnFyQ3BLVkZYNTVWUmRBU1VyaUM5dWs4M0pwSTJkUXdYcmxhSUJhUlpsTTVqcm1XT3J6L0dxZU0yODNkNSs3NmgvcnYra2kzTWxYYnlyN1B3dTZKSmRRNWZpMGwxN2wrdG11UVZ1V3lBWVdCNVlHU3diakE4T1B1TVZSaUpuSTVIWXI1WENXWlhUYlc4NURPRUdOcW1MbDJCNWQzbjd2SVArUFA4SjU3a1NycHhMY0luT3hmSTJkbW14dk5OYzNyL3lxaWl2SXFlaU5ZUElYbHNoY0w2S2hUTUxqNTN2aHpQQ2FlSFVvbjZ4OElEd2hGQWszRDdzQy90Q2hhR2RvYmFoTXFIU0JiTUxsaGFrRmkvdmJkSFdJaTk2V3B0bzdUcHJlY3pUQVM4ak91eTE4ZHA1WGIzTWMvbThubDZtbHczL2l5Zi9jT0x2ZkY5ZzFXZWtSRWxiWnl5dE45NlNqTFE0STJhRE5ocDFpY2JoTXMzUVRHTXZYMWxHUlhWTmw4OTRXcWdGV3FRR3hsU1MxYWhtalBocXhueFRPNDhVNDZWakVTL3A1a0JPakpsQlpHbTVzVHM1Ums2dW5kWjQ5cGdaK2ViR0ZyTmpzNUc3MWR6WUViTmpuL2tSdGVNWjgrT0lHWExJN0Roc3JCYVlJY2VqanZBSDN4dTMxYm5YR0xpVFpPNmpGdmRUbHdlcHgwUFU1Z0hxODdCeHQ0MW1QRVVqSHFFSlR4aUZPMm5NbzdSa0Z5MTRsZ3llb3hXN2pjMFhhTTN6ZE9FMU92TUs3WGlKcTNpVkRteW5FL3U1bXRmcHlodTh5VFc4UlRmZTRWcmVwanZ2MG9QMzdHVGZwemNmMG9zUGFNN1RET0FUK25LUS9oeU4rbWJVaHhuS3A4Ym9NWWJ4R1NQNWtoRjh3WEErWnl6Zk1vWnZHTTNYekxDYmNpby9HeVUvTUoxZm1NSkpwbkhLbkRuRGpaeGxOamNaU2pmTEkwOWlGRjh4anUvTXdHQ1JmOG5tWW9CWi9NNU1UaHRudnpHSFNNenkxSmp2VGV4bTZhdldmd0xOdWlvSEFIamExTDE1ZkZ6SGNTRGMzZSthQXdOZzdzRWNHTXc5d0F6T3dXQUFYbmdrQVpBRVFCQThSQktrU1BBbW9adVNaVXVXTEZNSDVkaVNmTVpPZkNpMnRaSGoyTEV0ZjVidG54TmxFeWUrcnlSZVI4bGFHOGZKT282ZHc4bG5tL0lsRHJhcSs3MDNCd2FVRk8vM3gwY0oxN3grMWRYVjFkVlYxVlhWaEpKTnErK2hYMkEvSWhJSjZqNUNLTG5NS0tXdkpBUStrZHlTR2l3RTNRbjNKdnFHTTlLK0Z6NEtIeE5HVlBqMkNmWU0wWWlERlBWZUI1VUpuU2N5WVZSbUY2Q0ZiN2NpQVJRL1hTREVib05tbXR2dFZyV3VRb21XYUNxWDBMd2xTYVhlUjJqSC9UdXEzOTE1NDdkdllzOWNuZnJjNTJpUzltRy9Cd0QrSllEZlRvS2toMnpXTjJoVWthQUhpU2l5cEp4WEtXTmttZmVqVVZtbXk0VDMxUlhxN0lqSFFqMWRQVjUzUjdBejJOZGowMElGYjJJazRQZXBXZ0MvcHhJMDVTK05qSlZIc3hML25rcjVEOURLNlZkdkxtMlp2WFMrK2tlMDhJbFBsTFpzeVkxUFRZMy9DWHZtM0w3UmZYN3Y0WTJIYm1KSFBsZnU3eTlYYlJ1SGh6ZjhEWkNwdFBvOCt5ajdJa21RWVgzQTc1TWxtWEFVSlhhU01CYmRMVk1nNWtuQUxFWVhLT2tLZWpwdEtrblFoS0lGQ3BtUnNVcFFWVlBKQVZZZTNjSktJNEdnbHMybWt1M003K3RtOVAxako5TjdodCswTUgvNTVQajR5Y3Z6aTI4WjJwczVVeWtkbnN4a3RoNDVOVmljbjlnMmZ2S2h1Zm1IVG81djI3QTRVTXBOSFJzckg5dWV3N2s1WU14TkcrbkN1VkZxdEFMYzZMSk1PYTNhWFlTNE8xeGQ3VjNRMEpsUXRXQ2g1RTZNZEFNQzdTemxUYmxMSTFzQXR3RjJnSks1QjQ2Vnk4Y2VtSk1lZVdSdzM2WlVhdE0rOXN6WThmdG5aeThkRzJNSHFyN3MxaU9qbzBlM1paRTNLTzkvTi9UdkpJTjZFZkNSWkNhZEJ6S1lTTWl5c3F4U1JmRXJ3QnpReXVuR2Y1b1dRUVQ4NW44SDZKWHFnOVJSZlo3ZUQ3UHc1MmUrZk02RVBRZXc3YVJYejY2RnJRQXorR1VFYXlkMk4yZTVjQTJxK3dEOVdmVithcXYrSENCKzZVejFXWUZ2YWZVSyt3K1l4eXdaMHZ1OUhxWXdtRVdGQUovSjUyRWkrUlJHa1hia0pMU1BrUVczSjUvSnAxVXRXcUJJcTlaekNEeFdTWlVUN0Q5S1IxNnpDK2RwL01SRGMvdmZNWElndmJKaDVOQmtPak41dUhUZ2xjNi9BdDQ0TlBmQThoaE04OXdjVExlK2FmZkFVRzdxZUhuczJIUnVaZkdjd0hFUGpQdmRuS1k1UFExL3l4S1Z6ek9LWTFZVkprbCthUzB0WWR6d2xZTHZlKzZpMTk5MVYvVjMyVFBWLzBselY2ZG9zZm90QVJmZitnTEFsVWlYSHVBa1pOUll0bUwxYzdZb3VSZnV3dlVwM2drQTM0L0FPeDJrUjQ5cEtxTklMOFpnWm1FZURCSjVNMGtKVmp1RkJaZk01aXFCQUM0NWQ0bU52T1BlazQvR2Jna3NURXdmdUl1MjNmZmJaNC8xNmx0UDdLRWZxZkVPanROQk1uclNyc0phQXJsQytUaGxpVEhtWjRpWmd6ZzhIcmVDNGdSd0E0bENVOVFOOEliZVduMmFMcjIzK3BjdzBEK2xldlZqMWJmVFhkVlBHM0MzQWx5RnhQV29ZRU5LMlFtSm1pQVZvcmpkTWtnTFRqYy9BTHNUUnZ3SEY4UzdVb2JUSHQ1MXFsU0NWK2VSVEw3ZEVtRG1SNFp3ZTJUZ3RJd0U1QzU1dlVoMStzd3ZibjNQMTcvMm5vc2o5Q2RYbndPRUR0TVBYcDFpeWRvNG4rUjgzSzFITkJpWU5Vd0RKWURZaVNDOUpTb0JPT3BOSGJpVDNzd3UzbGg5UGJzSTBHVDZBa0J6WEgxZXlPTlI0T0dmQXc5N1NZNlBzQlhiNXZQNU5JSnNaTnB1cHNFaXIzSHRGc1orWGxsK1lIYjJnZVdLK2ZPZTFKWUR3OFBYYlVtbnQxdzNQSHhnUzRvZW54T1NhYzc4T1hac0tvZENhQXlFVUc3N01WTU92WXJQcFJkWEZ1d09sTWtVWkRlZ1pDNVhQdFkySnlFZExxZTN6WXN6bTA1b2ZCcUUxRTZsM0Y1VFlCK2dFemRjdW5URFp6LzJzWTlPVGsreFoxNTk0dGlycTFmWW9YL1pXaTV0TmVud0xVNkhJQmxFcVR3NDBBVXNwTXJRbzhUbUZVcDJ0YVpNTVo4WGxBRXhxT1hxNVhJM1U0SmpZK1VHRW8xVmN1em40OE9UQnlmVCs0djFkS3BlWFlqRTYya1ZLdm9XNmZINWg0ZG5OKy95K3V2bzllNmppY01qOVRTejJ5MmEzUWMwYzVFQUdkZkxOc29VTG93WVZkaDUzT29NeXFuRzd0clJUb2luc3ozUUVZQlhYTzVBd3NZWGhiSGplVk5TQS9rcTV4K2NtM3piNWRkOTRKT2YvR1JsQ2lqNHl1TlQ1d0xWdjZXaDZnL1lvYi9mUERLeUJYZ3pCT3Y3RVBzQzZTVjllczRIcTl0UEdaQnR2bzUwc0NKT0F2MWkwa0ovcHBCQzBsV01OVDZhemVXeTJmTG9tQ1VPVmI4dkVBemk1b3RzbHcxdDNYN1RwdW5ERzZidlAzTGtzVHNYM3JScDgranRHeWJuU3hQM3JwenJuYjJ3WmQ5Ynp4K3VERTRPRllxdVFPZVJuY2RmTVZnOGt1OGRMMlQ2N0FIUDhwNmh2Uk9KQ2JHR3VvQldaN2tPa3RDN1pTU0l1Y09ZaTFxb0hTZ252T1dFUHdXcnNvdk4vL0F1ZHVEQ2hhdC93QTRBakJrWTY5c0FocGRFOUpERTF6UzhiVW14bExkdXhXUkJnTGw5cGlSN1c5LzhMZHNmZnQ5ZEovYnNXYjZMRm5mY3NWajh2VGZSTjFkdnUvNldXNjZuYndiWXBvNmtJbjZ3ckp1WE9QU2hFdFhEcFU2Q290aWdORkQ5ei92LzVuL2VXLzBSQ0o4L1p0dEI1RktTQVdvL3lQZHpnTk9teVZ6K2dEQkVaR1ZUQUhuY25RcEkvVVJLUWtEd3Y1U1M2TWJYdlBQVkY5NXgrenN1dlBLZHIza25RRnhsbEg5Tk1TL0FkUUIrSCtkeURlUzQwNll3ZVkxZzgzaUVGQ3FsUUFvRkt5V0pwcVMzUDBKZDFUZC84dWszL0pKMnZPbUw5QWE2N3hlL3FINjArZzdxTWNiOElZQnBJeW05UjVPcDFHclVObUx6ZVBpbzNXTFliaHFwL3VzalgvbmFnOVVmQXJQOUhwZmRCNnMvQW5nSmdMZVR5MG5RSlZRS0NBSklZRVdZZjlUNStHeEpvTktZT3lCcyt5QTUrYzVRcGdwTU9zMzRFL1QxMVZlejd1cmQ5TEZGWnBmT0xWNzltWFJ1ZFZYTWovUnVsb1gxUmFoR3U4Zzk1SXRrZzE1eENtMVdVWlhMT0VPWEcvUmF6Vmg1bEhhMHU5b2NkbXFqTnJmYlk5UFNCUXZtaHkyWU1iSUVNS2YwclFKbU1ORFpJU3V6TnFwQVMwVmRhUW5aMVFZRDg3UjF1Ym9zNkhhQVRvZ0YvM0VMZnBqRG45RzN1NmlpWWg5QUcxVlJMOXMxQmp0YUkrWTJBMzRid0cvenRBSEhkTFJiUFRqcThYL0NnaDhua3dCL3B6NHQ4TGRSMWFrNUpNQmVhY1RkYnNEdUNpSDJvSU9udWxKZWQxdlFGYlI2YU9OakVMYURkRC9YSHp4a216N3BBUW1EQ2dTUmJLakwyWWdxMjlSbWZSSEhJeFJHZHllODJPRVcveHhhREN3S1VPMkNKWDhLdmhLV1pjRXVWUGZOL012bmR2NnkrdFNPNmo4SUEyUGxUODU5ZnNXd01Wck1mNGdNdzFnbjlVM1dXSUdRWkEwWnRYb3lkclFCRnpSTlV3MzJQUmJzS0o4bnNHTXMyQVNKZVA3bFFRYmFyWGF4cndQdHdpQ2VidEc5TVlBRGpTVVgwRkNhbDZoRTUrYWVTaTBlMXVPQWdTeXBzZ0dZcTRoYzVVSFRKTUVXSXFBam1DMG9vTURPMWpXVUZwYjBUa0tpRWVnbTdQWm5zbTRiS3BTZ1o2a296RXVtN1lKaXZ0Smd6QTBQOWtSY1lWdG5SeUU0dktGL2VIT2RiUmVmaUhaRlZiWHNjSTRXTWx1VHBxbG4wZW9uRnExNk9LMFc5ZDJDVms2cU9XQzlhSFVjWjdPcEo0bXFobmUvUE41cnNYNGk1S2pvcXd0bTIwVTFHL1lwelllb01nc3RiSnBpVzRGM05LSnFyZm1kMG1SUExCTHd1VHNhVmhMdmk5dUhuTDgwUTc1OFZQQlh3Sy9Jd2xhVUZSazRqQUdIV1ZhaldtYzFNcHJOcEZQaGtOZHQxMmlTSlRVdFlmQ1hnUDErQzNhU1BBcXc1L1NkYWFySUJudzJiMU5aaXg2MHVoNVNLVVpUdmFuZWZDNmJxZlZqRi8xdzI4akJiZHdLK1lMdUwvU2hqYXZGWUdsNnFLeTRxU1RMODNOUDJZSGYrbEJEa2RudFlKNVQ1VFlnbFNSTDU0aW04WG1LN3JiVmRSbVplOG9GYnhUd0RWQnZMcjJVVjlDT3JHc3QzM2ZONWt0TGVwQ1N3ZjU4TmhvTytEcGNkcHVta2dxdDJHdUd0Mlo0QTJyR0NYb0NLZ1BTdXRiNHdHL3NjZzJVcDBhem13TVpkNjh2MXBPTXAwUFRyenc0MU5vK0g5c21qVXJGZEdHRHoxdHdkUVFEdnNCSmJjdngxOHkwc05ocjgvbTROWi9oMm56S2lqV2ZNSGpsTWs0cWsvOHI4Mm4xODRUVlR6ZjVGZlFEVXJqR2t3cW9tVXlSVjFxelpCbzY2TXVuQnRJRE5mQTJBQSt3dWQrQjg2VE40TW1ieE40UmhSbWo4M2FUR1VHZzJwcDhFcG93T2lPUmpuWktJNGxJb2lmZUhRTzlOdHdScGk3YWxuUm9TYkYzaE9BYldIZWtFelNEVGZxRVFpa2dCd1E0YndmZG1DMExNMVRUcEdXYlVBazhia0s2Z2pEVlhuZkNrNERYT2hLNGE2Q09uQ28zK0R2OHNJUDRUWi9IeGFXbGVxL0h1OTVsK2ozb3dFbmFYM045ZlA3a0YrcDhId1lOZHZNMWJ6ZlcvRjFDN29NRWdjMEVGTkxMNjNoRWJNSWpRaW5zeWpCazJvYjdHOGo5YktFRzk4TVczQmc1Q0hCMzZGT2hvTHRUVm1mdDFKUlMxNFFPa0tuZjZ3cTNoNjBlSE5oREhlN3Z0L3BJOGo2QUI5dXBwdEo1aDQyOTJCanNvaGNYOU9MeXVyeW9ZVmo5T0p2NmVkenFKMXpyUjlXQUFUVlZ1NHlkb2ViMTYvZnpoTlZQbkd3Uy9kaXAxbVp6U2tBeGRUMTZPVVFQNFM2a1dFOTNWenFjOW5sY29mYVExWTlyM1g2NnllZWhIMTNmVERRK0xlcExtSlFtNEdKU1d2QlRpQXlJOVFwakFES1JheERKVmtla1RoZHdWUU4wQy9ZOUZ1d29ud2ZBRzJEanBnZEsySDhGc3ZCdnJCYTVmeU9BVmpnc1ViQlpPbUZuN1lBdFF6Sk1ER2puUjNqU0tSQUJYZEpDSnNVMTkwZ2hROUdMUXRIWTRnSzZMQVEwbTZnK2V2Rk9ldVBGK1puT1JKdkQyOVlkQmQzLzZxL1lNMVU3L2RrTHExTnpzblNFc1VoYzlOL0Z6a0QvY1hLdjN1R25paGFBL1oyaExtRnFTUG1XZzlOZ2NKb0dlQ2tLMzFnU0ttdytHYXNwNm16cTJWWnZhRUpuZ2c3am1SelhUZTJvbTlZNU5GTXRsS2M2SjZmVXBEc1pUczhtdGVuL0R6S1ErMU81ckhJYXN1b1JzUS80dk55M1dob3BGa0Jrb1E2c1VSUloxL0sxOXVhSEJ2TGwzakwzdVdic1dxNVExOGZqVmg5aHM0OWVnTWo3WVVLUTJFR1FVSzdHcjk5SFBwOGZ5QSs0dmFJUGg5WnI5Rkg5THZxRnJUN1NGQWhKYnZxVU1ZeTVwMkxBUnJsclFONE5ES1F0dzFSRU5PQ2l0TlVTMTVaMnVpVXFTenA2Y0RrZU5nc1BQdFluTER6RW5yMVYzMklnUWpRZ0pVVXhjMjFDZ2tKVTZpM1ZFNUtSTnZqMkF2ZC9CTWxHZlJ3UGJad3FJdzdnSnVJQS9kZGhPeTlUWktnMk8rTmNUZ2h5RXJUM3VzMS9MaTB1V0trTUJoaDhsYmluQlhnc1VVNHM3OStQdnVlOWUrK3EvaTY5dnZxN2pPeGZnWC83cTRRT1ZMOUozM1l6akkvN3R2bGN0aGx6ZVJ1TWI3dXV0OWdQaE9mN2d2QjgydzFyNVVYMmdaMEFkUytYb1M2eEo2OStFT0NqSDUxSjdESzZ1Uy96eFd3Y2pGQUs2cUpDWlNxRE5Fb0tHS3ZmZ1Rjcm5LY0ZqTmpxd3dBRFpGdG5oOTBtczFuUVRRRVFrMWJxSVFFVTZuSXFIdFhEb2FrSURXQjlHeUJzNHVNVnNNSWNWbGtmVVNuakIwaE11cXpLb0NDeHk0YVhsRU5UNEtmaVZKd09VR2M1UE0yQTl6MkFNc1Q1UThDTHI5NGs0Q2xVc3NsZ1ZBSkVnWmNxSUhuY2lGa280STU2b20wT3BWUHQ1UERzQWg2WmhiWmZyWVBYdlhvRjRQVUJxMHQ4bUd6TklPdUE0Q0FCcHorQkp0K29vM2xvOVRqQTRLZFJPRHhpRFU2dUc1eE5BY3JYU0lXNExLdytMKzBBL2pUZ2tIYnFoOWNXUDlYbVpMQ2x3QnJzZ2pYb2xhbXBTWjdFRmNGVlNUMG9QdVhVMjIwcXN6R0djaHEySDI5bnUxMXI2R3YxRjlCRG11K0hBdWNvbnhjWU4rQ01Pd0E3LzJJWVU1SmU3U0xmNWZ2ZUFiM0R0TXhadldVZU1JQ3NNY2k5OVlhNDRkRmEwbUZKQUxBQTJPRG1jVWVMYldUaHJqV2J4eHFEVy9EeFg4RElkdFR4WG1UMU40Uk42b0Y1Z1pIQUh1bW1iQmFHQzlZY1dOd1NON1FhdUFjVTlDNjBxaHkyR2hmeXVjSnpvU2M0N0haakhmOGJ3QjdYeXdCYnRta3dOcERKWUVGZXhoTXJ6Z1NOWjBhd2FvUHduOWViU1dtVy9nTXkrTjNzR1lEWklXUXcrUUUwUHZCcGh5WnoxNklRd2lIaFlWVDVDWkhRVVdBRGp5aEFWVDhNQUt5bTAvVXREQjVBL3gxMVVxZkhBNE13YlBiZGVFN0UrYmJUa0JVZmdUSDBnMzBMaWd2NmdlVEx0ZE1qNC9pQ1VyNGtZWnR4QXh1a0xIMTlLL3NHTWVHa3lCVjQ3Nkl3ZllNRS9mZ1NiUVlFbG5FY0hrZE0xVUphQnJZTk5EYlJ1M0JPZ0tEbjErQUJabTlIUzF5QWhsczVEVHNOR2o2SGEwaVFMdElFQmxlS3ZBeWRSMlRvTElTZFNmTHB0WDIxNktvMjdscGYzVFJhL2FZNC9WRmhEY2lHZ0t3SEJUQm9lNXZtc1hrRUxJM0Rnc1dBZTlOaGZoYUNFUWJRRi9yNHdjNm44NjBPOEZ6RTVmZnpBN3l5VnE3QU9xbjROZEM2Ymx4ZXZ1c0RINkIzL3RQV0MxdnByZFYvdkhqaDRqY3UxUFQySi9sY2V3eGI3VzFpdmRza2ZoNUhMSE8xd1lIdHh0TSt0d29icUFYai9SYU1KTGtJTU1iMFVodll2QndPbTlmcUROOEdTRTZuMHczYnZSZmgyUXg0TUZkUGN2cDVqTG42TVNBNyt5a0RKVEZud1Rvb2pkenVhK0IyeVp3cmV3dWNIN2Y2aUpBN0FPY3Qrc1lRNE53R2V5N3ZUSm9QVW5rVzRHbXF6SFUwN3JCdUFKektwTklDOTE2RXk4OGdPVDI5QmowL0FYQUxvR21MNFZQbGNxTm1jc3BZOXo1UXdESXExMGlJQmVmREZwd1llUXZBcWVpam82WCtvaXpQZ3BnQ1lESklwMVo2VGwvdjhHRHZXTjhZd3RTMFRBUE14eTJZWVE1elFoL3JBMEJVT0Zad25xaDh1YlgyMU5zNzJEdm9EaUJVbktvYXpDY3NtSEZ1NjRNV3BWSEZydG9rZEZTMXhuR3MzTmU3YVVOWkg5T0hCbnBIKzBZUnFrUGdDcEszUklqME0rRDdFQ21pWk1ZbHFNQjYxNERveHFHSFhXV0tRcFp0NHBBbTNBWDdUcktyR0M0R0E2Z0R1ZHFjZGhLaUlZY1dLQ1RNZzB5d1FBSUI5SktEU3Byd1p3d2QzM0p4dlhudUVpcjZsK2JZK2VyZDJSSGJVeC9UUm5MMDRhdHZHdGk3TVpuY3VIZGdjQkYvTHBhUFg1cWJ1M1M4dkpJNVhUazNjVGEzY2lHNzdXaXBCTHAvZGh2WUFFZE1HNkNaRjBKa1JlaExLa1ZTazdXRVBtVVJ1dGhiOUl2Wnl4WmF3VXFRZHd1WkRJd0FwSVlKWENkTXd5MDRpeXZTRnB4N0xEaFJ6Z1A4WEFrVVo3cXU0dHlFRVkrTU1NL2JJeVFIODNYZjNGTTUxRU5jc0NNV0N6M3hUcVlxY29RU1JacVA4RTlaMDZkTDRnWGNDRUJsb2J4SG1OR1R4ckZiUkkrTHpSRWZteWV1M0NnMWoxMWhUZmYxNXIzNVRveENDYVlxZU9RcUhKZVZrbWFkdGVZa1h5QkloU2RUR2MzbUtGclNXOWdUNXc4WFMzaG1QWGEycjdoeXVKLy9YamxiNkFrSGFEa3ltY0xUYS9xTmNLRDZWYkJhOExoZnVYSG8wazQ4dVk1SHl6Y00zYzkvN1luUll2OWlENzNUNDBOWDVzRGVudXFqWGo4LyttK3gzaUpjdG9MTk1nWjA3Z01adytiTFRlS0Y0bmxZcXdrQU1aT3JuMGQrUnM3NUlXREltUlZ4Qm1ZWHArVTFMNVZ4Ym02dm5adWJaMkJnS05CSXVDc2s0c1JvTzIxM0I1TEdHWmlBLzM0TGZwTHNBUGo3OUQxZFlHUmhIMnplV2U4TE0zcHgxSG94VHdkQ0lld24xQjNxamtVajRZYSsyb3krUU43ZngrVjl3SkQzWHdVSXIvaWtHSW9ROTVsMXg5Rm9ZQ2JOZG9hQjJXTFlTM3BvM1pIemVlTm4vOUo3QUorZ1Fkc2Q1RXU0bi9sQmp3MHdFUWZRU3B6RG9qZ2xXTlB0NmM4VTBzWmVJK0E5WWNGTGtnekEyNlpQRm9FUExKaFNiWTljQTlWZytFS2hNRndZZHZzUU5oZkFHS2ZnNUhFS2srUXpldENLVTlnTXl2b0lNTmd3OEpOaW5FNzBnaElEZkhZN2tFWFNidU03bVhLdVpUZkc0VVFmdmlESjJxV1g4SVplYUdpczNuZXQxcUNqT2RPWnREdVdLYVJzV3ZkTERKdFk1N1FpZTgxZ2l0ek1tVTF0YTA4c1huUE44SXJCUFJOSlZtbzh1RGloVmVwNDQzZXN1UXpYNWxKVzZ1WnluYzEwL2JsRTJOVi93TG0wWUtmSlIyR0dsM1ZuSGQvTlBSWGhKNXRyUVRZcVFWRkRDV285QWFBTVdRemFHRWZTZ1RHRk1yclNGSmpCOHhnTlluclR3T1pTRnd4M1J5Zk9tN2RVVG1GSWllSHNTTjMxNkwreStSKys0UTEzUFVwZis5Y1hMdnoxa2Vwek5BUGo0ckM1TEFrWi9MOVJuQWM0K0ptSXJVNDExTlpFc05qdGxObzc3R2luT0J2T2dRSG5WUWZIdVp2Y3F6dmNnSEFudDkwRXUrZkJWbFVWNlhZQ2hwYXEzSWR1SVVVK1o3ZlY0R3VtTmRHTFRabWtYbnJSdGtzNmVyKzZTYmNiK1plZnZYZWJZVFd0MlZORTJ5UTZtbmt3SEJjQk9Gc2EyV3lGSFJDNlF4Zkl4TE5jSm9ZTVh2Z1lQTmd2aEdGVWJTSlQ0OXgzR1hPdnJpRW1OL25hbk5ZeHJURDU2dVBVMm1EckhkV0hzVXZRQ1dYMDlqSkpNYXgrVlJqa1J0U3N2OTBQemR2U0NiZUl0eXI1UzBhMG1yOFdiblhYWnh1aTFTNi8rc1R4dXgrbWYvWERyYU9qT282VHh4N3hmYXpMa0xXWERiK1VKUXByRVVtbXJ1ejJwcngxdXJLQThXRUxSb3ljQmhnbGZhZ24zaFdxMTVYWHhEWUYvTEdJUHhsSUlyeWFuaXpnUFc3QkMzTjRaWDBrc0VaUFhvT2IzKytQK0NOZ3Z3TkVVMGNXOEo2dzRNWEpMcUhMMSt2SWEzQkxKZ0wrZkRaUlRCYWpZWDlQb0FjaE9wcHdyTkV0eE5jVTF3Y3QzYklWY2lGL3lDTkdteTIwZ3BQZzU1VWdBMnA2NVJyTWtQSEYrSHJyWU54andZaHllb0hOWSttVWEwQTBZOEpsME14cUY0OURTNU9EdXFPTkV1WUM5c1gxakM2amlBTE14N1ZCNGNOQ2VjWWxXNEp5R3gwQjBMTk5qYmpkQjUzNE0za1JxUXdLeTFyUFViWXBxTzJlbFlGaW5TY3AyL2ZndTh3SXQxYy80ZXNlcTdtVWtwdmowdTg5V2hmd1ZqYzNQN0hvMGNQcEFWYU1uYXJvTDFMQkl0STA1U1NzMS9EdS85SzgxM2d6UXM0S1dackVtQWV1VXlaYTZKUnJla0d6dFg0T2VYd2Q1NE9Jc1E3L0ErQU82ZjB1bThKajdVQTJBaUI2eVlpNVEwMTlXYTVGL25vdzREb3Y5Q2NCNndrTFZwdzhMWEEwWWRtbzZ0RHNra0pWV0pNTk1YeVJjRWQ3SWg3T1JESitiM3RYUnhjSDdEUjR0Um5IRUhsUytCa3NIQUZCUU5QRVVhT3FhaUhaM3Q3dWJzZmpEUUJvN0xjQzN1TVd2REQ1dXJDSE8yQ2tBcVlSU1diVEdKZEVEYmdDUkYrN3orM2pJTzA0ZUNPMjVrTWN4NWhCeDFzQUpraFVHL3I3dUVORklwSk1MbEhUWGN1V0xSY2FiSEVPYXFkMmo5ZnlKUWw0ajF2d3dtUmVuRTg2MFovSVliSjVqRmlTRWJBSkZZL0FWQUhWNGFEVTBlbm81STQrRHR2V0NQc0pDM1ljckRqT3B5YXVJQVBzaWsxQzk1Zmg5REQyd1dBQUVLV3hTQ0FSVExnN0hIN1FVRGhvaDNCYnRhQkRDRlkxbjZzNjJKSXNEaDRvcll1RDV2aTZITGpiYzVEb0NRTjRQQWFTdytzMjZIcEE4SlFHeTU2SmVNaWE4dHdZR1dsc1c1UnlIY0pCSFI2M2wrOThGdHozVzNDVFpBVGc3dEpuMEhkbHdwWnFPc3BhNkpxQTduUlNpcDRzSHJrZytyQTM5UEdFMVVjM2ViK1l3enJjTWVDRXUwcGFvZzVvVTArbk05QVdNRURiekRqQy90V2YwLzlOcjVJbzZTVy9ZM2pHM0pSSnNNOHpFRGMwbldLS0dnWjdXd0Vydk5VVEdaNHNpUmZqR0xzS2l4SXRVSzRxeG9WQkxtdU15NHlJbm1yUlFwYjlvaG1HNFBEVE96OGxJTUJnNzRVMTNLWXBKRXFqTmkxUUNDWk4zUjVWb3lUczMyUDRsOStkS3F0cVRnamxNdGY2djdOdyt2emgxTGJraG9uNHprSisvTnpJeVp0dVMrNjhmWHdndWJFck1wNFlHcmRkdDMzN1lrZG5aYmprOWUwTGR5MGZxbjZtRkkrK0s5bnI4Kzl6T1hOQWw1blZYN0ZSOWgzaUErcmZQL2ZVQUF6UDV3SlNkNFdZTE5ud0JHMit6Y25ZYktUaFkycCt2Q1JlQ2VKK3dyZVNJQTZVbktTbWJ5SlMvNFJib2ZpWThLZExlanRYTEJLQlJNYWJ4b1N2ak9HS0FEMng0c1pSZDdNTUVNQnZLb3BzTkswZkhDN3VqdHg2TWJ4M2NQREE1bFQxVjVuTmdjQ1d0SDdkd1YrV2owL2wwOG10N0t2ZTZyY1MyZnowc1J1ajBiOEt4NDVPVDEzUHQ3M0IxZWZwVCtrTFFIelFLWHd3R2o4ZWQ4bUFxMlJsWXNWYloyTEZhT3hhbVZpNFY5SlNlakl3bGJvd1VSYVIrdVVOSzVtWnNKN2VkT0RBa1doa0tqK1luemt4TnJZOG5TL21kOFc2ajIxSHBCamc5Q3NXTmVqL2dFRi9ON0I0Tk1JRVp0SzgxOE1vMHIvdVkyWitiTkxmZFA0RWhTOUVnUTNNb0gvdGllV3lyOUcvZzVDZTdxNGc5TzdMcDFRTXNpNDNqZzZtSVZQUGNmUVBETHFuSnc4T0YrYWlGNnNQSHB4TTR3eWs5T3UySjVIb1paeUdWSno2dkZlVHY1eTZQaHI1SDEyeG8wU005WG5XQ1dzd0RHTUZDUmVHR1JENUNxZzRxOVJBTkY3dnpvbEc0dDJSUkRTUjlPZVRHaWJOTktaYitORlJpZGhKd0NXSmJKWmVHVmplZ1AxbnRoNFpMUjJhVEZmZmFMdHVJalhwZi8zSURCaFJqaDE2Tm8zVFVJRnB5RTB0ajBjM0xuUUZhSFJxb2pJRC9JRlM1d0gyUEZpVlIzU0hEU1NPblFwVEVnOWFyRFNaN3QwcU5ZOWtncmlpL1doTGhQRkFEcVRVeXRxSFMyQjBnU0tZU1hWcVdneU5RYkc0L1lKeFRLT3crNmFsQTc3ZWRtKzRJNWQrM2VzdTNrU3ZMTzA5cE1vblpEbVZPWFNrZXBhKzI2Qmhqa1hwTDBnUDZjZElWQmNJcUh3T0JGUTNpSzRnNk84QjJPNFUySXhWNFNvTTFrU09pSjlCWVpRQUdVK0tmWmxVcE12bjZXaDMya2tQN1VISm85VE5mTm1NcURHc3RHYlpRejBXRzh4SGI3dm40dGo1WXI0d241bmNHdDc3L2hwTFNQa3B6aEM1VkVLLytzc1RGN3FDQndMK2liSHJFdGtxc3NZM3UySkhESjJXNEFIN2QwVDJEK1kvZUNnZUFUTDRiZFpVeCtLN1pTdFBGSU1LUUMwVDU1eENWcUNFZEF1SjZaNjVHTjA3TW4veTRxYVJaTVdIQXVIenhZR3pDOVZQMGI2eGJmRlk5VjJjbHVQdy9mUHMrOFFKMWp4WUJOYkM3OTZOUWl0bzJJSnRvR0dMQUdzUTBVN3FWSUZRWGxORWd4a1hoRjd2aS9YMlJXTjl2WkdMN0dnK0Z1MkRQL0xucWs2SzUzaHM5ZnVyT2FPZkNKNmNkTUlVZGNBUzVqbEdabzh3TjN6dHNsT29qeVFZQnZhVFVORG5hWXU0SXFKanJhbGpxUmJ1eE1PZlRDVHU3a3c2N2Q2MldPVGk3aG8yTDN4TmxvNHlGbzZ5RFZjL096Vm4wVHdBTkhlUXZKN0IvRGs4TGhNVVIrN2xXcHdnTnViUStVVENXOFZkS1duZVZNNC9jL0V2Ny8rbm43emxHMGpkcmMvK29QcVRmLzVuQVpOOEdtQkt4S04zNEVuNHJKQTFicW9GQzE0ZzFhY3ZzdTljVGJLdmlyWlNMOGlERERtcU95VmczclFkcEJzelBKa0J2cEpPSWo2QWpFMVRKTDdGNDFMREQ0UzhRQjZQMXg2S3NLb015YVFDS1c4NlpZUlZsZnljUFlKTlRCSm9ZcGk1Z1pFRmIvUzY4czdyTDFZRzRpTStTdUZuOTRpWFhsa3M5SmVMUThQbkZxdWZvWU9qazkweFc2ZE4vQnFMVm4rcnhyOHdGaS9acXpza0NzUG5NeXlHNHVVU2pYS1pvTWpNY0tjRStUaDRJQUlYZSthVEpkMWw4bmZLeUVrMVJyQWVnOU1yKzlhd3R5RnZjeHluT01tQ1RtS0lWZHppREZrR1c1emZCMUlnN28vbjB3ck1iOFVVckViYVgxRDRaL2dHTjVqYmZxdzhkdjFVRm45aU5QSUxtL2NzYnRxOFo4OHZVWnptcDVjcmxSUHdjMmI1eHV1bmQxeC8vWTZabzF5L0tMSlJrRmU0djIzWGRaeGwwQ0VVMlV1WklzM3pKRFdETUNDbytBN3M1KzZUTG1raDRJY3RnR3NIWW4vaTdwT2dRUXNUeFd6TzdhM1hFR1p1RGU4ZDVwSUpGWVc1eUYyV2V2QXQ5dVdkNmJ5NVFTWGoxZjlrdDlUckIwaXZJcGV0aU90V2ZZc0x6SHJZYjJYRnc5VWd3TStTcVlpMUttUXFSNVh5YlJSMVdoQ21QdXJUMWdwVG1NcHJDZENMRFdKVHNmWlJFSnNWR2toa1Y2MmRsUE1hdloxV2lSdDJnRFk3ckk5T0I3Qy81ZlQwY0hrcGlHcUVoa1I0SkFtWGFBYXpOY1NNdUlrNzZ6VmpScEM4QVhON1FrYno3UmhzRDdoY2ljNzhObGdMTjA5c3B1Z3pVNHU1NnFjTW55am9WWDhNZkxaZURtRDgxOG9CN0NvUHoyYjd4eFBwcFoyN2JqdzBlbktvbkp2TjVnYmorY056dStLVnVjTFdXemZNZ3lYY0hZeG9IYTdwOFpucll2SFpybUE4R2dwcG5lMHo0OGxOeGE2VXdETU9Oc0Q5N0xkZ2Z4L1JCMEdiZ2pVS2EyNWVWVUNSd2cyYkxsdlR5NTBPTVdVaGt3SlQySTAra1FvUFdxdndxRWN4alg3dUdIbm83Tm1Mano3YWszWEhBb0Z5WUc3UFF6UjQ1QTJoSjQ1VU0zRkZXOWEwSGFMdjdhcy9CK0JYWUMzdTA1MW96OUI1RVBBWTU4TUZCT0RCZXdZMlBDV1ovdGFnK1NuWDIycUhKalVCNGZhbVVFQjRoVk1HQXhsU1plR3VjVDhOa21IY2R4SEVSR24rSkwxU2ZSWWtRNXllcVRyM0Z3ZlA3S0d6Z0pNVGVvTVpiYzQ1RExiS09TenhWRUhwYjc5K3p5T1B2T29iQU8rdDlKYXFVNHdOQkJuN0NzQlptM01ZZkpHY3c3WmJYbmZUNGZNbnpoKzY0WFUzbndXZ3YwTlBWUitucDJIblBHbkVkT0FlNmtUcDVkQmtLdGRRckV2d2RoS015dUhjVzhsaDRpRnVUMXJiTTU5KzZNNDc3M3Y2enk3ZmQ5L3E4MDgrK1pOcTllTWZGL2phVi91WWk4OEZ3RzJYbVVSY1hGZ2JjZ2czWVNCNUY4TW9ZNTZxSGF5STBhdDFJY1lmOS8veGZhOTk5SjRmUmZkT3UySWRQcmZXblJzdjA1OVhINld2dVBxWm5ac2srU1JqVWRGZkRyNzlJZlMzVGw1aThLWGtKZVlvV3lYMGtlb0wxTEdmYnFXbjlsZi9PejBKTmpPM2E5bTN3R1orQU1DcHRBczYrN0ZoMytJVzVBWTF5Z0dmWjlLZ0pFWk0rN2JGa3pyN3RraHNtcVRacEV1V0ZRdnliSGV6c1dzM2pOMjVwMGJnbmFFWGU4Y3lmKzNVTUpMN2lXYlRMaE9iWkx0OExYUFphTCswcEhjeE90QmZMUFRta2oxaEhsVm1VMm1NeFJ3OFljV2l4ZmNzV3NRVVFyNGdodFM5RGkzR3lvTURzZ2JXVmZjNkpERWFHSlRKTzZnR0NHdTJsZlZjQUNaVjlPSzFtcTRabkI0ckZoZ3REUmZHaStQTjQzTTJqdTlaYTN4aEdOODNqTWlzSXRWc0xjZW93bnl2OTFTR3A4YklCcHgyQnRNSGsxaWJRWnR0N2F3N3pQR052UGdMMWlnZDVpampCUmdsbnVjTkRRNzBONCt6clhHY3oxbmpqUDhySVYvNU5YbTYzMFRTWlcrVE5NMEdPTFVhbnRNYzN2Q0x0cmRHNXpSSGx4bXY0Q3h1MlZUWk5yNXRaS2d3Vmh4ckhtTzdTSzZTeU1EcTg5SjFzR2NPa1FyczU4Q2xia0FTVkFobU9wNFV1aVhIVkdVZ3p3QVBHRisweFRQcVVQT1VPUGdrNHZzWk82Vk85RDRyS3k0YlExUlJxTVIzTzlEQmUxSnJNd2MzdEU0N1VtdTJtemdjdFZlVzlOVElNQ1hUMnpkdEtJOE9WMFlxYUQwbWVpSmRodWRxaUE2MXIrKzVDaG9LbTJtc2l4T0ZITmlvaHRVdWRxOXNOc2UzLzM5Y1BIT3V3YXUxOFVBb3ZsU3FOK2RuQjA1TWJEcWZMSnloT3czRC9tcTFNbERZR1ZYc1VuUnpFaDFmVTl2M2RIU01HWTZ2WERxZHMrejk2V3g2cERCWXBMK1Babi8xSjhtK1ZNSVZibTkzNVVnTGVScjZPMEorOFd2elh1TkN1YUUxN3pVSzFPRVhmV210UkIyQU5ocElVNURFcGtpOTRkb2lOY1lYNUVBQjVHcHJzVk9qeWRNV1RhSWdkNTc1TlduU1Y3ZFAySlp4Ykw1MUNhSVBYTHR4QzJuNklzTkNmM0FYdlFycmI1QnNJcXNDcFo2YTE5ZEdLMk1nM2ZwRGpHZ0pVQlR4MEVpRFFhWFhOcUZxWFlzUWpIWE9HR0V2SUczVHFLMWU3bXNhMkExMnNiNE1KVE9oNEl5bkRCSFYvSUtxK3NWYmZHZ05MM0VTaXZiOEdQdnN1cStKelpPU2pST2pJOFZDTmgyUEdjdDJrQTQ2cnVWd2JwWEIvUko4MEUzeDVjVVhjMGszQlo4M2VLZ3QvcE9LRnYvMUFQOTk4OWZrdjJGaUl3Njd6Ykhpb3ZZMnFrbDJiZDB0M2RvVHlpL3BuVjlqWDJpeHgwYzBRcnNGeXFseFdOMUZhbmUwSExNMlg2R295RnlybFd5MHFxT0JYYkxaYTZOd09MU1R3RGZSZGZkRkladktMK25GWmtKRTlCS1dnTE5yanBVMTcxK0RmTENhR2QwNkNUdFBhV2hnWFoyQisvYTUzSDVJNk1IYkNia1RzL2trRmdDelFWSzRsMStnbjhKOEJWbGhsNkN6d082YTU1K25McDh5czhoNzFpYmNOelpaMHIyTUpoTTljU081dVp0MTEzTHVCVDdmdHZCSkpnZzVvTy90NFpGc2RUako4eVl5ZUhUV2dFNTlxblk4em1nOEU4K2tVOGxFclR1ZXFvM25HZzUrcmxFaUQraWhQcW9xQlFtVWhoZ1lqd1N6S1ZCbW1jRnRTWkVVZFR2Q0Jqc05FN2ZSNzNvT0pBWVhMSEhWT0wyU0NaVXZYYU1WUDcycXo1b25KVnF5dmR5YytkcTVTYy9SMHRxTStjSEZqWW0xSnltWmZybmNsQzJ2OWs4dGpUU2VyVmh6OEt3MUIyRnpEakFDcldFTytMRWxnNG00QktONytYTmc5ZldjMFJlZVhiNEZZL0gxSFUwY2lCNHZUc00xakdmMDBnTzlnSWp1NittcjlXSGt6SSt2L29wZFlkOGhXWExaenZORTZJOEl0M0Q0RVpDWFVzVkRaVFVXUlNjcTlDWFArNmdDRXFINUNUT2VMSW1EalFUTzZyTEFxUEVVU1ROUGtVUVBjUXlTQUpQaC9Ick5jR0UxdDlEV0hEckJzcUc4VkVVQ0ZnNzFVMzgrelUvYXhWbllJUmdmbnRHK3l6b0xzK0VKckdZRDZtblNmRERBSkhFV1puMnNtaDhiWjJFSjBHVVZmbHg4SGd3U0UxRytHYW9tb3BsV2JlelUyamJOOHpFdjRTZTBnRkhVN1hWNzh5bUhGbDF6UmxhMkhFUFhQaXU3ZE9uaXhvM3JucGRkMnI3WGUyYjcxUy9YSDVtWi9uUjZSZFRjTTl4VEhMbTZtbnZDclU2dmlBTUh5czhiOEowT3JLc0VkTVBUYzZ6MVkzbVlSQlpaeXB2Q3NudGEvUmtDck5ld3c0Tm5Cd3N6bmNsdjFwMFl5SlpjWTUxY3pqNHM1T3drSWZkOE1zS1A4b1IwTFJCTnhWek1TOGJKM2dYZ3I4QnVXOHZqdllpZU55S3dxWWlOeHZhdG04Smt4S0xJTmozeGFES1dUUHJ6S1R0RysxZzRmYy9DS1JZalpFR2ZFMGdOOU9leVpzMERJNEdZbnplMjdpV2Rpa1VMdmFtaDlGQ3RHeEZVWlBYemJhdWZKUFN6WDE5TVUwMk5DSTlPMDhneEVSWEdibS9aVlFxNk1xdHYxRHB6Tm96cFdhdXZzTm1YcW9tK2VJVUZyTFZ3eVFvOVJJL0xmNzJ2NTZ5KzRqS1hrNUdHODFsZUJFSFZRS1BFYmh3dHV4a2FSUHFOalE1dUdOb2c2bjdVT25OQloydjZRam41R0x5N1M1OXA3QTNYSXRjbzF1TWM3S2k1QzBmRGVHbzhHb0pWY1g4RGp4WkpJKzB1aUZHdHg2UzlaZ0VGa1J4K1RTNE5jbHBuVThDcXpTeFV3KzFwQzdkb3JNWG9lYVErb3VSYkI2VnI5TUhqQTNQOExDcE9idEk5ZU9MU0RWcUhHeVJlSjVmOVJtd3NxUjI5OEFLcjFuN0VFMHg3eEhtQjFmbWFKa3Q2dTFIQklKTkptVVZFeldPcWhsb01UVWRXOHpzNkVpNlVNZUdHczZ1YnArZGsrWHJHSWxGNlU5MFo3ZUJxRjQ4WjZDZWo1RjY5SGZadUtVR3AzRThWS3MyYnhSazAyT3cwQ1phMHFobzdxb2w0VE9pU0FDckI1YjdaRkNzNktlUnNxemRRc1hNUERvd01ENHdPamhhQXN2NmtIYVMrWXBsQXBnN1Q2TkdvQlV5YXNRaHZONklpeTBlMzU1cmpFV2E3TnllSCtybVpkTnJ3WUh6VENKU2t2VFBIR3dNVXByc1N0bmlGMjBoc0M0OVZRTHI4ak1YWnY1QTBHY0tzMlFUUEJrOWp5REllWjlpNWZ4OVlTbHJCc3o2VGJiS1pZbDltS0R1RUJpQ0dzM2h6NkhRQi9TeFlDVnFKUU1iR05oWUl3ak9wN3Z6dmw3bGR2djVRT2JrcHZKemJ1M0V5dlcxNXc4aVNuc1dFcjRtakFkdElmbUJpeitMRWhyMTdtYkpoeUJXeTczWWxmWk1UWTVPL2QyckhLL1lXTWVWcitPQmtpcFlMRXhmeTFlQ2hMWnNQSGR5eTVSQmZFemtXNWZMN040VDg3aWZrZ242MkhYN3R6WVBoRWdmekpnUnNIT1N4RFJzbVNpT3lOc3ZkcXhUZHEwMnhEdmJtV0llaFFVWXI1Y0ZOUTV2NndmaU5odjNlem80MkIwMndoTlBVM2JEL1o2Myt3OUQvemZvTlF3QzlKUTdxUFBkOWdwMEZBb1E3WlpwUWNEU2pNQWdvREpZSHk2T2xrZUZtSk5xTStsbVN3RU1haHQvU1pKZ2MwUStCbGlPQjVhalprcFNCMkZkWm1PZXB3TlFTQ1lzdTJHekNjOGYxR3dZajU3cVdvYVFubEFWRlJvc3BIZ3NGdko0T2w1eFcwdTVPaHhZcTBGU2xKTDJjV0kvRmxiMkxyM3dwOFI1czVVc3ZmTzBseFh4WWRIL09vRHZ1QlkvRGc5UDZpWFZtSHFaY3M1MXNTZkdXa3k0Mm9sYVRMdVRrMU9vVjlqRDdCZGhOcjU5N0tnaVN4TkVPOXJJTDFhWDVpUG1IQkg4c2ljY0JFQlR5U2Vpa1cyU2lTOVEwaXZIWU5WejMxTWpYciswZ0lhTWczRXJ6STh6eDZTL2tjK2xrcGhjUDRLbDU5dGxvT29relVzekQ1SXNSNHdCRUZFZzdvMi8wUjNkdTIzemo0WTNIOHVYNGRMb3dtdXhkR0IwYTJUZ3lNell6ZDl0dnZPckdCMHViUy9SVmJwOGpITnc1Tm5za250d1pqdllsb3lsWDJEMmFIeGpOOWFYeTVVTjdxKzMwcDY5KzVQVGVrVTI5Q1VFZk41Ni9nVDdPbzFhY1ZKV1IvWXp6VXFBOURGOUdMbFJWUG13TXd6RHJMc0lyRVl4ZThKcVZiV3BucDgyQkRBdWJOMSs4Nzc3NmFKMEsxNFIvc3ptaWdhMStCV01zcE1lSlNzTGtOWG83YXJZT3dLb0xzTUs5b0plYjl2RGhaUnVtSkJNMDIzazZqb0dlV1JZeTB0VEthZ0R0bFJObXF5VzlDeXdCb29XMWNORHZjYmUzZ1ltckVoWExGb1ZBY0dxd2hJSVM2TXpONC9rZlM0Y1AzMzN4cnU5ZmpDNldkcCs0dUxHVUhQZEszb01IMy9DR0YvNmRmYW42WEdHd2NWaXdEallDc2FlNHZ2SVJvVk8vbTVBNW9haDBvUkFIMFg0Sm1DdkFxMG1ZK2o4ZTZZdVNKRlM2WFA5Z0NTblRXSlZrZFhYMXJ3QnlINWV4SHpGcWt0d056WnRxa2tCUEsvV2cxcWxKOG5XQU1Namw1VWVNbWlRSUMzWWhVWk1FeTVGSXFNOWM0aFVKbERxQXJjdVNJTXkveFhvYVhCWjh4S2hMY2dKZXFlaWp2Q2dKazA1aVNGYUFsNVV3Z1Yyck1nbW5xeEhmQlpyL0crQzM5U084WEM1bTFLYXlxYlNOdGFrb0lRQ24vd2ZlK3F3MUwxaVhaQzk4c2xmTVRKZ1lneFNJTlU1TjBLeGNRbG5UM0hoYWxRTGh0bjJPL2luN1B0ajJiK0MxU3g0aHY0SlhEdXZYSmFqR2VuaStnbE8yUzRnL0VyUjd0ODNCekJHZzlGZFB0VkZlZ2FvNzVuSGpnSHJ6bVZTczJGMFU5S2tmbnN2d21hMytHMEFMY2wzMEkwWU5FNXpIb3Q3THo2TkZpb2pjUEh2TmRWZEFGL0d2ZHBHLzR2RnRTWElyK3R5WUhPQTJTaHUwTXlxWjlLaDFzVzZLRWpRY2ZZYmZMNEVoS2pGZU4wVTYyNnFsalBZZkphYTNyWFZBbkxlVnY5cGRzb0x6bXZ6Uy9YWEJlbGVmYkhKQzg5QTlvTkdmQXk0YjYzZzlzbm92UExoQmIyK3NnU0o0b3Rzb3Q3Rml4akpGR3hnV3N3M3JhcVZnUTdXUk9WcVVTOEgxQnJ3aDF0dEg2OVlieUdUMDdqRWVUNEFsR0xCU0NyeUZ3b0k3RXB2TWZhTmlpaS9sVFd1aXB0dE05YnNZL3dkd0h6Vnk1OTRPN1EvcExpeVlnckdBV05waDFuQzBjM3RBWWN3b2tGTXIrK0dybGYwd0cxQlI4c09xbWVJWGFScFd6Q0VRZDAzTi91QzZOZnY5VFFHSDlNcXpScmdoVUpQTFR1bTNBUWVOeklnOUlNQ3ZKY0dNQVZFMXBqNEdxdTZCRlhHeHBMZkpzcXpKR2c5UjZTcDRTMXJLQzVMOTA0OTk0TFR6b3ZUYmwxRndYeDBYTXVVNmdQRjY3b043ckVQVWFua0FIbXpXSFRLdlRBeFRNU3ZjYXAzRXFNQVFzR2EvM1lnUlBtL005eWZkSG85azVEN0VxdDhsLzUzUHhXTjhEMGova3BDeHAyVnFUVUNueU9vMzBrd2phS081UkJHZzA4M2dURHp2cnNPem0veTM2bGZRSDRUMndDektMbngzeFpUelFuNTZaTEdrY1h1RWJ3VjQzMG5DZXREcGdPMEVZMjloWW94NHpoQ1A1NnhnT0toZmc5MVBvOGN2SGoxNjhUZ3RUZFA5M3VxUHR0K3l2Zm9FZFV6elhDd2UyNHR5OUUyV3oraWRTREdKZU91aUpIdUlxaEJGSlpZUDFqUlBOVE5rVXF5eXRKbGlKZG8xQmxGYWJmV0VVWk1iYmZiV2JVRDNjc01HRWd6NHFZL0N1a2g1YkxYOE1ZN3p0eTJjMGRjRE9nZFdCalR4bGd5OGt5YmVYSFZvd054bVlaTTFrVFliTmFKa3MySS9nMzQvcktDSUg5UHVneVplZFhsdHNHYkJ0amZ3d2pYN08vRGczRnBxeHRZUWtOY3BYQVoxSjRKTy9tNVJuL0QwZXJScFJScUxMczlhZE1FS2lwL1JBMG1nU3dEc0pSTUxlVDVCbFZtekpJRlpidFJtNDVaSnRKNUU5c2JKN1NXbW42N1d1QkZENndWZVRzK3F1c3pmYWQxeUNROHJhS0VYVHo3RG9iVTA1WEd5bkQvZkxQaHpKeUduYWtkRlJGYUlkVlJrUk5DcWRSRzB0YU1pd28rS1dqUUJhZ2I4ZUc0Z1VoV3hPRWlxVU5mMzk2eStZMWt1Mll1RlRGcVdaelhNeUNWWXZhWWxXRXlCN00wbEJwSURKbHhiSTl4bkxiaGhnRHV0YjB2eXpGeCszSUVqcTF0cUhMaFdCendCd0JPNVJBNTlyaVo0dTVXM0p1QS9aOEdQdHhHc1hPOVE3UkllY0dpMEViQ3REdkJBUCtJOU90SS9QakJlbjhDWnp6Z1JQTnJCejB2dm9WZEJkdldUQ2ZJKzRkYnZBR05malllQSticGdqOE5hS2ZpSnZlNFR3LytmQW1aamtzYk8yeDBNNDFtUXplSzduVFpZc1BKSnZQTW5Kb3ZnTTlGS3hNYUlSc1J1YjkwZWpJSEJnWHl1WEJxWUdKd285T1g2OC8zcFROS2ZUcmRoWktoaFJhOFg1WUl1bFl6aEUyb09wOTU4THRGelptUHA4R1M2K3BnWjJySThNYm1TVEp6ZmpDSFc3RDdETzFTZDM3eTQxd3EyTGc4TWxPdmpXY1lIQml2NW1lWHY4SWlXVDF2aDF5MTRPMVFsNUlJcFJ3MG1hSjZzUnVaT2FFYW1OSkhYNVc0L1o1WjBBbGk4bmhPTi92VzYvaE9EaEp3Vi9TZXhYM2taQS9uWFk1VUk2bzJZWDAyd2JrL0xKdEI1d0ovblhGcGJYczE4K3JUVmZ4VFd3WVEreHVzQVlQKytkY2JkZWtDbW4wYkUxVWRJaGd5aTd3RFp6dHZSeG1UU1greUpneXdJQXlSUno2ZnBVMG14K0xUTGNzRGl1a09Ga1JlY2l6R3VDdGVlOGRSR280V1pxKzNMd1RDeWc3bkJkQkpON2J3M3oyUGoxNnZzbzFWOEFYd0lqQ2NDK25Qd2NFaVBKNUVGOHpQZDhjV3Q4UlQvZlVkM3ZLZk4rYWVkV2YvbVBZOXUzdVBDWDVXRjVQVWw1THFBTnd1L2ptS1VmOENYcVlZSHZUOXd0bDMvZyt1bkkwUDRXMHU1RThrVGNyL2VQZ0E4bE9SV1REK1ZEVzA1YjlZSkEvT0ZXK0RSZGJrZzIxeGE3QnE4VUNtUERLR3NYOHNMR0RmLys1d1gzeWJrUEh6OFczcWJBNVFzdDFPdWk2Q1BOMHI5V2ppOWtXWWFxVzBPS0UrTlpvMEI5bVpUYTNNUUdiRXRtaXp4YWhOWWNwZDZxQ2ZyOVpnNXR5T0E1Vzl5SFVUZ20vd09JZmZxblQ2Z1pRMW55Y0E1WWVKc3hoSFVzTlpNVkRJbXdtYWJSbncwVXg4T2VMMlVlcnU4WFZ3QkVFalpSUTJpN3VwM01mZkF3aWtOWnVvYlc5RXcya3kyaHRvYnBzYlhnaUNOTlRwaVpuMldsMEU2WGhjRWN4TDRYUCttbUdzRjVFNVRoUmd1aEJybnNGWEdBaGJZV2xOdktINnRPakZXLzkrMitrLytiNzcvTmxVeU1qdlhyRGxiQzN4Tk1TTWo1OExCY3k0MmsxZlUxVFBhQ09yWEVLaVpnenpVU1lSOEpFQmk4UUl2QlBWVVVmaFhrYTJLUTNIR3EwRkJHNEtWWGRadHRLUTcwcGswbGlMQ0xNYVhrcjJocmx1SjZGb3BIZWNYMXNhQmpDMWZNOFZEUDZvMUJZU2NrRlBXSER4cnpVSFluSU9HQ2tTOG1oUVcyREdVb1pjNEI2TDJETTZCQlQ5OUkxbFRoU2hXWDRVby9sS3JFRjJMdTBRZXl3UHN0MGdjczVTNnFJMkVxZDNHNWgxMkpzMnFGSXdDWXFQa1BLYjdDaHNYRm83TlpqOEoyazNNdnRBZFRXRTJxaWpLRXk5VWVQUkN6VDNiSXIyRko3Zzg5bGhkaXN1TmN5ZDVqc3ZKdVgyMUxCZkc4ZnFzbEFaZWl1RE5TSDZxVUZGSjNXSEhnS0paYk1QZFlXd1pNMHlDVnVIMG1Db1NiYkMyYXF4QUsxcEtXaWZiaGk3Y2tUcjA1MDBwTjFLSC81dlZrZFo1TjNGWUo1anowMC9lcEljdzU2ZmdZWXJjUTIzMk9Kb3J3cGt0RmtvUldOOXVVMjhuZGh2OHZJL1lNRC9oM0RxSlFhaEJRbk5GdFY5NlNlMlg5UGErZkNidDluT25PS2Q4eXlHdXQyVHEwNHhHL1d1V1NOZndhSFBpMFZqamtqam41TFo0SEhnVzZBRTgrM2JEZm53UTZMU2lkM2lBTmw2ZUQ0VzNOQnFtVzZMbGFCb3J5WFViRmVUV0hialQ3Ukd6SzRxVVkwN2dtRlZ6NEZiZGg5bVN2SzZBbDljVllNTG5NY0xyTjFGam42OGRSZnQ1SG5zWHY1VUlRM2pZdzYwYThlaThwZ1RDREY0VkdMUUtDNnlUUDJnV0ZsaVRQL2dWNmUzZTZqZVR1Ym9Nd2wreU0xWUdJZENXNTNqeFBlY2RZcy9aUU1pN2RLZU5aM3U1YXRsZVBRME9ESzFGNmxjclI0ZldPaG1zd2RHeFRwc21SNGZibTdhWk1TMEM1KzlaT01kQ2hOeWhlK3B3NXNXaFRGcyt5bThqdzBvNXJkRFdlOVk4WHBPNkJob2FWa1RCYWxJbU1tWWNqOERsV1F1WE1PQnluOTRSQUhnMmZpaFhSOE1rK2xGRUZSc1JYOVFLbmV3NmpkWWd0ZGJwQW1nNUdtbjBuSVZYZkJYeFdqdXZDWDdkR1lnMERDc0lvUHRoTFVxWjFtM1dZQlJERzVuU2V2dll4S3V0RWE4YXY0WCtrNUQzdDhMTHJQY2orbHlmNFRLdEc2N2h1S1I1M1Jrb1JPdXpuSjhUTmVRSHZtdVlhUXYzVWgzdWlTUWg3Mm1CZXh4UkVhWmFhNG9hcW5pclptdFhDanpINnc4VTlieDlmYlFwalhJK3FLMFdoL0I5Q1hvL2JlRWNCZjY4clFYTzNkelJoaGo1V2hJYmxjNDFEZFl1bEhYSWg3bWtYU3hNcjVBYytiaVJLbzhYZVdHeENnZVBNWVdOTndkZHpVV3NCMUxqZ3lXelBCN2xWUWZBc2p4bDFJZXVxeFZtbmR2d05vYi9VS0RYV0ZNc1p0UVVhOVdTVTlTQm1leitUQVkzOThRNk9RWDFOMlppSGlzanpWa0VQSkgxb3NocWJUcXNNVkphYXptdU5SNmpQRzlBekZjUHpOZkRMZVlMSFpRMlRiV3RpTnZqcUthc3RGeTd2ZXUzK3pYV2IwM2VSU0tFL0tFZU5IMnBpS2NrOEd4eXBqYjZSOWRmRmIzck4xNnpOdFk0VTYrNVFocWNxZld5a3VjQzgzWDkyMGI5cVRmaW1kS256ZEpqQXJGSXc4N1dtQ29jcVQwMUh0VFhVTU5pS3ZWbDFHcDlQbWYwQ2ZKNVA4SHFYR2FYdklTYUpYR2JPcnRXSGJYR3NZQjhuU0xrZU5OSW9xYkkxRnBCcnowMkhqU1VXbHZTTzVxcnJkV041MW1yMy9CTkJPL3VxYSsyWm12YzJCcTdYVk53RFdEeW5HYytsbmNKM1NSTHlESGQyYUV3aWJRYnh3YmlDTFBlOWJFbUk1b1hGS3F2VDkvd2xGc3FtUlNXWlROdEpOSHZzMWEvWVptZzFZSVZJcTIrRFJ1czVwQmVBOWlvRnVsRDJMWW0yTTlac0RGUGRFcmZXamNtWGpYU2NrZXZBZHRjUWhEQkc3SyttVjZoLzBYSW1SYjBpcHRPVkxWMUZ4R1VzcGIvdEFYRjJrV0pSeS8yYlp6TDhueHgzdmU3eFZ3NU1CN05VYXVDdG83N3FUNmJmQjMzVTRzbTNJWFNYUEdOMDFmZzhXMExqK1FQQ0puWGR6VldmRnZyVXFycjQ4UzFpNzVaZlR4bjlkRjltR0NWNE5wWTZ4TW1XdUsvZnMyM2JqcEM3MmFmNC9rRTc1NTdLdmxmcmZtVzVPdmNURlZTc015YlFxeDB1M0hHSTRwTS9yV2F3UkFhVzdVdStHYXZpMkZveXIvenIwbTIrNE10aTlmTmRnMkhpb1d1OFV4aVlHOXU5M1ZId3VPSCtsS1JBYSt2MkpVcDBKSHRvMk5iN0k1VUp0UFpPZVgzelcyL21ncjQ3Z3AxZDdSdnNkdGlvaTVNRHgybW53RzZZRjJZS0w4amhFcjByRmxsQ1RCTlovTnAyUjR1ZUp1cXdXVE1zd3ZBcUtkbmJLNVFtS3YwOUZUdzUxZ1AxYWVHaHJadkd4N2VUbi9aTjF1Snh5dXpmWDJ6WS9INDJHeGZhV2FtQkY5QUhPejdkZXpQU1F6dlBtaXV3V1pjaXlUakJrMld6R2dkUXZjMjFHRlRnV0xYcU1QMjc1R2hRQ1crdDJqMlBiQS9OdTR2UllmMHJmVCtZR0JEUEkwZjRzTjBmRk13aEhoWmRkaU0yaS8zR0NkT2JyTUFET1VGWUNJTm4rRGRkSVluUDdTbU5JekVhdkxmZW1SNU4ydjVKWjIxK212ZWZFclR1dFltbDVUK3F3WFl0bFNkOWJrazNEZVB0ZVpBcmxCVnlKVjloSHpKR0tzSFJoYUxZaGFVT2RhNlQrckdtckZ5SEhEZmFSNjRUYkl5aG9UK3NVNWpXek1wK0FGNUxSRmsvWWFnZnZnYTA0ZTgrYlFoUzhUNHZtZU5MelpFeUg4VGFBZWF4bWRraFVRYUhraTFCMll1VVYzYXlEb2p4YVQ3dFczVzRxMkgwaW5VbXpDM3BBNTFoK0hyRjdnL2ErRWVCdHcvYkp3c1lkSkhBLzR5bml3MWZZclg2eHBZNStweVEzZ1ZqaWJjN1JidWhmVmIydGVPSUp5Q0VaaHBKSFZqY0RhTTRUbHJESEZRWkg3dlpmSlh0akhQcEJsMWg0VjYzN29OSFdzeDc4SE1GRXJyTTFQcThIYzE0RjliSHlFYklYL3hjdkUzTTB0YTQ5KzBRUHJXYmQxaWhlUWFzbEN1dVVSQ2ZLWjRnc2k2dlBhME5jNG84Tm83WCtZNFUzVTVLdXV2alZ6clZxMVd4L29ZVzNrZ1l5Q2ZjMlNVZk0wUXUyNndMd1lIZ0lGOUZQTmRxUVE3dml6eFlobldJd3BLYysySkQ4YUMxbStLbi94b21vVTJ4Z0RZRkdaVTlPS25rUW01bHZqSUk5ek90bjVCSkQ2dWFXRVRDVFBZenBvV0R5R2w0V0lmRENLWHlYb3hnUzNTU3VDM01KR3Z2UWMwbWNyVkw2Ni9KVFJaenJVZHd1UUx0SmNOdnVnQnZ2all5K1NMUHFJUnUwMnpyN1JSbXhOZzJOU1Y5ZGZ3d0RVYi81cnJ1Q1pMSXlPRS9GU2dGeG1DTlpTbU5udkRlSlQ1UVlxYlFhdW5rdkcwYm53aTdjUnVOMjRUWDNkOFlvMFBYUE1OeDlwMVhnUUwzRzVUN1N2V2k5ZWl5UkplYURkUkdSM3BMNkJ1MlNpVUpaSll6YkJ0cklkc0pEdklJWEpjUDlvTytsUUhWWmtmaGpyUnd5VHR1aEt6d3hpeDN1a2NCaFNxbEswWWFWSllXY0p1ayszblRUYU83elk5Q1FsbFlkL2kvT3pNbEw0bFhlbk4rdEtZR2V1dGk0U3hLc2pWd2hEVXVyUEJXa2w1L3IxZXN4VGxZSXlqUlhocGMzTFQzb0doL2QzdGxhek5wVGxDTG0vUzZmWW1OKzRkZENjNnZNRkk5QTkzN0huODhpdGV1M0dzSnpuV1g5NUtGN1lPRFczVmg0ZTJWcS9PYk50L0toejVVSnZmRVlyUWJibXBVaXdlR1JoazdJUXN1ZG9DNVZoK2FqZ3F5MXF3M2UyaE5tbmp5TnpTcHZGWTBlSHFpeVpISElHbHNmN05tL3NITm0rdXZpdWV5TVk3dmNCTWpHb1JyRlhONllxNlJxZlFOWHlFdkZLL280UGkzY1VxQ3dCMU55U0F1Z2RIT1hYdFNOMHpwNDlkTHp0bTI2aURnTEhsWEhsWjFENnlkSEo1NmR5UmMvdjM3cDdiTWIxMWtsTTk0eko5QmdLZlp5MTh3b0RQUGZwZFI2Q2YxamlwQWlkWEczTTRxZE5CTDYyTGpkTVoyTjBTcGFXbHBlV2w1ZVBIcmovYWlGUTdSMG9XT1BGOHBra3lSNDVpVGhjV3BmQlNtOXhGN2JiTmFhYllseXJNcVNvaVV0ekthd0poYXNNb2FqdFJWTHVDSGltblEzVml2cE9ackdmVW0waG9Dd2NQTEM3TTdwemFKcnAyZDdacDNUeS9pZjUvd290MFlXWHZZdlhULzVjNGtxMThxZXIrdjhXVXBJNFBualA0QU9OK0g4SzdKUFZicnNtWjY4MDlzS3JEZVhKOURqaXlkT0w0MHBraloxb3dKY2FLd01aOW5EMVBzdVIxUEtmaERmU2RoRmNzNjhCY0srellRVFhHYzYyd25vNzRZMGs4THZLamNCdFBkWEJTM0ZiRjc2SzhjcHREa25qd3FMaGMzTGdMczY5V290bHBwb3F0OTRhZXh6RnJNT1lYYXdvU05wekpoTHN5K1F6b3ZlSjZkMUhQMmUwU3ZqVWM1MkxkT0IvajQxelcyNkpkZUxtWG82NktkS3gxRlduTnhDclNxb3kwOFhSSmQzcU1qc1ZKS3NhaXhWYi9nNzJWZlpIclJWc3hYMmJMeGtJbW1laU91S0JyR1hOQU1icCtWOHU3MGlZcXBlRkNGcXM3WnJTc2lGVGtTNkNTcmVWVVlBd0hyQ0dlNFJvSVlIWmFaY3lJWVpTc3NsMmFxckszYmcrWEk0V2J0OXowOE9TY2tvamNzTGo3VEtsY1NpNzIrdUwyTSsyRmFMUlNQUjZJRHNaai9UMnAvc1dGcmRtcDJNaHlYaDdxblZ6MEZnS1ovQzFMazB1OVV0K08zdGxUUzFPRHUrUHh6TzVzNnJyaHptMjNGRUpGK3RXdTRXVFVXNGowRkFhckQ0eE9ocm9Hamcrd2FGbWM4WjlrZStodDdGdEFqZmpIMVROVHVnK3Y4NkhvN25wbFhaV0VqNnRreWh0TTVhN2NzL0lCOXEzTGw4Vzc3NE4zZjUrLzI4WGZiVGR5Qk9ncjNaME1LSU52MFpLV290SEhQbkFhWHVQM3hRTk5QOFdlQmJHVTQrOUVLVDlSNEVsbG1ETEJ1K1c1WXJJSlFlU0wwV01pT1l6Tll6NFk3MzhIMjBuL0JHQUZ5VGlIMWUvaXdOREIyRWJKTE1FVW95VWNCU093TE1VVndKVHRUV1ZTdklvcUgxUk9IR2lYYWs0Um1KMUhwenNtZWdPOTJVUkhwOWN4M1RHV0QvUm1FaDJlQU52WnNXbUxOK0NOWmpvMjRzK1lvTU1kN0FiNk8reHBvSU14SnFRaG9ZZFE3Y0Nya1NqZXZOMUFTK3BQbE9udlZQK2FQVDA3SzJBY0JycDhuSDJQdU1nZ2g1RjJPa0FwSnJOTStITll2VC9IcGhJWGRVbGFRTUNxeGN0V2dNdVUzR2piZE1mUmJkdVBkTTYwbGRoanhZSm5jc2VPU1UraHlQdTVqaDBoejdMbmlOUEVsV2NyTFBHc1N1eUxBSHlSSVdUQ3I4OFNla2MwazRsR01obDJKQk9OcHRQUmFBYnRpN3ZZRWZvNURqTklTaHhxWHVJVVdNSXJZYkNpUHBZMUpYdXhMTGZYM1JaMEJXdlZ3SnQ3S05YOS9wbElOaHNKWjdNZng1OE52ZFo2eC83ZnlMYlRlNlVpNzMrQzl6OWdabkJqYWg1aFN3cFA1SlpSUHF5TEJhM3JPVmNYYTB5VjRabnBrZUdabWVGb0podUJ2dG4ycWVIaDdkdUhoNmRLMldna0M3aGtCUjZIUUpLNStYclFTSWJqRVJiVGQ0aFAzeklTaGU3Qm04MHM5b1BWa1lHdjUyNTl4ekc2NitMamg5bTNIbnJvSWJGT0ZtR2RmTHQrblpoWlJjWWFhMTRuWG94YlRlVStkdmpRNGJzdTNzMitiU3dUYVA2YjlEdXdQWHdEOE9vWGt0UkpqRHU3QW5nR2lac2Q0R2g0aUFIRHBhZkYra1hzM24xVGRqZjd4bjl5T0tucWQ4bm5WajhvNE1RNEhNT3JITGttbkNEQU9RcDcvK0V2Q1h6ZXYrcWdiK1hYYlYvZ1kzT0FwY2xVSHFVZ29vbmlCQk5tNU52UnBVbnhHblNMUjAvaCsvdTRaMTdDZ2p5WDFtdXk5R20zTzUxSll0bGNKSTZ5Tmk0SWczenBXNXR1VEJ2dkdDaS9wZjZ1dEMxUzBjQzVpeDdEdXNHa3dISHVjZkQ1OE5wNWxYWmNvc1Jhb2NBaXhweTBPckdsMnh0TXpnMWI2ODNLdmwxNVFhUFIxWitSUHlXdkZ6bEVyT0ZhamRyeXJJelVWTEJYWXpJZWZMMiswQjN2NjR0M0c3R09IYXRIeU9lQUpoSUo2ZjdtQ1JMVFV5bEpxWDIzbjlwL3F2cHo4MDVaNkpzUjBJTnlYQS9DNzY4U2QzTkw3Q1N1cGNhYlB0cGRqUG84cmxCN3FDRUhsTmlnN3kvRCtzc0JCRHQ5RlY2MzhBdUN1V3NpV2ZFMEZ6b0lLRTRYR01YekRmRytZcndQZUxEZkJ4cHdQRGlVS3dJZitrUDRlMGp2dDhrYVV4V2UxNG1YR3dBcTRTNUVSaWdhOVNqWlJlSTZJMlVZMjUvQXVwSklCMlpyeXRSY0NidXR3Y1hZZ2lJVDRyVExIVW9IRjlzcWlPMktWSkswT2hHeDZMclZWWWoyOWtiaDYyK1lkUFhxZDN0anNWNzg0djJNcmY0VDBQQkx2Sjg1OHhKYXM0ZW9PSTdoK2FGb3RmcGtMaTdKNlZvTGllZTdya1VETDMycm4vWW42OUNnUDdoNmxVbU5lRVJXZjBiL25uMGVWSlpldkRmRTYyRjh1OFZUQzRMMU1hbVJhNGtacTl4MUU1TVg0dDJaVkhkdnZEZlQ2OE9MWlVEcFZZT3BMT2cycHZhaTVjd3dNRldxdzRYZUZPc0pzV055WW1BZ0dkczIzRDhYUEpSOHpmekE0b2JFeUorWktDNzdnNlhjNUVJeUZTNTI1VVlIZXd2YjVxSkQyN1BsM2RVckRYZ1hWMzlCL3hOME04VDcyS2Z3dmhaK0szZmN2S1hOREhyblo0SXdpbFBFQ1AvdlJqc0l0cHRMOWExcURaYjA5cWJoZVdGWXVWSUF0TFhHeFlwdXBiSDZyZW05djhib3FOTWFIU1Y1K24zeWQreEg5ZkxZa0tNQnd1VW8xeDZJcFR4WThqamxMYjBMRmlyOVByWHhHSGVBODgvc1I3QWk4aVRGSG4zcDB0M05qSHdNaHJqUTkzQmNORElxM25kWnU1WEF4eXMyODBOOE0xL21Tc0tlcFUrWjJ4Z2laU0oycjRGYzllZlVKdkNqSHdEWU9jRHZIOW1qRnA1bVB4WkFnYW0zeFdiSiszSEw0bHpaa0dVb1J3RDNWdkxNR0pob0MxcnNLZDczWjdsVmorL0UxdHVSZVJkSWJBL1E5TTg0UGNZRWxtM0VETTNreFBDczFlMldkRWQ5UVRGdlNucG95LzVqN0VkSUJVNWpnRWtmTkdnOEk2QjJpUDRWU1pZTXdFSCtPNElXSDFxVTFqMWd6UkRNc1FWUlZ5Y0dwSVRSRXkxdE9XQjBaM1FKNzRGcVJPK2xWNGhDZXZRWXBzSlN2SjZrb1FTYVFoUVBZa3cxME93cjlPNi8rKzRkMy9zZXZmTHpxNy82cFlBeEFOOHUxOEhBSmNnWEhBSVNsNXVZTUhqMWVHMllneEFBeE4xMzdOWHdmcGFPYzdrOVRxcWlsb0RUQmlvaFlpU0dpZ0E1VW1DcVVxMU5hM1BnT2JMcUZVbnlEUEZnRDNBOG5QZzJyMll2cmx2aGFkTWNCcUFEUmpaUm5hclRidU5vSVprU0hDM3huUTV3N0twdnM1QVVpTkxWYjZ3TzBhK3haMFNkT0g0SktRNndpOWJYaWROb2lZN1FOOTlTdmUwdnBVZGZlQVduVDNaMWlQWHg5N3k0YVBFK05VSzZ5SUpZclVxS2xsamZIZFZiNzRBM2VQdGJWZ2ZJdDE2a242Qzc1TDdsM0RlbE43NXd1N0J4eVBkcG5QNFpqRHorSXJwNnBVNVVmYUtvNjhYK3ljbnZUdzRNNnZyZ3dDU2ZqODNrcjhtWDZYbStvOXZKZDNCVzE1b1hqSW9kVXhMMU1TZkl2OUczMDdscjZRL2VoRDh4UWErdi9pNmRXK1k0NHpzL2ZTbnYvRkYxdXU0ZDl1QkxlSWZOWHYxVTNUdlNiUy9oSGFueXdwZjVPMGdEV0cxZnBoOEUvcG9HbTc4bEJTUm0xNWhMY2tsbWZkUUoyZzgwZUJUZW1ZRjNyaTEzc08xUGVkc2RMNlV0akJuYjdud3BiV0dzMkhiWHRkdkNIOU9yU1hvSDdKMHVvbjdDS2RHUlFtV1U3Mm5vdGRPeTJlblgzTG5weElVTEp6YmQrWm9yNy94L2QrN2MvUFZMOTM5dDg2NmRQOFozQy9EdVV2MjdHUi9mN3RHTmgrYmxVdTNsbnphK2pEV0JldWsrNEcrTjg2cVJ3aStTQkplTmxXRnNHa3JDamZjWmwraSs2bzlwKzVOUC9vMzB0aU5YRTloL0NXQnN0V0FZYi9LSzFSd2FMQlpyNHdFWWVEZE1pYlpYZi96a2sreVpGMjQrd3Y0ZVlTUlhVL1IyOWdXUUc1UDZwZ1RQbnBPVUltV1NCZ1lnRnNOVTV0RnNJRmpCVWxGcW1vUVpscG5KSlRLWkZGNWNrdEhVUU5EUzNrRUJBc09oREJwQ0xwZXRSVTZBZGhRTWNBK1BOK2VPRnpxam5lNWdJWEIwTVo3MFpvZm01b2F5M21Tbm10aytFSURGRFE4TGNYZk9XOXF3b1hUZ2xvRk5WRkgzMjJ4M0hqNHhPbjFvZXZSRWNhNFN0OW4yS3lyZFBIRHp4QkZYK3hGaEM2VG9RK1o0TUxKUkEzbGVCS3NuU1JVcHdTTnRjRFFLazg2Ym8rRG5KT1pSWEcwOG9PdGtjMWFRREdnOGdWTEpqNW1Od1lCdzdhS0JOSWJEUTkvVTIxN1djT2piWCtwNE50QnArbDZZWXpmYUFqeXVDV3ZhWUhFQWwxQk9qZXNweVVMSWc0dVk1b0twaXBhcjVDckJYRW1yQkxVZ2ZlVjV0b3Vlejk5MmEvNGMzY1hPOWQ1NkczM04xTDMzVHVuVDA1TlRyNzU3KytUMHROakRodURiVzZFdko5NDNiSlMwTUxVYm8zaWZZbHlFd2k4ZEY4WDRNTHVreEt1U1B2M1FRMGNmZkpCK2VQR3puMTJzWHRjSTB5dnVWNll3SlhaMHZjdXlqK2ZCaXZvdmVPQmt0L3Z0eG9WcmJ2T2ZVNHNYU2xibVVNbktISUtlZUY4UFB2alp2ZS9FN3Q2NTk3TkNSOXV3K2pXbXd2eVhZRGNZMUlzOU1QUERpU0RzZ3BMS3cxejV0a0RPbWdVR3dYWUFCVGVhU1hMdnBHWDRWdXBUemlycko1NEZBam51dHF3NTd2RWgvZnFadllQSEM0WDh6bmltRUUyZVhaZ3NGYjNlTTN2N2w0dkYvSTU0dHRDZGdNOUcrcjNlMTRLcWt1cExaVy9EbjczSjNQSzJ2Wkd1blYwaG1vb0Y0MjJweVBieGdlMmRuc0hvOW4zUnJwMmhVTEk3Mk9NVW43bzlnN2VEWGFMa1krR01LOHQvNnc2blhYeDNCQ3VjSFFTYXR4TVBpZUE2d0Z3QVZVTGZPMW5CODJKRDJKaDFDM3plamc3UUR2emVpQy9TNGVud3VEdmgxWGEzTzUxb0E5bVJjQXVMcFpUQTZ3UGQzbkxLbjRMNUVQNmVpZDR6bCs0N1MzY2NPMzM2OUJ2Nis4ZW5wNm5qcnVPbjc3NDZSUjNWNSttNVgvemlGOU9WaVNuRFRxZkg2WThCTDh0UG8xQ2hKbEVpcnZJMS9UUnV5MCtEK3JJa2pUNTEvS2xqRHp3QXJ4K3ZQa0hWcXFGejlkTTR5OU92d3hqSE9MeUNUUU9HQ3ZnWjNsSnRTSzJWdFE2SGpPWFJwTUdHRkhweExZU3g0R25iM2tERUVVM0llK3d6WTc2QjBHSW83SXowS1B5dkl2MUVyOVBlMjJmZmZhRE4xY2QvVzlpUHRLZXJxNnZINlRkWG4zb1ovazBGL1p2ZnJQWXY3dHVIT2d6WTY1L2crbS9aMEtrWnJUZFIzSFY3R1JOcWY2TktEYWIzZGUwM2RkQWZVcVg2SytHakFKajBETURNMG1OY3R6eEc4SUtpS1VPN3JsT2hSUmYrQnJWZnFOcllqV2U5dWt5VjFkdllYN0x0WkR2WlR4TnpUM2t4RGdxalBCZW81TmdLcG5PV0ttQmJxQmorYUVSSndWUFc0cW41d043MFlHbEpRQzNDVmlkVFRWN0JrVHNrNmxpeFU4bm1aRVNSeUExRVVWVmx5VWoxVTlTOVJsOGxnaWNqekhISmZKZThoRmYxOFZadjJlRXRZcGVJZlltcyt5cVdrYWRrMytMT21jbk41VktoTjUwTWh6eWRyamE3UnJiVDdXMVl1RHhabnp5dkNpY2J1dExibWQvWDRGMHZONFJGb25ReGdqU3ovT3dFSXpTT2IxZ005MjlPaFFjOThteE9EVVVITnVkM25CemZ0TEs3V054OTAyUmhNZVV2SEJtYWUrMngwZEhyWHpzN2RlZkI0ZkNnbmswTXV3S2pSd2N5N2xRSFNHQlBXNjRyTno2OHREV3piVGpxN1F4OE1kNXovWFRsK0hSdStNQXJ0bTI5WlUrL3oxc0tCTXJISHBoYmZQM3A4Y0Y5dDIwZDJyY3hFZkQ2QSs4cmxEdmFiVDdIS2E5UFJ6NnJyUDRVK09DTHdHSElyZy9Sa01FTGJVREtQVERiMjJCU2N6Q3ArUVplZ0tlc3hWUHpnYjNwZ2NrTGhmcjVrMlh6V2dDSHc3eXNzUzdwMCtocXNQVXJQRU1VM3lQTnIrbWphNmI3SmJ3bWJoTFl2M2ZYRG4zTDJLaTQvOVRyYnNkaVcxTnNpcGZobEVCM3U4TCtBWFJITDhtUmFiS2J5NHB0UTZCL2JSNW1xcktGYXFxRW16dVlmb3pmdTZISy9IeGFrekQrRDlhcnRHVFVuNUZBcEtVemVmaVh0bW5kUW1xdUNhZXRaNjh0OEhkVEtHc2R6NVhLMTkrM2MrZDkxNWZObit4Vi9Rc3JtemF1N083djM3MnljZFBLUW45MUxEcTRMWk9mRFE5NSs3c0tHemNXUXdYZllHUkhQck50TUVxUHoxMCtPVDUrOHFINStZZnc1K1U1L2JiOVEwUDdiOU9ObjF0ejB5T3hSR3dzRU5nMlBMek5IeGlMOWNSR3VQNGhreklkcFgvRXZzSGpoZnZKR1BrWVV1V1RNTzEyYWppN3kyMllqOEJzeXUxNGFBR2JPdERHUlcxMkdhTmVNRTlXUGU4VXB4aE9mb3JoNEtjWUVYMU12S2ZpWFF3djQ4VWxQVGM0ME5QajkxRXlNalF3TmpqVzA5L1RYeXowOWFZUzRqSkxwNTE0cWJmZE9wdHBYTFAxSnlPNXNuSE9HVXpsVXY0S3FESDg0Yzk3ZDVTN3U4czdlczJmMnc0ZDJyYnQ0RUc2RU8xeHQvY1ZNNUh1N3Bpcm81Mk9pdkJuTXd5NjB0TjdiTWVPWThkMnpCemY4VXhQcERPbTdaNmFldmQ0aDh2VklmU2dQdm9rTzg5MU9TOHA2VU9nTXpLWktYUWVhMzhvN0dIMGNpZ0tPWVEvQ2M5bkl3cjM3ZmpjR1AvY1hhQjR3WjBiVmNrZzJPYWdjcVhLS1RxOVkyNTJwc0tPSHFOajFYLzZ6Nk1ianJKbjN2ZSs2Zy8vNG8vLzZPczBXUHJlOTRDMmZjRFhId08rSHNZN0NiSVpwdGxkYmJDMU15eXE2c1FBVnZXOGd2VTgwY3R5bnRqdC9FUzhkcDFIVEZvWUhPZ3Y5dVdUN29EYmswbTZ2VzJnQW5wOVBqd1hhZGlzUVNITWpwWkhSeXZ3eTFpZGRxWkJROVgzZmZwYzhETytHM2FWam5UdjZyOTM3bzdmN1ZvK1NPbkI1ZkNUZDh6ZDJ6OFhQMXphZFlPL0d2d3hwY2Z0YnR2a3d0SGh3c2JKclc5NTFhVE5iYmQ3YlBxZGI5RW5OL1VQSGQydDJ6eDhkMDJ1ZnBKMXNKK1JGQ21BYnZrT2Z0a0JDMUNGRHZSbkl1R2czYWJJRHBBUXdLZCtYbk1GYS9ZeCtUUVBxZUxLbGtUTllDMHM4UnFGUHhWWklmS2xOUzN4ZUQ1Wjl4aWVIaUlZNDA4VnZMK0VGN0poOHA0bGZxdDJMZ3NZcGVMdW1CdHZyUTZXalRMTFpVTnpCWlU1d0FtVDh4c2FxMThLbG9XV212Tnp2Ylc2OGZiQlV2NWdZWEoyOXVLcGliRnpoYUgwZkc1eXoreWRweGY4SXh2emIvT1hOdVhtVHNqWjVIWFJwUEpuYnQrQnlmMW5sSVZGSmRlelA5eWpmc1lkV0p6Y2Y0TjJndjY3K3BRMG1Jbm5IbE0vSlk5azRoa2VTL2xHK2xOMmdYUmovUnE5bUVyR3dsMEJySEhxcEcyRzR0ZW95c0N2M2FRN2lucU1VaGJscit1RzREYkNBL3dTWU85V1Zkbyt1RzlUTXJseDM5QjQ2VWhpSmxDT2RaZTlVL0dsa1E5c0hoN2FjdnVOU25IcVNHbmt5UGFpY3ZOTmNpRzlxeXNtVi85TWlnYW4wdjNLRGZUbWlldGN0T0k2aUpjYnJmNHZkaHUzR1FITFVKQ0JUSjB2OUdWbFNTRzdnRk1WYWgwM0NJdkI3YzFrM0JGK1dXZVdxNHZvRlVlR3JMZDAwVkNFZFlQV2JqREFFYzk5ZDNCTDRMcndUTC9MTG50TzdkZGMzb25yTngyN3UrdDA1OVRvek9aTzV4OSsyS20xZVQ0d3VObC9JSHZiUXJpdHV6ZzJQS280TTZIVEM3bHR0eXdVcno4VW45aHc0c0NXaGNuTUpuL2VHYzZYcGdaOHFGR3FzT0EvQkdzOWlCV0hiTHcycW9LSGhGaDU3d0xZOFE0UWRNUjJYdWFGTmdtM3M0TEFERzZQRy85M2Q2S1ZWZUVtbHJoK0V0RFcvTWFhditPREg3enZYeC81eXRjZS9OZjdmcDkrNkVOM2ZmQ2IyN2JTODlVL3BYcjFuVnVadnZVdGJ4SHlCcDJQN3djY0lpQzdkK2t6N1haRzJ4eU1PTUhXd3hBVDMrNE9mZ0hjc3Fid2NxS2RMdVowK3AxZzc4VzdZMUdzTFNReVlYMDEyOCtOdGgrdWJ2NVYwdmdYWUlaZnFVcEs4OEtEVFRPSDdpamU5dWpNNlpuM3pwekMzMjk5Qkg3QzcrOHR2dmVyK3kvdC95cjhFejlvOXlXT1oybjFlWFlyMzNmanhpbWQ0UU93anIweFlnVWxmcjJFVnh2dTJWMHIzZWxlL1lhNTNyNjVHeWJ4WisvY0RmcmVFeWYyd3BlamZQemh4VDBQSHkvRHp6Mkw4UFBrRzE5OTE1dmUvS3E3MzJUNG5kdTVQWlRRdXhWWmtrekhzNi9tZUVaemlEdWVzZlpodVVMYmI3NzNkOWt6VjZmWTdOakpIWGpPRElOeXNjK1RFSjd4dFRueHlOdTY5Tk53YmpSZStoa2lvVUFtWjF6NjJYaElKZUp3TXY0U1hqK3pxekswZjJUTHhEM2J6dDFmSFA4dTNidUhGdk1iRThXTitZRzVjdm5HQXlNSE4vNHpPeTdzc0FUUXRCZG9Xa1QraTNjelNlNERKclRic0tMd3ZISG9mTjRzMVJDdHIwcWRTU2ZTbVRUM0h2bHFUaFhqMUxsY0dsbDdoZ1ltTit2TlRaK1kyUDI2d2RtK0F4dTJYemN6ZG1oaFpQUDh4T2lld3V6d2d6dEhEMCttNXpmdE9QVG54Zm14ZUdWa3VwRGFXaHJZZUhSaWFGRFBERXlYTjNTUDd1eWJPTlRaZnNnNDA0RnZ1RTg2aUF0djYzWEIzbVRIaFlOM3BrdDhsN29nK0pjWU5VUGJuRmcxVkxnL3dqQXRZcDJBQ1NjbDNNeDE1TWpOMWQrZ0t6K0ZFVDlUM1hQOEl4OVpvcCtxN3FHYmlQQzFYV0VKNktzSHE1WW9WR0U5UHRCRkZEYnY1VkdKWnNsV3c5enpXV1hHWVZOTVo3SXBjVCt3RjkyMDJwaFpsYnVSWmtDcWJaMzBROVZQMkZNN2N4ZnV6MDJmMmpqem10SzIvc09sYmZzUGJrdHR6OUI5OUlialgvVzQ3MXd1SDlxU0docWN5NmZtTjAvTWVyeElpNUhWbjdGWmtJTTlNSk03OVdrWFpiUWRCcEwyTVFYdnBaWTBLaXNZTGxtTDhjS1M2S3BZTXNrRVR6b3JKb3VoZ0tjVGxrMFA3YkUxWFU5dDdOQzF1aGdTajVVVXlOTUQrbzI3K3dhdit6K3RYWDFzVzlVVmYvZjYrZm05eEluejdQamoyYzkySE1leEhkdHhHOGVmK1hMelZaS21TVlB5UWRJMlRkcnkwYTRNMm02RFNSUHJZSlJ0SUZFRUc2T2d0YXFnMWY2Q0Fwc21qVW1qWTB5VEVOSUFDVFMwVFdLVEpvUzBzcitRZ0xvNzU3N25qeVJ1eTdSRnN1UEU3OTUzN3Jubm5IZnV2Yjl6enJjbmVtNFA5dnRHT3RlK1RrSzNaMU1MZzhIUXRqMkZucVcycG4zREE3dG5wWjdsQjNiTVAzWWcyNmJPT3V4UFByUTEzWmFmU2ZiTURRVEpIZkhJN01HcGZGN0hDYlhCb0tKTXYwTEZkaU5adDErMnZ2YXd0dU9RSWdFc2dudVVqSlh1b1ZMcGQzVFAydTZyUDlId2IybVl1d0dRY1Q5WXVpeG05M0dKNEVlUktkeGUxRFB0bGkySlNNcGx1NEV0aVhpZ2pTQWFQNXZJaGtOdHNVQk10bkIrNHBjcXJNbFVzcW1WQlp4eHBzYTYyR290VFQ2L090WTVQNXpmM2pHMDJOTUR3cjQ5Tnp3ZkhsM05aM2JzeUdSM1RHV0tDd3ZGYlFzTGpiN01WTHgvUmJiTnBhUGpLYTgzTlI1Tno5bmtsWDdRQ3g4NU45amRQVFRVM1QxWSt2VjRLalU2eXFMVE9GYXY4RE02VnBVQm1IdmVpSEdvVFlnVnd5Qkp6a0I1dytIS3pLdVZSRVlzVDJSOUdTQTFpMWhOV0xQVkZhNk5ZZnYwMFFXL21nelFONjhyQktVelZTR0FOYWxLbHNna3ZReHIwZ2RnNmxkcWJYNnV4dWJudWMzSURLbGNZODBCN2M3UjE2Q1A3N0krd0Zwam10cXl0ZTVGYTUzbXBnbW1SREpaRFZJNUw3aVZyQkNGdms0d01BM2JnUitPVWZabXpLQ2x4YlRxUmpwWE5kSnB3elE3NTFJY29ZaFIwdUlNN0RDR0NCdkQ5MWcvUThWK0g2aWlseGo0TU15S0NGT0RjYXpHcVFyQVI3ZTF1WXF0emV1Mk5paElHbVpXQWRvbTJKZ2VaSDJDNTlNTXoydWViREI4dlVoYW1nSlJXbzVsc0h0V2s2VGxVWEdSMjBpSTlmRVE2d09zdndCV3pXL0RZQVlyaTliWWFOUjZLMFl0ajBhdEl5aGJHVVdNWHg3b0w4UDQ5WDNXMzQ3aUxRMWdneHBoU0RMaERWNVlIZk9ielZDdWFvYnlHR2hQU1RuUW5oWHZVNmdpU2dHZGp5c2t5dWg5bVBVUFZrRllaeFY2bVZWZ284V3BsSzI4Vk03cDV3WGFrbXdPVHJHMllBRnNwdm9XSUZkakFmSllETVd0VUtJVlJOSEFOczFtNHFJdXFTSmZMcGpmRk92N2tmSzR2VEJHR1RnSXExSE1xVUg1T3FxWHE2aGVubHgvM0RBRDZyVXZ5Q1E1eERCL05mSWZyNUgvQkRlOUNlc24xbFRzM0lEemUyVmtibTRFWDZIdTdsQW9rVEFlM0QxNzhPRHM3b09EUTdsTXNaakpEYUg5eFhQYmN6Q2VUZjVOQkRVbVd2VnZSSzIyR1BnMzU3YVA3R09idkhaMU1Nd3dCdkNta0lQZ3RvRDI0S3Foa1dndVRsVjc0bFh0aWRhNk9DSzZPTmw2TGs3SzdudmNaZ2tvOWk0MTRoMEo1Y1k4NnNHenZhZGsxZEtxV3BXazI5OFhWeE9ldmYxd2Z6dndMZ0s4aTZEVzRheW9NQ3VkN0h4TXcrRnQxcnA0UmVzU3V0YTFDNkphYzdwd1BRZEhQMUlna2VtQjhMZ25xaVFVWDJmQUcvSzVBd0czTTZMRTNOczdjaE5oZjBmc1FLS2dPSHRzVmplc2kzT0t3K2FXVzdlNDFGeGM3WkpNVWMyT0s4Q2NDZUE5K2pXZzIwMVNIZDJPSU9PaUc1d2FFWnlhc3ZPZnpwckFTZlIzZFkzLzloZDMzMDlXM3N2UHpoYmVmZTh4NEl2cjJ1Y2tCUDM3VU92UmwvRlowWmVSNjJwOXBLTDFDVjNyWmVSSU5vdStQSXk4VGk0eTVJbjQ5NS96TFFFNVA3WnJLRGpnYTFlN0hQNXd5QyszdFZ6NFZXSFJKSksrTGIzRFZsdEdocGxVL0tLb1k3ZytKeGttTHgyb1J4cjQzMEJid0g2bzllMUh2R28vWUw3Y0N1SEtrRGdXTys4aUxyRldFOHE3WnVVSkM5ZTRNSytPenEvczlQUTRBdGJPbHU2dGNrcE5EVS8yT3pvdHBwanE3Z2dKYTlOemQxZ3NPYk41VzUvZGxlL3VHYmxvYlFtRS9VNm5qbzNHYytvbzA1ZE4va3FFV2Fab2piOGlncjlpQThmVGJoaDQ3ZzNTK2xQU05wZ3V2YTlqOVQ4blNaQlpKNndPa21pcHJFSjlTeFd2c1ZSTVZoVVg0V0xSam1RbzZmZTZna3F3Q1V3R2NVcVY4YTlEN0RzMldnVm56ZWVML2RQUmdCcWNTS2NuZ21vZ090WHZETFM1bEVCQVFVQ3l0N05UeUNkOENVbnFVcU81ZkFUa1ZvSS84Kzk2V2xzOStIcEdkVGk4WG9kRFpYUHFBaDFNd1hqME9WVmgvbHBBemhwd2tYRWQyeGl2Mk1ZRXVlNmMybm8yeUYwWmQrcXNjVW5PM0hCT3lhRWJUaXJvQ2J4OXRoSDNZaS9qWGxKQmt2cmFyZVRST2ZvYStoa3cyTWZnMms3eVRiaW9rL3hBd2RPYWsrUUUvTFdQN1JEdk5nbEdneEVNSWc5akVIaHd6QVIreWlEaVNRMHJrV1BrZVBCTWpuQUNwY0lpSndoMHYyU0NqM1NtcVluU3BsQVRxSjdYNDJqRjhsMVVwS0t0d2RUT2RpNTFQd2Z1ZjJ6VC9SOWthTERuMlAyYjhQNGNjVHNvTHlJQUdTTm9FbzFFNUhoTzVFOEtoQnFOOUppaEFlbkIxSkFTbnJmemkxZ3IwTGpLMGp2djhoVGo2NjZucDI1NCtWTFJoNlFycmlaNEx0bGJiVlk4QXErUWI5Ykp4MmM3MFA0MnZReFUzNmZSZnA5R096N3BHYzVldzVWNi9IQVBId2hQUkJjZUVkeXgvaHdWT1dIS3c3NDFYZWRiUFY2b3Y1bnRYWm01a3cxRWtDVGhHRXNhYlRCcXRXdkw2R29ZeldIY1hwYkVSZmdsU3F1TlJCS2xYUjZOaUw1MWZRaW4vcXN1aXNPY0NUaGo0azl1NklYNzZwMWdxRkV5MlZkSTVwUDViQWFyaFZsbGw3WVd0NWk2TklsQTMvbmFGL1JqeHROdmFEeTlIM242QURtTDRxSnR5TWNhc2ZBekIwK1h3M3FNN1JGbVhJeHNGd1B2eWErWk1XT0xuVVU1aDIvU1JOM2NoQjNjMUdtaXA5VFcxMXdibWhWVE4yM0I2c0pnTTJFTks5clk4ZHhtcVJpT2RmbDlsbVlEM1pyc1NzZlNHdmpWcTNyY1d0b21EZXpVckdPdWdULzhMZXY1dzRVMS9pQ2ZhQWwraHpVK2JiVVEycXpSMDBoTVRXUWpwMnhtOElKZ0JOYUdGb0d2NWRhTkc2cjFHeUxQMG5VYnJ1ZEJuY2FZL3VtbTdSanZ0TVlDTmpaVStKY2RHYzVteWp5YzJENjhjMlRuUUY5bVczYmJqZmpaeXNCamhCdmtIaUVmMFdId1V6c3gwcDF5Qmp5Zk1MSjl6RHQxZkpPQlk4Y1VjZ3ZiTkFwV2NTR2tmL0hpeGNVTEZ4NTVlZm5GRjVlWjdSMEV4L2dqOGlUR2E5M29IRjV3eGxpTTBVZWx2ZVRKNVdYTmZ4cThkZzFvMlFlMFdMQjZWUzBkSEdjeWNIZUt4R1JpVlM1ZzVHYXoyV0syV0RYQ3NCQlpMV0UyN0ZzbjdrSnA3MjllV0RwL2ZxbjAyYkpHNHc3dUtmSStMY0I5aEZjYWVNU2ZNZXdPQW5kTTRaUHAwNmN6cDArblR6K1JQZjNqM0preitUUFBaTTg4bXo4RE5BeHl1NEcrN3pENlBKanBDbUc3UUIvSU95d0dOWHdUdUR2c2FKcGZnOGU4a1orVlc4eGdNWnoyRm8vc1FZS2JtelJQSC9jaWFpTjZUT0JWMU1MM1NZc2VML0V2OHZ3NytrZHlKZXIxZG5WNXZkRmZMaS8vczBzRGJIZHB6NUZCN2tQZys4ZWdFWTl6NTRHc3g3a0Zia2FybVZORjcxZWdQeXpaRjN6U3RnbTE3eGY1V3Nod2ZlQUJ5c3Rkd0lPOW5JMDd2dU9sUmhhWUNZc00vdDRHSW5HY2RNeUltQi9zOUM2VDFxbUpkU295cURBR1p2SUcvbUc4VmpwMXcwdFpQb1gxc0NUQkQ4NXJ6ZGEwdmkwOU9ybnJSNFUzcms3T1QrNSt0UEQ3MHVSZEo1YjNMSjA0c2JSbitRVFM2K0dteUF2MEtPYVdmd1Y4OEo1WWlCQW5qTzFJNlJLWktaU3VFbjZLdEpDV2tiZmUwdnpCZWJqK2I3WFgyd2dKaDBLbnlVenBVb0VZU2wvU282VlBTNS9xMTFNdVRaNEhBWC96ZjR6dHNsMW56ZmVIZ2ZuNWdmNjV1ZjcyUkhlZ1Baa2t6eS8yRitibkMvMkxRNm4ydG1TeUxkaURzUWhjTDMyS25tZWVKL2hxTnJsUjRnMmN1MVdrUERXQTh3RVRDRXMzYXdQbEpsVkNKc29SaDZ5cUVWM2k5U1Q3RkErMU5VYzA0RThZTWFRa3JNZE5nM0pveDMxNktWRUJGVVVQNmF1aDlsQnVSZkY0bEpYOC9zQ3VXSHdtc0pyZHI2Z2UxMHB1TlRBVGo4OEdmamE4ZCsvdzhMNjk2ZHhLWURiUnZTdXdtbDl6dWQydTFleHFZTFliTHRpZlgzVzVQYzdrZ2JIeEF3Zkd4dzdBMkJDVC9BSHo1VXdzTXFleWwxaFpmeXFHNmZVbG5vSnlDb3YzZlhBRWZvaVhuUDN5T0RsYlFpQlNoa040SlZiaWRSWmJjZlpnVHU3VU1ncUREY0Y2MmJhQURPNTlocnh6ZCtsWk1sVjY5Uk1OMjZwaGpCbStscnNKdHJWNGJRdTF3b1RidVI4V0czR0h5R3JHZE9IZ3R5bVkxZ1JUVXV2NUhOZjB0Snc4cjFTZVBHcjUrM0ppeGtvK2NieW1HR1Jmc3lKUnRWK3ovN0tpWFhEVmtsYTgxODdac1VaakVQR0N0bXJxVFQwZFo5Z2VsQzhOWnpzSGJNZVBlNmNTU3NKMmpOTFNuM0lqQVM4NWVyVzBSZldaRy85QzMxa1hDOUxHcE51K01maWpHa3E3THZ5alh2eEh1WWU2M05OOXl2OUh6TWdmNlFMM0NiMkh5WXkxYUJHdzBobWFtRy9aOURBVkRFVE1wdjdSMkNBNjRVVVhGQVdYN2h6d2pYYkRXRVhPVTNUcFZiRk1lbFBvV09SRUtqaGlLZGtVSnNRVWxqOStlcFRJeERMNk5BMjlYaUM3U3BmNkxsLzlzeGJUOWpaTmdzeXU3MmRpUXo5RXpqb0p5VHBsTXZmMGFPbEs2ZC9RMFd0WFAzeTlVSHFKelBSZHBwMGIxakl5cXpHbWhUNEQwNFYxS3huMlhPV3UzV1A0cTJFblBudTVHRllhYW00eUVNejBpWkVJa3pVRjBzQUluOEp5bTNTUjA4c3ZVc05zb0UzYksxZENVVUZRWWthSkdpdjdPTTdxUG80Z09GT2RtYXlwREdMQlU0UXJKWmxjZ2ZkNzA5SEQwMk4zMnc4MHBnTytzTTBXQ2JvTXR4UFpjUnMrcWRSbzlBbDJsZHpRMGRjMWNPdDRQdVJ0OXpyTTdpYWZwOUNyQml4SDJVTU9Ya2hwOWNmME1qMUV4MVpIdC80SEVSNVRHQUFBQUFFQUFBQUJBTVNnWitpb1h3ODg5UUFQQStnQUFBQUEyTkR6dEFBQUFBRFkwVmFlLzdMKzRBUklBL01BQUFBR0FBSUFBQUFBQUFCNDJtTmdaR0JnL3ZYdlBBTURTOHIvVGY5M3NIZ3dBRVdRQWVNeUFMR1pCNUFBQUFCNDJvMlVYVWlUWVJUSC8rZThKWm5STUpvcDZiSlZKczJwbUpuT1hGKzI5WUd6d0ZYVVJWaFpYWVFSVVVrVWtSQWtSbGZkRldGZFZCWkJSSUY5Z0VRUUZhaEZYVmlFbFVRWDBVMkk0RUJZLytkMXMzZWp3SXZmenZOeG5uUE84My9PWGxXc3dqZkFpVDVHaHZhZ1NkOWp1ZjZnUFVkT29jbnljdjRUamVKR1JOdVFvMWU1ZnBUcjNOTVlyUStWZWl0aHU3aDJCcmw2Rm5uNkVTRVQwN3FOSmZvTU0vVSs0N2Rnb1ozSGdmVW9kVDZKcVNNZDFtVlpqSDh1VWQvL2lFMVk0MnZxVHlFVHN4TDMyU2p1K0JENVJMNXp2cG0yMStwRWhEYkcrV0xhQWNlZEcvVEl4TjF0TGpCT0xKRXI5bGNMSjlOOHpKZTJOcWxURXFOWE9rWS9KOVRYMW5NS0dMMmQyTG83TVcrUXBBaCszY2R6V1NqVHZhUU9aWElGSG0zbU9JUVF4bEdOOGZnUExiREhJZXN3ZmJtdTI3bHZ6dkdNZENBa1g1QW4xN0NBZSt2Vmd5ejlobm1hUTMzeWtDbkRXR3JuY1dDMW96Ujl6Y2JVa2M0UXF2VVF5a3grdTVhNmlUci9pNm5QMkcya09ZMmJxTmNJc2pVVWY4TjR0WXozanZTUlFZelpkMzBnbzdiOXhYMDM3UXV6Yis2ZjBLQldqaU5LV3lBbkVCVWZ4TTdueEdqandIcVZPazlpNjlhQkN1S3g5VXVIZWpxaDFpRmIzNmxnOUhmQ2QzQmkzbVNTdTh6L0dZWE1VV2ozd0ZRSXMzZlN1Y3krTVhTalFHZWltWFNSSmhJbXg4aE9XWWFvcmtJYng1ZTBFRHZNdnB6R1pabU5SUnhmTjJBVWxjUmwyekhNNFB1YitRcFN4WDZZVDBvNExpWVY4aERGcElMZkw1ZmM0Sm1mbUNQM3lCMHNJYVZxK3Y4V1N1VjN2Ri9HVUNScjBTb0hFWllZWUgzZ2QrOGxPVU04WkJSMTBvOGE5Wk9ucUxHNlVmT3ZOZXEwZ2Zqa1BPckpjcmtKTDZtVVFRVGtPY29OdWhvQjlsb0plN3BTby9ETDIzZ2NNZWJ0UnRqS3dFckxSZWJ5N0crc1lIM0xkSmdFNE5Wc2FudWFkMzdDLzJrZmZIcURQdHQ1aHdEMTJVT05PMUdzamZRN2hRcmR4UGM2eXZNbkdmOEE4dEdESFBIejd1dmhsdDNzbnlCeUpZTDVVczE1QS9zMXdua0wvWjdTcjV4KzlWemZsZkRibXVxbmEwa1h2M3Z0NUN2YzFuVGtUOXVQZkw1WmNCSXZ0aVJzVUJjZ0tDT01NY0wveEVYVzFJc1NDYUZWZzZpU0FXb1h4WnJrbXlYZTdUVTFtazFjdWc2NVZCL1drUG45QXlkMFB0Y0FBQUFBQUFBYUFCb0FHZ0FhQUJvQVNnQ2NBT2dCS0FGV0FZQUIwZ0grQWhnQ1JnSnlBcEFDdWdMaUF5d0RaZ1BHQkFnRVhBUitCS3dFMEFUOEJTWUZUZ1Y4QmFZRjFnWUdCamdHZkFhcUJ0WUhRQWQyQjZ3SDJnZ09DTUlJOWdra0NWWUpwZ25TQ2dRS09BcHNDcUFLemdyOEN5b0xhZ3ZZRENnTVdneU1ETkFNL2cxQURYQU5rZzI0RGVBT0NBNHFEazRPaEE2bUR2WVBKQTlPRDRZUHFnL3dFQ1lRVEJCOEVKNFF4aEQ0RVNRUlNCRnlFWndSeUJJcUVsQVNkQkthRXlvVFdCT0lFNzRVQmhRdUZGd1ZGQlZDRllBVnJoWGFGa2dXZ0JhOEZ0NFhCaGN1RjFnWGZCZWVGOElZSmhoVUdJQVlwaGpTR1BvWkpCbE1HWG9acUJuUUdmd2FMaHBjR3VnYlhodW9IQjRjYmh6QUhTd2RaaDJhSGVZZUVCNG1Ib3dlMWg4WUgyNGZ3aUFLSUY0Z25DRG1JUW9oTmlGaUlab2h5Q0pPSXI0ak1pT2tKSEFrK2lWa0pqb21zQ2RNSjVRbnlpaFdLSXdvdmlrdUtiZ3AwaW9BS2tvcWZpcTBLdW9ySUN0U0s2QXIwaXc0TE1RdEtpMXFMYTR1Smk1bUx2WXZQaStxTDl3d0FqQXNNRll3ZGpDc01PWXhDakY0TWJveDVqSWdNa2d5Z0RLc010UXk5RE1hTTNRendEUUFOR28wcURUVU5RUTFNalhZTmhnMldEYUNOeEEzWGplMk9BQTRWRGlVT01RNVZqbUdPY0k2RGpwWU91QTdJanVPTytnOExqeDZQTVk5SkQxK1BjSStWajZtUHhBL1NqOTJQN0kvM0VBWVFFWkFkRUN5UVBaQktFRldRZUpDSUVKc1F0NURUa09zUkE1RWJrVGlSVHhGN2taU1J0aEhoRWZNU0JaSTBFa1dTWXBKeUVwS1NtaEtna3FvU3V4TERrdENTMnhMckV2d1RCWk1QRXhnVElSTTNrMFdUVHBOVkUxNFRaaE53azMyVGpwT2xrOEVUeWhQU2s5NFQ2QlB0ay9TVC94UU5sQllVSGhRbkZETVVPaFJBRkVhVVVCUlFGRkFVVUJSUUZGQVVWcFJkRkdPVWFoUndsSGNVZkpTQ0ZJZVVqUlNVbEp3VXBKU3RGTWNVNFJUdWxQa1ZCeFVubFRxVlJKVlhGVjhWYVpWMWxiYVYzQlgrbGlnV054WlNGbmlXalphbGxyWVd5eGJjbHVVVzlaY05GeHFYTHBkSWwxSVhieGVKRjVHWG1KZWhsNndYdEplK2w4cVgwaGZkbCttWCtKZ0JHQkVZS0JnMEdFY1lYcGhubUlHWW1SaWVtSzZZeGhqd21SU1pQcGxJbVZBWlhSbGtHWGVaaEptYW1hQ1pwcG0zR2RLWjNCbmpHZWlhQXBvS0doQ2FHUm9nR2lrYU1wbzRHamdhVVpwVVFBQkFBQUJwd0JjQUFRQVp3QUpBQUlBS0FCVUFJMEFBQUNNRGhVQUJRQUNlTnJ0bEUxckUxRVVoczhrYWZwaExTMGlpblJ4Y0NFcU9rbHRGN1lWb1ZTS1ltcGlHd1Ezd2pTWlRLNmRaSWFabTZiOUE2NEV1M2Jod3A5US9Ba3VYQXR1WGZzSEJKZSs5ODZKL2ZScklTaVlZV2FlZSs1NzMzdk9QVW1JaUoxbjVGRDJlWXc3WTRmT1lKUnhqb1lwRk03VE5LWENCV2hlQ0EvUlJYb3RYS1FwZWlzOERKY1B3aU0wNmJqQ28rRGJ3bU8wNnp3UVBrWG5uSS9DNDNUVytTeDhtblp6WThJVGRDSDNFcGs0aFZHTTluSnZoQjI2bEc4SjUyZ2kvMXc0VHpmekEzMEJtdmZDUTNRbi8wVzRTQmNMdDRTSGFhL3dSSGlFZUdoU2VCUmNGaDV6ZUtnbWZJcmNZaXc4VGxlTHI0UlBPMXg4Snp4QmM4T2ZoQ2ZwL01pMDhCU05qOHd0Ui9GT29vSzI1aHZsbVhtdXQzMWU4NXQ4MTlOY1M2S25ma1B6VWsrM295VGx5MjJ0NDNTaFZBcVVidmMyM0ViVUtVRUxhYlhWVWczbGhUSmNpYnI2eXNDbDdtOXJYdldicXRkWjg0TmU2Q1V6YnJrOHU3aTZmTCt5bU9tTjVQcEFjbXpWSXo5SlZkVGxiQm1mNkh2RTVZOFZWZk83MmdzU3I4TWxOZ1VjSGRmYkttV2o1UFdvcGZ0ZTRqTUNvV3I0M1JRSjlMcE5QMkdOZE5idlZiZ2ErOTFNWE1rRTEzaS8xaG1Yclptc05UYmVscWRDYnlQMHVZOWMyZU9WcFlmczZRVTJKYUNDdEpHb1dLZHVxa0kzU29KU2RhVWlNLzErMyswME5rTzlFL3VtUWduSGcreHQxWDlwN2lmTTBESkZGTk1PSmFRb29EWnBZcnBCWlpxaGVWQWRFUi92TlR5YmVOOGx6eXBxMEVmMEZOR0dIUzlSRCs4MllnbitWNWd1V3ljTjU1UVdxSVFyZ0w5UjlHaURYS3lLcUlObzVwdTVWcW1GUzJGT1lSd2VtVjNCaWk3ZVY0N2xVc2Q0MjlLcW5WSFlvMk5WQVNpRUtrRTFMbW9xMHl3dFFyVk05NmtDT3VnL2NMbCt6T1huZXowQ203cVZ6WkVQN2NhL2tlK1BjL24zT2xWRDFKQUh6d1RQRHZZcjJicXpEdnhzM3RTa2JKWURUNloxVUF2VXQzMDFGV2VLME9aai9GSTVnUjY0YVR2RHRoN2ZycjRIWDBZRnNkVWVkSzRjY3JpR3lFbDlOVGNmeU96d3ZvTnNQTnJDcmV5M2J3TlBNOU9YY3pXelp0OGxlbWhaNDl6NVd4ZXlIcVR3TkgyT0VVdXhZMnE5WE51MUFQTlZySzhjV2RPM2w0dFRiTkFtMUJyZkZWUGxvSWVIMWZHeHM5L3Y5Zjl6LzUxei83VTEzL3NYT1BBTC93cHRXLzhwQUFCNDJtMVNDWFFUVlJTOXQ0UUpKQVVLS0lJYnlPcEdiWkkyVGQyZ1N3cUYwa3BMS0NDaTA4azBHWnJPbE1ta3BiaUFBZ3FDb3FLNGdpRHVDd0x1b09DK3I4ZDkzL1c0N3g3MUhKZGs1cHNFY2M2WmMvLzcvNy83M3Z2M29nRDI5M2NJVWZ6UHh4dlNmd0Y3b1JkZEdJMHhHSXR4T0JTSDRYQWNnU014SHNVNENpWHd3WThBU2xHR0lNb1JRZ1dPeGpFNEZzZmhLZmJHRTJqRkJiaU5FdDFRc0FWLzRtOUUyWWQ5NmFFWEtndlpEMC9pYWZiSE14ekFJZzdFRi9pTmd6aVkrM0JmRHNHejNBL1A0WG44Z1JjNGxNTzRQdy9nZ1R5SUIzTTRSL0FRZk1TUkhNWFJhTU9MSElPWEVNTld2TXl4SEljTGNUc1A1V0U4bkVmZ0V4N0o4U3ptVVN5aGozNThnMWNZd0t1STR6V1dzb3hCbGpQRUNoN05ZM2dzdnVKeDJNbmpPUUdmY1NKcUVFWXRKbUV5NmpBRlUxR1BhV2hBSTA3QWREU2hHVE1Rd1V5MFlCWm1ZdzVPeEZ5Y0JJMlZhRWNDR3pHZlZheUdqZzc4UmNCZ0RjT3NKZkU2SjZHVGsxa0hFMGxPd1FKT1pUMm40VXY4emdZMjhnU3M1SFEyd1dJenV0RE5HVWd4d3BsczRTek81aHlleUxrOGlmTjRNajdtS1pUWmlvWG9vWUpUY1JxMllSR2pWTEVKcDdPTk1jYXA0VlBPWnpzVDdLQk9nNTM0Rm1kd0FaYmdUQ3lteVNRdHB0akZiaTVrRHhmaGE1NktIVHlOcCtOem5vSDEyTURGWE1JemVSYVhjaG1YODJ5ZXd4VmN5WE81aXF0NUhzL0hnM2dJZlZHTjgvQUczc1JiZUJ2djRIeThpL2Z4SWRmd0FyeUhEekFRQTNBUURzWXRjR0V6UnVJYTNJMTdjQ2Z1d3FONGpCZnlJdXpDYnR5RW16RUlFM0F5enVGYVhzeEx1STZYNGhFVVlUdnU0R1c4bkZmd1NsN0Y5ZkNpRU1kakl1YmhGUFREV1hnWVoyTUZLaUdqQ2g3MHhpaHV3Q3FjaTlXOEdtNHN3M0tzZzRUQjJBZjdZZ2oydzFBTXcvNDRBQWR5STM3QWovaUptM2dOTi9OYVhzZnJlUU52NUUyOG1iZndWdDdHTGJ5ZFczRS9mc1l2K0JWOThEajY0enVzeGZlNEZ5T3dCc054Q0paeUc3ZnpEdDdKdTNnMzcrRzl2STg3dUpQMzh3SHU0bTVYUTZTK3ZxQzZ5YTIzSmp0bFJaVXFXMDIxUzNWWGRzaUthZWp1U2lObTZHcTd0MXJSVENYVjBaWlFGM3FxbzRZbEs0cXFXMUtOSXFkdnBjRTBaRXNLMjdsUzJONzBoTFBYM0dHSHJWZFlqN25EZ25GU2p0R2QwclVTbjkvdm1aUk5jVTF1bFUzdjVOd2RxYzRtTDZpYjRxNFR2ZFU1VEZLZHBTV2lxbmZLZndrRFFhbGVWbEtXS3RYYkhZbmRLbGQ5dW96VTRCdzE1QjJWbGttTmRwVitqZkdVSHBQTlZFZENUbG51UnFlZzFPU2tOT1dsbEFXbFpudFhoR0Z2ODMvYThQdENyaG5wWWFRWmVXbEJ2emlybENKT3hjZ2VGU05peElnell1K0lxZWt4S1dJUEtyWFlCZnUyUkRYVlZKTmFVbXFKbVhLWDZtM0pWZmJPem51NTJmYXhOTWRPODh6SnFTYzdXc3VpbUN5VVVmSzBWbkszbzduKy9ZRnlTWFhFVmgyeDFaellxaEJiVFl1dENzcllYbUlIUExHYzJQR00yUEc4bGpXYjNLTmxyeFJvODkyYTZGTVR1bXVPN3ZQMzByMjhzRDFtcXFxZWtQV29wa2dKUjdaRXZnbXFYWW1NQ1hUblNNODNRVkF5SEVtTVBTUXhoQWxNSjhYTU4wRzVsTXczUWEwM3VaY0pLbHhXeGdSV3Zna0M0cXhLU2prVlUzdFVUSWw1VThJRUtkc0VLY2NFM1k0SnVyTW02SFpNMEoxbmdwNjhGKzF4VExESU1jR2k3TVAyVVF3enF1bHlvbzljbkZUaWhwSG9KOXQzc3BIZG1vZ0d5VGxLc1ZVay85dENOc011SmFMK3dsM1owQmxHaElWeVpxWnNvajJhaUhySGl1V0U1WWs1NWRQTEFYa215c1JGTWNYbzZKQ2RNVEliL1hPT3lvUmUrNm1iRTBhWDNPN05QSFNKdjZRazRBOFdaUWpOcExvZ1pWaHFRbTJ6QnVkdlJGc1RtYjJNTXVucmZvRUJnUlVDS3dWV09lZ3JHOVNwbXBvUnpkUk9QMGEwV0pFN1BmR2V6cmlxMjB0Vmo4ckp1TFBzK0hmcEZibVp0U1JiR1hDRlU2YmhjSmFYQ0N3VldDWXdLTEJjWUVpZzZDMGs4a0krZ1dLR2tKZ2hKUGhDZ2k4aytFS0NMeVQ0UWpaZmV0UlNnVUdCMVFKckhLd3FjMXhjVlNXdzJza1BpTG9CcDY2dndpZlFpZjArTzY4MlhGdHJZMjF0VFdHeFpiV2xqVy9FTmQzNkIrKzI5Y0VBQUFBQUFRQUIvLzhBRDNqYVkyQWdBQXFBTUpFaGtXa1BBd1BUUGNhdkRBei9kWmgvL1R2UGRQei9ONlpuakgvL2YvdXZEdUl6dUFDaEhZTWRZeHdEQTRqUG1QTC9ON0k0MHg3R09MQytRNHlSSUJvQUcyZ2szZ0FBZU5xdFYydGJHOGNWbnRVTmpBRURrckNiZGQxUnhxSXVPNUpKNnpqRVZoeXl5Nkk0U2xLQmNidnJOTzB1RXU3OWt2UkdyK245b3Z5WnM2Sjk2bnpMVDh0N1psWUtPT0ErZlo3eVFlZWRtWGZtWE9mTVFrSkxFZytqTUpheTkwUXM3dmFvOHVCUlJMZGN1aEVuaitYb1lVU0ZadnJSckpnVmc0RTZjQnNORWpHSlFHMlBoU09DeEcrUm8wa21qMXRVMEtxaEdpMHFhams4THRicXdnK29Hc2drOGJOQ0xmQ3paakdnUXJCL0pHbGVBUVRwa0VyOW8zR2hVTUF4MURpODJ1RFo4V0xkOGE5S1FPV1BxMDRWYTRwRVB6cU14NnRPd1Nnc2FTcDZWQThpMWtlclFaQVRYRG1VOUhHZlNtdVB4amVjaFNBY2hGUUpvd1lWbS9IZU94SEk3aWlTMU85amFndHMybVMwR2NjeXMyeFlkQU5UK1VqU0JxOXZNUFBqZmlRUmpWRXFhYTRmSlppUnZEYkg2RGFqMjRtYnhISHNJbG8wSHd4STdFVWtla3h1WU96MjZCcWphNzMweVpJWU1PTkpXUnpFOFRDTnlmSGlPUGNnbGtQNG8veTRSV1V0WVVHcG1jS25tYUFmMFl6eWFWYjV5QUMySkMycW1IQWpFbktZelJ6NGtoZlpYZGVhejc5VVRNSUJsZGNiV0F6a1NJNmdLOXNvTnhHaDNTanB1K2xlSEttNEVVdmFlaEJoemVXNDVLYTBhRWJUaGNBYmk0Sk44eXlHeWxjb0YrV25WRGg0VE00QWh0RE1lb3N1YU1uV0xzS3RramlRZkFKdEpURlRrbTFqN1p3ZVgxZ1VRZWl2TjZhRmMxR2ZMcVI1ZTRyandZUUFyaWN5SEttVWsycUNMVnhPQ0VrWFJrNnNSR3BWdW0xVkxKeXpuYTVqbDNBL2RlM2twa1Z0SERwZW1CZkZFRnBjMVlqWFVjU1hkRllvaERSTXQxdTBwRUdWa2k0RmIvQUJBTWdRTGZGb0Q2TWxrNjlsSExSa2dpSVJnd0UwMDNLUXlGRWlhUmxoYTlHSzd1MUhXV200SFYrbmhVTjExS0txN3UxR3ZRZDIwbTFndm1ybWF6b1RLOEhES0Z0WkNjaEpmVnIyK01xaHRQenNFdjhzNFllY1ZlU2kyT3hIR1ljUC92b2paQmhxbDlZYkN0c20yTFhydkFVM21XZGllTktGL1YzTW5rN1dPU25NaEtncXhDc2djVy9zT0k3SlZsMkxUQlRDL1loV2xDOURXa1Q1TFNpVUhFcXhocGtFTnZ6bnloVkhMSXVxOEgyZkkxR0RJVmpMYXJNZWZlaTV6eU51cTNDMjdyWG9zczRjbGxjUWVKYWYwMW1SNVhNNks3RjBkVlptZVZWbkZaYWYxOWtNeTJzNm0yWDVCWjFkWU9scE5Va0VWUktFWE1rMk9lL3l0V21SUHJHNE9sMTh6eTYyVGl5dVRSZmZ0NHRTQzdya25lY3crL3B2NnlzN2V0Sy9CdnlUc090NStNZFN3VCtXMStFZnl5YjhZN2tHLzFoK0VmNnh2QUgvV0g0Si9yRmNoMzhzMjFwMlRPWGUxRkI3SlpIb2ZrNFNtTnppTnJhNWVEYzAzZlRvSmk3bUM3Z1RYWGxPV2xXNnFiakRQNVBoc3ZkZm51UTZXNnlFWEhyMHducFdkdXBoaE83SVhuN2xSSGpPNDl6UzhrVmorWXM0elhMQ3orckUvVDNURnA0WHEvOFMvTGQ5VDIxbXQ1dzYrM29iOFlBRFo5dVBXNU51dHVnbDNiN2NhZEhtZjZPaXdnZWd2NHdVaWRXbWJNc3U5d2FFOXY1bzFGVmROSk1JTHlEYUw1Nm1UY2VwMXhEaE8yaGlxM1FadEJMNmF0UFFzbm5oMDhYQU94eTFsWlNkRWM2OGU1b20yL1k4cXVBMjVHeEpDVGVYcmQzb3VDVEwwajB1clpXZmkzMXV1WFBvM3Nyc1VEc0pWWUtuNzIzQ2JjOCtUNlVnR1NvcTQzWEZjaWxJWGVDRVc5N1RlMUtZaG9kQTdTREhDaHAyK09tYUM0d1duSGVHRW1XYmF3V1hHTWtvbytES256a1ZKN0lSVFRhaWlOKzhwWDZxQzRYUW1jUkNZcmE4bHNkQ2RSQ21WNlpMTkdmV2QxU1hsWElXNzAxRHlNN1lTSlBZajlxeWc1ZWRyYzhuSmR1VnA0SXFUWXp1bi95SXNVazhxOXJ6YkNrdStWZFBXQkpNMHBYd2w4N1RMazlTdklYKzBlWW83dERsSU9xN2VGeGxKMjVuRzA0TjkvYTFVNnQ3YnYvVXFuL20zbWZ0Q0RUZDhaNmxjRnZUWFc4RTI3akc0TlM1VkNTMFRSdllFUnFYdVQ3WGJPUlRmS241MW5VdVVJWHIwOGJOcytmdjZHd09qODVreS85WTB0My9WeFd6VDl6SE9ncXQ2a1M5Tk9MY3ppNGE4QjF2RXBYWE1icnJOVlFlbDl5YmFRanVJd1IxZSszeFdZSWJYbTNUYmR6eU44Nlo3K0U0cDFhbGw0RGYxUFF5eEZzY3hSRGhsanQ0Z1NmUmVsdHpRZE5iZ0YvVll5RjJBUG9BRG9OZFBYYk16QjZBbVhuQW5DN0FQbk1ZUEdRT2c2OHhoOEhYOVRGNllRQVVBVGtHeGZyWXNYT1BnT3pjTzh4ekdIMkRlUWE5eXp5RHZzazhnNzdGT2tPQWhIVXlTRmtuZ3dQV3lXREFuTmNCaHN4aGNNZ2NCbytadytEYnhxNXRvTzhZdXhoOTE5akY2SHZHTGtiZk4zWXgrb0d4aTlFUGpWMk1mbVRzWXZSanhMZ3pUZUJQeklpMkFOK3o4RFhBOXpub1p1Umo5Rk84dFRublp4WXk1K2VHNCtTY1gyRHpLOU5UZjJsR1pzZVJoYnpqVnhZeS9kYzRKeWY4eGtJbS9OWkNKdndPM0h2VDgzNXZSb2IrZ1lWTS80T0ZUUDhqZHVhRVAxbkloRDlieUlTL2dQdnE5THkvbXBHaC84MUNwdi9kUXFiL0F6dHp3ajh0Wk1MSVFpWjhxTWNYelNjdVZkeHhxVkFNOGQ4VDJtRHNlelI3U01Yci9hUEpZOTM2QlBXZ0Evb0FBSGphWS9EZXdYQWlLR0lqSTJOZjVBYkduUndNSEF6SkJSc1oySjIyTURESU16Tm9nWmpialZqVVdJUTRtTGtnUEFzbUhTWVpOakNQeTJrUHp3SE9BeXdIR0pnWnVJRjhYcWM5REE1Z0NPTHZCSklNTGh0VkdEc0NJelk0ZEVTQStDa3VHelZBL0IwY0RCQUJCcGRJNlkzcUlLRmRIQTBNakN3T0hja2hNQWtRMkc3Q29zRWl3c0hNcDdXRDhYL3JCcGJlalV3TUxwdFpVOWdZWEZ3QTU2VXUrUUFBQUFBQUFRQUFBQUI0MnRXVVRVL2NNQkNHNy95S2tVOVVLakhMcVVVSkNJR2lvaTVhUHJhOW0zZzJjWEhzZER6WnNQKytEczZXcFdvcmJvaGJiSTBmUCsvWVRuNzYyRnBZSXdYalhTRm0yYUVBZEpYWHh0V0YrTFlzRHo2SjA1Tzl2RVZXV3JFNjJRUEllMmQrOW1nMEdGMkl5cmRaV3oxWTNuU1kzYUwrb25pSmozeUYydlN0a0U4TDF1aTBKM0NxeFVKY28yTlZrMnBCd3RYNTE3bUFubXdoR3VidVdNcGhHSjV4a1QwUktvbzhEdVAzNzlFL2VlUnRuQzk5N3pSdFhvTi9MZklDZzZrZDBrdG10NjBlZ1hJU2xqdkd1Y1pRa2VrNDluamFqbU9Md0txeHllaEVtZ1JZTmlaQTZSM0RuVi94b0FnaFRsaFRvUXVvSWVaQkFtNFE3aTduc0lqN3B1SjVLdmdJMzlNNXdpeWJaUWsyclIweGFxMk1WZmNXWVREY2dJTHk3QVlVSDhNVUl5bUdMQmliZWFybG9wem5jdlJNZWY3SWtHL0p1NTM0QzBLODI4QVRLVjAvMzIzSTFBMy9OODM1dGdxT0RtZWZvdzlDZkJBUVh3UmNrLytCRmNOWno0Mm5BUHVqUTRnU2RWVHI3NTl1VG5vOGk5WEtWRWJaYVRqbS9iQ3I5VUlsWjFJYVcwVVBieSsybzVMTDUvL0ZMM3BKYlRrPSkgZm9ybWF0KCJ3b2ZmIik7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc3R5bGU6IG5vcm1hbDsgfQoucGYtYy1sb2dpbl9faGVhZGVyLCAucGYtYy1sb2dpbl9fZm9vdGVyIHsgLS1wZi1nbG9iYWwtLUNvbG9yLS0xMDA6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLWxpZ2h0LTEwMCk7IC0tcGYtZ2xvYmFsLS1Db2xvci0tMjAwOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0yMDApOyAtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTEwMDogdmFyKC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tbGlnaHQtMTAwKTsgLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLTEwMDogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS1saWdodC0xMDApOyAtLXBmLWdsb2JhbC0tbGluay0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tbGluay0tQ29sb3ItLWxpZ2h0KTsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3ZlcjogdmFyKC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvci0tbGlnaHQpOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS0xMDA6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1kYXJrLTEwMCk7IH0KLnBmLWMtbG9naW5fX2hlYWRlciAucGYtYy1jYXJkLCAucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWNhcmQgeyAtLXBmLWMtY2FyZC0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay10cmFuc3BhcmVudC0yMDApOyB9Ci5wZi1jLWxvZ2luX19oZWFkZXIgLnBmLWMtYnV0dG9uLCAucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWJ1dHRvbiB7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tZGFyay0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWhvdmVyLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS1kYXJrLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLWRhcmstMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1hY3RpdmUtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLWRhcmstMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWhvdmVyLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0zMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0zMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWFjdGl2ZS0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tbGlnaHQtMzAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0taG92ZXItLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0taG92ZXItLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgfQoKOnJvb3QgeyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMTAwOiAjZmFmYWZhOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMTUwOiAjZjVmNWY1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMjAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMzAwOiAjZDJkMmQyOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNDAwOiAjYjhiYmJlOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNTAwOiAjOGE4ZDkwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNjAwOiAjNzM3Njc5OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNzAwOiAjNGY1MjU1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stODAwOiAjM2MzZjQyOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stODUwOiAjMjEyNDI3OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stOTAwOiAjMTUxNTE1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMTAwMDogIzAzMDMwMzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWJsdWUtNTA6ICNkZWYzZmY7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ibHVlLTEwMDogI2JlZTFmNDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWJsdWUtMjAwOiAjNzNiY2Y3OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmx1ZS0zMDA6ICMyYjlhZjM7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ibHVlLTQwMDogIzA2YzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWJsdWUtNTAwOiAjMDA0MDgwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmx1ZS02MDA6ICMwMDQzNjg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ibHVlLTcwMDogIzAwMjIzNTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWN5YW4tMTAwOiAjYTJkOWQ5OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tY3lhbi0yMDA6ICM3M2M1YzU7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1jeWFuLTMwMDogIzAwOTU5NjsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWN5YW4tNDAwOiAjMDA1ZjYwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tY3lhbi01MDA6ICMwMDM3Mzc7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1jeWFuLTYwMDogIzAwM2Q0NDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWN5YW4tNzAwOiAjMDAxZjIyOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tZ29sZC0xMDA6ICNmOWUwYTI7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1nb2xkLTIwMDogI2Y2ZDE3MzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWdvbGQtMzAwOiAjZjRjMTQ1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tZ29sZC00MDA6ICNmMGFiMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1nb2xkLTUwMDogI2M1OGMwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWdvbGQtNjAwOiAjNzk1NjAwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tZ29sZC03MDA6ICMzZDJjMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi0xMDA6ICNiZGU1Yjg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi0yMDA6ICM5NWQ1OGU7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi0zMDA6ICM2ZWM2NjQ7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi00MDA6ICM1YmEzNTI7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi01MDA6ICM0NjdmNDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi02MDA6ICMxZTRmMTg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi03MDA6ICMwZjI4MGQ7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1saWdodC1ibHVlLTEwMDogI2JlZWRmOTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWJsdWUtMjAwOiAjN2NkYmYzOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tbGlnaHQtYmx1ZS0zMDA6ICMzNWNhZWQ7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1saWdodC1ibHVlLTQwMDogIzAwYjllNDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWJsdWUtNTAwOiAjMDA4YmFkOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tbGlnaHQtYmx1ZS02MDA6ICMwMDVjNzM7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1saWdodC1ibHVlLTcwMDogIzAwMmQzOTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTEwMDogI2U0ZjViYzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTIwMDogI2M4ZWI3OTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTMwMDogI2FjZTEyZTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTQwMDogIzkyZDQwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTUwMDogIzZjYTEwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTYwMDogIzQ4NmIwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTcwMDogIzI1MzYwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLW9yYW5nZS0xMDA6ICNmNGI2Nzg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1vcmFuZ2UtMjAwOiAjZWY5MjM0OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tb3JhbmdlLTMwMDogI2VjN2EwODsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLW9yYW5nZS00MDA6ICNjNDYxMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1vcmFuZ2UtNTAwOiAjOGY0NzAwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tb3JhbmdlLTYwMDogIzc3M2QwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLW9yYW5nZS03MDA6ICMzYjFmMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1wdXJwbGUtMTAwOiAjY2JjMWZmOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcHVycGxlLTIwMDogI2IyYTNmZjsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXB1cnBsZS0zMDA6ICNhMThmZmY7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1wdXJwbGUtNDAwOiAjODQ3NmQxOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcHVycGxlLTUwMDogIzY3NTNhYzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXB1cnBsZS02MDA6ICM0MDE5OWE7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1wdXJwbGUtNzAwOiAjMWYwMDY2OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcmVkLTEwMDogI2M5MTkwYjsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXJlZC0yMDA6ICNhMzAwMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1yZWQtMzAwOiAjN2QxMDA3OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcmVkLTQwMDogIzQ3MDAwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXJlZC01MDA6ICMyYzAwMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS13aGl0ZTogI2ZmZjsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tMTAwOiAjZmZmOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS0xNTA6ICNmNWY1ZjU7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLTIwMDogI2ZhZmFmYTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tMzAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0xMDA6ICNmZmY7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLWxpZ2h0LTIwMDogI2ZhZmFmYTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tbGlnaHQtMzAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1kYXJrLTEwMDogIzE1MTUxNTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay0yMDA6ICMzYzNmNDI7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLWRhcmstMzAwOiAjMjEyNDI3OyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1kYXJrLTQwMDogIzRmNTI1NTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay10cmFuc3BhcmVudC0xMDA6IHJnYmEoMywgMywgMywgMC42Mik7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLWRhcmstdHJhbnNwYXJlbnQtMjAwOiByZ2JhKDMsIDMsIDMsIDAuMzIpOyAtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMDogIzE1MTUxNTsgLS1wZi1nbG9iYWwtLUNvbG9yLS0yMDA6ICM3Mzc2Nzk7IC0tcGYtZ2xvYmFsLS1Db2xvci0tMzAwOiAjM2MzZjQyOyAtLXBmLWdsb2JhbC0tQ29sb3ItLTQwMDogIzhhOGQ5MDsgLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDA6ICNmZmY7IC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMjAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tQ29sb3ItLWxpZ2h0LTMwMDogI2QyZDJkMjsgLS1wZi1nbG9iYWwtLUNvbG9yLS1kYXJrLTEwMDogIzE1MTUxNTsgLS1wZi1nbG9iYWwtLUNvbG9yLS1kYXJrLTIwMDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWFjdGl2ZS1jb2xvci0tMTAwOiAjMDZjOyAtLXBmLWdsb2JhbC0tYWN0aXZlLWNvbG9yLS0yMDA6ICNiZWUxZjQ7IC0tcGYtZ2xvYmFsLS1hY3RpdmUtY29sb3ItLTMwMDogIzczYmNmNzsgLS1wZi1nbG9iYWwtLWFjdGl2ZS1jb2xvci0tNDAwOiAjMmI5YWYzOyAtLXBmLWdsb2JhbC0tZGlzYWJsZWQtY29sb3ItLTEwMDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWRpc2FibGVkLWNvbG9yLS0yMDA6ICNkMmQyZDI7IC0tcGYtZ2xvYmFsLS1kaXNhYmxlZC1jb2xvci0tMzAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMTAwOiAjMDZjOyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMjAwOiAjMDA0MDgwOyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tbGlnaHQtMTAwOiAjNzNiY2Y3OyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tZGFyay0xMDA6ICMwNmM7IC0tcGYtZ2xvYmFsLS1zZWNvbmRhcnktY29sb3ItLTEwMDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWRlZmF1bHQtY29sb3ItLTEwMDogIzczYzVjNTsgLS1wZi1nbG9iYWwtLWRlZmF1bHQtY29sb3ItLTIwMDogIzAwOTU5NjsgLS1wZi1nbG9iYWwtLWRlZmF1bHQtY29sb3ItLTMwMDogIzAwMzczNzsgLS1wZi1nbG9iYWwtLXN1Y2Nlc3MtY29sb3ItLTEwMDogIzkyZDQwMDsgLS1wZi1nbG9iYWwtLXN1Y2Nlc3MtY29sb3ItLTIwMDogIzQ4NmIwMDsgLS1wZi1nbG9iYWwtLWluZm8tY29sb3ItLTEwMDogIzczYmNmNzsgLS1wZi1nbG9iYWwtLWluZm8tY29sb3ItLTIwMDogIzAwNDM2ODsgLS1wZi1nbG9iYWwtLXdhcm5pbmctY29sb3ItLTEwMDogI2YwYWIwMDsgLS1wZi1nbG9iYWwtLXdhcm5pbmctY29sb3ItLTIwMDogIzc5NTYwMDsgLS1wZi1nbG9iYWwtLWRhbmdlci1jb2xvci0tMTAwOiAjYzkxOTBiOyAtLXBmLWdsb2JhbC0tZGFuZ2VyLWNvbG9yLS0yMDA6ICNhMzAwMDA7IC0tcGYtZ2xvYmFsLS1kYW5nZXItY29sb3ItLTMwMDogIzQ3MDAwMDsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tc206IDAgMC4wNjI1cmVtIDAuMTI1cmVtIDAgcmdiYSgzLCAzLCAzLCAwLjIpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1zbS1yaWdodDogMC4yNXJlbSAwIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4xMik7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLXNtLWxlZnQ6IC0wLjI1cmVtIDAgMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjEyKTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tc20tYm90dG9tOiAwIDAuMjVyZW0gMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjEyKTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tc20tdG9wOiAwIC0wLjI1cmVtIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4xMik7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLW1kOiAwIDAuMDYyNXJlbSAwLjA2MjVyZW0gMHJlbSByZ2JhKDMsIDMsIDMsIDAuMDUpLCAwIDAuMjVyZW0gMC41cmVtIDAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjA2KTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tbWQtcmlnaHQ6IDAuMzEyNXJlbSAwIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLW1kLWxlZnQ6IC0wLjMxMjVyZW0gMCAwLjYyNXJlbSAtMC4yNXJlbSByZ2JhKDMsIDMsIDMsIDAuMjUpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1tZC1ib3R0b206IDAgMC4zMTI1cmVtIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLW1kLXRvcDogMCAtMC4zMTI1cmVtIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLWxnOiAwIDAuMTg3NXJlbSAwLjQzNzVyZW0gMC4xODc1cmVtIHJnYmEoMywgMywgMywgMC4xMyksIDAgMC42ODc1cmVtIDEuNXJlbSAxcmVtIHJnYmEoMywgMywgMywgMC4xMik7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLWxnLXJpZ2h0OiAwLjc1cmVtIDAgMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjA3KTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tbGctbGVmdDogLTAuNzVyZW0gMCAwLjYyNXJlbSAtMC4yNXJlbSByZ2JhKDMsIDMsIDMsIDAuMDcpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1sZy1ib3R0b206IDAgMC43NXJlbSAwLjYyNXJlbSAtMC4yNXJlbSByZ2JhKDMsIDMsIDMsIDAuMDcpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1sZy10b3A6IDAgLTAuNzVyZW0gMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjA3KTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0taW5zZXQ6IGluc2V0IDAgMCAwLjYyNXJlbSAwIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1mb250LXBhdGg6IC4vYXNzZXRzL2ZvbnRzOyAtLXBmLWdsb2JhbC0tZm9udGljb24tcGF0aDogLi9hc3NldHMvcGZpY29uOyAtLXBmLWdsb2JhbC0tc3BhY2VyLS14czogMC4yNXJlbTsgLS1wZi1nbG9iYWwtLXNwYWNlci0tc206IDAuNXJlbTsgLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQ6IDFyZW07IC0tcGYtZ2xvYmFsLS1zcGFjZXItLWxnOiAxLjVyZW07IC0tcGYtZ2xvYmFsLS1zcGFjZXItLXhsOiAycmVtOyAtLXBmLWdsb2JhbC0tc3BhY2VyLS0yeGw6IDNyZW07IC0tcGYtZ2xvYmFsLS1zcGFjZXItLTN4bDogNHJlbTsgLS1wZi1nbG9iYWwtLXNwYWNlci0tZm9ybS1lbGVtZW50OiAwLjM3NXJlbTsgLS1wZi1nbG9iYWwtLWd1dHRlcjogMS41cmVtOyAtLXBmLWdsb2JhbC0tZ3V0dGVyLS1tZDogMXJlbTsgLS1wZi1nbG9iYWwtLWdvbGRlbi1yYXRpbzogMS42ODE7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLXhzOiAxMDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLXNtOiAyMDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLW1kOiAzMDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLWxnOiA0MDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLXhsOiA1MDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLTJ4bDogNjAwOyAtLXBmLWdsb2JhbC0tYnJlYWtwb2ludC0teHM6IDA7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS1zbTogNTc2cHg7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS1tZDogNzY4cHg7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS1sZzogOTkycHg7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS14bDogMTIwMHB4OyAtLXBmLWdsb2JhbC0tYnJlYWtwb2ludC0tMnhsOiAxNDUwcHg7IC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvcjogIzA2YzsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3ZlcjogIzAwNDA4MDsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1saWdodDogIzczYmNmNzsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1saWdodC0taG92ZXI6ICMyYjlhZjM7IC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvci0tZGFyazogIzA2YzsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1kYXJrLS1ob3ZlcjogIzAwNDA4MDsgLS1wZi1nbG9iYWwtLWxpbmstLUZvbnRXZWlnaHQ6IDUwMDsgLS1wZi1nbG9iYWwtLWxpbmstLVRleHREZWNvcmF0aW9uOiBub25lOyAtLXBmLWdsb2JhbC0tbGluay0tVGV4dERlY29yYXRpb24tLWhvdmVyOiB1bmRlcmxpbmU7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJXaWR0aC0tc206IDFweDsgLS1wZi1nbG9iYWwtLUJvcmRlcldpZHRoLS1tZDogMnB4OyAtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLWxnOiAzcHg7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tMTAwOiAjZDJkMmQyOyAtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTIwMDogIzhhOGQ5MDsgLS1wZi1nbG9iYWwtLUJvcmRlckNvbG9yLS0zMDA6ICNlZGVkZWQ7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tZGFyay0xMDA6ICNkMmQyZDI7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tbGlnaHQtMTAwOiAjYjhiYmJlOyAtLXBmLWdsb2JhbC0tQm9yZGVyUmFkaXVzLS1zbTogM3B4OyAtLXBmLWdsb2JhbC0tQm9yZGVyUmFkaXVzLS1sZzogMzBlbTsgLS1wZi1nbG9iYWwtLWljb24tLUNvbG9yLS1saWdodDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWljb24tLUNvbG9yLS1kYXJrOiAjMTUxNTE1OyAtLXBmLWdsb2JhbC0taWNvbi0tRm9udFNpemUtLXNtOiAwLjYyNXJlbTsgLS1wZi1nbG9iYWwtLWljb24tLUZvbnRTaXplLS1tZDogMS4xMjVyZW07IC0tcGYtZ2xvYmFsLS1pY29uLS1Gb250U2l6ZS0tbGc6IDEuNXJlbTsgLS1wZi1nbG9iYWwtLWljb24tLUZvbnRTaXplLS14bDogMy4zNzVyZW07IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1zYW5zLXNlcmlmOiBvdmVycGFzcywgb3ZlcnBhc3MsIG9wZW4gc2FucywgLWFwcGxlLXN5c3RlbSwgYmxpbmttYWNzeXN0ZW1mb250LCBTZWdvZSBVSSwgcm9ib3RvLCBIZWx2ZXRpY2EgTmV1ZSwgYXJpYWwsIHNhbnMtc2VyaWYsIEFwcGxlIENvbG9yIEVtb2ppLCBTZWdvZSBVSSBFbW9qaSwgU2Vnb2UgVUkgU3ltYm9sOyAtLXBmLWdsb2JhbC0tRm9udEZhbWlseS0taGVhZGluZy0tc2Fucy1zZXJpZjogb3ZlcnBhc3MsIG92ZXJwYXNzLCBvcGVuIHNhbnMsIC1hcHBsZS1zeXN0ZW0sIGJsaW5rbWFjc3lzdGVtZm9udCwgU2Vnb2UgVUksIHJvYm90bywgSGVsdmV0aWNhIE5ldWUsIGFyaWFsLCBzYW5zLXNlcmlmLCBBcHBsZSBDb2xvciBFbW9qaSwgU2Vnb2UgVUkgRW1vamksIFNlZ29lIFVJIFN5bWJvbDsgLS1wZi1nbG9iYWwtLUZvbnRGYW1pbHktLW1vbm9zcGFjZTogb3ZlcnBhc3MtbW9ubywgb3ZlcnBhc3MtbW9ubywgU0ZNb25vLVJlZ3VsYXIsIG1lbmxvLCBtb25hY28sIGNvbnNvbGFzLCBMaWJlcmF0aW9uIE1vbm8sIENvdXJpZXIgTmV3LCBtb25vc3BhY2U7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1zYW5zLXNlcmlmOiBSZWRIYXRUZXh0LCBPdmVycGFzcywgb3ZlcnBhc3MsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1oZWFkaW5nLS1zYW5zLXNlcmlmOiBSZWRIYXREaXNwbGF5LCBPdmVycGFzcywgb3ZlcnBhc3MsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1tb25vc3BhY2U6IExpYmVyYXRpb24gTW9ubywgY29uc29sYXMsIFNGTW9uby1SZWd1bGFyLCBtZW5sbywgbW9uYWNvLCBDb3VyaWVyIE5ldywgbW9ub3NwYWNlOyAtLXBmLWdsb2JhbC0tRm9udFNpemUtLTR4bDogMi4yNXJlbTsgLS1wZi1nbG9iYWwtLUZvbnRTaXplLS0zeGw6IDEuNzVyZW07IC0tcGYtZ2xvYmFsLS1Gb250U2l6ZS0tMnhsOiAxLjVyZW07IC0tcGYtZ2xvYmFsLS1Gb250U2l6ZS0teGw6IDEuMjVyZW07IC0tcGYtZ2xvYmFsLS1Gb250U2l6ZS0tbGc6IDEuMTI1cmVtOyAtLXBmLWdsb2JhbC0tRm9udFNpemUtLW1kOiAxcmVtOyAtLXBmLWdsb2JhbC0tRm9udFNpemUtLXNtOiAwLjg3NXJlbTsgLS1wZi1nbG9iYWwtLUZvbnRTaXplLS14czogMC43NXJlbTsgLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLWxpZ2h0OiAzMDA7IC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1ub3JtYWw6IDQwMDsgLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLXNlbWktYm9sZDogNTAwOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tYm9sZDogNjAwOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tcmVkaGF0Zm9udC0tYm9sZDogNzAwOyAtLXBmLWdsb2JhbC0tTGluZUhlaWdodC0tc206IDEuMzsgLS1wZi1nbG9iYWwtLUxpbmVIZWlnaHQtLW1kOiAxLjU7IC0tcGYtZ2xvYmFsLS1MaXN0U3R5bGU6IGRpc2Mgb3V0c2lkZTsgLS1wZi1nbG9iYWwtLVRyYW5zaXRpb246IGFsbCAyNTBtcyBjdWJpYy1iZXppZXIoMC40MiwgMCwgMC41OCwgMSk7IC0tcGYtZ2xvYmFsLS1UaW1pbmdGdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNjQ1LCAwLjA0NSwgMC4zNTUsIDEpOyAtLXBmLWdsb2JhbC0tVHJhbnNpdGlvbkR1cmF0aW9uOiAyNTBtczsgLS1wZi1nbG9iYWwtLWFycm93LS13aWR0aDogMC45Mzc1cmVtOyAtLXBmLWdsb2JhbC0tYXJyb3ctLXdpZHRoLWxnOiAxLjU2MjVyZW07IC0tcGYtZ2xvYmFsLS10YXJnZXQtc2l6ZS0tTWluV2lkdGg6IDQ0cHg7IC0tcGYtZ2xvYmFsLS10YXJnZXQtc2l6ZS0tTWluSGVpZ2h0OiA0NHB4OyB9CgoucGYtbS1yZWRoYXQtZm9udCB7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1zYW5zLXNlcmlmOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRGYW1pbHktLXJlZGhhdGZvbnQtLXNhbnMtc2VyaWYpOyAtLXBmLWdsb2JhbC0tRm9udEZhbWlseS0taGVhZGluZy0tc2Fucy1zZXJpZjogdmFyKC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1oZWFkaW5nLS1zYW5zLXNlcmlmKTsgLS1wZi1nbG9iYWwtLUZvbnRGYW1pbHktLW1vbm9zcGFjZTogdmFyKC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1tb25vc3BhY2UpOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tc2VtaS1ib2xkOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLXJlZGhhdGZvbnQtLWJvbGQpOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tYm9sZDogdmFyKC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1yZWRoYXRmb250LS1ib2xkKTsgLS1wZi1nbG9iYWwtLWxpbmstLUZvbnRXZWlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tbm9ybWFsKTsgfQoKaHRtbCwgYm9keSwgcCwgb2wsIHVsLCBsaSwgZGwsIGR0LCBkZCwgYmxvY2txdW90ZSwgZmlndXJlLCBmaWVsZHNldCwgbGVnZW5kLCB0ZXh0YXJlYSwgcHJlLCBpZnJhbWUsIGhyLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsgcGFkZGluZzogMDsgbWFyZ2luOiAwOyB9CgpodG1sLCBib2R5IHsgaGVpZ2h0OiAxMDAlOyB9CgpoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsgZm9udC1zaXplOiAxMDAlOyBmb250LXdlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1ub3JtYWwpOyB9Cgp1bCB7IGxpc3Qtc3R5bGU6IG5vbmU7IH0KCmJ1dHRvbiwgaW5wdXQsIG9wdGdyb3VwLCBzZWxlY3QsIHRleHRhcmVhIHsgbWFyZ2luOiAwOyBmb250LWZhbWlseTogaW5oZXJpdDsgZm9udC1zaXplOiAxMDAlOyBsaW5lLWhlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1MaW5lSGVpZ2h0LS1tZCk7IGNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS0xMDApOyB9CgppbWcsIGVtYmVkLCBpZnJhbWUsIG9iamVjdCwgYXVkaW8sIHZpZGVvIHsgbWF4LXdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87IH0KCmlmcmFtZSB7IGJvcmRlcjogMDsgfQoKdGFibGUgeyBib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfQoKdGQsIHRoIHsgcGFkZGluZzogMDsgdGV4dC1hbGlnbjogbGVmdDsgfQoKKiwgKjo6YmVmb3JlLCAqOjphZnRlciB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0KCmh0bWwgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgbGluZS1oZWlnaHQ6IDEuMTU7IH0KCmJvZHkgeyBmb250LWZhbWlseTogdmFyKC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1zYW5zLXNlcmlmKTsgZm9udC1zaXplOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRTaXplLS1tZCk7IGZvbnQtd2VpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLW5vcm1hbCk7IGxpbmUtaGVpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLUxpbmVIZWlnaHQtLW1kKTsgdGV4dC1hbGlnbjogbGVmdDsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLTEwMCk7IH0KCmEgeyBmb250LXdlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1saW5rLS1Gb250V2VpZ2h0KTsgY29sb3I6IHZhcigtLXBmLWdsb2JhbC0tbGluay0tQ29sb3IpOyB0ZXh0LWRlY29yYXRpb246IHZhcigtLXBmLWdsb2JhbC0tbGluay0tVGV4dERlY29yYXRpb24pOyB9CmE6aG92ZXIgeyAtLXBmLWdsb2JhbC0tbGluay0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tbGluay0tQ29sb3ItLWhvdmVyKTsgLS1wZi1nbG9iYWwtLWxpbmstLVRleHREZWNvcmF0aW9uOiB2YXIoLS1wZi1nbG9iYWwtLWxpbmstLVRleHREZWNvcmF0aW9uLS1ob3Zlcik7IH0KCmJ1dHRvbiwgYSB7IGN1cnNvcjogcG9pbnRlcjsgfQoKYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLCBbdHlwZT0iYnV0dG9uIl06Oi1tb3otZm9jdXMtaW5uZXIsIFt0eXBlPSJyZXNldCJdOjotbW96LWZvY3VzLWlubmVyLCBbdHlwZT0ic3VibWl0Il06Oi1tb3otZm9jdXMtaW5uZXIgeyBwYWRkaW5nOiAwOyBib3JkZXItc3R5bGU6IG5vbmU7IH0KYnV0dG9uOi1tb3otZm9jdXNyaW5nLCBbdHlwZT0iYnV0dG9uIl06LW1vei1mb2N1c3JpbmcsIFt0eXBlPSJyZXNldCJdOi1tb3otZm9jdXNyaW5nLCBbdHlwZT0ic3VibWl0Il06LW1vei1mb2N1c3JpbmcgeyBvdXRsaW5lOiAxcHggZG90dGVkIEJ1dHRvblRleHQ7IH0KCi5wZi1jLWxvZ2luIHsgLS1wZi1jLWxvZ2luLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbGcpOyAtLXBmLWMtbG9naW4tLVBhZGRpbmdCb3R0b206IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1sZyk7IC0tcGYtYy1sb2dpbi0teGwtLUJhY2tncm91bmRJbWFnZTogbm9uZTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLXhsLS1HcmlkQ29sdW1uR2FwOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tM3hsKTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLU1heFdpZHRoOiAzMS4yNXJlbTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLXhsLS1NYXhXaWR0aDogbm9uZTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLVBhZGRpbmdMZWZ0OiA2LjEyNXJlbTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLVBhZGRpbmdSaWdodDogNi4xMjVyZW07IC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS14bC0tR3JpZFRlbXBsYXRlQ29sdW1uczogMzRyZW0gbWlubWF4KGF1dG8sIDM0cmVtKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLXNtLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLXNtLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9faGVhZGVyLS14bC0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLXhsLS1NYXJnaW5Ub3A6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS0zeGwpOyAtLXBmLWMtbG9naW5fX2hlYWRlci0tYy1icmFuZC0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbGcpOyAtLXBmLWMtbG9naW5fX2hlYWRlci0tYy1icmFuZC0teGwtLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWxvZ2luX19tYWluLS14bC0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbGcpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUGFkZGluZ1JpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teGwpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXhsKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tbWQtLVBhZGRpbmdSaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLW1kLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLUNvbHVtbkdhcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUm93R2FwOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MtLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci1kZXNjLS1tZC0tTWFyZ2luQm90dG9tOiAwOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MtLUZvbnRTaXplOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRTaXplLS1zbSk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS14bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teGwpOyAtLXBmLWMtbG9naW5fX21haW4tYm9keS0tUGFkZGluZ0xlZnQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS14bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1tZC0tUGFkZGluZ1JpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgLS1wZi1jLWxvZ2luX19tYWluLWJvZHktLW1kLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1jLWZvcm1fX2hlbHBlci10ZXh0LWljb24tLUZvbnRTaXplOiB2YXIoLS1wZi1nbG9iYWwtLWljb24tLUZvbnRTaXplLS1tZCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1jLWZvcm1fX2hlbHBlci10ZXh0LWljb24tLU1hcmdpblJpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tc20pOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tM3hsKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci0tYy10aXRsZS0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tc20pOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS0zeGwpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teGwpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTN4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS0tUGFkZGluZ1JpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tLVBhZGRpbmdMZWZ0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1GaWxsOiB2YXIoLS1wZi1nbG9iYWwtLWljb24tLUNvbG9yLS1saWdodCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS1saW5rLXN2Zy0tV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0taWNvbi0tRm9udFNpemUtLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1IZWlnaHQ6IHZhcigtLXBmLWdsb2JhbC0taWNvbi0tRm9udFNpemUtLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1ob3Zlci0tRmlsbDogdmFyKC0tcGYtZ2xvYmFsLS1pY29uLS1Db2xvci0tZGFyayk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ1RvcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ0JvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS0zMDApOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtaXRlbS0tUGFkZGluZ1RvcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19mb290ZXItLXNtLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19mb290ZXItLXNtLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1jLWxpc3QtLVBhZGRpbmdUb3A6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1jLWxpc3QtLXhsLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IG1pbi1oZWlnaHQ6IDEwMHZoOyBwYWRkaW5nLXRvcDogdmFyKC0tcGYtYy1sb2dpbi0tUGFkZGluZ1RvcCk7IHBhZGRpbmctYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luLS1QYWRkaW5nQm90dG9tKTsgfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWxvZ2luIHsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLU1heFdpZHRoOiB2YXIoLS1wZi1jLWxvZ2luX19jb250YWluZXItLXhsLS1NYXhXaWR0aCk7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWxvZ2luIHsgLS1wZi1jLWxvZ2luX19oZWFkZXItLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtYy1sb2dpbl9faGVhZGVyLS14bC0tTWFyZ2luQm90dG9tKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLWMtYnJhbmQtLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtYy1sb2dpbl9faGVhZGVyLS1jLWJyYW5kLS14bC0tTWFyZ2luQm90dG9tKTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbiB7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLVBhZGRpbmdSaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLW1kLS1QYWRkaW5nUmlnaHQpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLW1kLS1QYWRkaW5nTGVmdCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItZGVzYy0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci1kZXNjLS1tZC0tTWFyZ2luQm90dG9tKTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbiB7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tbWQtLVBhZGRpbmdSaWdodCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1tZC0tUGFkZGluZ0xlZnQpOyB9IH0KQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgeyAucGYtYy1sb2dpbiB7IC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1jLWxpc3QtLVBhZGRpbmdUb3A6IHZhcigtLXBmLWMtbG9naW5fX2Zvb3Rlci0tYy1saXN0LS14bC0tUGFkZGluZ1RvcCk7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWxvZ2luIHsgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcGYtYy1sb2dpbi0teGwtLUJhY2tncm91bmRJbWFnZSk7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpIHsgLnBmLWMtbG9naW4geyBhbGlnbi1pdGVtczogY2VudGVyOyB9IH0KCi5wZi1jLWxvZ2luX19jb250YWluZXIgeyBtYXgtd2lkdGg6IHZhcigtLXBmLWMtbG9naW5fX2NvbnRhaW5lci0tTWF4V2lkdGgpOyB9CkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsgLnBmLWMtbG9naW5fX2NvbnRhaW5lciB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtY29sdW1uLWdhcDogdmFyKC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS14bC0tR3JpZENvbHVtbkdhcCk7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogdmFyKC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS14bC0tR3JpZFRlbXBsYXRlQ29sdW1ucyk7IGdyaWQtdGVtcGxhdGUtYXJlYXM6ICJtYWluIGhlYWRlciIgIm1haW4gZm9vdGVyIiAibWFpbiAuIjsgcGFkZGluZy1yaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS1QYWRkaW5nUmlnaHQpOyBwYWRkaW5nLWxlZnQ6IHZhcigtLXBmLWMtbG9naW5fX2NvbnRhaW5lci0tUGFkZGluZ0xlZnQpOyB9IH0KCi5wZi1jLWxvZ2luX19oZWFkZXIgeyBjb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgZ3JpZC1hcmVhOiBoZWFkZXI7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDU3NnB4KSB7IC5wZi1jLWxvZ2luX19oZWFkZXIgeyBwYWRkaW5nLXJpZ2h0OiB2YXIoLS1wZi1jLWxvZ2luX19oZWFkZXItLXNtLS1QYWRkaW5nUmlnaHQpOyBwYWRkaW5nLWxlZnQ6IHZhcigtLXBmLWMtbG9naW5fX2hlYWRlci0tc20tLVBhZGRpbmdMZWZ0KTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsgLnBmLWMtbG9naW5fX2hlYWRlciB7IG1hcmdpbi10b3A6IHZhcigtLXBmLWMtbG9naW5fX2hlYWRlci0teGwtLU1hcmdpblRvcCk7IH0gfQoucGYtYy1sb2dpbl9faGVhZGVyIC5wZi1jLWJyYW5kIHsgbWFyZ2luLWJvdHRvbTogdmFyKC0tcGYtYy1sb2dpbl9faGVhZGVyLS1jLWJyYW5kLS1NYXJnaW5Cb3R0b20pOyB9CgoucGYtYy1sb2dpbl9fbWFpbiB7IGdyaWQtYXJlYTogbWFpbjsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1sb2dpbl9fbWFpbiA+IDpmaXJzdC1jaGlsZDpub3QoLnBmLWMtbG9naW5fX21haW4taGVhZGVyKSB7IHBhZGRpbmctdG9wOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUGFkZGluZ1RvcCk7IH0KLnBmLWMtbG9naW5fX21haW4gPiA6bGFzdC1jaGlsZDpub3QoLnBmLWMtbG9naW5fX21haW4tZm9vdGVyKSB7IHBhZGRpbmctYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci0tUGFkZGluZ0JvdHRvbSk7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDEyMDBweCkgeyAucGYtYy1sb2dpbl9fbWFpbiB7IG1hcmdpbi1ib3R0b206IHZhcigtLXBmLWMtbG9naW5fX21haW4tLXhsLS1NYXJnaW5Cb3R0b20pOyB9IH0KCi5wZi1jLWxvZ2luX19tYWluLWhlYWRlciB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIGF1dG87IGNvbHVtbi1nYXA6IHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1Db2x1bW5HYXApOyByb3ctZ2FwOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUm93R2FwKTsgYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZzogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLVBhZGRpbmdUb3ApIHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nUmlnaHQpIHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nQm90dG9tKSB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUGFkZGluZ0xlZnQpOyB9CkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbl9fbWFpbi1oZWFkZXIgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDEwMCU7IH0gfQoucGYtYy1sb2dpbl9fbWFpbi1oZWFkZXIgLnBmLWMtZHJvcGRvd24geyBncmlkLWNvbHVtbjogMiAvIDM7IGdyaWQtcm93OiAxOyB9CkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbl9fbWFpbi1oZWFkZXIgLnBmLWMtZHJvcGRvd24geyBncmlkLWNvbHVtbjogYXV0bzsgZ3JpZC1yb3c6IGF1dG87IH0gfQoKLnBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MgeyBtYXJnaW4tYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci1kZXNjLS1NYXJnaW5Cb3R0b20pOyBmb250LXNpemU6IHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MtLUZvbnRTaXplKTsgZ3JpZC1jb2x1bW46IDEgLyAtMTsgfQoKLnBmLWMtbG9naW5fX21haW4tYm9keSB7IHBhZGRpbmctcmlnaHQ6IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tUGFkZGluZ1JpZ2h0KTsgcGFkZGluZy1ib3R0b206IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tUGFkZGluZ0JvdHRvbSk7IHBhZGRpbmctbGVmdDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nTGVmdCk7IH0KLnBmLWMtbG9naW5fX21haW4tYm9keSAucGYtYy1mb3JtX19oZWxwZXItdGV4dCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KLnBmLWMtbG9naW5fX21haW4tYm9keSAucGYtYy1mb3JtX19oZWxwZXItdGV4dCAucGYtYy1mb3JtX19oZWxwZXItdGV4dC1pY29uIHsgbWFyZ2luLXJpZ2h0OiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWJvZHktLWMtZm9ybV9faGVscGVyLXRleHQtaWNvbi0tTWFyZ2luUmlnaHQpOyBmb250LXNpemU6IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tYy1mb3JtX19oZWxwZXItdGV4dC1pY29uLS1Gb250U2l6ZSk7IH0KCi5wZi1jLWxvZ2luX19tYWluLWZvb3RlciB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgfQoucGYtYy1sb2dpbl9fbWFpbi1mb290ZXIgLnBmLWMtdGl0bGUgeyBtYXJnaW4tYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci0tYy10aXRsZS0tTWFyZ2luQm90dG9tKTsgdGV4dC1hbGlnbjogY2VudGVyOyB9Ci5wZi1jLWxvZ2luX19tYWluLWZvb3RlciA+ICogeyBmbGV4LWJhc2lzOiAxMDAlOyB9CgoucGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBwYWRkaW5nOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy0tUGFkZGluZ1RvcCkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtLVBhZGRpbmdSaWdodCkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtLVBhZGRpbmdCb3R0b20pIHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nTGVmdCk7IH0KCi5wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtIHsgcGFkZGluZy1yaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS0tUGFkZGluZ1JpZ2h0KTsgcGFkZGluZy1sZWZ0OiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLS1QYWRkaW5nTGVmdCk7IG1hcmdpbi1ib3R0b206IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tLU1hcmdpbkJvdHRvbSk7IH0KCi5wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmsgc3ZnIHsgZmlsbDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS1saW5rLXN2Zy0tRmlsbCk7IHdpZHRoOiAxMDAlOyBtYXgtd2lkdGg6IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tbGluay1zdmctLVdpZHRoKTsgaGVpZ2h0OiAxMDAlOyBtYXgtaGVpZ2h0OiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1IZWlnaHQpOyB9Ci5wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbms6aG92ZXIgc3ZnIHsgZmlsbDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS1saW5rLXN2Zy0taG92ZXItLUZpbGwpOyB9CgoucGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZCB7IHBhZGRpbmc6IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtLVBhZGRpbmdUb3ApIHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtLVBhZGRpbmdSaWdodCkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ0JvdHRvbSkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ0xlZnQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQgPiAqICsgKiB7IHBhZGRpbmctdG9wOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLWl0ZW0tLVBhZGRpbmdUb3ApOyB9CgoucGYtYy1sb2dpbl9fZm9vdGVyIHsgY29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IGdyaWQtYXJlYTogZm9vdGVyOyB9CkBtZWRpYSAobWF4LXdpZHRoOiA1NzZweCkgeyAucGYtYy1sb2dpbl9fZm9vdGVyIHsgcGFkZGluZy1yaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1zbS0tUGFkZGluZ1JpZ2h0KTsgcGFkZGluZy1sZWZ0OiB2YXIoLS1wZi1jLWxvZ2luX19mb290ZXItLXNtLS1QYWRkaW5nTGVmdCk7IH0gfQoucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWxpc3QgYSB7IGNvbG9yOiB1bnNldDsgfQoucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWxpc3Q6bm90KDpvbmx5LWNoaWxkKSB7IHBhZGRpbmctdG9wOiB2YXIoLS1wZi1jLWxvZ2luX19mb290ZXItLWMtbGlzdC0tUGFkZGluZ1RvcCk7IH0KCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay0xMDApOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREkwTGpBdU1pd2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SWt4aGVXVnlYekVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZUcxc2JuTTZlR3hwYm1zOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2ZUd4cGJtc2lJSGc5SWpCd2VDSWdlVDBpTUhCNElnb0pJSGRwWkhSb1BTSXhPVEp3ZUNJZ2FHVnBaMmgwUFNJeE5EVndlQ0lnZG1sbGQwSnZlRDBpTUNBd0lERTVNaUF4TkRVaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURFNU1pQXhORFU3SWlCNGJXdzZjM0JoWTJVOUluQnlaWE5sY25abElqNEtQSE4wZVd4bElIUjVjR1U5SW5SbGVIUXZZM056SWo0S0NTNXpkREI3Wm1sc2JEb2pNREl3TXpBek8zMEtQQzl6ZEhsc1pUNEtQR2MrQ2drOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NVEkzTGpVc09ETXVOV014TWk0MUxEQXNNekF1TmkweUxqWXNNekF1TmkweE55NDFZekF0TVM0eUxEQXRNaTR6TFRBdU15MHpMalJzTFRjdU5DMHpNaTQwWXkweExqY3ROeTR4TFRNdU1pMHhNQzR6TFRFMUxqY3RNVFl1TmdvSkNXTXRPUzQzTFRVdE16QXVPQzB4TXk0eExUTTNMakV0TVRNdU1VTTVNUzQzTERBdU5TdzVNQ3c0TERnekxqRXNPR010Tmk0M0xEQXRNVEV1TmkwMUxqWXRNVGN1T1MwMUxqWmpMVFlzTUMwNUxqa3NOQzR4TFRFeUxqa3NNVEl1TldNd0xEQXRPQzQwTERJekxqY3RPUzQxTERJM0xqSUtDUWxqTFRBdU1pd3dMall0TUM0eUxERXVOQzB3TGpJc01TNDVRelF5TGpVc05UTXVNeXczT0M0NExEZ3pMalVzTVRJM0xqVXNPRE11TlNCTk1UWXdMRGN5TGpGak1TNDNMRGd1TWl3eExqY3NPUzR4TERFdU55d3hNQzR4WXpBc01UUXRNVFV1Tnl3eU1TNDRMVE0yTGpRc01qRXVPQW9KQ1dNdE5EWXVPQ3d3TFRnM0xqY3RNamN1TkMwNE55NDNMVFExTGpWak1DMHlMamdzTUM0MkxUVXVOQ3d4TGpVdE55NHpRekl5TGpNc05USXNNQzQxTERVMUxEQXVOU3czTkM0eVl6QXNNekV1TlN3M05DNDJMRGN3TGpNc01UTXpMamNzTnpBdU13b0pDV00wTlM0ekxEQXNOVFl1TnkweU1DNDFMRFUyTGpjdE16WXVOa014T1RBdU9DdzVOUzR4TERFM09TNDVMRGd3TGpjc01UWXdMRGN5TGpFaUx6NEtQQzluUGdvOEwzTjJaejRLKTsgYmFja2dyb3VuZC1wb3NpdGlvbjogMTEwJSAxMDUlOyBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXNpemU6IDkwJTsgfQpAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHsgYm9keSB7IGJhY2tncm91bmQtc2l6ZTogODAlOyB9IH0KQG1lZGlhIChtaW4td2lkdGg6IDEwMDBweCkgeyBib2R5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMTEwJSAxMDAlOyBiYWNrZ3JvdW5kLXNpemU6IDcwJTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsgYm9keSB7IGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgNzAlOyBiYWNrZ3JvdW5kLXNpemU6IDcwJTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAxNDAwcHgpIHsgYm9keSB7IGJhY2tncm91bmQtc2l6ZTogNzUlOyB9IH0KQG1lZGlhIChtaW4td2lkdGg6IDE4MDBweCkgeyBib2R5IHsgYmFja2dyb3VuZC1zaXplOiA3MCU7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogMTgwMHB4KSB7IGJvZHkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA3NSUgODAlOyBiYWNrZ3JvdW5kLXNpemU6IDYwJTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAyMjAwcHgpIHsgYm9keSB7IGJhY2tncm91bmQtc2l6ZTogNTAlOyB9IH0KCkBtZWRpYSAobWF4LXdpZHRoOiAxMTk5cHgpIHsgLnBmLWMtbG9naW5fX2NvbnRhaW5lciB7IHdpZHRoOiAxMDAlOyB9IH0KLnBmLWMtbG9naW5fX21haW4tYm9keSB7IHBhZGRpbmctYm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKSAhaW1wb3J0YW50OyB9CgpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWJyYW5kIHsgaGVpZ2h0OiA2MHB4OyB9IH0KLnBmLW0tZXJyb3JfX2ljb24geyBtYXJnaW4tcmlnaHQ6IDVweDsgfQoKLnBmLWMtZm9ybV9faGVscGVyLXRleHQucGYtbS1lcnJvciB7IGNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWRhbmdlci1jb2xvci0tMTAwKTsgfQoKICAgIDwvc3R5bGU+CiAgPC9oZWFkPgoKICA8Ym9keSBjbGFzcz0icGYtbS1yZWRoYXQtZm9udCI+CiAgICA8ZGl2IGNsYXNzPSJwZi1jLWxvZ2luIj4KICAgICAgPGRpdiBjbGFzcz0icGYtYy1sb2dpbl9fY29udGFpbmVyIj4KICAgICAgICA8aGVhZGVyIGNsYXNzPSJwZi1jLWxvZ2luX19oZWFkZXIiPgogICAgICAgICAgPGltZyBzcmM9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0S1BDRXRMU0JIWlc1bGNtRjBiM0k2SUVGa2IySmxJRWxzYkhWemRISmhkRzl5SURJMExqRXVNQ3dnVTFaSElFVjRjRzl5ZENCUWJIVm5MVWx1SUM0Z1UxWkhJRlpsY25OcGIyNDZJRFl1TURBZ1FuVnBiR1FnTUNrZ0lDMHRQZ284YzNabklIWmxjbk5wYjI0OUlqRXVNU0lnYVdROUlreHZaMjl6SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSUtDU0IzYVdSMGFEMGlNekl3Y0hnaUlHaGxhV2RvZEQwaU5EY3VObkI0SWlCMmFXVjNRbTk0UFNJd0lEQWdNekl3SURRM0xqWWlJSE4wZVd4bFBTSmxibUZpYkdVdFltRmphMmR5YjNWdVpEcHVaWGNnTUNBd0lETXlNQ0EwTnk0Mk95SWdlRzFzT25Od1lXTmxQU0p3Y21WelpYSjJaU0krQ2p4emRIbHNaU0IwZVhCbFBTSjBaWGgwTDJOemN5SStDZ2t1YzNRd2UyWnBiR3c2STBaR1JrWkdSanQ5Q2drdWMzUXhlMlpwYkd3NkkwVkZNREF3TUR0OUNqd3ZjM1I1YkdVK0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazAxTWk0eExEUXpMalpqTFRRdU1pd3dMVGN1TlMwekxqTXROeTQxTFRjdU5YTXpMak10Tnk0MUxEY3VOUzAzTGpWek55NDJMRE11TXl3M0xqWXNOeTQxVXpVMkxqTXNORE11Tml3MU1pNHhMRFF6TGpaNklFMDFNaTR4TERNd0xqWUtDV010TXl3d0xUVXVNeXd5TGpRdE5TNHpMRFV1TlhNeUxqTXNOUzQxTERVdU15dzFMalZqTXl3d0xEVXVNeTB5TGpRc05TNHpMVFV1TlZNMU5TNHhMRE13TGpZc05USXVNU3d6TUM0MmVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk5qRXVOeXd6TWk0NGFESjJNV013TGprdE1DNDRMREl0TVM0eUxETXVNaTB4TGpKak15d3dMRFV1TXl3eUxqUXNOUzR6TERVdU5ITXRNaTR6TERVdU5DMDFMalFzTlM0MFl5MHhMakVzTUMweUxqTXRNQzQwTFRNdU1pMHhkalV1TW1ndE1pNHhDZ2xNTmpFdU55d3pNaTQ0ZWlCTk5qTXVPQ3d6TlM0M2RqUXVPR013TGpjc01DNDRMREV1T0N3eExqSXNNaTQ1TERFdU1tTXlMREFzTXk0MkxURXVOaXd6TGpZdE15NDJZekF0TWk0eExURXVOaTB6TGpZdE15NDJMVE11TmtNMk5TNDFMRE0wTGpRc05qUXVOQ3d6TkM0NUxEWXpMamdzTXpVdU4zb2lMejRLUEhCaGRHZ2dZMnhoYzNNOUluTjBNQ0lnWkQwaVRUYzVMalFzTkRNdU5XTXRNeTR4TERBdE5TNDFMVEl1TkMwMUxqVXROUzQxWXpBdE15d3lMak10TlM0MExEVXVNeTAxTGpSak1pNDVMREFzTlM0eExESXVOQ3cxTGpFc05TNDFkakF1Tm1ndE9DNHpZekF1TXl3eExqZ3NNUzQ0TERNc015NDJMRE1LQ1dNeExEQXNNUzQ1TFRBdU15d3lMamN0TUM0NWJERXVNeXd4TGpORE9ESXVNeXcwTXk0eExEZ3dMamdzTkRNdU5TdzNPUzQwTERRekxqVjZJRTAzTlM0NUxETTNMakpvTmk0ell5MHdMak10TVM0MkxURXVOaTB5TGpndE15NHhMVEl1T0FvSlF6YzNMalVzTXpRdU5DdzNOaTR5TERNMUxqVXNOelV1T1N3ek55NHllaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5PRFl1TWl3ek1pNDRhREl1TVhZeExqRmpNQzQ0TFRBdU9Dd3lMVEV1TXl3ekxqSXRNUzR6WXpJdU5Dd3dMRFF1TVN3eExqY3NOQzR4TERRdU1YWTJMalpvTFRJdU1WWXpOMk13TFRFdU55MHhMVEl1TnkweUxqWXRNaTQzQ2dsakxURXVNU3d3TFRJc01DNDFMVEl1Tml3eExqUjJOeTQyYUMweUxqRk1PRFl1TWl3ek1pNDRlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5PVGd1TWl3ek9TNDBZekV1Tml3eExqVXNNeTR5TERJdU15dzFMREl1TTJNeUxqRXNNQ3d6TGpVdE1Td3pMalV0TWk0MFl6QXRNUzR6TFRBdU9DMHhMamt0TWk0NUxUSXVNMnd0TWk0MExUQXVOR010TWk0M0xUQXVOQzAwTFRFdU55MDBMVE11T0FvSll6QXRNaTQxTERJdU1TMDBMaklzTlM0ekxUUXVNbU15TGpFc01DdzBMaklzTUM0M0xEVXVPQ3d5YkMweExqSXNNUzQzWXkweExqWXRNUzR5TFRNdU1TMHhMamd0TkM0M0xURXVPR010TVM0NUxEQXRNeTR4TERBdU9TMHpMakVzTWk0eVl6QXNNUzR5TERBdU55d3hMamNzTWk0MkxESXVNUW9KYkRJdU15d3dMalJqTXk0eExEQXVOU3cwTGpVc01TNDRMRFF1TlN3MFl6QXNNaTQzTFRJdU15dzBMalV0TlM0NExEUXVOV010TWk0ekxEQXROQzQyTFRBdU9TMDJMakl0TWk0MlREazRMaklzTXprdU5Ib2lMejRLUEhCaGRHZ2dZMnhoYzNNOUluTjBNQ0lnWkQwaVRURXhNQzQyTERJNExqaHNNaTR4TFRBdU5YWTFMalZqTUM0NExUQXVPQ3d5TFRFdU15d3pMakl0TVM0ell6SXVOQ3d3TERRdU1Td3hMamNzTkM0eExEUXVNWFkyTGpab0xUSXVNVll6TjJNd0xURXVOeTB4TFRJdU55MHlMall0TWk0M0NnbGpMVEVzTUMweUxEQXVOUzB5TGpZc01TNDBkamN1Tm1ndE1pNHhWakk0TGpoNklpOCtDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweE1qSXVNU3d5T1M0NFl6QXRNQzQzTERBdU5pMHhMak1zTVM0ekxURXVNMk13TERBc01Dd3dMREFzTUdNd0xqY3NNQ3d4TGpNc01DNDFMREV1TXl3eExqSmpNQ3d3TGpjdE1DNDFMREV1TXkweExqSXNNUzR6WXpBc01DMHdMakVzTUMwd0xqRXNNQW9KUXpFeU1pNDNMRE14TGpFc01USXlMakVzTXpBdU5Td3hNakl1TVN3eU9TNDRRekV5TWk0eExESTVMamdzTVRJeUxqRXNNamt1T0N3eE1qSXVNU3d5T1M0NGVpQk5NVEkwTGpRc05ETXVNMmd0TWk0eFZqTXlMamhvTWk0eFZqUXpMak42SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB4TWpndU5Dd3pNaTQ0ZGkweExqWmpNQzB5TGpJc01TNHpMVE11TkN3ekxqWXRNeTQwWXpBdU5Td3dMREVzTUM0eExERXVOU3d3TGpKMk1TNDRZeTB3TGpRdE1DNHhMVEF1T1Mwd0xqSXRNUzR6TFRBdU1nb0pZeTB4TGpFc01DMHhMamNzTUM0MUxURXVOeXd4TGpaMk1TNDJhRE4yTVM0M2FDMHpkamd1T0dndE1pNHhkaTA0TGpoSU1USTJkaTB4TGpkSU1USTRMalI2SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB4TXpZdU55d3pOQzQxYUMweUxqSjJMVEV1TjJneUxqSjJMVEl1TjJ3eUxUQXVOWFl6TGpKb015NHhkakV1TjJndE15NHhkalV1TjJNd0xERXVNU3d3TGpRc01TNDFMREV1Tml3eExqVmpNQzQxTERBc01TMHdMakVzTVM0MUxUQXVNbll4TGpjS0NXTXRNQzQyTERBdU1pMHhMak1zTUM0ekxUSXNNQzR6WXkweUxqRXNNQzB6TGpFdE1TMHpMakV0TWk0NFRERXpOaTQzTERNMExqVjZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHhOVGt1Tml3ME1DNHhiREVzTVM0eFl5MHhMalVzTVM0MUxUTXVOaXd5TGpRdE5TNDNMREl1TkdNdE5DNHhMREF1TVMwM0xqVXRNeTR5TFRjdU5pMDNMalJqTFRBdU1TMDBMakVzTXk0eUxUY3VOU3czTGpRdE55NDJDZ2xqTUM0eExEQXNNQzR5TERBc01DNHlMREJqTWk0ekxEQXNOQzR6TERBdU9TdzFMamNzTWk0MGJDMHhMakVzTVM0eFl5MHhMakl0TVM0ekxUSXVPUzB5TFRRdU55MHlZeTB6TGpRc01DMDFMamtzTWk0MkxUVXVPU3cyWXpBc015NDBMREl1Tml3MkxEWXNOZ29KUXpFMU5pNDNMRFF5TGpFc01UVTRMalVzTkRFdU15d3hOVGt1Tml3ME1DNHhlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NVFkzTGpFc016SXVOMk15TGprc01DdzFMak1zTWk0MExEVXVNeXcxTGpSekxUSXVNeXcxTGpRdE5TNHpMRFV1TkhNdE5TNHpMVEl1TkMwMUxqTXROUzQwVXpFMk5DNHlMRE15TGpjc01UWTNMakVzTXpJdU4zb2dUVEUzTUM0NUxETTRMakVLQ1dNd0xUSXVNeTB4TGpjdE5DMHpMamd0TkdNdE1pNHhMREF0TXk0NExERXVPQzB6TGpnc05HTXdMREl1TXl3eExqY3NOQ3d6TGpnc05GTXhOekF1T1N3ME1DNDBMREUzTUM0NUxETTRMakZNTVRjd0xqa3NNemd1TVhvaUx6NEtQSEJoZEdnZ1kyeGhjM005SW5OME1DSWdaRDBpVFRFM05DNDJMRE15TGpsb01TNDFkakV1TW1Nd0xqZ3RNU3d4TGprdE1TNDBMRE11TXkweExqUmpNaTQwTERBc05Dd3hMallzTkN3MGRqWXVObWd0TVM0MWRpMDJMak5qTUMweExqZ3RNUzR4TFRNdE1pNDVMVE1LQ1dNdE1TNHlMREF0TWk0ekxEQXVOaTB5TGprc01TNDJkamN1Tm1ndE1TNDFUREUzTkM0MkxETXlMamw2SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB4T0RZdU9Dd3pOQzR6YUMweUxqSjJMVEV1TTJneUxqSjJMVEl1Tm13eExqVXRNQzQwZGpOb015NHhkakV1TTJndE15NHhkall1TkdNd0xERXVNU3d3TGpVc01TNDJMREV1Tml3eExqWmpNQzQxTERBc01TMHdMakVzTVM0MUxUQXVNM1l4TGpNS0NXTXRNQzQyTERBdU1pMHhMaklzTUM0ekxURXVPQ3d3TGpOakxURXVPQ3d3TFRJdU9DMHdMamt0TWk0NExUSXVOVXd4T0RZdU9Dd3pOQzR6ZWlJdlBnbzhjR0YwYUNCamJHRnpjejBpYzNRd0lpQmtQU0pOTVRreUxqVXNOREF1TkdNd0xURXVPU3d4TGpZdE15NHlMRFF1TVMwekxqSmpNUzR4TERBc01pNHhMREF1TWl3ekxEQXVOM1l0TVM0MFl6QXRNUzQzTFRFdE1pNDFMVEl1T0MweUxqVmpMVEVzTUMweUxEQXVNeTB6TGpNc01DNDViQzB3TGpZdE1TNHlDZ2xqTVM0MUxUQXVOeXd5TGpjdE1TdzBMVEZqTWk0MkxEQXNOQzR4TERFdU15dzBMakVzTXk0MmRqZG9MVEV1TlhZdE1XTXRNQzQ1TERBdU9DMHlMakVzTVM0eUxUTXVOQ3d4TGpKRE1UazBMakVzTkRNdU5Td3hPVEl1TlN3ME1pNHlMREU1TWk0MUxEUXdMalI2SUUweE9UWXVOaXcwTWk0ekNnbGpNUzR5TERBc01pNHpMVEF1TkN3ekxqRXRNUzR5ZGkweExqbGpMVEF1T1Mwd0xqWXRNUzQ0TFRBdU9DMHpMVEF1T0dNdE1TNDNMREF0TWk0M0xEQXVPQzB5TGpjc01rTXhPVFFzTkRFdU5Td3hPVFV1TVN3ME1pNHpMREU1Tmk0MkxEUXlMak42SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB5TURNdU5Td3lPUzQ1WXpBdE1DNDJMREF1TlMweExERXRNV013TGpZc01Dd3hMREF1TkN3eExERmpNQ3d3TERBc01Dd3dMREJqTUN3d0xqWXRNQzQxTERFdE1Td3hRekl3TkN3ek1Td3lNRE11TlN3ek1DNDFMREl3TXk0MUxESTVMamw2Q2drZ1RUSXdOUzR6TERRekxqTm9MVEV1TlZZek1pNDVhREV1TlZZME15NHplaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NakEzTGprc016SXVPV2d4TGpWMk1TNHlZekF1T0MweExERXVPUzB4TGpRc015NHpMVEV1TkdNeUxqUXNNQ3cwTERFdU5pdzBMRFIyTmk0MmFDMHhMalYyTFRZdU0yTXdMVEV1T0MweExqRXRNeTB5TGprdE13b0pZeTB4TGpJc01DMHlMak1zTUM0MkxUSXVPU3d4TGpaMk55NDJhQzB4TGpWV016SXVPWG9pTHo0S1BIQmhkR2dnWTJ4aGMzTTlJbk4wTUNJZ1pEMGlUVEl5TkM0eExEUXpMalZqTFRJdU9Td3dMVFV1TXkweUxqTXROUzR6TFRVdU1tTXdMREFzTUMwd0xqRXNNQzB3TGpGak1DMHpMREl1TXkwMUxqTXNOUzR4TFRVdU0yTXlMamdzTUN3MExqa3NNaTQwTERRdU9TdzFMak4yTUM0MWFDMDRMalVLQ1dNd0xqSXNNaXd4TGpnc015NDJMRE11T1N3ekxqWmpNUzR4TERBc01pNHlMVEF1TkN3eUxqa3RNV3d4TERGRE1qSTJMamtzTkRNdU1Td3lNalV1TlN3ME15NDFMREl5TkM0eExEUXpMalY2SUUweU1qQXVOQ3d6Tnk0MGFEWXVPV010TUM0ekxURXVPQzB4TGpjdE15NHpMVE11TkMwekxqTUtDVU15TWpJdU1Td3pOQzR4TERJeU1DNDJMRE0xTGpVc01qSXdMalFzTXpjdU5Fd3lNakF1TkN3ek55NDBlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5Nak14TERNeUxqbG9NUzQxZGpFdU5XTXdMall0TVM0eExERXVOeTB4TGpjc01pNDVMVEV1TjJNd0xqTXNNQ3d3TGpjc01Dd3hMREF1TVhZeExqUmpMVEF1TXkwd0xqRXRNQzQzTFRBdU1pMHhMakV0TUM0eUNnbGpMVEV1TXl3d0xUSXVNeXd3TGpjdE1pNDRMREl1TVhZM0xqRklNak14VERJek1Td3pNaTQ1ZWlJdlBnbzhjR0YwYUNCamJHRnpjejBpYzNRd0lpQmtQU0pOTWpReUxqa3NNamd1T0dnMkxqTmpNaTQ0TERBc05DNDNMREV1Tnl3MExqY3NOQzR5Y3kweExqa3NOQzR5TFRRdU55dzBMakpvTFRRdU4zWTJMakZvTFRFdU5rd3lOREl1T1N3eU9DNDRlaUJOTWpRMExqVXNNekF1TTNZMUxqWm9OQzQyQ2dsak1pd3dMRE11TWkweExqRXNNeTR5TFRJdU9HTXdMVEV1TnkweExqSXRNaTQ0TFRNdU1pMHlMamhNTWpRMExqVXNNekF1TTNvaUx6NEtQSEJoZEdnZ1kyeGhjM005SW5OME1DSWdaRDBpVFRJMU55NDFMRFF6TGpOSU1qVTJWakk0TGpoc01TNDFMVEF1TTFZME15NHplaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NalU1TGpZc05EQXVOR013TFRFdU9Td3hMall0TXk0eUxEUXVNUzB6TGpKak1TNHhMREFzTWk0eExEQXVNaXd6TERBdU4zWXRNUzQwWXpBdE1TNDNMVEV0TWk0MUxUSXVPQzB5TGpWakxURXNNQzB5TERBdU15MHpMak1zTUM0NWJDMHdMall0TVM0eUNnbGpNUzQxTFRBdU55d3lMamN0TVN3MExURmpNaTQyTERBc05DNHhMREV1TXl3MExqRXNNeTQyZGpkb0xURXVOWFl0TVdNdE1DNDVMREF1T0MweUxqRXNNUzR5TFRNdU5Dd3hMakpETWpZeExqRXNORE11TlN3eU5Ua3VOaXcwTWk0eUxESTFPUzQyTERRd0xqUjZJRTB5TmpNdU55dzBNaTR6Q2dsak1TNHlMREFzTWk0ekxUQXVOQ3d6TGpFdE1TNHlkaTB4TGpsakxUQXVPQzB3TGpZdE1TNDRMVEF1T0MwekxUQXVPR010TVM0M0xEQXRNaTQzTERBdU9DMHlMamNzTWtNeU5qRXNOREV1TlN3eU5qSXVNU3cwTWk0ekxESTJNeTQzTERReUxqTjZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHlOekV1Tnl3ek5DNHphQzB5TGpKMkxURXVNMmd5TGpKMkxUSXVObXd4TGpVdE1DNDBkak5vTXk0eGRqRXVNMmd0TXk0eGRqWXVOR013TERFdU1Td3dMalVzTVM0MkxERXVOaXd4TGpaak1DNDFMREFzTVMwd0xqRXNNUzQxTFRBdU0zWXhMak1LQ1dNdE1DNDJMREF1TWkweExqSXNNQzR6TFRFdU9Dd3dMak5qTFRFdU9Dd3dMVEl1T0Mwd0xqa3RNaTQ0TFRJdU5Vd3lOekV1Tnl3ek5DNHplaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NamM1TGpZc016SXVPWFl0TW1Nd0xUSXNNUzR4TFRNdU1Td3pMakl0TXk0eFl6QXVOU3d3TERBdU9Td3dMREV1TkN3d0xqSjJNUzQwWXkwd0xqUXRNQzR4TFRBdU9DMHdMakl0TVM0ekxUQXVNbU10TVM0eUxEQXRNUzQ0TERBdU5pMHhMamdzTVM0NENnbFdNek5vTXk0eGRqRXVNMmd0TXk0eGRqa3VNV2d0TVM0MWRpMDVMakZvTFRJdU5IWXRNUzR6VERJM09TNDJMRE15TGpsNklpOCtDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweU9UQXVNaXd6TWk0M1l6SXVPU3d3TERVdU15d3lMalFzTlM0ekxEVXVOSE10TWk0ekxEVXVOQzAxTGpNc05TNDBjeTAxTGpNdE1pNDBMVFV1TXkwMUxqUkRNamcwTGprc016VXVNU3d5T0RjdU1pd3pNaTQzTERJNU1DNHlMRE15TGpkNkNna2dUVEk1TkN3ek9DNHhZekF0TWk0ekxURXVOeTAwTFRNdU9DMDBZeTB5TGpFc01DMHpMamdzTVM0NExUTXVPQ3cwWXpBc01pNHpMREV1Tnl3MExETXVPQ3cwVXpJNU5DdzBNQzQwTERJNU5Dd3pPQzR4VERJNU5Dd3pPQzR4ZWlJdlBnbzhjR0YwYUNCamJHRnpjejBpYzNRd0lpQmtQU0pOTWprM0xqWXNNekl1T1dneExqVjJNUzQxWXpBdU5pMHhMakVzTVM0M0xURXVOeXd5TGprdE1TNDNZekF1TXl3d0xEQXVOeXd3TERFc01DNHhkakV1TkdNdE1DNHpMVEF1TVMwd0xqY3RNQzR5TFRFdU1TMHdMaklLQ1dNdE1TNHpMREF0TWk0ekxEQXVOeTB5TGpnc01pNHhkamN1TVdndE1TNDFUREk1Tnk0MkxETXlMamw2SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB6TURRdU9Dd3pNaTQ1YURFdU5YWXhMakZqTUM0NExUQXVPU3d4TGprdE1TNDBMRE10TVM0ell6RXVOQ3d3TERJdU5pd3dMamNzTXk0ekxERXVPV013TGpndE1TNHlMREl1TVMweExqa3NNeTQyTFRFdU9XTXlMak1zTUN3ekxqZ3NNUzQyTERNdU9DdzBDZ2wyTmk0MmFDMHhMalYyTFRZdU0yTXdMVEV1T0MweExUTXRNaTQzTFROakxURXVNU3d3TFRJdU1Td3dMall0TWk0NExERXVOMk13TGpFc01DNHpMREF1TVN3d0xqWXNNQzR4TERGMk5pNDJhQzB4TGpWMkxUWXVNMk13TFRFdU9DMHhMVE10TWk0M0xUTmpMVEV1TVN3d0xUSXNNQzQxTFRJdU55d3hMalVLQ1hZM0xqZG9MVEV1TlV3ek1EUXVPQ3d6TWk0NWVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXhJaUJrUFNKTk1qVXVNeXd4Tmk0MVl6SXVOU3d3TERZdU1TMHdMalVzTmk0eExUTXVOV013TFRBdU1pd3dMVEF1TlMwd0xqRXRNQzQzYkMweExqVXROaTQwWXkwd0xqTXRNUzQwTFRBdU5pMHlMakV0TXk0eExUTXVNd29KWXkweExqa3RNUzAyTGpFdE1pNDJMVGN1TkMweUxqWmpMVEV1TWl3d0xURXVOU3d4TGpVdE1pNDVMREV1TldNdE1TNHpMREF0TWk0ekxURXVNUzB6TGpZdE1TNHhZeTB4TGpJc01DMHlMREF1T0MweUxqWXNNaTQxWXpBc01DMHhMamNzTkM0M0xURXVPU3cxTGpRS0NXTXdMREF1TVMwd0xqRXNNQzR6TERBc01DNDBRemd1TkN3eE1DNDFMREUxTGpZc01UWXVOU3d5TlM0ekxERTJMalVnVFRNeExqZ3NNVFF1TTJNd0xqTXNNUzQyTERBdU15d3hMamdzTUM0ekxESmpNQ3d5TGpndE15NHhMRFF1TXkwM0xqTXNOQzR6Q2dsakxUa3VNeXd3TFRFM0xqVXROUzQxTFRFM0xqVXRPUzR4WXpBdE1DNDFMREF1TVMweExEQXVNeTB4TGpWRE5DNHpMREV3TGpNc01Dd3hNQzQ1TERBc01UUXVOMk13TERZdU15d3hOQzQ1TERFMExESTJMallzTVRSak9Td3dMREV4TGpNdE5DNHhMREV4TGpNdE55NHpDZ2xETXpjdU9Td3hPQzQ0TERNMUxqY3NNVFlzTXpFdU9Dd3hOQzR6SWk4K0NqeHdZWFJvSUdROUlrMHpNUzQ0TERFMExqTmpNQzR6TERFdU5pd3dMak1zTVM0NExEQXVNeXd5WXpBc01pNDRMVE11TVN3MExqTXROeTR6TERRdU0yTXRPUzR6TERBdE1UY3VOUzAxTGpVdE1UY3VOUzA1TGpGak1DMHdMalVzTUM0eExURXNNQzR6TFRFdU5Xd3dMamN0TVM0NENnbGpNQ3d3TGpFdE1DNHhMREF1TXl3d0xEQXVOR013TERFdU9DdzNMaklzTnk0NUxERTJMamtzTnk0NVl6SXVOU3d3TERZdU1TMHdMalVzTmk0eExUTXVOV013TFRBdU1pd3dMVEF1TlMwd0xqRXRNQzQzVERNeExqZ3NNVFF1TTNvaUx6NEtQSEJoZEdnZ1kyeGhjM005SW5OME1DSWdaRDBpVFRFeE5TNDBMREU0TGpSak1Dd3lMalFzTVM0MExETXVOU3cwTERNdU5XTXdMamdzTUN3eExqWXRNQzR4TERJdU5DMHdMak4yTFRJdU4yTXRNQzQxTERBdU1pMHhMREF1TWkweExqVXNNQzR5WXkweExqRXNNQzB4TGpVdE1DNHpMVEV1TlMweExqTUtDWFl0TkM0eWFETXVNWFl0TWk0NGFDMHpMakZXTnk0eGJDMHpMalFzTUM0M2RqSXVPV2d0TWk0eWRqSXVPR2d5TGpKTU1URTFMalFzTVRndU5Ib2dUVEV3TkM0NExERTRMalJqTUMwd0xqY3NNQzQzTFRFdU1Td3hMamd0TVM0eFl6QXVOeXd3TERFdU5Dd3dMakVzTWl3d0xqTldNVGtLQ1dNdE1DNDJMREF1TkMweExqUXNNQzQxTFRJdU1Td3dMalZETVRBMUxqVXNNVGt1Tml3eE1EUXVPQ3d4T1M0eExERXdOQzQ0TERFNExqUWdUVEV3TlM0NExESXhMamxqTVM0eUxEQXNNaTR5TFRBdU15d3pMakV0TUM0NWRqQXVOMmd6TGpOMkxUY3VNV013TFRJdU55MHhMamd0TkM0eUxUUXVPUzAwTGpJS0NXTXRNUzQzTERBdE15NDBMREF1TkMwMUxqSXNNUzR5YkRFdU1pd3lMalZqTVM0ekxUQXVOU3d5TGpRdE1DNDVMRE11TkMwd0xqbGpNUzQwTERBc01pNHhMREF1TlN3eUxqRXNNUzQzZGpBdU5XTXRNQzQ0TFRBdU1pMHhMamN0TUM0ekxUSXVOUzB3TGpNS0NXTXRNaTQ1TERBdE5DNDJMREV1TWkwMExqWXNNeTR6UXpFd01TNDRMREl3TGpVc01UQXpMalFzTWpFdU9Td3hNRFV1T0N3eU1TNDVJRTA0Tnk0MExESXhMamhJT1RGV01UWm9OblkxTGpkb015NDJWamN1TVdndE15NDJkalV1Tm1ndE5sWTNMakZvTFRNdU5rdzROeTQwTERJeExqaDZDZ2tnVFRjekxqY3NNVFl1TW1Nd0xURXVOaXd4TGpNdE1pNDRMREl1T1MweUxqaGpNQzQ1TERBc01TNDNMREF1TXl3eUxqTXNNQzQ1ZGpNdU9XTXRNQzQyTERBdU5pMHhMalVzTUM0NUxUSXVNeXd3TGpsRE56VXNNVGtzTnpNdU55d3hOeTQ0TERjekxqY3NNVFl1TWlCTk56a3NNakV1TjJnekxqUldOaTQwQ2dsTU56a3NOeTR4ZGpRdU1tTXRNQzQ1TFRBdU5TMHhMamd0TUM0M0xUSXVPQzB3TGpkakxUTXVNaXd3TFRVdU9Dd3lMalV0TlM0NExEVXVOMk13TERNdU1Td3lMalFzTlM0M0xEVXVOaXcxTGpkak1Dd3dMREF1TVN3d0xEQXVNU3d3WXpFdU1Td3dMREl1TVMwd0xqTXNNeTB4VmpJeExqZDZDZ2tnVFRZekxqWXNNVE11TW1NeExqRXNNQ3d5TERBdU55d3lMak1zTVM0NGFDMDBMalpETmpFdU55d3hNeTQ1TERZeUxqVXNNVE11TWl3Mk15NDJMREV6TGpJZ1RUVTNMamtzTVRZdU1tTXdMRE11TWl3eUxqWXNOUzQzTERZc05TNDNZekV1T1N3d0xETXVNaTB3TGpVc05DNDJMVEV1TjJ3dE1pNHlMVElLQ1dNdE1DNDFMREF1TlMweExqTXNNQzQ0TFRJdU1pd3dMamhqTFRFdU1pd3dMVEl1TXkwd0xqY3RNaTQzTFRFdU9HZzNMamwyTFRBdU9HTXdMVE11TlMweUxqUXROaTR4TFRVdU5pMDJMakZqTFRNdU1Td3dMVFV1Tnl3eUxqVXROUzQ0TERVdU5nb0pRelUzTGprc01UWXVNU3cxTnk0NUxERTJMaklzTlRjdU9Td3hOaTR5SUUwMU1pNHhMREV3TGpKak1TNHlMREFzTVM0NUxEQXVPQ3d4TGprc01TNDNjeTB3TGpjc01TNDNMVEV1T1N3eExqZG9MVE11Tm5ZdE15NHpTRFV5TGpGNklFMDBOQzQ1TERJeExqaG9NeTQyZGkwMUxqTm9NaTQzQ2dsc01pNDRMRFV1TTJnMGJDMHpMakl0TlM0NVl6RXVOeTB3TGpjc01pNDRMVEl1TXl3eUxqZ3ROQzR4WXpBdE1pNDJMVEl1TVMwMExqY3ROUzR5TFRRdU4yZ3ROeTQxVERRMExqa3NNakV1T0hvaUx6NEtQQzl6ZG1jK0NnPT0iIGFsdD0iUmVkIEhhdCBPcGVuU2hpZnQgQ29udGFpbmVyIFBsYXRmb3JtIGxvZ28iIGNsYXNzPSJwZi1jLWJyYW5kIiAvPgoKICAgICAgICA8L2hlYWRlcj4KICAgICAgICA8bWFpbiBjbGFzcz0icGYtYy1sb2dpbl9fbWFpbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwZi1jLWxvZ2luX19tYWluLWJvZHkiPgogICAgICAgICAgICA8cCBjbGFzcz0icGYtYy1mb3JtX19oZWxwZXItdGV4dCBwZi1tLWVycm9yIj4KICAgICAgICAgICAgICA8c3ZnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjotMC4xMjVlbSIgZmlsbD0iY3VycmVudENvbG9yIiBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGFyaWEtaGlkZGVuPSJ0cnVlIiByb2xlPSJpbWciIGNsYXNzPSJwZi1tLWVycm9yX19pY29uIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik01MDQgMjU2YzAgMTM2Ljk5Ny0xMTEuMDQzIDI0OC0yNDggMjQ4UzggMzkyLjk5NyA4IDI1NkM4IDExOS4wODMgMTE5LjA0MyA4IDI1NiA4czI0OCAxMTEuMDgzIDI0OCAyNDh6bS0yNDggNTBjLTI1LjQwNSAwLTQ2IDIwLjU5NS00NiA0NnMyMC41OTUgNDYgNDYgNDYgNDYtMjAuNTk1IDQ2LTQ2LTIwLjU5NS00Ni00Ni00NnptLTQzLjY3My0xNjUuMzQ2bDcuNDE4IDEzNmMuMzQ3IDYuMzY0IDUuNjA5IDExLjM0NiAxMS45ODIgMTEuMzQ2aDQ4LjU0NmM2LjM3MyAwIDExLjYzNS00Ljk4MiAxMS45ODItMTEuMzQ2bDcuNDE4LTEzNmMuMzc1LTYuODc0LTUuMDk4LTEyLjY1NC0xMS45ODItMTIuNjU0aC02My4zODNjLTYuODg0IDAtMTIuMzU2IDUuNzgtMTEuOTgxIDEyLjY1NHoiIHRyYW5zZm9ybT0iIj48L3BhdGg+CiAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAge3sgLkVycm9yIH19CiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvbWFpbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4K +kind: Secret +metadata: + name: oauth-openshift-default-error-template + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_default_login_template_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_default_login_template_secret.yaml new file mode 100644 index 000000000000..960c07bdfd58 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_default_login_template_secret.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + login.html: PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuLXVzIiBkYXRhLXRlc3QtaWQ9ImxvZ2luIj4KICA8aGVhZD4KICAgIDx0aXRsZT4KICAgICAgCiAgICAgICAge3sgLkxvY2FsZS5Mb2dJbiB9fQogICAgICAKICAgICAgIMK3IFJlZCBIYXQgT3BlblNoaWZ0IENvbnRhaW5lciBQbGF0Zm9ybQogICAgPC90aXRsZT4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9ImRhdGE6aW1hZ2UveC1pY29uO2Jhc2U2NCxBQUFCQUFRQU1EQUFBQUVBSUFDb0pRQUFSZ0FBQUNBZ0FBQUJBQ0FBcUJBQUFPNGxBQUFRRUFBQUFRQWdBR2dFQUFDV05nQUFRRUFBQUFFQUlBQW9RZ0FBL2pvQUFDZ0FBQUF3QUFBQVlBQUFBQUVBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNqTHlIYlppOGgyNTB2SWR2SUx5SGI1QzhoMi9Zdklkdi9MeUhiL2k4aDIvUXZJZHZqTHlIYnh5OGgyNWt2SWR0Z0x5SGJIUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNFTHlIYlhTOGgyOEF2SWR2bUx5SGI4UzhoMi9vdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9rdklkdnhMeUhiNXk4aDI3c3ZJZHRhTUNEY0JRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyMkl2SWR2V0x5SGI5UzhoMi80dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzB2SWR2NEx5SGIxQzhoMjEwdklkc0NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzeUx5SGJ3QzhoMi9vdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL2k4aDIvOHZJZHUrTHlIYktBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjJndklkdnFMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI5aThoMjFzdklkc0VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkMEpMeUhiaFM4aDIvMHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHQ5THlIYkNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURFaHl3MHZJZGlMTHlIYS95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi80dklkdjlMeUhiL2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJqQzhoMndnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNmdFbkl1b1BKeUxxRGljaTZnUUFBQUFBTWlITENEUWd2WUEwSUwzL01pSEgvekFoMC84dklkbi9MeUhhL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9ZdklkdnZMeUhiNlM4aDI5QXZJZHU5THlIYnZ5OGgyOUl2SWR2b0x5SGI3eThoMi9jdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIzOHZJZHNGQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZoWW5JdXJHSnlMcXZDY2k2bDBtSXU0ZU1TREVZalFndS93MElMbi9OQ0M1L3pRZ3VmOHpJTC8vTVNITC96QWgxZjh2SWRuL0x5SGEveThoMi84dklkdnZMeUhiemk4aDIzZ3ZJZHN3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiTXk4aDIzMHZJZHZKTHlIYjhpOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR0Y0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlIcUF5Y2k2bm9uSXVyL0p5THEveWNpNnY4bkl1ajVMQ0haNnpFZ3h2OHpJTC8rTkNDOC96UWd1djgwSUxuL05DQzQvelFndXY4ekljUC9NU0hSOXk4aDJzZ3ZJZHRYQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJXQzhoMjhRdklkdjRMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjRMeUhiS1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFJQ2NpNnZZbkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcy95Y2k3UDRwSXVMK0x5SFA1alFndmMwMElMcmhOQ0M2K3pRZ3V2ODBJTG53TXlDL2l6SWZ1d29BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3OHZJZHVITHlIYjZ5OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnZ5OGgyd1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxakNjaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1djJKU0x3Y3lzaDRoQTBJTDFHTkNDOGxEUWd1OFl6SUwxbUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJaUzhoMitRdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjEwQUFBQUFBQUFBQUFBQUFBQW5JdW9SSnlMcTd5Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXFmSnlMcERnQUFBQUFBQUFBQUFBQUFBQzRqMFFrQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDIyVXZJZHZzTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI5Y3ZJZHNGQUFBQUFBQUFBQUFuSXVwYkp5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dFVuSXVvM0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR1SUx5SGIrQzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL3N2SWR0WEFBQUFBQUFBQUFBbkl1cTRKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEvQ2NpNm93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc1FMeUhid2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi8wdklkdThBQUFBQUFBQUFBQW5JdXBnSnlMcXB5Y2k2dVVuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxMlNjaTZrQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYldTOGgyL0F2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHZzTHlIYkd3QUFBQUFBQUFBQUp5THFHQ2NpNmtRbkl1cDFKeUxxdHljaTZ2WW5JdXIvSnlMcnRSZ24vd0VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1CdktBUzhoM01zdklkei9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2MEx5SGJZQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcUlpY2k2MGNvSXVhUUtpSGZsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBaDBvWXZJZGYzTHlIZC95OGgzUDh2SWR2L0x5SGIveThoMi84dklkdjZMeUhibWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeUlNbENNeURHN3pRZ3c3RTBJTU5zTkNEREd3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxQVFBQUFBQUFBQUFBQUFBQUFETWh2MHN6SU1Ed015REYvekVoei84dklkbi9MeUhkL3k4aDNQOHZJZHYvTHlIYnhnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTFJTUZpTkNERC96UWd4UDgwSU1Qdk5DREQyRFFndzZnMElNTlVOQ0hEQndBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2ajRuSXVwREFBQUFBRHdmblJFMElManBOQ0M2L3pRZ3ZmOHpJTC8vTWlERy96RWgwUDh2SWR2L0x5SGQzUUFBQUFBQUFBQUFBQUFBQUM4aDJ3d3ZJZHVYTHlIY1lEUWh4UnM2SWF4L09TR3gvemNodWY4MElNRC9OQ0RFL3pRZ3hQdzBJTVB2TkNERHlqUWd3eTRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNm5Bbkl1cmRKeUxxMVNZaTdZUXhJTVByTlNDNC96UWd1UDgwSUxuL05DQzcvelFndmY4eklMLy9NaURHNURFZ3pCUUFBQUFBQUFBQUFDOGgyeEF2SWR2Zkx5SGI5UzhoMnVZeUljM2xOeUczL0RvaHJmMDZJYTMvT1NHei96WWd2UDgwSU1QL05DREUzRFFneERBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZud25JdXIxSnlMcS95Y2k2dllvSXVmOUtpTGYreThoei9reklMNzdOQ0M1L3pRZ3V2ODBJTHIvTkNDNzVqSWh3U01BQUFBQUFBQUFBQzhoMnhBdklkdmdMeUhiL3k4aDIvOHZJZHIvTHlIYS9qRWgxUHMwSWNUNE9TRzAvVG9ocmY4NkliRC9PQ0cxMERZaHVpc0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2cEluSXVyN0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZmOG9JdWovTGlIUWhEUWd2YkEwSUx6L05DQzY3VFFndlNZQUFBQUFBQUFBQUM4aDJ3OHZJZHZUTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhadURVaHYxMDZJYTZsT1NHdnlEa2hyekFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNnJNbkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5UG9Kam9mckFNeUlNVVhNeURCV3pRZ3ZCWUFBQUFBQUFBQUFDOGgyd3d2SWR1OEx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnlpOGgyek1BQUFBQU55RzhCamNodXdJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxSVNjaTZzc25JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1cjVJeWJ1QVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMndrdklkdVlMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI2aThoMjFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcVlDY2k2dWduSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXJIQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3VXZJZHRvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIzd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFxU2NpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVxQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzd0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyN3d2SWRzbkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b2xKeUxxc0NjaTZ1OG5JdXI0SnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1b3hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc1VMeUhiMkM4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi80dklkdGpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2akVuSXVxTkp5THEweWNpNnVzbkl1cjhKeUxxL3ljaTZ0UUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNLTHlIYmdpOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHZDTHlIYkt3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxQXljaTZrd25JdXVnS0NMbjdTa2k1SFVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJNaThoMi8wdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJrQzhoMnc0QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1pSEpzRE1neFo0MElNTlFOQ0RES3pRZ3d3MEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiRUM4aDI2RXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIzb3ZJZHNKQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkVTOGgyeW92SWRzUkFBQUFBQUFBQUFBM0liaG1OU0RBK3pRZ3cvODBJTVQvTkNERDBqUWd3NGswSU1OTE5DRERKalFnd3djQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyejR2SWR2MUx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL2t2SWR0K0x5SGJFUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzVEx5SGJoeThoMjhZdklkdVlMaUhkVnpRaHcxbzZJYkRzT0NHei96Y2d1ZjgxSUwzL05TREIvelFneFA4MElNVCtOQ0REdmpRZ3cyNEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMnd3dklkdUtMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhibmk4aDJ6Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMnpVdklkdWlMeUhiK1M4aDIvOHZJZHYvTHlIYytURWgwZlEwSWNYOE55Rzcremtoc3ZzNkliRC9PQ0MwL3pjZ3VmODJJTDcvTlNEQi96UWd3NThBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNsTHlIYnhpOGgyLzh2SWR2K0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyODh2SWR0K0x5SGJOd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc3pMeUhiZkM4aDI5SXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoM1A4dUlkNy9NQ0hZK3pJaHovODJJY0xVT2lHdXRUb2hydXc1SWJIL09DQzIyeklneHhzQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJTQzhoMitNdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiemk4aDI1NHZJZHR1THlIYlNpOGgyekV2SWRzakx5SGJKQzhoMnpBdklkdElMeUhiYlM4aDI1b3ZJZHZOTHlIYi9DOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYy95OGgzZkl1SWVGRk9DRzFJVGtoc1U4NkliRi9PaUd1WGdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMaUhiQXk4aDIyTXZJZHZ2THlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2ekx5SGIzUzhoMjg0dklkdkZMeUhieFM4aDI4MHZJZHZiTHlIYjh5OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIvUzhoMjE0QUFBQUFBQUFBQUFBQUFBQUFGdjhCTUNIS0JBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyd1l2SWR0c0x5SGI3eThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjhMeUhiWXk4aDJ3TUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdUlkc0ZMeUhiWEM4aDIrTXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIrc3ZJZHRWTHlIYkJRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTGlIYkF5OGgyem92SWR2Q0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYndDOGgyemd2SWR3Q0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc1VMeUhiZWk4aDIvTXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL1F2SWR0M0x5SGJHd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkJTOGgyeVF2SWR1T0x5SGI5aThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2ekx5SGJrUzhoMnlndklkc0ZBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc0VMeUhhRmk4aDIya3ZJZHZDTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJ5QzhoMjJjdklkc2FMeUhiQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyd0V2SWRzQ0x5SGJEeThoMjBZdklkdDJMeUhibXk4aDI3VXZJZHZBTHlIYnhDOGgyN2N2SWR1Zkx5SGJlUzhoMjBjdklkc1VBQUFBQUM4aDJ3RUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvLy8vLy8vOEFBUC8vLy8vLy93QUEvLy93QS8vL0FBRC8vNEFBZi84QUFQLytBQUFmL3dBQS8vZ0FBQWYvQUFELzhBQUFBLzhBQVAvQUFBQUIvd0FBLzRBQUFBQi9BQUQvQUFBQUFIOEFBT2NBRC93QVB3QUE0QUEvL3dBZkFBREFBSC8vZ0E4QUFJQTUvLy9nRHdBQWdELy8vL0FIQUFDQWYvLy84QWNBQUFCLy8vLzRBd0FBZ1AvLy8vd0RBQUR3Ly8vLy9BTUFBUHovLy8vOEFRQUEvbi8vLy80QkFBRCtELy8vL2dFQUFPNEQvLy93QVFBQTRBUC8vL0FCQUFEZ0EvLy80QUVBQU9BVC8vL2dId0FBNEIvLy8rQWZBQURnSC8vLzRCOEFBUEFmLy8vQUh3QUE4QS8vLzhBL0FBRHdELy8vOEQ4QUFQQUgvLy8rZndBQStBUC8vLzgvQUFENEEvLy8vd2NBQVB3Qi8vL0dBUUFBL0FCLy80QUFBQUQrQUQvL0FBRUFBUDhBQi9nQVB3QUEvNEFBQUFCL0FBRC93QUFBQVA4QUFQL2dBQUFCL3dBQS8vQUFBQVAvQUFELy9BQUFELzhBQVAvK0FBQWYvd0FBLy8vQUFQLy9BQUQvLy93UC8vOEFBUC8vLy8vLy93QUEvLy8vLy8vL0FBQW9BQUFBSUFBQUFFQUFBQUFCQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzQk1DTFpCQzhoMjFNdklkdThMeUhiL2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2VUx5SGJkQzhoM0E0dklkc0NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiSlM4aDI3UXZJZHYxTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyODR2SWR0YkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkJTOGgyNEF2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHZITHlIYkdRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoNHdRdklkdmNMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjZMeUhiUWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXlJY29QTVNIUDR5OGgyZjh2SWR6L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL2N2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzR2SWR2L0x5SGJTZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2cnduSXVwWkFBQUFBRE1ndmVRMElMci9OQ0M2L3pJaHhmOHdJZGYvTHlIYi95OGgyLzh2SWR2OEx5SGJxQzhoMnpJQUFBQUFBQUFBQUFBQUFBQXZJZHNaTHlIYmZpOGgyL0l2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYktRQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1cVBKeUxxL3ljaTZ2OG5JdWo3S3lIYi96QWh5L28wSUx6L05DQzUvelFndWY4eklMLy9NQ0hVakM4aDJ4Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiQXk4aDIxWXZJZHY0THlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdmlMeUhiQ0FBQUFBQUFBQUFBSnlMcUZ5Y2k2dlFuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxyOXlVaTh4YzBJTHh2TkNDNzNqTWd2MVVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMndjdklkdmVMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR0eUFBQUFBQUFBQUFBbkl1cFpKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dnduSXVvN0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgzQkV2SWR2NUx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHNOQUFBQUFDY2k2c1FuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxendBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ5OHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjNzQUFBQUFKeUxxRmljaTZxTW5JdXIvSnlMcS95Y2k2djhuSXVvOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjY4dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYndpOGgyd0VBQUFBQUFBQUFBQ2NpNmdrbkl1cEpLU0xrdkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUNIVFZpOGgyUDh2SWQzL0x5SGIveThoMi84dklkdnNMeUhiQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUExSU1LWE5DREQvelFndzUwMElNTW1OQ0REQ2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFCaWNpNmdrMkliVWJOQ0M1L3pNaHcvOHdJZFAvTHlIWi95OGgyLzh2SWQwSEFBQUFBQUFBQUFBdklkdVFMeUhiR2pvaHJiYzRJYmYvTkNEQy96UWd4UDgwSU1Qbk5DRERZUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdW84SnlMcTRpWWk3cFF6SUw3L05TQzQvelFndWY4MElMei9NeURDL3pJZ3lTNEFBQUFBQUFBQUFDOGgyL1l2SWR2L01TSFIvRFlodnZzNUliTDhPU0d6L3pZZ3ZQODFJTUJnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNmtjbkl1citKeUxxL3lZaTdmOHFJdUQ3THlITTlEUWd1K0EwSUxyL015RzlSQUFBQUFBQUFBQUFMeUhiNkM4aDIvOHZJZHYvTHlIYi95OGgyLzh6SWN0ZU9pR3Z2amtocjJZQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcVppY2k2djhuSXVyL0p5THEveWNpNnY4bkl1clVMU0xXQkRNZ3d5MDBJTDBoQUFBQUFBQUFBQUF2SWR2TEx5SGIveThoMi84dklkdi9MeUhiL3k4aDNISUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1cXlKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2ckFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI1b3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJ4Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcUNpY2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxV1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJYQzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYxTHlIYkVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b09KeUxxWHljaTZ0NG5JdXIvSnlMcS95Y2k2djhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNiTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdXJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNmkwbkl1cWRLaUxpbHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdXRMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR0NEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEUWd4RWcwSU1QL05DREQ0elFndzFjQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgydzB2SWR2Mkx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHQ0QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzNkx5SGIxaThoMjZZeUljMXZPaUd2L3pnaHRQODJJTHovTkNERC96UWd4UFUwSU1Pb0FBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI0QXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdS9MeUhiRXk4aDJnSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc0pMeUhiY2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR6OU5DSEcrVG9oc1BJNklhMzVPQ0czL3pRZ3dXRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjdJdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2N0x5SGIwaThoMjRjdklkdE1MeUhiTVM4aDJ6NHZJZHR0THlIYnV5OGgyK3d2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHo2THlIZUZ6a2hzU001SWJOV1RpTm5BUUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdJZHNCSHlEZkFTOGgyOGd2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI5UzhoMnkwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI2c3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIrNHZJZHdVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjJVdklkdnZMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR1YUx5SGJEZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR1Tkx5SGI5QzhoMi93dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9jdklkdkZMeUhiSHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNMTHlIYk15OGgyMmd2SWR1Zkx5SGJ3eThoMjlFdklkdk1MeUhic0M4aDIzOHZJZHRDTHlIYkdnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvLy8vLy8vLy8vLy9nUC8vL0FBZi8vQUFCLy9nQUFQL3dBQUIvWUEvQVBnQS84QjRHLy9nZUQvLzhEQS8vL2c0Zi8vNEgzLy8vQjhmLy93ZEIvL3dIQWYvOEJ3WC8vQjhILy9nZkEvLzRQNFAvL0QrQi8vOC9nZi8vbjhELytRUEFQL0FINEFlQVAvQUFBSC80QUFELy9nQUIvLzhBQi8vLzhILy8vLy8vL0tBQUFBQkFBQUFBZ0FBQUFBUUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNITHlIYlRpOGgyOU12SWR2L0x5SGIveThoMi84dklkdXNMeUhiS3k4aDJ3SUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdUlkOGxMeUhiM0M4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdTJMeUhiQlM4aDJ3RUFBQUFBSnlMcUJDY2k2aUl5SU1Bd01pSE4vekFoMS84dklkci9MeUhiNnk4aDI5QXZJZHZBTHlIYjJTOGgyL2N2SWR2L0x5SGIveThoMjc4QUFBQUFBQUFBQUNjaTZqOG5JdXI0S0NMbTh5OGh6K0EwSUx2Nk1pREdraTRoNFJJQUFBQUFBQUFBQUM4aDJ3SXZJZHNnTHlIYjBTOGgyLzh2SWR2L0x5SGJuQUFBQUFBbkl1cThKeUxxL3ljaTZ2WVhKZjhHQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3WXZJZHZzTHlIYi95OGgyL0F2SWRzUkp5THFQaWNpNnRFbkl1dW9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiTWk4aDNQOHZJZHYvTHlIYlNnQUFBQUFBQUFBQU5TRytuVE1neFhNeklNVWxBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFEU29pNERzekljVHRNU0hRL3pBaDFwUXZJZHNVTHlIYjZqTWh5L2s1SWJUL055RzZvd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2aTRuSXVyL0tTTGsvakVoeCtNMElMdXpMeUhiRFM4aDIrNHZJZHovTGlIZXpVVWhmdzRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdXBxSnlMcS95Y2k2djhsSXZGSU5CL0ZCQUFBQUFBdklkdmFMeUhiL3k4aDIvOHZJZHNaQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxWFNjaTZ2UW5JdXIvQUFBQUFBQUFBQUFBQUFBQUx5SGJVUzhoMi84dklkdi9MeUhicEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGdneXdVQUFBQUFNaURLdURRZ3hIVXpJTVVaQUFBQUFBQUFBQUF2SWR2TUx5SGIveThoMi84dklkdTFMeUhiRHk4aDJ3UXZJZHNDTHlIYkJTOGgyeDR2SWR2bkx5SGEvallod1B3NEliVDFOU0RBNFFBQUFBQUFBQUFBTHlIYklDOGgyL3d2SWR2L0x5SGIveThoMi9FdklkdkhMeUhidkM4aDI5RXZJZHYvTHlIYi95OGgyLzh2SWQyc09DRzVDandocGhJQUFBQUFBQUFBQUFBQUFBQXZJZHNPTHlIYjJDOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvb3ZJZHV3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3Z3ZJZHMrTHlIYm5TOGgyOWd2SWR2bkx5SGJ5aThoMjRFdklkc3FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRDhId0FBOEFjQUFPQURBQUNENFFBQUgvRUFBSi81QUFEZitBQUFoL0FBQUkvekFBQ1A4d0FBeC9zQUFNUGdBQURnQXdBQThBY0FBUHdmQUFELy93QUFLQUFBQUVBQUFBQ0FBQUFBQVFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNwTHlIYmVDOGgyN2d2SWR2Y0x5SGI3UzhoMi9ndklkditMeUhiL3k4aDIvd3ZJZHZ6THlIYjVpOGgyOVV2SWR1ZUx5SGJWU2NTNHdNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc05MeUhiUkM4aDI1Z3ZJZHYwTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiMEM4aDIzTXZJZHN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdUtMeUhiOUM4aDIvMHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYit5OGgyK012SU50TEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1DSGJDeThoMjRNdklkdjBMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjlJdklkdGFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1DSGJRQzhoMi9ndklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI5QXZIdHdOQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzQkx5SGJyaThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYitTOGgyM2NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzakx5SGI3UzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJyUzhnMndnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWQxS0x5SGI5eThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdmNMeUhiRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF1SWQxQUx5SGIvaThoMi80dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI5c3ZJZHNSQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF6SU1WVU5DQysvekVoMGY4dklkMy9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYjZpOGgyeEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1bzNKeUxxTndBQUFBQUFBQUFBQUFBQUFBQUFBQUF3SWRBZU5DQzg4elFndXY4MElMai9OQ0M4L3pJZ3lQOHdJZFAvTHlIYy95OGgzUDh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2YUx5SGJyQzhoMjRZdklkdHBMeUhiVlM4aDIxUXZJZHRkTHlIYmRDOGgyNUl2SWR1OUx5SGI4QzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2Q0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b0JKeUxxNUNjaTZ2OG5JdXJySnlMcWFpY2k2Z2N3SXQ0TE15QzkrVFFndXY4MElMci9OQ0M2L3pRZ3V2ODBJTHIvTkNDNi96UWd1djh5SWN6L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyNTB2SXRzU0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkczVMeUhiMGk4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjdFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxb2ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyMktTTGoyREFoeWZzMElMbjhOQ0M0L3pRZ3V2ODBJTHIvTkNDNi96UWd1djgwSUxyL05DQzUvelFndS84eklNTC9NU0hPL3pBaDJmOHZJZHYyTHlIYmN6QWgyeEVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNzTHlIYm9pOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MaUhhUlFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxTUNjaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1di9KeUxyK2kwaDFma3pJTUQ3TkNDOC96UWd1djgwSUxyL05DQzYvelFndXY4MElMci9OQ0M2L3pRZ3VmOHlJTWpOS1NMekN3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzN0x5SGI3UzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHRJZGNGQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZxUW5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXYvSnlMcS95b2k0YnN6SU1CN05DQzg2VFFndXY4MElMci9OQ0M2L3pRZ3V2OHlJTUowQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoM0FvdklkdXlMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnBqRWgyd0VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNnaTZnOG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dE1BQUFBQUFBQUFBQUFBQUFBeklNTkNOQ0M5cnpRZ3UrRXpJTDlkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI1WXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL3d2SWRzWEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdXF2SnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dmNuSXVvZUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXlJTUVLTENmS0FRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYmppOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJ4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JK2tSSnlMcThpY2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVwb0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkFRQUFBQUF2SWR2Q0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkc3RBQUFBQUFBQUFBQUFBQUFBSnlMcU9TY2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVySEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1pVGJDQzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhialFBQUFBQUFBQUFBQUFBQUFDY2k2bzRuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THFVUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdE5MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIrTUFBQUFBQUFBQUFBQUFBQUFuSXVxWUp5THE4U2NpNnY0bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEraWNpNmdFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiQkM4aDI5c3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTUNIYk1BQUFBQUFBQUFBQUFBQUFBQ2dpNnhRbkl1cEZKeUxxc3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNm9jQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXVJZHRRTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyNlFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JK29NSnlMcWdTY2k2dFFuSXVyN0p5THEveWNpNnY4b0l1b1VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyK2t2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2MUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFsSXV3Rkp5UHFHeWNpNm9BbUl1dlVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR0L0x5SGMveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIrUzhoMngwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFOU0RCM3pRZ3c3STBJTU5XTkNEREZ3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU5TQzVTek1odi84eUljei9NQ0hWL3k4aDNQOHZJZHovTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi93dklkczVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNaURCQ2pRZ3cvODBJTVAvTkNERC96UWd3LzAwSDhPNk15RERLZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRFFndWlzMElMcjdOQ0M2L3pRZ3V2ODBJTHovTVNITS95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiVGdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURjZ3UxUTFJTUgvTkNERS96UWd3LzgwSU1QL05DREQvelFndy84MElNUGFOQ0REa2pRZnd6Y0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2g2bGtuSXVxSUp5THNLZ0FBQUFBM0lMUU5OQ0M2K1RRZ3V2ODBJTHIvTkNDNi96UWd1ZjgwSUxyL015REQvekVoemY4d0lkai9MeUhkL3k4aDNHd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjdBdklkdFJMeUhjQ3dBQUFBQTVJYktOT2lHcy96Z2hzLzgxSUwvL05DREMvelFndy84MElNUC9OQ0REL3pRZ3cvODBJTVAvTkNERDBnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFuSXV0cUp5THEveWNpNnY4bkl1cldKU0x3U0RNZ3ZmUTBJTHIvTkNDNi96UWd1djgwSUxyL05DQzYvelFndXY4MElMci9OQ0M0L3pNZ3d2OHhJYytMQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdmdMeUhiL3k4aDIrNHZJZHk0TmlIQTJEb2hxLzQ2SWF6L09pR3Qvemtoc1A4NEliWC9OU0MvL3pRZ3hQODBJTVAvTkNERC96UWd3N3NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFkQ2NpNnY4bkl1ci9KeUxxL3ljaTZ2OG9JdWY3S2lMZCtEQWh5dmsxSUxqOU5DQzUvelFndXY4MElMci9OQ0M2L3pRZ3V2ODBJTHIvTkNDOHF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiNFM4aDIvOHZJZHYvTHlIYi95OGgzUDh2SWRyNU5DSEY4emdodFAwNklhNzhPaUdzL3pvaHJQODVJYkgvTmlDNy96VWd3ZjgwSU1PZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNnBNbkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXV6L0p5THE5aTBoMVBjeUlNSHpOQ0M3K1RRZ3V2ODBJTHIvTkNDNi96TWd2SzBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI5NHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkcitNQ0hXL0RRaHh2VTVJYS85T2lHdC96b2hyZjg2SWE3L09TR3lvZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1ckdKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxwb2prZ3JoTXlJTU9CTkNDOStqUWd1djgwSUxxdUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHZUTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHovTGlIZmhEa2hzVXc1SWEreE9pR3U2amtoc0s4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljajZuWUFBQUFBQUFBQUFBQUFBQUF5SU1kTU5DQy9hd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYnd5OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyN1FBQUFBQU5pQzhBVGtoc0FRNEliZ1hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxTFNjaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdW8rQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyNm92SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2Vk1DRGJCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZuSW5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXI2SnlMcUhnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR1TEx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI3UzhoMnhFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdXJCSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcTZDY2k2ZzhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJWeThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklOczJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdW9lSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2czBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMnh3dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhidndBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcXZ5Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVwdEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiNHk4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHhJZHNwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2aFFuSXVwSUp5THF3Q2NpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDIyOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b2RKeUxxaVNjaTZ0RW5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THFvd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNVTHlIYitTOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh3SXRzZUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdW9FSmlIcEdDY2k2cFFuSXVyL0p5THEvU2NpNmp3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUNIYkF5OGgyOHd2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI2aTRoMndvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU15TEtHakFnei9BeklNWmdPQ0REQ2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR0YUx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdW5BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRFFndzVvMElNUC9OQ0REL3pRZ3cvODBJTU9vTkNEREhqVWd4QVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjkwdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI1NEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUMwaDJ4SXZJZHNiQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGdodGw0MElNUC9OQ0RFL3pRZ3cvODBJTVAvTkNERC96UWd3LzgwSU1QWE5DRERralFnd3lrQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkcEJMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYmh5c2gyUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ4QXZJZHZaTHlIYi95OGgyOGN2SWR4Rkx5SGRFVGtocnprNklhMy9PaUdzL3pnaHRmODFJTC8vTkNEQy96UWd3LzgwSU1QL05DREQvelFndy84MElNUC9OQ0REMlRVZ3cwMEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLUmJYQVM4aDI5Y3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2SUx4cllCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ6a3ZJZHZyTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMitveElkRHJOeUczOHpzaHF2ODZJYXovT2lHdC96b2hyLzg0SWJQL05pQysvelFneFA4MElNUC9OQ0REL3pRZ3cvODBJTU9rQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNjTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9jdklkdE9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeURhRGpBaDI0QXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDNmOHdJZGozTkNIRDhEZ2h0dnM2SWE3Nk9pR3Qvem9oclA4NklhLy9OeUc0L3pVZ3YvODBJTUw0WXlDZkFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyMmd2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL2k4aDIrZ3ZJZHM4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiY1M4aDIva3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWRyK01DSFk4VFlodVpzNUliSC9PaUd0L3pvaHJmODZJYTMvT1NHeGJRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJ0QzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyOWt2SWR1REx5SGJRUzhoMnhNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUxpSGFIeThoMjFBdklkdVhMeUhiN3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjJFQUFBQUFBQUFBQURZaHVWRTRJYlNuT1NHd3lUZ2V0QWNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdlNMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiK0M4aDI4c3ZJZHVvTHlIYnB5OGgyN0l2SWR2U0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjN3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeURiRnk4aDIrb3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjZFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdJTmdKTHlIYjRpOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjZVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDNGgydzh2SWR2S0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoM0g0dk05VUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF5SWRvQkFBQUFBQzhoMjY0dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI5aThoMjJ3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBM0ZONEJMeUhiVEM4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI1QzRmM0IwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJOXNTTHlIYnFTOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2MUx5SGJmZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3SWRvWkx5SGIxUzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR1Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkbzFMeUhia1M4aDIvUXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYjFpOGgyM0V2SWRzZEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTGlIYlN5OGgyN3N2SWR2c0x5SGI5UzhoMi80dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjhMeUhiOHk4aDIrY3ZJZHVqTHlIWktRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJDQzhoMnlBdklkczBMeUhiVWk4aDIzY3ZJZHVTTHlIYm5TOGgyNlV2SWR1Zkx5SGJqaThoMjNFdklkdEtMeUhiTUM4aDJ4b3ZJZHNDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy84QUgvLy8vLy8vOEFBRC8vLy8vLytBQUFCLy8vLy8vZ0FBQUIvLy8vLzhBQUFBQi8vLy8vQUFBQUFELy8vLzRBQUFBQUQvLy8vQUFBQUFBSC8vLzRBQUFBQUFQLy8vQUFBQUFBQWYvLzRBQUI4QUFBLy9IQUFCLy9BQUIvNEFBQS8vL0FBSC9nQUFILy8vQUFQOEFCQi8vLytBQWZ3QVBQLy8vOEFCK0FCLy8vLy80QUQ0QVAvLy8vL3dBUGdBLy8vLy8vZ0FjQUgvLy8vLy9BQndBZi8vLy8vOEFINEIvLy8vLy80QVA0UC8vLy8vL2dBLzgvLy8vLy8vQUQvNS8vLy8vLzhBUC9nLy8vLy8vd0EvK0FmLy8vLzNBRDl3QWYvLy8vRUFId0FCLy8vLzhBQWZBQUgvLy8vZ0FCOEFBZi8vLytBQ0h3QVIvLy8vNEFmL0FCLy8vLy9nQi84QUgvLy8vK0FIL3dBZi8vLy93QWYvZ0IvLy8vL0FCLytBRC8vLy80QVAvNEFQLy8vLzRBLy93QWYvLy8vNEQvL0FCLy8vLy84Zi84QUQvLy8vLzkvLzRBSC8vLy8vZy8vZ0FQLy8vLytBZi9BQWYvLy94d0FmOEFBLy8vK0FBQS80QUIvLy9nQUFIL3dBQi8vOEFBQS8vQUFBLytBQUR6LytBQUFBQUFBZi8vOEFBQUFBQUIvLy80QUFBQUFBUC8vL3dBQUFBQUQvLy8vZ0FBQUFBZi8vLy9nQUFBQUQvLy8vL0FBQUFBLy8vLy8vQUFBQUgvLy8vLy9BQUFELy8vLy8vL2dBQS8vLy8vLy8vK0QvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy93PT0iPgoKICAgIDxzdHlsZT4KICAgICAgQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiAnUmVkSGF0VGV4dCc7IHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R1JnQUJBQUFBQUkwaEFCSUFBQUFCSlV3QUFRQUFBQUNMaUFBQUFaa0FBQVJqQUFBQUFBQUFBQUJDUVZORkFBQUJsQUFBQURvQUFBQTZpeVdVc1VSVFNVY0FBSXVBQUFBQUNBQUFBQWdBQUFBQlIxQlBVd0FBQWRBQUFBMEVBQUFpS2cwWmhCdEhVMVZDQUFBTzFBQUFBdWNBQUFZb2NBTnY4RTlUTHpJQUFCRzhBQUFBV0FBQUFHQm1CNERSWTIxaGNBQUFFaFFBQUFQdkFBQUZ0RzlNL1ZkamRuUWdBQUNEbUFBQUFFMEFBQUI0TElmKytXWndaMjBBQUlQb0FBQUc4Z0FBRGhXZU5oUE9aMkZ6Y0FBQWc1QUFBQUFJQUFBQUNBQUFBQkJuYkhsbUFBQVdCQUFBWGNnQUFNaFM3Y2swc0dobFlXUUFBSFBNQUFBQU5nQUFBRFlVcTQ3WGFHaGxZUUFBZEFRQUFBQWhBQUFBSkFmakJIVm9iWFI0QUFCMEtBQUFBeUlBQUFhYWNBeFFGbXh2WTJFQUFIZE1BQUFEVUFBQUExREx1dnhKYldGNGNBQUFlcHdBQUFBZ0FBQUFJQUw3RHpCdVlXMWxBQUI2dkFBQUF3OEFBQWxSS0tqSlYzQnZjM1FBQUgzTUFBQUZ3UUFBQ2duMHBwL1ljSEpsY0FBQWl0d0FBQUNpQUFBQXZlRzJYaU1BQVFBQUFBZ0FBQUFFQUE0QUFtbGtaVzl5YjIxdUFBSkVSa3hVQUE1c1lYUnVBQTRBQmdBQUFBQUFBUUFDQUFnQURBQUIvMklBQVFBQUFBQjQycldaRFhCVTFSWEh6OTNOUXRoQVFvQWtKRkFNOGhVZ2hFOFJKZGgyYXAxcHRhTWlXbXRyOGFPZE9pV2lZTEV6ZGNaT3JSVmFwNHI0RVVHczFBOEVRZm1JUUVCQVJhcEFsVUdzOGtJSUpEVnAyRTBvQmtOTWpjbnQ3OTU5dTluZExMQ2s5WjM1di9keVA4NDk5OXh6Ly9lOGpTZ1I4Y3Nkc2xFOGwxOXgxU3hKTDduMVYzTWxUMUlvRjYzRjFBK1dsRy9mOU4xOEdmNmRtYlB5cFhEbTFUL0lseW16Wmw2Wkw4VnVHK1UrUGU3VDZ6NVQzS2RQZXN6NStmeTVNdExlQysxOWtyMVBzL2ZMN1AxeXhqTGpuZjF1dERJTzhQdVdpeHJVejlxYUxWTmxsc3lYeGJMWmsrcEo5Njd3cnZTdVRabWI4blRLOHlsdnBmelRsK0x6Ky9yNnNuM1RmTi8zbFVoUHlkTU5NaGlVNmhaWnFodFVrUTZvWXQya1p1aFBUSzMwcHJhRjJnQzFoMVNPZnB2YVJXcTJmdGIyYmFKMnQ1U0tuNW9LYXBiUXI0cmFENlVYZlRQeFdBWjltNnptSEYyamlzUkRxM0kxZytkczdXQnBUL3FuZ2Y0Z0N3eGl0TkU4eDRDeG9CQ01BOU5CTVpnQkxnTTNnQitDRzhHUHdFM2d4K0FuNEdid1V6QWJQS2dQeWgvQVEyQWhXQVFXZ3lYZ1NmQVVWcFRxUGJJTXJPVHZsOEVxc0JxOEF0YUF0V0FkV0E4MmdJMmdETHdPTm9ITm9CeHNCZHZBRzJBNzJBRU9BUWRVZ01PZ0Vod0JWZUFvT0FhcVFRQUVRUU5vMUFkVkQ5QVRwSUpld0EvU1FHL1FCNlNEREpBRnNzRXRlcmU2bGZrcWZOMG1QNU1IZEN0ekR6TDNJSE1QeWtLaWV4SFB4V0FKZUlLNGVaS3lVbFpvR2M5bndITDZQQXYrQXA0REs4QmZ3ZlBnQmZBaWVBbXNwUC9MWUJWWURWNEJhOEJhc0E2c0J4dkFSbEFHWGdlYndHWlFEcmFDYmVBTnNCM3NBSWVBQXlyQVlWQUpqb0FxY0JRY0E5V2dGcnZyd0w5QVBUZ09BdGdlQkEyZ0VYd0Yya0VIME1RbU8xc3B3RTdCcjBIOEdzU3ZRZndheEs5Qi9CckVyMEg4R3NTdlFmd2FWSDExaDhvRS9VQi9NQUJrMFQvYnhucVZHcVhYcUFJd0ZoU0pWMDBBRThFa01CbGNvaytwNmFCWWJ5TFNqNGxTeFhqYTNBZkxCRmJHWVdVY1ZzWmhWUnhXeFdGVkhMc0tLM20rREZhQjFlQVZzQWFzQmV2QWVyQUJiQVJsNEhXd0NXd0c1V0FyMkFiZUFOdkJEbkFJT0tBQ0hBYVY0QWlvQWtmQk1WQ3RIYnpqNEIwSDd6aDR4OEU3RHQ1eDhJNkRkeHk4NCtBZEJ5dno5RTVtMG91OTB5Wkw4Y2tjZkZJaVBqVlh0NnQ1K2tNMUh3NjVoNTN2Z1FjOHZIVll2bGdCWDdUUjV6TVRwZlQ1akxhbVhadWtVdE5NVFFVMWUvSGF6YXBFTjZKdERacjIwS0tlRm5sNm16d3NDMmoxSm4wZGF1dm9YMHVMZGxxMEUvc1B5NUNZdStuam9MbUtQaDFvcnFkZkFNMEIrdTIwZlZJc1k4MWxySG02R1UzTmtxcHlKQU1lZEtqWlQvdlBhWCtLMmpwVFM1K0E5Q0lDS2xuMURPd3NZM1YzcWptU3h1eTk2SGxSelpOME0zdnhaSzAzakp5ZG4zdVZUSk9KbkFDbmRaTnVBUTNhNFY2amE4U2pqK2tPVzJyS20rUi92UFFUK2pibUcvNnJVUyt4SjlBdWREdjZVOGFxb2F4Qzc0ZGwzNkpzdTM1ZmJ6M1BFVmJyQmR4YjdCd0N1bDAvSkY0WVFjUUhiNXNUTk5TcVh0THhrNWdaNlUvRnovcCtEVmQzdGVwbCtuNThuNEcxV1pLaFQrbnRlTW1yRDFvdm5iUXIwNHl2S3FWSUg3QmVQSzczbmVjUXFYaW1RNWZwRTdvczdCTTBkZGpTZHFLdTA1WjJGeTNHaTZiMmZPYXV0K2syRUsydjladzlreHpCUms2dEx0VjFlazFNLzAvd1VDMFI3WW5YcUUvWSt6Rm1XSDhldnZLNCtOb3ZmTldzNi9XUmhCYkV0ejNWN1dHOFg0UGxKL1VLL1psZUZsUDJ1Vm50TTZ5M3g4NjJBODQ3LzdHYTlhcjRPVkJXQ1RNbjhKcHVURXJuU2owdnpFdWROaEc1ZStHaFN2MEJ1VmZvS3RDdjJabzk4TXpwRUpOd2RuWnpIWktPOU9TdVRMaWlCb1oxOUdOd0I3a0UxcGRURm1MWExhYU10K2k5MkVDWnVWdk9nV3RTV2E4L3dUWVpzRUxHR1R6VlpQZ2lkQkp3RnZXTWxFWmZnMk5iUi8zbGdhMGF6eEtCNmJTcUNLK0J0ZFZyT1pxekp4eEo5bHdhRWpXSHpxdTNaYWptU0V3a2lDN09oZVAyWHNFYU5uRkNPSndNRVN2ZGVaeHh0MnVUS1ljNHBoNk93WllFamJMZ2x3L01lWWxXdjJ0SkhhdXhpMUVQNmwxMmpyVzZXb1lZMnkyM1ZrVE54SS8zNjNYUTVkdGQvTlhXSlU2eWJRUXUwRy9yZTEwTnBmcEc3bTh5bjZONmcxMmg2bkJjMm5wejFyV0hyTlgzV1l0cTliZjBhdDQySkp4bmpiWHRZenkwQjUxTldPaUZjZnd4alVKemErbkszUFRlN1hxcnhucXBJY0VRZmpjRE9PbGExY29JSGZaa2FpRXJDcTlIZ1BtM1JNNXNUMlFFRTBrZDlEN202dklubUVOTHFDVnkwckpOcTJWTmZ6aWUzSGp6U200azF0RVRqaG1UUWJDamlENVRZczdjaE5uTUF2MnhIVHZrOFRMOUJYYVp1S3F3NDU2d3ZQU09qRFRjZ2pjKzF1WkxKaHhkWnU5OVNNWm9Zbng1bHowVWp0WVRVWDkxdUZiNHVqVHNlVTZHcXo5alJPKzFIamx0NTlETzZlTzE0emE1MHVDdXcwaTdMMDlhTHVsY2N6OSthblBQK2pvYjgxMUhlRXhmRDMrYU5lcEQrM3E5eGV4UXpiY3FiM3VRWFpRNVpNQkZjR3FyM29jOEZlTFcwRzZpendIWXk1d1lXK2l6SjhFa3lKU3cwQk9KQkkvbEFMK2J0N1lZbjdNNmhqWENjZFVZeFcrbWQ2TmxNODlaY3dDeGR0Zkh0aUtxUEFuUDUrYkU3NTNzRXVzcis1ZWZuTTZzU0dQWHZtWWZ4ZThndmpiZFRJdWNKcVllYjRiV05vQnZLOFBqNnYvZ2tlclk3SWVZYW8zUEpjTDErckNOZlp2emRjazN2QkdQTktPMVhoOE83My85RHFOV3hjeWgvZXgrZFRtcUVrNk16b1ZDclBnUEd4M3RaOHhiaG5manBNdy82MDVwWVRSUDhsbHBoREhPbk10NDNQT3N3NTVoZmp4V0FWY2NDVVcxZStLMXNnK00zL1pGNWEyaGVMUHNiVm0xbFJiYlk4YmVGOW5GNXZjWjRkd2dKdlNydW9SNDZpK0RRSTVoR2R2bUNPTTJ3MUNkOGZoTnd5ZDZLNlZ2UmFJaElNUG9GYlczM05hRFFtekpPR1I1dWx3dkpDTGl2T1NlMEI1Sml5b3pKNDhUZDFKNlkySS9MUzZUQzRTdGlZNUkrMTM0VVRLNWJFUjNiN3N2YWpySFFrczlzZHFZS0NkMXo5ekFPWG0wSS93dEZPWDV6aEVDYURGZVRqU0N5VGErU0NJWGpZc2pzNWM2YzB3YkJhMko3YlE1VXFZOUg5d3pLZlpjdExzc25xRlRLWHZYN2p4L0VyYlZtYnlIMFgzMnpHaUo1RXVlcUM4N2xTRFhmNDR2K2JiRXAyaUNOYzJNNG9aa3JHcUx5aW84U2VpM01ZY1hRL2I3N1lsWFpYZGhrK3VsbXRnZGIvWVZYd0luelhmNG1UTGoyQWpFUzQxMlJkcnNDWlRjbDgwdWEwTkRFaTJQRUV2VjFzcWEwRHJvMCt6VDBPeDluZXNRRTB2bWZIOUI3MmNObXpwL2cvbS9md2x1Wjk0RGt2eU8yMlJzMVYvQ2o2MXV6bWUrRDZxTnYxMHYxc1RPd2Z6cVlYL3oySGp1VlRCbkZtTzBrVXVrdXJsZzlEcjRYTTIrTHJtRUIzYXJ0OWxpY3I5MzlZbmtIWDRybnRqelB1NzBENVVkc0ZHWUVacnpPV2F4RDBaT3MwemN3alBOM1cxdXpKdE1LZDVPVHZnMlRuMnZmbytkbEphRW42cG81NGt3UmxyVXVkd1Jacng0amtJY1JxaExSbjhYcGc3Tm9EYjZ0NHd1YzJpMjN6ak40ZGJkdm56SjdyNXUvM0xTM2Q5VEZOOXhQZkQzQU1uamk3bEVGc3JEc2tTV3FodzFUbzFYeFdxR3VscGRxNjVUczFXSm1xdm00WVYrUk90RDlGd2s1ZktBYkpNRFVpWWZLWS9zVXoxVWpueXBScW14cWplOUo2dE1OWTMrQTlVVjZudHFDSHF1VmhlaTYxbzFESDNYcWVIcWVtUUVtbTlYSTlVdmtiR01jWThxVkkrb1I5VVVWWXBNTmY4TlZJL2JmZGFYTER5VHYvdkpWQ1NYL0dDQWZjdkNwaXhta1NNREtVMWhIaWJuTVA5VEMwbG01QzBESFdISnN0cGlaU3JJUW45SXBzWkpidVJwUmc1THVEYkxsY3pJbTdFcDI5b1Zsb0d1bUsrOXJwTG55aUJYQmxzWkowVXlXaTZXTVhoZ1BIOWRqQlNDY2JhbWlMSUpNbEVtOFp3c1U2aVpMQmZaT2lOakltL2owQkVXbzJFOE1pWk94cmxqaEdTaTdUWFVsWXV0RExVWXlpaUZib201d2lNVXVUSW04bGFFYlJPc2ZXR1o1RXBSWkp4b21lTEtaRmN1c2hLNkVyVWZHeEZqaSs4Y2tUNE0rUVl5ek9ZYmhtR0d1eEsrTGlBbk4raVQ0RXQyaUN1ZDE0VlJHSkZndkI0MkJrYkUxUlhZREhhVTlKS1JTRy9lQ3JxMWIyTnRFV3VEaC8zclF4VDI5eVRLREU5N0dTMmRtdjZJMTFya3RiRTR5RVppaW8yOGI5aTR5N2RSNTdOUk45UjZxb2NkcFNjK0tVRG5hTmJZYS8wK1dxYkxaYnhmaVhqa0Jwbk4rKzN5QzNyZklYUFFlYWZjUys5ZnkyL1FkcC9jajU3Znl1L1E4d0NTTGI5SGN1UkJPQ1FQdGxtSXR4Y2hlZkpIK1RQbGo4aWpXTFFZeVpQSGtGellhQW52anlPNThnVFNXNTVFK3NoVFNMcVVJcVBrYVNSRGxpSUZzZ3pwSzg4Z21iSmNYbUxFbGJJV0RhL0thMmhZSjV0NTM0TGt3bDg3ZU44cGJ6UHVMdG1OYi82RzVNaTdTSmE4aCtUSUhpUkw5aUk1c2svK3p2djdTSTU4Z09US2ZqbkkrMGZ5Q2UrSHBCcHROZklwNzdWeUhEc0Qwb2lkSjVBYytiZDhnYld0MG9hZFg0bVd2a3JnekV3NE0wUHlWRjgxUUFhcUxKVXRmV0RlSExrUUZpMlFYbXEwR2lQOTRNV3h2QmVxUWhtamlsU1JqRkFUMUdUeHc2N1RaSUM2UkYwaXFlcFNkU252MDlWMDNvdFZzWXlFZVdmSWNNTzkwbDlkbzY2UndXcW1tc2w5bHByRkhlNlZOTGgzdGd4VHQ2aGJ4YXR1VTdkVEFnL0xCV3FPbWlQallPTVNLVkozcWp0bENOdy9WeWFvdTlSZHZOK3Q3cWJOUEU2RHNXcSttaS9qWWUxN3hQSTJZOEhia3ZaZmNtNU5mSGphbGRSSlRCTmhGQWZ3Ly90YVNpbWxyQW9xWWtWRXhJM040b0k3SUx1bWFZd2hKRkJaVEtBVVExdEVSZFNLVzcwWUR4NE1McUFZWTR3SDQ4SGdFZy9HZy9GZ1BCZ1B4SU14aGlBeHhoaGpqQW0rZVF3RzRvRjZtTitibWRkNTgvcDkzM3dnQUJhTUdNYWdpa3VyWExCNTNINHZWc0xJOXpFeHdUbkFCQ3NTa0lwMFpHRTFDckNCejQzYmFrdnNjT3h3dXV4d09uZFYyK0YxT1N2dENPbFBFU0lSZzBRc3hCSXN4eHFzeFViSlJFUEJEQnVTa0lJMFpDQWJPWENnU004WkVJVll6TUU4TE1KU3JFQXVDckZKenhtNWFoem1ZajdzeU9RTzg3QU9tL1ZjQkIveFNNWUNMTVl5ckVJKzFtTUx0cnJkSGo4RnhaQjRVYndzRG9wM0d0Mitacm92UGhTZmlzL0ZsK0xySm05SE83MFZSOFFQNHFqNFJmemUwdWx1cEYrYUNxSkp0SW9KWW9xbm85R2owc1FNTVZ2TThRYmFPNVZETEJLM2kyVmlqZWp5K1hKeVZhM1lJTGFJSHJGVDdHYnpWSy9ZSjRiRUMrSWxzWi9OVjRQaWJmR2UrRUFjRnAvNUF2dDg2b1g0U253anZoUGZpeDk5Z1FNK05TWitGWCtJdnpVTlNqVHoybEY4MEg5RWJkM01ibFFZbXNOUVRkTXc3VHc2REkxaEdCR0dwakMwaEtGMUZtUDRxODNnNzZhQXY3WmlWTUdGT2pUQkF6OTZKa2VlVEpOalFIbjZUT3pWNHg0OTF1blJxOGN1UFhici96YW9YOS9TNDAwOUR1cnhPdGZPNG4xQXNVYnNSeHRHTWM1WG1iQ1FpU0xKVEZGa29XaXlVZ3paS0pZejZZaWdPSXFuQkVxa0pMNjI4K0dnUWpZTkpxcWdTcXFpYXFxaEJxNmN5bk5uNGIxQjhaalo2QndNVkVRZUNrblVPamJTK2IvblAzbi9JWHdUeDJXMytzUXFqQ0daTzRuN3Q1ZXBIclMzejN3djd2S1RNL2VrWWxSZ04vZllTMzcyR0FYWTQ5VEZucUNEYkpDNjJaTjBpTzJqdyt3cE9zS2VwaDcyREIzbHFzUTdxYmFLbXRIS3ZYM20zZ3c4dmtFZXgzNWM0OHdBaG5qOWFHdm9MSWJ4Q0kveFJGdTlsTU96cHppV1VEa1BlVDNWeTY4VXRWRTczeWRxSlovTVJUTFhPc3UxcnVBcTF4dmdPYnJCOHpVMFZVdXJ3elZLYVNlVlVUblYvd0doU3UwREFIamFZMkJoRW1lY3dNREt3TURVeFJUQndNRGdEYUVaNHhoU0dGV0Fvb3lzekN4TWpHek16RUE1ZGlCbVpJQUNYMmR2SDBZSEJvYi9mNWwvL1R2UHdNRDhpOUZRZ1lGaE1raU84UVhUSGlDbHdNQU1BQlg4RGJONDJxMlVkM1JVUlJTSHY5L0xnaUlpQ0FRQ2hNM3NJcUhYaEpJQW9VZ1RVWG9nQ2IxM1FoY1ZqQVdrUzY5UlVVRlI0V0FYQmJGeHdONUZRREM3MkJzcWlLSkkxcnRMd1BLWGYvak9tZlBtenBsM1o5NmQ3eHNnamxqenlpT2lUNkpGaXNYRmRkcmlFdndhbThPNWVmL2hpVk5kRGRRWWpkQmlWZFFBZFZOMzlkRlMxVlJIMVZCTGpkVTRqZGNFVGRRazVXcXlwbWlxYXFtMlZtdWwxcWkrQmxHTTRsekV4YmIySlpUa1VrcHhHYVVwdytXVXBSemxpYWNDRlVtZ0VwV3BZanV1aWw4OTFFbzlsYTMrU3VBV2J1VTI1aktQMjVuUEFoYXlpTVVzWVNsM3NJemxyR0FscTFqTkd0YXlqdlZzWUtONktVTzlsV1A3RDFLRE9qU2tEMW5ra3M4OTNNWGRiR0V6VzluQmt6ekc0N3pJUGw1bUx3ZjRpQ01jNGpBaGpuT0NIL2xKbVZxcmtScWxmbXF0TFBab3FJWm9tQ29wU2F1b3hrRFFzbWlaTkZyNWZ4Vk5jZkxaYXhNRmFxQjYybkJoUEYwdFZBY2ZWMUNUUVdUenNUcXBzeG9yUlEzVlNDdHNTaUd6TlYvRDFWeHBpbGNGOVZVSHBhcUpsaEFnaFNSU2FVcGJycVE5SGNta24zMlJ3d1FtTVpudHFxd3FTbFJWK2VWVVhRRWxLNGd2YnBQTnlhU05uVU1GNjVXaUFXa1daVE9ZNjVsanE4L3hxbmpOdk4zZWZ1K29mNjcvcEl0ekpWMjhxK3o4THVpU1hVT1g0dEpkZTVmclpya0ZibHNnR0ZnZVdCa3NHNHdQRGo3akZVWWlaeU9SMksrVndsbVYwMjF2T1F6aEJqYXBpNWRnZVhkNSs3eUQvanovQ2VlNUVxNmNTM0NKenNYeU5uWnBzYnpUWE42Lzhxb29yeUtub2pXRHlGNWJJWEMraW9VekM0K2Q3NGN6d21uaDFLSitzZkNBOElSUUpOdys3QXY3UW9XaG5hRzJvVEtoMGdXekM1WVdwQll2NzIzUjFpSXZlbHFiYU8wNmEzbk0wd0V2SXpyc3RmSGFlVjI5ekhQNXZKNWVwcGNOLzRzbi8zRGk3M3hmWU5WbnBFUkpXMmNzclRmZWtveTBPQ05tZ3pZYWRZbkc0VExOMEV4akwxOVpSa1YxVFpmUGVGcW9CVnFrQnNaVWt0V29ab3o0YXNaOFV6dVBGT09sWXhFdjZlWkFUb3laUVdScHViRTdPVVpPcnAzV2VQYVlHZm5teGhhelk3T1J1OVhjMkJHelk1LzVFYlhqR2ZQamlCbHl5T3c0Ykt3V21DSEhvNDd3Qjk4YnQ5VzUxeGk0azJUdW94YjNVNWNIcWNkRDFPWUI2dk93Y2JlTlpqeEZJeDZoQ1U4WWhUdHB6S08wWkJjdGVKWU1ucU1WdTQzTkYyak44M1RoTlRyekN1MTRpYXQ0bFE1c3B4UDd1WnJYNmNvYnZNazF2RVUzM3VGYTNxWTc3OUtEOSt4azM2YzNIOUtMRDJqTzB3emdFL3B5a1A0Y2pmcG0xSWNaeXFmRzZER0c4UmtqK1pJUmZNRndQbWNzM3pLR2J4ak4xOHl3bTNJcVB4c2xQekNkWDVqQ1NhWnh5cHc1dzQyY1pUWTNHVW8zeXlOUFloUmZNWTd2ek1CZ2tYL0o1bUtBV2Z6T1RFNGJaNzh4aDBqTTh0U1k3MDNzWnVtcjFuOEN6Ym9xQndCNDJzeTlDWGdrVjNVb2ZHOVZWMVV2YWttOTcvdXUxdDVxdFRTanBVYlNqSGJON2huTnZuZzhIbzkzc0EzR1lHTThkckRCZ0EwNEdFSWdBVjZXQjloSklDOWdZc0lqWm5YeWVKLzVrZ0FKWkNFWVFnekdyTUhUZXVmY1cxVzlhbWFjNVArK2YyeEpNK3BiNTU1Nzdybm5ucjBJSlJNYjc2UFBDQzhRa2ZoVU55R1VYQkFvcGJjVEFyOFJIYUxzSy9vY0NjY0VmZkJxY2MvTEg0TmZFNEZZNE50RHdsTkVJVmJTcXhhczFFVG9DakVSZ1pxRWEyR0VlMVVTQVlxSHJoRmlNY013eGVGd3lFcWdXS0lsbXNvbEZGZEN0RkRQRWVyWXU3ZjZ4YjNucWVXQzhOVEZ1Vzk5aXdib01aaDNIZUNmQXZpZHhFZmlaRkxkb2xCSmhCbEVJcGxFNmF4TUJZRWNaL01vMUdTaXh3bWJLK0R2N29wRi9QRkEzT1hvOG5YN2V1Sm14VjkwSllhOUhyZXNlUEY3S2tGVG50THdhSGtrSzdMdnFaUmpuWVpPdkdwMmZQdWUxMTlUL1FiMWZQR0wwNnVyby9OWDdWLzRtdkRVeWQzait4emRoOVFENTRVN2Z6d3pPanB6OFl1TEV4TUwxVjhnSFNnWjIvaVo4Q0hoQ3lSQmh0UitqOXNrbWdoRFV4Uk9Fa0VJcjVvb2pEb0oyRVhvR2lVQm43UGJMSk1FVFVpS3Q1Z1pIcTM0WkRtVjdCZktJMU5DYWRqclU3TFpWTEpUOExpakFuMy94TTNaNGRKdkxDKy82WGlsY3VMZTVkVUhoMHE1V3llMlhyTlVMQzZkM1RyY1g2cE1qSis4YjNuNXdzbXhpVXE1ZjZSdjdmems1UG0xUHR3ZnBOOXZBLzA2U0FEM1I2clJDM0NqeDAyVTBhdlRUb2lqeXg3b0RNQkFXMEpXZk1XU296UWNCUVE2aFpRckJYK2ZBdHo2aGZYblY5OTRaS1IwNU41VjZRTWZHRHUxVUNnc3dPNk1IbjNqMHRJYmo0NEtkMXo4cStMeTJZbUpzOHRGb0FuT3ZSWG10cEVCdFJkd0VVMkNlQlpJb0NOZ01rbkhaU3BKSGdtWUEwYlpIUGhIVVVJd2VjS2ovN2RPLzZGNkUvVldmMERmSlR3MSsvUFppN05FZzEwQjJCWlNVTE90c0NWZ0JvOEp3VnFJeGNGWUxsaUQ2dUF3bmRVWEFPS3ZaNnQvV2R2RDUyRVA4MlJRN1hNNUJVbUFIWlFJOEpucExHd2kyNzR3MG8yY2hQRVJzdVp3NXpQNXRLeUVpeFRwMUg3L2tIU1ZWRGtoUEY5YXYzTis2ZDRUbGNyeGU1ZDJ2bjE0SkhmSDlOWXpTejNGeFd1MmpCeWFMWnArU0xmUW5RdDNIeDFsdTNuZnlmRXQ0eVA5SmI2Yk8vc3k2c0hTSE1QeklLejlQa2JYbkpxR2Y1dEVham9yVUZ5M0xBbWk2QkZiNlFscmg2OFVmRCs0U2g5WlhhM2VLRHhWL1FJZHZ6aEhwNnFmNCtzL0FOOC9CSEJGRWxDOWpJd0MxWTR1bHdDY0xSd0hWdkdJOG1lY1FETTdQTk5GNG1wRWtRV0tOQk1FMkYzWUM0MU1ya3hTaEJOUDRkQWxzN21LMTR2SHpsRVM3Rys1ZmYxTmtSMkJROXQybjE2bDVqZTg2L2krOE95T200L1JQK2F3Y1krdkJ0aFdrbEdURmhuT0VzZ1d5dFpwRWdWQjhBaUltWlZZblU2SGhDSUZjQU9wUWxQVXNiNUs5NTJxdnBmZWNLNzZoN0RRUDZFcjFkK3J2by91ckQ2cHdSMEN1QktKcVdIT2lwUUt4MFdxZzVTSTVIQ1lRR0l3dW5rQUdJaTRpNzh4eDU4RlBKRDI4S3hOcGlJOHVvSmtjcStLZ0prSG1NTHBjSnFBMnpJVXlGMXl1WkRxOUdQVmx4Yk8vK0FINXhlSGhhR0x2d1VZZGRLZlhKd1RUaHJyZkpEeGNsUU5LYkF3WTVrYVNnQ3hHMEc2U2xRRWNOU1ZXdDlGSHhjV2QxU1BDSXVBMlZQQ0hBRGJmZkhqWENhUHc1NjhDSHpzSWptMnduYXNtOC9uMHdpeWtYR2pnZ0tIdko1emhSZEhqOTI5dUhEUHNkSFJZL2NzTE41OWJIU3RaK0gwK1BqcGhSNzlKejJHa21mczVJVmwvU2NLSDEwSXdVOWREcTJ6dlhUaDZZSWJnZ29tQ3ZJYlVOS1BMRnRyaDQyUUxydk4xZUhDblUwbkZMWU5YSEtEaUdheUNNWDFPazJjdWZQT004OTk1U3RmV2RpN1YzanExcU5IYjYzK2svQ2E2dk1yMjlSbGpRN2ZablR3a1FHVXlnUDlBUkg0UmphQnRCQldKRW9XMjFPbU41L25sQUV4cU9UcTVUS1F4emM2V200ZzBXZ2xKN3c0VVpvWjI1WS9NbHhQcDR0SHM3MzFwTXJNUm83Ull6c2ZIRm9xTGdWQ2RlVDZ4TG5jRGRQMUpITTVyaU02elE0QnplekVTOGJVc3BrS0VoTklBcFdFczNqZGFaU1R0UnUycTVNUVozZW50OHNMajlnZDNvU1pIUXJ0MW5PbHhBYnl4YTUrM2M3WmQrMS8rR3RmL2VwWHR5TUZiejYwL1l5citoVmFySDRkeVBqUzBzVGtFaitINFkyZkM5dUZ2eVFGbERjZU4vQThQK1E2N2VCSW5BUUNSc1Mxdmt3eGhiU3JhSWQ4Skp2TFpiUGxrVkZESnNvZXQ5Zm53eHNZK1M0YkhwaSthVzczZGZQN2J6bXhmdjkxYS9kdnk0Kytkbkx4Mk5TT20yKzZKajkvYW56UFcyOFkyenE4ZTJKa3JNdmwyTHZqNE0zRi9vbDg3K0pvLzRqTjVUNjAxcmMyRnQvS2NRUmFyVEE5SktGR1RVZ1EvWmJSRHpWWFBWQk91TW9KVHdwT1pWZ1lmSEZWZU0zYzNNWGZFRjRETUpiaDNMd2VZRGhJU1BXTDdFekQwNFlVUzdtU0dsOEE0aUMvSEc1ZGtMMytQZmU4OFRkWGJ6cDY5S1pWbW4vTC8vaklXK2s3cTllZnYvZmU4L1NkaUp1dUk4bUlHeHpwNXVNTjhHVWlPNW5FU1ZBVUdaU0dxaS9zK2ZHTE82cy9oT1A5c0hEclJaUTlQVURvQSt3dUJ6Z2Rpb25KSGhDRWlLaEpGejVPUjdjRUVqK1JFaEVRL0MrbVJOcTE5dGphSFI5ZC91aHJsaDliZXhJZ2ZrYVl2Zmkwc0EyRXhoNkFDeWRPZUJPVGFTRERiV1pKTUxVSU5hZVRTNkJTaWpLNElrMkpadzdSem90SC92clpRNyttM1VlL1E2K2plK0NPOWxhZnFMNlREckU5NlFDNGR3SmNNMG1wY2NWRXhYWXJOeE96MDhsVzd1QkxkOUJ3OWNlSHZ2MmQvZFVmMFNoOWYvWEQ5SEQxUlBWZkFGNEc0RTB3T1FuNmhFd0JTUUFwck9CY3FQZXgzUkpCcGRGdlFMajZRWEt5bTZGTUpkaDBtdkZrUUJUdkZ6cXF1K21mamdKVHo0NWUvTFF3dTdIQjkwaDh0NUNGODBXb1FnUGtPdkljMmFKV2JGeWpsV1RwQXU3U2hRYmRWdEZPSHFWZG5mWU9xNFdhcWRuaGNKcVZkTkdBK1VFRFpvUnNCNWh6NmpZTzArZnQ3akpKUzJZcUFXQkpQdGNXc3IwREZ1YnNDTmdEQm5RTFFDZWtEYzVCQm4rSE9tdW5rb3h6QUcxa1NiNWdVUVM0MFJveE4ydndPd0IraDdNRHVLYXIwNWpCV28vL293YjhHTmtLOEJmVTdSeC9NNVZ0aWxVRTdLVkczQzBhN0lBZnNRYzlQQlZJdVJ3ZFBydlBtS0dEcllIYkQrSTFUSDl3a2hsMTJnbjZBOG9XSXBwUm56TVQyV1NXbTNWR1hBOVhHaDNkOEdDWGcvK3hLaEd3S2tDOTg1VThLZmhLR05hRnNGQXRIZm4zNTQ3L3F2cTF2ZFV2N1FNakE5U251Wi9OdnF6WkdXMW82WWNqL3h5WlZpZU10UUloU1FzWmxYb3lkblVBRnpSdFUyMmZ6aHV3dzJ5ZndKWXhZQk1rNHRsWEJobG90eEVRVUY4TEFxNDNxcTRJd0lIQm9oMW9LSzZJVktUTHkwK0VkaDFVWThCZkpsRTJhWUNaaXNoVUhqUk5Fc0phQ0hRRWZRUUZGSVF6ZFFQRnRYVzFtNUJ3Q0tZSk9qeVpyTU9NQ2lYb1dUTEs4cEp1dTZDVXJ6UVlkS1BENlpnOWFPbnN6TGtIdHd5TWhPdnR1OVJVTEJTVjVaekZPbHpJekdRMGM4K2cxUXNHcmVLTVZtLzZCQ2ZWOGhNOXNKNkNqU3BXT0RWS0hkK1p6ZkpKSXN2QjFRWU9ES2s1V0psWmtjM24yanhUUDNKZGpWNmVYUTM4SGpid0M0RVc4UnpacGE0R3FGbXlVNFdkTzNIRlQ2VWxHR0dXSmZNNXdFQWhzdEorWGtxVDhVakk2M1owTlp3K05oZXpLUmxQS3BwTStpam5TYTlITW5INzBpU1pnQ3NGNEVyRDBwVHJMRTJCWmpQcFZORHZjbGdVbWhTU2lwTFExc0ZoUDI3QVRwSTNBK3hsZFNGTkpaTUdYMWd4eTBLYkdaUzZHVklwZ2FZS3FVSStsODNVNXJId2VaaE41V0IyY1lYc1UzY1hlOUF1VmlKd25KM1VKRG1vYURMaFlaZE1BdHNXVU0vT0VFVmhPeGxlTlRlWXpBTjkrV3c0NkhWMzJTMnduNlJDSzVhYTZheG9ObjNOdkVCN3Z0SXZibXBQRDkyM1lPOHRUdzBseDl4aFI5NGJTMmFTRWQvMk82NGFhbTloajA3UWlsQk01Y3RPWjd5eksrejNCUS9KRXlmZU1OOXFjN2ZadDJDTnRpYkpvQzJzV3JxQUJCWk0veG5hR3ZNOGFzd1RoV2VmUXlsYTR3OEoxRVJCTXAxcnp4NXBtS0FubitwUDk5ZkFtd0U4d0daK0E4WWZabzAvVG5IWkh3YitvQ3NXblRGQUlKcWJmQW9LTnhwRG9hNU8wR01Tb1VROEZvMkFYaHJzQ2xJNzdVaGFsU1NYL1FINDlqVElyMjZTSUJQcXVFUXBJQWNFT0dzQjNWWTR6czFJUlJHUG0vbVY3blFRRXZEQlJyc2NDV2NDSHV0S29OUkhIVGRWYnZCWGVPQUc4T2craTllZU9GSG50ZmpJUjNTL0JaMmNvWk0xMThVdlozNnAreTYwOVc5bGUyalJ6dDZydWN5R2t3d1hBU2lURnpieGFKaTVSNE5TdUZGaHViUUQ3eWFRMmRraU1lQiswSUFiSVRzQjdydzY1L2M1dWszeWtvWHEwdUtTMEFFeTlianN3YzZnTVlNVlp5QzFPUjQzNWtpeU9ZRC9Pa0UrMFJXcldiamNHaXg4Rmp2TVluZlpYYWdkR1BQWW11YXAwU2hZbTBkV2dQa1VXYm1BazZIVzlGK2Y1MUZqbmhpN0UyQWVDMVU2ekRZUktDWnZSaThybnlFWVFJckZvNEYwTU8xMjJ2MmRmbU1lKzZielJNa3pNSStxVGhLRmJZdDhCWnZTQkp4dlNodGErY0UyWjJjVjFnQmtJcGNna3JtT1NOMTI0S29HNkFiczh3YnNNTnNId0J0ZzQrVURDdFIvQmpMM1RXd01NdCtFRnkxb09KNWdjM1RERGRjRm9sdlVUQVFZNTBGNHpBZ01pR3VaRk5PNlE4VU1SWE1UWFJaY05KZTVhQlptcThmbzRpNzZIcm80UGRIaHM1b2R0bmlFQ3FzWC93ZzBBN0JLWG41eDY0eEptQktFZUZyekE0R2Vzd2R3aUpHNzFDNFBsUlF2YUdQQ0N0em91b2FUYjd0QUJSYW9LSUNiSkxFckpTR0RRcEF4aHFMT0paOXA5NFRDZFI2WU1KYkpNZDNTZ3JwbG5WTXkxVWI1cVhkVU51ayttdU95U2V2NS83c01aUDVRSnF0c21xeDZrTjhCYmhmempRTGdQaEJacUw4cUZFWFdwWHlseFo3aHdaNUtzY0o4cGhtTGtxdnBPTSt6YzJIVFpJZzJSeEVnc25rRUxrZ3NJRWdvVThFM242T25wMmV3WjlEaDRuTllsWUkyUi9VRjlPc2FjNlJoSllTTXE2UGFPZ3lZZUZhVTArMWR2UTRPMUl4QURid2ZOV0JHZ1kyZUk5dlVLUjJtQW1TaEtESXVUWlNoZ1o1eXNWeFBGSUhaNDk4R25uQVJIOW1xam1FQXhTWUx4QXBjUWF5Z3pWck5aMDBVR2FQRElqQnVKUVE1QXNhN0hQb2Z1eExqTEZFR1F3aStTc3pqQWJ5U0tDZE83TitQUHVDOWUxZXJOOUpIcWpjS2xzbmI0Yy9reFYvUTZlcGYwSHNmZ1BVeEh6UGJsdzV0WDg3QittWlZ0WTFzNXg3b2E3a0gycUpaRFplUjZTQTFhSnpCdC9QN2RlTjlBQi85MllJb1hFQjM4d1YyS0xVQUJhV2c5RW5VUkUwZ1daSWN4c2EzNGNrUTQwOE9JN0x4R29BQmNxcTd5MkkyQ1VzU2hhTU84TTdWUXdJbzFHNlRuTEtUUVpNUkdzRDZMa0R3MWVFVFpMREs2ckJNQlJiSUVjUUxzZ2tVSGVHQzVxMWswQ1Q0S2Rra214V1VVZ1pQMGVEOUJLQllHSDl3ZUxHTkd6azhpWXBtRXhoM0FKSGpKWE5JVGdkaTV2YzZ3czV3aDFYcWxyc1pQQXVIUjlETDhVUWR2T2pHandCZUQ5ZzNJbHVtMExMSU9pQzRTTURwbXpEa2orclc2Ti9ZQlRCWVZBaVhSNHpGbWVvV1o1YUE4alZTSVM0SE5uNG1Xb0EvTlRpa2s3d01qKzM2WklkTkVKbVI1Z0dSN0RKUlhTTThpU2VDbTJNKy9sdEd2VlZkS1kwSUtHL2hLbkYxZDFxVWhyazJmZ1V6V05uZHhuRU9zMzJCZFV2b2hvUjFuNzBjeHBSWU53TGtNK3dPMjZkMjZSYXlVRzhoZXpVZ0xZYXhxOTRnMWp4TDZ5b2NDUURtQlZ0WUR6dTB1UTRPckxaY0FpMTJMK2ZqNTJCbFBjeW01R3NNYmR6RjdUd25sVURvbWNCWWNGQmhDUTBsRVEwbGtabEtEZHdEaW5ZQWJTT3J1Y2FGYks4d1B2TjZ0dWVkMmpuK0I0QTlwcGFkY0lPYkZWZ2J5RmV3eWk1ZzVJZ3hRV1BzQms2dEQvNXp1VElweGRCbFFKNWVMVHdGTUx1NFBDVndFdEdyYjFWTXpNY0grSUZ4YzVxNyttUXRWTU45Wk5SR2JVNG5JS2padURzeEZzUHc2OWJrd1BzQnZ6NjFCNDFCOUxXWUx0UWlORnFJZ0ZKMjNPQTZjTUFXcHd5OWVrajRNdEhocEFnR3RSQ09kcldMeDRIZHZKZUhBMnNiWW12cnJsc2JPMmRJcHRPWFJjYkFwUVlqU3EzVnYrVlJEeGw0enFRSnBIb29BSUYyZGloT3M1TkRVaEFkMUgxZzE0UlpGZ1BBNkRyTWhMNXRzSXpwU3J2QWxaM1lQUjRXdUNvcjVRcndaY1dqZ0xaeS91alIxU2Vlb0EvOWRIRnBrYjZoK3VkdlhucnpEK2RxT3UrRGpQNU96YzU1TXo5ZlpsSGdXNm1iZVEyT1d3ZEd1Und5WEZnR2pNY05HRWx5Qm1DTXFxVU9zQlVaSEdGRnFUTVlHeURaYkRhSHplRndJVHl6QmcvMjRFRkdQNmUyQnk4QnNuQTNHRGpWc1ZjTFF2WHJldGlBRVdMMzE1UzYxVThWVXdmb2p3eVd1T0tqcGlXQXAwZ21wcjh3UjJ3RDRGUW1sZWE0RlJBM0ZsdGo5SEpwOVBvVGdGc0VEWlF2ajBvWE5nc1Y1L09aR240Y3pnY05PQkh5ZG9CVFVVZEdTbjI5SnRNU0hIc0Fab0xUM2xiUktRd05GRVo3UmhHbW9tUWFZTlp3Q3pLWW9PZjBBQ0RLSFE2NEQ5VFVIc2RDb1RCUUdIQjRFU3B1UlEzbW93Yk1HTGtmWUlKV29sREpJcHRGRTBYdlFqdG9vK1dld3NTV3NqcXFEdllYUm5wR0VLcVY0d3FTYkl3UThhZkExMzdTaTVJT1Q1Y2ttczRxUUhUTm1XK1JCVWtpeDgwOEFCRU1VSkpPQm5xRHZUNHY2aFQyRHB1RitLbmZxbmlMQ1QxQUI1cTUxNHZlWDFsV0VwNk1wdnNhanArM0xiN2hjTGw4K0EyTHdwbnEydmlTOHJHUEtvdGI2Sk1YMzFFK05wZlB6eDByang3Ym5zdHRQNmJydzNQNU42N01ydDNYTTdlOWQvbnMxcTFubDN1THk5ZHUzWHJ0OGliMDlwTnJ1ZjRoVXlRMXVSU2hld3U5SHI1NzJXSTdXQW55UGk0SGdSR0ExTENCWnpmWFMvTTF2WlRET1cvQUNUTWVZUEVTVUVUcFpvcG9NMFlzNHEvSGtVTmdxNWJJbnk4L2tjZDczUTQzVEc4eEh1c1daTWtVb25BbnJZVFliNFdtMzY0dlAyR0JCM3dnZkVFRm9HeEcyTkdUR0ZLS2s3WFE4aE8yelQ3MnNJL3psM3BhamZHckNqL1d3NURNMU5OamtldnI2NnFscDVCMzVic3hROE9YcW1Ba2tyc0RLeVhGQ0VIbVJMZlhSN2wvVUJySjVpaGFxVlBDdXhkM0Q3Qlk3dmpaNHREeUx2ejczWXZqNTRyYk1nbDZKckdyRjhPNlFqaVRyRDZlM05XSC81Qk9EL0VjbkZSczR0UVFqKzZtNHpRemZqWkxQeEVJb1lOd3k5bHNkU1VRWVNGeFk2OGVOdllxUk43SmJZaFJrRkU5ek1ZdE40a25pbkdpZGhzSVlpcFh6d2NzZHN6NHlhdkpxU004Tm1UaFVlU2FCMGlMSjF0cThXUTlOZ1NLT3cwRkEzNmVRMFU3YWFmRG05UmlReHorNHdiOEpKem81OGdlZFdjQWpCNmNBK3p6ZWorVE5vdTFOb3Z1QWZmN2NSNS8xQitOaEVQQmhyazZ0TG5nUGpqRTdnT3ZkaDk4QVNDQUxXSnBpSWhyNXRzcldRZy94eXkrTFQ0RzhIMGFyYWJKMTBsSkhmUjZCQjdyYmlmYmExRnZoN012VTB6WFpEdUg5MTREWGhKTzBOZFJ5dlV5M3pyQ3JMc1FONE5hTEJhSGlrTU9OOEkyYzlnc0Z1OWlzWGlWL0kzcTVySDRLZmhXQXF0c0dKakRCTnEzRlk1TkRwbEdScVpwQmIxS1pGazZDU2NsSWVFcHM4UHd0REVjTDBEcFRGdUVRbHl4djJMUVZ3WVZqNmt0blVrN0k1bGl5cXhFcnpSM0lOWGU1Wis5YkVxQjBOSGk5NTk3N1dXekRFWWJ2Zi9yeXRiMnZCT3M3VFg2K3ZsZWIzTHpYbkt2RVhiMXg3alhCdXcwK1RqY25LQkgxdmlTS1VLWFo4cGFma1FYNXN1WjBNVWt3YWFjeFN3SDNjc0VOb3k4cHJrUHVuRW5NSFdKcFVwdzUwSHExWS8vUkJoODhUM3ZXWDJjM2tLVnVibnFyeWFyWDZVakhGZUV6K1NCWCtQNUFlNHZ0N0o0Z2JsTy9WTmFzak1zRmtvdFhSYTBEMndOTVU3a2R3ZkRPNHF4ZUZDU0JZejdBMFhOc0g0ekdMMFl6U0JuNEpJMFNjZUI3ekFObEJscGZCbnBUTktpeElwU0s1K2t0S1VoRzlIM05mSkR3SW5yZEhUMWxoK3AyL0xUUEZOa1Jpanl2WGtCOFRMV215Wi9CQXNDSFYzYkU3bGxrV0NSMjR3WW42TEh2L1c4cUE2NDgwYlVJUVFGdXBvSnZaT0NLR25XcmN6WHBHVnBlam85TUx3am5YRHcvSjZTcDZSbFIzbHE2VDJyenpWa1I3ME4wNlBlUm45US9kNnFxcTRBL3N1R1hSalFaTjRiTlArTElaVmFNbUJBUzArNVVqVTV4MkY4MElBUmdkVThoM0l6R3ZGNTYzWFlGa2h1VnlqZ2lydmpDSyttdnpiakZHVHd5dXF3dTBWL2JjM09jYmtDcmdEWXFRQlIxMTA1dkVjTmVESG1Gd2NkdTE1M2JZRVVqN2xkMlhTc0o5NFQ5THVpN2loQ3RHNktvNThNNlhxYW9mTzFRODdyOGpyNWFyUEZkbkFTekdhQ3MxblQ5OXJRbisrQWZzZHpHT2NOR0dGR0w3QkZERjN2c3BndzJiQzhFV0I1VHhseWxXcnRvRVN3QStzS0s5dzFFcEtBK1ppZXhYMDFLR09ZdEVtZ1A4ZlBBTkF6VFlQUW9XT0JTVEtaUE0rT0JVV2dUYlpBY3hyVmJXZUdCdXBjSnZsZVdrdXJ1dk1EcnVSRXhIQ2VKQ2VUaldsV0JqMWVNT2dSWi9TNGdTY05aQ3hVUnVlSURPYUtvckJMS3JqYVFwK1Ftb0tUcDhpU2NxNDJ2bVhVdXVyYmxFc01QQjQyOEFpUm8xd1d4a0d2Y3pPOUx0WkdyMnVaQmszUCt2MW0rVitNWjBMYW1mMTd6bnQyczhSeXdiUXNKU3BmYU00S3c3d3doNkxrNitBOGFzQ0p3YjNDOE5QaG1LbHNWU3lpQktpZWE0UVVDbloxSm1MQlRDampjWFVHdWdJTXJrM2o2V2I4L09RZFhCN29jQlV0aXdhRlN3UFl6czVPUjZmRHhhRFY3cjltZUVIeVo5eWU3UUp5Y1poYWhwTlpFZG9DZFhlNkhXNEcxYUt0bmVXa01aZ1JqWWFIdWMxbVJ2OFhPaGNNdnhPbGRXbXBsTUxkWktVV2FuRzZkRjlSTTZ3Z3FlaDVQYUtKdzlPY2E1aEtRMFFOb3N3aFdxMlVXcnV0M2N3cnh1Q2FHK0ErYXNDTmtUN3VEOVJ4QkJsaGtjd2llcVEwWjRYQ1lmcThnQ09OaEx3Slg4TFJaZlhZUEJ5eWxidVQydURzQjQyQStXcnFZSXNtN29CdklBQkQxMjdGRzVxQlZMaXZpK1hrTVhoUmpaNTdPQTBVdktkNWZsNU56MjNNMU5PdU5Vclp2VytsVnFmRHhTNUdBKzdqQnR3azZRZTRpK29POUNucHNNV2FYdEVLWFZNRWJEWkswY1BFb3ZGOERrdkRISThhYzBUSmgzamN0QTUzVEtCZ0xvNjJxQVBhMU5sdDgzWjROZEJtL1Y0ZjJ2Z0YvVXY2WTlDTEN1UjFxdHRCQmJFYnRCY1FLalNkQ29wY1UrZkpXUlJZbURLemp1bHVNVzdubWhSQk0zUlRiVWFZVEI0K1RPSG04THJxb1NTZlRjUUNmamlZSFlwRXdqUnNWcnhGWDFKWG9WSHZTY0xsUFlyLzhvRDZBNUtVUytReVU2Ny9hZTMwbVQwOXkzRjFLamxmREEwZjZqMTBlaUcrOXB0em80WHQwZGhNWVd6T3NuZG0yeTZYYTNaaTB1MGQ4L3ZXOTFhZkdrOGtIaXVPaE1QSG5JNWg3dGRaM3ZpVjRCUytRZHdrUVk2cG5RRy8zV3d5aVhTbHd5WUlTOHRQSk5Da3g4dUMzUk5zSWVRazFVMzZVUDBuTEVLQUh4TnRoWjFlVHlUa1NYZ1RHVmNhSzRneW12ME9XbHpGZ2F1S0NqbFlvRWZYOGdSbmFtcmZZUC9PeU1KaWVOZlF3TjZKMUV2RlJaOS9zV2Z4MUttZmxvL001akpKVmZoS1YvVXJ5Vnh1OXNqOXFmaVA0dW56dTNhZFoxZGFHZmJ2bjJEL1ltM3JlV0sxZXA1NFhUMVBqTVl1VjgvanBUMzUrVUJmNm1SNWVGM05acllkTEkyZVNnOEVsN0xwNmI3UTFlUFJjRittSnpkM3RGdytNcGZMcDB2aFJHUjRMcmZ6ZWtiYjhzYXY2SzgxMmg1WE84TWhCNTVWdXVKeUNsU25yZTRQaVhIbmdDVG9YQlNxZmNKT3RPRThZTFR0Z3AvUmdBOUF1L09nNGZtTGlYTGpBb0RFbVhwdW9YOFUzaldJTkVVYTk2MUZGcXYzbmxvc0xnQjVDNHVudHFVeVFORVJwSEVxUVJOZEY3TS8zWFUrR2Z0SkxIVWRYOGN2NksrQnRrRllCMGllSUp3MGJzV2p3b3VxZlAwS09JYmhVQ3dhU29RVFNVOCtxV0J4UldOYXZnY2RmNGljQ0F5UXlHYnBQL1FjS3BYV3QyVUF1NkhCUFJQSjZodWxxN2RuNXdQdm5yaktTc3ZtL1dPSk9LUHkwZGxjZHR2aEVlL1M2WkNQTGx3MU8zT0EyMHIwcVBCOXNMcCtSN1dhUVJKWUtGcHgzTEkyeWltOHF6THpOS0JEeW9lSDBXT1kwMEdNR29FSU9kZDJoT2V5VUM0RkFPMWxLeXFDbVZTM29rVEFTTlBPdDRlYnlGcWtOeFcrWVdXSE8ySHZEblgzWkI5NmFQRUcrdno1aFRYSk5HT1Nlb3JYVFZUMzBmK3A4VlFSOXVJRm9IRWZ1VXQxNUhOUnUwbVNmYUM1ZTFtS0IvZkNKY0E0NUY2NFdKM1lNWkkrRWlKUHJCQjhxMndnMlh3Y0UxUzlQWmxVS09CMmRuWGFMQ1JPNHlpb3BEcG1LK3NaSTVyRjFpeXFxRmZudlA2MXlNTDUwME9uZTJKOVM1bVpIZUZkWDZweG9ZdzhPSUk4bUp5K3VISG9WTWcvNXZPcWswZFNtZi9ZZFQ0VmU1RnhJOU4vNGR0MzRGeTVVSmR5aXF5R0NiNlJKVjBYaTYyYWpDSkdqTEtEWXNzRGYxenVvRFIxY09ucVdGNE1ydzJ0blY2Y244alBlRkc2UEYzc3ZYcFg5Zk0wcDY1a005WGZSSnB2WlhWV1h5STJ1SHRoUmtPVWhGZFIvdmswZTdFRE5IR2UrQXZTM0VadE1oREpwVXR6TVBkOE1Pbk4zbGpNNjRsRk94ZUZFL2lYbU1jYmUwM1ZUNS9IdmQzNDRVWlJteWVFa1k5dTJOQXV1SWRZN1lzK0kyeU5qd2RpVVMxSkNKaHdUdncrdDdNalpBL3hpWldtaWNWYUtnOXE3N0tPeEEwZFBxdkZZWTJGRjZlRkUxRWZZdU9MdnZ3Vmt6QXRDTkdrTUhIeHMxdG5ESHAvRytodEpYbFF5MlZSeEhBV0p6anlPZFBpT0syeHRzdk5DN0VxamtwSm9hbWNaM254K1lPL3BPS0pmMFBxbHI3NS9BYjUvdmVOZlNUdkJMZ2ljYXBkR0IxR2VLaitVc1ZYZEFHNTNya29mT05pVnZnS0h3dWk4OGVnQXh6NDA3UkZGRkdPTGo4UndWZ3dPM01uRVI5QXhxeElJcnZxOFZEaUw3aDg0a2ZCK0pDbkMyVklKdVZOdWRJcExWMm81R0hjNFd2aUVXOFR2eXowbFhhNnczdktpMGNYdDFXeVUxNUJXSnlwWkNhODlQbVZucDZSNHNEZ21WM1Z2NlNGNmVWc3p1cTE4YittMDlWMzFYZ1gxdUVpcTU4RTFzVmNCYjRNRjVPZWxFa095Y1JEc0NHNEg1Z2t3YUE4dndxMFQ5WlZ1ODdhS2ExV1VzTitNOTZteis5czVtd3VUMzR1ZEROOFlpUUxxb3Ntd3ZIQzFDUmVoSzU1M0hENlk1NVlQaTNCM2xaMElhNlZvdm00ajRhNSs4cnA2WVBEcFFOcU9nTS9odzlNWi81OS92angrZmxqeDM0NmVtUXVtNTA3TWpwNmJEWUhvdnlCODd0M1gzLzk3dDNubVE0eUlEaEJwdUU5ZVY2MUJQd3UwU1N4L1VWWkZtR1ZVeHBsUUVpeEN6M09mQ3dCM09ZRUk1RlNkdzAxajFsWDNWNFBXR2hNR2VGWEpuUEYrRFNhNlV2SjVoeXVlb1ZrZVNHOGU4aVFYRHZERHhucXlOZUVQOXVSeWRYdXpPcFBoTHZyOVJHazZ3Q1QwN2ltYTFWTE9PUzBtOUFwd3RjVUJod04rWXlyazduYzFaWVU1NklaeDVDMlE5WlZGMlVLQUtySklKUGQxSzIweW1UZ2pNM2tNR29BaXczU1Y2bXRadXJpUEhXbU1yK3U2UUNjYjVmb2k4UkJ6bkE5dUtQYkNtY0pKQzljdGtzaHRRTitVUDRyQVNOSk9NVEo1REhmT0MwWEk4UlNONWpJMU5iV2tLVGhJSTVNU2svUzBFNGp2eWVSbTEzei9YYXZyU1BVMFRmcm9zK2ZMbzJMZUQyT0RGVC9TUGUxLzRKK0FIZzUxNjd1TFdZNFcrUGlXdkVWMUwzaHhSYk9GWmR6NVIwOS9idm1aMCt2RGgvcVQyZFhjb05iTWdON0ZyZmZzSHZpbXVuQmVHUTRHMDFhT3UxVDVlbGQwVmdwRk9oSlIrUG1McnM2T24wd3cvR0xBMzZIaEx0QlR4bFdCMEFYSkU2d1ZJUVZXUUoxRUZVR2VodzV3c2R5UGRIZkVaZldnQm91TElZT0Z5c3NPYXpDMUFXK3B4N21tTGx3NXN6aVc5NlN5THFpYm5ldlozcmJqWFJxNG43SFl4UFZyNk55dlUyUko5bmNDeHUvcEg4UDl3ektuUTR3VmFnaGR3QUZOaWx3N1VrdGhnNXlSLzh0MHp4cmhLdkpIUWQ2Rm9NZ3Bqa3lXS3hjNXA0aXh5TTdVT0FzY3VsRG42OStZOXRLTmszUFZmMGdnYzdzb2xzUkg4eEUrVmZBcDZuR3p0ZXV4cTdFUzlqKzVvczczLysrdFM4QndGZlJ0MWI5eFBDVHZ4L2d0TmJZK1ZwcTdFcjFOWFkvV0xoLy9wcmJ0dDEyWnZ1RitWY0R6RHZwL2V6TFR4OUV1SmpaOHcyQWEwT3BhRlZNMUZSRHNhNlkyVVl3TzRZeGJDVlh3amlsTDVWVDdKOTY4c0FERi9aKy9ETUhIbm5Ici8vOXovN3MzeTUrNFF1NDVvMUJzRkZ3RDRBL081SHhpWjNkNzVwczA0eVZnTEEya25LeW1tUmZoUzlkcnN2SC9jUDRVN3ZmK1Z1N2YrS2JIclg2N1YwT2N6aXp0cE4rcjNvVGZjZkZQOWs2SkpxMmlTeGZrb0lsUytodnczeWIxTi81cnFUK3JrQUQxUi9RbTZyL1NxTmI2UFYwZHJ6NkNKMEJXNXpaeThMbndCYS9GOERKTkFBbStYdFV0eFBXNHdDNzJRcS95cVJEZFhaekx6RXJvbUlXN3pHc1kwWGh4bm05RVczUnpaL0J5dzAzTEdxTGJsRUhCTnJmMTFzczVKTHhJRXV1TXNzMElrU3NSdjBGeC9sWkErZklyd2g1bnhwcWgvTm9lYURmcEN4cDJjcFdxaEF6WUhOdU05dmZRTHYzVWtOYlVZNzBGZ1ZhR2lxTzlZNDFvMjNqZFIzTmRBNEN6djlEOWZkU3hkeUt0NlRSdXQ5bUVZQjJRTUVhK2N6bVZtcGJkYlNITC8rQWdieFZSejVXQk9ReERqWTQwTi9Yakg0SFV0M0EvMmtELzlpUEVQOUw4RW1mam9EZDBpRXFpaG5tYTRlNlRVZDk2TExqRGN4dE91YVpzUW9TZm1xaU1qTTJNenhZSE8wZGJjYS9rM0dOU0lZM2ZpSE93WjB5U0Nwa0IzbDUrWWwrVkRuUlBlVHJGdEEvSk5HcC9uek9KRXVtbFZEREJ6YUw4Y0U2RjdVWkM2VTJLc2xVT21jM0M0Z2ducjNZS2hCQkJ0T3JROUR6TEhDT3dVMEdrOXJZVldLMTFqMm5qbUp0c0VSdDUrQWtTN0pGT250bEQ0S0JtaG9lb21UNzdNU1c4c2hRWmJpQzlsNGlIZ3BvcnFsQk90aTV1V3ZLcDZsUXVrblA0d1U1c0NzMTI1NWZFTmxzanQyci83THo5TlVOYnF2cGc2N1kwVkhENk04cytQdDdEcFVtemlSeVorak01SDQwLzYrNitIZHpvOE43WXJKVmpHM3ZHWnV6N0p0UmQ3bWNNNXBuYTZDdk9HUjRCWVlTOFhMLzBERDlGRG9IcW45ZkhPa3Rka2E3M2E3aGVobFFPMC8rcnhIeTI1Zm14OGFEY1YxN2ZyVFUrUEZ5NDl1SUFYYVMrb3NndnRxSmdScmVqeGw0aDBFT3ZPdFNlSVBRTWhNRk1EbDdKVUpyODZHdkhGdk5ueG9BZlFQUHpTUjVobU1VcnpsVnpYU3MwZzlTMGsrSmtnUkZLSVZPWWpnL2lkWWgrc2Z5aWgvV3VLeXBsZ1hBMUt4UWN6Mm1pZ0pLc2tYUUhCaTF0SVllWXl3TDlaNnBlMFNXUGZ5NTJpVkNDWnlDVWw5dkxoT1AxdmpmZWtuWGJMdFkyUlc0YTJsVHduSDM1ZHkzVGRuSURkNWNuVWZFb01FamNlQ1JqMStLUjRhSW1WZ3RadXM1TzdWMFVFVzBLSnZlY0lhOExWL1JNLzk1bVd2dytxZU1kWVF1RXZMSGFueU1XcFZlYW1sejc4a3JGYXBmMXJnbWkyaTIxTEN5V3BXVGJaV05oalZkL3BuV05VVUV1bTBhMldXd2Y3UDdqL21sbWJ5NWordEowNlNwNHRNa21DVGhIb0R1WHEyNXErVTZkN1ZBMDZsa1FxdjRqQXR4WGhSc3dIN0dnSjBNRWZKNjFaNnNyd2hlZm1JWWJ4NTlHb3kvTkV5azFFMFVVcFB0Q29nYkI4RVJTU1FFbXNnbGNuVzF5b0JXcllhNHZPRmd2dmd5dVZ2MThCcGltZGNRaXlZODRNaCttR21ZQkxneS9QNVdyU0xsT2xiOUlaelJrNUppV1ArVllvTmtRdS9aZkJSelV0WVhISk15M0JyL21YSmp6ZDBmUHpqVVdtM2N2M004MFM0QWtDeVl4aHV6alE1THhka0R3NjBoZ1RiOEVJUTlXMU9Yay9XVnhtd1RCTml4ZTFpR1RQdDl1TlFtR1BNOHJjMkRzYkpIQUlFNWRadkJlZWd4WVFUY2pPK1NNRU0rbStoTjl0YmdtM1g0WXh1L0VqNG1mSU5reVFXUjVlOVQ5Ry9kb1haR3drNkJSVG13c0VxTGNxQTdtcVg3ZUZlYjRoMktFZS9JdEJ1anRFWStYSlRWeUNkaVFULzFVRTgrYmVheFVoNXZFY1lBSjR6aEFTYnBGTmpZaWhrYmR3aWlqZ25vUWhLTEZaNEZCVmZIaE4wQXNvRkp1ekVXYXR3VkJpYUVSZkJndWpBWTZhNDhtSW5obGpoTXVXYTFYekllODhnamk1T1RtOFprSGgwKzBuVisrT0wvcmd2TDZQNVRzTzlZL3kvTmRjQXMzcnIrWDl5TkN2WXRjekpUNW1QR1o3cXd4d3VjUFl5Y1l0VGJjQUh3U3BxVUs0VXR3SlI2dnpFY0h6ZjNGNnRiTzN4L1hlY2xOdFY0KzllTXQrL25zbTZjWUtWMGlNZUxGQmtyMGU3UjRrYlh3bmE3VjgxdGcwZVJNTzV3UEJaT1JwSkpUejVsMGZJME9QeG5EZmdSTnpzN0hINS9YeTZyMTJOcnhZMHNQdFYraW5RcUVpNFdVb1Bwd2RvMFBHbkltT2NaWTU0a3pQT2dhazFUUlE0eEM1b0wxYjdtSldGOUhTekswblpHMEVPTVFtN0tFMnp4bWZhRFFjaW1BRU85bVVBTlIxc2pqalZhQndISHZlcXVOQ0RFY1dTVFlmMzRQVVpxR3Q1bjdlZTd4R1RHWEU4YmM4V3NCTHREaEJyaWdLeXdXMVpBazhKcHJHMm5HUnhBdW8rT0RHd1ozTUw3R05RbXM4TmtMWE9oM0hvSW5sMVVkelRPaHNkUnU2RTMzK0RtS2F3TjY2blJ6djlEUWxiVVJXMkdScXBkeTlkajNweHMyUlJ3YStNa3hoeVBHWE9FM1hWbmdkVjVVNnp6dmlTVGJnYWU1NEFWV1J3aFJzNnBYVkVSYmdzSFNLMXV1RjFGemJFWEpqVzNPZXZhYUloNVZpa1g1MzVZWTk2V0lldHFwMVpTbmNtazlLNkVlb3lob1VDOEtkNmdiclY2T3BtZ2FBZzgzREF4STRvcUNnMTZaeTIyVmdZN0FXUEwvYUF0M0tWMjlvUHVvbWUwaWJvbFF4UmlraFFUVUVtV2F3cWM1dU52U0cvTDZFTzFOTGQyVCtES0hJTURwZUdCOG1BWlNKcko1QzBndURQeUpqbHZsNHBhaDhkajVhRTZIYjdRTDF3eWl1Mk5LTW5KbWc2Zm5FNXVGdFhXWXpOZTRlc2tUVWJJWWRXWllKV3RhY3hLUlpleEJYTUllbGd4cEJZZThyR2dUUzAxemcwMEFIWVR6OVgvZWwzdHltWUcrek1qMlpGWXhPUEMvQWVhUStzY05DTmZ4V2ZVV1dqTEh2WDY0RFBSS00xQkNsRTVzdDliamtRejI4TFhoQTV0blVxcGh5dERCNll6eVlrOWc5T25BNWJSbnJuVVpGOHcyRGVabWo5eFVyRDNWTHFEbHBHT2hIZTJaK3ZFSDV5YnZXbXRtSnM1UEZJNk9KMm0wNlh0dC9aYy9FRjRhRGFiblIwS24xdGRQYWZKdDZJbTYzK0R5M3JnMTk5Uy9ZVjhyTk1reVg0d0NuMHMzcjFsdkRUTUhIVVlWdWxoM2plSzNyZW0rTGVsTmY3ZFh4dmNKaEJ1YVEyRVJ3WUhCRm9wRDB3TVR2UVZzK2x3ME9QcTd1cXcwb1NRc0JrK1JvNzM1d3k4ZzREMzc2bWVRWmluQ1hlVEZnc2FaTDQzYXNhTGhIa0ttbEMzdHFJKzB2eEltd1ZZV3hjUUc0QUZESlFIeWlPbDRhSG1KVENEUmVUNGl4SDRXNW9Na1lkVlIyOHg2UUF0S2tSbElVZ2xXYzh3UUFNY3RFaUNLcExoWVZJVUFRakhUbVY5WFVHZk1aWUZyL0VCc3ZuNGRRdytvRUVWaS9pOUxtZVgzWlNXMG81dXErSXYwbFNsSkw2U3ZJUHk0dmJ5cml2SlBSQk9mZnJsdjcraS9BTmpqNS9XOWhqdnFNZmdnOGRWUnd0M2NscWhVMWd4bjJ5N3UyMFljN0IrK0N0Z1RYNnZ0bVZOU3BZMmZpWWNGZjZEbE1qcUp6dnRMR1dDWjdhNHRUWlg1MWdSTVlhaG1PendHNy9XYXF4cjhzUFdWOHpuMHNsTUFZUEJ0RDVNbG1zS3A2SFFZTEUwakVuemJJUk9nYTZIa3ZNelU5ZnNIajJVTFVSMzVFdmI4a1BMNVlIS2JHWFg1TTU5QzNmZGVPSjIrRHU5M2VQdjhQc1d5dHNQeEpPRDRmQklNVlhzRGppSE1uM0QrWUhDME9UcEkxV0ovc2NkYno2K1Zwcm8wZnFPWUZYV3Y0TCtIOEo2eDZCTmtHVEtnMnRBYjFpWUNUbFFsazBuZ1hTWUM2QTNwWVB4SVF5anUvUzJJWWJLM2hKUjN6MDF0ZmlPZDlSbmpFd3l6ZnhEVGFGMWdkV0lmMGQ4TjVGSmtDeXA4NmhwQjZ5QUVhcmFoRjR3WXpFcnVjQkxuQTJjOUVaNVlHVVFKYWdFZlI2bm83TUR6Rm1aeU5qanhWOTA1UlE0QXo0UkZQSm0zTDU4N09qV1c5ZHUvZlJpYUcxWVIwLzBIVHg0OTkwdmYxLzRjdld2ZS9yTzdFUVVwMWNaaXNESDA0Q2prOG1xajNKOS9XR3RjbHJBbStZZVZtVmlxak1yV3BvNmJHeHNmQTJldERNNS9WR3Rwd01la3FhZURnRHVYRDJnVFhvNi9BMzJZRER3d1o0T0NHdE1MZk9lRHRqT1FVVDk2UjZDeWV0U0hjRDJiUjBRNXIvQUFINVdQNnIxZFRnQnY2bW9JNnlwZ3lDZTVKbndjaDJ3UzNWMllPZGZ5d2NDUytOQlhyTytTVWFRSGM0Wjc5TmpsbW1IMENGem45REdzK3o1MmpyOUc1aG53M3B1OC9WeG5Fek5DMnh1N2NCd0FWbDBqL0Fsc01NZlpMMGRIaUxmZ2c4T3F2c1RWQkhpWUEwSUt6YVRSVVQ4SkZhVWFiWUtPb2FyckhkYkIyV2RkcUlScHdNUkx1UXpxVWh2dEpldnZ4NTl1MmI3Yi93YnpQQXkwMjAvcXZWNHVJN1gzTE1lRDJnM1h3NTFZZU0vTmdMa295elhLVWx1d2k1Qmdzbkw3SllPR0tWMWVZakxkWGxQa3VUVFhIQ2FSNDdKeWdqcktTR2VhVGZTeE5Na2tvbDREQjBZN1pPalhPMTBQa2ZKU05ScWN0RTY2eEszTG42Z3lSL0wwcmlBUHM4QUxtSG12L3lvMWgvaVJ2aGdtenJWMUI5Q0JKR0VmU0UwemJTUkM5dDFpTUF6QXZ2Tno4akg2czdJbExvVm5Xc0NpL0ZpbVR4Mmg0REg4QlF6ZjErVGVhOTFpWENuWEdtRjk2UmFycjZBT1Y0QTl5MWFmZFNiWVh3SkxpUEZ4UEs5c1B4K3FkWlV3YmNxQ2ZXOVZGbWZDSStzK1dLMG5ERWdTRXN2Y04rbXZjQTl6UWxqOVBsdmF1bGlBcGRWNHJzQUFRVWhzcmNkWU5JMzF1ZDU5U1FTazhta21CUVc3UThVWFNVbDVRSTUrZkhUYjUvdFdCVGZkZWZMM3hXK2ZIRVUxbm9JbnQ3QmZGZHY3VUs1bCtvajJNa2J0R1NLS1lRc09PN1Z0c0hoZElwNjc0dDA5UVh5ZmthanR6SjVtZjRsd2M3REpwWUp4L3FPbkc1OFNKdExOZVpDWGVIdTZ0ZlI5NEk2K1JJZWVIenduQzRYdWJ4eG12ajU1cjJJYVRjOGJ5TkIxV2V6Z3Z6RjFFWWduSllyNTJlNWNoVk10L01vY0Jrb2xoT0x4NDR0bnFDREszUm5WL1ZiUzh2TDFYZkRQMWlkQzh1YlJONTVHNWYzdzRTYy82VExWSmVGRmlleVJDU1pHSjVIM1lKVWpKUzBOTHJJSldZaFM2eVpXSDErbW1Ma3B6bEFoUHE4SHVxbXdHVXBwMW12dFdFNFBHUGdrTFFUOGhIVmhoM0NHQ0tDaGtoU1I0VGRpUTJvbUhWVXVCc21xK09qajJ6RXlCaXRwbkNBWG5DenlhaDEwRDQ5SHVEcmtBY0xrSDA2K29adkNNOEoyTjBhL25oTzNndWdqamRTTWNoN2xaMXVTNytvL3VFcm9SeXAwZTVUQnUxQ0RrTHVWMTFKYXBhOFZKRVpDdUpLZ3FMYmxjV2JqVTZtWm5QTjA2dGpaREV3S2hEZFoxWWIxNGljeFVBT2FGTXNaTk94U05EZlFodVdTOGo0NisyY3Y3YXhtNVpJSmpES2lSSGkwQklNNWJvRVE2OEhReHlndHNhOWNleG9rQ3JXNEQxcndJdUVtYVRyTFdiU0p0T1NndFdLQkR0dXRBV1pUSGc5aFZ5aVA5bXZnK1dPNGpaNEJnSHVkblVteWFvV21mTWRVYTQ3QWd5NFVnYzhBY0IxNTdzTzNtTFU3SEQ0VHh2d1kwN21lYmZLRmhGZDdncHRCR3l1QTl6ZmgzaVBEUGVOOVk5eDM3c08zb2JnMFQ3N3VmaDIrbU9RSjMxa0hIc3FnZ1VyeHdKK2xuY0h1eTJJaW5EV1loVXcySS83SEZ1MW1ZRXJUQ2Z4RFJ0eDA5cEFmejVYTHZXUEQ0d1hlM0o5K2I1MEp1bEpwenN3d1V3enFqWUw1Nk5MSUtNNVBwb3pQbWV1aTBhdm5SNm9jM2xnREgvbXhsajAvQXhtZ1Fxdm0rUWVrR3FsUGg4VVg4dFNIN2lmcll6TjV1YU92c1JDOS9jYkdhTHQ5c3ovVTRMOTk0aTJWODAwbFpzM0s1MEFEcXZuQkExbXFBNW1Jazk0MWJJa21ZNWozdkJtdStUMTVOblcxMWpXMHNoYmp4a3d3MkdpVmJDeTZQUFpWNElpNGZ2TjhuTkRKRU1HeUp0NWJvZ0xsQ1RTMXh1UGRZSFlOQVdwd0h0Nk5QMVc1RDA5OElHQTRRdEVQa1o5ZzNWNWlnaE1oYXA5eHNxa3RCRjZYYWc3bHlVa081QWJTR05maEZEZWxXZTVzNXQxNTFBcVlCRzZtUG50NHFhZzZQV09UMFNUeUNmNUhaSGtKUHdkczROejg1R0U0bkw4bzJzb1BIL3N3L1BIM2ZoWGFURjV1SVNzNGZQMkxDWVBqV0Myc045YitHVnF5azg5M1k3cnF5K2QzNTJhQ2xUL3JkdFJmOVkrWmRBN0ZHY3hnWDZxbUpLc2NyTVBLemYxanUyS3dpeXR6ZmUxVWg0ZVJQbldzcThvZTY5aHZQSW9sMjMvUk1pYnRFeFlLeVdTdzJaaVJ6REUva24xZjY3clJXTU5NckNXRml2cmFiRXBHSUh5Unh2Um1DTXI2em15M2FDWWVOd3U2cVRPVE1xcDE5NzFBRVpIMkozS2NVdCtocERQOG9tNzNWUXkxZkJETnRGL1JmVmZhVGdtZEJ6MUdIRU5TNjAwTDFRTEpqTlU5WUdOeU9xRDY0TEp2Tml2elNDNGJyMHVGNlZZQzg3dVBMNHdDKzhqa29PN2RvbSthS3dyL1d0Qzd0Qm96cEduSzFhZWZkeUc1b0ZhdDRVV2FrZjB6MTRSblZsK01lT0JkM0lldUVpd0hzcm83dEN3ZyszU2poM09vdEhqd1lEM2pBRXYrYmVFM0t4MjlOUjFIZUVVVCt1Z0ZXTnJXb0dIMUVTN0hpV3h4dlRkTHExcGxMdW90NjVnUFJ0WTN2UWszbEk4YjNvUTFJRUI1dTdicENlSUJoYTduT0xDMHBtMEk1UXBwckI3d3hVbFZTdWJ0Z081UktyMXFhWFdxUHpJb1VzbVgwL3NsN1kwQmVmRlRKdTlEUDR0eTh2b3Flc0N3cWlKM1RBMFRhQWRRVnVvcWZXYVFIb2FzTlBueUNXNmdHekdJVHhmL0lod040bWg3UmlnWmhLa0ZyT3dZclVJNGhLWWlnb2xaa3JPWW5VZ3orSmx2bFhMU1dLeHhDMXIwWEFLcTg3NGl4WmdVMWdndXViWndxK21OSEtXU1A3d3czV3A1SStXYjJlNTVMZVg3Nmtsa3dzTXI5ZUkzWEE3aGZDKzlGQ0o4ZzYvVmd1RnhTM2htQXNtcXJlNjh4a05mZU15VDJqSGZvS1JJcTBvS1hHVHJIYmFzeGJZOG9HbTFIYVJkbjIrbW15ZjN4NEhIc2JjK242eVUxM0IzUHBlcHlDWkV0UnNpVlBGYk9KK1FPQmhpMW0yZ0o1TEZMTnlacE9jKzJJaGszWjZtRCtRVWE0dGlwdTJzMm5NeDVkYkdOYWZMN1NrNkRlbGp4eTNibUY4RkFjK2dqVUJINzJMODlHckNYbzJuYkE2RjZzY3dQZDNMV2x0bERaWmpNUEpLYzU2RXJCYW0zR2ozdmNjMXZ1NlJGYnZ5OHE1dUxRSnM1Yzg4ZHRSancvR1dSRnFnTDE3QW5NamhQdmJEY0xzSUZkVHFVMEdYd2psTXlwK042bTAwU3QrV3lwdHZpQSswbFg5Y3FxKzF1Wmw0YmE2V2h1Z0U2dHRZR2Y1M1Z3dUQ2SmRhemZYVlRuRUc0eFdwVjNKUTdydGtKYjZoM3Jyek9GSzYzWXR4K0ZaQTRkSUJ5RTNxWjBhRW5IUTBFMjZXUlptYjVEQkRoSnQ4WWkzZk55Q2d3Zm1wMERqcERlcDQyRnB3S05HaXlEZ2NTZmExOWlCQVV0VWRmdWFHY053YW1HOUxCT2pIU3JaVFFhMUlOUnFNd05LaGwzSWNYcmF3Q2ttRVBMYXh2MUpzRGZUZ0pUQWlLMGI3YzFXYkRMdHg3UWdFMEVUaXRKNjgwbEhxY093cFp2cDVQOW5RbTVwd29sb2ErZnp0ZDJzVFBzeHJUdkdDT1QzQU9zMDdKaU9pMkN0d3lYaEkrU0dSbHhpQ0Y4NnpzMmN0dFJKdFJ2UmlnZWxZYlpKTlE2Mk50SGtNUU9QTVBETzJVWTh3dXpsTjdEaXM1dnhidFBIVjA0SnJGRUswSi9UNThHMi9RaWZ6WjMyZ0JESGFtNHJ5d2RBaDk5eXFQWnJzZTdYbXRZWFJydE5xeE1VcVRhN2tTREF3UWEwN0lEbW9kd2FhdmlNQWRCNkZNYVp2bXJGa2t0UEpvTTNXR0tUeE4vNlJqa1ZSNG4rZmJNWG1VV1FsbmlaVkpNVFdhdVIwb3VtakgxaGViMThYK0t3TDI5czNKZE00MnR6cUNLZGE4c2xoYzNIL1ZmTzBhY00zRUpkRFQ0cGhtU0xUNnJSMTdRcG9wdU1hOGZVRFQ2cGV0bkQ2c1BZMmZwTmZqZmN4WFF4b3dOUHZjeHZMaHN6bXZBWWNKNDI0S0RXTnExTzZIQlkreDFETkRVQ3VtUVBubWI4L0FQTXBxanJFTVRFaTlJR2Jtc1RuamJ3Z2dlWW42UytBNCs1VWFpM0FHMXN3Z013V2QwYWcvazRwNkdiNGRpRm5lTkpKNnRnYTdCdlc4clpITTZSRkxiaDBYQnNoaGY4RWMrSkJ0MjdCbFBrK25mTkU5Y0NGU1FKM0RnT044STJOOEorMm9BZCt5N3o3ZFhqeWxxSkdYNjRGckRJOWZVOGorQnJNcklaZC84WE9IM3JhYUZoTGRQTjBBYnA1MEt3V3V5RjFla3htTy9sOUlXcG1ycmFOUG9HNnN2M05tdktZOEI5eG9DYi9DWWhyMU03R3p2eWJHclQxMCt5cVUzZlpoQ1k5SmZvNGNOeGV0ckFLYnFIN1gxdHJmVnB5VzFYdW5rUG53VGRTazhKLzV2bC83NTMrWWtrOWxkcGJPUURqQitrQUhzbDFQWVRFM3l5emg4TUc2VUFFbmIya1loUk5qTEdibHQ5azJ2RFlBbU5vOXIzK0xIVXhSK2JDa2s4TFVVakg1MWEyN3NqUEJvWUdneU5KMzA5QzhtRm5aUEJyYThxRmVLalh1OUlyRGhDdDZyRDVTbTdmYWpZMjkwOTRIYnVtSDQ1Ny9lOU9wWnh1K1k3N1ZtZUY1Mm1XK2p2QVYyd3hqOE10eDlJQVpHZTBadGxBS2JwYkQ1dHNnU0xycWJLL296dTVBV00wdEh5Zkw0d1B4S05qc3dYOHZQbEtGMVlHNnVzcmxiRzFtaTFzRmlPUnN1TGhjSUMvbHdvYk4yN1oyTHJucjFBbkRUc3lldUV6NUVJOWdXczllWFJYdlJnd29BbFdkZmo1NFR1Tm5yelJHaEVrb0ZXbS9UbVFheStGNm40czdFVndJWmhsZS9aR2NsNXQwVEdWbGZwcTN6K25tZ01VR1lveGNPOXZzRHVyVnQyazFwZkhxMDIvMzZzelhkUXJUWWZVOFQ5TGJYNW9sR1kxMXk3ei8ybGRWMlBXbXYzVzRhc3MrWVRldmNlVno2bEtJSFd0UEhTZjdaOXoxVFZiMlNKTS8vb3IzZytHaWhtVExZc0V2S2thbUZaK3JVMVo0eFVacndSbWdsZ2JpUkFZYlBCNWxacTlEV09iU1NOdVExcDNJM3AvYTU4dXZaZVJyNldaNDIxUk5LRVBLRjJHMnZSVXNDMVRQKzZUUEJMTGlmVGJtQ2JwUlJxNHk2L0RIODZoVW9KSnBqWExVWHJ4ZHk4SjBGWXgxK29kc3pkMXRZaWFQdVNxOHZpWnRWSVRVdXhOQzZsdVBsd1MrdUNCcHBITnk3TDBtWlp3UlFzUzA4VXIxdVlyV21QbmpiV0Znc1M4dGtXZnNzMlpvczNMOHZhdUt5ZVRVZGJXMWZWM3pTNGNWSFdOb3VLWTFvNnBmVnA2WFZMczdmZk0vL0xoUHl2MW5YcDJlUHQxOVhFZVQyYmptN0RmdjFOZzYrQUI5bG1zZnp4elhqd01XTTlZZURCMzI5WlQ2SXVVLzF5aDZoMVlQdERwSS83cnl4QWwrTUJ3UTF5UEVkR3lFc2NZYzlBUHdoeldYRlRMRGtUU1JRN3JtRmh0dlo3L1hmaWlodXNIOTFvVEFML0c2dkR5S2xaRXJSbUt5eGVsRERoT2hNc2tNTXlZTTYwZjhBZ1I2cDFtSm5uMStOZ25SZzVmUlFqQlE0bGJVZGlDekVuSWFXaDNoN3NiWkxKdXJBbUp0VHUwbWhqa0Y3NkhtbXlUS3QvdHZtMTBtU28xdFVpNmZ5RU5xckdUL2d1dUsrMjhGTVBVWWpGckZqT2RWQ3pEVWFaNVhPWE9mdjlsM3lpemZrZmJ2UEFmNnNNK0pTeHhsQ2VrUCtEdWQwV09VM051dXdXVndhb2Znbmhlbm1LdWNYQ1BPQ1hsWFg5bDN4aWsvVTJQM0Q1OWZvcEhhK01EUGNWVVQ5dEZPTWl5Vzlrd1ZEcElsdkpQRGxBOXF0N3VxZ3NlTXlDSW8vSEJWRXBVUXUrQnBZU1FhYkNPWmhlTkNraUZsZGJ6Q2JMV1oxdlk2dTY1WjZRMXZidFdsbmFNYWRPcFN1RjlFZ2E2K1JjZGRrR1JvK2ZXaFJaYnV5L2czeWMxYjdYSzZXOHR3Q0xOTEdIWm1Lamk0WGlTbGdaelNrMnhlTHQ5Q1lzVGpmOHN0Z2Q3UXpFbzVGUFRjNis5WTVyYnhzdHhlS0QrWUZ4dXJneU9ycTBORnBacnY3ejZ0ekJjL0hZSDhzZGNqSkx0MlJuaGlLeFlHR0EwbmxSY0R1OWxTajhKbXd5S1ZHM3kwMnQ0a2ovOWoxVFkrSGVibXNoSEI2eSt2YVBsQmNYeStXRmhlcnZwZ3NEZWE4WDdBcHFUYkd6d2VuNVZlQ2JicTYzaUJ2a0J2VzZicUNxMXdKVTNaSUFxbzR3cWw1OSt1Z1JrM1dwZzFvSkdITzJjNitJeW9mV1R4NWZ2K2JRTmZ0M3J5N1BiOTgyemFpZHNSdjllVGtlZjJIZ0VRUThibFZ2T2dRVHRlSWlyZGc3Qkt1TjJxeXM4clk5RmphYmU3VXRLaUN5anE4ZlAzYjB5T0ZHWkRvNU1pYU9DNnN6bUNiTDVEQTVyaDV4VWJNcDBDRll6Sk5wUWJKVXFFMW1YTVlyQjBCU21qRlhrbmUyd0dpa3pTcmJzUHBBN3orcWxXd25sTFdEKzNhdExTM016ZkFwSGQwZFNwU1ZEdEQvVDNpTzlpeHVMMWUvOTkvRWVjS3BUMWNqLzEzTVorejVueHQ3SHIxemcxeXJubW5IZTV2dE1qQ2oxWFp5ODcwK3RIN2kyUHJWaDY1dVpUdk5IK1VTdmsreTVBR1duL3dndlFtZS80SEtPdXRicVdMMDZleXBkZGkwNmZVUFlhM1pab2RWRkZuS0dxM3YycGxIaEJWQStBckdlMTdoREZjT0hDL25ZQ1lUREdUeUdkQ0srU3RyZWI5UGg3M21PeFRyYVBCV1JvUGZWenZDQVh5cGlyV3VXMm1rZlo5UnBXSGhvWGJkUnBXR3RWNEd6aVZCc0RkOE9MVWw4TGloU0pJYkx3a1BDODh3WFdzYnZ2bGdhbXN4azB4RVE1MG1LK1poZ0JtLzJQWkZOK09WMGxBeGkyMjhNbUM0NXd5MXBKS3RKV0ZqTWdDY1NsYXE3L1ZpU1VsbFZNc3dFNDN1TVlvc0N3LzNoU2RqeFZmTlhIdjM5S0lyRlRtNXNIMjlNajVjT0ZVS0pLeHo5cDVZWEszdURzVEdNNWx5cHFkeStQRGk4TUhrK0UyOXZ0R0JmTms3Rk93ZnZHRjk0bERlMXJ1WTMzRnM5L1RRV2pMYWY3SS9mMkxFcHQ3Y0h5N1I3OGJHc3dudmFESXpORjY5WVdvWlR2Mk5KWHRNWlJHQmg0UUZla3I0SEZBaTlxUjg5WnpxeHRkRlVIU0IzVjVYYmYya1RPWmN2bFR1SnpmUHYxMzQzSjEzOGh6ZUorSForOWl6QWZac3A1YTlURzkzZEF0QUdIeUtscFFVVFp4Kyt5dzhoaC9mSU15aVR4RGtYSTQ5RThicEtDOGV3VlJzTmkwckN6SHBFSGhwQ0QzTjYwQ0VXU3o5WVBNZkZPYm94NFJQRVI4Wlk3RDY3QlNkeS9oT3hRN0tFb2xoLytHOFl5YlV1dlk2UlNyc1RtVlNyRWtlVzFTT2gyOUxOWGNNYk01REpYc3A3YzJsRTEzZGJtdkpQcFQwZ0tiWTdmSUpjOVpTMmVWMWhkUDhaNFRUNFkzQ2FmcUk4QmpRUVZzVDBwRFFBNmpiNEtzM0tMNWRzSUdXMUpNbzAwZXFQeEllR3huaE1NNENYWDVYZUpiWXlRQ0RrYlpaMGFlMEpIQlBrbER2U1RMTHhFN3RvdUxsc0dySmpCVmdNcmxRc1EzYjkwMU03dXNzMlVhRld3WjdPN2JPem03dDZCdGc4eHdWMXNsZkNFOFRtNDRyZTNQSk9pdUV3cmtJd09jVkJUcjgrcXFDdDNraUVROThDZXNScnplQ1gyaXYzQ2VzMC9jeW1ENVNZbER6SXFQQU9yNUtBSnMvWS9zNnNodGJ1cm9jSFQ2N3I5Wkp0bm1HVXQzZlA0bXp1YVBSMzlaKzFtYXR6WTd6djF1WW9MZUxRVGIvT0p1L1g2OFF4VElkSXF4THJGRFVoTEpoVXl4bzNjeTV1a1JRS2c5czJ6YlFQelBUSDhrWHd0RjhYcGlBZjZwcS84QzJmQ0VXeWVjanNRTEg0MlpoQjMySm5RZUZaQmdlUWI1OUI5ajJIVWVpMEozNFZodUQvZUIwWk9EcnhYMXYzMDc3OXo4S3ArU3V1KzdpNTJRZWZkejE1MFN2VnRET1dQTTVjV0crWWlyM0IwZU9UT0l4ZVVZN0pqRDhpL1NYTkNCOEdmQnlxZDM2ZTZhOWRJMmZVc1RoMlpYQW1QRGwvd3RqZTZzdmtJOXMvRDZNOWFzZXdwRFgzTldJT252QUJ3OGNCZDNnd0tmaGx4L2JjTkNIMkd0SXIyVjRXbXZ2eGxsK3dzVXNTNU1vaUtaYkNTK2hPVmZIYjRqYmJ2UXNzaEhDUFpzTldmOVQ5Z1lkYkhXSUMyM3pGaDFNMUtRUE5iMDlwNmY1eFRuNHlod0UrTHNiQVhvVjZTWXVVbVE0eDYyTXRpNEw2OVNMeDQwWXB5MlQwU1ZadTZBb25XeXdNOGUzMWR1UytVV3QxbUY4NDVma2Q4Z1pYdXNnTkRSc3J4MjF5bkJOUDd1UkYrTEV6c1M5dm5qYzU0MXpPS0dOMCtURHJGakYwU0pyY2U4UHJPMGVYL3FlL2s1QW1KUCtCUFNqSE12bngrOXY1ZTh6RllXVGVCNGFlOGRqN1NSL1ozeERUUmR4dzV4L1FIOUNjZ0RCVE44S21sYitWN3lhRHJhS0NpTFdyTjNIdGdxaHhiQ3JEMFpIT0JDSjkvb0RYRURxbkNFTUZ3YnBXeHduK3FmOGZhMW1reUxJRXF2bHd2N1dnRTR3Z0FoeHBhTWVMYTBaajhEWEIvSlNKRjM0dGlNVDFkbDYxVmhnWEZpVFRJVFlMS1l1cVl1Slh4bkViMFVzaVVyZFVkOXRXYmFFZVZWVTdGbUJWTW5YWTE3OHB6Zkc1dG15OFJMNVhlR0xiSjd6eTA5a1dXOTdmWVp3UXkyYjF1Q3UvbU4yZE5nWVZyZHVZbEtSbks2TllLRjNaeHMwOFFWQzlTenhVQjJhOUtVcVlOYUlaM0xqbC9Rcnd1ZEJNeWxnRE5QbFpFRjBnaEVSZ2ozYitMdUVlUjBmOC8zRVRXdXhhQ1lWTGNRS21ZSWIzMk5BUVJQeHBiS2d3dWhLaXBMVGs1dGtzUTRYZWppZURJdlRwblIvVHlHNWEzeGdUM3dzZit0TTczSWxOdlMvdk5Fb29rWFArd05UZlZON2tyRllPZGsvMWQrYkhaOE05cXVaMG5MMVN3MTRsemQrVGY5QitBTEQrdzJmeERjSXNEYzNXL1EzL2pCY3cxb3VMcXppRkc5MW9MMjBjZE1oTE5aK0tRQkE5czZtOWJ0ZzNibVNGN1MyeHBPT2pxalIranZxdzVkZi9yN05sazhyZGNzSFh1Z1RGUEtud2d2YW1kWlZMMDB5ZzJCN0haeHBRZmtlTzlOYllPem5oUmZnNU9SSlRQaFFveFJ3Q0VhL0lJQUp5c2NMN0I3eXFFNTI3VnhBdVhPN2Z2Y2daSjhHL1dvK3cvZU1PZWpWOEd3TzVuaGErSkF4RjhCaDZnRjdxUlRDY1ppTTJMRW1sMUEyWUsvalZxejRHTG9Bc2d2aC9pNnoySERzWmxBcENjTmFQOGpXNE50RUowVjk5THJLMktyd0FxS082NFpuNkp5MjdxUWFrMFJXNGNkWER0WUF3U0k2RURQR0VRTUFKUTNJaTVWeEJnaEF3UjBJQ0J5bXp4T0p4TlVJVnNGUnpDTnNhRU1rRWNtSlNGRHNpMXVoQi8vdVc3dSsvVzM2L0l1LytObExmRjlINGR1Wk9oamFtNUo5cXdMVm04cnJNRmlIWFdXY2dlQUFnRjZBZzdBVmM0Ym9HSk9WWStRN3ZDYlhaZ1oxQ2pGaXk2TUlrQ0dsd01XcmRDZ2RWb3o3eWk1ZVNTc2dIcUFsSXg0MmZKcDEvT1Z0N2xtdEk0T0JMMnFYUVp1d3lUYUxtYUdGNUVrd3RQaDM2bWZZVlo4emtPU0kwbzMvczFHaXZ5Yzh4WHMxc1pmRTRRSUR0TDVYazBKTGRKQytiYkY2ODdQaW0xKytnOUdudUZFU0ZQWWMxMGxZVkR4QU5KMUVTbEg0ZUtWNjh3bzh3Y2Jmc2pGTS91UXk4L2djSmNjdHMzOGxQdmp5N2V5WmVYS1JkdEZuWU9XeHkraTVsYnJUL1lmNWlZazhmRjBjTHhhM2JDa1d4OWwrVEpEdmtnL1RQZXdtRmNtLzQ2NjJxdVlDNWJlVXlIc1RUSkwvb0EvUzhVdnBVcTZFSnpGSlY2dC9UTWVuR2M3NHpQZXY1Sm4vV2QxWDk0eHd4eFU4STJ5NStFemRNK0taSzNoR3pMLzh0K3dacEFITkFnMGVCZjdhRHJaeVd3cUlna1VSN0tKZDFQdXBUZEt0UUlNNzRaa2Q4RXk3dVRUQnBZMzlQaHM3ZnlWalljMDRkdUZLeHNKYWNlemlwY2V5L2tNWmVnenVlenVSLzlnbTB1RmlaWVJkQStoQ0F6dC8rWFczWmsrZFAzOHFlK3ZyZnY3NGp4ZEtFOTk0ODV1L01URTgveUkrVzlwSTB4MXdseG5QWnR6c0NrV2ZHcHBtT3paOW1KTHRHd1U2Q3Z5dE1GNDFYajZORG9majJzblFaTGZFMzROWm9xTXZ2dmlIZi9nMzRxTVRMMytYeTV3U3dFZ2JNTFFuZVlJL1FvUERZc2gvMWd6Q2tTb2hDT0dwbDIrWUVFTWNSZytzL3lxd093WXhDd3o3azZhcEtQV0RvcWVBOFdRR3Nra3JxS1lUYkNJblNiWExWVTlGek9RU3VVeUtOWFpYWksrdmRvZUNWZ0dhZWhsdTFWd3VXMHQ0QUpYRDUwWHZTTFhmbGV6dkNuZDNlakt1d2tSYzZNNTdDNldscFZMQm0rOFc0aE1GVjhiVDJSM3U2ays2K2wyOUkrWGkvanZMYzFTU3g4eEtyTHpZYzJaOGRYSjEvRXpQWWptbW1NZGtpVzRmdWJOeXVMUDdNSzVwWkNOTFQ4QytzRFhoTytzVmtPbjlZR21rcVNTbVdIWU1ya2dTeExPa3Z0eGVqNUhWMWdRcVFqWlgwNHRBVS9DV1lET1N1QWp1YkVXclpCU1hpTDZkdDd6Q05kSEhybkJSbEV6Ui9mVE5zTmNPckJwbkNVbllJMEtXVE5UT0ZUL3ROV0ZremUvRXcweHpjTjhydVVxdTRzdVZsSXBQOGRIek53c2p3czJSMjI4TlgwOUg2UG5vcSs2ZzcxNTg4TUhGdnNXRjN2azMzYnVqZDJGUjR5djRkZy9NWlNOYVp5YS8xa0pETTJxcDFvZ0xIWEJlK0RkOElLRnZtNWYrYzk4YmE3cGxJemIyT2xUZWRBdkxEMHFzL09CVER6eWczbjgvL2ZUNEY3ODRYdDNlTUtlTG5PSnpKdUYrZzcyejhIWTcvTzExNG5IZWxzSktMUmFQQlpOVTROOHliM0hZTkZ3YndnS08yT2Zmb2YreEtiRml5U2dpS1JsRkpJQVR3K3IrKzc4NC9pbEVETDRCbCt6WStDdXdxcDRCL09heHMwVWNwaHBLK09CV0ZkSG9GVmUwRjhIcWVYR2c0SU9PR2M0a21hT3diVE9aMGNybXhVUmViNDU1RUxYQm1pdWZmdWJRVXMvQlFpUS9IK3NmU1dhdlhaaXNEQWFDaDVmeUI0dVIvRUswdjV6T25GMmNyQXdGZ3JjSnN0QmI3dW05RVgrT0ZQcXVtbHdPK01wZWYwOG1rck9uQTl0Rys3ZlpYU09KeVpXZ3IrelRmenNEdisxMGxhNEZPc3FENlZpeE93Ti9rd1l6OERmK1BuYllHMkVZOXFhVE9Fa0l6eFFtc01zaXV0bkpPWXp5YXNKTHI2NTJ1N3E2UU52d3VFTHVVSmV6eStub2hrYzd3YVpQZElBc1NqaTRWVkZLNE91aUhOallNUVhNd1gwdkU2TkhiNy90S08yYnVlV1dXMTQ3T2pxOWN5ZE52T3JRa1Zzdnp0RkU5ZHYwQkkxVS81bEdkazV2VzhNN2pSNmozd2E4REorSlJMbmFoUW9tWm9QcVBoT0g0VE54bFZ3cFVaeDhVbjF5NW0xdmc4ZVBWWCtIaHF2L292VjdwWDBDNmc4aE1zSGdEWmxCRG5yWk8wa1ZLaTU1S053blhCYWVhM1ViWkF3ZkkvVTFWQnp6ZHVGYWJoeVZsLzBoZXlRdGpTbnFrS3NZV2c0RTdlR1VQRzZHZnhYbzcrYzdyUDE5eXZaVmUxZmVidTNyeDcrQnpyV3hjUWY5OHNZVHI4RGZLS0cvOGN2VjhxN3hjZmgwaCtBa2IyTjZjbFFOMWQyRlRNMnVmOVFGb21LM2JkRXFPTC8xTGJoSDRUa2FoZWV5OUNqVFNZOWl2VDc2QWhxOFhKcmF2Yk50ZnhReXRuR3o4QVZCSmJOa0w3bE9QV3VqVm1HTml0WnRZS1Ztc1paNEpZZjVDd1NqQjRMMUhteDdSeFVUZW9Tc0lyV2VzMURSYkJPSUpKTHJpQ1RMMHJwV2dTWEpvTTd0MmJXd1kzcXlYQ29XMHNtZzM5bHQ3N0FvWkpiT2RtREQzR1I5VmEvTUR5RDZlckU1Ym9QN3Q5eVFLNGhIVHN0Y3pETGZQdVlhbk55eU05aTdOUkVlY2txVmpCS09EODMyTEp6Wk1ubmRhbC9memh1MkZmZWtIZmtqUTR0dk9Ed3ljdWl1aGRuYjlnMEZlNmZTc2Y0T1gvbjZjbzhuaDhtWmJudC9xSGU2ZEVETnFJTmh0elB3MlhUdTVQejR5Zm44OElIYjUyWnUzZFB2Y1JlOHZ2S3hOeTd2Zk9EMDJNQ2VXN2IxN3h5UGUxMWUzM3NISjV3T3E4OStuZGUveFByVi9nTG8rUVhZRGJ6c0h5Qi9wL282Z0tZN2dhWXpRTk1jbzJrZWFjcFRRZ2JxU1dneXNkQmlXSXVzVzYyMWRseDZYVnVJK3p6NjJ1MUEwK04xRDZtRHhnNWU4cm5hSSt1czYvVGUzWXZ6NnRUb0NIOHhtOHZSaVcxaTVvUzVEcTBIc3dqci9abndYYmpMWFNSSHRwTjV4djhUVTVORGd5WlpZdGNlR0VjQzY0Z3VtMWc0VlJFeHN3MXVKWEZkNi9zZ3d2Rk1aL0x3SjQxdkYyZHlvQ1ZCdEo0M3B1RGZUU21hZFF3elZqN3krb1dGTnh3cGw0KzhZV0hoOVVmS3dqMzl1MjZjbXJ4aDU4REF6aHNtcDI3YzFWOGRDZlZQcDdQemdaUnJKRGk4ZmZ0d2FOQ2JERzdQcHFmN1EvVFl5bjBueDhaT1hGaFp1WEJpYk96a2ZTc3p0KzBmSHQ1LzI0eitNenMzSEltRzgxNy82dGpZQ3R3SW9XaGthQTVqemVOMGpINVMrRExMZiswRFMrOUdSbzNUZVNwYjZFb0hac01MTXJiZ3B2aUtNWXg3MnFuWllzS01Damd4RmhrT0gzT08yNWh6M01xYzR3UDk4YmpIVGNud1lQL293R2k4TDk3WFcrd3BwQkw4UFZrMkMzRlJWNmZodG04OExmVk84MHBaaTRDQmVaenlWT0JLWlIvK0lyK2pGSW1VZHVUaFp6UUtQK2NPSHB5Yk9YaFFYQWpISE4xOTZYd1MvblE1dXVsWWJIU3BwMmRwTktiL1RCNWZXRGgrZkdIK3hOSlRzVkIzUkZtYm4vL0F0S09ycXh1d0hxQWZGdll5L2NTRm5YMUFEeEpNQW5BRDlnS1FoUHZSZ3Bja2NnQi9FbFpKUkNUMHdtTXhRTGRaamhZcHZ1REdnZXFSRCt4T3VQdFQ1UlNkTGUvZFd5NElKMC9TZlBXSDN6M1djMVI0NmhPZnFINy9PODkrNVIrb0wvc2k2dXk5d0lzZkFGNHNZU2UwZkU1UUxQWU9BYU5QVnFyWU1LbFNQaXRoZXpiMElKd2xGb3NXYnRWVHFTUGlHcjVpcExjbjdmQTZuSm1rdzlVQnVvZ0xMdmlTa21xNE1rQXp5V3BGT0tVcHNjYUlTa0pKeVBLemxIN1A4ZGZ1Mi9hTm5rZ09GMSs3L2FZUCtFNGRnYXVBSGpuZE1icHlhbXpISGIzbDVOSEt2dHZkMU82c1hvUVBqbG5kMXRMUm04dEQrY21aZDcyMkJQK3llYTNERTZkMzVLYW5Dc01qTngwZHRucmhyUFZ0ZklMK1V2Z0ZTWkVpclBFdU5kU1hDUVY5WG90a2d2L2hMcFFveTdSM2diUmY1dUhaS1BOZ3lmanIrN1Vlc09mMEJCMjNTWHVIckRHQVlMSTU5b21DYlZyWHVrVkp3bTZXUnp6UW44dkN4S21ZSTRaNXhMNnkxc216ck9sTW9LbDVHUmx5SGsxWDhvaStNdGVQY2g2bU1WMGN1NzQzWFRqUVcxcGV1dUh3NFBEeFFpYTVraXZ0bnIvbDBFcDRZbUhvL2FHSnBZSGxrNlo4YWpTV01mMmkwN2R6Ni9KeDA2NDlVaUV4QWxmdzk3cjhxMU9yWitTVDlCL04zeEsyRG1TSFgyWDV2a2tkeWcxb2Zzc0g2VDhCd2xHU3dUb0pHOXgvcVdRdzRIRTZGSUZHc0Y1QzVJcUg3aWZIUW1aMGxNZVl5eUpLb2o1SEdOczVTV1hlcnIxdVJRNHRaT3dSWVRFT1dhYm12dFh4ZUh4c3JXOTQ4RUJpd0tjbVUxTyt2dmhWQTArdFRVeXMzWDZMWEp3NU1EUjAxVXhSdnVWbU1aY29CZUppOWExQ05OQ1h6SnR1cHRkdnY4Wk9iN0tmNFRwTng4WTNoY1BDWDVKZTFGNjlIa1J1cFpCUG0wU0pMQUtuU3RUd1QzUHRsUVhMUTh5ZXl6S2xCWjJreUpCZzRkUVkwZWVEWTROMm5NL0xVTTg5VzVyeGpnYm1pczR1Mlh2bXNNVjcvYzFYM2VTZTZWeWRXSnR6ZEh6aE13N0Y3dnpjc09xdEpLL2VFYkpHZTlOOUE2YU9nY1RyeDh2My90YjZmdGYwN1BVbkY4YlA1U1pjZVdzZ245cFM2T2E0NHp1ajRaejc4TjNiWnRZN1Q4SmdFM2FhQW4yZldFRzhFZk5aRTM4SFBOUDNmY0FhRHFjRC8zZDBvNnBmWVhvK2Yvc1U0S3g0dFBOKy9za24zL2JDb1c5L1ovOExEejlCbjN4eTljbXZyWTdRNjZvZnBvZXI3eDRSbGt2dmZ6LzNNYUpUN1FMZ0VBS1p1Nmp1NkxRSXRNTXFFQnZZR2J5elNoZDdOODF4Zk5NMldDYmRkc0ZtODloZ3kyUFJTQmo3alBBaVJYZk5BSEdnQVlJbm0zMlZGUFlGbU9GWHFwSlNYUERCdHVXVHR3M2Y4ZER5elBLbjRldkVxNGR2ZjVEOS9maW5oei85elMyUGJQa20vT0UvcU9jUkxUN3ljOWpuWi9qZHdLSStSaU0vTFJTS1NRd282dXRGdTl6d3NyMVdzVTZYSnM0czVQT0xWMCt3bnd0bkpnN2ZjT09oUXpmZWFDMGZ2N0J6NTRYalpmM250Zy9lZi84SDhZdS9yNHY4STlQTEUycFVNb21pN2xCMTF4eXFxSmJyZmQyVmN1VWZGMjUrU0hqcTRweHc0L0RNbFA3T3I1OEIzd1l4WG9RdmNTYTFsMzVwQm52alM3K0NKT2pQNUxTWGZqVUdORmhtbENKbVBNUFVQNVRlTnoyMHY5UXplc3Zrc2RkWi9ZWDRqK2k1TWgwZTNaRWYyWkhySHg0ZU9ndTYzc0JvQ3VRbXRtb2phYUJySjhqOFh1VEJXRlFRVFQzQWlCWXp0cFpjMFFLWVovVTY5WEI5ZzlGTU9wSE9wUEVrNlMrTXJvdGdsa3ZEclRFWE1QK0V6c3kyUStXRjF3OE85aDdkdW5KcS84emVYZVB6QjlYUi9iMkRBM2ZNRE83Wm1sell1dVBBWjN1WFJxUERRd085dVoxVDR5dFRPOFlxcTduK3dhR1JTR20rVURuZzZEcktlVGNIM3haaEg2ekVqbS9xczhQZFpHSFdESng2a2QxUzEycmRnYlErZGgwMjdHVEhMZlpna1RyNFdRRlRnaVljOVBtVEorZXI5OU5YVjc5RHM4SlQxYW5wVDM5Nm5INnhPa1hQSTUweVFDY3p6QlhGYUpSRUpTSHFkQkJXQVFDSVNIQTluOU1EMFc2ajVTdGNpRUNoRkg4dm9BdmRqNHEyWFUwQlg2RFM5bTc2Y1BVSlczNnBjTTNkdjNIRDl0Y005ZlVmSGw4NWNXSWx2MUpBTzI3Nkp5N25iVWZQdm5Gd1lLaVlPN3EwL1NxWFI0OGJDbVBDNTBrY2RuQkIzVzRIMDdZVFBVRnVBUmdUTmxDaEpnbno4V29wUDlpYVZ1WnZSa2ttV09GVGI3TFg3M1YydDM5bnNIWXoxN29DaUN3WmoyTk9sK0hjRlByMnZIcStlQ0Naam0xUG5yOWJ5TjB3WHJwcUtwV2VQckJsOUpxTTdmcGQ4OGRQbW9mV1g3ZDQxVnV2cmdTOFkwNzNSOTQrUEpiWXNtdGdhUDlFaXQ1WEdiejZ6bU03ZGh6bThod1RNTHJaMmNxb1NZazIrSDRhM3puSXJkNFNUZUFMOEs2aFI2cUg2VXZWM3hQdVVzY3Uzc1YxNnkyd1o3M0EyekdRY2hXc0x2U2I0VDdHTjJyb1cyWklFVFBWWDkwSm5OM1htNGhUVE9PdTlGVnltWGd4VVhSMDRUdklMUVpwUm8ydVNqcGpNOHJVU1JaWHZaUXBqUjZlelJ4ZG1GeE5idDB6Z04yM1ZpY1hqbVJtam95cTZ3ZTNxUWZYcDVmUG5sMkdMMnUwdkZpY3Z0cmhPRmpKelE2R3c0T3p1Y3BCaCtPMFdsd2FpZEwzTEk2T0x1Slg5WGYyVFU3czNUc3h1WStmZ3hMd3dIQ05CMkR2VFJLV09Ob3BIbUxzdnlZS0p2R2NzZk5obzBjS2UzdElleDZnZFRZajU5Ukt6YUIwc1ZRdmJYWHhLK01CNGZPYk1rSDFyaG9UZ0EwWW9ldDBSdmdMc0FIZkFGdC9yRjdlajlYSiszSFNHdVczNlAyOVBmRGNBOEpUQU9OdUJnTWtOYlprMUNYMUNFcnFNbmJ2aEJHS1U3VG9mVnBkY05qc2JPNTcySE5ZZ3d4S01CRWFwUE5ZVFRxWHNhYVRCbWpBbThsTEZwWi83Z2I4dzhMbkFNWWJHWXhKZFVzMEFwSTFCOXRoMXZhRTBtVWpQVVNUcm1PR2RCM1hwR3RLdHVnNXdWN0FhNHl0NTE0R0UrUmRKOGc3YXh0NU40TElsUVZBaTdmN0JISG5WQ3hhbmJVUGNBc3lPRzlpY0VEcXl5RE5ZaTRxbWlRbmE0YmRMTkJHRElFMnJnazBadzJ2TU1EckV6NEw4TzVqOElEL3dFNkdhVVVoNG1ndmc4WnFNbWdjcTY0RnFsZGRzNWN5QllTQTJjTHlMQnl3NWlqRDlRS0REUkpCYnBBSUkwd2lzS1hpTmpxY0pvdmUyeThLZUJYWUh0elBub1hUNzFMYW4vNnh1dE1QQ0dVendZQkF3V0lmekE3eWhJM09EdW9YL0JhRHR3SUF1NGV0K1FGOXpiQldrd1NHSjNZNmFIdm14b3d6TjA0M1hUTlFQckx4YXpwRFQ3UGNyenErNzYzait6NnkxcEx6WmE1NzdWbFR2dGZIdCszZXZXM2JuajNiZXN2bDNtSzVMRjI5YTlmVnAzZnZQdDIvTURXMXVEZzF0WUJ5RjIrVEIyQXRMVHBOSGs5S29hYlRtQTJkNW9IUzlCN21ZTXdIKzFKNlgyODc0TzdmUktmcHJaMmFBdE5wL01UdkJaM0dqRHBOcFVXbmtSWFFHVU52Q1hyeU1mLy82KzFxWTl1Nnl2QTU1L3AreFhZUzIvSEh0YS90K1B2YWp1Tm1YdUxaVGt3KzJvVzI2Y2VTbHJhRE5XMXAxM1dBMWlJS1ZCT29xN1NJaVIrbHloQVNVamJCcUZva29tNmR1bCtWMERvVm1FQ2RoRUJGNnVnZi92QURhZnRCRVdLYncvdWVlKzA0cnR1Q2tJZ1VPNDdQUGZjOUgrOTdudnVlNTd4dlhnK0g2L0hSR1QzeGxTdnBjMXJTcXlYY1drTFRxL25JcHNHalErYmFNUUI5cDlPanhFQ05DK3VnY1dtKzBZTWpJblhUdUtHV3hoVXNqWXRMaW42ZlgvdCtPR001czZtK3ZacWExaVBCeDdUazhGQXFwa2R6UmtRYjBxS2hxZmpqV3pMeGRQRndvZUwzcFFmY2c4RmcxSWdIQTFIM1FOS3ZqZVgxdkNyamxqanhnZUJQUUw4L0FzTVkySFhaRGd5akFJWnA0djNSc2d5NHNEZVhLOTM4NVN2bjZjRVBjL3YzWi8vODRVWHNGei8wU3hEdUVVRnRON0VMQVcxM2RkVjJvNlh0aFJaOGdUNHBseEcvUTl0OVhlR0xvZHhldGZYSDNkVW50NDhuYWhGTkwvcFR4YUcwSnpXdytsYnVoQ3pUV3JFMDZmWVlibGMyR2swcnNzbHZBTGtLOUFoTWd5VHFrRXJSeHlZd3ZiKzczUmhhdHhzd1hFR05aOWJtZkNwK2FEdEFBMHE3R2pTZFc4M3h5clRobGl0VDg4L00rZk5lcnp2ZE56cnVMa2RMTTU4ZjE0WmRjaWsxbUN1SWk5djNQbWUzNTFYNzNKUlBxdzJQVEYvemVmTWxJeEpPODNubWdwY0kxNVg3TUlyQkxWSzJEYU1vZ0ZFOEFESzlRdVVYZjZET245T1JRcWJ4UHNjbkVXaC9GdWFybnlSSUVTMlVXK3B1b1liYUxCU2ZxVnFBa253MldVd1ZvK0ZBUWtzNHdWeFF2OXBxL2diU3RxL1RJclFuZ3Y5WmRTNFgxeE5iU3FYWlpEaWVuNnVFczlsdzFEQ2lpV0l4a1N4dUVpdjVhRkZWODdveE5tYkFyRldMMFh6bGc4RkFJQllMQkFZdkpvT2haREtFQjJOaFBEVm9UMjU5UEdFY2JXSVBQazA4d0NZT3RXeGlnVDV3UEQyZGVMbEpWdlMzWVpBZlBYUTg2WkdIRFNqY0ZsNyswc25kOERhNUc2VUVMUjJvMEZlcTdEcmlDbWpvY1NpYnBxZWhVSnArVDhHZGc3UDBhZmowTlBkWDdwSWxVUkNwRm1DU0RWQ1lKTXdKQ3U0azhMUUdJc0ZFczg4VGlURnBINUVrdHFqSzhDZmI1WFF5NWt3NVFkL0NJZDhBNW82Qnh3M0YweVBIdVcvU3hEVFc4ODdHZTUrakdHTHpkWDd2ZnJ3M0FXVzNLVDRxOHNRV3ZlanR0bE9GMkloaU95dFJKb3JzbE5DREVtRlVPaFczaTIzN01OMlVlRWlHYThUZG9jbWhEZVhaMGtPTEg1aU1vUEJhd0FuTGtYZkE0OGJkMjFZREhNMEdJQzRDK1MreEd5RDV0MHo1bnpYbGZ3RmpaNXM3UC93SjFMRG16RGhJOFFSVkZYRk9RZXR0dG1XOGw4TGlSeDNrYkErVlZGVTZ4VU8yQ2lMWWlUYTZMY2g2QXIzRHFySVAzaFQxa0IzcVVYZGJoL2RxRytxUWx2NnJLaWFuaVN4aThxS3pIYldRLzd3U1BJdFNMTmFxeFVxeFVoN0RQQzl1VjhCOG9PNlRjN3pERUFldmZjSit3OTZGbnZxRzJWOG5zYisraTRpR0xKdmt6THdkODJzU2xaRVQxbm5LNTduUkVMazNBbTlwTyt6QVVDRmU5RmFXdXBTMjR2RnlOUnd3SS9malpXYStBZHpJbU16a2M5RklYNi9BUm9xNTBmeW95VEVNNjZHZ0dTYkhKTWcwYzRLQ3pMYkJqVEtUakNrenlzN3V3bit2bUxLUDlGSFdhMHBqcDdLVGRrcnZjUURhQVBuZFBmMlN6V3BCcGVzMVhkcGdYaXpoeFlMVmp2TE1kSG1zMlphdHM5TTdablpNMU1hbXlsTVBhOWNBMzZtaFpJWmNvTGRZMmN3ekQzYU1DT2gvRjAxZm5jVk5FUWgzdzd2NnVWTWtzYjRCVHpQamx5K1BYN3AwNFozNjFhdDF2b2JNMEZsNkMzQ3RnTnlXQis5M1N2NDhQMXR4cTNHYXZseXZtODk3TTJ0cklNdFdrS1VQTTNpMHkwR0lMSkRqQ3BWbGFSR3o1a283SFE1SG42UFBiUXFHZVZQYUJmTmczWlp3bHhxblY5K3FyNjdXRzNjbnpGaU4rOGxQNk85WUFlNGp2ZDFqUSs0UTUxc2cyVUxPZkNlMXZKeGVYczY4K2tQajFaOGFLeXZabFJWajViWHNheURERFBrMnlQY0ZMbDhJWTJJaVBSTGtnMW5IWkdyeVVrUXdJQWM0SndXV050SDJsS3ZmQWNyazkvYUhYQ0VVdU5kcElsdDg1bTQveVNERFN0cE9kNmFxUlNLK1E3OS9zOGtuL2x1VGszcXhYditnalo4SzgzT0cvQjM2L1k4d004K1RWUkRyUE5sTmRtMS9VOE1vWmkwNmM0dUowV1RkdHJKbDRERFoxb2NKdWM3ZE1uN2dmSGtSK21BSFlPS3ZtOVRlSEJnSHdYYXloNnFFcUtkYXZJN25aTE5TbVZlS1pCNnlDMCsxMlFUYnkxaFdYWHBvMFM3OER3a2p1N2E1WHkzWDY5ekNsNWEyL1BiZVF0VjZmL0ZNL2RqRW1UTVR4K3BuVU40SU9VNWZZdk1ZZ2ZsdEFKMlA1UXZNRDAzN1l1TTlPcEZxZkVLbDQvKzRWN3o1YXo0dkZxRHNPKzFsUGFLWVNhWE8wSW5HZXlrcU52N0Y1cTNDak5Ub1pjNi8rdC9Pc25nZThHenovdmo4UXEyNnNGQk5qWTJsMHVVeXZieDN2THF3cHpLK2QxUFZTSTJOcHJNVjNLTW5uMk5MYkJsUVZoa2pzWHRjZHRVbWtPQ0F3bXhNZ1BVV0JnN3dpYnVIa1cwNmNpQUkxMi9NeGdhTDBBR2JGWGlhNFRacnNaQXNwOHF4YUVGRTZuM0dPbmdLU21HZVZiWHlza21vSU5ZUnBsWkdOblAzZFRIempCWU9CdzhhQjJQenc4UHpzWU9aeFdBa3JGbWY5OFRld094cVZwYTFzRDZ5ZVJLKzJETTh2QkJiekM2R0lwSFFvckVZV3lqeXp3ZERrV2hJNGJGenJIQS8yZG5SQ0xRWHVhWFhPSjZ4Y25BMC9XZXR4eSt0TXdkSHdsWENYRVhYTnNNUGpkS1ZUNzlKVnhwZmhwR3F3Y1dmMGlxTXRYOXlBSzBQak5OeHdqbTJZRTh3OTZnbjVnSjRXNlB2VGpkZW90WEdyLzVwY2hSTnJpam5TWkpIY0JSbjEwcjBZM29QOE0yNVNidERoaW5sNXNsT3Q3L3BSM0lXaG9UZEVIY09MYnhtYTI3bDY4M3YyK1BOaFp0bHJLL1pZdGV2RDVnOExpL3hZbDZwQlBLNFBLMXdnQzRyUkdER20zRDlZRzZ5TU92YnRpMjhheVJSRDJ5bDl4cS9uOTZaVGRHVERYczFIdmU0L3dxd3BvUC8zanhEdUpFRHoyZnpJM2p3OTUwKzVGMWx3c0QvQzIrZVlJZ3NRaitHYXhYTW5HSmxNNUhKTnJSQXlEcFNpTUlrWDc3a2tqTWVqNXh4L2VtTlRhRHlGOW5oMjJsYWI5eEkzZm5zeDJaL2lHdTNvSjdySGZWczdhaUh1c3ArUVNqN1hUUnNWWFQ5czlkdnB4czNhRDExaHoyN0FhTjNuQ3VRTmlCMHZtNlN0UmVFdThJT1hGdEpIak5SOURvRmlrRUprU1crclMwbERSalpKY0lFZ2UwalZvb3BKandWR3pSOXZsb3FLMGxhWGxTWjJISk4rTmRkRTVMa0w2WEh5bktUUG9IZThJOGFMdm9Sdko0Y3paN1l1ZVZyM2lQMjBWZ0VPc2hJQklSajFPWGJqdzlYZWpaN2daZHk5U1JydVltRkp5dXBjRHpzY3dTZGtWRDFjVDNXOTlXY3J1ZndGeVZkLzVHdnNxTnN5NkhOSS84R0U0ZERYQUFCQUFBQUFRREVEYVJiQ1Y4UFBQVUFEd1BvQUFBQUFOalE4N1VBQUFBQTJORlduLy9HL3U0RUlBUHVBQUFBQmdBQ0FBQUFBQUFBZU5wallHUmdZUDcxN3p3REE0dk4vMlAvRDdNb01BQkZrQUhqTWdDdGJBZGZBQUFBZU5xTmxIOW96SEVZeDkvUDg1M3ljOEtObHAyZloyNW5SOHh4dHgrVXRSMDdReWtiR2t2Q0xERi8rTU9QcEVSTmlRai9LQkYvcWltRjhvOTBKcW1OdFdGcisyTWt6UjlTeW9uTysvUFozZlhkRWZ2amRjL24rZng2bnVmOWZMNm5pbko4QXR6b1pZelQ2OWlxM1Fqckc5cG1zZ3RibmRuMGUxR1BuNmpUZWt3MWM3cVQ4dzIwZzdRQlJQUThiUkh0V2M0ZFJJRTJrWGJFekozT0tRUzRQa0hQWUtJMllJR040OEs1T3RMUFlQTEl4dVQxSGZrMnQzOHhtTExjYS9KM28wUE1aYmllV3Z4TURwQVA1Q3Y5OWJTOXppYlUwU2JvajZmdGN0VzhVWGNNMTI1cFFhNk40OEpvNFNiSHg1aFpjMVl2bzFNYW8xYzJUVmxRWDZ2bktEQjZ1N0c2dXpFOVNKT0xwUnBGVEg0aHBOVWtpSkFjWmp3ejlpT0dBWlJoSVBsWlB0bHh6S2xsRE01ckZkZDV6dXlUUnA1L2lnSTVpamxjV3l2Zk1Ga2YwZitJU2ZJVmsrVUZpbXdjRjg0UkxNdWVNNWc4c3VGYkNPdDZoRXg4azR2SjhaK1kvSXpka0tySlVKV3lKMUdqaXpGTi9ja3UzcmVhOTNXU0h2SWU3Mnl0TCtXQnRVUGtCNG1iZFZOL1NvUFZzaFRiYUgwU3dUYko1enYxcHpUeHU3Ung0VHdaNmFleHVqVWlRQlphL2JLaG5tNnMzdFIzVkZCL043WVBidGlURE5jd1Z6cFl6MVg0TW5yOWozejQveURHV0licm1LY1RjSTYwa1FPa25wd2llOFdMQnAyTjB4eGZVUThPbVhWNWpYWWtVTXp4WFhJTGZZaVFtZGIydzZPWHJHOG9WZkJ1OEMzMElXaDhPWWFnSEVjcDRwZ3ArM2ltbTdVZUp4ZFJURmJ3R3kzV1ExZ2hyNUlkMG9ORk1oOHRzZ1ZSU1FCT0YvLzM0dVFFbVVYNlVDN1BVS0dGNUQ0cW5KdW8rTnNjNzQyUkVtbENGU21SVnZhd0Zjc2xqbFZ5ano3Uk1LcTFsYmFBNTB5dm55ZVR6SzFhZG5NK3lmOEVoM2dSbGkvOEw3aUJKZnFXZVJZaXFHT3A3VDUrb3hkSUd4Yng3VWVraE4rUGo5U3dQL3V4VUV2NTNUYnozR0o0ZFE4MWFXYk1IZkRpTnZKWTN6UytTNC9VWUxxRU1FT3FxVVVBVXlTS1dSem4yMzEzdU0rWDJyY3V0Uzg2Y3ArdTRYczdnVHpkVGg2eUI0UHc1cFF6M2xSVVpwalB2aHFiUnp5b2xFNmU3Y1JtYWxPbWoxbGJJVnAwSmNya09UV0lJSnJ1V2FadkNZd3htRmhVSDA2LytmME41TVZFc0FBQUFBQUFHZ0FhQUJvQUdnQWFBRW9BbmdEcUFTZ0JWZ0dBQWRRQ0FBSWFBa2dDZEFLU0Fyd0M1QU11QTJnRHlBUU1CRjRFZ0FTc0JOQUUvQVVvQlZBRmZnV29CZGdHQ0FZNkJuNEdyQWJZQjBJSGtnZklCL1lJS2dpa0NOZ0pCZ2s0Q1lZSnNnbmtDaGdLVEFxQUNxNEszQXNLQzB3THVnd0lERG9NYkF5V0RNUU5CZzAyRFZnTmZnMm1EYzROOEE0VURrb09iQTY4RHVvUEZBODZEMTRQZ2cra0Q4b1AraEFjRUVRUVpoQ1NFTFlRNEJFS0VUWVJtQkcrRWVJU0NCSzRFdVlURmhOTUUzd1RwQlBTRkpvVXlCVHVGUjRWU2hXV0Zib1Y5aFlZRmtBV2FCYVNGcllXMkJiOEYyQVhwQmZRRi9RWUlCaElHSElZbUJqRUdQSVpHaGxHR1hnWnBob2lHb1lhMEJzMEc0UWIraHg4SExRYzZCMDBIV0FkZGgzYUhpSWVaQjdPSHpZZmlCL1lJQllnWGlDQ0lLNGcyQ0VRSVQ0aG1DSHlJbElpc2lPYUkvWWtUaVVJSld3bDBpWUFKa3dtMmljT0p6NG5pQ2dBS0Jvb1NDaDRLS3dvL2lrMEtXb3BuQ25PS2Y0cVlpcndLMjRyeWl3cUxMd3RGaTJJTGM0dUlDNUNMbWd1a2k2OEx0d3ZBaTg4TDE0dnpDLzZNQ1l3VGpCMk1Kd3d1RERTTVBJeEdERmFNYm94K0RKSU1uQXluRExNTXZvemRqT2dNOG96OGpTQ05MWTFCRFZ3TmJnMTREWWtOcDQyekRid056dzNoamZ3T0JvNGhEakdPUW81VkRtZU9lUTZLRHBvT3ZRN1FqdVNPN1k3NGp3S1BEUThYRHlLUExvODVEMFFQVm85aUQ0VVBsSStuRDhTUDNnLzNFQktRTFpCSGtHQVFrWkN1RU1zUTlSRUdFUmVSUkpGVWtYVVJqWkd0a2JVUnU1SEZFZFlSM3BIcmtmWVNCaElYRWlDU0toSXZraldTVEJKYUVtTVNhSkp4a25vU2hKS1JrcWFTdlpMZGt1TVM2Qkx2a3ZZUytwTUFrd2NURUJNWWt5Q1RLWk0xa3p5VFFwTkpFMUtUVXBOU2sxS1RVcE5TazFrVFg1Tm1FMnlUY3hONWszOFRoSk9LRTQrVGx4T2VrNmNUcjVQS0UrU1Q4aFFBbEJPVU5CUkhGRkVVWkJSc0ZITVVlNVNsbE1PVTVSVUdGUlVWTVJWVWxXdVZneFdUbGFpVnVoWENsZE9WNnhYNGxndVdKWll2Rmt3V1poWnVsbldXZmhhSWxwR1dtNWFuRnE2V3VoYkZsdFNXM1JidEZ3T1hFQmNqRnpvWFF4ZGRGM1FYZVplSkY2RVh4eGZkbC9pWUFwZ0tHQmNZSGhneG1ENllWSmhhR0YrWWNCaU9HSmVZbnBpa0dMMll4QmpLR004WTFwamZtT2lZN2hqdUdRZVpDa0FBUUFBQWFjQVhBQUVBR2NBQ1FBQ0FDZ0FWQUNOQUFBQWpBNFZBQVVBQW5qYTdaTExidE5BRklhUGt6U2x0RlFJQ1lHb1FHY0JFbGNuYlJHb3phcXFWSUdhS3IxRVNDeWRaT0tZT3JGbFQwajdCSWdWYkhnQW5nQUViOENXQjJEUFM3RGxuL0VKVGRKeVd5Q0JSQ3g3dmptWGY4NlpFeUs2NHZUSW9lejNHRy9HRHMxaGwzR09wa2tKNStreWhjSUZ4RHdYbnFJRmVpVmNwSFAwVm5nYUtoK0VUOUZaWjBGNEJueEwrRFM5ZENyQ3MzVEIrU2c4UitlZHo4Sm5FUE5GZUo0dTVaNmhFcWN3ZzkyNzNHdGhoeTdtOTRSek5KL2ZGODdUYXY1UXVJQ1k5OEpUZEMvL1ViaElWd3VPOERTOUsxd1RQa1ZjK0NROEEvNGlmTnJocVF2Q3MrUVc3d3ZQMGMyaUVqN2pjUEdGOER6ZG5YNnpIc1dIU2VCM05DK1ZGMWU0M2xHOHExcjh3Tk84blVSUFZGUHpXbDkzb2lUbDZ4MnQ0M1MxVlBJRDNlazMzR2JVTFNFV29iVjJPMmdHWGlqYmphaW5id3hWNnVwQTd5cS9IM3JKb2xzdUwxZTIxamVybFN6UStPNkljelQra1VyU0lPcHhsc0RqVXBPSmY2eURiZFhUbnA5NFhTNnhLWHB5WCs4RUtadEkzb3ZhZXVBbGltRUlnNmJxcFNpZzMydXBoRFhLMlh0WTVWcXNlbGx3TlF1NHpVZGRMcnBzeFNUWHlIaFB2U0QwR3FIaUFXcGxqemZXZHRqVHEyeGFRQWRwTXdsaW5icHBFTHBSNHBkcUcxWHhEQVlEdDl2Y0QvVmhyRXlIWW82SDFkdXUvOUxhVC9EUU9rVVUweUVsRkpCUEhkTEV0RVJsV3FRVlVCMFdoWFVYM3hiV0IrVFppRzNFUi9RRTFxYmRyMUVmYXdlMmhGTHNyMXNsRGVXVVZxbUV4NGUraWVoVGcxeGtSZFNGTmRQTlZHdlV4aFBBRjJBZlRuZzNrTkhEZXVOWUxYWHNEMERHN2tNL2hEMUIvUzY2S05NeVZXZ0xYVzVTRlRTcU9NeTdNNUg1UGYxSFdFMTNnYTJFeDA3Z0gxYjFzeFAvdlJsc3cycklnMmFDYnhmbmxmQU9iL3BuZnROVFlLc2Nhakx0Z2RxZ2diMFQwM0VXRWRwNmpGNHFOOUFIdCt3MDJQYWpiUFpENkRJNmlHM3NxSEoxVE9FMkxDZk4wcnc4VXRuNHVjTnFQSHFLTjdDVGErQnJQQU81VitNMTU2N1JqbVdOZStkdlU4aG1rRUxUekRtR0xjV0pxZFZ5N2RSOCtHdklyMDdrRE96ajRoYWJ0STlvamYrSzZYSTR3L0hvK05qZEg4MzYvNzMvenIzL1VzNVhiWC9weUFCNDJtMVNDWFFUVlJTOXQ0UUpKQVVLS0lJYnlPcEdiWkkyVGQyZ1N3cUYwa3BMS0NDaTA4azBHWnJPbE1ta3BiaUFBZ3FDb3FLNGdpRHVDd0x1b09DK3I4ZDkzL1c0N3g3MUhKZGs1cHNFY2M2WmMvLzcvNy83M3Z2M29nRDI5M2NJVWZ6UHh4dlNmd0Y3b1JkZEdJMHhHSXR4T0JTSDRYQWNnU014SHNVNENpWHd3WThBU2xHR0lNb1JRZ1dPeGpFNEZzZmhLZmJHRTJqRkJiaU5FdDFRc0FWLzRtOUUyWWQ5NmFFWEtndlpEMC9pYWZiSE14ekFJZzdFRi9pTmd6aVkrM0JmRHNHejNBL1A0WG44Z1JjNGxNTzRQdy9nZ1R5SUIzTTRSL0FRZk1TUkhNWFJhTU9MSElPWEVNTld2TXl4SEljTGNUc1A1V0U4bkVmZ0V4N0o4U3ptVVN5aGozNThnMWNZd0t1STR6V1dzb3hCbGpQRUNoN05ZM2dzdnVKeDJNbmpPUUdmY1NKcUVFWXRKbUV5NmpBRlUxR1BhV2hBSTA3QWREU2hHVE1Rd1V5MFlCWm1ZdzVPeEZ5Y0JJMlZhRWNDR3pHZlZheUdqZzc4UmNCZ0RjT3NKZkU2SjZHVGsxa0hFMGxPd1FKT1pUMm40VXY4emdZMjhnU3M1SFEyd1dJenV0RE5HVWd4d3BsczRTek81aHlleUxrOGlmTjRNajdtS1pUWmlvWG9vWUpUY1JxMllSR2pWTEVKcDdPTk1jYXA0VlBPWnpzVDdLQk9nNTM0Rm1kd0FaYmdUQ3lteVNRdHB0akZiaTVrRHhmaGE1NktIVHlOcCtOem5vSDEyTURGWE1JemVSYVhjaG1YODJ5ZXd4VmN5WE81aXF0NUhzL0hnM2dJZlZHTjgvQUczc1JiZUJ2djRIeThpL2Z4SWRmd0FyeUhEekFRQTNBUURzWXRjR0V6UnVJYTNJMTdjQ2Z1d3FONGpCZnlJdXpDYnR5RW16RUlFM0F5enVGYVhzeEx1STZYNGhFVVlUdnU0R1c4bkZmd1NsN0Y5ZkNpRU1kakl1YmhGUFREV1hnWVoyTUZLaUdqQ2g3MHhpaHV3Q3FjaTlXOEdtNHN3M0tzZzRUQjJBZjdZZ2oydzFBTXcvNDRBQWR5STM3QWovaUptM2dOTi9OYVhzZnJlUU52NUUyOG1iZndWdDdHTGJ5ZFczRS9mc1l2K0JWOThEajY0enVzeGZlNEZ5T3dCc054Q0paeUc3ZnpEdDdKdTNnMzcrRzl2STg3dUpQMzh3SHU0bTVYUTZTK3ZxQzZ5YTIzSmp0bFJaVXFXMDIxUzNWWGRzaUthZWp1U2lObTZHcTd0MXJSVENYVjBaWlFGM3FxbzRZbEs0cXFXMUtOSXFkdnBjRTBaRXNLMjdsUzJONzBoTFBYM0dHSHJWZFlqN25EZ25GU2p0R2QwclVTbjkvdm1aUk5jVTF1bFUzdjVOd2RxYzRtTDZpYjRxNFR2ZFU1VEZLZHBTV2lxbmZLZndrRFFhbGVWbEtXS3RYYkhZbmRLbGQ5dW96VTRCdzE1QjJWbGttTmRwVitqZkdVSHBQTlZFZENUbG51UnFlZzFPU2tOT1dsbEFXbFpudFhoR0Z2ODMvYThQdENyaG5wWWFRWmVXbEJ2emlybENKT3hjZ2VGU05peElnell1K0lxZWt4S1dJUEtyWFlCZnUyUkRYVlZKTmFVbXFKbVhLWDZtM0pWZmJPem51NTJmYXhOTWRPODh6SnFTYzdXc3VpbUN5VVVmSzBWbkszbzduKy9ZRnlTWFhFVmgyeDFaellxaEJiVFl1dENzcllYbUlIUExHYzJQR00yUEc4bGpXYjNLTmxyeFJvODkyYTZGTVR1bXVPN3ZQMzByMjhzRDFtcXFxZWtQV29wa2dKUjdaRXZnbXFYWW1NQ1hUblNNODNRVkF5SEVtTVBTUXhoQWxNSjhYTU4wRzVsTXczUWEwM3VaY0pLbHhXeGdSV3Zna0M0cXhLU2prVlUzdFVUSWw1VThJRUtkc0VLY2NFM1k0SnVyTW02SFpNMEoxbmdwNjhGKzF4VExESU1jR2k3TVAyVVF3enF1bHlvbzljbkZUaWhwSG9KOXQzc3BIZG1vZ0d5VGxLc1ZVay85dENOc011SmFMK3dsM1owQmxHaElWeVpxWnNvajJhaUhySGl1V0U1WWs1NWRQTEFYa215c1JGTWNYbzZKQ2RNVEliL1hPT3lvUmUrNm1iRTBhWDNPN05QSFNKdjZRazRBOFdaUWpOcExvZ1pWaHFRbTJ6QnVkdlJGc1RtYjJNTXVucmZvRUJnUlVDS3dWV09lZ3JHOVNwbXBvUnpkUk9QMGEwV0pFN1BmR2V6cmlxMjB0Vmo4ckp1TFBzK0hmcEZibVp0U1JiR1hDRlU2YmhjSmFYQ0N3VldDWXdLTEJjWUVpZzZDMGs4a0krZ1dLR2tKZ2hKUGhDZ2k4aytFS0NMeVQ0UWpaZmV0UlNnVUdCMVFKckhLd3FjMXhjVlNXdzJza1BpTG9CcDY2dndpZlFpZjArTzY4MlhGdHJZMjF0VFdHeFpiV2xqVy9FTmQzNkIrKzI5Y0VBQUFBQUFRQUIvLzhBRDNqYVkyQWdBRHlBMElIQmdXa1BBd1BUUmNZWERBei85WmwvL1R2UGRQei9WeUQvdy8vdi83VkJmQVlqSU5SbDBHV01ZMkFBOFJsVC92OUdGbWZhd3hnSDFuZUlNUkpFQXdETUtpT0xBQUFBZU5xdFYydGJHOGNWbnRVTmpBRURrckNiZGQxUnhxSXVPNUpKNnpqRVZoeXl5Nkk0U2xLQmNidnJOTzB1RXU3OWt2UkdyK245b3Z5WnM2Sjk2bnpMVDh0N1psWUtPT0ErZlo3eVFlZWRtWGZtWE9mTVFrSkxFZytqTUpheTkwUXM3dmFvOHVCUlJMZGN1aEVuaitYb1lVU0ZadnJSckpnVmc0RTZjQnNORWpHSlFHMlBoU09DeEcrUm8wa21qMXRVMEtxaEdpMHFhams4THRicXdnK29Hc2drOGJOQ0xmQ3paakdnUXJCL0pHbGVBUVRwa0VyOW8zR2hVTUF4MURpODJ1RFo4V0xkOGE5S1FPV1BxMDRWYTRwRVB6cU14NnRPd1Nnc2FTcDZWQThpMWtlclFaQVRYRG1VOUhHZlNtdVB4amVjaFNBY2hGUUpvd1lWbS9IZU94SEk3aWlTMU85amFndHMybVMwR2NjeXMyeFlkQU5UK1VqU0JxOXZNUFBqZmlRUmpWRXFhYTRmSlppUnZEYkg2RGFqMjRtYnhISHNJbG8wSHd4STdFVWtla3h1WU96MjZCcWphNzMweVpJWU1PTkpXUnpFOFRDTnlmSGlPUGNnbGtQNG8veTRSV1V0WVVHcG1jS25tYUFmMFl6eWFWYjV5QUMySkMycW1IQWpFbktZelJ6NGtoZlpYZGVhejc5VVRNSUJsZGNiV0F6a1NJNmdLOXNvTnhHaDNTanB1K2xlSEttNEVVdmFlaEJoemVXNDVLYTBhRWJUaGNBYmk0Sk44eXlHeWxjb0YrV25WRGg0VE00QWh0RE1lb3N1YU1uV0xzS3RramlRZkFKdEpURlRrbTFqN1p3ZVgxZ1VRZWl2TjZhRmMxR2ZMcVI1ZTRyandZUUFyaWN5SEttVWsycUNMVnhPQ0VrWFJrNnNSR3BWdW0xVkxKeXpuYTVqbDNBL2RlM2twa1Z0SERwZW1CZkZFRnBjMVlqWFVjU1hkRllvaERSTXQxdTBwRUdWa2k0RmIvQUJBTWdRTGZGb0Q2TWxrNjlsSExSa2dpSVJnd0UwMDNLUXlGRWlhUmxoYTlHSzd1MUhXV200SFYrbmhVTjExS0txN3UxR3ZRZDIwbTFndm1ybWF6b1RLOEhES0Z0WkNjaEpmVnIyK01xaHRQenNFdjhzNFllY1ZlU2kyT3hIR1ljUC92b2paQmhxbDlZYkN0c20yTFhydkFVM21XZGllTktGL1YzTW5rN1dPU25NaEtncXhDc2djVy9zT0k3SlZsMkxUQlRDL1loV2xDOURXa1Q1TFNpVUhFcXhocGtFTnZ6bnloVkhMSXVxOEgyZkkxR0RJVmpMYXJNZWZlaTV6eU51cTNDMjdyWG9zczRjbGxjUWVKYWYwMW1SNVhNNks3RjBkVlptZVZWbkZaYWYxOWtNeTJzNm0yWDVCWjFkWU9scE5Va0VWUktFWE1rMk9lL3l0V21SUHJHNE9sMTh6eTYyVGl5dVRSZmZ0NHRTQzdya25lY3crL3B2NnlzN2V0Sy9CdnlUc090NStNZFN3VCtXMStFZnl5YjhZN2tHLzFoK0VmNnh2QUgvV0g0Si9yRmNoMzhzMjFwMlRPWGUxRkI3SlpIb2ZrNFNtTnppTnJhNWVEYzAzZlRvSmk3bUM3Z1RYWGxPV2xXNnFiakRQNVBoc3ZkZm51UTZXNnlFWEhyMHducFdkdXBoaE83SVhuN2xSSGpPNDl6UzhrVmorWXM0elhMQ3orckUvVDNURnA0WHEvOFMvTGQ5VDIxbXQ1dzYrM29iOFlBRFo5dVBXNU51dHVnbDNiN2NhZEhtZjZPaXdnZWd2NHdVaWRXbWJNc3U5d2FFOXY1bzFGVmROSk1JTHlEYUw1Nm1UY2VwMXhEaE8yaGlxM1FadEJMNmF0UFFzbm5oMDhYQU94eTFsWlNkRWM2OGU1b20yL1k4cXVBMjVHeEpDVGVYcmQzb3VDVEwwajB1clpXZmkzMXV1WFBvM3Nyc1VEc0pWWUtuNzIzQ2JjOCtUNlVnR1NvcTQzWEZjaWxJWGVDRVc5N1RlMUtZaG9kQTdTREhDaHAyK09tYUM0d1duSGVHRW1XYmF3V1hHTWtvbytES256a1ZKN0lSVFRhaWlOKzhwWDZxQzRYUW1jUkNZcmE4bHNkQ2RSQ21WNlpMTkdmV2QxU1hsWElXNzAxRHlNN1lTSlBZajlxeWc1ZWRyYzhuSmR1VnA0SXFUWXp1bi95SXNVazhxOXJ6YkNrdStWZFBXQkpNMHBYd2w4N1RMazlTdklYKzBlWW83dERsSU9xN2VGeGxKMjVuRzA0TjkvYTFVNnQ3YnYvVXFuL20zbWZ0Q0RUZDhaNmxjRnZUWFc4RTI3akc0TlM1VkNTMFRSdllFUnFYdVQ3WGJPUlRmS241MW5VdVVJWHIwOGJOcytmdjZHd09qODVreS85WTB0My9WeFd6VDl6SE9ncXQ2a1M5Tk9MY3ppNGE4QjF2RXBYWE1icnJOVlFlbDl5YmFRanVJd1IxZSszeFdZSWJYbTNUYmR6eU44Nlo3K0U0cDFhbGw0RGYxUFF5eEZzY3hSRGhsanQ0Z1NmUmVsdHpRZE5iZ0YvVll5RjJBUG9BRG9OZFBYYk16QjZBbVhuQW5DN0FQbk1ZUEdRT2c2OHhoOEhYOVRGNllRQVVBVGtHeGZyWXNYT1BnT3pjTzh4ekdIMkRlUWE5eXp5RHZzazhnNzdGT2tPQWhIVXlTRmtuZ3dQV3lXREFuTmNCaHN4aGNNZ2NCbytadytEYnhxNXRvTzhZdXhoOTE5akY2SHZHTGtiZk4zWXgrb0d4aTlFUGpWMk1mbVRzWXZSanhMZ3pUZUJQeklpMkFOK3o4RFhBOXpub1p1Umo5Rk84dFRublp4WXk1K2VHNCtTY1gyRHpLOU5UZjJsR1pzZVJoYnpqVnhZeS9kYzRKeWY4eGtJbS9OWkNKdndPM0h2VDgzNXZSb2IrZ1lWTS80T0ZUUDhqZHVhRVAxbkloRDlieUlTL2dQdnE5THkvbXBHaC84MUNwdi9kUXFiL0F6dHp3ajh0Wk1MSVFpWjhxTWNYelNjdVZkeHhxVkFNOGQ4VDJtRHNlelI3U01Yci9hUEpZOTM2QlBXZ0Evb0FBSGphWS9EZXdYQWlLR0lqSTJOZjVBYkduUndNSEF6SkJSc1oySjIyTURESU16Tm9nWmpialZqVVdJUTRtTGtnUEFzbUhTWVpOakNQeTJrUHp3SE9BeXdIR0pnWnVJRjhYcWM5REE1Z0NPTHZCSklNTGh0VkdEc0NJelk0ZEVTQStDa3VHelZBL0IwY0RCQUJCcGRJNlkzcUlLRmRIQTBNakN3T0hja2hNQWtRMkc3Q29zRWl3c0hNcDdXRDhYL3JCcGJlalV3TUxwdFpVOWdZWEZ3QTU2VXUrUUFBQUFBQUFRQUFBQUI0MnRXVXdXN1VNQkNHNzMyS2tVOGdRZExsQkZYU3FpcUtRQ3phMGk3Y3AvRnNZdXJZWVR6WmROOGVwODYyV3dTb044UXR0c2FmdjM5c3B6aTc2eXhzaVlQeHJsU0w3RmdCdWRwcjQ1cFNmVjFYcjkrcXM5T2pvaU5CallLblJ3REY0TXlQZ1l3R28wdFYreTdyNmxzcnU1NnlLOUlmVU5aMEoxZlVEQlpaNWZjcnR1UzBaM0RZVWFrdXlRazJqQjNrOFBuaTAxTEJ3TFpVclVoL2t1ZmpPRDd5SW53bTFFemFTSmkrSDBaLzVMRzNjYjd5ZzlPOGV3Nyt1Y2ozRkV6amlKOHkrMzMxQk14bjRmekF1TkFVYWphOXhDYlAyMG5zRVZpY3VreE9wVW1BZFdzQ1ZONEpYUHVOak1nRWNjS2FtbHdnRFRFUE1VaExjUDF4Q2F1NGJ5cGVwb0pYOEMwZEpDeXlSWlpnODlvSmcxczBGbThzd1dpa0JZVHEvQXVnbk1BY0l5bUdMQmliZVc3eVZiVXM4c2t6NWZrbFE3RW5IM2JpTndqMTN3YWVTZW42K1g3SHBtbmxyMmt1OWxYdzVuanhMdm9ReEJjQjhVbkFKZnZ2VkF1Y0Q5SjZEdkJpY2doUm9vbHF3ODM5elVtdlo3WFptTnFnbllkVDNwZUhXazlVQ21IVTFDSGYvbnV4QTVVaWYveGgvQVJnVkcycSkgZm9ybWF0KCJ3b2ZmIik7IGZvbnQtd2VpZ2h0OiA0MDA7IGZvbnQtc3R5bGU6IG5vcm1hbDsgfQpAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICdSZWRIYXRUZXh0Jzsgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHUmdBQkFBQUFBSkdzQUJJQUFBQUJNQkFBQVFBQUFBQ1FGQUFBQVpnQUFBUmlBQUFBQUFBQUFBQkNRVk5GQUFBQmxBQUFBRG9BQUFBNml5V1VzVVJUU1VjQUFKQU1BQUFBQ0FBQUFBZ0FBQUFCUjFCUFV3QUFBZEFBQUEwREFBQWlLZzZkaGFSSFUxVkNBQUFPMUFBQUF1Y0FBQVlvY0FOdjhFOVRMeklBQUJHOEFBQUFVZ0FBQUdCbGM0RzBZMjFoY0FBQUVoQUFBQVB2QUFBRnRHOU0vVmRqZG5RZ0FBQ0lKQUFBQUU0QUFBQjRMVGYvbkdad1oyMEFBSWgwQUFBRzhnQUFEaFdlTmhQT1oyRnpjQUFBaUJ3QUFBQUlBQUFBQ0FBQUFCQm5iSGxtQUFBV0FBQUFZaUlBQU5LaUNCbTJRMmhsWVdRQUFIZ2tBQUFBTmdBQUFEWVV2NDdNYUdobFlRQUFlRndBQUFBaEFBQUFKQWYzQkpKb2JYUjRBQUI0Z0FBQUF5MEFBQWFhbFRWSThHeHZZMkVBQUh1d0FBQURVQUFBQTFDeGl1U0xiV0Y0Y0FBQWZ3QUFBQUFnQUFBQUlBTDdEekJ1WVcxbEFBQi9JQUFBQXpZQUFBbkdPRFZZR1hCdmMzUUFBSUpZQUFBRndRQUFDZ24wcHAvWWNISmxjQUFBajJnQUFBQ2lBQUFBdmVHMlhpTUFBUUFBQUFnQUFBQUVBQTRBQW1sa1pXOXliMjF1QUFKRVJreFVBQTVzWVhSdUFBNEFCZ0FBQUFBQUFRQUNBQWdBREFBQi8ySUFBUUFBQUFCNDJyV1pDM0NVMVJYSHowMTJGN0tRaEFDYkpRSGwvUTdoS1lJRVp6cFZaNnAyVktTMnRiWkliYWVPeENoWTI1bDJ4azZwQlRwTWxhS0NLRldxQXZKb3cwTVFRUmdxRHkxV29LQ3lFUElxYWhKaHU1TkFraWFtM3Y3dTNlL2I3Q1lMTExSK1ovN2ZkL2MrenJuMzNIUFBPZCszb2tURUx3L0tGa203NlpiYlowcFc4ZXlmbGtpK2VLZ1hyY1cwOXhQUDErNjllWUFNK2ZxTW1RT2tZTVlkM3h3Z2syYk91RzJBRkRsOWxQTk1jNTdwenRQalBMM2ltL1BqZVNVeXpONEw3SDJDdlUreDl4dnQvU1prR1htWHZodXV5QUYrNzBwUmZYdmF1ZWJLWkprcDgyU0piRS9ybXBhVnZpcDlUZnBHVDRubmVjOHJucjJlZjNvOVhyKzNoemZYTzhWN3E3ZFl1a2krcnBOK1lMbHVraFc2VGhYcXNDclM5V3E2UG1aYVFUOWFsdXN3clJVcXFBL1R1a2pOMGkvYnNmVzA3cGZsNHFlbGpKYWxqQ3VuOVdQSllHd0FqV1V6dHQ1eUR1cGFWU2crZXUxVzAzbk8waUZtMm9YeDNVQXZFQUI5a1RhUzV5Z3dHaFNBTVdBYUtBTFR3WTNnSHZCdDhCM3dYWEF2K0I2NEQzd2YvQURNQWsvcW8vSmJzQUFzQkl2QUVyQVVQQWVXTVl2bCtxQzhBTmJ3ZXkxNEhhd0Q2OEVHc0JHVWdrMWdNOWdDdG9JM3dEYXdIZXdBYjRHZFlCZDRHK3dHSjBBSW5BU25RQms0RGNwQkJhZ0VWYUFPZkE3T2duUDZxUEtCTHFBcnlBQiswQTEwQjVrZ0MyU0RBTWdGOSt2OWFqYnJWZWk2UVg0azgzVWJhNCt3OWdocmo4aENySHNSenlWZ0tYaFdmUEljZGN2Wm9SZDR2Z2hXTXVhUDRDWHdNbGdGL2dSZUFhK0MxOEJxc0lieGE4SHJZQjFZRHphQWphQVViQUtid1Jhd0Zid0J0b0h0WUFkNEMrd0V1OERiWURjNEFVTGdKRGdGeXNCcFVBNHFRQ1dvQXA4dzcwL0JaNkFHMUlJNjV2NDVPQXZPZ1Rid0gvQWwwTmdtSjFzcHdFbEJyeEgwR2tHdkVmUWFRYThSOUJwQnJ4SDBHa0d2RWZRYVVUMTBxOG9CUFVFdjBCc0VHSjlyYmIxY0RkY2IxQWd3R2hSS2hob0h4b01KWUNLWXFpK29hYUJJYjhQU3o0aFNSV2phM0FmSk9IWW14TTZFMkprUXV4SmlWMExzU3NqdXdocWVhOEhyWUIxWUR6YUFqYUFVYkFLYndSYXdGYndCdG9IdFlBZDRDK3dFdThEYllEYzRBVUxnSkRnRnlzQnBVQTRxUUNXbzBpRzBFMEk3SWJRVFFqc2h0Qk5DT3lHMEUwSTdJYlFUUWpzaFpwbXZEM0QyditUc05NZ0sxalVIblJUck5sV2ltOVZjYkhFZVB1UXhUbjRhZnNCSHFkWDZpNWNZMDhDWWo0eVZNdVlqK29ab2JaQ3V0TFRRVWtiTE1iVDJFTndhNGJZQlRrZm9VVU9QZkwxVEZzdDhlbTFuN0JGYXF4bGZRWTltZWpSais0dGxlTUxkakFuQnVad3hyWEN1WVZ3WXptSEdIYkJqUE5aamxTQnJybTZCVTR0MFZVSEp4ZytHYURuczlMOUFhN1ZwWlV5WTNRM3FLblk5bTNtV3Nyc0gxQnpKVk1YVWwraXRhcTUwTjZ1WHRNQW00NUZ6QitUZExsTmtQQkhndks3WFRhQk9oN2pYYW14WG45R3R0dGJVMTh2L2VPbW45SDJzMS8zVnFKZmloMFh2Z1hkSWY0cXNTdXJLOUdIcHI5K2hicS8raDM3ekNpV3MxaVhjbSt3YXdycFp6NWNNUElLSUY3OXRJbWkwVjQxMFIwOWlWcVEvRlQvNyt4VmNWOHRWTDlOUDZFcE9vMS9ZYVgxQjcwVkwrRmlycGJQY0szVUx1cXFTcWZvUXZjL29hcjN2Q2tWNDBFeXJMdFdmNlZJbllodTVyYmEyR2F0cm4wdXpneWFqUmRONkpXdlhPM1VEaU9mWGR0bVJLVXF3bGxPaFY3SDZEUW5qajZHaEN1eloxNUdqL3N6ZXo3RENtaXZRbGMvQlYzNmhxeFpkbzA4bG5VSEh2aGV1V2t6R1Z6RHpzL29sL1pGZWxsQlhBZXJJM0M2aVUxYmJpcys3Y2xrdCtwV09hNkN1Q3MrY1JHdTZNU1dlcGZweDF5KzF6MG52dzViZWgzTzVQdUpVNWVxdHR1VUlmdVo4MUpNUU82OXlIMUsyOU5TdUFMNmlFZzk3UkMvQWQvandhc2YwYnVxaTNuV3pxYU1VZnhicnFKUG9EckYzUWJ4Q0crZHBMMk5LVFV0U1RkVWJIeHFOQk1TaTNySGErR3RRWXUrNFh6NzhlK01sTExBN3ZjcmNQYkJ6emJBK210amplZzRibDRiSHJhSDk2bUk5VkV2TUpwSllGeFpaYmU5bCtpQTh3K3g2VnZzc25YVmM5TFJya3lsSGZVeU50ZS9LSkoyQytKZDNUTHlFcTkrWlNUVzdzUWVwUi9VZXU4WUtmVnlHbTdsYjMxb1d0eEkvMnEvUkVSUEJUR1RrVjBNbk84bXhGbGlpZCtuWkRvZFYrajd1MjFuUENiM2U3bERFdFV2YmJtSmRjM1MyK25FN28zcDlzMTVOYVgzU2RWWmE2U2ZwZFJDZTljd3dBNC9qVCtnVVhWdFRaOC9ONlAyT3RtcWpYaUNKQ0wrVEFaeDFadFdHaEZZYm1acklTdHo5Q0xQK3Bsak05c1VrR0V0cVpmUVpoNWMveVJxYW9qMmhzOWJidEZtdjZYZnR5YkczRE1tTDJUcDhYSnV4K2c4WTZ6TTFKdVlteldaSzlFa3JPNnJ4VXJKSm43V3JNaXMzWXYzU2NkNFJRMVliSnpsbC9waDFtYlAzTVJtanNmR1ZuYzZRYTYyUnVGK3RXTDY1dkowNjlyNnNoN3RJeE1PTzlscU5uTGRyYUNiNlpGaTU5UTdWT2Z0UVlNL2xXZXRMMnZmY2o1NGFuRmhmYlcyK3M0UUYrbGJlWGMwZTlhSi9qZDVzVHFoZXE5K2xkQkRhUTEySURIZ3FQclVObjd0UEw0NzYxdWhwWXN5SGVDOFRNWGkzaFZQbmkweUpHZnBpbHVDelBzRHY1SzFOUnVmc2hmRWFybDAxeHZrM003clJlalBmSlhNQXNmT3VTZXlGVmZtU3h1ZVc1T1YyNzVLb0svdkxUMDVuN0tTeDg5Z2ttdlZIYmNOb241eW1Jb0ZidVhQK3d1aTJ5cFdyejFtYlRNaCtzS20yanJtRTI0N2VXOTJjcjFPK2tSSFRpUEVsTmZwRDkvenI0MGd0VDFoRDg2WDE2dmdvYzFMaWM2R29WL3pBV2tmelJmT1dZVmNSS1hNdWVWSStRWm92OWF3MDVqRXVuc3Y0bkhqV2FrK1RINDJWa1hHY2lscTFFL0hhT0FkR2Ivdmk4dGFvdlZudmJlTmVHejMySnNqZUZ6dkZZZjJ1OVVFUmUwN21ZeS81MGgvMDRuZlVHNTlDYm92OTh1ZmE0ODNHbitnM3FYOC9aZzFoR2N5b3VMUGw5TzRmOVpiSVdVZS8zZVI3RnpwcXlZblFQc21NcXpPUjUzTXorNFRNSjk2YU16dGtjbUYzTnZFV2FkOExUNmVTeThaNGQ3SG5vclpkRmx4cXNOWEdaTzhnTnVicXFLWXZhUjJ0N3J0UUxDTUl4MGtJVzUvZmtsUUMyWWI5SHBxQ2hNU3pISXR6cmhXMEpaK256WkVDTmo0NE1Ta3hMdHBUMXRHUG1DKy9oNnduOGFjd3QycXJ3VEJ2MC9WV0QyNis1SXQ3czB0UGt1dS9wdC9qUkNlTm9rbjJOQkRuRzFLWlZVTmNWdUZMZ2IrMU9iUVluYi9mUnJ4eWV3cnJIUzFWSnA1NGM2NTRFL2pTdklkZkxETk90RUJqWi9iK2hZMUFxYjNaN0xGenFFdWg1eWxyYWJYUmMyVy96WnpubkVaWDcyM2Zod1JiOHR1b2U1ZzlyRy8vQnZOL2Z4UGN5N3E3cGZnZXQxR3k3UDhFUG16SDQwVHVSdXZCSW80V2F4UFhZTDU2MkVqejZ1VjN3Y1FzZE9JaGwvQTR1V0Q4UG5nZHp0NU91WVFQNzFaanM4WFV2bmYxaXVVZGZrdSt4SGpmSWZvN2tkVmFZWFowelpkWnhUNDhjcWIxeEUwOE01M1Q1dGk4eVpRNnpwTUkzMERVenlDM0RDUjYxNHRJS0tlZkwrWXhNdVBpY3F2cjhUcjZLQ2lFaE9wVStIZnkxTkVWMU1kL3kraTBoaFliMVZyYzNsZDlaYVY2K3E3Nnk4blZmazlSa212ZTBzbmQ4NldmRk10Q1dTeExaWVVLcWpGcXJDcFMwOVVkNmk1MXQ1cWxpbFdKbWt2czZJbTFMbURrSXRraDgyV25ISld0Y2x5bHlTSGxVMEZwVmNQVmFOV2QwUk5WanByQytEN3FGdlVOZFMxODdsQ0Q0SFdYR2d5L3U5VVE5UzFvS0p3ZlVNUFVROUJvWkR5bUN0UlQ2bWsxU1MySEpwdC9BOVV6OXB6MXdENXkrTjFUSmtONVdIeHZXd293cHdDckNFb2ZhajAyMitoci8xT0xVazZzbEEwUGx3S1dXeUpOQmdINFIybHlCOHFMUFkxa2w5eldnRU01c1pLWlU2NmRsMHQ5SEVxSFIyZktkNml2US8wc2paRkNHU25YeXlnME1KWmYxME1GWUl4dEthUnVuSXlYQ1R3bnlpUmFKc3AxdHMzUXFGaHBERHhjTWh6R1FxTTYwQmhIUnBURzIxRURIYnJlMGtDTGdVZ3BjR3JNNVVvb2RHaFVyRlRJM01iWitiazB3YUhDbUp4NG11VFFSSWV1c3hTOWt2VWZIU016Ris5bExIMHdkQTAwbUhKWExMNmJESEhJdmZyTEFJdE1rN1YxdUs1MUtQSDdrb3VoU2Q4cWpBME03ZEEyd25nRDNnRXplR2NZUmk0NzNOWmMrWlU0RjdGelNPUDhlaUhGL0x0Z1pkMmdkS1JsMGRJTFNyY3pTcmUyMk5kYW9zZGEzalhXN2daWXEvTmFxeHRvTmVXelVycWdreEh3SE1rZXAxdTlqNVJwY2lQbDI2QTB1VWRtVVg1QWZzTG9CMlVPUEIrV256SDY1L0lMdVAxU25vRFByK1RYOEprUDVjcHZvS0E4aVEvSng5c3NSTnVMb0h6NW5meWUrcWZrYVdhMEJNcVhQMEI1ZUtPbGxKK0I4dVJacUxzOEIyWEtNaWhMbGtQRDVYa29XMVpBSStRRnFJZThDT1hJU2xtTnhEV3lFUTUvbHIvQW9WUzJVMzRUeXNOLzdhYThSLzZLM0hka1A3bzVBQVhsSUJTUWQ2R2d2QWNGNUc5UVVBN0orNVQvRGdYbEF5aFBEc3N4eXNmbFk4b25wQXB1MVhLRzhpZFN5enpyNUJ6ekRFTkIrWmMwTTl0L3l4Zk1zMDIwOUZDQ3o4ekJaMlpMdnVxaGVrc2ZGVkM1a29ubkRjb2d2T2dJeVZBajFTanBpVjhjVGJsQUZjZ29WYWdLWmFnYXB5YUtIKzg2UlhxcnFXcXFkRlUzcUJzb1QxUFRLQmVwSWhtRzU1MHVRNHp2bFY3cVRuV245Rk16MUF6dU05Vk03dmhlNllidm5TV0QxZjFxdHFTckg2b0hxTUVQUzM4MVI4MlJNWGpqWWlsVUQ2dUg1VnA4ZjRtTVU0K29SeWcvcWg2bHoxeWl3V2cxVDgyVHNYanR4OFQ2YldUaHQ2WGJmd0V6TEVxTkFIamFsZFJKVEJOaEZBZncvL3RhU2ltbHJBb3FZa1ZFeEkzTjRvSTdJTHVtYVl3aEpGQlpUS0FVUTF0RVJkU0tXNzBZRHg0TUxxQVlZNHdINDhIZ0VnL0dnL0ZnUEJnUHhJTXhoaUF4eGhoampBbStlUXdHNG9GNm1OK2JtZGQ1OC9wOTMzd2dBQmFNR01hZ2lrdXJYTEI1M0g0dlZzTEk5ekV4d1RuQUJDc1NrSXAwWkdFMUNyQ0J6NDNiYWt2c2NPeHd1dXh3T25kVjIrRjFPU3Z0Q09sUEVTSVJnMFFzeEJJc3h4cXN4VWJKUkVQQkRCdVNrSUkwWkNBYk9YQ2dTTThaRUlWWXpNRThMTUpTckVBdUNyRkp6eG01YWh6bVlqN3N5T1FPODdBT20vVmNCQi94U01ZQ0xNWXlyRUkrMW1NTHRycmRIajhGeFpCNFVid3NEb3AzR3QyK1pyb3ZQaFNmaXMvRmwrTHJKbTlITzcwVlI4UVA0cWo0UmZ6ZTB1bHVwRithQ3FKSnRJb0pZb3FubzlHajBzUU1NVnZNOFFiYU81VkRMQkszaTJWaWplankrWEp5VmEzWUlMYUlIckZUN0dielZLL1lKNGJFQytJbHNaL05WNFBpYmZHZStFQWNGcC81QXZ0ODZvWDRTbndqdmhQZml4OTlnUU0rTlNaK0ZYK0l2elVOU2pUejJsRjgwSDlFYmQzTWJsUVltc05RVGRNdzdUdzZESTFoR0JHR3BqQzBoS0YxRm1QNHE4M2c3NmFBdjdaaVZNR0ZPalRCQXo5NkprZWVUSk5qUUhuNlRPelY0eDQ5MXVuUnE4Y3VQWGJyL3phb1g5L1M0MDA5RHVyeE90Zk80bjFBc1Vic1J4dEdNYzVYbWJDUWlTTEpURkZrb1dpeVVnelpLSll6NllpZ09JcW5CRXFrSkw2MjgrR2dRallOSnFxZ1NxcWlhcXFoQnE2Y3luTm40YjFCOFpqWjZCd01WRVFlQ2tuVU9qYlMrYi9uUDNuL0lYd1R4MlczK3NRcWpDR1pPNG43dDVlcEhyUzN6M3d2N3ZLVE0vZWtZbFJnTi9mWVMzNzJHQVhZNDlURm5xQ0RiSkM2MlpOMGlPMmp3K3dwT3NLZXBoNzJEQjNscXNRN3FiYUttdEhLdlgzbTNndzh2a0VleDM1YzQ4d0Fobmo5YUd2b0xJYnhDSS94UkZ1OWxNT3pwemlXVURrUGVUM1Z5NjhVdFZFNzN5ZHFKWi9NUlRMWE9zdTFydUFxMXh2Z09ickI4elUwVlV1cnd6VkthU2VWVVRuVi93R2hTdTBEQUhqYVkyQmgwbVg4d3NES3dNRFV4UlRCd01EZ0RhRVo0eGhTR0hXQW9veHN6TXhnQWlqSERzU01ERkRnNit6dEErTDgvOHY4Njk5NUJnYm1YNHlHQ2d3TWswRnlqRitaOWdBcEJRWm1BRHZWRGdJQUFIamFyWlIzZEZSRkZJZS8zOHVDSWlJSUJBS0V6ZXdpb2RlRWtnQ2hTQk5SZWlBSnZYZENGeFdNQmFSTHIxRlJRVkhoWUJjRnNYSEEza1ZBTUx2WUd5cUlva2pXdTB2QThwZC8rTTZaOCtiT21YZG4zcDN2R3lDT1dQUEtJNkpQb2tXS3hjVjEydUlTL0JxYnc3bDUvK0dKVTEwTjFCaU4wR0pWMUFCMVUzZjEwVkxWVkVmVlVFdU4xVGlOMXdSTjFDVGxhckttYUtwcXFiWldhNlhXcUw0R1VZemlYTVRGdHZZbGxPUlNTbkVacFNuRDVaU2xIT1dKcHdJVlNhQVNsYWxpTzY2S1h6M1VTajJWcmY1SzRCWnU1VGJtTW8vYm1jOENGcktJeFN4aEtYZXdqT1dzWUNXcldNMGExcktPOVd4Z28zb3BRNzJWWS9zUFVvTTZOS1FQV2VTU3p6M2N4ZDFzWVROYjJjR1RQTWJqdk1nK1htWXZCL2lJSXh6aU1DR09jNElmK1VtWldxdVJHcVYrYXEwczltaW9obWlZS2lsSnE2akdRTkN5YUprMFd2bC9GVTF4OHRsckV3VnFvSHJhY0dFOFhTMVVCeDlYVUpOQlpQT3hPcW16R2l0RkRkVklLMnhLSWJNMVg4UFZYR21LVndYMVZRZWxxb21XRUNDRkpGSnBTbHV1cEQwZHlhU2ZmWkhEQkNZeG1lMnFyQ3BLVkZYNTVWUmRBU1VyaUM5dWs4M0pwSTJkUXdYcmxhSUJhUlpsTTVqcm1XT3J6L0dxZU0yODNkNSs3NmgvcnYra2kzTWxYYnlyN1B3dTZKSmRRNWZpMGwxN2wrdG11UVZ1V3lBWVdCNVlHU3diakE4T1B1TVZSaUpuSTVIWXI1WENXWlhUYlc4NURPRUdOcW1MbDJCNWQzbjd2SVArUFA4SjU3a1NycHhMY0luT3hmSTJkbW14dk5OYzNyL3lxaWl2SXFlaU5ZUElYbHNoY0w2S2hUTUxqNTN2aHpQQ2FlSFVvbjZ4OElEd2hGQWszRDdzQy90Q2hhR2RvYmFoTXFIU0JiTUxsaGFrRmkvdmJkSFdJaTk2V3B0bzdUcHJlY3pUQVM4ak91eTE4ZHA1WGIzTWMvbThubDZtbHczL2l5Zi9jT0x2ZkY5ZzFXZWtSRWxiWnl5dE45NlNqTFE0STJhRE5ocDFpY2JoTXMzUVRHTXZYMWxHUlhWTmw4OTRXcWdGV3FRR3hsU1MxYWhtalBocXhueFRPNDhVNDZWakVTL3A1a0JPakpsQlpHbTVzVHM1Ums2dW5kWjQ5cGdaK2ViR0ZyTmpzNUc3MWR6WUViTmpuL2tSdGVNWjgrT0lHWExJN0Roc3JCYVlJY2VqanZBSDN4dTMxYm5YR0xpVFpPNmpGdmRUbHdlcHgwUFU1Z0hxODdCeHQ0MW1QRVVqSHFFSlR4aUZPMm5NbzdSa0Z5MTRsZ3llb3hXN2pjMFhhTTN6ZE9FMU92TUs3WGlKcTNpVkRteW5FL3U1bXRmcHlodTh5VFc4UlRmZTRWcmVwanZ2MG9QMzdHVGZwemNmMG9zUGFNN1RET0FUK25LUS9oeU4rbWJVaHhuS3A4Ym9NWWJ4R1NQNWtoRjh3WEErWnl6Zk1vWnZHTTNYekxDYmNpby9HeVUvTUoxZm1NSkpwbkhLbkRuRGpaeGxOamNaU2pmTEkwOWlGRjh4anUvTXdHQ1JmOG5tWW9CWi9NNU1UaHRudnpHSFNNenkxSmp2VGV4bTZhdldmd0xOdWlvSEFIamExTDE1ZkZ6SGNTRGMzZSthQXdOZzdzRWNHTXc5d0F6T3dXQUFYbmdrQVpBRVFCQThSQktrU1BBbW9adVNaVXVXTEZNSDVkaVNmTVpPZkNpMnRaSGoyTEV0ZjVidG54TmxFeWUrcnlSZVI4bGFHOGZKT282ZHc4bG5tL0lsRHJhcSs3MDNCd2FVRk8vM3gwY0oxN3grMWRYVjFkVlYxVlhWaEpKTnErK2hYMkEvSWhJSjZqNUNLTG5NS0tXdkpBUStrZHlTR2l3RTNRbjNKdnFHTTlLK0Z6NEtIeE5HVlBqMkNmWU0wWWlERlBWZUI1VUpuU2N5WVZSbUY2Q0ZiN2NpQVJRL1hTREVib05tbXR2dFZyV3VRb21XYUNxWDBMd2xTYVhlUjJqSC9UdXEzOTE1NDdkdllzOWNuZnJjNTJpUzltRy9Cd0QrSllEZlRvS2toMnpXTjJoVWthQUhpU2l5cEp4WEtXTmttZmVqVVZtbXk0VDMxUlhxN0lqSFFqMWRQVjUzUjdBejJOZGowMElGYjJJazRQZXBXZ0MvcHhJMDVTK05qSlZIc3hML25rcjVEOURLNlZkdkxtMlp2WFMrK2tlMDhJbFBsTFpzeVkxUFRZMy9DWHZtM0w3UmZYN3Y0WTJIYm1KSFBsZnU3eTlYYlJ1SGh6ZjhEWkNwdFBvOCt5ajdJa21RWVgzQTc1TWxtWEFVSlhhU01CYmRMVk1nNWtuQUxFWVhLT2tLZWpwdEtrblFoS0lGQ3BtUnNVcFFWVlBKQVZZZTNjSktJNEdnbHMybWt1M003K3RtOVAxako5TjdodCswTUgvNTVQajR5Y3Z6aTI4WjJwczVVeWtkbnN4a3RoNDVOVmljbjlnMmZ2S2h1Zm1IVG81djI3QTRVTXBOSFJzckg5dWV3N2s1WU14TkcrbkN1VkZxdEFMYzZMSk1PYTNhWFlTNE8xeGQ3VjNRMEpsUXRXQ2g1RTZNZEFNQzdTemxUYmxMSTFzQXR3RjJnSks1QjQ2Vnk4Y2VtSk1lZVdSdzM2WlVhdE0rOXN6WThmdG5aeThkRzJNSHFyN3MxaU9qbzBlM1paRTNLTzkvTi9UdkpJTjZFZkNSWkNhZEJ6S1lTTWl5c3F4U1JmRXJ3QnpReXVuR2Y1b1dRUVQ4NW44SDZKWHFnOVJSZlo3ZUQ3UHc1MmUrZk02RVBRZXc3YVJYejY2RnJRQXorR1VFYXlkMk4yZTVjQTJxK3dEOVdmVithcXYrSENCKzZVejFXWUZ2YWZVSyt3K1l4eXdaMHZ1OUhxWXdtRVdGQUovSjUyRWkrUlJHa1hia0pMU1BrUVczSjUvSnAxVXRXcUJJcTlaekNEeFdTWlVUN0Q5S1IxNnpDK2RwL01SRGMvdmZNWElndmJKaDVOQmtPak41dUhUZ2xjNi9BdDQ0TlBmQThoaE04OXdjVExlK2FmZkFVRzdxZUhuczJIUnVaZkdjd0hFUGpQdmRuS1k1UFExL3l4S1Z6ek9LWTFZVkprbCthUzB0WWR6d2xZTHZlKzZpMTk5MVYvVjMyVFBWLzBselY2ZG9zZm90QVJmZitnTEFsVWlYSHVBa1pOUll0bUwxYzdZb3VSZnV3dlVwM2drQTM0L0FPeDJrUjQ5cEtxTklMOFpnWm1FZURCSjVNMGtKVmp1RkJaZk01aXFCQUM0NWQ0bU52T1BlazQvR2Jna3NURXdmdUl1MjNmZmJaNC8xNmx0UDdLRWZxZkVPanROQk1uclNyc0phQXJsQytUaGxpVEhtWjRpWmd6ZzhIcmVDNGdSd0E0bENVOVFOOEliZVduMmFMcjIzK3BjdzBEK2xldlZqMWJmVFhkVlBHM0MzQWx5RnhQV29ZRU5LMlFtSm1pQVZvcmpkTWtnTFRqYy9BTHNUUnZ3SEY4UzdVb2JUSHQ1MXFsU0NWK2VSVEw3ZEVtRG1SNFp3ZTJUZ3RJd0U1QzU1dlVoMStzd3ZibjNQMTcvMm5vc2o5Q2RYbndPRUR0TVBYcDFpeWRvNG4rUjgzSzFITkJpWU5Vd0RKWURZaVNDOUpTb0JPT3BOSGJpVDNzd3UzbGg5UGJzSTBHVDZBa0J6WEgxZXlPTlI0T0dmQXc5N1NZNlBzQlhiNXZQNU5JSnNaTnB1cHNFaXIzSHRGc1orWGxsK1lIYjJnZVdLK2ZPZTFKWUR3OFBYYlVtbnQxdzNQSHhnUzRvZW54T1NhYzc4T1hac0tvZENhQXlFVUc3N01WTU92WXJQcFJkWEZ1d09sTWtVWkRlZ1pDNVhQdFkySnlFZExxZTN6WXN6bTA1b2ZCcUUxRTZsM0Y1VFlCK2dFemRjdW5URFp6LzJzWTlPVGsreFoxNTk0dGlycTFmWW9YL1pXaTV0TmVud0xVNkhJQmxFcVR3NDBBVXNwTXJRbzhUbUZVcDJ0YVpNTVo4WGxBRXhxT1hxNVhJM1U0SmpZK1VHRW8xVmN1em40OE9UQnlmVCs0djFkS3BlWFlqRTYya1ZLdm9XNmZINWg0ZG5OKy95K3V2bzllNmppY01qOVRTejJ5MmEzUWMwYzVFQUdkZkxOc29VTG93WVZkaDUzT29NeXFuRzd0clJUb2luc3ozUUVZQlhYTzVBd3NZWGhiSGplVk5TQS9rcTV4K2NtM3piNWRkOTRKT2YvR1JsQ2lqNHl1TlQ1d0xWdjZXaDZnL1lvYi9mUERLeUJYZ3pCT3Y3RVBzQzZTVjllczRIcTl0UEdaQnR2bzUwc0NKT0F2MWkwa0ovcHBCQzBsV01OVDZhemVXeTJmTG9tQ1VPVmI4dkVBemk1b3RzbHcxdDNYN1RwdW5ERzZidlAzTGtzVHNYM3JScDgranRHeWJuU3hQM3JwenJuYjJ3WmQ5Ynp4K3VERTRPRllxdVFPZVJuY2RmTVZnOGt1OGRMMlQ2N0FIUDhwNmh2Uk9KQ2JHR3VvQldaN2tPa3RDN1pTU0l1Y09ZaTFxb0hTZ252T1dFUHdXcnNvdk4vL0F1ZHVEQ2hhdC93QTRBakJrWTY5c0FocGRFOUpERTF6UzhiVW14bExkdXhXUkJnTGw5cGlSN1c5LzhMZHNmZnQ5ZEovYnNXYjZMRm5mY3NWajh2VGZSTjFkdnUvNldXNjZuYndiWXBvNmtJbjZ3ckp1WE9QU2hFdFhEcFU2Q290aWdORkQ5ei92LzVuL2VXLzBSQ0o4L1p0dEI1RktTQVdvL3lQZHpnTk9teVZ6K2dEQkVaR1ZUQUhuY25RcEkvVVJLUWtEd3Y1U1M2TWJYdlBQVkY5NXgrenN1dlBLZHIza25RRnhsbEg5Tk1TL0FkUUIrSCtkeURlUzQwNll3ZVkxZzgzaUVGQ3FsUUFvRkt5V0pwcVMzUDBKZDFUZC84dWszL0pKMnZPbUw5QWE2N3hlL3FINjArZzdxTWNiOElZQnBJeW05UjVPcDFHclVObUx6ZVBpbzNXTFliaHFwL3VzalgvbmFnOVVmQXJQOUhwZmRCNnMvQW5nSmdMZVR5MG5RSlZRS0NBSklZRVdZZjlUNStHeEpvTktZT3lCcyt5QTUrYzVRcGdwTU9zMzRFL1QxMVZlejd1cmQ5TEZGWnBmT0xWNzltWFJ1ZFZYTWovUnVsb1gxUmFoR3U4Zzk1SXRrZzE1eENtMVdVWlhMT0VPWEcvUmF6Vmg1bEhhMHU5b2NkbXFqTnJmYlk5UFNCUXZtaHkyWU1iSUVNS2YwclFKbU1ORFpJU3V6TnFwQVMwVmRhUW5aMVFZRDg3UjF1Ym9zNkhhQVRvZ0YvM0VMZnBqRG45RzN1NmlpWWg5QUcxVlJMOXMxQmp0YUkrWTJBMzRid0cvenRBSEhkTFJiUFRqcThYL0NnaDhua3dCL3B6NHQ4TGRSMWFrNUpNQmVhY1RkYnNEdUNpSDJvSU9udWxKZWQxdlFGYlI2YU9OakVMYURkRC9YSHp4a216N3BBUW1EQ2dTUmJLakwyWWdxMjlSbWZSSEhJeFJHZHllODJPRVcveHhhREN3S1VPMkNKWDhLdmhLV1pjRXVWUGZOL012bmR2NnkrdFNPNmo4SUEyUGxUODU5ZnNXd01Wck1mNGdNdzFnbjlVM1dXSUdRWkEwWnRYb3lkclFCRnpSTlV3MzJQUmJzS0o4bnNHTXMyQVNKZVA3bFFRYmFyWGF4cndQdHdpQ2VidEc5TVlBRGpTVVgwRkNhbDZoRTUrYWVTaTBlMXVPQWdTeXBzZ0dZcTRoYzVVSFRKTUVXSXFBam1DMG9vTURPMWpXVUZwYjBUa0tpRWVnbTdQWm5zbTRiS3BTZ1o2a296RXVtN1lKaXZ0Smd6QTBQOWtSY1lWdG5SeUU0dktGL2VIT2RiUmVmaUhaRlZiWHNjSTRXTWx1VHBxbG4wZW9uRnExNk9LMFc5ZDJDVms2cU9XQzlhSFVjWjdPcEo0bXFobmUvUE41cnNYNGk1S2pvcXd0bTIwVTFHL1lwelllb01nc3RiSnBpVzRGM05LSnFyZm1kMG1SUExCTHd1VHNhVmhMdmk5dUhuTDgwUTc1OFZQQlh3Sy9Jd2xhVUZSazRqQUdIV1ZhaldtYzFNcHJOcEZQaGtOZHQxMmlTSlRVdFlmQ1hnUDErQzNhU1BBcXc1L1NkYWFySUJudzJiMU5aaXg2MHVoNVNLVVpUdmFuZWZDNmJxZlZqRi8xdzI4akJiZHdLK1lMdUwvU2hqYXZGWUdsNnFLeTRxU1RMODNOUDJZSGYrbEJEa2RudFlKNVQ1VFlnbFNSTDU0aW04WG1LN3JiVmRSbVplOG9GYnhUd0RWQnZMcjJVVjlDT3JHc3QzM2ZONWt0TGVwQ1N3ZjU4TmhvTytEcGNkcHVta2dxdDJHdUd0Mlo0QTJyR0NYb0NLZ1BTdXRiNHdHL3NjZzJVcDBhem13TVpkNjh2MXBPTXAwUFRyenc0MU5vK0g5c21qVXJGZEdHRHoxdHdkUVFEdnNCSmJjdngxOHkwc05ocjgvbTROWi9oMm56S2lqV2ZNSGpsTWs0cWsvOHI4Mm4xODRUVlR6ZjVGZlFEVXJqR2t3cW9tVXlSVjFxelpCbzY2TXVuQnRJRE5mQTJBQSt3dWQrQjg2VE40TW1ieE40UmhSbWo4M2FUR1VHZzJwcDhFcG93T2lPUmpuWktJNGxJb2lmZUhRTzlOdHdScGk3YWxuUm9TYkYzaE9BYldIZWtFelNEVGZxRVFpa2dCd1E0YndmZG1DMExNMVRUcEdXYlVBazhia0s2Z2pEVlhuZkNrNERYT2hLNGE2Q09uQ28zK0R2OHNJUDRUWi9IeGFXbGVxL0h1OTVsK2ozb3dFbmFYM045ZlA3a0YrcDhId1lOZHZNMWJ6ZlcvRjFDN29NRWdjMEVGTkxMNjNoRWJNSWpRaW5zeWpCazJvYjdHOGo5YktFRzk4TVczQmc1Q0hCMzZGT2hvTHRUVm1mdDFKUlMxNFFPa0tuZjZ3cTNoNjBlSE5oREhlN3Z0L3BJOGo2QUI5dXBwdEo1aDQyOTJCanNvaGNYOU9MeXVyeW9ZVmo5T0p2NmVkenFKMXpyUjlXQUFUVlZ1NHlkb2ViMTYvZnpoTlZQbkd3Uy9kaXAxbVp6U2tBeGRUMTZPVVFQNFM2a1dFOTNWenFjOW5sY29mYVExWTlyM1g2NnllZWhIMTNmVERRK0xlcExtSlFtNEdKU1d2QlRpQXlJOVFwakFES1JheERKVmtla1RoZHdWUU4wQy9ZOUZ1d29ud2ZBRzJEanBnZEsySDhGc3ZCdnJCYTVmeU9BVmpnc1ViQlpPbUZuN1lBdFF6Sk1ER2puUjNqU0tSQUJYZEpDSnNVMTkwZ2hROUdMUXRIWTRnSzZMQVEwbTZnK2V2Rk9ldVBGK1puT1JKdkQyOVlkQmQzLzZxL1lNMVU3L2RrTHExTnpzblNFc1VoYzlOL0Z6a0QvY1hLdjN1R25paGFBL1oyaExtRnFTUG1XZzlOZ2NKb0dlQ2tLMzFnU0ttdytHYXNwNm16cTJWWnZhRUpuZ2c3am1SelhUZTJvbTlZNU5GTXRsS2M2SjZmVXBEc1pUczhtdGVuL0R6S1ErMU81ckhJYXN1b1JzUS80dk55M1dob3BGa0Jrb1E2c1VSUloxL0sxOXVhSEJ2TGwzakwzdVdic1dxNVExOGZqVmg5aHM0OWVnTWo3WVVLUTJFR1FVSzdHcjk5SFBwOGZ5QSs0dmFJUGg5WnI5Rkg5THZxRnJUN1NGQWhKYnZxVU1ZeTVwMkxBUnJsclFONE5ES1F0dzFSRU5PQ2l0TlVTMTVaMnVpVXFTenA2Y0RrZU5nc1BQdFluTER6RW5yMVYzMklnUWpRZ0pVVXhjMjFDZ2tKVTZpM1ZFNUtSTnZqMkF2ZC9CTWxHZlJ3UGJad3FJdzdnSnVJQS9kZGhPeTlUWktnMk8rTmNUZ2h5RXJUM3VzMS9MaTB1V0trTUJoaDhsYmluQlhnc1VVNHM3OStQdnVlOWUrK3EvaTY5dnZxN2pPeGZnWC83cTRRT1ZMOUozM1l6akkvN3R2bGN0aGx6ZVJ1TWI3dXV0OWdQaE9mN2d2QjgydzFyNVVYMmdaMEFkUytYb1M2eEo2OStFT0NqSDUxSjdESzZ1Uy96eFd3Y2pGQUs2cUpDWlNxRE5Fb0tHS3ZmZ1Rjcm5LY0ZqTmpxd3dBRFpGdG5oOTBtczFuUVRRRVFrMWJxSVFFVTZuSXFIdFhEb2FrSURXQjlHeUJzNHVNVnNNSWNWbGtmVVNuakIwaE11cXpLb0NDeHk0YVhsRU5UNEtmaVZKd09VR2M1UE0yQTl6MkFNc1Q1UThDTHI5NGs0Q2xVc3NsZ1ZBSkVnWmNxSUhuY2lGa280STU2b20wT3BWUHQ1UERzQWg2WmhiWmZyWVBYdlhvRjRQVUJxMHQ4bUd6TklPdUE0Q0FCcHorQkp0K29vM2xvOVRqQTRLZFJPRHhpRFU2dUc1eE5BY3JYU0lXNExLdytMKzBBL2pUZ2tIYnFoOWNXUDlYbVpMQ2x3QnJzZ2pYb2xhbXBTWjdFRmNGVlNUMG9QdVhVMjIwcXN6R0djaHEySDI5bnUxMXI2R3YxRjlCRG11K0hBdWNvbnhjWU4rQ01Pd0E3LzJJWVU1SmU3U0xmNWZ2ZUFiM0R0TXhadldVZU1JQ3NNY2k5OVlhNDRkRmEwbUZKQUxBQTJPRG1jVWVMYldUaHJqV2J4eHFEVy9EeFg4RElkdFR4WG1UMU40Uk42b0Y1Z1pIQUh1bW1iQmFHQzlZY1dOd1NON1FhdUFjVTlDNjBxaHkyR2hmeXVjSnpvU2M0N0haakhmOGJ3QjdYeXdCYnRta3dOcERKWUVGZXhoTXJ6Z1NOWjBhd2FvUHduOWViU1dtVy9nTXkrTjNzR1lEWklXUXcrUUUwUHZCcGh5WnoxNklRd2lIaFlWVDVDWkhRVVdBRGp5aEFWVDhNQUt5bTAvVXREQjVBL3gxMVVxZkhBNE13YlBiZGVFN0UrYmJUa0JVZmdUSDBnMzBMaWd2NmdlVEx0ZE1qNC9pQ1VyNGtZWnR4QXh1a0xIMTlLL3NHTWVHa3lCVjQ3Nkl3ZllNRS9mZ1NiUVlFbG5FY0hrZE0xVUphQnJZTk5EYlJ1M0JPZ0tEbjErQUJabTlIUzF5QWhsczVEVHNOR2o2SGEwaVFMdElFQmxlS3ZBeWRSMlRvTElTZFNmTHB0WDIxNktvMjdscGYzVFJhL2FZNC9WRmhEY2lHZ0t3SEJUQm9lNXZtc1hrRUxJM0Rnc1dBZTlOaGZoYUNFUWJRRi9yNHdjNm44NjBPOEZ6RTVmZnpBN3l5VnE3QU9xbjROZEM2Ymx4ZXZ1c0RINkIzL3RQV0MxdnByZFYvdkhqaDRqY3UxUFQySi9sY2V3eGI3VzFpdmRza2ZoNUhMSE8xd1lIdHh0TSt0d29icUFYai9SYU1KTGtJTU1iMFVodll2QndPbTlmcUROOEdTRTZuMHczYnZSZmgyUXg0TUZkUGN2cDVqTG42TVNBNyt5a0RKVEZud1Rvb2pkenVhK0IyeVp3cmV3dWNIN2Y2aUpBN0FPY3Qrc1lRNE53R2V5N3ZUSm9QVW5rVzRHbXF6SFUwN3JCdUFKektwTklDOTE2RXk4OGdPVDI5QmowL0FYQUxvR21MNFZQbGNxTm1jc3BZOXo1UXdESXExMGlJQmVmREZwd1llUXZBcWVpam82WCtvaXpQZ3BnQ1lESklwMVo2VGwvdjhHRHZXTjhZd3RTMFRBUE14eTJZWVE1elFoL3JBMEJVT0Zad25xaDh1YlgyMU5zNzJEdm9EaUJVbktvYXpDY3NtSEZ1NjRNV3BWSEZydG9rZEZTMXhuR3MzTmU3YVVOWkg5T0hCbnBIKzBZUnFrUGdDcEszUklqME0rRDdFQ21pWk1ZbHFNQjYxNERveHFHSFhXV0tRcFp0NHBBbTNBWDdUcktyR0M0R0E2Z0R1ZHFjZGhLaUlZY1dLQ1RNZzB5d1FBSUI5SktEU3Byd1p3d2QzM0p4dlhudUVpcjZsK2JZK2VyZDJSSGJVeC9UUm5MMDRhdHZHdGk3TVpuY3VIZGdjQkYvTHBhUFg1cWJ1M1M4dkpJNVhUazNjVGEzY2lHNzdXaXBCTHAvZGh2WUFFZE1HNkNaRjBKa1JlaExLa1ZTazdXRVBtVVJ1dGhiOUl2Wnl4WmF3VXFRZHd1WkRJd0FwSVlKWENkTXd5MDRpeXZTRnB4N0xEaFJ6Z1A4WEFrVVo3cXU0dHlFRVkrTU1NL2JJeVFIODNYZjNGTTUxRU5jc0NNV0N6M3hUcVlxY29RU1JacVA4RTlaMDZkTDRnWGNDRUJsb2J4SG1OR1R4ckZiUkkrTHpSRWZteWV1M0NnMWoxMWhUZmYxNXIzNVRveENDYVlxZU9RcUhKZVZrbWFkdGVZa1h5QkloU2RUR2MzbUtGclNXOWdUNXc4WFMzaG1QWGEycjdoeXVKLy9YamxiNkFrSGFEa3ltY0xUYS9xTmNLRDZWYkJhOExoZnVYSG8wazQ4dVk1SHl6Y00zYzkvN1luUll2OWlENzNUNDBOWDVzRGVudXFqWGo4LyttK3gzaUpjdG9MTk1nWjA3Z01adytiTFRlS0Y0bmxZcXdrQU1aT3JuMGQrUnM3NUlXREltUlZ4Qm1ZWHArVTFMNVZ4Ym02dm5adWJaMkJnS05CSXVDc2s0c1JvTzIxM0I1TEdHWmlBLzM0TGZwTHNBUGo3OUQxZFlHUmhIMnplV2U4TE0zcHgxSG94VHdkQ0lld24xQjNxamtVajRZYSsyb3krUU43ZngrVjl3SkQzWHdVSXIvaWtHSW9ROTVsMXg5Rm9ZQ2JOZG9hQjJXTFlTM3BvM1pIemVlTm4vOUo3QUorZ1Fkc2Q1RXU0bi9sQmp3MHdFUWZRU3B6RG9qZ2xXTlB0NmM4VTBzWmVJK0E5WWNGTGtnekEyNlpQRm9FUExKaFNiWTljQTlWZytFS2hNRndZZHZzUU5oZkFHS2ZnNUhFS2srUXpldENLVTlnTXl2b0lNTmd3OEpOaW5FNzBnaElEZkhZN2tFWFNidU03bVhLdVpUZkc0VVFmdmlESjJxV1g4SVplYUdpczNuZXQxcUNqT2RPWnREdVdLYVJzV3ZkTERKdFk1N1FpZTgxZ2l0ek1tVTF0YTA4c1huUE44SXJCUFJOSlZtbzh1RGloVmVwNDQzZXN1UXpYNWxKVzZ1WnluYzEwL2JsRTJOVi93TG0wWUtmSlIyR0dsM1ZuSGQvTlBSWGhKNXRyUVRZcVFWRkRDV285QWFBTVdRemFHRWZTZ1RHRk1yclNGSmpCOHhnTlluclR3T1pTRnd4M1J5Zk9tN2RVVG1GSWllSHNTTjMxNkwreStSKys0UTEzUFVwZis5Y1hMdnoxa2Vwek5BUGo0ckM1TEFrWi9MOVJuQWM0K0ptSXJVNDExTlpFc05qdGxObzc3R2luT0J2T2dRSG5WUWZIdVp2Y3F6dmNnSEFudDkwRXUrZkJWbFVWNlhZQ2hwYXEzSWR1SVVVK1o3ZlY0R3VtTmRHTFRabWtYbnJSdGtzNmVyKzZTYmNiK1plZnZYZWJZVFd0MlZORTJ5UTZtbmt3SEJjQk9Gc2EyV3lGSFJDNlF4Zkl4TE5jSm9ZTVh2Z1lQTmd2aEdGVWJTSlQ0OXgzR1hPdnJpRW1OL25hbk5ZeHJURDU2dVBVMm1EckhkV0hzVXZRQ1dYMDlqSkpNYXgrVlJqa1J0U3N2OTBQemR2U0NiZUl0eXI1UzBhMG1yOFdiblhYWnh1aTFTNi8rc1R4dXgrbWYvWERyYU9qT282VHh4N3hmYXpMa0xXWERiK1VKUXByRVVtbXJ1ejJwcngxdXJLQThXRUxSb3ljQmhnbGZhZ24zaFdxMTVYWHhEWUYvTEdJUHhsSUlyeWFuaXpnUFc3QkMzTjRaWDBrc0VaUFhvT2IzKytQK0NOZ3Z3TkVVMGNXOEo2dzRNWEpMcUhMMSt2SWEzQkxKZ0wrZkRaUlRCYWpZWDlQb0FjaE9wcHdyTkV0eE5jVTF3Y3QzYklWY2lGL3lDTkdteTIwZ3BQZzU1VWdBMnA2NVJyTWtQSEYrSHJyWU54andZaHllb0hOWSttVWEwQTBZOEpsME14cUY0OURTNU9EdXFPTkV1WUM5c1gxakM2amlBTE14N1ZCNGNOQ2VjWWxXNEp5R3gwQjBMTk5qYmpkQjUzNE0za1JxUXdLeTFyUFViWXBxTzJlbFlGaW5TY3AyL2ZndTh3SXQxYy80ZXNlcTdtVWtwdmowdTg5V2hmd1ZqYzNQN0hvMGNQcEFWYU1uYXJvTDFMQkl0STA1U1NzMS9EdS85SzgxM2d6UXM0S1dackVtQWV1VXlaYTZKUnJla0d6dFg0T2VYd2Q1NE9Jc1E3L0ErQU82ZjB1bThKajdVQTJBaUI2eVlpNVEwMTlXYTVGL25vdzREb3Y5Q2NCNndrTFZwdzhMWEEwWWRtbzZ0RHNra0pWV0pNTk1YeVJjRWQ3SWg3T1JESitiM3RYUnhjSDdEUjR0Um5IRUhsUytCa3NIQUZCUU5QRVVhT3FhaUhaM3Q3dWJzZmpEUUJvN0xjQzN1TVd2REQ1dXJDSE8yQ2tBcVlSU1diVEdKZEVEYmdDUkYrN3orM2pJTzA0ZUNPMjVrTWN4NWhCeDFzQUpraFVHL3I3dUVORklwSk1MbEhUWGN1V0xSY2FiSEVPYXFkMmo5ZnlKUWw0ajF2d3dtUmVuRTg2MFovSVliSjVqRmlTRWJBSkZZL0FWQUhWNGFEVTBlbm81STQrRHR2V0NQc0pDM1ljckRqT3B5YXVJQVBzaWsxQzk1Zmg5REQyd1dBQUVLV3hTQ0FSVExnN0hIN1FVRGhvaDNCYnRhQkRDRlkxbjZzNjJKSXNEaDRvcll1RDV2aTZITGpiYzVEb0NRTjRQQWFTdytzMjZIcEE4SlFHeTU2SmVNaWE4dHdZR1dsc1c1UnlIY0pCSFI2M2wrOThGdHozVzNDVFpBVGc3dEpuMEhkbHdwWnFPc3BhNkpxQTduUlNpcDRzSHJrZytyQTM5UEdFMVVjM2ViK1l3enJjTWVDRXUwcGFvZzVvVTArbk05QVdNRURiekRqQy90V2YwLzlOcjVJbzZTVy9ZM2pHM0pSSnNNOHpFRGMwbldLS0dnWjdXd0Vydk5VVEdaNHNpUmZqR0xzS2l4SXRVSzRxeG9WQkxtdU15NHlJbm1yUlFwYjlvaG1HNFBEVE96OGxJTUJnNzRVMTNLWXBKRXFqTmkxUUNDWk4zUjVWb3lUczMyUDRsOStkS3F0cVRnamxNdGY2djdOdyt2emgxTGJraG9uNHprSisvTnpJeVp0dVMrNjhmWHdndWJFck1wNFlHcmRkdDMzN1lrZG5aYmprOWUwTGR5MGZxbjZtRkkrK0s5bnI4Kzl6T1hOQWw1blZYN0ZSOWgzaUErcmZQL2ZVQUF6UDV3SlNkNFdZTE5ud0JHMit6Y25ZYktUaFkycCt2Q1JlQ2VKK3dyZVNJQTZVbktTbWJ5SlMvNFJib2ZpWThLZExlanRYTEJLQlJNYWJ4b1N2ak9HS0FEMng0c1pSZDdNTUVNQnZLb3BzTkswZkhDN3VqdHg2TWJ4M2NQREE1bFQxVjVuTmdjQ1d0SDdkd1YrV2owL2wwOG10N0t2ZTZyY1MyZnowc1J1ajBiOEt4NDVPVDEzUHQ3M0IxZWZwVCtrTFFIelFLWHd3R2o4ZWQ4bUFxMlJsWXNWYloyTEZhT3hhbVZpNFY5SlNlakl3bGJvd1VSYVIrdVVOSzVtWnNKN2VkT0RBa1doa0tqK1luemt4TnJZOG5TL21kOFc2ajIxSHBCamc5Q3NXTmVqL2dFRi9ON0I0Tk1JRVp0SzgxOE1vMHIvdVkyWitiTkxmZFA0RWhTOUVnUTNNb0gvdGllV3lyOUcvZzVDZTdxNGc5TzdMcDFRTXNpNDNqZzZtSVZQUGNmUVBETHFuSnc4T0YrYWlGNnNQSHB4TTR3eWs5T3UySjVIb1paeUdWSno2dkZlVHY1eTZQaHI1SDEyeG8wU005WG5XQ1dzd0RHTUZDUmVHR1JENUNxZzRxOVJBTkY3dnpvbEc0dDJSUkRTUjlPZVRHaWJOTktaYitORlJpZGhKd0NXSmJKWmVHVmplZ1AxbnRoNFpMUjJhVEZmZmFMdHVJalhwZi8zSURCaFJqaDE2Tm8zVFVJRnB5RTB0ajBjM0xuUUZhSFJxb2pJRC9JRlM1d0gyUEZpVlIzU0hEU1NPblFwVEVnOWFyRFNaN3QwcU5ZOWtncmlpL1doTGhQRkFEcVRVeXRxSFMyQjBnU0tZU1hWcVdneU5RYkc0L1lKeFRLT3crNmFsQTc3ZWRtKzRJNWQrM2VzdTNrU3ZMTzA5cE1vblpEbVZPWFNrZXBhKzI2Qmhqa1hwTDBnUDZjZElWQmNJcUh3T0JGUTNpSzRnNk84QjJPNFUySXhWNFNvTTFrU09pSjlCWVpRQUdVK0tmWmxVcE12bjZXaDMya2tQN1VISm85VE5mTm1NcURHc3RHYlpRejBXRzh4SGI3dm40dGo1WXI0d241bmNHdDc3L2hwTFNQa3B6aEM1VkVLLytzc1RGN3FDQndMK2liSHJFdGtxc3NZM3UySkhESjJXNEFIN2QwVDJEK1kvZUNnZUFUTDRiZFpVeCtLN1pTdFBGSU1LUUMwVDU1eENWcUNFZEF1SjZaNjVHTjA3TW4veTRxYVJaTVdIQXVIenhZR3pDOVZQMGI2eGJmRlk5VjJjbHVQdy9mUHMrOFFKMWp4WUJOYkM3OTZOUWl0bzJJSnRvR0dMQUdzUTBVN3FWSUZRWGxORWd4a1hoRjd2aS9YMlJXTjl2WkdMN0dnK0Z1MkRQL0xucWs2SzUzaHM5ZnVyT2FPZkNKNmNkTUlVZGNBUzVqbEdabzh3TjN6dHNsT29qeVFZQnZhVFVORG5hWXU0SXFKanJhbGpxUmJ1eE1PZlRDVHU3a3c2N2Q2MldPVGk3aG8yTDN4TmxvNHlGbzZ5RFZjL096Vm4wVHdBTkhlUXZKN0IvRGs4TGhNVVIrN2xXcHdnTnViUStVVENXOFZkS1duZVZNNC9jL0V2Ny8rbm43emxHMGpkcmMvK29QcVRmLzVuQVpOOEdtQkt4S04zNEVuNHJKQTFicW9GQzE0ZzFhY3ZzdTljVGJLdmlyWlNMOGlERERtcU95VmczclFkcEJzelBKa0J2cEpPSWo2QWpFMVRKTDdGNDFMREQ0UzhRQjZQMXg2S3NLb015YVFDS1c4NlpZUlZsZnljUFlKTlRCSm9ZcGk1Z1pFRmIvUzY4czdyTDFZRzRpTStTdUZuOTRpWFhsa3M5SmVMUThQbkZxdWZvWU9qazkweFc2ZE4vQnFMVm4rcnhyOHdGaS9acXpza0NzUG5NeXlHNHVVU2pYS1pvTWpNY0tjRStUaDRJQUlYZSthVEpkMWw4bmZLeUVrMVJyQWVnOU1yKzlhd3R5RnZjeHluT01tQ1RtS0lWZHppREZrR1c1emZCMUlnN28vbjB3ck1iOFVVckViYVgxRDRaL2dHTjVqYmZxdzhkdjFVRm45aU5QSUxtL2NzYnRxOFo4OHZVWnptcDVjcmxSUHdjMmI1eHV1bmQxeC8vWTZabzF5L0tMSlJrRmU0djIzWGRaeGwwQ0VVMlV1WklzM3pKRFdETUNDbytBN3M1KzZUTG1raDRJY3RnR3NIWW4vaTdwT2dRUXNUeFd6TzdhM1hFR1p1RGU4ZDVwSUpGWVc1eUYyV2V2QXQ5dVdkNmJ5NVFTWGoxZjlrdDlUckIwaXZJcGV0aU90V2ZZc0x6SHJZYjJYRnc5VWd3TStTcVlpMUttUXFSNVh5YlJSMVdoQ21QdXJUMWdwVG1NcHJDZENMRFdKVHNmWlJFSnNWR2toa1Y2MmRsUE1hdloxV2lSdDJnRFk3ckk5T0I3Qy81ZlQwY0hrcGlHcUVoa1I0SkFtWGFBYXpOY1NNdUlrNzZ6VmpScEM4QVhON1FrYno3UmhzRDdoY2ljNzhObGdMTjA5c3B1Z3pVNHU1NnFjTW55am9WWDhNZkxaZURtRDgxOG9CN0NvUHoyYjd4eFBwcFoyN2JqdzBlbktvbkp2TjVnYmorY056dStLVnVjTFdXemZNZ3lYY0hZeG9IYTdwOFpucll2SFpybUE4R2dwcG5lMHo0OGxOeGE2VXdETU9Oc0Q5N0xkZ2Z4L1JCMEdiZ2pVS2EyNWVWVUNSd2cyYkxsdlR5NTBPTVdVaGt3SlQySTAra1FvUFdxdndxRWN4alg3dUdIbm83Tm1Mano3YWszWEhBb0Z5WUc3UFF6UjQ1QTJoSjQ1VU0zRkZXOWEwSGFMdjdhcy9CK0JYWUMzdTA1MW96OUI1RVBBWTU4TUZCT0RCZXdZMlBDV1ovdGFnK1NuWDIycUhKalVCNGZhbVVFQjRoVk1HQXhsU1plR3VjVDhOa21IY2R4SEVSR24rSkwxU2ZSWWtRNXllcVRyM0Z3ZlA3S0d6Z0pNVGVvTVpiYzQ1RExiS09TenhWRUhwYjc5K3p5T1B2T29iQU8rdDlKYXFVNHdOQkJuN0NzQlptM01ZZkpHY3c3WmJYbmZUNGZNbnpoKzY0WFUzbndXZ3YwTlBWUitucDJIblBHbkVkT0FlNmtUcDVkQmtLdGRRckV2d2RoS015dUhjVzhsaDRpRnVUMXJiTTU5KzZNNDc3M3Y2enk3ZmQ5L3E4MDgrK1pOcTllTWZGL2phVi91WWk4OEZ3RzJYbVVSY1hGZ2JjZ2czWVNCNUY4TW9ZNTZxSGF5STBhdDFJY1lmOS8veGZhOTk5SjRmUmZkT3UySWRQcmZXblJzdjA1OVhINld2dVBxWm5ac2srU1JqVWRGZkRyNzlJZlMzVGw1aThLWGtKZVlvV3lYMGtlb0wxTEdmYnFXbjlsZi9PejBKTmpPM2E5bTN3R1orQU1DcHRBczYrN0ZoMytJVzVBWTF5Z0dmWjlLZ0pFWk0rN2JGa3pyN3RraHNtcVRacEV1V0ZRdnliSGV6c1dzM2pOMjVwMGJnbmFFWGU4Y3lmKzNVTUpMN2lXYlRMaE9iWkx0OExYUFphTCswcEhjeE90QmZMUFRta2oxaEhsVm1VMm1NeFJ3OFljV2l4ZmNzV3NRVVFyNGdodFM5RGkzR3lvTURzZ2JXVmZjNkpERWFHSlRKTzZnR0NHdTJsZlZjQUNaVjlPSzFtcTRabkI0ckZoZ3REUmZHaStQTjQzTTJqdTlaYTN4aEdOODNqTWlzSXRWc0xjZW93bnl2OTFTR3A4YklCcHgyQnRNSGsxaWJRWnR0N2F3N3pQR052UGdMMWlnZDVpampCUmdsbnVjTkRRNzBONCt6clhHY3oxbmpqUDhySVYvNU5YbTYzMFRTWlcrVE5NMEdPTFVhbnRNYzN2Q0x0cmRHNXpSSGx4bXY0Q3h1MlZUWk5yNXRaS2d3Vmh4ckhtTzdTSzZTeU1EcTg5SjFzR2NPa1FyczU4Q2xia0FTVkFobU9wNFV1aVhIVkdVZ3p3QVBHRisweFRQcVVQT1VPUGdrNHZzWk82Vk85RDRyS3k0YlExUlJxTVIzTzlEQmUxSnJNd2MzdEU0N1VtdTJtemdjdFZlVzlOVElNQ1hUMnpkdEtJOE9WMFlxYUQwbWVpSmRodWRxaUE2MXIrKzVDaG9LbTJtc2l4T0ZITmlvaHRVdWRxOXNOc2UzLzM5Y1BIT3V3YXUxOFVBb3ZsU3FOK2RuQjA1TWJEcWZMSnloT3czRC9tcTFNbERZR1ZYc1VuUnpFaDFmVTl2M2RIU01HWTZ2WERxZHMrejk2V3g2cERCWXBMK1Babi8xSjhtK1ZNSVZibTkzNVVnTGVScjZPMEorOFd2elh1TkN1YUUxN3pVSzFPRVhmV210UkIyQU5ocElVNURFcGtpOTRkb2lOY1lYNUVBQjVHcHJzVk9qeWRNV1RhSWdkNTc1TlduU1Y3ZFAySlp4Ykw1MUNhSVBYTHR4QzJuNklzTkNmM0FYdlFycmI1QnNJcXNDcFo2YTE5ZEdLMk1nM2ZwRGpHZ0pVQlR4MEVpRFFhWFhOcUZxWFlzUWpIWE9HR0V2SUczVHFLMWU3bXNhMkExMnNiNE1KVE9oNEl5bkRCSFYvSUtxK3NWYmZHZ05MM0VTaXZiOEdQdnN1cStKelpPU2pST2pJOFZDTmgyUEdjdDJrQTQ2cnVWd2JwWEIvUko4MEUzeDVjVVhjMGszQlo4M2VLZ3QvcE9LRnYvMUFQOTk4OWZrdjJGaUl3Njd6Ykhpb3ZZMnFrbDJiZDB0M2RvVHlpL3BuVjlqWDJpeHgwYzBRcnNGeXFseFdOMUZhbmUwSExNMlg2R295RnlybFd5MHFxT0JYYkxaYTZOd09MU1R3RGZSZGZkRkladktMK25GWmtKRTlCS1dnTE5yanBVMTcxK0RmTENhR2QwNkNUdFBhV2hnWFoyQisvYTUzSDVJNk1IYkNia1RzL2trRmdDelFWSzRsMStnbjhKOEJWbGhsNkN6d082YTU1K25McDh5czhoNzFpYmNOelpaMHIyTUpoTTljU081dVp0MTEzTHVCVDdmdHZCSkpnZzVvTy90NFpGc2RUako4eVl5ZUhUV2dFNTlxblk4em1nOEU4K2tVOGxFclR1ZXFvM25HZzUrcmxFaUQraWhQcW9xQlFtVWhoZ1lqd1N6S1ZCbW1jRnRTWkVVZFR2Q0Jqc05FN2ZSNzNvT0pBWVhMSEhWT0wyU0NaVXZYYU1WUDcycXo1b25KVnF5dmR5YytkcTVTYy9SMHRxTStjSEZqWW0xSnltWmZybmNsQzJ2OWs4dGpUU2VyVmh6OEt3MUIyRnpEakFDcldFTytMRWxnNG00QktONytYTmc5ZldjMFJlZVhiNEZZL0gxSFUwY2lCNHZUc00xakdmMDBnTzlnSWp1NittcjlXSGt6SSt2L29wZFlkOGhXWExaenZORTZJOEl0M0Q0RVpDWFVzVkRaVFVXUlNjcTlDWFArNmdDRXFINUNUT2VMSW1EalFUTzZyTEFxUEVVU1ROUGtVUVBjUXlTQUpQaC9Ick5jR0UxdDlEV0hEckJzcUc4VkVVQ0ZnNzFVMzgrelUvYXhWbllJUmdmbnRHK3l6b0xzK0VKckdZRDZtblNmRERBSkhFV1puMnNtaDhiWjJFSjBHVVZmbHg4SGd3U0UxRytHYW9tb3BsV2JlelUyamJOOHpFdjRTZTBnRkhVN1hWNzh5bUhGbDF6UmxhMkhFUFhQaXU3ZE9uaXhvM3JucGRkMnI3WGUyYjcxUy9YSDVtWi9uUjZSZFRjTTl4VEhMbTZtbnZDclU2dmlBTUh5czhiOEowT3JLc0VkTVBUYzZ6MVkzbVlSQlpaeXB2Q3NudGEvUmtDck5ld3c0Tm5Cd3N6bmNsdjFwMFl5SlpjWTUxY3pqNHM1T3drSWZkOE1zS1A4b1IwTFJCTnhWek1TOGJKM2dYZ3I4QnVXOHZqdllpZU55S3dxWWlOeHZhdG04Smt4S0xJTmozeGFES1dUUHJ6S1R0RysxZzRmYy9DS1JZalpFR2ZFMGdOOU9leVpzMERJNEdZbnplMjdpV2Rpa1VMdmFtaDlGQ3RHeEZVWlBYemJhdWZKUFN6WDE5TVUwMk5DSTlPMDhneEVSWEdibS9aVlFxNk1xdHYxRHB6Tm96cFdhdXZzTm1YcW9tK2VJVUZyTFZ3eVFvOVJJL0xmNzJ2NTZ5KzRqS1hrNUdHODFsZUJFSFZRS1BFYmh3dHV4a2FSUHFOalE1dUdOb2c2bjdVT25OQloydjZRam41R0x5N1M1OXA3QTNYSXRjbzF1TWM3S2k1QzBmRGVHbzhHb0pWY1g4RGp4WkpJKzB1aUZHdHg2UzlaZ0VGa1J4K1RTNE5jbHBuVThDcXpTeFV3KzFwQzdkb3JNWG9lYVErb3VSYkI2VnI5TUhqQTNQOExDcE9idEk5ZU9MU0RWcUhHeVJlSjVmOVJtd3NxUjI5OEFLcjFuN0VFMHg3eEhtQjFmbWFKa3Q2dTFIQklKTkptVVZFeldPcWhsb01UVWRXOHpzNkVpNlVNZUdHczZ1YnArZGsrWHJHSWxGNlU5MFo3ZUJxRjQ4WjZDZWo1RjY5SGZadUtVR3AzRThWS3MyYnhSazAyT3cwQ1phMHFobzdxb2w0VE9pU0FDckI1YjdaRkNzNktlUnNxemRRc1hNUERvd01ENHdPamhhQXN2NmtIYVMrWXBsQXBnN1Q2TkdvQlV5YXNRaHZONklpeTBlMzU1cmpFV2E3TnllSCtybVpkTnJ3WUh6VENKU2t2VFBIR3dNVXByc1N0bmlGMjBoc0M0OVZRTHI4ak1YWnY1QTBHY0tzMlFUUEJrOWp5REllWjlpNWZ4OVlTbHJCc3o2VGJiS1pZbDltS0R1RUJpQ0dzM2h6NkhRQi9TeFlDVnFKUU1iR05oWUl3ak9wN3Z6dmw3bGR2djVRT2JrcHZKemJ1M0V5dlcxNXc4aVNuc1dFcjRtakFkdElmbUJpeitMRWhyMTdtYkpoeUJXeTczWWxmWk1UWTVPL2QyckhLL1lXTWVWcitPQmtpcFlMRXhmeTFlQ2hMWnNQSGR5eTVSQmZFemtXNWZMN040VDg3aWZrZ242MkhYN3R6WVBoRWdmekpnUnNIT1N4RFJzbVNpT3lOc3ZkcXhUZHEwMnhEdmJtV0llaFFVWXI1Y0ZOUTV2NndmaU5odjNlem80MkIwMndoTlBVM2JEL1o2Myt3OUQvemZvTlF3QzlKUTdxUFBkOWdwMEZBb1E3WlpwUWNEU2pNQWdvREpZSHk2T2xrZUZtSk5xTStsbVN3RU1haHQvU1pKZ2MwUStCbGlPQjVhalprcFNCMkZkWm1PZXB3TlFTQ1lzdTJHekNjOGYxR3dZajU3cVdvYVFubEFWRlJvc3BIZ3NGdko0T2w1eFcwdTVPaHhZcTBGU2xKTDJjV0kvRmxiMkxyM3dwOFI1czVVc3ZmTzBseFh4WWRIL09vRHZ1QlkvRGc5UDZpWFZtSHFaY3M1MXNTZkdXa3k0Mm9sYVRMdVRrMU9vVjlqRDdCZGhOcjU5N0tnaVN4TkVPOXJJTDFhWDVpUG1IQkg4c2ljY0JFQlR5U2Vpa1cyU2lTOVEwaXZIWU5WejMxTWpYciswZ0lhTWczRXJ6STh6eDZTL2tjK2xrcGhjUDRLbDU5dGxvT29relVzekQ1SXNSNHdCRUZFZzdvMi8wUjNkdTIzemo0WTNIOHVYNGRMb3dtdXhkR0IwYTJUZ3lNell6ZDl0dnZPckdCMHViUy9SVmJwOGpITnc1Tm5za250d1pqdllsb3lsWDJEMmFIeGpOOWFYeTVVTjdxKzMwcDY5KzVQVGVrVTI5Q1VFZk41Ni9nVDdPbzFhY1ZKV1IvWXp6VXFBOURGOUdMbFJWUG13TXd6RHJMc0lyRVl4ZThKcVZiV3BucDgyQkRBdWJOMSs4Nzc3NmFKMEsxNFIvc3ptaWdhMStCV01zcE1lSlNzTGtOWG83YXJZT3dLb0xzTUs5b0plYjl2RGhaUnVtSkJNMDIzazZqb0dlV1JZeTB0VEthZ0R0bFJObXF5VzlDeXdCb29XMWNORHZjYmUzZ1ltckVoWExGb1ZBY0dxd2hJSVM2TXpONC9rZlM0Y1AzMzN4cnU5ZmpDNldkcCs0dUxHVUhQZEszb01IMy9DR0YvNmRmYW42WEdHd2NWaXdEallDc2FlNHZ2SVJvVk8vbTVBNW9haDBvUkFIMFg0Sm1DdkFxMG1ZK2o4ZTZZdVNKRlM2WFA5Z0NTblRXSlZrZFhYMXJ3QnlINWV4SHpGcWt0d056WnRxa2tCUEsvV2cxcWxKOG5XQU1Namw1VWVNbWlRSUMzWWhVWk1FeTVGSXFNOWM0aFVKbERxQXJjdVNJTXkveFhvYVhCWjh4S2hMY2dKZXFlaWp2Q2dKazA1aVNGYUFsNVV3Z1Yyck1nbW5xeEhmQlpyL0crQzM5U084WEM1bTFLYXlxYlNOdGFrb0lRQ24vd2ZlK3F3MUwxaVhaQzk4c2xmTVRKZ1lneFNJTlU1TjBLeGNRbG5UM0hoYWxRTGh0bjJPL2luN1B0ajJiK0MxU3g0aHY0SlhEdXZYSmFqR2VuaStnbE8yUzRnL0VyUjd0ODNCekJHZzlGZFB0VkZlZ2FvNzVuSGpnSHJ6bVZTczJGMFU5S2tmbnN2d21hMytHMEFMY2wzMEkwWU5FNXpIb3Q3THo2TkZpb2pjUEh2TmRWZEFGL0d2ZHBHLzR2RnRTWElyK3R5WUhPQTJTaHUwTXlxWjlLaDFzVzZLRWpRY2ZZYmZMNEVoS2pGZU4wVTYyNnFsalBZZkphYTNyWFZBbkxlVnY5cGRzb0x6bXZ6Uy9YWEJlbGVmYkhKQzg5QTlvTkdmQXk0YjYzZzlzbm92UExoQmIyK3NnU0o0b3Rzb3Q3Rml4akpGR3hnV3N3M3JhcVZnUTdXUk9WcVVTOEgxQnJ3aDF0dEg2OVlieUdUMDdqRWVUNEFsR0xCU0NyeUZ3b0k3RXB2TWZhTmlpaS9sVFd1aXB0dE05YnNZL3dkd0h6Vnk1OTRPN1EvcExpeVlnckdBV05waDFuQzBjM3RBWWN3b2tGTXIrK0dybGYwd0cxQlI4c09xbWVJWGFScFd6Q0VRZDAzTi91QzZOZnY5VFFHSDlNcXpScmdoVUpQTFR1bTNBUWVOeklnOUlNQ3ZKY0dNQVZFMXBqNEdxdTZCRlhHeHBMZkpzcXpKR2c5UjZTcDRTMXJLQzVMOTA0OTk0TFR6b3ZUYmwxRndYeDBYTXVVNmdQRjY3b043ckVQVWFua0FIbXpXSFRLdlRBeFRNU3ZjYXAzRXFNQVFzR2EvM1lnUlBtL005eWZkSG85azVEN0VxdDhsLzUzUHhXTjhEMGova3BDeHAyVnFUVUNueU9vMzBrd2phS081UkJHZzA4M2dURHp2cnNPem0veTM2bGZRSDRUMndDektMbngzeFpUelFuNTZaTEdrY1h1RWJ3VjQzMG5DZXREcGdPMEVZMjloWW94NHpoQ1A1NnhnT0toZmc5MVBvOGN2SGoxNjhUZ3RUZFA5M3VxUHR0K3l2Zm9FZFV6elhDd2UyNHR5OUUyV3oraWRTREdKZU91aUpIdUlxaEJGSlpZUDFqUlBOVE5rVXF5eXRKbGlKZG8xQmxGYWJmV0VVWk1iYmZiV2JVRDNjc01HRWd6NHFZL0N1a2g1YkxYOE1ZN3p0eTJjMGRjRE9nZFdCalR4bGd5OGt5YmVYSFZvd054bVlaTTFrVFliTmFKa3MySS9nMzQvcktDSUg5UHVneVplZFhsdHNHYkJ0amZ3d2pYN08vRGczRnBxeHRZUWtOY3BYQVoxSjRKTy9tNVJuL0QwZXJScFJScUxMczlhZE1FS2lwL1JBMG1nU3dEc0pSTUxlVDVCbFZtekpJRlpidFJtNDVaSnRKNUU5c2JKN1NXbW42N1d1QkZENndWZVRzK3F1c3pmYWQxeUNROHJhS0VYVHo3RG9iVTA1WEd5bkQvZkxQaHpKeUduYWtkRlJGYUlkVlJrUk5DcWRSRzB0YU1pd28rS1dqUUJhZ2I4ZUc0Z1VoV3hPRWlxVU5mMzk2eStZMWt1Mll1RlRGcVdaelhNeUNWWXZhWWxXRXlCN00wbEJwSURKbHhiSTl4bkxiaGhnRHV0YjB2eXpGeCszSUVqcTF0cUhMaFdCendCd0JPNVJBNTlyaVo0dTVXM0p1QS9aOEdQdHhHc1hPOVE3UkllY0dpMEViQ3REdkJBUCtJOU90SS9QakJlbjhDWnp6Z1JQTnJCejB2dm9WZEJkdldUQ2ZJKzRkYnZBR05malllQSticGdqOE5hS2ZpSnZlNFR3LytmQW1aamtzYk8yeDBNNDFtUXplSzduVFpZc1BKSnZQTW5Kb3ZnTTlGS3hNYUlSc1J1YjkwZWpJSEJnWHl1WEJxWUdKd285T1g2OC8zcFROS2ZUcmRoWktoaFJhOFg1WUl1bFl6aEUyb09wOTU4THRGelptUHA4R1M2K3BnWjJySThNYm1TVEp6ZmpDSFc3RDdETzFTZDM3eTQxd3EyTGc4TWxPdmpXY1lIQml2NW1lWHY4SWlXVDF2aDF5MTRPMVFsNUlJcFJ3MG1hSjZzUnVaT2FFYW1OSkhYNVc0L1o1WjBBbGk4bmhPTi92VzYvaE9EaEp3Vi9TZXhYM2taQS9uWFk1VUk2bzJZWDAyd2JrL0xKdEI1d0ovblhGcGJYczE4K3JUVmZ4VFd3WVEreHVzQVlQKytkY2JkZWtDbW4wYkUxVWRJaGd5aTd3RFp6dHZSeG1UU1greUpneXdJQXlSUno2ZnBVMG14K0xUTGNzRGl1a09Ga1JlY2l6R3VDdGVlOGRSR280V1pxKzNMd1RDeWc3bkJkQkpON2J3M3oyUGoxNnZzbzFWOEFYd0lqQ2NDK25Qd2NFaVBKNUVGOHpQZDhjV3Q4UlQvZlVkM3ZLZk4rYWVkV2YvbVBZOXUzdVBDWDVXRjVQVWw1THFBTnd1L2ptS1VmOENYcVlZSHZUOXd0bDMvZyt1bkkwUDRXMHU1RThrVGNyL2VQZ0E4bE9SV1REK1ZEVzA1YjlZSkEvT0ZXK0RSZGJrZzIxeGE3QnE4VUNtUERLR3NYOHNMR0RmLys1d1gzeWJrUEh6OFczcWJBNVFzdDFPdWk2Q1BOMHI5V2ppOWtXWWFxVzBPS0UrTlpvMEI5bVpUYTNNUUdiRXRtaXp4YWhOWWNwZDZxQ2ZyOVpnNXR5T0E1Vzl5SFVUZ20vd09JZmZxblQ2Z1pRMW55Y0E1WWVKc3hoSFVzTlpNVkRJbXdtYWJSbncwVXg4T2VMMlVlcnU4WFZ3QkVFalpSUTJpN3VwM01mZkF3aWtOWnVvYlc5RXcya3kyaHRvYnBzYlhnaUNOTlRwaVpuMldsMEU2WGhjRWN4TDRYUCttbUdzRjVFNVRoUmd1aEJybnNGWEdBaGJZV2xOdktINnRPakZXLzkrMitrLytiNzcvTmxVeU1qdlhyRGxiQzN4Tk1TTWo1OExCY3k0MmsxZlUxVFBhQ09yWEVLaVpnenpVU1lSOEpFQmk4UUl2QlBWVVVmaFhrYTJLUTNIR3EwRkJHNEtWWGRadHRLUTcwcGswbGlMQ0xNYVhrcjJocmx1SjZGb3BIZWNYMXNhQmpDMWZNOFZEUDZvMUJZU2NrRlBXSER4cnpVSFluSU9HQ2tTOG1oUVcyREdVb1pjNEI2TDJETTZCQlQ5OUkxbFRoU2hXWDRVby9sS3JFRjJMdTBRZXl3UHN0MGdjczVTNnFJMkVxZDNHNWgxMkpzMnFGSXdDWXFQa1BLYjdDaHNYRm83TlpqOEoyazNNdnRBZFRXRTJxaWpLRXk5VWVQUkN6VDNiSXIyRko3Zzg5bGhkaXN1TmN5ZDVqc3ZKdVgyMUxCZkc4ZnFzbEFaZWl1RE5TSDZxVUZGSjNXSEhnS0paYk1QZFlXd1pNMHlDVnVIMG1Db1NiYkMyYXF4QUsxcEtXaWZiaGk3Y2tUcjA1MDBwTjFLSC81dlZrZFo1TjNGWUo1anowMC9lcEljdzU2ZmdZWXJjUTIzMk9Kb3J3cGt0RmtvUldOOXVVMjhuZGh2OHZJL1lNRC9oM0RxSlFhaEJRbk5GdFY5NlNlMlg5UGErZkNidDluT25PS2Q4eXlHdXQyVHEwNHhHL1d1V1NOZndhSFBpMFZqamtqam41TFo0SEhnVzZBRTgrM2JEZm53UTZMU2lkM2lBTmw2ZUQ0VzNOQnFtVzZMbGFCb3J5WFViRmVUV0hialQ3Ukd6SzRxVVkwN2dtRlZ6NEZiZGg5bVN2SzZBbDljVllNTG5NY0xyTjFGam42OGRSZnQ1SG5zWHY1VUlRM2pZdzYwYThlaThwZ1RDREY0VkdMUUtDNnlUUDJnV0ZsaVRQL2dWNmUzZTZqZVR1Ym9Nd2wreU0xWUdJZENXNTNqeFBlY2RZcy9aUU1pN2RLZU5aM3U1YXRsZVBRME9ESzFGNmxjclI0ZldPaG1zd2RHeFRwc21SNGZibTdhWk1TMEM1KzlaT01kQ2hOeWhlK3B3NXNXaFRGcyt5bThqdzBvNXJkRFdlOVk4WHBPNkJob2FWa1RCYWxJbU1tWWNqOERsV1F1WE1PQnluOTRSQUhnMmZpaFhSOE1rK2xGRUZSc1JYOVFLbmV3NmpkWWd0ZGJwQW1nNUdtbjBuSVZYZkJYeFdqdXZDWDdkR1lnMERDc0lvUHRoTFVxWjFtM1dZQlJERzVuU2V2dll4S3V0RWE4YXY0WCtrNUQzdDhMTHJQY2orbHlmNFRLdEc2N2h1S1I1M1Jrb1JPdXpuSjhUTmVRSHZtdVlhUXYzVWgzdWlTUWg3Mm1CZXh4UkVhWmFhNG9hcW5pclptdFhDanpINnc4VTlieDlmYlFwalhJK3FLMFdoL0I5Q1hvL2JlRWNCZjY4clFYTzNkelJoaGo1V2hJYmxjNDFEZFl1bEhYSWg3bWtYU3hNcjVBYytiaVJLbzhYZVdHeENnZVBNWVdOTndkZHpVV3NCMUxqZ3lXelBCN2xWUWZBc2p4bDFJZXVxeFZtbmR2d05vYi9VS0RYV0ZNc1p0UVVhOVdTVTlTQm1leitUQVkzOThRNk9RWDFOMlppSGlzanpWa0VQSkgxb3NocWJUcXNNVkphYXptdU5SNmpQRzlBekZjUHpOZkRMZVlMSFpRMlRiV3RpTnZqcUthc3RGeTd2ZXUzK3pYV2IwM2VSU0tFL0tFZU5IMnBpS2NrOEd4eXBqYjZSOWRmRmIzck4xNnpOdFk0VTYrNVFocWNxZld5a3VjQzgzWDkyMGI5cVRmaW1kS256ZEpqQXJGSXc4N1dtQ29jcVQwMUh0VFhVTU5pS3ZWbDFHcDlQbWYwQ2ZKNVA4SHFYR2FYdklTYUpYR2JPcnRXSGJYR3NZQjhuU0xrZU5OSW9xYkkxRnBCcnowMkhqU1VXbHZTTzVxcnJkV041MW1yMy9CTkJPL3VxYSsyWm12YzJCcTdYVk53RFdEeW5HYytsbmNKM1NSTHlESGQyYUV3aWJRYnh3YmlDTFBlOWJFbUk1b1hGS3F2VDkvd2xGc3FtUlNXWlROdEpOSHZzMWEvWVptZzFZSVZJcTIrRFJ1czVwQmVBOWlvRnVsRDJMWW0yTTlac0RGUGRFcmZXamNtWGpYU2NrZXZBZHRjUWhEQkc3SyttVjZoLzBYSW1SYjBpcHRPVkxWMUZ4R1VzcGIvdEFYRjJrV0pSeS8yYlp6TDhueHgzdmU3eFZ3NU1CN05VYXVDdG83N3FUNmJmQjMzVTRzbTNJWFNYUEdOMDFmZzhXMExqK1FQQ0puWGR6VldmRnZyVXFycjQ4UzFpNzVaZlR4bjlkRjltR0NWNE5wWTZ4TW1XdUsvZnMyM2JqcEM3MmFmNC9rRTc1NTdLdmxmcmZtVzVPdmNURlZTc015YlFxeDB1M0hHSTRwTS9yV2F3UkFhVzdVdStHYXZpMkZveXIvenIwbTIrNE10aTlmTmRnMkhpb1d1OFV4aVlHOXU5M1ZId3VPSCtsS1JBYSt2MkpVcDBKSHRvMk5iN0k1VUp0UFpPZVgzelcyL21ncjQ3Z3AxZDdSdnNkdGlvaTVNRHgybW53RzZZRjJZS0w4amhFcjByRmxsQ1RCTlovTnAyUjR1ZUp1cXdXVE1zd3ZBcUtkbmJLNVFtS3YwOUZUdzUxZ1AxYWVHaHJadkd4N2VUbi9aTjF1Snh5dXpmWDJ6WS9INDJHeGZhV2FtQkY5QUhPejdkZXpQU1F6dlBtaXV3V1pjaXlUakJrMld6R2dkUXZjMjFHRlRnV0xYcU1QMjc1R2hRQ1crdDJqMlBiQS9OdTR2UllmMHJmVCtZR0JEUEkwZjRzTjBmRk13aEhoWmRkaU0yaS8zR0NkT2JyTUFET1VGWUNJTm4rRGRkSVluUDdTbU5JekVhdkxmZW1SNU4ydjVKWjIxK212ZWZFclR1dFltbDVUK3F3WFl0bFNkOWJrazNEZVB0ZVpBcmxCVnlKVjloSHpKR0tzSFJoYUxZaGFVT2RhNlQrckdtckZ5SEhEZmFSNjRUYkl5aG9UK3NVNWpXek1wK0FGNUxSRmsvWWFnZnZnYTA0ZTgrYlFoUzhUNHZtZU5MelpFeUg4VGFBZWF4bWRraFVRYUhraTFCMll1VVYzYXlEb2p4YVQ3dFczVzRxMkgwaW5VbXpDM3BBNTFoK0hyRjdnL2ErRWVCdHcvYkp3c1lkSkhBLzR5bml3MWZZclg2eHBZNStweVEzZ1ZqaWJjN1JidWhmVmIydGVPSUp5Q0VaaHBKSFZqY0RhTTRUbHJESEZRWkg3dlpmSlh0akhQcEJsMWg0VjYzN29OSFdzeDc4SE1GRXJyTTFQcThIYzE0RjliSHlFYklYL3hjdkUzTTB0YTQ5KzBRUHJXYmQxaWhlUWFzbEN1dVVSQ2ZLWjRnc2k2dlBhME5jNG84Tm83WCtZNFUzVTVLdXV2alZ6clZxMVd4L29ZVzNrZ1l5Q2ZjMlNVZk0wUXUyNndMd1lIZ0lGOUZQTmRxUVE3dml6eFlobldJd3BLYysySkQ4YUMxbStLbi94b21vVTJ4Z0RZRkdaVTlPS25rUW01bHZqSUk5ek90bjVCSkQ2dWFXRVRDVFBZenBvV0R5R2w0V0lmRENLWHlYb3hnUzNTU3VDM01KR3Z2UWMwbWNyVkw2Ni9KVFJaenJVZHd1UUx0SmNOdnVnQnZ2all5K1NMUHFJUnUwMnpyN1JSbXhOZzJOU1Y5ZGZ3d0RVYi81cnJ1Q1pMSXlPRS9GU2dGeG1DTlpTbU5udkRlSlQ1UVlxYlFhdW5rdkcwYm53aTdjUnVOMjRUWDNkOFlvMFBYUE1OeDlwMVhnUUwzRzVUN1N2V2k5ZWl5UkplYURkUkdSM3BMNkJ1MlNpVUpaSll6YkJ0cklkc0pEdklJWEpjUDlvTytsUUhWWmtmaGpyUnd5VHR1aEt6d3hpeDN1a2NCaFNxbEswWWFWSllXY0p1ayszblRUYU83elk5Q1FsbFlkL2kvT3pNbEw0bFhlbk4rdEtZR2V1dGk0U3hLc2pWd2hEVXVyUEJXa2w1L3IxZXN4VGxZSXlqUlhocGMzTFQzb0doL2QzdGxhek5wVGxDTG0vUzZmWW1OKzRkZENjNnZNRkk5QTkzN0huODhpdGV1M0dzSnpuV1g5NUtGN1lPRFczVmg0ZTJWcS9PYk50L0toejVVSnZmRVlyUWJibXBVaXdlR1JoazdJUXN1ZG9DNVZoK2FqZ3F5MXF3M2UyaE5tbmp5TnpTcHZGWTBlSHFpeVpISElHbHNmN05tL3NITm0rdXZpdWV5TVk3dmNCTWpHb1JyRlhONllxNlJxZlFOWHlFdkZLL280UGkzY1VxQ3dCMU55U0F1Z2RIT1hYdFNOMHpwNDlkTHp0bTI2aURnTEhsWEhsWjFENnlkSEo1NmR5UmMvdjM3cDdiTWIxMWtsTTk0eko5QmdLZlp5MTh3b0RQUGZwZFI2Q2YxamlwQWlkWEczTTRxZE5CTDYyTGpkTVoyTjBTcGFXbHBlV2w1ZVBIcmovYWlGUTdSMG9XT1BGOHBra3lSNDVpVGhjV3BmQlNtOXhGN2JiTmFhYllseXJNcVNvaVV0ekthd0poYXNNb2FqdFJWTHVDSGltblEzVml2cE9ackdmVW0waG9Dd2NQTEM3TTdwemFKcnAyZDdacDNUeS9pZjUvd290MFlXWHZZdlhULzVjNGtxMThxZXIrdjhXVXBJNFBualA0QU9OK0g4SzdKUFZicnNtWjY4MDlzS3JEZVhKOURqaXlkT0w0MHBraloxb3dKY2FLd01aOW5EMVBzdVIxUEtmaERmU2RoRmNzNjhCY0srellRVFhHYzYyd25vNzRZMGs4THZLamNCdFBkWEJTM0ZiRjc2SzhjcHREa25qd3FMaGMzTGdMczY5V290bHBwb3F0OTRhZXh6RnJNT1lYYXdvU05wekpoTHN5K1F6b3ZlSjZkMUhQMmUwU3ZqVWM1MkxkT0IvajQxelcyNkpkZUxtWG82NktkS3gxRlduTnhDclNxb3kwOFhSSmQzcU1qc1ZKS3NhaXhWYi9nNzJWZlpIclJWc3hYMmJMeGtJbW1laU91S0JyR1hOQU1icCtWOHU3MGlZcXBlRkNGcXM3WnJTc2lGVGtTNkNTcmVWVVlBd0hyQ0dlNFJvSVlIWmFaY3lJWVpTc3NsMmFxckszYmcrWEk0V2J0OXowOE9TY2tvamNzTGo3VEtsY1NpNzIrdUwyTSsyRmFMUlNQUjZJRHNaai9UMnAvc1dGcmRtcDJNaHlYaDdxblZ6MEZnS1ovQzFMazB1OVV0K08zdGxUUzFPRHUrUHh6TzVzNnJyaHptMjNGRUpGK3RXdTRXVFVXNGowRkFhckQ0eE9ocm9Hamcrd2FGbWM4WjlrZStodDdGdEFqZmpIMVROVHVnK3Y4NkhvN25wbFhaV0VqNnRreWh0TTVhN2NzL0lCOXEzTGw4Vzc3NE4zZjUrLzI4WGZiVGR5Qk9ncjNaME1LSU52MFpLV290SEhQbkFhWHVQM3hRTk5QOFdlQmJHVTQrOUVLVDlSNEVsbG1ETEJ1K1c1WXJJSlFlU0wwV01pT1l6Tll6NFk3MzhIMjBuL0JHQUZ5VGlIMWUvaXdOREIyRWJKTE1FVW95VWNCU093TE1VVndKVHRUV1ZTdklvcUgxUk9IR2lYYWs0Um1KMUhwenNtZWdPOTJVUkhwOWN4M1RHV0QvUm1FaDJlQU52WnNXbUxOK0NOWmpvMjRzK1lvTU1kN0FiNk8reHBvSU14SnFRaG9ZZFE3Y0Nya1NqZXZOMUFTK3BQbE9udlZQK2FQVDA3SzJBY0JycDhuSDJQdU1nZ2g1RjJPa0FwSnJOTStITll2VC9IcGhJWGRVbGFRTUNxeGN0V2dNdVUzR2piZE1mUmJkdVBkTTYwbGRoanhZSm5jc2VPU1UraHlQdTVqaDBoejdMbmlOUEVsV2NyTFBHc1N1eUxBSHlSSVdUQ3I4OFNla2MwazRsR01obDJKQk9OcHRQUmFBYnRpN3ZZRWZvNURqTklTaHhxWHVJVVdNSXJZYkNpUHBZMUpYdXhMTGZYM1JaMEJXdlZ3SnQ3S05YOS9wbElOaHNKWjdNZng1OE52ZFo2eC83ZnlMYlRlNlVpNzMrQzl6OWdabkJqYWg1aFN3cFA1SlpSUHF5TEJhM3JPVmNYYTB5VjRabnBrZUdabWVGb0podUJ2dG4ycWVIaDdkdUhoNmRLMldna0M3aGtCUjZIUUpLNStYclFTSWJqRVJiVGQ0aFAzeklTaGU3Qm04MHM5b1BWa1lHdjUyNTl4ekc2NitMamg5bTNIbnJvSWJGT0ZtR2RmTHQrblpoWlJjWWFhMTRuWG94YlRlVStkdmpRNGJzdTNzMitiU3dUYVA2YjlEdXdQWHdEOE9vWGt0UkpqRHU3QW5nR2lac2Q0R2g0aUFIRHBhZkYra1hzM24xVGRqZjd4bjl5T0tucWQ4bm5WajhvNE1RNEhNT3JITGttbkNEQU9RcDcvK0V2Q1h6ZXYrcWdiK1hYYlYvZ1kzT0FwY2xVSHFVZ29vbmlCQk5tNU52UnBVbnhHblNMUjAvaCsvdTRaMTdDZ2p5WDFtdXk5R20zTzUxSll0bGNKSTZ5Tmk0SWczenBXNXR1VEJ2dkdDaS9wZjZ1dEMxUzBjQzVpeDdEdXNHa3dISHVjZkQ1OE5wNWxYWmNvc1Jhb2NBaXhweTBPckdsMnh0TXpnMWI2ODNLdmwxNVFhUFIxWitSUHlXdkZ6bEVyT0ZhamRyeXJJelVWTEJYWXpJZWZMMiswQjN2NjR0M0c3R09IYXRIeU9lQUpoSUo2ZjdtQ1JMVFV5bEpxWDIzbjlwL3F2cHo4MDVaNkpzUjBJTnlYQS9DNzY4U2QzTkw3Q1N1cGNhYlB0cGRqUG84cmxCN3FDRUhsTmlnN3kvRCtzc0JCRHQ5RlY2MzhBdUN1V3NpV2ZFMEZ6b0lLRTRYR01YekRmRytZcndQZUxEZkJ4cHdQRGlVS3dJZitrUDRlMGp2dDhrYVV4V2UxNG1YR3dBcTRTNUVSaWdhOVNqWlJlSTZJMlVZMjUvQXVwSklCMlpyeXRSY0NidXR3Y1hZZ2lJVDRyVExIVW9IRjlzcWlPMktWSkswT2hHeDZMclZWWWoyOWtiaDYyK1lkUFhxZDN0anNWNzg0djJNcmY0VDBQQkx2Sjg1OHhKYXM0ZW9PSTdoK2FGb3RmcGtMaTdKNlZvTGllZTdya1VETDMycm4vWW42OUNnUDdoNmxVbU5lRVJXZjBiL25uMGVWSlpldkRmRTYyRjh1OFZUQzRMMU1hbVJhNGtacTl4MUU1TVg0dDJaVkhkdnZEZlQ2OE9MWlVEcFZZT3BMT2cycHZhaTVjd3dNRldxdzRYZUZPc0pzV055WW1BZ0dkczIzRDhYUEpSOHpmekE0b2JFeUorWktDNzdnNlhjNUVJeUZTNTI1VVlIZXd2YjVxSkQyN1BsM2RVckRYZ1hWMzlCL3hOME04VDcyS2Z3dmhaK0szZmN2S1hOREhyblo0SXdpbFBFQ1AvdlJqc0l0cHRMOWExcURaYjA5cWJoZVdGWXVWSUF0TFhHeFlwdXBiSDZyZW05djhib3FOTWFIU1Y1K24zeWQreEg5ZkxZa0tNQnd1VW8xeDZJcFR4WThqamxMYjBMRmlyOVByWHhHSGVBODgvc1I3QWk4aVRGSG4zcDB0M05qSHdNaHJqUTkzQmNORElxM25kWnU1WEF4eXMyODBOOE0xL21Tc0tlcFUrWjJ4Z2laU0oycjRGYzllZlVKdkNqSHdEWU9jRHZIOW1qRnA1bVB4WkFnYW0zeFdiSiszSEw0bHpaa0dVb1J3RDNWdkxNR0pob0MxcnNLZDczWjdsVmorL0UxdHVSZVJkSWJBL1E5TTg0UGNZRWxtM0VETTNreFBDczFlMldkRWQ5UVRGdlNucG95LzVqN0VkSUJVNWpnRWtmTkdnOEk2QjJpUDRWU1pZTXdFSCtPNElXSDFxVTFqMWd6UkRNc1FWUlZ5Y0dwSVRSRXkxdE9XQjBaM1FKNzRGcVJPK2xWNGhDZXZRWXBzSlN2SjZrb1FTYVFoUVBZa3cxME93cjlPNi8rKzRkMy9zZXZmTHpxNy82cFlBeEFOOHUxOEhBSmNnWEhBSVNsNXVZTUhqMWVHMllneEFBeE4xMzdOWHdmcGFPYzdrOVRxcWlsb0RUQmlvaFlpU0dpZ0E1VW1DcVVxMU5hM1BnT2JMcUZVbnlEUEZnRDNBOG5QZzJyMll2cmx2aGFkTWNCcUFEUmpaUm5hclRidU5vSVprU0hDM3huUTV3N0twdnM1QVVpTkxWYjZ3TzBhK3haMFNkT0g0SktRNndpOWJYaWROb2lZN1FOOTlTdmUwdnBVZGZlQVduVDNaMWlQWHg5N3k0YVBFK05VSzZ5SUpZclVxS2xsamZIZFZiNzRBM2VQdGJWZ2ZJdDE2a242Qzc1TDdsM0RlbE43NXd1N0J4eVBkcG5QNFpqRHorSXJwNnBVNVVmYUtvNjhYK3ljbnZUdzRNNnZyZ3dDU2ZqODNrcjhtWDZYbStvOXZKZDNCVzE1b1hqSW9kVXhMMU1TZkl2OUczMDdscjZRL2VoRDh4UWErdi9pNmRXK1k0NHpzL2ZTbnYvRkYxdXU0ZDl1QkxlSWZOWHYxVTNUdlNiUy9oSGFueXdwZjVPMGdEV0cxZnBoOEUvcG9HbTc4bEJTUm0xNWhMY2tsbWZkUUoyZzgwZUJUZW1ZRjNyaTEzc08xUGVkc2RMNlV0akJuYjdud3BiV0dzMkhiWHRkdkNIOU9yU1hvSDdKMHVvbjdDS2RHUlFtV1U3Mm5vdGRPeTJlblgzTG5weElVTEp6YmQrWm9yNy94L2QrN2MvUFZMOTM5dDg2NmRQOFozQy9EdVV2MjdHUi9mN3RHTmgrYmxVdTNsbnphK2pEV0JldWsrNEcrTjg2cVJ3aStTQkplTmxXRnNHa3JDamZjWmwraSs2bzlwKzVOUC9vMzB0aU5YRTloL0NXQnN0V0FZYi9LSzFSd2FMQlpyNHdFWWVEZE1pYlpYZi96a2sreVpGMjQrd3Y0ZVlTUlhVL1IyOWdXUUc1UDZwZ1RQbnBPVUltV1NCZ1lnRnNOVTV0RnNJRmpCVWxGcW1vUVpscG5KSlRLWkZGNWNrdEhVUU5EUzNrRUJBc09oREJwQ0xwZXRSVTZBZGhRTWNBK1BOK2VPRnpxam5lNWdJWEIwTVo3MFpvZm01b2F5M21Tbm10aytFSURGRFE4TGNYZk9XOXF3b1hUZ2xvRk5WRkgzMjJ4M0hqNHhPbjFvZXZSRWNhNFN0OW4yS3lyZFBIRHp4QkZYK3hGaEM2VG9RK1o0TUxKUkEzbGVCS3NuU1JVcHdTTnRjRFFLazg2Ym8rRG5KT1pSWEcwOG9PdGtjMWFRREdnOGdWTEpqNW1Od1lCdzdhS0JOSWJEUTkvVTIxN1djT2piWCtwNE50QnArbDZZWXpmYUFqeXVDV3ZhWUhFQWwxQk9qZXNweVVMSWc0dVk1b0twaXBhcjVDckJYRW1yQkxVZ2ZlVjV0b3Vlejk5MmEvNGMzY1hPOWQ1NkczM04xTDMzVHVuVDA1TlRyNzU3KytUMHROakRodURiVzZFdko5NDNiSlMwTUxVYm8zaWZZbHlFd2k4ZEY4WDRNTHVreEt1U1B2M1FRMGNmZkpCK2VQR3puMTJzWHRjSTB5dnVWNll3SlhaMHZjdXlqK2ZCaXZvdmVPQmt0L3Z0eG9WcmJ2T2ZVNHNYU2xibVVNbktISUtlZUY4UFB2alp2ZS9FN3Q2NTk3TkNSOXV3K2pXbXd2eVhZRGNZMUlzOU1QUERpU0RzZ3BMS3cxejV0a0RPbWdVR3dYWUFCVGVhU1hMdnBHWDRWdXBUemlycko1NEZBam51dHF3NTd2RWgvZnFadllQSEM0WDh6bmltRUUyZVhaZ3NGYjNlTTN2N2w0dkYvSTU0dHRDZGdNOUcrcjNlMTRLcWt1cExaVy9EbjczSjNQSzJ2Wkd1blYwaG1vb0Y0MjJweVBieGdlMmRuc0hvOW4zUnJwMmhVTEk3Mk9NVW43bzlnN2VEWGFMa1krR01LOHQvNnc2blhYeDNCQ3VjSFFTYXR4TVBpZUE2d0Z3QVZVTGZPMW5CODJKRDJKaDFDM3plamc3UUR2emVpQy9TNGVud3VEdmgxWGEzTzUxb0E5bVJjQXVMcFpUQTZ3UGQzbkxLbjRMNUVQNmVpZDR6bCs0N1MzY2NPMzM2OUJ2Nis4ZW5wNm5qcnVPbjc3NDZSUjNWNSttNVgvemlGOU9WaVNuRFRxZkg2WThCTDh0UG8xQ2hKbEVpcnZJMS9UUnV5MCtEK3JJa2pUNTEvS2xqRHp3QXJ4K3ZQa0hWcXFGejlkTTR5OU92d3hqSE9MeUNUUU9HQ3ZnWjNsSnRTSzJWdFE2SGpPWFJwTUdHRkhweExZU3g0R25iM2tERUVVM0llK3d6WTc2QjBHSW83SXowS1B5dkl2MUVyOVBlMjJmZmZhRE4xY2QvVzlpUHRLZXJxNnZINlRkWG4zb1ovazBGL1p2ZnJQWXY3dHVIT2d6WTY1L2crbS9aMEtrWnJUZFIzSFY3R1JOcWY2TktEYWIzZGUwM2RkQWZVcVg2SytHakFKajBETURNMG1OY3R6eEc4SUtpS1VPN3JsT2hSUmYrQnJWZnFOcllqV2U5dWt5VjFkdllYN0x0WkR2WlR4TnpUM2t4RGdxalBCZW81TmdLcG5PV0ttQmJxQmorYUVSSndWUFc0cW41d043MFlHbEpRQzNDVmlkVFRWN0JrVHNrNmxpeFU4bm1aRVNSeUExRVVWVmx5VWoxVTlTOVJsOGxnaWNqekhISmZKZThoRmYxOFZadjJlRXRZcGVJZlltcyt5cVdrYWRrMytMT21jbk41VktoTjUwTWh6eWRyamE3UnJiVDdXMVl1RHhabnp5dkNpY2J1dExibWQvWDRGMHZONFJGb25ReGdqU3ovT3dFSXpTT2IxZ005MjlPaFFjOThteE9EVVVITnVkM25CemZ0TEs3V054OTAyUmhNZVV2SEJtYWUrMngwZEhyWHpzN2RlZkI0ZkNnbmswTXV3S2pSd2N5N2xRSFNHQlBXNjRyTno2OHREV3piVGpxN1F4OE1kNXovWFRsK0hSdStNQXJ0bTI5WlUrL3oxc0tCTXJISHBoYmZQM3A4Y0Y5dDIwZDJyY3hFZkQ2QSs4cmxEdmFiVDdIS2E5UFJ6NnJyUDRVK09DTHdHSElyZy9Sa01FTGJVREtQVERiMjJCU2N6Q3ArUVplZ0tlc3hWUHpnYjNwZ2NrTGhmcjVrMlh6V2dDSHc3eXNzUzdwMCtocXNQVXJQRU1VM3lQTnIrbWphNmI3SmJ3bWJoTFl2M2ZYRG4zTDJLaTQvOVRyYnNkaVcxTnNpcGZobEVCM3U4TCtBWFJITDhtUmFiS2J5NHB0UTZCL2JSNW1xcktGYXFxRW16dVlmb3pmdTZISy9IeGFrekQrRDlhcnRHVFVuNUZBcEtVemVmaVh0bW5kUW1xdUNhZXRaNjh0OEhkVEtHc2R6NVhLMTkrM2MrZDkxNWZObit4Vi9Rc3JtemF1N083djM3MnljZFBLUW45MUxEcTRMWk9mRFE5NSs3c0tHemNXUXdYZllHUkhQck50TUVxUHoxMCtPVDUrOHFINStZZnc1K1U1L2JiOVEwUDdiOU9ObjF0ejB5T3hSR3dzRU5nMlBMek5IeGlMOWNSR3VQNGhreklkcFgvRXZzSGpoZnZKR1BrWVV1V1RNTzEyYWppN3kyMllqOEJzeXUxNGFBR2JPdERHUlcxMkdhTmVNRTlXUGU4VXB4aE9mb3JoNEtjWUVYMU12S2ZpWFF3djQ4VWxQVGM0ME5QajkxRXlNalF3TmpqVzA5L1RYeXowOWFZUzRqSkxwNTE0cWJmZE9wdHBYTFAxSnlPNXNuSE9HVXpsVXY0S3FESDg0Yzk3ZDVTN3U4czdlczJmMnc0ZDJyYnQ0RUc2RU8xeHQvY1ZNNUh1N3Bpcm81Mk9pdkJuTXd5NjB0TjdiTWVPWThkMnpCemY4VXhQcERPbTdaNmFldmQ0aDh2VklmU2dQdm9rTzg5MU9TOHA2VU9nTXpLWktYUWVhMzhvN0dIMGNpZ0tPWVEvQ2M5bkl3cjM3ZmpjR1AvY1hhQjR3WjBiVmNrZzJPYWdjcVhLS1RxOVkyNTJwc0tPSHFOajFYLzZ6Nk1ianJKbjN2ZSs2Zy8vNG8vLzZPczBXUHJlOTRDMmZjRFhId08rSHNZN0NiSVpwdGxkYmJDMU15eXE2c1FBVnZXOGd2VTgwY3R5bnRqdC9FUzhkcDFIVEZvWUhPZ3Y5dVdUN29EYmswbTZ2VzJnQW5wOVBqd1hhZGlzUVNITWpwWkhSeXZ3eTFpZGRxWkJROVgzZmZwYzhETytHM2FWam5UdjZyOTM3bzdmN1ZvK1NPbkI1ZkNUZDh6ZDJ6OFhQMXphZFlPL0d2d3hwY2Z0YnR2a3d0SGh3c2JKclc5NTFhVE5iYmQ3YlBxZGI5RW5OL1VQSGQydDJ6eDhkMDJ1ZnBKMXNKK1JGQ21BYnZrT2Z0a0JDMUNGRHZSbkl1R2czYWJJRHBBUXdLZCtYbk1GYS9ZeCtUUVBxZUxLbGtUTllDMHM4UnFGUHhWWklmS2xOUzN4ZUQ1Wjl4aWVIaUlZNDA4VnZMK0VGN0poOHA0bGZxdDJMZ3NZcGVMdW1CdHZyUTZXalRMTFpVTnpCWlU1d0FtVDh4c2FxMThLbG9XV212Tnp2Ylc2OGZiQlV2NWdZWEoyOXVLcGliRnpoYUgwZkc1eXoreWRweGY4SXh2emIvT1hOdVhtVHNqWjVIWFJwUEpuYnQrQnlmMW5sSVZGSmRlelA5eWpmc1lkV0p6Y2Y0TjJndjY3K3BRMG1Jbm5IbE0vSlk5azRoa2VTL2xHK2xOMmdYUmovUnE5bUVyR3dsMEJySEhxcEcyRzR0ZW95c0N2M2FRN2lucU1VaGJscit1RzREYkNBL3dTWU85V1Zkbyt1RzlUTXJseDM5QjQ2VWhpSmxDT2RaZTlVL0dsa1E5c0hoN2FjdnVOU25IcVNHbmt5UGFpY3ZOTmNpRzlxeXNtVi85TWlnYW4wdjNLRGZUbWlldGN0T0k2aUpjYnJmNHZkaHUzR1FITFVKQ0JUSjB2OUdWbFNTRzdnRk1WYWgwM0NJdkI3YzFrM0JGK1dXZVdxNHZvRlVlR3JMZDAwVkNFZFlQV2JqREFFYzk5ZDNCTDRMcndUTC9MTG50TzdkZGMzb25yTngyN3UrdDA1OVRvek9aTzV4OSsyS20xZVQ0d3VObC9JSHZiUXJpdHV6ZzJQS280TTZIVEM3bHR0eXdVcno4VW45aHc0c0NXaGNuTUpuL2VHYzZYcGdaOHFGR3FzT0EvQkdzOWlCV0hiTHcycW9LSGhGaDU3d0xZOFE0UWRNUjJYdWFGTmdtM3M0TEFERzZQRy85M2Q2S1ZWZUVtbHJoK0V0RFcvTWFhditPREg3enZYeC81eXRjZS9OZjdmcDkrNkVOM2ZmQ2IyN2JTODlVL3BYcjFuVnVadnZVdGJ4SHlCcDJQN3djY0lpQzdkK2t6N1haRzJ4eU1PTUhXd3hBVDMrNE9mZ0hjc3Fid2NxS2RMdVowK3AxZzc4VzdZMUdzTFNReVlYMDEyOCtOdGgrdWJ2NVYwdmdYWUlaZnFVcEs4OEtEVFRPSDdpamU5dWpNNlpuM3pwekMzMjk5Qkg3QzcrOHR2dmVyK3kvdC95cjhFejlvOXlXT1oybjFlWFlyMzNmanhpbWQ0UU93anIweFlnVWxmcjJFVnh2dTJWMHIzZWxlL1lhNTNyNjVHeWJ4WisvY0RmcmVFeWYyd3BlamZQemh4VDBQSHkvRHp6Mkw4UFBrRzE5OTE1dmUvS3E3MzJUNG5kdTVQWlRRdXhWWmtrekhzNi9tZUVaemlEdWVzZlpodVVMYmI3NzNkOWt6VjZmWTdOakpIWGpPRElOeXNjK1RFSjd4dFRueHlOdTY5Tk53YmpSZStoa2lvVUFtWjF6NjJYaElKZUp3TXY0U1hqK3pxekswZjJUTHhEM2J6dDFmSFA4dTNidUhGdk1iRThXTitZRzVjdm5HQXlNSE4vNHpPeTdzc0FUUXRCZG9Xa1QraTNjelNlNERKclRic0tMd3ZISG9mTjRzMVJDdHIwcWRTU2ZTbVRUM0h2bHFUaFhqMUxsY0dsbDdoZ1ltTit2TlRaK1kyUDI2d2RtK0F4dTJYemN6ZG1oaFpQUDh4T2lld3V6d2d6dEhEMCttNXpmdE9QVG54Zm14ZUdWa3VwRGFXaHJZZUhSaWFGRFBERXlYTjNTUDd1eWJPTlRaZnNnNDA0RnZ1RTg2aUF0djYzWEIzbVRIaFlOM3BrdDhsN29nK0pjWU5VUGJuRmcxVkxnL3dqQXRZcDJBQ1NjbDNNeDE1TWpOMWQrZ0t6K0ZFVDlUM1hQOEl4OVpvcCtxN3FHYmlQQzFYV0VKNktzSHE1WW9WR0U5UHRCRkZEYnY1VkdKWnNsV3c5enpXV1hHWVZOTVo3SXBjVCt3RjkyMDJwaFpsYnVSWmtDcWJaMzBROVZQMkZNN2N4ZnV6MDJmMmpqem10SzIvc09sYmZzUGJrdHR6OUI5OUlialgvVzQ3MXd1SDlxU0docWN5NmZtTjAvTWVyeElpNUhWbjdGWmtJTTlNSk03OVdrWFpiUWRCcEwyTVFYdnBaWTBLaXNZTGxtTDhjS1M2S3BZTXNrRVR6b3JKb3VoZ0tjVGxrMFA3YkUxWFU5dDdOQzF1aGdTajVVVXlOTUQrbzI3K3dhdit6K3RYWDFzVzlVVmYvZjYrZm05eEluejdQamoyYzkySE1leEhkdHhHOGVmK1hMelZaS21TVlB5UWRJMlRkcnkwYTRNMm02RFNSUHJZSlJ0SUZFRUc2T2d0YXFnMWY2Q0Fwc21qVW1qWTB5VEVOSUFDVFMwVFdLVEpvUzBzcitRZ0xvNzU3N25qeVJ1eTdSRnN1UEU3OTUzN3Jubm5IZnV2Yjl6enJjbmVtNFA5dnRHT3RlK1RrSzNaMU1MZzhIUXRqMkZucVcycG4zREE3dG5wWjdsQjNiTVAzWWcyNmJPT3V4UFByUTEzWmFmU2ZiTURRVEpIZkhJN01HcGZGN0hDYlhCb0tKTXYwTEZkaU5adDErMnZ2YXd0dU9RSWdFc2dudVVqSlh1b1ZMcGQzVFAydTZyUDlId2IybVl1d0dRY1Q5WXVpeG05M0dKNEVlUktkeGUxRFB0bGkySlNNcGx1NEV0aVhpZ2pTQWFQNXZJaGtOdHNVQk10bkIrNHBjcXJNbFVzcW1WQlp4eHBzYTYyR290VFQ2L090WTVQNXpmM2pHMDJOTUR3cjQ5Tnp3ZkhsM05aM2JzeUdSM1RHV0tDd3ZGYlFzTGpiN01WTHgvUmJiTnBhUGpLYTgzTlI1Tno5bmtsWDdRQ3g4NU45amRQVFRVM1QxWSt2VjRLalU2eXFMVE9GYXY4RE02VnBVQm1IdmVpSEdvVFlnVnd5Qkp6a0I1dytIS3pLdVZSRVlzVDJSOUdTQTFpMWhOV0xQVkZhNk5ZZnYwMFFXL21nelFONjhyQktVelZTR0FOYWxLbHNna3ZReHIwZ2RnNmxkcWJYNnV4dWJudWMzSURLbGNZODBCN2M3UjE2Q1A3N0krd0Zwam10cXl0ZTVGYTUzbXBnbW1SREpaRFZJNUw3aVZyQkNGdms0d01BM2JnUitPVWZabXpLQ2x4YlRxUmpwWE5kSnB3elE3NTFJY29ZaFIwdUlNN0RDR0NCdkQ5MWcvUThWK0g2aWlseGo0TU15S0NGT0RjYXpHcVFyQVI3ZTF1WXF0emV1Mk5paElHbVpXQWRvbTJKZ2VaSDJDNTlNTXoydWViREI4dlVoYW1nSlJXbzVsc0h0V2s2VGxVWEdSMjBpSTlmRVE2d09zdndCV3pXL0RZQVlyaTliWWFOUjZLMFl0ajBhdEl5aGJHVVdNWHg3b0w4UDQ5WDNXMzQ3aUxRMWdneHBoU0RMaERWNVlIZk9ielZDdWFvYnlHR2hQU1RuUW5oWHZVNmdpU2dHZGp5c2t5dWg5bVBVUFZrRllaeFY2bVZWZ284V3BsSzI4Vk03cDV3WGFrbXdPVHJHMllBRnNwdm9XSUZkakFmSllETVd0VUtJVlJOSEFOczFtNHFJdXFTSmZMcGpmRk92N2tmSzR2VEJHR1RnSXExSE1xVUg1T3FxWHE2aGVubHgvM0RBRDZyVXZ5Q1E1eERCL05mSWZyNUgvQkRlOUNlc24xbFRzM0lEemUyVmtibTRFWDZIdTdsQW9rVEFlM0QxNzhPRHM3b09EUTdsTXNaakpEYUg5eFhQYmN6Q2VUZjVOQkRVbVd2VnZSSzIyR1BnMzU3YVA3R09idkhaMU1Nd3dCdkNta0lQZ3RvRDI0S3Foa1dndVRsVjc0bFh0aWRhNk9DSzZPTmw2TGs3SzdudmNaZ2tvOWk0MTRoMEo1Y1k4NnNHenZhZGsxZEtxV3BXazI5OFhWeE9ldmYxd2Z6dndMZ0s4aTZEVzRheW9NQ3VkN0h4TXcrRnQxcnA0UmVzU3V0YTFDNkphYzdwd1BRZEhQMUlna2VtQjhMZ25xaVFVWDJmQUcvSzVBd0czTTZMRTNOczdjaE5oZjBmc1FLS2dPSHRzVmplc2kzT0t3K2FXVzdlNDFGeGM3WkpNVWMyT0s4Q2NDZUE5K2pXZzIwMVNIZDJPSU9PaUc1d2FFWnlhc3ZPZnpwckFTZlIzZFkzLzloZDMzMDlXM3N2UHpoYmVmZTh4NEl2cjJ1Y2tCUDM3VU92UmwvRlowWmVSNjJwOXBLTDFDVjNyWmVSSU5vdStQSXk4VGk0eTVJbjQ5NS96TFFFNVA3WnJLRGpnYTFlN0hQNXd5QyszdFZ6NFZXSFJKSksrTGIzRFZsdEdocGxVL0tLb1k3ZytKeGttTHgyb1J4cjQzMEJid0g2bzllMUh2R28vWUw3Y0N1SEtrRGdXTys4aUxyRldFOHE3WnVVSkM5ZTRNSytPenEvczlQUTRBdGJPbHU2dGNrcE5EVS8yT3pvdHBwanE3Z2dKYTlOemQxZ3NPYk41VzUvZGxlL3VHYmxvYlFtRS9VNm5qbzNHYytvbzA1ZE4va3FFV2Fab2piOGlncjlpQThmVGJoaDQ3ZzNTK2xQU05wZ3V2YTlqOVQ4blNaQlpKNndPa21pcHJFSjlTeFd2c1ZSTVZoVVg0V0xSam1RbzZmZTZna3F3Q1V3R2NVcVY4YTlEN0RzMldnVm56ZWVML2RQUmdCcWNTS2NuZ21vZ090WHZETFM1bEVCQVFVQ3l0N05UeUNkOENVbnFVcU81ZkFUa1ZvSS84Kzk2V2xzOStIcEdkVGk4WG9kRFpYUHFBaDFNd1hqME9WVmgvbHBBemhwd2tYRWQyeGl2Mk1ZRXVlNmMybm8yeUYwWmQrcXNjVW5PM0hCT3lhRWJUaXJvQ2J4OXRoSDNZaS9qWGxKQmt2cmFyZVRST2ZvYStoa3cyTWZnMms3eVRiaW9rL3hBd2RPYWsrUUUvTFdQN1JEdk5nbEdneEVNSWc5akVIaHd6QVIreWlEaVNRMHJrV1BrZVBCTWpuQUNwY0lpSndoMHYyU0NqM1NtcVluU3BsQVRxSjdYNDJqRjhsMVVwS0t0d2RUT2RpNTFQd2Z1ZjJ6VC9SOWthTERuMlAyYjhQNGNjVHNvTHlJQUdTTm9FbzFFNUhoTzVFOEtoQnFOOUppaEFlbkIxSkFTbnJmemkxZ3IwTGpLMGp2djhoVGo2NjZucDI1NCtWTFJoNlFycmlaNEx0bGJiVlk4QXErUWI5Ykp4MmM3MFA0MnZReFUzNmZSZnA5R096N3BHYzVldzVWNi9IQVBId2hQUkJjZUVkeXgvaHdWT1dIS3c3NDFYZWRiUFY2b3Y1bnRYWm01a3cxRWtDVGhHRXNhYlRCcXRXdkw2R29ZeldIY1hwYkVSZmdsU3F1TlJCS2xYUjZOaUw1MWZRaW4vcXN1aXNPY0NUaGo0azl1NklYNzZwMWdxRkV5MlZkSTVwUDViQWFyaFZsbGw3WVd0NWk2TklsQTMvbmFGL1JqeHROdmFEeTlIM242QURtTDRxSnR5TWNhc2ZBekIwK1h3M3FNN1JGbVhJeHNGd1B2eWErWk1XT0xuVVU1aDIvU1JOM2NoQjNjMUdtaXA5VFcxMXdibWhWVE4yM0I2c0pnTTJFTks5clk4ZHhtcVJpT2RmbDlsbVlEM1pyc1NzZlNHdmpWcTNyY1d0b21EZXpVckdPdWdULzhMZXY1dzRVMS9pQ2ZhQWwraHpVK2JiVVEycXpSMDBoTVRXUWpwMnhtOElKZ0JOYUdGb0d2NWRhTkc2cjFHeUxQMG5VYnJ1ZEJuY2FZL3VtbTdSanZ0TVlDTmpaVStKY2RHYzVteWp5YzJENjhjMlRuUUY5bVczYmJqZmpaeXNCamhCdmtIaUVmMFdId1V6c3gwcDF5Qmp5Zk1MSjl6RHQxZkpPQlk4Y1VjZ3ZiTkFwV2NTR2tmL0hpeGNVTEZ4NTVlZm5GRjVlWjdSMEV4L2dqOGlUR2E5M29IRjV3eGxpTTBVZWx2ZVRKNVdYTmZ4cThkZzFvMlFlMFdMQjZWUzBkSEdjeWNIZUt4R1JpVlM1ZzVHYXoyV0syV0RYQ3NCQlpMV0UyN0ZzbjdrSnA3MjllV0RwL2ZxbjAyYkpHNHc3dUtmSStMY0I5aEZjYWVNU2ZNZXdPQW5kTTRaUHAwNmN6cDArblR6K1JQZjNqM0preitUUFBaTTg4bXo4RE5BeHl1NEcrN3pENlBKanBDbUc3UUIvSU95d0dOWHdUdUR2c2FKcGZnOGU4a1orVlc4eGdNWnoyRm8vc1FZS2JtelJQSC9jaWFpTjZUT0JWMU1MM1NZc2VML0V2OHZ3NytrZHlKZXIxZG5WNXZkRmZMaS8vczBzRGJIZHB6NUZCN2tQZys4ZWdFWTl6NTRHc3g3a0Zia2FybVZORjcxZWdQeXpaRjN6U3RnbTE3eGY1V3Nod2ZlQUJ5c3Rkd0lPOW5JMDd2dU9sUmhhWUNZc00vdDRHSW5HY2RNeUltQi9zOUM2VDFxbUpkU295cURBR1p2SUcvbUc4VmpwMXcwdFpQb1gxc0NUQkQ4NXJ6ZGEwdmkwOU9ybnJSNFUzcms3T1QrNSt0UEQ3MHVSZEo1YjNMSjA0c2JSbitRVFM2K0dteUF2MEtPYVdmd1Y4OEo1WWlCQW5qTzFJNlJLWktaU3VFbjZLdEpDV2tiZmUwdnpCZWJqK2I3WFgyd2dKaDBLbnlVenBVb0VZU2wvU282VlBTNS9xMTFNdVRaNEhBWC96ZjR6dHNsMW56ZmVIZ2ZuNWdmNjV1ZjcyUkhlZ1Baa2t6eS8yRitibkMvMkxRNm4ydG1TeUxkaURzUWhjTDMyS25tZWVKL2hxTnJsUjRnMmN1MVdrUERXQTh3RVRDRXMzYXdQbEpsVkNKc29SaDZ5cUVWM2k5U1Q3RkErMU5VYzA0RThZTWFRa3JNZE5nM0pveDMxNktWRUJGVVVQNmF1aDlsQnVSZkY0bEpYOC9zQ3VXSHdtc0pyZHI2Z2UxMHB1TlRBVGo4OEdmamE4ZCsvdzhMNjk2ZHhLWURiUnZTdXdtbDl6dWQydTFleHFZTFliTHRpZlgzVzVQYzdrZ2JIeEF3Zkd4dzdBMkJDVC9BSHo1VXdzTXFleWwxaFpmeXFHNmZVbG5vSnlDb3YzZlhBRWZvaVhuUDN5T0RsYlFpQlNoa040SlZiaWRSWmJjZlpnVHU3VU1ncUREY0Y2MmJhQURPNTlocnh6ZCtsWk1sVjY5Uk1OMjZwaGpCbStscnNKdHJWNGJRdTF3b1RidVI4V0czR0h5R3JHZE9IZ3R5bVkxZ1JUVXV2NUhOZjB0Snc4cjFTZVBHcjUrM0ppeGtvK2NieW1HR1Jmc3lKUnRWK3ovN0tpWFhEVmtsYTgxODdac1VaakVQR0N0bXJxVFQwZFo5Z2VsQzhOWnpzSGJNZVBlNmNTU3NKMmpOTFNuM0lqQVM4NWVyVzBSZldaRy85QzMxa1hDOUxHcE51K01maWpHa3E3THZ5alh2eEh1WWU2M05OOXl2OUh6TWdmNlFMM0NiMkh5WXkxYUJHdzBobWFtRy9aOURBVkRFVE1wdjdSMkNBNjRVVVhGQVdYN2h6d2pYYkRXRVhPVTNUcFZiRk1lbFBvV09SRUtqaGlLZGtVSnNRVWxqOStlcFRJeERMNk5BMjlYaUM3U3BmNkxsLzlzeGJUOWpaTmdzeXU3MmRpUXo5RXpqb0p5VHBsTXZmMGFPbEs2ZC9RMFd0WFAzeTlVSHFKelBSZHBwMGIxakl5cXpHbWhUNEQwNFYxS3huMlhPV3UzV1A0cTJFblBudTVHRllhYW00eUVNejBpWkVJa3pVRjBzQUluOEp5bTNTUjA4c3ZVc05zb0UzYksxZENVVUZRWWthSkdpdjdPTTdxUG80Z09GT2RtYXlwREdMQlU0UXJKWmxjZ2ZkNzA5SEQwMk4zMnc4MHBnTytzTTBXQ2JvTXR4UFpjUnMrcWRSbzlBbDJsZHpRMGRjMWNPdDRQdVJ0OXpyTTdpYWZwOUNyQml4SDJVTU9Ya2hwOWNmME1qMUV4MVpIdC80SEVSNVRHQUFBQUFFQUFBQUJBTVNnWitpb1h3ODg5UUFQQStnQUFBQUEyTkR6dEFBQUFBRFkwVmFlLzdMKzRBUklBL01BQUFBR0FBSUFBQUFBQUFCNDJtTmdaR0JnL3ZYdlBBTURTOHIvVGY5M3NIZ3dBRVdRQWVNeUFMR1pCNUFBQUFCNDJvMlVYVWlUWVJUSC8rZThKWm5STUpvcDZiSlZKczJwbUpuT1hGKzI5WUd6d0ZYVVJWaFpYWVFSVVVrVWtSQWtSbGZkRldGZFZCWkJSSUY5Z0VRUUZhaEZYVmlFbFVRWDBVMkk0RUJZLytkMXMzZWp3SXZmenZOeG5uUE84My9PWGxXc3dqZkFpVDVHaHZhZ1NkOWp1ZjZnUFVkT29jbnljdjRUamVKR1JOdVFvMWU1ZnBUcjNOTVlyUStWZWl0aHU3aDJCcmw2Rm5uNkVTRVQwN3FOSmZvTU0vVSs0N2Rnb1ozSGdmVW9kVDZKcVNNZDFtVlpqSDh1VWQvL2lFMVk0MnZxVHlFVHN4TDMyU2p1K0JENVJMNXp2cG0yMStwRWhEYkcrV0xhQWNlZEcvVEl4TjF0TGpCT0xKRXI5bGNMSjlOOHpKZTJOcWxURXFOWE9rWS9KOVRYMW5NS0dMMmQyTG83TVcrUXBBaCszY2R6V1NqVHZhUU9aWElGSG0zbU9JUVF4bEdOOGZnUExiREhJZXN3ZmJtdTI3bHZ6dkdNZENBa1g1QW4xN0NBZSt2Vmd5ejlobm1hUTMzeWtDbkRXR3JuY1dDMW96Ujl6Y2JVa2M0UXF2VVF5a3grdTVhNmlUci9pNm5QMkcya09ZMmJxTmNJc2pVVWY4TjR0WXozanZTUlFZelpkMzBnbzdiOXhYMDM3UXV6Yis2ZjBLQldqaU5LV3lBbkVCVWZ4TTdueEdqandIcVZPazlpNjlhQkN1S3g5VXVIZWpxaDFpRmIzNmxnOUhmQ2QzQmkzbVNTdTh6L0dZWE1VV2ozd0ZRSXMzZlN1Y3krTVhTalFHZWltWFNSSmhJbXg4aE9XWWFvcmtJYng1ZTBFRHZNdnB6R1pabU5SUnhmTjJBVWxjUmwyekhNNFB1YitRcFN4WDZZVDBvNExpWVY4aERGcElMZkw1ZmM0Sm1mbUNQM3lCMHNJYVZxK3Y4V1N1VjN2Ri9HVUNScjBTb0hFWllZWUgzZ2QrOGxPVU04WkJSMTBvOGE5Wk9ucUxHNlVmT3ZOZXEwZ2Zqa1BPckpjcmtKTDZtVVFRVGtPY29OdWhvQjlsb0plN3BTby9ETDIzZ2NNZWJ0UnRqS3dFckxSZWJ5N0crc1lIM0xkSmdFNE5Wc2FudWFkMzdDLzJrZmZIcURQdHQ1aHdEMTJVT05PMUdzamZRN2hRcmR4UGM2eXZNbkdmOEE4dEdESFBIejd1dmhsdDNzbnlCeUpZTDVVczE1QS9zMXdua0wvWjdTcjV4KzlWemZsZkRibXVxbmEwa1h2M3Z0NUN2YzFuVGtUOXVQZkw1WmNCSXZ0aVJzVUJjZ0tDT01NY0wveEVYVzFJc1NDYUZWZzZpU0FXb1h4WnJrbXlYZTdUVTFtazFjdWc2NVZCL1drUG45QXlkMFB0Y0FBQUFBQUFBYUFCb0FHZ0FhQUJvQVNnQ2NBT2dCS0FGV0FZQUIwZ0grQWhnQ1JnSnlBcEFDdWdMaUF5d0RaZ1BHQkFnRVhBUitCS3dFMEFUOEJTWUZUZ1Y4QmFZRjFnWUdCamdHZkFhcUJ0WUhRQWQyQjZ3SDJnZ09DTUlJOWdra0NWWUpwZ25TQ2dRS09BcHNDcUFLemdyOEN5b0xhZ3ZZRENnTVdneU1ETkFNL2cxQURYQU5rZzI0RGVBT0NBNHFEazRPaEE2bUR2WVBKQTlPRDRZUHFnL3dFQ1lRVEJCOEVKNFF4aEQ0RVNRUlNCRnlFWndSeUJJcUVsQVNkQkthRXlvVFdCT0lFNzRVQmhRdUZGd1ZGQlZDRllBVnJoWGFGa2dXZ0JhOEZ0NFhCaGN1RjFnWGZCZWVGOElZSmhoVUdJQVlwaGpTR1BvWkpCbE1HWG9acUJuUUdmd2FMaHBjR3VnYlhodW9IQjRjYmh6QUhTd2RaaDJhSGVZZUVCNG1Ib3dlMWg4WUgyNGZ3aUFLSUY0Z25DRG1JUW9oTmlGaUlab2h5Q0pPSXI0ak1pT2tKSEFrK2lWa0pqb21zQ2RNSjVRbnlpaFdLSXdvdmlrdUtiZ3AwaW9BS2tvcWZpcTBLdW9ySUN0U0s2QXIwaXc0TE1RdEtpMXFMYTR1Smk1bUx2WXZQaStxTDl3d0FqQXNNRll3ZGpDc01PWXhDakY0TWJveDVqSWdNa2d5Z0RLc010UXk5RE1hTTNRendEUUFOR28wcURUVU5RUTFNalhZTmhnMldEYUNOeEEzWGplMk9BQTRWRGlVT01RNVZqbUdPY0k2RGpwWU91QTdJanVPTytnOExqeDZQTVk5SkQxK1BjSStWajZtUHhBL1NqOTJQN0kvM0VBWVFFWkFkRUN5UVBaQktFRldRZUpDSUVKc1F0NURUa09zUkE1RWJrVGlSVHhGN2taU1J0aEhoRWZNU0JaSTBFa1dTWXBKeUVwS1NtaEtna3FvU3V4TERrdENTMnhMckV2d1RCWk1QRXhnVElSTTNrMFdUVHBOVkUxNFRaaE53azMyVGpwT2xrOEVUeWhQU2s5NFQ2QlB0ay9TVC94UU5sQllVSGhRbkZETVVPaFJBRkVhVVVCUlFGRkFVVUJSUUZGQVVWcFJkRkdPVWFoUndsSGNVZkpTQ0ZJZVVqUlNVbEp3VXBKU3RGTWNVNFJUdWxQa1ZCeFVubFRxVlJKVlhGVjhWYVpWMWxiYVYzQlgrbGlnV054WlNGbmlXalphbGxyWVd5eGJjbHVVVzlaY05GeHFYTHBkSWwxSVhieGVKRjVHWG1KZWhsNndYdEplK2w4cVgwaGZkbCttWCtKZ0JHQkVZS0JnMEdFY1lYcGhubUlHWW1SaWVtSzZZeGhqd21SU1pQcGxJbVZBWlhSbGtHWGVaaEptYW1hQ1pwcG0zR2RLWjNCbmpHZWlhQXBvS0doQ2FHUm9nR2lrYU1wbzRHamdhVVpwVVFBQkFBQUJwd0JjQUFRQVp3QUpBQUlBS0FCVUFJMEFBQUNNRGhVQUJRQUNlTnJ0bEUxckUxRVVoczhrYWZwaExTMGlpblJ4Y0NFcU9rbHRGN1lWb1ZTS1ltcGlHd1Ezd2pTWlRLNmRaSWFabTZiOUE2NEV1M2Jod3A5US9Ba3VYQXR1WGZzSEJKZSs5ODZKL2ZScklTaVlZV2FlZSs1NzMzdk9QVW1JaUoxbjVGRDJlWXc3WTRmT1lKUnhqb1lwRk03VE5LWENCV2hlQ0EvUlJYb3RYS1FwZWlzOERKY1B3aU0wNmJqQ28rRGJ3bU8wNnp3UVBrWG5uSS9DNDNUVytTeDhtblp6WThJVGRDSDNFcGs0aFZHTTluSnZoQjI2bEc4SjUyZ2kvMXc0VHpmekEzMEJtdmZDUTNRbi8wVzRTQmNMdDRTSGFhL3dSSGlFZUdoU2VCUmNGaDV6ZUtnbWZJcmNZaXc4VGxlTHI0UlBPMXg4Snp4QmM4T2ZoQ2ZwL01pMDhCU05qOHd0Ui9GT29vSzI1aHZsbVhtdXQzMWU4NXQ4MTlOY1M2S25ma1B6VWsrM295VGx5MjJ0NDNTaFZBcVVidmMyM0ViVUtVRUxhYlhWVWczbGhUSmNpYnI2eXNDbDdtOXJYdldicXRkWjg0TmU2Q1V6YnJrOHU3aTZmTCt5bU9tTjVQcEFjbXpWSXo5SlZkVGxiQm1mNkh2RTVZOFZWZk83MmdzU3I4TWxOZ1VjSGRmYkttV2o1UFdvcGZ0ZTRqTUNvV3I0M1JRSjlMcE5QMkdOZE5idlZiZ2ErOTFNWE1rRTEzaS8xaG1Yclptc05UYmVscWRDYnlQMHVZOWMyZU9WcFlmczZRVTJKYUNDdEpHb1dLZHVxa0kzU29KU2RhVWlNLzErMyswME5rTzlFL3VtUWduSGcreHQxWDlwN2lmTTBESkZGTk1PSmFRb29EWnBZcnBCWlpxaGVWQWRFUi92TlR5YmVOOGx6eXBxMEVmMEZOR0dIUzlSRCs4MllnbitWNWd1V3ljTjU1UVdxSVFyZ0w5UjlHaURYS3lLcUlObzVwdTVWcW1GUzJGT1lSd2VtVjNCaWk3ZVY0N2xVc2Q0MjlLcW5WSFlvMk5WQVNpRUtrRTFMbW9xMHl3dFFyVk05NmtDT3VnL2NMbCt6T1huZXowQ203cVZ6WkVQN2NhL2tlK1BjL24zT2xWRDFKQUh6d1RQRHZZcjJicXpEdnhzM3RTa2JKWURUNloxVUF2VXQzMDFGV2VLME9aai9GSTVnUjY0YVR2RHRoN2ZycjRIWDBZRnNkVWVkSzRjY3JpR3lFbDlOVGNmeU96d3ZvTnNQTnJDcmV5M2J3TlBNOU9YY3pXelp0OGxlbWhaNDl6NVd4ZXlIcVR3TkgyT0VVdXhZMnE5WE51MUFQTlZySzhjV2RPM2w0dFRiTkFtMUJyZkZWUGxvSWVIMWZHeHM5L3Y5Zjl6LzUxei83VTEzL3NYT1BBTC93cHRXLzhwQUFCNDJtMVNDWFFUVlJTOXQ0UUpKQVVLS0lJYnlPcEdiWkkyVGQyZ1N3cUYwa3BMS0NDaTA4azBHWnJPbE1ta3BiaUFBZ3FDb3FLNGdpRHVDd0x1b09DK3I4ZDkzL1c0N3g3MUhKZGs1cHNFY2M2WmMvLzcvNy83M3Z2M29nRDI5M2NJVWZ6UHh4dlNmd0Y3b1JkZEdJMHhHSXR4T0JTSDRYQWNnU014SHNVNENpWHd3WThBU2xHR0lNb1JRZ1dPeGpFNEZzZmhLZmJHRTJqRkJiaU5FdDFRc0FWLzRtOUUyWWQ5NmFFWEtndlpEMC9pYWZiSE14ekFJZzdFRi9pTmd6aVkrM0JmRHNHejNBL1A0WG44Z1JjNGxNTzRQdy9nZ1R5SUIzTTRSL0FRZk1TUkhNWFJhTU9MSElPWEVNTld2TXl4SEljTGNUc1A1V0U4bkVmZ0V4N0o4U3ptVVN5aGozNThnMWNZd0t1STR6V1dzb3hCbGpQRUNoN05ZM2dzdnVKeDJNbmpPUUdmY1NKcUVFWXRKbUV5NmpBRlUxR1BhV2hBSTA3QWREU2hHVE1Rd1V5MFlCWm1ZdzVPeEZ5Y0JJMlZhRWNDR3pHZlZheUdqZzc4UmNCZ0RjT3NKZkU2SjZHVGsxa0hFMGxPd1FKT1pUMm40VXY4emdZMjhnU3M1SFEyd1dJenV0RE5HVWd4d3BsczRTek81aHlleUxrOGlmTjRNajdtS1pUWmlvWG9vWUpUY1JxMllSR2pWTEVKcDdPTk1jYXA0VlBPWnpzVDdLQk9nNTM0Rm1kd0FaYmdUQ3lteVNRdHB0akZiaTVrRHhmaGE1NktIVHlOcCtOem5vSDEyTURGWE1JemVSYVhjaG1YODJ5ZXd4VmN5WE81aXF0NUhzL0hnM2dJZlZHTjgvQUczc1JiZUJ2djRIeThpL2Z4SWRmd0FyeUhEekFRQTNBUURzWXRjR0V6UnVJYTNJMTdjQ2Z1d3FONGpCZnlJdXpDYnR5RW16RUlFM0F5enVGYVhzeEx1STZYNGhFVVlUdnU0R1c4bkZmd1NsN0Y5ZkNpRU1kakl1YmhGUFREV1hnWVoyTUZLaUdqQ2g3MHhpaHV3Q3FjaTlXOEdtNHN3M0tzZzRUQjJBZjdZZ2oydzFBTXcvNDRBQWR5STM3QWovaUptM2dOTi9OYVhzZnJlUU52NUUyOG1iZndWdDdHTGJ5ZFczRS9mc1l2K0JWOThEajY0enVzeGZlNEZ5T3dCc054Q0paeUc3ZnpEdDdKdTNnMzcrRzl2STg3dUpQMzh3SHU0bTVYUTZTK3ZxQzZ5YTIzSmp0bFJaVXFXMDIxUzNWWGRzaUthZWp1U2lObTZHcTd0MXJSVENYVjBaWlFGM3FxbzRZbEs0cXFXMUtOSXFkdnBjRTBaRXNLMjdsUzJONzBoTFBYM0dHSHJWZFlqN25EZ25GU2p0R2QwclVTbjkvdm1aUk5jVTF1bFUzdjVOd2RxYzRtTDZpYjRxNFR2ZFU1VEZLZHBTV2lxbmZLZndrRFFhbGVWbEtXS3RYYkhZbmRLbGQ5dW96VTRCdzE1QjJWbGttTmRwVitqZkdVSHBQTlZFZENUbG51UnFlZzFPU2tOT1dsbEFXbFpudFhoR0Z2ODMvYThQdENyaG5wWWFRWmVXbEJ2emlybENKT3hjZ2VGU05peElnell1K0lxZWt4S1dJUEtyWFlCZnUyUkRYVlZKTmFVbXFKbVhLWDZtM0pWZmJPem51NTJmYXhOTWRPODh6SnFTYzdXc3VpbUN5VVVmSzBWbkszbzduKy9ZRnlTWFhFVmgyeDFaellxaEJiVFl1dENzcllYbUlIUExHYzJQR00yUEc4bGpXYjNLTmxyeFJvODkyYTZGTVR1bXVPN3ZQMzByMjhzRDFtcXFxZWtQV29wa2dKUjdaRXZnbXFYWW1NQ1hUblNNODNRVkF5SEVtTVBTUXhoQWxNSjhYTU4wRzVsTXczUWEwM3VaY0pLbHhXeGdSV3Zna0M0cXhLU2prVlUzdFVUSWw1VThJRUtkc0VLY2NFM1k0SnVyTW02SFpNMEoxbmdwNjhGKzF4VExESU1jR2k3TVAyVVF3enF1bHlvbzljbkZUaWhwSG9KOXQzc3BIZG1vZ0d5VGxLc1ZVay85dENOc011SmFMK3dsM1owQmxHaElWeVpxWnNvajJhaUhySGl1V0U1WWs1NWRQTEFYa215c1JGTWNYbzZKQ2RNVEliL1hPT3lvUmUrNm1iRTBhWDNPN05QSFNKdjZRazRBOFdaUWpOcExvZ1pWaHFRbTJ6QnVkdlJGc1RtYjJNTXVucmZvRUJnUlVDS3dWV09lZ3JHOVNwbXBvUnpkUk9QMGEwV0pFN1BmR2V6cmlxMjB0Vmo4ckp1TFBzK0hmcEZibVp0U1JiR1hDRlU2YmhjSmFYQ0N3VldDWXdLTEJjWUVpZzZDMGs4a0krZ1dLR2tKZ2hKUGhDZ2k4aytFS0NMeVQ0UWpaZmV0UlNnVUdCMVFKckhLd3FjMXhjVlNXdzJza1BpTG9CcDY2dndpZlFpZjArTzY4MlhGdHJZMjF0VFdHeFpiV2xqVy9FTmQzNkIrKzI5Y0VBQUFBQUFRQUIvLzhBRDNqYVkyQWdBQXFBTUpFaGtXa1BBd1BUUGNhdkRBei9kWmgvL1R2UGRQei9ONlpuakgvL2YvdXZEdUl6dUFDaEhZTWRZeHdEQTRqUG1QTC9ON0k0MHg3R09MQytRNHlSSUJvQUcyZ2szZ0FBZU5xdFYydGJHOGNWbnRVTmpBRURrckNiZGQxUnhxSXVPNUpKNnpqRVZoeXl5Nkk0U2xLQmNidnJOTzB1RXU3OWt2UkdyK245b3Z5WnM2Sjk2bnpMVDh0N1psWUtPT0ErZlo3eVFlZWRtWGZtWE9mTVFrSkxFZytqTUpheTkwUXM3dmFvOHVCUlJMZGN1aEVuaitYb1lVU0ZadnJSckpnVmc0RTZjQnNORWpHSlFHMlBoU09DeEcrUm8wa21qMXRVMEtxaEdpMHFhams4THRicXdnK29Hc2drOGJOQ0xmQ3paakdnUXJCL0pHbGVBUVRwa0VyOW8zR2hVTUF4MURpODJ1RFo4V0xkOGE5S1FPV1BxMDRWYTRwRVB6cU14NnRPd1Nnc2FTcDZWQThpMWtlclFaQVRYRG1VOUhHZlNtdVB4amVjaFNBY2hGUUpvd1lWbS9IZU94SEk3aWlTMU85amFndHMybVMwR2NjeXMyeFlkQU5UK1VqU0JxOXZNUFBqZmlRUmpWRXFhYTRmSlppUnZEYkg2RGFqMjRtYnhISHNJbG8wSHd4STdFVWtla3h1WU96MjZCcWphNzMweVpJWU1PTkpXUnpFOFRDTnlmSGlPUGNnbGtQNG8veTRSV1V0WVVHcG1jS25tYUFmMFl6eWFWYjV5QUMySkMycW1IQWpFbktZelJ6NGtoZlpYZGVhejc5VVRNSUJsZGNiV0F6a1NJNmdLOXNvTnhHaDNTanB1K2xlSEttNEVVdmFlaEJoemVXNDVLYTBhRWJUaGNBYmk0Sk44eXlHeWxjb0YrV25WRGg0VE00QWh0RE1lb3N1YU1uV0xzS3RramlRZkFKdEpURlRrbTFqN1p3ZVgxZ1VRZWl2TjZhRmMxR2ZMcVI1ZTRyandZUUFyaWN5SEttVWsycUNMVnhPQ0VrWFJrNnNSR3BWdW0xVkxKeXpuYTVqbDNBL2RlM2twa1Z0SERwZW1CZkZFRnBjMVlqWFVjU1hkRllvaERSTXQxdTBwRUdWa2k0RmIvQUJBTWdRTGZGb0Q2TWxrNjlsSExSa2dpSVJnd0UwMDNLUXlGRWlhUmxoYTlHSzd1MUhXV200SFYrbmhVTjExS0txN3UxR3ZRZDIwbTFndm1ybWF6b1RLOEhES0Z0WkNjaEpmVnIyK01xaHRQenNFdjhzNFllY1ZlU2kyT3hIR1ljUC92b2paQmhxbDlZYkN0c20yTFhydkFVM21XZGllTktGL1YzTW5rN1dPU25NaEtncXhDc2djVy9zT0k3SlZsMkxUQlRDL1loV2xDOURXa1Q1TFNpVUhFcXhocGtFTnZ6bnloVkhMSXVxOEgyZkkxR0RJVmpMYXJNZWZlaTV6eU51cTNDMjdyWG9zczRjbGxjUWVKYWYwMW1SNVhNNks3RjBkVlptZVZWbkZaYWYxOWtNeTJzNm0yWDVCWjFkWU9scE5Va0VWUktFWE1rMk9lL3l0V21SUHJHNE9sMTh6eTYyVGl5dVRSZmZ0NHRTQzdya25lY3crL3B2NnlzN2V0Sy9CdnlUc090NStNZFN3VCtXMStFZnl5YjhZN2tHLzFoK0VmNnh2QUgvV0g0Si9yRmNoMzhzMjFwMlRPWGUxRkI3SlpIb2ZrNFNtTnppTnJhNWVEYzAzZlRvSmk3bUM3Z1RYWGxPV2xXNnFiakRQNVBoc3ZkZm51UTZXNnlFWEhyMHducFdkdXBoaE83SVhuN2xSSGpPNDl6UzhrVmorWXM0elhMQ3orckUvVDNURnA0WHEvOFMvTGQ5VDIxbXQ1dzYrM29iOFlBRFo5dVBXNU51dHVnbDNiN2NhZEhtZjZPaXdnZWd2NHdVaWRXbWJNc3U5d2FFOXY1bzFGVmROSk1JTHlEYUw1Nm1UY2VwMXhEaE8yaGlxM1FadEJMNmF0UFFzbm5oMDhYQU94eTFsWlNkRWM2OGU1b20yL1k4cXVBMjVHeEpDVGVYcmQzb3VDVEwwajB1clpXZmkzMXV1WFBvM3Nyc1VEc0pWWUtuNzIzQ2JjOCtUNlVnR1NvcTQzWEZjaWxJWGVDRVc5N1RlMUtZaG9kQTdTREhDaHAyK09tYUM0d1duSGVHRW1XYmF3V1hHTWtvbytES256a1ZKN0lSVFRhaWlOKzhwWDZxQzRYUW1jUkNZcmE4bHNkQ2RSQ21WNlpMTkdmV2QxU1hsWElXNzAxRHlNN1lTSlBZajlxeWc1ZWRyYzhuSmR1VnA0SXFUWXp1bi95SXNVazhxOXJ6YkNrdStWZFBXQkpNMHBYd2w4N1RMazlTdklYKzBlWW83dERsSU9xN2VGeGxKMjVuRzA0TjkvYTFVNnQ3YnYvVXFuL20zbWZ0Q0RUZDhaNmxjRnZUWFc4RTI3akc0TlM1VkNTMFRSdllFUnFYdVQ3WGJPUlRmS241MW5VdVVJWHIwOGJOcytmdjZHd09qODVreS85WTB0My9WeFd6VDl6SE9ncXQ2a1M5Tk9MY3ppNGE4QjF2RXBYWE1icnJOVlFlbDl5YmFRanVJd1IxZSszeFdZSWJYbTNUYmR6eU44Nlo3K0U0cDFhbGw0RGYxUFF5eEZzY3hSRGhsanQ0Z1NmUmVsdHpRZE5iZ0YvVll5RjJBUG9BRG9OZFBYYk16QjZBbVhuQW5DN0FQbk1ZUEdRT2c2OHhoOEhYOVRGNllRQVVBVGtHeGZyWXNYT1BnT3pjTzh4ekdIMkRlUWE5eXp5RHZzazhnNzdGT2tPQWhIVXlTRmtuZ3dQV3lXREFuTmNCaHN4aGNNZ2NCbytadytEYnhxNXRvTzhZdXhoOTE5akY2SHZHTGtiZk4zWXgrb0d4aTlFUGpWMk1mbVRzWXZSanhMZ3pUZUJQeklpMkFOK3o4RFhBOXpub1p1Umo5Rk84dFRublp4WXk1K2VHNCtTY1gyRHpLOU5UZjJsR1pzZVJoYnpqVnhZeS9kYzRKeWY4eGtJbS9OWkNKdndPM0h2VDgzNXZSb2IrZ1lWTS80T0ZUUDhqZHVhRVAxbkloRDlieUlTL2dQdnE5THkvbXBHaC84MUNwdi9kUXFiL0F6dHp3ajh0Wk1MSVFpWjhxTWNYelNjdVZkeHhxVkFNOGQ4VDJtRHNlelI3U01Yci9hUEpZOTM2QlBXZ0Evb0FBSGphWS9EZXdYQWlLR0lqSTJOZjVBYkduUndNSEF6SkJSc1oySjIyTURESU16Tm9nWmpialZqVVdJUTRtTGtnUEFzbUhTWVpOakNQeTJrUHp3SE9BeXdIR0pnWnVJRjhYcWM5REE1Z0NPTHZCSklNTGh0VkdEc0NJelk0ZEVTQStDa3VHelZBL0IwY0RCQUJCcGRJNlkzcUlLRmRIQTBNakN3T0hja2hNQWtRMkc3Q29zRWl3c0hNcDdXRDhYL3JCcGJlalV3TUxwdFpVOWdZWEZ3QTU2VXUrUUFBQUFBQUFRQUFBQUI0MnRXVVRVL2NNQkNHNy95S2tVOVVLakhMcVVVSkNJR2lvaTVhUHJhOW0zZzJjWEhzZER6WnNQKytEczZXcFdvcmJvaGJiSTBmUCsvWVRuNzYyRnBZSXdYalhTRm0yYUVBZEpYWHh0V0YrTFlzRHo2SjA1Tzl2RVZXV3JFNjJRUEllMmQrOW1nMEdGMkl5cmRaV3oxWTNuU1kzYUwrb25pSmozeUYydlN0a0U4TDF1aTBKM0NxeFVKY28yTlZrMnBCd3RYNTE3bUFubXdoR3VidVdNcGhHSjV4a1QwUktvbzhEdVAzNzlFL2VlUnRuQzk5N3pSdFhvTi9MZklDZzZrZDBrdG10NjBlZ1hJU2xqdkd1Y1pRa2VrNDluamFqbU9Md0txeHllaEVtZ1JZTmlaQTZSM0RuVi94b0FnaFRsaFRvUXVvSWVaQkFtNFE3aTduc0lqN3B1SjVLdmdJMzlNNXdpeWJaUWsyclIweGFxMk1WZmNXWVREY2dJTHk3QVlVSDhNVUl5bUdMQmliZWFybG9wem5jdlJNZWY3SWtHL0p1NTM0QzBLODI4QVRLVjAvMzIzSTFBMy9OODM1dGdxT0RtZWZvdzlDZkJBUVh3UmNrLytCRmNOWno0Mm5BUHVqUTRnU2RWVHI3NTl1VG5vOGk5WEtWRWJaYVRqbS9iQ3I5VUlsWjFJYVcwVVBieSsybzVMTDUvL0ZMM3BKYlRrPSkgZm9ybWF0KCJ3b2ZmIik7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc3R5bGU6IG5vcm1hbDsgfQoucGYtYy1mb3JtLWNvbnRyb2wgeyAtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMDogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tZGFyay0xMDApOyAtLXBmLWdsb2JhbC0tQ29sb3ItLTIwMDogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tZGFyay0yMDApOyAtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTEwMDogdmFyKC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tZGFyay0xMDApOyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMTAwOiB2YXIoLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLWRhcmstMTAwKTsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1kYXJrKTsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3ZlcjogdmFyKC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvci0tZGFyay0taG92ZXIpOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS0xMDA6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0xMDApOyB9CgoucGYtYy1sb2dpbl9faGVhZGVyLCAucGYtYy1sb2dpbl9fZm9vdGVyIHsgLS1wZi1nbG9iYWwtLUNvbG9yLS0xMDA6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLWxpZ2h0LTEwMCk7IC0tcGYtZ2xvYmFsLS1Db2xvci0tMjAwOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0yMDApOyAtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTEwMDogdmFyKC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tbGlnaHQtMTAwKTsgLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLTEwMDogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS1saWdodC0xMDApOyAtLXBmLWdsb2JhbC0tbGluay0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tbGluay0tQ29sb3ItLWxpZ2h0KTsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3ZlcjogdmFyKC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvci0tbGlnaHQpOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS0xMDA6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1kYXJrLTEwMCk7IH0KLnBmLWMtbG9naW5fX2hlYWRlciAucGYtYy1jYXJkLCAucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWNhcmQgeyAtLXBmLWMtY2FyZC0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay10cmFuc3BhcmVudC0yMDApOyB9Ci5wZi1jLWxvZ2luX19oZWFkZXIgLnBmLWMtYnV0dG9uLCAucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWJ1dHRvbiB7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tZGFyay0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWhvdmVyLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS1kYXJrLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLWRhcmstMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1hY3RpdmUtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLWRhcmstMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWhvdmVyLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0zMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0zMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWFjdGl2ZS0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tbGlnaHQtMzAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0taG92ZXItLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0taG92ZXItLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgfQoKOnJvb3QgeyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMTAwOiAjZmFmYWZhOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMTUwOiAjZjVmNWY1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMjAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMzAwOiAjZDJkMmQyOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNDAwOiAjYjhiYmJlOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNTAwOiAjOGE4ZDkwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNjAwOiAjNzM3Njc5OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNzAwOiAjNGY1MjU1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stODAwOiAjM2MzZjQyOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stODUwOiAjMjEyNDI3OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stOTAwOiAjMTUxNTE1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMTAwMDogIzAzMDMwMzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWJsdWUtNTA6ICNkZWYzZmY7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ibHVlLTEwMDogI2JlZTFmNDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWJsdWUtMjAwOiAjNzNiY2Y3OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmx1ZS0zMDA6ICMyYjlhZjM7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ibHVlLTQwMDogIzA2YzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWJsdWUtNTAwOiAjMDA0MDgwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmx1ZS02MDA6ICMwMDQzNjg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ibHVlLTcwMDogIzAwMjIzNTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWN5YW4tMTAwOiAjYTJkOWQ5OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tY3lhbi0yMDA6ICM3M2M1YzU7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1jeWFuLTMwMDogIzAwOTU5NjsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWN5YW4tNDAwOiAjMDA1ZjYwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tY3lhbi01MDA6ICMwMDM3Mzc7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1jeWFuLTYwMDogIzAwM2Q0NDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWN5YW4tNzAwOiAjMDAxZjIyOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tZ29sZC0xMDA6ICNmOWUwYTI7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1nb2xkLTIwMDogI2Y2ZDE3MzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWdvbGQtMzAwOiAjZjRjMTQ1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tZ29sZC00MDA6ICNmMGFiMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1nb2xkLTUwMDogI2M1OGMwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWdvbGQtNjAwOiAjNzk1NjAwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tZ29sZC03MDA6ICMzZDJjMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi0xMDA6ICNiZGU1Yjg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi0yMDA6ICM5NWQ1OGU7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi0zMDA6ICM2ZWM2NjQ7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi00MDA6ICM1YmEzNTI7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi01MDA6ICM0NjdmNDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi02MDA6ICMxZTRmMTg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi03MDA6ICMwZjI4MGQ7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1saWdodC1ibHVlLTEwMDogI2JlZWRmOTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWJsdWUtMjAwOiAjN2NkYmYzOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tbGlnaHQtYmx1ZS0zMDA6ICMzNWNhZWQ7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1saWdodC1ibHVlLTQwMDogIzAwYjllNDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWJsdWUtNTAwOiAjMDA4YmFkOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tbGlnaHQtYmx1ZS02MDA6ICMwMDVjNzM7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1saWdodC1ibHVlLTcwMDogIzAwMmQzOTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTEwMDogI2U0ZjViYzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTIwMDogI2M4ZWI3OTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTMwMDogI2FjZTEyZTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTQwMDogIzkyZDQwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTUwMDogIzZjYTEwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTYwMDogIzQ4NmIwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTcwMDogIzI1MzYwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLW9yYW5nZS0xMDA6ICNmNGI2Nzg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1vcmFuZ2UtMjAwOiAjZWY5MjM0OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tb3JhbmdlLTMwMDogI2VjN2EwODsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLW9yYW5nZS00MDA6ICNjNDYxMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1vcmFuZ2UtNTAwOiAjOGY0NzAwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tb3JhbmdlLTYwMDogIzc3M2QwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLW9yYW5nZS03MDA6ICMzYjFmMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1wdXJwbGUtMTAwOiAjY2JjMWZmOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcHVycGxlLTIwMDogI2IyYTNmZjsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXB1cnBsZS0zMDA6ICNhMThmZmY7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1wdXJwbGUtNDAwOiAjODQ3NmQxOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcHVycGxlLTUwMDogIzY3NTNhYzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXB1cnBsZS02MDA6ICM0MDE5OWE7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1wdXJwbGUtNzAwOiAjMWYwMDY2OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcmVkLTEwMDogI2M5MTkwYjsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXJlZC0yMDA6ICNhMzAwMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1yZWQtMzAwOiAjN2QxMDA3OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcmVkLTQwMDogIzQ3MDAwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXJlZC01MDA6ICMyYzAwMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS13aGl0ZTogI2ZmZjsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tMTAwOiAjZmZmOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS0xNTA6ICNmNWY1ZjU7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLTIwMDogI2ZhZmFmYTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tMzAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0xMDA6ICNmZmY7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLWxpZ2h0LTIwMDogI2ZhZmFmYTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tbGlnaHQtMzAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1kYXJrLTEwMDogIzE1MTUxNTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay0yMDA6ICMzYzNmNDI7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLWRhcmstMzAwOiAjMjEyNDI3OyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1kYXJrLTQwMDogIzRmNTI1NTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay10cmFuc3BhcmVudC0xMDA6IHJnYmEoMywgMywgMywgMC42Mik7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLWRhcmstdHJhbnNwYXJlbnQtMjAwOiByZ2JhKDMsIDMsIDMsIDAuMzIpOyAtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMDogIzE1MTUxNTsgLS1wZi1nbG9iYWwtLUNvbG9yLS0yMDA6ICM3Mzc2Nzk7IC0tcGYtZ2xvYmFsLS1Db2xvci0tMzAwOiAjM2MzZjQyOyAtLXBmLWdsb2JhbC0tQ29sb3ItLTQwMDogIzhhOGQ5MDsgLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDA6ICNmZmY7IC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMjAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tQ29sb3ItLWxpZ2h0LTMwMDogI2QyZDJkMjsgLS1wZi1nbG9iYWwtLUNvbG9yLS1kYXJrLTEwMDogIzE1MTUxNTsgLS1wZi1nbG9iYWwtLUNvbG9yLS1kYXJrLTIwMDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWFjdGl2ZS1jb2xvci0tMTAwOiAjMDZjOyAtLXBmLWdsb2JhbC0tYWN0aXZlLWNvbG9yLS0yMDA6ICNiZWUxZjQ7IC0tcGYtZ2xvYmFsLS1hY3RpdmUtY29sb3ItLTMwMDogIzczYmNmNzsgLS1wZi1nbG9iYWwtLWFjdGl2ZS1jb2xvci0tNDAwOiAjMmI5YWYzOyAtLXBmLWdsb2JhbC0tZGlzYWJsZWQtY29sb3ItLTEwMDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWRpc2FibGVkLWNvbG9yLS0yMDA6ICNkMmQyZDI7IC0tcGYtZ2xvYmFsLS1kaXNhYmxlZC1jb2xvci0tMzAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMTAwOiAjMDZjOyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMjAwOiAjMDA0MDgwOyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tbGlnaHQtMTAwOiAjNzNiY2Y3OyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tZGFyay0xMDA6ICMwNmM7IC0tcGYtZ2xvYmFsLS1zZWNvbmRhcnktY29sb3ItLTEwMDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWRlZmF1bHQtY29sb3ItLTEwMDogIzczYzVjNTsgLS1wZi1nbG9iYWwtLWRlZmF1bHQtY29sb3ItLTIwMDogIzAwOTU5NjsgLS1wZi1nbG9iYWwtLWRlZmF1bHQtY29sb3ItLTMwMDogIzAwMzczNzsgLS1wZi1nbG9iYWwtLXN1Y2Nlc3MtY29sb3ItLTEwMDogIzkyZDQwMDsgLS1wZi1nbG9iYWwtLXN1Y2Nlc3MtY29sb3ItLTIwMDogIzQ4NmIwMDsgLS1wZi1nbG9iYWwtLWluZm8tY29sb3ItLTEwMDogIzczYmNmNzsgLS1wZi1nbG9iYWwtLWluZm8tY29sb3ItLTIwMDogIzAwNDM2ODsgLS1wZi1nbG9iYWwtLXdhcm5pbmctY29sb3ItLTEwMDogI2YwYWIwMDsgLS1wZi1nbG9iYWwtLXdhcm5pbmctY29sb3ItLTIwMDogIzc5NTYwMDsgLS1wZi1nbG9iYWwtLWRhbmdlci1jb2xvci0tMTAwOiAjYzkxOTBiOyAtLXBmLWdsb2JhbC0tZGFuZ2VyLWNvbG9yLS0yMDA6ICNhMzAwMDA7IC0tcGYtZ2xvYmFsLS1kYW5nZXItY29sb3ItLTMwMDogIzQ3MDAwMDsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tc206IDAgMC4wNjI1cmVtIDAuMTI1cmVtIDAgcmdiYSgzLCAzLCAzLCAwLjIpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1zbS1yaWdodDogMC4yNXJlbSAwIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4xMik7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLXNtLWxlZnQ6IC0wLjI1cmVtIDAgMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjEyKTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tc20tYm90dG9tOiAwIDAuMjVyZW0gMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjEyKTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tc20tdG9wOiAwIC0wLjI1cmVtIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4xMik7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLW1kOiAwIDAuMDYyNXJlbSAwLjA2MjVyZW0gMHJlbSByZ2JhKDMsIDMsIDMsIDAuMDUpLCAwIDAuMjVyZW0gMC41cmVtIDAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjA2KTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tbWQtcmlnaHQ6IDAuMzEyNXJlbSAwIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLW1kLWxlZnQ6IC0wLjMxMjVyZW0gMCAwLjYyNXJlbSAtMC4yNXJlbSByZ2JhKDMsIDMsIDMsIDAuMjUpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1tZC1ib3R0b206IDAgMC4zMTI1cmVtIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLW1kLXRvcDogMCAtMC4zMTI1cmVtIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLWxnOiAwIDAuMTg3NXJlbSAwLjQzNzVyZW0gMC4xODc1cmVtIHJnYmEoMywgMywgMywgMC4xMyksIDAgMC42ODc1cmVtIDEuNXJlbSAxcmVtIHJnYmEoMywgMywgMywgMC4xMik7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLWxnLXJpZ2h0OiAwLjc1cmVtIDAgMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjA3KTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tbGctbGVmdDogLTAuNzVyZW0gMCAwLjYyNXJlbSAtMC4yNXJlbSByZ2JhKDMsIDMsIDMsIDAuMDcpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1sZy1ib3R0b206IDAgMC43NXJlbSAwLjYyNXJlbSAtMC4yNXJlbSByZ2JhKDMsIDMsIDMsIDAuMDcpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1sZy10b3A6IDAgLTAuNzVyZW0gMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjA3KTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0taW5zZXQ6IGluc2V0IDAgMCAwLjYyNXJlbSAwIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1mb250LXBhdGg6IC4vYXNzZXRzL2ZvbnRzOyAtLXBmLWdsb2JhbC0tZm9udGljb24tcGF0aDogLi9hc3NldHMvcGZpY29uOyAtLXBmLWdsb2JhbC0tc3BhY2VyLS14czogMC4yNXJlbTsgLS1wZi1nbG9iYWwtLXNwYWNlci0tc206IDAuNXJlbTsgLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQ6IDFyZW07IC0tcGYtZ2xvYmFsLS1zcGFjZXItLWxnOiAxLjVyZW07IC0tcGYtZ2xvYmFsLS1zcGFjZXItLXhsOiAycmVtOyAtLXBmLWdsb2JhbC0tc3BhY2VyLS0yeGw6IDNyZW07IC0tcGYtZ2xvYmFsLS1zcGFjZXItLTN4bDogNHJlbTsgLS1wZi1nbG9iYWwtLXNwYWNlci0tZm9ybS1lbGVtZW50OiAwLjM3NXJlbTsgLS1wZi1nbG9iYWwtLWd1dHRlcjogMS41cmVtOyAtLXBmLWdsb2JhbC0tZ3V0dGVyLS1tZDogMXJlbTsgLS1wZi1nbG9iYWwtLWdvbGRlbi1yYXRpbzogMS42ODE7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLXhzOiAxMDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLXNtOiAyMDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLW1kOiAzMDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLWxnOiA0MDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLXhsOiA1MDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLTJ4bDogNjAwOyAtLXBmLWdsb2JhbC0tYnJlYWtwb2ludC0teHM6IDA7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS1zbTogNTc2cHg7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS1tZDogNzY4cHg7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS1sZzogOTkycHg7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS14bDogMTIwMHB4OyAtLXBmLWdsb2JhbC0tYnJlYWtwb2ludC0tMnhsOiAxNDUwcHg7IC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvcjogIzA2YzsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3ZlcjogIzAwNDA4MDsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1saWdodDogIzczYmNmNzsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1saWdodC0taG92ZXI6ICMyYjlhZjM7IC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvci0tZGFyazogIzA2YzsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1kYXJrLS1ob3ZlcjogIzAwNDA4MDsgLS1wZi1nbG9iYWwtLWxpbmstLUZvbnRXZWlnaHQ6IDUwMDsgLS1wZi1nbG9iYWwtLWxpbmstLVRleHREZWNvcmF0aW9uOiBub25lOyAtLXBmLWdsb2JhbC0tbGluay0tVGV4dERlY29yYXRpb24tLWhvdmVyOiB1bmRlcmxpbmU7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJXaWR0aC0tc206IDFweDsgLS1wZi1nbG9iYWwtLUJvcmRlcldpZHRoLS1tZDogMnB4OyAtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLWxnOiAzcHg7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tMTAwOiAjZDJkMmQyOyAtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTIwMDogIzhhOGQ5MDsgLS1wZi1nbG9iYWwtLUJvcmRlckNvbG9yLS0zMDA6ICNlZGVkZWQ7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tZGFyay0xMDA6ICNkMmQyZDI7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tbGlnaHQtMTAwOiAjYjhiYmJlOyAtLXBmLWdsb2JhbC0tQm9yZGVyUmFkaXVzLS1zbTogM3B4OyAtLXBmLWdsb2JhbC0tQm9yZGVyUmFkaXVzLS1sZzogMzBlbTsgLS1wZi1nbG9iYWwtLWljb24tLUNvbG9yLS1saWdodDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWljb24tLUNvbG9yLS1kYXJrOiAjMTUxNTE1OyAtLXBmLWdsb2JhbC0taWNvbi0tRm9udFNpemUtLXNtOiAwLjYyNXJlbTsgLS1wZi1nbG9iYWwtLWljb24tLUZvbnRTaXplLS1tZDogMS4xMjVyZW07IC0tcGYtZ2xvYmFsLS1pY29uLS1Gb250U2l6ZS0tbGc6IDEuNXJlbTsgLS1wZi1nbG9iYWwtLWljb24tLUZvbnRTaXplLS14bDogMy4zNzVyZW07IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1zYW5zLXNlcmlmOiBvdmVycGFzcywgb3ZlcnBhc3MsIG9wZW4gc2FucywgLWFwcGxlLXN5c3RlbSwgYmxpbmttYWNzeXN0ZW1mb250LCBTZWdvZSBVSSwgcm9ib3RvLCBIZWx2ZXRpY2EgTmV1ZSwgYXJpYWwsIHNhbnMtc2VyaWYsIEFwcGxlIENvbG9yIEVtb2ppLCBTZWdvZSBVSSBFbW9qaSwgU2Vnb2UgVUkgU3ltYm9sOyAtLXBmLWdsb2JhbC0tRm9udEZhbWlseS0taGVhZGluZy0tc2Fucy1zZXJpZjogb3ZlcnBhc3MsIG92ZXJwYXNzLCBvcGVuIHNhbnMsIC1hcHBsZS1zeXN0ZW0sIGJsaW5rbWFjc3lzdGVtZm9udCwgU2Vnb2UgVUksIHJvYm90bywgSGVsdmV0aWNhIE5ldWUsIGFyaWFsLCBzYW5zLXNlcmlmLCBBcHBsZSBDb2xvciBFbW9qaSwgU2Vnb2UgVUkgRW1vamksIFNlZ29lIFVJIFN5bWJvbDsgLS1wZi1nbG9iYWwtLUZvbnRGYW1pbHktLW1vbm9zcGFjZTogb3ZlcnBhc3MtbW9ubywgb3ZlcnBhc3MtbW9ubywgU0ZNb25vLVJlZ3VsYXIsIG1lbmxvLCBtb25hY28sIGNvbnNvbGFzLCBMaWJlcmF0aW9uIE1vbm8sIENvdXJpZXIgTmV3LCBtb25vc3BhY2U7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1zYW5zLXNlcmlmOiBSZWRIYXRUZXh0LCBPdmVycGFzcywgb3ZlcnBhc3MsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1oZWFkaW5nLS1zYW5zLXNlcmlmOiBSZWRIYXREaXNwbGF5LCBPdmVycGFzcywgb3ZlcnBhc3MsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1tb25vc3BhY2U6IExpYmVyYXRpb24gTW9ubywgY29uc29sYXMsIFNGTW9uby1SZWd1bGFyLCBtZW5sbywgbW9uYWNvLCBDb3VyaWVyIE5ldywgbW9ub3NwYWNlOyAtLXBmLWdsb2JhbC0tRm9udFNpemUtLTR4bDogMi4yNXJlbTsgLS1wZi1nbG9iYWwtLUZvbnRTaXplLS0zeGw6IDEuNzVyZW07IC0tcGYtZ2xvYmFsLS1Gb250U2l6ZS0tMnhsOiAxLjVyZW07IC0tcGYtZ2xvYmFsLS1Gb250U2l6ZS0teGw6IDEuMjVyZW07IC0tcGYtZ2xvYmFsLS1Gb250U2l6ZS0tbGc6IDEuMTI1cmVtOyAtLXBmLWdsb2JhbC0tRm9udFNpemUtLW1kOiAxcmVtOyAtLXBmLWdsb2JhbC0tRm9udFNpemUtLXNtOiAwLjg3NXJlbTsgLS1wZi1nbG9iYWwtLUZvbnRTaXplLS14czogMC43NXJlbTsgLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLWxpZ2h0OiAzMDA7IC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1ub3JtYWw6IDQwMDsgLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLXNlbWktYm9sZDogNTAwOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tYm9sZDogNjAwOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tcmVkaGF0Zm9udC0tYm9sZDogNzAwOyAtLXBmLWdsb2JhbC0tTGluZUhlaWdodC0tc206IDEuMzsgLS1wZi1nbG9iYWwtLUxpbmVIZWlnaHQtLW1kOiAxLjU7IC0tcGYtZ2xvYmFsLS1MaXN0U3R5bGU6IGRpc2Mgb3V0c2lkZTsgLS1wZi1nbG9iYWwtLVRyYW5zaXRpb246IGFsbCAyNTBtcyBjdWJpYy1iZXppZXIoMC40MiwgMCwgMC41OCwgMSk7IC0tcGYtZ2xvYmFsLS1UaW1pbmdGdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNjQ1LCAwLjA0NSwgMC4zNTUsIDEpOyAtLXBmLWdsb2JhbC0tVHJhbnNpdGlvbkR1cmF0aW9uOiAyNTBtczsgLS1wZi1nbG9iYWwtLWFycm93LS13aWR0aDogMC45Mzc1cmVtOyAtLXBmLWdsb2JhbC0tYXJyb3ctLXdpZHRoLWxnOiAxLjU2MjVyZW07IC0tcGYtZ2xvYmFsLS10YXJnZXQtc2l6ZS0tTWluV2lkdGg6IDQ0cHg7IC0tcGYtZ2xvYmFsLS10YXJnZXQtc2l6ZS0tTWluSGVpZ2h0OiA0NHB4OyB9CgoucGYtbS1yZWRoYXQtZm9udCB7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1zYW5zLXNlcmlmOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRGYW1pbHktLXJlZGhhdGZvbnQtLXNhbnMtc2VyaWYpOyAtLXBmLWdsb2JhbC0tRm9udEZhbWlseS0taGVhZGluZy0tc2Fucy1zZXJpZjogdmFyKC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1oZWFkaW5nLS1zYW5zLXNlcmlmKTsgLS1wZi1nbG9iYWwtLUZvbnRGYW1pbHktLW1vbm9zcGFjZTogdmFyKC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1tb25vc3BhY2UpOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tc2VtaS1ib2xkOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLXJlZGhhdGZvbnQtLWJvbGQpOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tYm9sZDogdmFyKC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1yZWRoYXRmb250LS1ib2xkKTsgLS1wZi1nbG9iYWwtLWxpbmstLUZvbnRXZWlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tbm9ybWFsKTsgfQoKaHRtbCwgYm9keSwgcCwgb2wsIHVsLCBsaSwgZGwsIGR0LCBkZCwgYmxvY2txdW90ZSwgZmlndXJlLCBmaWVsZHNldCwgbGVnZW5kLCB0ZXh0YXJlYSwgcHJlLCBpZnJhbWUsIGhyLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsgcGFkZGluZzogMDsgbWFyZ2luOiAwOyB9CgpodG1sLCBib2R5IHsgaGVpZ2h0OiAxMDAlOyB9CgpoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsgZm9udC1zaXplOiAxMDAlOyBmb250LXdlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1ub3JtYWwpOyB9Cgp1bCB7IGxpc3Qtc3R5bGU6IG5vbmU7IH0KCmJ1dHRvbiwgaW5wdXQsIG9wdGdyb3VwLCBzZWxlY3QsIHRleHRhcmVhIHsgbWFyZ2luOiAwOyBmb250LWZhbWlseTogaW5oZXJpdDsgZm9udC1zaXplOiAxMDAlOyBsaW5lLWhlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1MaW5lSGVpZ2h0LS1tZCk7IGNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS0xMDApOyB9CgppbWcsIGVtYmVkLCBpZnJhbWUsIG9iamVjdCwgYXVkaW8sIHZpZGVvIHsgbWF4LXdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87IH0KCmlmcmFtZSB7IGJvcmRlcjogMDsgfQoKdGFibGUgeyBib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfQoKdGQsIHRoIHsgcGFkZGluZzogMDsgdGV4dC1hbGlnbjogbGVmdDsgfQoKKiwgKjo6YmVmb3JlLCAqOjphZnRlciB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0KCmh0bWwgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgbGluZS1oZWlnaHQ6IDEuMTU7IH0KCmJvZHkgeyBmb250LWZhbWlseTogdmFyKC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1zYW5zLXNlcmlmKTsgZm9udC1zaXplOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRTaXplLS1tZCk7IGZvbnQtd2VpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLW5vcm1hbCk7IGxpbmUtaGVpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLUxpbmVIZWlnaHQtLW1kKTsgdGV4dC1hbGlnbjogbGVmdDsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLTEwMCk7IH0KCmEgeyBmb250LXdlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1saW5rLS1Gb250V2VpZ2h0KTsgY29sb3I6IHZhcigtLXBmLWdsb2JhbC0tbGluay0tQ29sb3IpOyB0ZXh0LWRlY29yYXRpb246IHZhcigtLXBmLWdsb2JhbC0tbGluay0tVGV4dERlY29yYXRpb24pOyB9CmE6aG92ZXIgeyAtLXBmLWdsb2JhbC0tbGluay0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tbGluay0tQ29sb3ItLWhvdmVyKTsgLS1wZi1nbG9iYWwtLWxpbmstLVRleHREZWNvcmF0aW9uOiB2YXIoLS1wZi1nbG9iYWwtLWxpbmstLVRleHREZWNvcmF0aW9uLS1ob3Zlcik7IH0KCmJ1dHRvbiwgYSB7IGN1cnNvcjogcG9pbnRlcjsgfQoKYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLCBbdHlwZT0iYnV0dG9uIl06Oi1tb3otZm9jdXMtaW5uZXIsIFt0eXBlPSJyZXNldCJdOjotbW96LWZvY3VzLWlubmVyLCBbdHlwZT0ic3VibWl0Il06Oi1tb3otZm9jdXMtaW5uZXIgeyBwYWRkaW5nOiAwOyBib3JkZXItc3R5bGU6IG5vbmU7IH0KYnV0dG9uOi1tb3otZm9jdXNyaW5nLCBbdHlwZT0iYnV0dG9uIl06LW1vei1mb2N1c3JpbmcsIFt0eXBlPSJyZXNldCJdOi1tb3otZm9jdXNyaW5nLCBbdHlwZT0ic3VibWl0Il06LW1vei1mb2N1c3JpbmcgeyBvdXRsaW5lOiAxcHggZG90dGVkIEJ1dHRvblRleHQ7IH0KCi5wZi1jLWxvZ2luIHsgLS1wZi1jLWxvZ2luLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbGcpOyAtLXBmLWMtbG9naW4tLVBhZGRpbmdCb3R0b206IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1sZyk7IC0tcGYtYy1sb2dpbi0teGwtLUJhY2tncm91bmRJbWFnZTogbm9uZTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLXhsLS1HcmlkQ29sdW1uR2FwOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tM3hsKTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLU1heFdpZHRoOiAzMS4yNXJlbTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLXhsLS1NYXhXaWR0aDogbm9uZTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLVBhZGRpbmdMZWZ0OiA2LjEyNXJlbTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLVBhZGRpbmdSaWdodDogNi4xMjVyZW07IC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS14bC0tR3JpZFRlbXBsYXRlQ29sdW1uczogMzRyZW0gbWlubWF4KGF1dG8sIDM0cmVtKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLXNtLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLXNtLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9faGVhZGVyLS14bC0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLXhsLS1NYXJnaW5Ub3A6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS0zeGwpOyAtLXBmLWMtbG9naW5fX2hlYWRlci0tYy1icmFuZC0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbGcpOyAtLXBmLWMtbG9naW5fX2hlYWRlci0tYy1icmFuZC0teGwtLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWxvZ2luX19tYWluLS14bC0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbGcpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUGFkZGluZ1JpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teGwpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXhsKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tbWQtLVBhZGRpbmdSaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLW1kLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLUNvbHVtbkdhcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUm93R2FwOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MtLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci1kZXNjLS1tZC0tTWFyZ2luQm90dG9tOiAwOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MtLUZvbnRTaXplOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRTaXplLS1zbSk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS14bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teGwpOyAtLXBmLWMtbG9naW5fX21haW4tYm9keS0tUGFkZGluZ0xlZnQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS14bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1tZC0tUGFkZGluZ1JpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgLS1wZi1jLWxvZ2luX19tYWluLWJvZHktLW1kLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1jLWZvcm1fX2hlbHBlci10ZXh0LWljb24tLUZvbnRTaXplOiB2YXIoLS1wZi1nbG9iYWwtLWljb24tLUZvbnRTaXplLS1tZCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1jLWZvcm1fX2hlbHBlci10ZXh0LWljb24tLU1hcmdpblJpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tc20pOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tM3hsKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci0tYy10aXRsZS0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tc20pOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS0zeGwpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teGwpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTN4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS0tUGFkZGluZ1JpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tLVBhZGRpbmdMZWZ0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1GaWxsOiB2YXIoLS1wZi1nbG9iYWwtLWljb24tLUNvbG9yLS1saWdodCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS1saW5rLXN2Zy0tV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0taWNvbi0tRm9udFNpemUtLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1IZWlnaHQ6IHZhcigtLXBmLWdsb2JhbC0taWNvbi0tRm9udFNpemUtLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1ob3Zlci0tRmlsbDogdmFyKC0tcGYtZ2xvYmFsLS1pY29uLS1Db2xvci0tZGFyayk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ1RvcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ0JvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS0zMDApOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtaXRlbS0tUGFkZGluZ1RvcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19mb290ZXItLXNtLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19mb290ZXItLXNtLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1jLWxpc3QtLVBhZGRpbmdUb3A6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1jLWxpc3QtLXhsLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IG1pbi1oZWlnaHQ6IDEwMHZoOyBwYWRkaW5nLXRvcDogdmFyKC0tcGYtYy1sb2dpbi0tUGFkZGluZ1RvcCk7IHBhZGRpbmctYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luLS1QYWRkaW5nQm90dG9tKTsgfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWxvZ2luIHsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLU1heFdpZHRoOiB2YXIoLS1wZi1jLWxvZ2luX19jb250YWluZXItLXhsLS1NYXhXaWR0aCk7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWxvZ2luIHsgLS1wZi1jLWxvZ2luX19oZWFkZXItLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtYy1sb2dpbl9faGVhZGVyLS14bC0tTWFyZ2luQm90dG9tKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLWMtYnJhbmQtLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtYy1sb2dpbl9faGVhZGVyLS1jLWJyYW5kLS14bC0tTWFyZ2luQm90dG9tKTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbiB7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLVBhZGRpbmdSaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLW1kLS1QYWRkaW5nUmlnaHQpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLW1kLS1QYWRkaW5nTGVmdCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItZGVzYy0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci1kZXNjLS1tZC0tTWFyZ2luQm90dG9tKTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbiB7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tbWQtLVBhZGRpbmdSaWdodCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1tZC0tUGFkZGluZ0xlZnQpOyB9IH0KQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgeyAucGYtYy1sb2dpbiB7IC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1jLWxpc3QtLVBhZGRpbmdUb3A6IHZhcigtLXBmLWMtbG9naW5fX2Zvb3Rlci0tYy1saXN0LS14bC0tUGFkZGluZ1RvcCk7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWxvZ2luIHsgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcGYtYy1sb2dpbi0teGwtLUJhY2tncm91bmRJbWFnZSk7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpIHsgLnBmLWMtbG9naW4geyBhbGlnbi1pdGVtczogY2VudGVyOyB9IH0KCi5wZi1jLWxvZ2luX19jb250YWluZXIgeyBtYXgtd2lkdGg6IHZhcigtLXBmLWMtbG9naW5fX2NvbnRhaW5lci0tTWF4V2lkdGgpOyB9CkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsgLnBmLWMtbG9naW5fX2NvbnRhaW5lciB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtY29sdW1uLWdhcDogdmFyKC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS14bC0tR3JpZENvbHVtbkdhcCk7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogdmFyKC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS14bC0tR3JpZFRlbXBsYXRlQ29sdW1ucyk7IGdyaWQtdGVtcGxhdGUtYXJlYXM6ICJtYWluIGhlYWRlciIgIm1haW4gZm9vdGVyIiAibWFpbiAuIjsgcGFkZGluZy1yaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS1QYWRkaW5nUmlnaHQpOyBwYWRkaW5nLWxlZnQ6IHZhcigtLXBmLWMtbG9naW5fX2NvbnRhaW5lci0tUGFkZGluZ0xlZnQpOyB9IH0KCi5wZi1jLWxvZ2luX19oZWFkZXIgeyBjb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgZ3JpZC1hcmVhOiBoZWFkZXI7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDU3NnB4KSB7IC5wZi1jLWxvZ2luX19oZWFkZXIgeyBwYWRkaW5nLXJpZ2h0OiB2YXIoLS1wZi1jLWxvZ2luX19oZWFkZXItLXNtLS1QYWRkaW5nUmlnaHQpOyBwYWRkaW5nLWxlZnQ6IHZhcigtLXBmLWMtbG9naW5fX2hlYWRlci0tc20tLVBhZGRpbmdMZWZ0KTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsgLnBmLWMtbG9naW5fX2hlYWRlciB7IG1hcmdpbi10b3A6IHZhcigtLXBmLWMtbG9naW5fX2hlYWRlci0teGwtLU1hcmdpblRvcCk7IH0gfQoucGYtYy1sb2dpbl9faGVhZGVyIC5wZi1jLWJyYW5kIHsgbWFyZ2luLWJvdHRvbTogdmFyKC0tcGYtYy1sb2dpbl9faGVhZGVyLS1jLWJyYW5kLS1NYXJnaW5Cb3R0b20pOyB9CgoucGYtYy1sb2dpbl9fbWFpbiB7IGdyaWQtYXJlYTogbWFpbjsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1sb2dpbl9fbWFpbiA+IDpmaXJzdC1jaGlsZDpub3QoLnBmLWMtbG9naW5fX21haW4taGVhZGVyKSB7IHBhZGRpbmctdG9wOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUGFkZGluZ1RvcCk7IH0KLnBmLWMtbG9naW5fX21haW4gPiA6bGFzdC1jaGlsZDpub3QoLnBmLWMtbG9naW5fX21haW4tZm9vdGVyKSB7IHBhZGRpbmctYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci0tUGFkZGluZ0JvdHRvbSk7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDEyMDBweCkgeyAucGYtYy1sb2dpbl9fbWFpbiB7IG1hcmdpbi1ib3R0b206IHZhcigtLXBmLWMtbG9naW5fX21haW4tLXhsLS1NYXJnaW5Cb3R0b20pOyB9IH0KCi5wZi1jLWxvZ2luX19tYWluLWhlYWRlciB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIGF1dG87IGNvbHVtbi1nYXA6IHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1Db2x1bW5HYXApOyByb3ctZ2FwOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUm93R2FwKTsgYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZzogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLVBhZGRpbmdUb3ApIHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nUmlnaHQpIHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nQm90dG9tKSB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUGFkZGluZ0xlZnQpOyB9CkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbl9fbWFpbi1oZWFkZXIgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDEwMCU7IH0gfQoucGYtYy1sb2dpbl9fbWFpbi1oZWFkZXIgLnBmLWMtZHJvcGRvd24geyBncmlkLWNvbHVtbjogMiAvIDM7IGdyaWQtcm93OiAxOyB9CkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbl9fbWFpbi1oZWFkZXIgLnBmLWMtZHJvcGRvd24geyBncmlkLWNvbHVtbjogYXV0bzsgZ3JpZC1yb3c6IGF1dG87IH0gfQoKLnBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MgeyBtYXJnaW4tYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci1kZXNjLS1NYXJnaW5Cb3R0b20pOyBmb250LXNpemU6IHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MtLUZvbnRTaXplKTsgZ3JpZC1jb2x1bW46IDEgLyAtMTsgfQoKLnBmLWMtbG9naW5fX21haW4tYm9keSB7IHBhZGRpbmctcmlnaHQ6IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tUGFkZGluZ1JpZ2h0KTsgcGFkZGluZy1ib3R0b206IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tUGFkZGluZ0JvdHRvbSk7IHBhZGRpbmctbGVmdDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nTGVmdCk7IH0KLnBmLWMtbG9naW5fX21haW4tYm9keSAucGYtYy1mb3JtX19oZWxwZXItdGV4dCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KLnBmLWMtbG9naW5fX21haW4tYm9keSAucGYtYy1mb3JtX19oZWxwZXItdGV4dCAucGYtYy1mb3JtX19oZWxwZXItdGV4dC1pY29uIHsgbWFyZ2luLXJpZ2h0OiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWJvZHktLWMtZm9ybV9faGVscGVyLXRleHQtaWNvbi0tTWFyZ2luUmlnaHQpOyBmb250LXNpemU6IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tYy1mb3JtX19oZWxwZXItdGV4dC1pY29uLS1Gb250U2l6ZSk7IH0KCi5wZi1jLWxvZ2luX19tYWluLWZvb3RlciB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgfQoucGYtYy1sb2dpbl9fbWFpbi1mb290ZXIgLnBmLWMtdGl0bGUgeyBtYXJnaW4tYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci0tYy10aXRsZS0tTWFyZ2luQm90dG9tKTsgdGV4dC1hbGlnbjogY2VudGVyOyB9Ci5wZi1jLWxvZ2luX19tYWluLWZvb3RlciA+ICogeyBmbGV4LWJhc2lzOiAxMDAlOyB9CgoucGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBwYWRkaW5nOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy0tUGFkZGluZ1RvcCkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtLVBhZGRpbmdSaWdodCkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtLVBhZGRpbmdCb3R0b20pIHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nTGVmdCk7IH0KCi5wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtIHsgcGFkZGluZy1yaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS0tUGFkZGluZ1JpZ2h0KTsgcGFkZGluZy1sZWZ0OiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLS1QYWRkaW5nTGVmdCk7IG1hcmdpbi1ib3R0b206IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tLU1hcmdpbkJvdHRvbSk7IH0KCi5wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmsgc3ZnIHsgZmlsbDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS1saW5rLXN2Zy0tRmlsbCk7IHdpZHRoOiAxMDAlOyBtYXgtd2lkdGg6IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tbGluay1zdmctLVdpZHRoKTsgaGVpZ2h0OiAxMDAlOyBtYXgtaGVpZ2h0OiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1IZWlnaHQpOyB9Ci5wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbms6aG92ZXIgc3ZnIHsgZmlsbDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS1saW5rLXN2Zy0taG92ZXItLUZpbGwpOyB9CgoucGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZCB7IHBhZGRpbmc6IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtLVBhZGRpbmdUb3ApIHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtLVBhZGRpbmdSaWdodCkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ0JvdHRvbSkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ0xlZnQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQgPiAqICsgKiB7IHBhZGRpbmctdG9wOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLWl0ZW0tLVBhZGRpbmdUb3ApOyB9CgoucGYtYy1sb2dpbl9fZm9vdGVyIHsgY29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IGdyaWQtYXJlYTogZm9vdGVyOyB9CkBtZWRpYSAobWF4LXdpZHRoOiA1NzZweCkgeyAucGYtYy1sb2dpbl9fZm9vdGVyIHsgcGFkZGluZy1yaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1zbS0tUGFkZGluZ1JpZ2h0KTsgcGFkZGluZy1sZWZ0OiB2YXIoLS1wZi1jLWxvZ2luX19mb290ZXItLXNtLS1QYWRkaW5nTGVmdCk7IH0gfQoucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWxpc3QgYSB7IGNvbG9yOiB1bnNldDsgfQoucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWxpc3Q6bm90KDpvbmx5LWNoaWxkKSB7IHBhZGRpbmctdG9wOiB2YXIoLS1wZi1jLWxvZ2luX19mb290ZXItLWMtbGlzdC0tUGFkZGluZ1RvcCk7IH0KCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay0xMDApOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREkwTGpBdU1pd2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SWt4aGVXVnlYekVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZUcxc2JuTTZlR3hwYm1zOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2ZUd4cGJtc2lJSGc5SWpCd2VDSWdlVDBpTUhCNElnb0pJSGRwWkhSb1BTSXhPVEp3ZUNJZ2FHVnBaMmgwUFNJeE5EVndlQ0lnZG1sbGQwSnZlRDBpTUNBd0lERTVNaUF4TkRVaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURFNU1pQXhORFU3SWlCNGJXdzZjM0JoWTJVOUluQnlaWE5sY25abElqNEtQSE4wZVd4bElIUjVjR1U5SW5SbGVIUXZZM056SWo0S0NTNXpkREI3Wm1sc2JEb2pNREl3TXpBek8zMEtQQzl6ZEhsc1pUNEtQR2MrQ2drOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NVEkzTGpVc09ETXVOV014TWk0MUxEQXNNekF1TmkweUxqWXNNekF1TmkweE55NDFZekF0TVM0eUxEQXRNaTR6TFRBdU15MHpMalJzTFRjdU5DMHpNaTQwWXkweExqY3ROeTR4TFRNdU1pMHhNQzR6TFRFMUxqY3RNVFl1TmdvSkNXTXRPUzQzTFRVdE16QXVPQzB4TXk0eExUTTNMakV0TVRNdU1VTTVNUzQzTERBdU5TdzVNQ3c0TERnekxqRXNPR010Tmk0M0xEQXRNVEV1TmkwMUxqWXRNVGN1T1MwMUxqWmpMVFlzTUMwNUxqa3NOQzR4TFRFeUxqa3NNVEl1TldNd0xEQXRPQzQwTERJekxqY3RPUzQxTERJM0xqSUtDUWxqTFRBdU1pd3dMall0TUM0eUxERXVOQzB3TGpJc01TNDVRelF5TGpVc05UTXVNeXczT0M0NExEZ3pMalVzTVRJM0xqVXNPRE11TlNCTk1UWXdMRGN5TGpGak1TNDNMRGd1TWl3eExqY3NPUzR4TERFdU55d3hNQzR4WXpBc01UUXRNVFV1Tnl3eU1TNDRMVE0yTGpRc01qRXVPQW9KQ1dNdE5EWXVPQ3d3TFRnM0xqY3RNamN1TkMwNE55NDNMVFExTGpWak1DMHlMamdzTUM0MkxUVXVOQ3d4TGpVdE55NHpRekl5TGpNc05USXNNQzQxTERVMUxEQXVOU3czTkM0eVl6QXNNekV1TlN3M05DNDJMRGN3TGpNc01UTXpMamNzTnpBdU13b0pDV00wTlM0ekxEQXNOVFl1TnkweU1DNDFMRFUyTGpjdE16WXVOa014T1RBdU9DdzVOUzR4TERFM09TNDVMRGd3TGpjc01UWXdMRGN5TGpFaUx6NEtQQzluUGdvOEwzTjJaejRLKTsgYmFja2dyb3VuZC1wb3NpdGlvbjogMTEwJSAxMDUlOyBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXNpemU6IDkwJTsgfQpAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHsgYm9keSB7IGJhY2tncm91bmQtc2l6ZTogODAlOyB9IH0KQG1lZGlhIChtaW4td2lkdGg6IDEwMDBweCkgeyBib2R5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMTEwJSAxMDAlOyBiYWNrZ3JvdW5kLXNpemU6IDcwJTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsgYm9keSB7IGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgNzAlOyBiYWNrZ3JvdW5kLXNpemU6IDcwJTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAxNDAwcHgpIHsgYm9keSB7IGJhY2tncm91bmQtc2l6ZTogNzUlOyB9IH0KQG1lZGlhIChtaW4td2lkdGg6IDE4MDBweCkgeyBib2R5IHsgYmFja2dyb3VuZC1zaXplOiA3MCU7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogMTgwMHB4KSB7IGJvZHkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA3NSUgODAlOyBiYWNrZ3JvdW5kLXNpemU6IDYwJTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAyMjAwcHgpIHsgYm9keSB7IGJhY2tncm91bmQtc2l6ZTogNTAlOyB9IH0KCkBtZWRpYSAobWF4LXdpZHRoOiAxMTk5cHgpIHsgLnBmLWMtbG9naW5fX2NvbnRhaW5lciB7IHdpZHRoOiAxMDAlOyB9IH0KLnBmLWMtbG9naW5fX21haW4tYm9keSB7IHBhZGRpbmctYm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKSAhaW1wb3J0YW50OyB9CgpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWJyYW5kIHsgaGVpZ2h0OiA2MHB4OyB9IH0KLnBmLWMtZm9ybSB7IC0tcGYtYy1mb3JtLS1HcmlkR2FwOiB2YXIoLS1wZi1nbG9iYWwtLWd1dHRlcik7IC0tcGYtYy1mb3JtX19sYWJlbC0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1mb3JtX19sYWJlbC0tRm9udFdlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1ub3JtYWwpOyAtLXBmLWMtZm9ybV9fbGFiZWwtLUZvbnRTaXplOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRTaXplLS1zbSk7IC0tcGYtYy1mb3JtX19sYWJlbC0tTGluZUhlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1MaW5lSGVpZ2h0LS1zbSk7IC0tcGYtYy1mb3JtX19sYWJlbC0tUGFkZGluZ1RvcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKTsgLS1wZi1jLWZvcm1fX2xhYmVsLS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tc20pOyAtLXBmLWMtZm9ybV9fbGFiZWwtLW0tZGlzYWJsZWQtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWRpc2FibGVkLWNvbG9yLS0xMDApOyAtLXBmLWMtZm9ybV9fbGFiZWwtdGV4dC0tRm9udFdlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1ib2xkKTsgLS1wZi1jLWZvcm1fX2xhYmVsLXJlcXVpcmVkLS1NYXJnaW5MZWZ0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teHMpOyAtLXBmLWMtZm9ybV9fbGFiZWwtcmVxdWlyZWQtLUZvbnRTaXplOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRTaXplLS1zbSk7IC0tcGYtYy1mb3JtX19sYWJlbC1yZXF1aXJlZC0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tZGFuZ2VyLWNvbG9yLS0xMDApOyAtLXBmLWMtZm9ybV9fZ3JvdXAtLU1hcmdpbkxlZnQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1zbSk7IC0tcGYtYy1mb3JtLS1tLWhvcml6b250YWwtLW1kX19ncm91cC0tR3JpZFRlbXBsYXRlQ29sdW1uczogMTUwcHggMWZyOyAtLXBmLWMtZm9ybV9fZ3JvdXAtLW0tYWN0aW9uLS1NYXJnaW5Ub3A6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS14bCk7IC0tcGYtYy1mb3JtX19hY3Rpb25zLS1jaGlsZC0tTWFyZ2luVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tc20pOyAtLXBmLWMtZm9ybV9fYWN0aW9ucy0tY2hpbGQtLU1hcmdpblJpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tc20pOyAtLXBmLWMtZm9ybV9fYWN0aW9ucy0tY2hpbGQtLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKTsgLS1wZi1jLWZvcm1fX2FjdGlvbnMtLWNoaWxkLS1NYXJnaW5MZWZ0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tc20pOyAtLXBmLWMtZm9ybV9fYWN0aW9ucy0tTWFyZ2luVG9wOiBjYWxjKHZhcigtLXBmLWMtZm9ybV9fYWN0aW9ucy0tY2hpbGQtLU1hcmdpblRvcCkgKiAtMSk7IC0tcGYtYy1mb3JtX19hY3Rpb25zLS1NYXJnaW5SaWdodDogY2FsYyh2YXIoLS1wZi1jLWZvcm1fX2FjdGlvbnMtLWNoaWxkLS1NYXJnaW5SaWdodCkgKiAtMSk7IC0tcGYtYy1mb3JtX19hY3Rpb25zLS1NYXJnaW5Cb3R0b206IGNhbGModmFyKC0tcGYtYy1mb3JtX19hY3Rpb25zLS1jaGlsZC0tTWFyZ2luQm90dG9tKSAqIC0xKTsgLS1wZi1jLWZvcm1fX2FjdGlvbnMtLU1hcmdpbkxlZnQ6IGNhbGModmFyKC0tcGYtYy1mb3JtX19hY3Rpb25zLS1jaGlsZC0tTWFyZ2luTGVmdCkgKiAtMSk7IC0tcGYtYy1mb3JtX19oZWxwZXItdGV4dC0tTWFyZ2luVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teHMpOyAtLXBmLWMtZm9ybV9faGVscGVyLXRleHQtLUZvbnRTaXplOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRTaXplLS1zbSk7IC0tcGYtYy1mb3JtX19oZWxwZXItdGV4dC0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1mb3JtLS1tLWlubGluZS0tTWFyZ2luUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1sZyk7IC0tcGYtYy1mb3JtLS1tLWVycm9yLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1kYW5nZXItY29sb3ItLTEwMCk7IC0tcGYtYy1mb3JtLS1tLXN1Y2Nlc3MtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXN1Y2Nlc3MtY29sb3ItLTIwMCk7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtZ2FwOiB2YXIoLS1wZi1jLWZvcm0tLUdyaWRHYXApOyB9Ci5wZi1jLWZvcm0ucGYtbS1ob3Jpem9udGFsLnBmLW0tYWxpZ24tcmlnaHQgLnBmLWMtZm9ybV9fbGFiZWwgeyB0ZXh0LWFsaWduOiByaWdodDsgfQoucGYtYy1mb3JtLnBmLW0taG9yaXpvbnRhbCAucGYtYy1mb3JtX19ncm91cCB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtY29sdW1uLWdhcDogdmFyKC0tcGYtYy1mb3JtLS1HcmlkR2FwKTsgfQoucGYtYy1mb3JtLnBmLW0taG9yaXpvbnRhbCAucGYtYy1mb3JtX19ncm91cCAucGYtYy1mb3JtLWNvbnRyb2wgeyBhbGlnbi1zZWxmOiBzdGFydDsgfQpAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHsgLnBmLWMtZm9ybS5wZi1tLWhvcml6b250YWwgLnBmLWMtZm9ybV9fZ3JvdXAgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLXBmLWMtZm9ybS0tbS1ob3Jpem9udGFsLS1tZF9fZ3JvdXAtLUdyaWRUZW1wbGF0ZUNvbHVtbnMpOyB9CiAgLnBmLWMtZm9ybS5wZi1tLWhvcml6b250YWwgLnBmLWMtZm9ybV9fZ3JvdXAgLnBmLWMtZm9ybV9fbGFiZWwgeyBwYWRkaW5nLXRvcDogdmFyKC0tcGYtYy1mb3JtX19sYWJlbC0tUGFkZGluZ1RvcCk7IHBhZGRpbmctYm90dG9tOiAwOyB9CiAgLnBmLWMtZm9ybS5wZi1tLWhvcml6b250YWwgLnBmLWMtZm9ybV9fZ3JvdXAgLnBmLWMtZm9ybV9fbGFiZWwucGYtbS1uby1wYWRkaW5nLXRvcCB7IC0tcGYtYy1mb3JtX19sYWJlbC0tUGFkZGluZ1RvcDogMDsgfQogIC5wZi1jLWZvcm0ucGYtbS1ob3Jpem9udGFsIC5wZi1jLWZvcm0tY29udHJvbCwgLnBmLWMtZm9ybS5wZi1tLWhvcml6b250YWwgLnBmLWMtZm9ybV9faG9yaXpvbnRhbC1ncm91cCwgLnBmLWMtZm9ybS5wZi1tLWhvcml6b250YWwgLnBmLWMtZm9ybV9faGVscGVyLXRleHQsIC5wZi1jLWZvcm0ucGYtbS1ob3Jpem9udGFsIC5wZi1jLWNoZWNrIHsgZ3JpZC1jb2x1bW4tc3RhcnQ6IDI7IH0gfQoKLnBmLWMtZm9ybV9fZ3JvdXAucGYtbS1hY3Rpb24geyBtYXJnaW4tdG9wOiB2YXIoLS1wZi1jLWZvcm1fX2dyb3VwLS1tLWFjdGlvbi0tTWFyZ2luVG9wKTsgfQoucGYtYy1mb3JtX19ncm91cC5wZi1tLWlubGluZSB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZmxvdzogcm93IHdyYXA7IH0KLnBmLWMtZm9ybV9fZ3JvdXAucGYtbS1pbmxpbmUgLnBmLWMtZm9ybV9fbGFiZWwgeyBmbGV4LWJhc2lzOiAxMDAlOyB9Ci5wZi1jLWZvcm1fX2dyb3VwLnBmLW0taW5saW5lID4gKjpub3QoLnBmLWMtZm9ybV9fbGFiZWwpIHsgZmxleDogYXV0byAwOyBtYXJnaW4tcmlnaHQ6IHZhcigtLXBmLWMtZm9ybS0tbS1pbmxpbmUtLU1hcmdpblJpZ2h0KTsgfQoucGYtYy1mb3JtX19ncm91cCAucGYtYy1mb3JtX19sYWJlbCB7IHBhZGRpbmctYm90dG9tOiB2YXIoLS1wZi1jLWZvcm1fX2xhYmVsLS1QYWRkaW5nQm90dG9tKTsgfQoucGYtYy1mb3JtX19ncm91cCAucGYtYy1mb3JtX19oZWxwZXItdGV4dCB7IG1hcmdpbi10b3A6IHZhcigtLXBmLWMtZm9ybV9faGVscGVyLXRleHQtLU1hcmdpblRvcCk7IH0KCi5wZi1jLWZvcm1fX2xhYmVsIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IHZhcigtLXBmLWMtZm9ybV9fbGFiZWwtLUZvbnRTaXplKTsgZm9udC13ZWlnaHQ6IHZhcigtLXBmLWMtZm9ybV9fbGFiZWwtLUZvbnRXZWlnaHQpOyBsaW5lLWhlaWdodDogdmFyKC0tcGYtYy1mb3JtX19sYWJlbC0tTGluZUhlaWdodCk7IGNvbG9yOiB2YXIoLS1wZi1jLWZvcm1fX2xhYmVsLS1Db2xvcik7IH0KLnBmLWMtZm9ybV9fbGFiZWw6OnNlbGVjdGlvbiB7IGJhY2tncm91bmQtY29sb3I6IG5vbmU7IH0KLnBmLWMtZm9ybV9fbGFiZWw6bm90KC5wZi1tLWRpc2FibGVkKTpob3ZlciB7IGN1cnNvcjogcG9pbnRlcjsgfQoucGYtYy1mb3JtX19sYWJlbC5wZi1tLWRpc2FibGVkIHsgLS1wZi1jLWZvcm1fX2xhYmVsLS1Db2xvcjogdmFyKC0tcGYtYy1mb3JtX19sYWJlbC0tbS1kaXNhYmxlZC0tQ29sb3IpOyB9Ci5wZi1jLWZvcm1fX2xhYmVsLnBmLW0tZGlzYWJsZWQ6aG92ZXIgeyBjdXJzb3I6IG5vdC1hbGxvd2VkOyB9CgoucGYtYy1mb3JtX19sYWJlbC10ZXh0IHsgZm9udC13ZWlnaHQ6IHZhcigtLXBmLWMtZm9ybV9fbGFiZWwtdGV4dC0tRm9udFdlaWdodCk7IH0KCi5wZi1jLWZvcm1fX2xhYmVsLXJlcXVpcmVkIHsgbWFyZ2luLWxlZnQ6IHZhcigtLXBmLWMtZm9ybV9fbGFiZWwtcmVxdWlyZWQtLU1hcmdpbkxlZnQpOyBmb250LXNpemU6IHZhcigtLXBmLWMtZm9ybV9fbGFiZWwtcmVxdWlyZWQtLUZvbnRTaXplKTsgY29sb3I6IHZhcigtLXBmLWMtZm9ybV9fbGFiZWwtcmVxdWlyZWQtLUNvbG9yKTsgfQoKLnBmLWMtZm9ybV9faGVscGVyLXRleHQgeyBmb250LXNpemU6IHZhcigtLXBmLWMtZm9ybV9faGVscGVyLXRleHQtLUZvbnRTaXplKTsgY29sb3I6IHZhcigtLXBmLWMtZm9ybV9faGVscGVyLXRleHQtLUNvbG9yKTsgfQoucGYtYy1mb3JtX19oZWxwZXItdGV4dC5wZi1tLWVycm9yIHsgLS1wZi1jLWZvcm1fX2hlbHBlci10ZXh0LS1Db2xvcjogdmFyKC0tcGYtYy1mb3JtLS1tLWVycm9yLS1Db2xvcik7IH0KLnBmLWMtZm9ybV9faGVscGVyLXRleHQucGYtbS1zdWNjZXNzIHsgLS1wZi1jLWZvcm1fX2hlbHBlci10ZXh0LS1Db2xvcjogdmFyKC0tcGYtYy1mb3JtLS1tLXN1Y2Nlc3MtLUNvbG9yKTsgfQoucGYtYy1mb3JtX19oZWxwZXItdGV4dC5wZi1tLWluYWN0aXZlIHsgZGlzcGxheTogbm9uZTsgdmlzaWJpbGl0eTogaGlkZGVuOyB9Ci5wZi1jLWZvcm1fX2hlbHBlci10ZXh0LnBmLW0taGlkZGVuIHsgdmlzaWJpbGl0eTogaGlkZGVuOyBvcGFjaXR5OiAwOyB9CgoucGYtYy1mb3JtX19maWVsZHNldCB7IGJvcmRlcjogMDsgfQoKLnBmLWMtZm9ybV9fYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgbWFyZ2luLXRvcDogdmFyKC0tcGYtYy1mb3JtX19hY3Rpb25zLS1NYXJnaW5Ub3ApOyBtYXJnaW4tcmlnaHQ6IHZhcigtLXBmLWMtZm9ybV9fYWN0aW9ucy0tTWFyZ2luUmlnaHQpOyBtYXJnaW4tYm90dG9tOiB2YXIoLS1wZi1jLWZvcm1fX2FjdGlvbnMtLU1hcmdpbkJvdHRvbSk7IG1hcmdpbi1sZWZ0OiB2YXIoLS1wZi1jLWZvcm1fX2FjdGlvbnMtLU1hcmdpbkxlZnQpOyBvdmVyZmxvdzogaGlkZGVuOyB9Ci5wZi1jLWZvcm1fX2FjdGlvbnMgPiAqIHsgbWFyZ2luLXRvcDogdmFyKC0tcGYtYy1mb3JtX19hY3Rpb25zLS1jaGlsZC0tTWFyZ2luVG9wKTsgbWFyZ2luLXJpZ2h0OiB2YXIoLS1wZi1jLWZvcm1fX2FjdGlvbnMtLWNoaWxkLS1NYXJnaW5SaWdodCk7IG1hcmdpbi1ib3R0b206IHZhcigtLXBmLWMtZm9ybV9fYWN0aW9ucy0tY2hpbGQtLU1hcmdpbkJvdHRvbSk7IG1hcmdpbi1sZWZ0OiB2YXIoLS1wZi1jLWZvcm1fX2FjdGlvbnMtLWNoaWxkLS1NYXJnaW5MZWZ0KTsgfQoKLnBmLWMtZm9ybS1jb250cm9sIHsgLS1wZi1jLWZvcm0tY29udHJvbC0tRm9udFNpemU6IHZhcigtLXBmLWdsb2JhbC0tRm9udFNpemUtLW1kKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tTGluZUhlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1MaW5lSGVpZ2h0LS1tZCk7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLUJvcmRlcldpZHRoOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlcldpZHRoLS1zbSk7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLUJvcmRlclRvcENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlckNvbG9yLS0zMDApOyAtLXBmLWMtZm9ybS1jb250cm9sLS1Cb3JkZXJSaWdodENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlckNvbG9yLS0zMDApOyAtLXBmLWMtZm9ybS1jb250cm9sLS1Cb3JkZXJCb3R0b21Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tMjAwKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tQm9yZGVyTGVmdENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlckNvbG9yLS0zMDApOyAtLXBmLWMtZm9ybS1jb250cm9sLS1Cb3JkZXJSYWRpdXM6IDA7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLTEwMCk7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLUhlaWdodDogY2FsYyh2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tRm9udFNpemUpICogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLUxpbmVIZWlnaHQpICsgdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLUJvcmRlcldpZHRoKSAqIDIgKyB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ1RvcCkgKyB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ0JvdHRvbSkpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1QYWRkaW5nVG9wOiBjYWxjKHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1mb3JtLWVsZW1lbnQpIC0gdmFyKC0tcGYtZ2xvYmFsLS1Cb3JkZXJXaWR0aC0tc20pKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ0JvdHRvbTogY2FsYyh2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tZm9ybS1lbGVtZW50KSAtIHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLXNtKSk7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLVBhZGRpbmdSaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ0xlZnQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1zbSk7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLWhvdmVyLS1Cb3JkZXJCb3R0b21Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtZm9ybS1jb250cm9sLS1mb2N1cy0tQm9yZGVyQm90dG9tV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLW1kKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tZm9jdXMtLVBhZGRpbmdCb3R0b206IGNhbGModmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLWZvcm0tZWxlbWVudCkgLSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tZm9jdXMtLUJvcmRlckJvdHRvbVdpZHRoKSk7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLWZvY3VzLS1Cb3JkZXJCb3R0b21Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtZm9ybS1jb250cm9sLS1wbGFjZWhvbGRlci0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLWRhcmstMjAwKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tZGlzYWJsZWQtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWRpc2FibGVkLWNvbG9yLS0xMDApOyAtLXBmLWMtZm9ybS1jb250cm9sLS1kaXNhYmxlZC0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWRpc2FibGVkLWNvbG9yLS0zMDApOyAtLXBmLWMtZm9ybS1jb250cm9sLS1kaXNhYmxlZC0tQm9yZGVyQ29sb3I6IHRyYW5zcGFyZW50OyAtLXBmLWMtZm9ybS1jb250cm9sLS1yZWFkb25seS0tZm9jdXMtLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1kaXNhYmxlZC1jb2xvci0tMzAwKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tcmVhZG9ubHktLWZvY3VzLS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ0JvdHRvbSk7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLXJlYWRvbmx5LS1mb2N1cy0tQm9yZGVyQm90dG9tV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLXNtKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tcmVhZG9ubHktLWZvY3VzLS1Cb3JkZXJCb3R0b21Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1kaXNhYmxlZC1jb2xvci0tMTAwKTsgLS1wZi1jLWZvcm0tY29udHJvbC0taW52YWxpZC0tQm9yZGVyQm90dG9tV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLW1kKTsgLS1wZi1jLWZvcm0tY29udHJvbC0taW52YWxpZC0tUGFkZGluZ0JvdHRvbTogY2FsYyh2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tZm9ybS1lbGVtZW50KSAtIHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1pbnZhbGlkLS1Cb3JkZXJCb3R0b21XaWR0aCkpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1pbnZhbGlkLS1Cb3JkZXJCb3R0b21Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1kYW5nZXItY29sb3ItLTEwMCk7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLWludmFsaWQtLVBhZGRpbmdSaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXhsKTsgLS1wZi1jLWZvcm0tY29udHJvbC0taW52YWxpZC0tQmFja2dyb3VuZFBvc2l0aW9uOiBjYWxjKDEwMCUgLSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ0xlZnQpKSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ0xlZnQpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1pbnZhbGlkLS1CYWNrZ3JvdW5kU2l6ZTogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLUZvbnRTaXplKSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tRm9udFNpemUpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1pbnZhbGlkLS1CYWNrZ3JvdW5kVXJsOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0ZjgsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDUxMiA1MTInJTNFJTNDcGF0aCBmaWxsPSclMjNjOTE5MGInIGQ9J001MDQgMjU2YzAgMTM2Ljk5Ny0xMTEuMDQzIDI0OC0yNDggMjQ4UzggMzkyLjk5NyA4IDI1NkM4IDExOS4wODMgMTE5LjA0MyA4IDI1NiA4czI0OCAxMTEuMDgzIDI0OCAyNDh6bS0yNDggNTBjLTI1LjQwNSAwLTQ2IDIwLjU5NS00NiA0NnMyMC41OTUgNDYgNDYgNDYgNDYtMjAuNTk1IDQ2LTQ2LTIwLjU5NS00Ni00Ni00NnptLTQzLjY3My0xNjUuMzQ2bDcuNDE4IDEzNmMuMzQ3IDYuMzY0IDUuNjA5IDExLjM0NiAxMS45ODIgMTEuMzQ2aDQ4LjU0NmM2LjM3MyAwIDExLjYzNS00Ljk4MiAxMS45ODItMTEuMzQ2bDcuNDE4LTEzNmMuMzc1LTYuODc0LTUuMDk4LTEyLjY1NC0xMS45ODItMTIuNjU0aC02My4zODNjLTYuODg0IDAtMTIuMzU2IDUuNzgtMTEuOTgxIDEyLjY1NHonLyUzRSUzQy9zdmclM0UiKTsgLS1wZi1jLWZvcm0tY29udHJvbC0taW52YWxpZC0tZXhjbGFtYXRpb24tLUJhY2tncm91bmQ6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1pbnZhbGlkLS1CYWNrZ3JvdW5kVXJsKSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0taW52YWxpZC0tQmFja2dyb3VuZFBvc2l0aW9uKSAvIHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1pbnZhbGlkLS1CYWNrZ3JvdW5kU2l6ZSkgbm8tcmVwZWF0OyAtLXBmLWMtZm9ybS1jb250cm9sLS1pbnZhbGlkLS1CYWNrZ3JvdW5kOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tQmFja2dyb3VuZENvbG9yKSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0taW52YWxpZC0tZXhjbGFtYXRpb24tLUJhY2tncm91bmQpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1zdWNjZXNzLS1Cb3JkZXJCb3R0b21XaWR0aDogdmFyKC0tcGYtZ2xvYmFsLS1Cb3JkZXJXaWR0aC0tbWQpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1zdWNjZXNzLS1QYWRkaW5nQm90dG9tOiBjYWxjKHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1mb3JtLWVsZW1lbnQpIC0gdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLXN1Y2Nlc3MtLUJvcmRlckJvdHRvbVdpZHRoKSk7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLXN1Y2Nlc3MtLUJvcmRlckJvdHRvbUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXN1Y2Nlc3MtY29sb3ItLTEwMCk7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLXN1Y2Nlc3MtLVBhZGRpbmdSaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXhsKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tc3VjY2Vzcy0tQmFja2dyb3VuZFBvc2l0aW9uOiBjYWxjKDEwMCUgLSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ0xlZnQpKSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ0xlZnQpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1zdWNjZXNzLS1CYWNrZ3JvdW5kU2l6ZTogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLUZvbnRTaXplKSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tRm9udFNpemUpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1zdWNjZXNzLS1CYWNrZ3JvdW5kVXJsOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0ZjgsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDUxMiA1MTInJTNFJTNDcGF0aCBmaWxsPSclMjM5MmQ0MDAnIGQ9J001MDQgMjU2YzAgMTM2Ljk2Ny0xMTEuMDMzIDI0OC0yNDggMjQ4UzggMzkyLjk2NyA4IDI1NiAxMTkuMDMzIDggMjU2IDhzMjQ4IDExMS4wMzMgMjQ4IDI0OHpNMjI3LjMxNCAzODcuMzE0bDE4NC0xODRjNi4yNDgtNi4yNDggNi4yNDgtMTYuMzc5IDAtMjIuNjI3bC0yMi42MjctMjIuNjI3Yy02LjI0OC02LjI0OS0xNi4zNzktNi4yNDktMjIuNjI4IDBMMjE2IDMwOC4xMThsLTcwLjA1OS03MC4wNTljLTYuMjQ4LTYuMjQ4LTE2LjM3OS02LjI0OC0yMi42MjggMGwtMjIuNjI3IDIyLjYyN2MtNi4yNDggNi4yNDgtNi4yNDggMTYuMzc5IDAgMjIuNjI3bDEwNCAxMDRjNi4yNDkgNi4yNDkgMTYuMzc5IDYuMjQ5IDIyLjYyOC4wMDF6Jy8lM0UlM0Mvc3ZnJTNFIik7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLXN1Y2Nlc3MtLWNoZWNrLS1CYWNrZ3JvdW5kOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tc3VjY2Vzcy0tQmFja2dyb3VuZFVybCkgdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLXN1Y2Nlc3MtLUJhY2tncm91bmRQb3NpdGlvbikgLyB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tc3VjY2Vzcy0tQmFja2dyb3VuZFNpemUpIG5vLXJlcGVhdDsgLS1wZi1jLWZvcm0tY29udHJvbC0tc3VjY2Vzcy0tQmFja2dyb3VuZDogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLUJhY2tncm91bmRDb2xvcikgdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLXN1Y2Nlc3MtLWNoZWNrLS1CYWNrZ3JvdW5kKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tbS1zZWFyY2gtLVBhZGRpbmdMZWZ0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teGwpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1tLXNlYXJjaC0tQmFja2dyb3VuZFBvc2l0aW9uOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ0xlZnQpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1tLXNlYXJjaC0tQmFja2dyb3VuZFNpemU6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1Gb250U2l6ZSkgdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLUZvbnRTaXplKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tbS1zZWFyY2gtLUJhY2tncm91bmRVcmw6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgNTEyIDUxMiclM0UlM0NwYXRoIGZpbGw9JyUyMzczNzY3OScgZD0nTTUwNSA0NDIuN0w0MDUuMyAzNDNjLTQuNS00LjUtMTAuNi03LTE3LTdIMzcyYzI3LjYtMzUuMyA0NC03OS43IDQ0LTEyOEM0MTYgOTMuMSAzMjIuOSAwIDIwOCAwUzAgOTMuMSAwIDIwOHM5My4xIDIwOCAyMDggMjA4YzQ4LjMgMCA5Mi43LTE2LjQgMTI4LTQ0djE2LjNjMCA2LjQgMi41IDEyLjUgNyAxN2w5OS43IDk5LjdjOS40IDkuNCAyNC42IDkuNCAzMy45IDBsMjguMy0yOC4zYzkuNC05LjQgOS40LTI0LjYuMS0zNHpNMjA4IDMzNmMtNzAuNyAwLTEyOC01Ny4yLTEyOC0xMjggMC03MC43IDU3LjItMTI4IDEyOC0xMjggNzAuNyAwIDEyOCA1Ny4yIDEyOCAxMjggMCA3MC43LTU3LjIgMTI4LTEyOCAxMjh6Jy8lM0UlM0Mvc3ZnJTNFIik7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLW0tc2VhcmNoLS1CYWNrZ3JvdW5kOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tbS1zZWFyY2gtLUJhY2tncm91bmRVcmwpIHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1tLXNlYXJjaC0tQmFja2dyb3VuZFBvc2l0aW9uKSAvIHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1tLXNlYXJjaC0tQmFja2dyb3VuZFNpemUpIG5vLXJlcGVhdDsgLS1wZi1jLWZvcm0tY29udHJvbF9fc2VsZWN0LS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1sZyk7IC0tcGYtYy1mb3JtLWNvbnRyb2xfX3NlbGVjdC0tQmFja2dyb3VuZFVybDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGY4LCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAzMjAgNTEyJyUzRSUzQ3BhdGggZmlsbD0nJTIzdXJyZW50Q29sb3InIGQ9J00zMS4zIDE5MmgyNTcuM2MxNy44IDAgMjYuNyAyMS41IDE0LjEgMzQuMUwxNzQuMSAzNTQuOGMtNy44IDcuOC0yMC41IDcuOC0yOC4zIDBMMTcuMiAyMjYuMUM0LjYgMjEzLjUgMTMuNSAxOTIgMzEuMyAxOTJ6Jy8lM0UlM0Mvc3ZnJTNFIik7IC0tcGYtYy1mb3JtLWNvbnRyb2xfX3NlbGVjdC0tQmFja2dyb3VuZFNpemU6IDAuODc1cmVtOyAtLXBmLWMtZm9ybS1jb250cm9sX19zZWxlY3QtLUJhY2tncm91bmRQb3NpdGlvbjogY2FsYygxMDAlIC0gdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKSkgY2VudGVyOyAtLXBmLWMtZm9ybS1jb250cm9sX19zZWxlY3QtLWFycm93LS1CYWNrZ3JvdW5kOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tQmFja2dyb3VuZENvbG9yKSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbF9fc2VsZWN0LS1CYWNrZ3JvdW5kVXJsKSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbF9fc2VsZWN0LS1CYWNrZ3JvdW5kUG9zaXRpb24pIC8gdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2xfX3NlbGVjdC0tQmFja2dyb3VuZFNpemUpIG5vLXJlcGVhdDsgLS1wZi1jLWZvcm0tY29udHJvbF9fc2VsZWN0LS1CYWNrZ3JvdW5kOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbF9fc2VsZWN0LS1hcnJvdy0tQmFja2dyb3VuZCk7IC0tcGYtYy1mb3JtLWNvbnRyb2xfX3NlbGVjdC0taW52YWxpZC0tQmFja2dyb3VuZDogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLWludmFsaWQtLWV4Y2xhbWF0aW9uLS1CYWNrZ3JvdW5kKSwgdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2xfX3NlbGVjdC0tYXJyb3ctLUJhY2tncm91bmQpOyAtLXBmLWMtZm9ybS1jb250cm9sX19zZWxlY3QtLWludmFsaWQtLVBhZGRpbmdSaWdodDogY2FsYyh2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tc20pICsgdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCkpOyAtLXBmLWMtZm9ybS1jb250cm9sX19zZWxlY3QtLXN1Y2Nlc3MtLUJhY2tncm91bmQ6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1zdWNjZXNzLS1jaGVjay0tQmFja2dyb3VuZCksIHZhcigtLXBmLWMtZm9ybS1jb250cm9sX19zZWxlY3QtLWFycm93LS1CYWNrZ3JvdW5kKTsgLS1wZi1jLWZvcm0tY29udHJvbF9fc2VsZWN0LS1zdWNjZXNzLS1QYWRkaW5nUmlnaHQ6IGNhbGModmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKSArIHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS0yeGwpKTsgY29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ1RvcCkgdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLVBhZGRpbmdSaWdodCkgdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLVBhZGRpbmdCb3R0b20pIHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1QYWRkaW5nTGVmdCk7IGZvbnQtc2l6ZTogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLUZvbnRTaXplKTsgbGluZS1oZWlnaHQ6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1MaW5lSGVpZ2h0KTsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLUJhY2tncm91bmRDb2xvcik7IGJvcmRlcjogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLUJvcmRlcldpZHRoKSBzb2xpZDsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tQm9yZGVyVG9wQ29sb3IpIHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1Cb3JkZXJSaWdodENvbG9yKSB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tQm9yZGVyQm90dG9tQ29sb3IpIHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1Cb3JkZXJMZWZ0Q29sb3IpOyBib3JkZXItcmFkaXVzOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tQm9yZGVyUmFkaXVzKTsgLW1vei1hcHBlYXJhbmNlOiBub25lOyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IH0KLnBmLWMtZm9ybS1jb250cm9sOjpwbGFjZWhvbGRlciB7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLUNvbG9yOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tcGxhY2Vob2xkZXItLUNvbG9yKTsgfQoucGYtYy1mb3JtLWNvbnRyb2w6bm90KHRleHRhcmVhKSB7IGhlaWdodDogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLUhlaWdodCk7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB9Ci5wZi1jLWZvcm0tY29udHJvbFtyZWFkb25seV0sIC5wZi1jLWZvcm0tY29udHJvbFtyZWFkb25seV0ucGYtbS1ob3ZlciwgLnBmLWMtZm9ybS1jb250cm9sW3JlYWRvbmx5XTpob3ZlciwgLnBmLWMtZm9ybS1jb250cm9sW3JlYWRvbmx5XS5wZi1tLWZvY3VzLCAucGYtYy1mb3JtLWNvbnRyb2xbcmVhZG9ubHldOmZvY3VzIHsgLS1wZi1jLWZvcm0tY29udHJvbC0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1yZWFkb25seS0tZm9jdXMtLUJvcmRlckJvdHRvbUNvbG9yKTsgcGFkZGluZy1ib3R0b206IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1yZWFkb25seS0tZm9jdXMtLVBhZGRpbmdCb3R0b20pOyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tcmVhZG9ubHktLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3IpOyBib3JkZXItYm90dG9tLXdpZHRoOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tcmVhZG9ubHktLWZvY3VzLS1Cb3JkZXJCb3R0b21XaWR0aCk7IH0KLnBmLWMtZm9ybS1jb250cm9sLnBmLW0taG92ZXIsIC5wZi1jLWZvcm0tY29udHJvbDpob3ZlciB7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLUJvcmRlckJvdHRvbUNvbG9yOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0taG92ZXItLUJvcmRlckJvdHRvbUNvbG9yKTsgfQoucGYtYy1mb3JtLWNvbnRyb2wucGYtbS1mb2N1cywgLnBmLWMtZm9ybS1jb250cm9sOmZvY3VzIHsgLS1wZi1jLWZvcm0tY29udHJvbC0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1mb2N1cy0tQm9yZGVyQm90dG9tQ29sb3IpOyBwYWRkaW5nLWJvdHRvbTogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLWZvY3VzLS1QYWRkaW5nQm90dG9tKTsgYm9yZGVyLWJvdHRvbS13aWR0aDogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLWZvY3VzLS1Cb3JkZXJCb3R0b21XaWR0aCk7IH0KLnBmLWMtZm9ybS1jb250cm9sOmRpc2FibGVkIHsgLS1wZi1jLWZvcm0tY29udHJvbC0tQ29sb3I6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1kaXNhYmxlZC0tQ29sb3IpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1kaXNhYmxlZC0tQmFja2dyb3VuZENvbG9yKTsgY3Vyc29yOiBub3QtYWxsb3dlZDsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tZGlzYWJsZWQtLUJvcmRlckNvbG9yKTsgfQoucGYtYy1mb3JtLWNvbnRyb2xbYXJpYS1pbnZhbGlkPSJ0cnVlIl0geyAtLXBmLWMtZm9ybS1jb250cm9sLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1pbnZhbGlkLS1QYWRkaW5nUmlnaHQpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1Cb3JkZXJCb3R0b21Db2xvcjogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLWludmFsaWQtLUJvcmRlckJvdHRvbUNvbG9yKTsgcGFkZGluZy1ib3R0b206IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1pbnZhbGlkLS1QYWRkaW5nQm90dG9tKTsgYmFja2dyb3VuZDogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLWludmFsaWQtLUJhY2tncm91bmQpOyBib3JkZXItYm90dG9tLXdpZHRoOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0taW52YWxpZC0tQm9yZGVyQm90dG9tV2lkdGgpOyB9Ci5wZi1jLWZvcm0tY29udHJvbC5wZi1tLXN1Y2Nlc3MgeyAtLXBmLWMtZm9ybS1jb250cm9sLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1zdWNjZXNzLS1QYWRkaW5nUmlnaHQpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1Cb3JkZXJCb3R0b21Db2xvcjogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLXN1Y2Nlc3MtLUJvcmRlckJvdHRvbUNvbG9yKTsgcGFkZGluZy1ib3R0b206IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1zdWNjZXNzLS1QYWRkaW5nQm90dG9tKTsgYmFja2dyb3VuZDogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLXN1Y2Nlc3MtLUJhY2tncm91bmQpOyBib3JkZXItYm90dG9tLXdpZHRoOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbC0tc3VjY2Vzcy0tQm9yZGVyQm90dG9tV2lkdGgpOyB9Ci5wZi1jLWZvcm0tY29udHJvbC5wZi1tLXNlYXJjaCB7IHBhZGRpbmctbGVmdDogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2wtLW0tc2VhcmNoLS1QYWRkaW5nTGVmdCk7IGJhY2tncm91bmQ6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sLS1tLXNlYXJjaC0tQmFja2dyb3VuZCk7IH0Kc2VsZWN0LnBmLWMtZm9ybS1jb250cm9sIHsgLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ1JpZ2h0OiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbF9fc2VsZWN0LS1QYWRkaW5nUmlnaHQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbF9fc2VsZWN0LS1CYWNrZ3JvdW5kKTsgfQpzZWxlY3QucGYtYy1mb3JtLWNvbnRyb2xbYXJpYS1pbnZhbGlkPSJ0cnVlIl0geyAtLXBmLWMtZm9ybS1jb250cm9sLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWMtZm9ybS1jb250cm9sX19zZWxlY3QtLWludmFsaWQtLVBhZGRpbmdSaWdodCk7IC0tcGYtYy1mb3JtLWNvbnRyb2wtLWludmFsaWQtLUJhY2tncm91bmRQb3NpdGlvbjogY2FsYygxMDAlIC0gdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKSAtIHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1sZykpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1pbnZhbGlkLS1CYWNrZ3JvdW5kOiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbF9fc2VsZWN0LS1pbnZhbGlkLS1CYWNrZ3JvdW5kKTsgfQpzZWxlY3QucGYtYy1mb3JtLWNvbnRyb2wucGYtbS1zdWNjZXNzIHsgLS1wZi1jLWZvcm0tY29udHJvbC0tUGFkZGluZ1JpZ2h0OiB2YXIoLS1wZi1jLWZvcm0tY29udHJvbF9fc2VsZWN0LS1zdWNjZXNzLS1QYWRkaW5nUmlnaHQpOyAtLXBmLWMtZm9ybS1jb250cm9sLS1zdWNjZXNzLS1CYWNrZ3JvdW5kUG9zaXRpb246IGNhbGMoMTAwJSAtIHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1zbSkgLSB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbGcpKTsgLS1wZi1jLWZvcm0tY29udHJvbC0tc3VjY2Vzcy0tQmFja2dyb3VuZDogdmFyKC0tcGYtYy1mb3JtLWNvbnRyb2xfX3NlbGVjdC0tc3VjY2Vzcy0tQmFja2dyb3VuZCk7IH0KLnBmLWMtZm9ybS1jb250cm9sLnBmLW0tcmVzaXplLXZlcnRpY2FsIHsgcmVzaXplOiB2ZXJ0aWNhbDsgfQoucGYtYy1mb3JtLWNvbnRyb2wucGYtbS1yZXNpemUtaG9yaXpvbnRhbCB7IHJlc2l6ZTogaG9yaXpvbnRhbDsgfQoKLmVycm9yLXBsYWNlaG9sZGVyIHsgbWluLWhlaWdodDogMjFweDsgfQoKLnBmLW0tZXJyb3JfX2ljb24geyBtYXJnaW4tcmlnaHQ6IDVweDsgfQoKLnBmLWMtZm9ybV9faGVscGVyLXRleHQucGYtbS1lcnJvciB7IGNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWRhbmdlci1jb2xvci0tMTAwKTsgfQoKLnBmLWMtYnV0dG9uIHsgLS1wZi1jLWJ1dHRvbi0tUGFkZGluZ1RvcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLWZvcm0tZWxlbWVudCk7IC0tcGYtYy1idXR0b24tLVBhZGRpbmdSaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWJ1dHRvbi0tUGFkZGluZ0JvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLWZvcm0tZWxlbWVudCk7IC0tcGYtYy1idXR0b24tLVBhZGRpbmdMZWZ0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtYnV0dG9uLS1MaW5lSGVpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLUxpbmVIZWlnaHQtLW1kKTsgLS1wZi1jLWJ1dHRvbi0tRm9udFdlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1zZW1pLWJvbGQpOyAtLXBmLWMtYnV0dG9uLS1Gb250U2l6ZTogdmFyKC0tcGYtZ2xvYmFsLS1Gb250U2l6ZS0tbWQpOyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJSYWRpdXM6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyUmFkaXVzLS1zbSk7IC0tcGYtYy1idXR0b24tLUJvcmRlckNvbG9yOiB0cmFuc3BhcmVudDsgLS1wZi1jLWJ1dHRvbi0tQm9yZGVyV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLXNtKTsgLS1wZi1jLWJ1dHRvbi0taG92ZXItLUJvcmRlcldpZHRoOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlcldpZHRoLS1tZCk7IC0tcGYtYy1idXR0b24tLWZvY3VzLS1Cb3JkZXJXaWR0aDogdmFyKC0tcGYtZ2xvYmFsLS1Cb3JkZXJXaWR0aC0tbWQpOyAtLXBmLWMtYnV0dG9uLS1hY3RpdmUtLUJvcmRlcldpZHRoOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlcldpZHRoLS1tZCk7IC0tcGYtYy1idXR0b24tLWRpc2FibGVkLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1kaXNhYmxlZC1jb2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tZGlzYWJsZWQtLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1kaXNhYmxlZC1jb2xvci0tMjAwKTsgLS1wZi1jLWJ1dHRvbi0tZGlzYWJsZWQtLUJvcmRlckNvbG9yOiB0cmFuc3BhcmVudDsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1ob3Zlci0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLTIwMCk7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0taG92ZXItLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMjAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1mb2N1cy0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLWxpZ2h0LTEwMCk7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tYWN0aXZlLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMjAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1hY3RpdmUtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tQmFja2dyb3VuZENvbG9yOiB0cmFuc3BhcmVudDsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0taG92ZXItLUJhY2tncm91bmRDb2xvcjogdHJhbnNwYXJlbnQ7IC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1ob3Zlci0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLWhvdmVyLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUJhY2tncm91bmRDb2xvcjogdHJhbnNwYXJlbnQ7IC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1mb2N1cy0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLWZvY3VzLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1CYWNrZ3JvdW5kQ29sb3I6IHRyYW5zcGFyZW50OyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1CYWNrZ3JvdW5kQ29sb3I6IHRyYW5zcGFyZW50OyAtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWhvdmVyLS1CYWNrZ3JvdW5kQ29sb3I6IHRyYW5zcGFyZW50OyAtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1ob3Zlci0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWhvdmVyLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tZm9jdXMtLUJhY2tncm91bmRDb2xvcjogdHJhbnNwYXJlbnQ7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWZvY3VzLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1hY3RpdmUtLUJhY2tncm91bmRDb2xvcjogdHJhbnNwYXJlbnQ7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWFjdGl2ZS0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWFjdGl2ZS0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tZGFuZ2VyLWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLWxpZ2h0LTEwMCk7IC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1ob3Zlci0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWRhbmdlci1jb2xvci0tMjAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLWhvdmVyLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tZGFuZ2VyLWNvbG9yLS0yMDApOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tYWN0aXZlLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tZGFuZ2VyLWNvbG9yLS0yMDApOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tYWN0aXZlLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1saW5rLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvcik7IC0tcGYtYy1idXR0b24tLW0tbGluay0taG92ZXItLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3Zlcik7IC0tcGYtYy1idXR0b24tLW0tbGluay0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3Zlcik7IC0tcGYtYy1idXR0b24tLW0tbGluay0tYWN0aXZlLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvci0taG92ZXIpOyAtLXBmLWMtYnV0dG9uLS1tLWxpbmstLWRpc2FibGVkLS1CYWNrZ3JvdW5kQ29sb3I6IHRyYW5zcGFyZW50OyAtLXBmLWMtYnV0dG9uLS1tLWxpbmstLW0taW5saW5lLS1ob3Zlci0tVGV4dERlY29yYXRpb246IHZhcigtLXBmLWdsb2JhbC0tbGluay0tVGV4dERlY29yYXRpb24tLWhvdmVyKTsgLS1wZi1jLWJ1dHRvbi0tbS1saW5rLS1tLWlubGluZS0taG92ZXItLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3Zlcik7IC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS0yMDApOyAtLXBmLWMtYnV0dG9uLS1tLXBsYWluLS1ob3Zlci0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLWZvY3VzLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0tYWN0aXZlLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0tZGlzYWJsZWQtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWRpc2FibGVkLWNvbG9yLS0yMDApOyAtLXBmLWMtYnV0dG9uLS1tLXBsYWluLS1kaXNhYmxlZC0tQmFja2dyb3VuZENvbG9yOiB0cmFuc3BhcmVudDsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLXNtKTsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyVG9wQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTMwMCk7IC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tYWZ0ZXItLUJvcmRlclJpZ2h0Q29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTMwMCk7IC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tYWZ0ZXItLUJvcmRlckJvdHRvbUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlckNvbG9yLS0yMDApOyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFmdGVyLS1Cb3JkZXJMZWZ0Q29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTMwMCk7IC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0taG92ZXItLWFmdGVyLS1Cb3JkZXJCb3R0b21XaWR0aDogdmFyKC0tcGYtZ2xvYmFsLS1Cb3JkZXJXaWR0aC0tbWQpOyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWhvdmVyLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tYWN0aXZlLWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFjdGl2ZS0tYWZ0ZXItLUJvcmRlckJvdHRvbVdpZHRoOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlcldpZHRoLS1tZCk7IC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tYWN0aXZlLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tYWN0aXZlLWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWZvY3VzLS1hZnRlci0tQm9yZGVyQm90dG9tV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLW1kKTsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1mb2N1cy0tYWZ0ZXItLUJvcmRlckJvdHRvbUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWFjdGl2ZS1jb2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1tLWV4cGFuZGVkLS1hZnRlci0tQm9yZGVyQm90dG9tV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLW1kKTsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1tLWV4cGFuZGVkLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tYWN0aXZlLWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWRpc2FibGVkLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTMwMCk7IC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tZGlzYWJsZWQtLUJhY2tncm91bmRDb2xvcjogdHJhbnNwYXJlbnQ7IC0tcGYtYy1idXR0b25fX2ljb24tLU1hcmdpblJpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teHMpOyAtLXBmLWMtYnV0dG9uX190ZXh0LS1pY29uLS1NYXJnaW5MZWZ0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teHMpOyBwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogdmFyKC0tcGYtYy1idXR0b24tLVBhZGRpbmdUb3ApIHZhcigtLXBmLWMtYnV0dG9uLS1QYWRkaW5nUmlnaHQpIHZhcigtLXBmLWMtYnV0dG9uLS1QYWRkaW5nQm90dG9tKSB2YXIoLS1wZi1jLWJ1dHRvbi0tUGFkZGluZ0xlZnQpOyBmb250LXNpemU6IHZhcigtLXBmLWMtYnV0dG9uLS1Gb250U2l6ZSk7IGZvbnQtd2VpZ2h0OiB2YXIoLS1wZi1jLWJ1dHRvbi0tRm9udFdlaWdodCk7IGxpbmUtaGVpZ2h0OiB2YXIoLS1wZi1jLWJ1dHRvbi0tTGluZUhlaWdodCk7IHRleHQtYWxpZ246IGNlbnRlcjsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdXNlci1zZWxlY3Q6IG5vbmU7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogdmFyKC0tcGYtYy1idXR0b24tLUJvcmRlclJhZGl1cyk7IH0KLnBmLWMtYnV0dG9uIC5wZi1jLWJ1dHRvbl9faWNvbiB7IG1hcmdpbi1yaWdodDogdmFyKC0tcGYtYy1idXR0b25fX2ljb24tLU1hcmdpblJpZ2h0KTsgfQoucGYtYy1idXR0b24gLnBmLWMtYnV0dG9uX190ZXh0ICsgLnBmLWMtYnV0dG9uX19pY29uIHsgbWFyZ2luLXJpZ2h0OiAwOyBtYXJnaW4tbGVmdDogdmFyKC0tcGYtYy1idXR0b25fX3RleHQtLWljb24tLU1hcmdpbkxlZnQpOyB9Ci5wZi1jLWJ1dHRvbjo6YWZ0ZXIgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgcmlnaHQ6IDA7IGJvdHRvbTogMDsgbGVmdDogMDsgY29udGVudDogIiI7IGJvcmRlcjogdmFyKC0tcGYtYy1idXR0b24tLUJvcmRlcldpZHRoKSBzb2xpZDsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tQm9yZGVyQ29sb3IpOyBib3JkZXItcmFkaXVzOiB2YXIoLS1wZi1jLWJ1dHRvbi0tQm9yZGVyUmFkaXVzKTsgfQoucGYtYy1idXR0b246aG92ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLWhvdmVyIHsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9Ci5wZi1jLWJ1dHRvbjpob3Zlcjo6YWZ0ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLWhvdmVyOjphZnRlciB7IC0tcGYtYy1idXR0b24tLUJvcmRlcldpZHRoOiB2YXIoLS1wZi1jLWJ1dHRvbi0taG92ZXItLUJvcmRlcldpZHRoKTsgfQoucGYtYy1idXR0b246YWN0aXZlOjphZnRlciwgLnBmLWMtYnV0dG9uLnBmLW0tYWN0aXZlOjphZnRlciB7IC0tcGYtYy1idXR0b24tLUJvcmRlcldpZHRoOiB2YXIoLS1wZi1jLWJ1dHRvbi0tYWN0aXZlLS1Cb3JkZXJXaWR0aCk7IH0KLnBmLWMtYnV0dG9uOmZvY3VzOjphZnRlciwgLnBmLWMtYnV0dG9uLnBmLW0tZm9jdXM6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tQm9yZGVyV2lkdGg6IHZhcigtLXBmLWMtYnV0dG9uLS1mb2N1cy0tQm9yZGVyV2lkdGgpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWJsb2NrIHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXByaW1hcnkgeyBjb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQ29sb3IpOyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXByaW1hcnk6aG92ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLXByaW1hcnkucGYtbS1ob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWhvdmVyLS1Db2xvcik7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1ob3Zlci0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1wcmltYXJ5OmFjdGl2ZSwgLnBmLWMtYnV0dG9uLnBmLW0tcHJpbWFyeS5wZi1tLWFjdGl2ZSB7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWFjdGl2ZS0tQ29sb3IpOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tYWN0aXZlLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXByaW1hcnk6Zm9jdXMsIC5wZi1jLWJ1dHRvbi5wZi1tLXByaW1hcnkucGYtbS1mb2N1cyB7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWZvY3VzLS1Db2xvcik7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1mb2N1cy0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1zZWNvbmRhcnkgeyBjb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1Db2xvcik7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1zZWNvbmRhcnk6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tQm9yZGVyQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXNlY29uZGFyeTpob3ZlciwgLnBmLWMtYnV0dG9uLnBmLW0tc2Vjb25kYXJ5LnBmLW0taG92ZXIgeyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0taG92ZXItLUNvbG9yKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1ob3Zlci0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1zZWNvbmRhcnk6aG92ZXI6OmFmdGVyLCAucGYtYy1idXR0b24ucGYtbS1zZWNvbmRhcnkucGYtbS1ob3Zlcjo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1ob3Zlci0tQm9yZGVyQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXNlY29uZGFyeTphY3RpdmUsIC5wZi1jLWJ1dHRvbi5wZi1tLXNlY29uZGFyeS5wZi1tLWFjdGl2ZSB7IC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1hY3RpdmUtLUNvbG9yKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1hY3RpdmUtLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tc2Vjb25kYXJ5OmFjdGl2ZTo6YWZ0ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLXNlY29uZGFyeS5wZi1tLWFjdGl2ZTo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1hY3RpdmUtLUJvcmRlckNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1zZWNvbmRhcnk6Zm9jdXMsIC5wZi1jLWJ1dHRvbi5wZi1tLXNlY29uZGFyeS5wZi1tLWZvY3VzIHsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLWZvY3VzLS1Db2xvcik7IC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tc2Vjb25kYXJ5OmZvY3VzOjphZnRlciwgLnBmLWMtYnV0dG9uLnBmLW0tc2Vjb25kYXJ5LnBmLW0tZm9jdXM6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUJvcmRlckNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS10ZXJ0aWFyeSB7IGNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQ29sb3IpOyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS10ZXJ0aWFyeTo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLUJvcmRlckNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS10ZXJ0aWFyeTpob3ZlciwgLnBmLWMtYnV0dG9uLnBmLW0tdGVydGlhcnkucGYtbS1ob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0taG92ZXItLUNvbG9yKTsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0taG92ZXItLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tdGVydGlhcnk6aG92ZXI6OmFmdGVyLCAucGYtYy1idXR0b24ucGYtbS10ZXJ0aWFyeS5wZi1tLWhvdmVyOjphZnRlciB7IC0tcGYtYy1idXR0b24tLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0taG92ZXItLUJvcmRlckNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS10ZXJ0aWFyeTphY3RpdmUsIC5wZi1jLWJ1dHRvbi5wZi1tLXRlcnRpYXJ5LnBmLW0tYWN0aXZlIHsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1hY3RpdmUtLUNvbG9yKTsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tYWN0aXZlLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXRlcnRpYXJ5OmFjdGl2ZTo6YWZ0ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLXRlcnRpYXJ5LnBmLW0tYWN0aXZlOjphZnRlciB7IC0tcGYtYy1idXR0b24tLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tYWN0aXZlLS1Cb3JkZXJDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tdGVydGlhcnk6Zm9jdXMsIC5wZi1jLWJ1dHRvbi5wZi1tLXRlcnRpYXJ5LnBmLW0tZm9jdXMgeyAtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWZvY3VzLS1Db2xvcik7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXRlcnRpYXJ5OmZvY3VzOjphZnRlciwgLnBmLWMtYnV0dG9uLnBmLW0tdGVydGlhcnkucGYtbS1mb2N1czo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWZvY3VzLS1Cb3JkZXJDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tZGFuZ2VyIHsgY29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tQ29sb3IpOyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tZGFuZ2VyOmhvdmVyLCAucGYtYy1idXR0b24ucGYtbS1kYW5nZXIucGYtbS1ob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1ob3Zlci0tQ29sb3IpOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLWhvdmVyLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWRhbmdlcjphY3RpdmUsIC5wZi1jLWJ1dHRvbi5wZi1tLWRhbmdlci5wZi1tLWFjdGl2ZSB7IC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1hY3RpdmUtLUNvbG9yKTsgLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1hY3RpdmUtLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tZGFuZ2VyOmZvY3VzLCAucGYtYy1idXR0b24ucGYtbS1kYW5nZXIucGYtbS1mb2N1cyB7IC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1mb2N1cy0tQ29sb3IpOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWxpbmsgeyBjb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tbGluay0tQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWxpbms6bm90KC5wZi1tLWlubGluZSk6aG92ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLWxpbms6bm90KC5wZi1tLWlubGluZSkucGYtbS1ob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tbGluay0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWxpbmstLWhvdmVyLS1Db2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tbGluazpub3QoLnBmLW0taW5saW5lKTphY3RpdmUsIC5wZi1jLWJ1dHRvbi5wZi1tLWxpbms6bm90KC5wZi1tLWlubGluZSkucGYtbS1hY3RpdmUgeyAtLXBmLWMtYnV0dG9uLS1tLWxpbmstLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1saW5rLS1hY3RpdmUtLUNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1saW5rOm5vdCgucGYtbS1pbmxpbmUpOmZvY3VzLCAucGYtYy1idXR0b24ucGYtbS1saW5rOm5vdCgucGYtbS1pbmxpbmUpLnBmLW0tZm9jdXMgeyAtLXBmLWMtYnV0dG9uLS1tLWxpbmstLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1saW5rLS1mb2N1cy0tQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWxpbms6ZGlzYWJsZWQsIC5wZi1jLWJ1dHRvbi5wZi1tLWxpbmsucGYtbS1kaXNhYmxlZCB7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWxpbmstLWRpc2FibGVkLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWxpbmsucGYtbS1pbmxpbmUgeyBkaXNwbGF5OiBpbmxpbmU7IHBhZGRpbmc6IDA7IH0KLnBmLWMtYnV0dG9uLnBmLW0tbGluay5wZi1tLWlubGluZTpob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tbGluay0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWxpbmstLW0taW5saW5lLS1ob3Zlci0tQ29sb3IpOyB0ZXh0LWRlY29yYXRpb246IHZhcigtLXBmLWMtYnV0dG9uLS1tLWxpbmstLW0taW5saW5lLS1ob3Zlci0tVGV4dERlY29yYXRpb24pOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWNvbnRyb2w6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tQm9yZGVyV2lkdGg6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFmdGVyLS1Cb3JkZXJXaWR0aCk7IC0tcGYtYy1idXR0b24tLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyVG9wQ29sb3IpIHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFmdGVyLS1Cb3JkZXJSaWdodENvbG9yKSB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3IpIHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFmdGVyLS1Cb3JkZXJMZWZ0Q29sb3IpOyBib3JkZXItcmFkaXVzOiBpbml0aWFsOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWNvbnRyb2w6aG92ZXI6OmFmdGVyLCAucGYtYy1idXR0b24ucGYtbS1jb250cm9sLnBmLW0taG92ZXI6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWhvdmVyLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3IpOyBib3JkZXItYm90dG9tLXdpZHRoOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1ob3Zlci0tYWZ0ZXItLUJvcmRlckJvdHRvbVdpZHRoKTsgfQoucGYtYy1idXR0b24ucGYtbS1jb250cm9sOmFjdGl2ZTo6YWZ0ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLWNvbnRyb2wucGYtbS1hY3RpdmU6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFjdGl2ZS0tYWZ0ZXItLUJvcmRlckJvdHRvbUNvbG9yKTsgYm9yZGVyLWJvdHRvbS13aWR0aDogdmFyKC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tYWN0aXZlLS1hZnRlci0tQm9yZGVyQm90dG9tV2lkdGgpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWNvbnRyb2w6Zm9jdXM6OmFmdGVyLCAucGYtYy1idXR0b24ucGYtbS1jb250cm9sLnBmLW0tZm9jdXM6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWZvY3VzLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3IpOyBib3JkZXItYm90dG9tLXdpZHRoOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1mb2N1cy0tYWZ0ZXItLUJvcmRlckJvdHRvbVdpZHRoKTsgfQoucGYtYy1idXR0b24ucGYtbS1jb250cm9sLnBmLW0tZXhwYW5kZWQ6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLW0tZXhwYW5kZWQtLWFmdGVyLS1Cb3JkZXJCb3R0b21Db2xvcik7IGJvcmRlci1ib3R0b20td2lkdGg6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLW0tZXhwYW5kZWQtLWFmdGVyLS1Cb3JkZXJCb3R0b21XaWR0aCk7IH0KLnBmLWMtYnV0dG9uLnBmLW0tY29udHJvbDpkaXNhYmxlZCwgLnBmLWMtYnV0dG9uLnBmLW0tY29udHJvbC5wZi1tLWRpc2FibGVkIHsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tZGlzYWJsZWQtLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tY29udHJvbDpkaXNhYmxlZDo6YWZ0ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLWNvbnRyb2wucGYtbS1kaXNhYmxlZDo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFmdGVyLS1Cb3JkZXJCb3R0b21Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tZGlzYWJsZWQtLWFmdGVyLS1Cb3JkZXJCb3R0b21Db2xvcik7IH0KLnBmLWMtYnV0dG9uOmRpc2FibGVkLCAucGYtYy1idXR0b24ucGYtbS1kaXNhYmxlZCB7IGNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tZGlzYWJsZWQtLUNvbG9yKTsgcG9pbnRlci1ldmVudHM6IG5vbmU7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1kaXNhYmxlZC0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b246ZGlzYWJsZWQ6OmFmdGVyLCAucGYtYy1idXR0b24ucGYtbS1kaXNhYmxlZDo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLWRpc2FibGVkLS1Cb3JkZXJDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tcGxhaW4geyBjb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLUNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1wbGFpbjpob3ZlciwgLnBmLWMtYnV0dG9uLnBmLW0tcGxhaW4ucGYtbS1ob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0taG92ZXItLUNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1wbGFpbjphY3RpdmUsIC5wZi1jLWJ1dHRvbi5wZi1tLXBsYWluLnBmLW0tYWN0aXZlIHsgLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXBsYWluLS1hY3RpdmUtLUNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1wbGFpbjpmb2N1cywgLnBmLWMtYnV0dG9uLnBmLW0tcGxhaW4ucGYtbS1mb2N1cyB7IC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0tZm9jdXMtLUNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1wbGFpbjpkaXNhYmxlZCwgLnBmLWMtYnV0dG9uLnBmLW0tcGxhaW4ucGYtbS1kaXNhYmxlZCB7IC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0tZGlzYWJsZWQtLUNvbG9yKTsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLWRpc2FibGVkLS1CYWNrZ3JvdW5kQ29sb3IpOyB9CgoucGYtbS1yZWRoYXQtZm9udCAucGYtYy1idXR0b24geyAtLXBmLWMtYnV0dG9uLS1Gb250V2VpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLW5vcm1hbCk7IH0KCi5wZi1jLXRpdGxlLnBmLW0tM3hsIHsgZm9udC1zaXplOiAyOHB4OyBsaW5lLWhlaWdodDogMzYuNHB4OyB9CgogICAgPC9zdHlsZT4KICA8L2hlYWQ+CgogIDxib2R5IGNsYXNzPSJwZi1tLXJlZGhhdC1mb250Ij4KICAgIDxkaXYgY2xhc3M9InBmLWMtbG9naW4iPgogICAgICA8ZGl2IGNsYXNzPSJwZi1jLWxvZ2luX19jb250YWluZXIiPgogICAgICAgIDxoZWFkZXIgY2xhc3M9InBmLWMtbG9naW5fX2hlYWRlciI+CiAgICAgICAgICA8aW1nIHNyYz0iZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREkwTGpFdU1Dd2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SWt4dloyOXpJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklpQjRQU0l3Y0hnaUlIazlJakJ3ZUNJS0NTQjNhV1IwYUQwaU16SXdjSGdpSUdobGFXZG9kRDBpTkRjdU5uQjRJaUIyYVdWM1FtOTRQU0l3SURBZ016SXdJRFEzTGpZaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURNeU1DQTBOeTQyT3lJZ2VHMXNPbk53WVdObFBTSndjbVZ6WlhKMlpTSStDanh6ZEhsc1pTQjBlWEJsUFNKMFpYaDBMMk56Y3lJK0Nna3VjM1F3ZTJacGJHdzZJMFpHUmtaR1JqdDlDZ2t1YzNReGUyWnBiR3c2STBWRk1EQXdNRHQ5Q2p3dmMzUjViR1UrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMDFNaTR4TERRekxqWmpMVFF1TWl3d0xUY3VOUzB6TGpNdE55NDFMVGN1TlhNekxqTXROeTQxTERjdU5TMDNMalZ6Tnk0MkxETXVNeXczTGpZc055NDFVelUyTGpNc05ETXVOaXcxTWk0eExEUXpMalo2SUUwMU1pNHhMRE13TGpZS0NXTXRNeXd3TFRVdU15d3lMalF0TlM0ekxEVXVOWE15TGpNc05TNDFMRFV1TXl3MUxqVmpNeXd3TERVdU15MHlMalFzTlM0ekxUVXVOVk0xTlM0eExETXdMallzTlRJdU1Td3pNQzQyZWlJdlBnbzhjR0YwYUNCamJHRnpjejBpYzNRd0lpQmtQU0pOTmpFdU55d3pNaTQ0YURKMk1XTXdMamt0TUM0NExESXRNUzR5TERNdU1pMHhMakpqTXl3d0xEVXVNeXd5TGpRc05TNHpMRFV1TkhNdE1pNHpMRFV1TkMwMUxqUXNOUzQwWXkweExqRXNNQzB5TGpNdE1DNDBMVE11TWkweGRqVXVNbWd0TWk0eENnbE1OakV1Tnl3ek1pNDRlaUJOTmpNdU9Dd3pOUzQzZGpRdU9HTXdMamNzTUM0NExERXVPQ3d4TGpJc01pNDVMREV1TW1NeUxEQXNNeTQyTFRFdU5pd3pMall0TXk0Mll6QXRNaTR4TFRFdU5pMHpMall0TXk0MkxUTXVOa00yTlM0MUxETTBMalFzTmpRdU5Dd3pOQzQ1TERZekxqZ3NNelV1TjNvaUx6NEtQSEJoZEdnZ1kyeGhjM005SW5OME1DSWdaRDBpVFRjNUxqUXNORE11TldNdE15NHhMREF0TlM0MUxUSXVOQzAxTGpVdE5TNDFZekF0TXl3eUxqTXROUzQwTERVdU15MDFMalJqTWk0NUxEQXNOUzR4TERJdU5DdzFMakVzTlM0MWRqQXVObWd0T0M0ell6QXVNeXd4TGpnc01TNDRMRE1zTXk0MkxETUtDV014TERBc01TNDVMVEF1TXl3eUxqY3RNQzQ1YkRFdU15d3hMak5ET0RJdU15dzBNeTR4TERnd0xqZ3NORE11TlN3M09TNDBMRFF6TGpWNklFMDNOUzQ1TERNM0xqSm9OaTR6WXkwd0xqTXRNUzQyTFRFdU5pMHlMamd0TXk0eExUSXVPQW9KUXpjM0xqVXNNelF1TkN3M05pNHlMRE0xTGpVc056VXVPU3d6Tnk0eWVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk9EWXVNaXd6TWk0NGFESXVNWFl4TGpGak1DNDRMVEF1T0N3eUxURXVNeXd6TGpJdE1TNHpZekl1TkN3d0xEUXVNU3d4TGpjc05DNHhMRFF1TVhZMkxqWm9MVEl1TVZZek4yTXdMVEV1TnkweExUSXVOeTB5TGpZdE1pNDNDZ2xqTFRFdU1Td3dMVElzTUM0MUxUSXVOaXd4TGpSMk55NDJhQzB5TGpGTU9EWXVNaXd6TWk0NGVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk9UZ3VNaXd6T1M0MFl6RXVOaXd4TGpVc015NHlMREl1TXl3MUxESXVNMk15TGpFc01Dd3pMalV0TVN3ekxqVXRNaTQwWXpBdE1TNHpMVEF1T0MweExqa3RNaTQ1TFRJdU0yd3RNaTQwTFRBdU5HTXRNaTQzTFRBdU5DMDBMVEV1TnkwMExUTXVPQW9KWXpBdE1pNDFMREl1TVMwMExqSXNOUzR6TFRRdU1tTXlMakVzTUN3MExqSXNNQzQzTERVdU9Dd3liQzB4TGpJc01TNDNZeTB4TGpZdE1TNHlMVE11TVMweExqZ3ROQzQzTFRFdU9HTXRNUzQ1TERBdE15NHhMREF1T1MwekxqRXNNaTR5WXpBc01TNHlMREF1Tnl3eExqY3NNaTQyTERJdU1Rb0piREl1TXl3d0xqUmpNeTR4TERBdU5TdzBMalVzTVM0NExEUXVOU3cwWXpBc01pNDNMVEl1TXl3MExqVXROUzQ0TERRdU5XTXRNaTR6TERBdE5DNDJMVEF1T1MwMkxqSXRNaTQyVERrNExqSXNNemt1TkhvaUx6NEtQSEJoZEdnZ1kyeGhjM005SW5OME1DSWdaRDBpVFRFeE1DNDJMREk0TGpoc01pNHhMVEF1TlhZMUxqVmpNQzQ0TFRBdU9Dd3lMVEV1TXl3ekxqSXRNUzR6WXpJdU5Dd3dMRFF1TVN3eExqY3NOQzR4TERRdU1YWTJMalpvTFRJdU1WWXpOMk13TFRFdU55MHhMVEl1TnkweUxqWXRNaTQzQ2dsakxURXNNQzB5TERBdU5TMHlMallzTVM0MGRqY3VObWd0TWk0eFZqSTRMamg2SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB4TWpJdU1Td3lPUzQ0WXpBdE1DNDNMREF1TmkweExqTXNNUzR6TFRFdU0yTXdMREFzTUN3d0xEQXNNR013TGpjc01Dd3hMak1zTUM0MUxERXVNeXd4TGpKak1Dd3dMamN0TUM0MUxERXVNeTB4TGpJc01TNHpZekFzTUMwd0xqRXNNQzB3TGpFc01Bb0pRekV5TWk0M0xETXhMakVzTVRJeUxqRXNNekF1TlN3eE1qSXVNU3d5T1M0NFF6RXlNaTR4TERJNUxqZ3NNVEl5TGpFc01qa3VPQ3d4TWpJdU1Td3lPUzQ0ZWlCTk1USTBMalFzTkRNdU0yZ3RNaTR4VmpNeUxqaG9NaTR4VmpRekxqTjZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHhNamd1TkN3ek1pNDRkaTB4TGpaak1DMHlMaklzTVM0ekxUTXVOQ3d6TGpZdE15NDBZekF1TlN3d0xERXNNQzR4TERFdU5Td3dMakoyTVM0NFl5MHdMalF0TUM0eExUQXVPUzB3TGpJdE1TNHpMVEF1TWdvSll5MHhMakVzTUMweExqY3NNQzQxTFRFdU55d3hMaloyTVM0MmFETjJNUzQzYUMwemRqZ3VPR2d0TWk0eGRpMDRMamhJTVRJMmRpMHhMamRJTVRJNExqUjZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHhNell1Tnl3ek5DNDFhQzB5TGpKMkxURXVOMmd5TGpKMkxUSXVOMnd5TFRBdU5YWXpMakpvTXk0eGRqRXVOMmd0TXk0eGRqVXVOMk13TERFdU1Td3dMalFzTVM0MUxERXVOaXd4TGpWak1DNDFMREFzTVMwd0xqRXNNUzQxTFRBdU1uWXhMamNLQ1dNdE1DNDJMREF1TWkweExqTXNNQzR6TFRJc01DNHpZeTB5TGpFc01DMHpMakV0TVMwekxqRXRNaTQ0VERFek5pNDNMRE0wTGpWNklpOCtDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweE5Ua3VOaXcwTUM0eGJERXNNUzR4WXkweExqVXNNUzQxTFRNdU5pd3lMalF0TlM0M0xESXVOR010TkM0eExEQXVNUzAzTGpVdE15NHlMVGN1TmkwM0xqUmpMVEF1TVMwMExqRXNNeTR5TFRjdU5TdzNMalF0Tnk0MkNnbGpNQzR4TERBc01DNHlMREFzTUM0eUxEQmpNaTR6TERBc05DNHpMREF1T1N3MUxqY3NNaTQwYkMweExqRXNNUzR4WXkweExqSXRNUzR6TFRJdU9TMHlMVFF1TnkweVl5MHpMalFzTUMwMUxqa3NNaTQyTFRVdU9TdzJZekFzTXk0MExESXVOaXcyTERZc05nb0pRekUxTmk0M0xEUXlMakVzTVRVNExqVXNOREV1TXl3eE5Ua3VOaXcwTUM0eGVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1UWTNMakVzTXpJdU4yTXlMamtzTUN3MUxqTXNNaTQwTERVdU15dzFMalJ6TFRJdU15dzFMalF0TlM0ekxEVXVOSE10TlM0ekxUSXVOQzAxTGpNdE5TNDBVekUyTkM0eUxETXlMamNzTVRZM0xqRXNNekl1TjNvZ1RURTNNQzQ1TERNNExqRUtDV013TFRJdU15MHhMamN0TkMwekxqZ3ROR010TWk0eExEQXRNeTQ0TERFdU9DMHpMamdzTkdNd0xESXVNeXd4TGpjc05Dd3pMamdzTkZNeE56QXVPU3cwTUM0MExERTNNQzQ1TERNNExqRk1NVGN3TGprc016Z3VNWG9pTHo0S1BIQmhkR2dnWTJ4aGMzTTlJbk4wTUNJZ1pEMGlUVEUzTkM0MkxETXlMamxvTVM0MWRqRXVNbU13TGpndE1Td3hMamt0TVM0MExETXVNeTB4TGpSak1pNDBMREFzTkN3eExqWXNOQ3cwZGpZdU5tZ3RNUzQxZGkwMkxqTmpNQzB4TGpndE1TNHhMVE10TWk0NUxUTUtDV010TVM0eUxEQXRNaTR6TERBdU5pMHlMamtzTVM0MmRqY3VObWd0TVM0MVRERTNOQzQyTERNeUxqbDZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHhPRFl1T0N3ek5DNHphQzB5TGpKMkxURXVNMmd5TGpKMkxUSXVObXd4TGpVdE1DNDBkak5vTXk0eGRqRXVNMmd0TXk0eGRqWXVOR013TERFdU1Td3dMalVzTVM0MkxERXVOaXd4TGpaak1DNDFMREFzTVMwd0xqRXNNUzQxTFRBdU0zWXhMak1LQ1dNdE1DNDJMREF1TWkweExqSXNNQzR6TFRFdU9Dd3dMak5qTFRFdU9Dd3dMVEl1T0Mwd0xqa3RNaTQ0TFRJdU5Vd3hPRFl1T0N3ek5DNHplaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NVGt5TGpVc05EQXVOR013TFRFdU9Td3hMall0TXk0eUxEUXVNUzB6TGpKak1TNHhMREFzTWk0eExEQXVNaXd6TERBdU4zWXRNUzQwWXpBdE1TNDNMVEV0TWk0MUxUSXVPQzB5TGpWakxURXNNQzB5TERBdU15MHpMak1zTUM0NWJDMHdMall0TVM0eUNnbGpNUzQxTFRBdU55d3lMamN0TVN3MExURmpNaTQyTERBc05DNHhMREV1TXl3MExqRXNNeTQyZGpkb0xURXVOWFl0TVdNdE1DNDVMREF1T0MweUxqRXNNUzR5TFRNdU5Dd3hMakpETVRrMExqRXNORE11TlN3eE9USXVOU3cwTWk0eUxERTVNaTQxTERRd0xqUjZJRTB4T1RZdU5pdzBNaTR6Q2dsak1TNHlMREFzTWk0ekxUQXVOQ3d6TGpFdE1TNHlkaTB4TGpsakxUQXVPUzB3TGpZdE1TNDRMVEF1T0MwekxUQXVPR010TVM0M0xEQXRNaTQzTERBdU9DMHlMamNzTWtNeE9UUXNOREV1TlN3eE9UVXVNU3cwTWk0ekxERTVOaTQyTERReUxqTjZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHlNRE11TlN3eU9TNDVZekF0TUM0MkxEQXVOUzB4TERFdE1XTXdMallzTUN3eExEQXVOQ3d4TERGak1Dd3dMREFzTUN3d0xEQmpNQ3d3TGpZdE1DNDFMREV0TVN3eFF6SXdOQ3d6TVN3eU1ETXVOU3d6TUM0MUxESXdNeTQxTERJNUxqbDZDZ2tnVFRJd05TNHpMRFF6TGpOb0xURXVOVll6TWk0NWFERXVOVlkwTXk0emVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1qQTNMamtzTXpJdU9XZ3hMalYyTVM0eVl6QXVPQzB4TERFdU9TMHhMalFzTXk0ekxURXVOR015TGpRc01DdzBMREV1Tml3MExEUjJOaTQyYUMweExqVjJMVFl1TTJNd0xURXVPQzB4TGpFdE15MHlMamt0TXdvSll5MHhMaklzTUMweUxqTXNNQzQyTFRJdU9Td3hMaloyTnk0MmFDMHhMalZXTXpJdU9Yb2lMejRLUEhCaGRHZ2dZMnhoYzNNOUluTjBNQ0lnWkQwaVRUSXlOQzR4TERRekxqVmpMVEl1T1N3d0xUVXVNeTB5TGpNdE5TNHpMVFV1TW1Nd0xEQXNNQzB3TGpFc01DMHdMakZqTUMwekxESXVNeTAxTGpNc05TNHhMVFV1TTJNeUxqZ3NNQ3cwTGprc01pNDBMRFF1T1N3MUxqTjJNQzQxYUMwNExqVUtDV013TGpJc01pd3hMamdzTXk0MkxETXVPU3d6TGpaak1TNHhMREFzTWk0eUxUQXVOQ3d5TGprdE1Xd3hMREZETWpJMkxqa3NORE11TVN3eU1qVXVOU3cwTXk0MUxESXlOQzR4TERRekxqVjZJRTB5TWpBdU5Dd3pOeTQwYURZdU9XTXRNQzR6TFRFdU9DMHhMamN0TXk0ekxUTXVOQzB6TGpNS0NVTXlNakl1TVN3ek5DNHhMREl5TUM0MkxETTFMalVzTWpJd0xqUXNNemN1TkV3eU1qQXVOQ3d6Tnk0MGVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1qTXhMRE15TGpsb01TNDFkakV1TldNd0xqWXRNUzR4TERFdU55MHhMamNzTWk0NUxURXVOMk13TGpNc01Dd3dMamNzTUN3eExEQXVNWFl4TGpSakxUQXVNeTB3TGpFdE1DNDNMVEF1TWkweExqRXRNQzR5Q2dsakxURXVNeXd3TFRJdU15d3dMamN0TWk0NExESXVNWFkzTGpGSU1qTXhUREl6TVN3ek1pNDVlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NalF5TGprc01qZ3VPR2cyTGpOak1pNDRMREFzTkM0M0xERXVOeXcwTGpjc05DNHljeTB4TGprc05DNHlMVFF1Tnl3MExqSm9MVFF1TjNZMkxqRm9MVEV1Tmt3eU5ESXVPU3d5T0M0NGVpQk5NalEwTGpVc016QXVNM1kxTGpab05DNDJDZ2xqTWl3d0xETXVNaTB4TGpFc015NHlMVEl1T0dNd0xURXVOeTB4TGpJdE1pNDRMVE11TWkweUxqaE1NalEwTGpVc016QXVNM29pTHo0S1BIQmhkR2dnWTJ4aGMzTTlJbk4wTUNJZ1pEMGlUVEkxTnk0MUxEUXpMak5JTWpVMlZqSTRMamhzTVM0MUxUQXVNMVkwTXk0emVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1qVTVMallzTkRBdU5HTXdMVEV1T1N3eExqWXRNeTR5TERRdU1TMHpMakpqTVM0eExEQXNNaTR4TERBdU1pd3pMREF1TjNZdE1TNDBZekF0TVM0M0xURXRNaTQxTFRJdU9DMHlMalZqTFRFc01DMHlMREF1TXkwekxqTXNNQzQ1YkMwd0xqWXRNUzR5Q2dsak1TNDFMVEF1Tnl3eUxqY3RNU3cwTFRGak1pNDJMREFzTkM0eExERXVNeXcwTGpFc015NDJkamRvTFRFdU5YWXRNV010TUM0NUxEQXVPQzB5TGpFc01TNHlMVE11TkN3eExqSkRNall4TGpFc05ETXVOU3d5TlRrdU5pdzBNaTR5TERJMU9TNDJMRFF3TGpSNklFMHlOak11Tnl3ME1pNHpDZ2xqTVM0eUxEQXNNaTR6TFRBdU5Dd3pMakV0TVM0eWRpMHhMamxqTFRBdU9DMHdMall0TVM0NExUQXVPQzB6TFRBdU9HTXRNUzQzTERBdE1pNDNMREF1T0MweUxqY3NNa015TmpFc05ERXVOU3d5TmpJdU1TdzBNaTR6TERJMk15NDNMRFF5TGpONklpOCtDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweU56RXVOeXd6TkM0emFDMHlMakoyTFRFdU0yZ3lMakoyTFRJdU5td3hMalV0TUM0MGRqTm9NeTR4ZGpFdU0yZ3RNeTR4ZGpZdU5HTXdMREV1TVN3d0xqVXNNUzQyTERFdU5pd3hMalpqTUM0MUxEQXNNUzB3TGpFc01TNDFMVEF1TTNZeExqTUtDV010TUM0MkxEQXVNaTB4TGpJc01DNHpMVEV1T0N3d0xqTmpMVEV1T0N3d0xUSXVPQzB3TGprdE1pNDRMVEl1TlV3eU56RXVOeXd6TkM0emVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1qYzVMallzTXpJdU9YWXRNbU13TFRJc01TNHhMVE11TVN3ekxqSXRNeTR4WXpBdU5Td3dMREF1T1N3d0xERXVOQ3d3TGpKMk1TNDBZeTB3TGpRdE1DNHhMVEF1T0Mwd0xqSXRNUzR6TFRBdU1tTXRNUzR5TERBdE1TNDRMREF1TmkweExqZ3NNUzQ0Q2dsV016Tm9NeTR4ZGpFdU0yZ3RNeTR4ZGprdU1XZ3RNUzQxZGkwNUxqRm9MVEl1TkhZdE1TNHpUREkzT1M0MkxETXlMamw2SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB5T1RBdU1pd3pNaTQzWXpJdU9Td3dMRFV1TXl3eUxqUXNOUzR6TERVdU5ITXRNaTR6TERVdU5DMDFMak1zTlM0MGN5MDFMak10TWk0MExUVXVNeTAxTGpSRE1qZzBMamtzTXpVdU1Td3lPRGN1TWl3ek1pNDNMREk1TUM0eUxETXlMamQ2Q2drZ1RUSTVOQ3d6T0M0eFl6QXRNaTR6TFRFdU55MDBMVE11T0MwMFl5MHlMakVzTUMwekxqZ3NNUzQ0TFRNdU9DdzBZekFzTWk0ekxERXVOeXcwTERNdU9DdzBVekk1TkN3ME1DNDBMREk1TkN3ek9DNHhUREk1TkN3ek9DNHhlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NamszTGpZc016SXVPV2d4TGpWMk1TNDFZekF1TmkweExqRXNNUzQzTFRFdU55d3lMamt0TVM0M1l6QXVNeXd3TERBdU55d3dMREVzTUM0eGRqRXVOR010TUM0ekxUQXVNUzB3TGpjdE1DNHlMVEV1TVMwd0xqSUtDV010TVM0ekxEQXRNaTR6TERBdU55MHlMamdzTWk0eGRqY3VNV2d0TVM0MVRESTVOeTQyTERNeUxqbDZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHpNRFF1T0N3ek1pNDVhREV1TlhZeExqRmpNQzQ0TFRBdU9Td3hMamt0TVM0MExETXRNUzR6WXpFdU5Dd3dMREl1Tml3d0xqY3NNeTR6TERFdU9XTXdMamd0TVM0eUxESXVNUzB4TGprc015NDJMVEV1T1dNeUxqTXNNQ3d6TGpnc01TNDJMRE11T0N3MENnbDJOaTQyYUMweExqVjJMVFl1TTJNd0xURXVPQzB4TFRNdE1pNDNMVE5qTFRFdU1Td3dMVEl1TVN3d0xqWXRNaTQ0TERFdU4yTXdMakVzTUM0ekxEQXVNU3d3TGpZc01DNHhMREYyTmk0MmFDMHhMalYyTFRZdU0yTXdMVEV1T0MweExUTXRNaTQzTFROakxURXVNU3d3TFRJc01DNDFMVEl1Tnl3eExqVUtDWFkzTGpkb0xURXVOVXd6TURRdU9Dd3pNaTQ1ZWlJdlBnbzhjR0YwYUNCamJHRnpjejBpYzNReElpQmtQU0pOTWpVdU15d3hOaTQxWXpJdU5Td3dMRFl1TVMwd0xqVXNOaTR4TFRNdU5XTXdMVEF1TWl3d0xUQXVOUzB3TGpFdE1DNDNiQzB4TGpVdE5pNDBZeTB3TGpNdE1TNDBMVEF1TmkweUxqRXRNeTR4TFRNdU13b0pZeTB4TGprdE1TMDJMakV0TWk0MkxUY3VOQzB5TGpaakxURXVNaXd3TFRFdU5Td3hMalV0TWk0NUxERXVOV010TVM0ekxEQXRNaTR6TFRFdU1TMHpMall0TVM0eFl5MHhMaklzTUMweUxEQXVPQzB5TGpZc01pNDFZekFzTUMweExqY3NOQzQzTFRFdU9TdzFMalFLQ1dNd0xEQXVNUzB3TGpFc01DNHpMREFzTUM0MFF6Z3VOQ3d4TUM0MUxERTFMallzTVRZdU5Td3lOUzR6TERFMkxqVWdUVE14TGpnc01UUXVNMk13TGpNc01TNDJMREF1TXl3eExqZ3NNQzR6TERKak1Dd3lMamd0TXk0eExEUXVNeTAzTGpNc05DNHpDZ2xqTFRrdU15d3dMVEUzTGpVdE5TNDFMVEUzTGpVdE9TNHhZekF0TUM0MUxEQXVNUzB4TERBdU15MHhMalZETkM0ekxERXdMak1zTUN3eE1DNDVMREFzTVRRdU4yTXdMRFl1TXl3eE5DNDVMREUwTERJMkxqWXNNVFJqT1N3d0xERXhMak10TkM0eExERXhMak10Tnk0ekNnbERNemN1T1N3eE9DNDRMRE0xTGpjc01UWXNNekV1T0N3eE5DNHpJaTgrQ2p4d1lYUm9JR1E5SWswek1TNDRMREUwTGpOak1DNHpMREV1Tml3d0xqTXNNUzQ0TERBdU15d3lZekFzTWk0NExUTXVNU3cwTGpNdE55NHpMRFF1TTJNdE9TNHpMREF0TVRjdU5TMDFMalV0TVRjdU5TMDVMakZqTUMwd0xqVXNNQzR4TFRFc01DNHpMVEV1Tld3d0xqY3RNUzQ0Q2dsak1Dd3dMakV0TUM0eExEQXVNeXd3TERBdU5HTXdMREV1T0N3M0xqSXNOeTQ1TERFMkxqa3NOeTQ1WXpJdU5Td3dMRFl1TVMwd0xqVXNOaTR4TFRNdU5XTXdMVEF1TWl3d0xUQXVOUzB3TGpFdE1DNDNURE14TGpnc01UUXVNM29pTHo0S1BIQmhkR2dnWTJ4aGMzTTlJbk4wTUNJZ1pEMGlUVEV4TlM0MExERTRMalJqTUN3eUxqUXNNUzQwTERNdU5TdzBMRE11TldNd0xqZ3NNQ3d4TGpZdE1DNHhMREl1TkMwd0xqTjJMVEl1TjJNdE1DNDFMREF1TWkweExEQXVNaTB4TGpVc01DNHlZeTB4TGpFc01DMHhMalV0TUM0ekxURXVOUzB4TGpNS0NYWXROQzR5YURNdU1YWXRNaTQ0YUMwekxqRldOeTR4YkMwekxqUXNNQzQzZGpJdU9XZ3RNaTR5ZGpJdU9HZ3lMakpNTVRFMUxqUXNNVGd1TkhvZ1RURXdOQzQ0TERFNExqUmpNQzB3TGpjc01DNDNMVEV1TVN3eExqZ3RNUzR4WXpBdU55d3dMREV1TkN3d0xqRXNNaXd3TGpOV01Ua0tDV010TUM0MkxEQXVOQzB4TGpRc01DNDFMVEl1TVN3d0xqVkRNVEExTGpVc01Ua3VOaXd4TURRdU9Dd3hPUzR4TERFd05DNDRMREU0TGpRZ1RURXdOUzQ0TERJeExqbGpNUzR5TERBc01pNHlMVEF1TXl3ekxqRXRNQzQ1ZGpBdU4yZ3pMak4yTFRjdU1XTXdMVEl1TnkweExqZ3ROQzR5TFRRdU9TMDBMaklLQ1dNdE1TNDNMREF0TXk0MExEQXVOQzAxTGpJc01TNHliREV1TWl3eUxqVmpNUzR6TFRBdU5Td3lMalF0TUM0NUxETXVOQzB3TGpsak1TNDBMREFzTWk0eExEQXVOU3d5TGpFc01TNDNkakF1TldNdE1DNDRMVEF1TWkweExqY3RNQzR6TFRJdU5TMHdMak1LQ1dNdE1pNDVMREF0TkM0MkxERXVNaTAwTGpZc015NHpRekV3TVM0NExESXdMalVzTVRBekxqUXNNakV1T1N3eE1EVXVPQ3d5TVM0NUlFMDROeTQwTERJeExqaElPVEZXTVRab05uWTFMamRvTXk0MlZqY3VNV2d0TXk0MmRqVXVObWd0TmxZM0xqRm9MVE11Tmt3NE55NDBMREl4TGpoNkNna2dUVGN6TGpjc01UWXVNbU13TFRFdU5pd3hMak10TWk0NExESXVPUzB5TGpoak1DNDVMREFzTVM0M0xEQXVNeXd5TGpNc01DNDVkak11T1dNdE1DNDJMREF1TmkweExqVXNNQzQ1TFRJdU15d3dMamxETnpVc01Ua3NOek11Tnl3eE55NDRMRGN6TGpjc01UWXVNaUJOTnprc01qRXVOMmd6TGpSV05pNDBDZ2xNTnprc055NHhkalF1TW1NdE1DNDVMVEF1TlMweExqZ3RNQzQzTFRJdU9DMHdMamRqTFRNdU1pd3dMVFV1T0N3eUxqVXROUzQ0TERVdU4yTXdMRE11TVN3eUxqUXNOUzQzTERVdU5pdzFMamRqTUN3d0xEQXVNU3d3TERBdU1Td3dZekV1TVN3d0xESXVNUzB3TGpNc015MHhWakl4TGpkNkNna2dUVFl6TGpZc01UTXVNbU14TGpFc01Dd3lMREF1Tnl3eUxqTXNNUzQ0YUMwMExqWkROakV1Tnl3eE15NDVMRFl5TGpVc01UTXVNaXcyTXk0MkxERXpMaklnVFRVM0xqa3NNVFl1TW1Nd0xETXVNaXd5TGpZc05TNDNMRFlzTlM0M1l6RXVPU3d3TERNdU1pMHdMalVzTkM0MkxURXVOMnd0TWk0eUxUSUtDV010TUM0MUxEQXVOUzB4TGpNc01DNDRMVEl1TWl3d0xqaGpMVEV1TWl3d0xUSXVNeTB3TGpjdE1pNDNMVEV1T0dnM0xqbDJMVEF1T0dNd0xUTXVOUzB5TGpRdE5pNHhMVFV1TmkwMkxqRmpMVE11TVN3d0xUVXVOeXd5TGpVdE5TNDRMRFV1TmdvSlF6VTNMamtzTVRZdU1TdzFOeTQ1TERFMkxqSXNOVGN1T1N3eE5pNHlJRTAxTWk0eExERXdMakpqTVM0eUxEQXNNUzQ1TERBdU9Dd3hMamtzTVM0M2N5MHdMamNzTVM0M0xURXVPU3d4TGpkb0xUTXVObll0TXk0elNEVXlMakY2SUUwME5DNDVMREl4TGpob015NDJkaTAxTGpOb01pNDNDZ2xzTWk0NExEVXVNMmcwYkMwekxqSXROUzQ1WXpFdU55MHdMamNzTWk0NExUSXVNeXd5TGpndE5DNHhZekF0TWk0MkxUSXVNUzAwTGpjdE5TNHlMVFF1TjJndE55NDFURFEwTGprc01qRXVPSG9pTHo0S1BDOXpkbWMrQ2c9PSIgYWx0PSJSZWQgSGF0IE9wZW5TaGlmdCBDb250YWluZXIgUGxhdGZvcm0gbG9nbyIgY2xhc3M9InBmLWMtYnJhbmQiIC8+CgogICAgICAgIDwvaGVhZGVyPgogICAgICAgIDxtYWluIGNsYXNzPSJwZi1jLWxvZ2luX19tYWluIj4KICAgICAgICAgIDxoZWFkZXIgY2xhc3M9InBmLWMtbG9naW5fX21haW4taGVhZGVyIj4KICAgICAgICAgICAgPGgxIGNsYXNzPSJwZi1jLXRpdGxlIHBmLW0tM3hsIj57eyAuTG9jYWxlLkxvZ0luVG9Zb3VyQWNjb3VudCB9fTwvaDE+CiAgICAgICAgICA8L2hlYWRlcj4KICAgICAgICAgIDxkaXYgY2xhc3M9InBmLWMtbG9naW5fX21haW4tYm9keSI+CiAgICAgICAgICAgIDxmb3JtIGNsYXNzPSJwZi1jLWZvcm0iIHJvbGU9ImZvcm0iIGFjdGlvbj0ie3sgLkFjdGlvbiB9fSIgbWV0aG9kPSJQT1NUIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ7eyAuTmFtZXMuVGhlbiB9fSIgdmFsdWU9Int7IC5WYWx1ZXMuVGhlbiB9fSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ie3sgLk5hbWVzLkNTUkYgfX0iIHZhbHVlPSJ7eyAuVmFsdWVzLkNTUkYgfX0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLXBsYWNlaG9sZGVyIj4KICAgICAgICAgICAgICAgIHt7IGlmIC5FcnJvciB9fQogICAgICAgICAgICAgICAgPHAgY2xhc3M9InBmLWMtZm9ybV9faGVscGVyLXRleHQgcGYtbS1lcnJvciI+CiAgICAgICAgICAgICAgICAgIDxzdmcgc3R5bGU9InZlcnRpY2FsLWFsaWduOi0wLjEyNWVtIiBmaWxsPSJjdXJyZW50Q29sb3IiIGhlaWdodD0iMWVtIiB3aWR0aD0iMWVtIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgYXJpYS1oaWRkZW49InRydWUiIHJvbGU9ImltZyIgY2xhc3M9InBmLW0tZXJyb3JfX2ljb24iPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik01MDQgMjU2YzAgMTM2Ljk5Ny0xMTEuMDQzIDI0OC0yNDggMjQ4UzggMzkyLjk5NyA4IDI1NkM4IDExOS4wODMgMTE5LjA0MyA4IDI1NiA4czI0OCAxMTEuMDgzIDI0OCAyNDh6bS0yNDggNTBjLTI1LjQwNSAwLTQ2IDIwLjU5NS00NiA0NnMyMC41OTUgNDYgNDYgNDYgNDYtMjAuNTk1IDQ2LTQ2LTIwLjU5NS00Ni00Ni00NnptLTQzLjY3My0xNjUuMzQ2bDcuNDE4IDEzNmMuMzQ3IDYuMzY0IDUuNjA5IDExLjM0NiAxMS45ODIgMTEuMzQ2aDQ4LjU0NmM2LjM3MyAwIDExLjYzNS00Ljk4MiAxMS45ODItMTEuMzQ2bDcuNDE4LTEzNmMuMzc1LTYuODc0LTUuMDk4LTEyLjY1NC0xMS45ODItMTIuNjU0aC02My4zODNjLTYuODg0IDAtMTIuMzU2IDUuNzgtMTEuOTgxIDEyLjY1NHoiIHRyYW5zZm9ybT0iIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgICB7eyAuRXJyb3IgfX0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBmLWMtZm9ybV9fZ3JvdXAiPgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJwZi1jLWZvcm1fX2xhYmVsIiBmb3I9ImlucHV0VXNlcm5hbWUiPgogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGYtYy1mb3JtX19sYWJlbC10ZXh0Ij57eyAuTG9jYWxlLlVzZXJuYW1lIH19PC9zcGFuPgogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGYtYy1mb3JtX19sYWJlbC1yZXF1aXJlZCIgYXJpYS1oaWRkZW49InRydWUiPio8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJwZi1jLWZvcm0tY29udHJvbCIgaWQ9ImlucHV0VXNlcm5hbWUiIHBsYWNlaG9sZGVyPSIiIHRhYmluZGV4PSIxIiBhdXRvZm9jdXM9ImF1dG9mb2N1cyIgdHlwZT0idGV4dCIgbmFtZT0ie3sgLk5hbWVzLlVzZXJuYW1lIH19IiB2YWx1ZT0ie3sgLlZhbHVlcy5Vc2VybmFtZSB9fSI+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGYtYy1mb3JtX19ncm91cCI+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InBmLWMtZm9ybV9fbGFiZWwiIGZvcj0iaW5wdXRQYXNzd29yZCI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwZi1jLWZvcm1fX2xhYmVsLXRleHQiPnt7IC5Mb2NhbGUuUGFzc3dvcmQgfX08L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwZi1jLWZvcm1fX2xhYmVsLXJlcXVpcmVkIiBhcmlhLWhpZGRlbj0idHJ1ZSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGNsYXNzPSJwZi1jLWZvcm0tY29udHJvbCIgaWQ9ImlucHV0UGFzc3dvcmQiIHBsYWNlaG9sZGVyPSIiIHRhYmluZGV4PSIyIiB0eXBlPSJwYXNzd29yZCIgbmFtZT0ie3sgLk5hbWVzLlBhc3N3b3JkIH19IiB2YWx1ZT0iIj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZi1jLWZvcm1fX2dyb3VwIHBmLW0tYWN0aW9uIj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InBmLWMtYnV0dG9uIHBmLW0tcHJpbWFyeSBwZi1tLWJsb2NrIiB0eXBlPSJzdWJtaXQiIHRhYmluZGV4PSIzIj57eyAuTG9jYWxlLkxvZ0luIH19PC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvbWFpbj4KICAgICAgICA8Zm9vdGVyIGNsYXNzPSJwZi1jLWxvZ2luX19mb290ZXIiPgogICAgICAgICAgPHA+e3sgLkxvY2FsZS5XZWxjb21lVG8gfX0gUmVkIEhhdCBPcGVuU2hpZnQgQ29udGFpbmVyIFBsYXRmb3JtPC9wPgogICAgICAgIDwvZm9vdGVyPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvYm9keT4KPC9odG1sPgo= +kind: Secret +metadata: + name: oauth-openshift-default-login-template + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_default_provider_selection_template_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_default_provider_selection_template_secret.yaml new file mode 100644 index 000000000000..a71780ebbb7a --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_default_provider_selection_template_secret.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + providers.html: PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuLXVzIiBkYXRhLXRlc3QtaWQ9ImxvZ2luIj4KICA8aGVhZD4KICAgIDx0aXRsZT4KICAgICAgCiAgICAgICAge3sgLkxvY2FsZS5Mb2dJbiB9fQogICAgICAKICAgICAgIMK3IFJlZCBIYXQgT3BlblNoaWZ0IENvbnRhaW5lciBQbGF0Zm9ybQogICAgPC90aXRsZT4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9ImRhdGE6aW1hZ2UveC1pY29uO2Jhc2U2NCxBQUFCQUFRQU1EQUFBQUVBSUFDb0pRQUFSZ0FBQUNBZ0FBQUJBQ0FBcUJBQUFPNGxBQUFRRUFBQUFRQWdBR2dFQUFDV05nQUFRRUFBQUFFQUlBQW9RZ0FBL2pvQUFDZ0FBQUF3QUFBQVlBQUFBQUVBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNqTHlIYlppOGgyNTB2SWR2SUx5SGI1QzhoMi9Zdklkdi9MeUhiL2k4aDIvUXZJZHZqTHlIYnh5OGgyNWt2SWR0Z0x5SGJIUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNFTHlIYlhTOGgyOEF2SWR2bUx5SGI4UzhoMi9vdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9rdklkdnhMeUhiNXk4aDI3c3ZJZHRhTUNEY0JRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyMkl2SWR2V0x5SGI5UzhoMi80dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzB2SWR2NEx5SGIxQzhoMjEwdklkc0NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzeUx5SGJ3QzhoMi9vdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL2k4aDIvOHZJZHUrTHlIYktBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjJndklkdnFMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI5aThoMjFzdklkc0VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkMEpMeUhiaFM4aDIvMHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHQ5THlIYkNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURFaHl3MHZJZGlMTHlIYS95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi80dklkdjlMeUhiL2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJqQzhoMndnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNmdFbkl1b1BKeUxxRGljaTZnUUFBQUFBTWlITENEUWd2WUEwSUwzL01pSEgvekFoMC84dklkbi9MeUhhL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9ZdklkdnZMeUhiNlM4aDI5QXZJZHU5THlIYnZ5OGgyOUl2SWR2b0x5SGI3eThoMi9jdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIzOHZJZHNGQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZoWW5JdXJHSnlMcXZDY2k2bDBtSXU0ZU1TREVZalFndS93MElMbi9OQ0M1L3pRZ3VmOHpJTC8vTVNITC96QWgxZjh2SWRuL0x5SGEveThoMi84dklkdnZMeUhiemk4aDIzZ3ZJZHN3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiTXk4aDIzMHZJZHZKTHlIYjhpOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR0Y0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlIcUF5Y2k2bm9uSXVyL0p5THEveWNpNnY4bkl1ajVMQ0haNnpFZ3h2OHpJTC8rTkNDOC96UWd1djgwSUxuL05DQzQvelFndXY4ekljUC9NU0hSOXk4aDJzZ3ZJZHRYQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJXQzhoMjhRdklkdjRMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjRMeUhiS1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFJQ2NpNnZZbkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcy95Y2k3UDRwSXVMK0x5SFA1alFndmMwMElMcmhOQ0M2K3pRZ3V2ODBJTG53TXlDL2l6SWZ1d29BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3OHZJZHVITHlIYjZ5OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnZ5OGgyd1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxakNjaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1djJKU0x3Y3lzaDRoQTBJTDFHTkNDOGxEUWd1OFl6SUwxbUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJaUzhoMitRdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjEwQUFBQUFBQUFBQUFBQUFBQW5JdW9SSnlMcTd5Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXFmSnlMcERnQUFBQUFBQUFBQUFBQUFBQzRqMFFrQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDIyVXZJZHZzTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI5Y3ZJZHNGQUFBQUFBQUFBQUFuSXVwYkp5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dFVuSXVvM0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR1SUx5SGIrQzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL3N2SWR0WEFBQUFBQUFBQUFBbkl1cTRKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEvQ2NpNm93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc1FMeUhid2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi8wdklkdThBQUFBQUFBQUFBQW5JdXBnSnlMcXB5Y2k2dVVuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxMlNjaTZrQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYldTOGgyL0F2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHZzTHlIYkd3QUFBQUFBQUFBQUp5THFHQ2NpNmtRbkl1cDFKeUxxdHljaTZ2WW5JdXIvSnlMcnRSZ24vd0VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1CdktBUzhoM01zdklkei9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2MEx5SGJZQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcUlpY2k2MGNvSXVhUUtpSGZsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBaDBvWXZJZGYzTHlIZC95OGgzUDh2SWR2L0x5SGIveThoMi84dklkdjZMeUhibWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeUlNbENNeURHN3pRZ3c3RTBJTU5zTkNEREd3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxQVFBQUFBQUFBQUFBQUFBQUFETWh2MHN6SU1Ed015REYvekVoei84dklkbi9MeUhkL3k4aDNQOHZJZHYvTHlIYnhnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTFJTUZpTkNERC96UWd4UDgwSU1Qdk5DREQyRFFndzZnMElNTlVOQ0hEQndBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2ajRuSXVwREFBQUFBRHdmblJFMElManBOQ0M2L3pRZ3ZmOHpJTC8vTWlERy96RWgwUDh2SWR2L0x5SGQzUUFBQUFBQUFBQUFBQUFBQUM4aDJ3d3ZJZHVYTHlIY1lEUWh4UnM2SWF4L09TR3gvemNodWY4MElNRC9OQ0RFL3pRZ3hQdzBJTVB2TkNERHlqUWd3eTRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNm5Bbkl1cmRKeUxxMVNZaTdZUXhJTVByTlNDNC96UWd1UDgwSUxuL05DQzcvelFndmY4eklMLy9NaURHNURFZ3pCUUFBQUFBQUFBQUFDOGgyeEF2SWR2Zkx5SGI5UzhoMnVZeUljM2xOeUczL0RvaHJmMDZJYTMvT1NHei96WWd2UDgwSU1QL05DREUzRFFneERBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZud25JdXIxSnlMcS95Y2k2dllvSXVmOUtpTGYreThoei9reklMNzdOQ0M1L3pRZ3V2ODBJTHIvTkNDNzVqSWh3U01BQUFBQUFBQUFBQzhoMnhBdklkdmdMeUhiL3k4aDIvOHZJZHIvTHlIYS9qRWgxUHMwSWNUNE9TRzAvVG9ocmY4NkliRC9PQ0cxMERZaHVpc0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2cEluSXVyN0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZmOG9JdWovTGlIUWhEUWd2YkEwSUx6L05DQzY3VFFndlNZQUFBQUFBQUFBQUM4aDJ3OHZJZHZUTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhadURVaHYxMDZJYTZsT1NHdnlEa2hyekFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNnJNbkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5UG9Kam9mckFNeUlNVVhNeURCV3pRZ3ZCWUFBQUFBQUFBQUFDOGgyd3d2SWR1OEx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnlpOGgyek1BQUFBQU55RzhCamNodXdJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxSVNjaTZzc25JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1cjVJeWJ1QVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMndrdklkdVlMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI2aThoMjFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcVlDY2k2dWduSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXJIQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3VXZJZHRvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIzd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFxU2NpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVxQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzd0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyN3d2SWRzbkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b2xKeUxxc0NjaTZ1OG5JdXI0SnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1b3hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc1VMeUhiMkM4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi80dklkdGpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2akVuSXVxTkp5THEweWNpNnVzbkl1cjhKeUxxL3ljaTZ0UUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNLTHlIYmdpOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHZDTHlIYkt3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxQXljaTZrd25JdXVnS0NMbjdTa2k1SFVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJNaThoMi8wdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJrQzhoMnc0QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1pSEpzRE1neFo0MElNTlFOQ0RES3pRZ3d3MEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiRUM4aDI2RXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIzb3ZJZHNKQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkVTOGgyeW92SWRzUkFBQUFBQUFBQUFBM0liaG1OU0RBK3pRZ3cvODBJTVQvTkNERDBqUWd3NGswSU1OTE5DRERKalFnd3djQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyejR2SWR2MUx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL2t2SWR0K0x5SGJFUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzVEx5SGJoeThoMjhZdklkdVlMaUhkVnpRaHcxbzZJYkRzT0NHei96Y2d1ZjgxSUwzL05TREIvelFneFA4MElNVCtOQ0REdmpRZ3cyNEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMnd3dklkdUtMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhibmk4aDJ6Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMnpVdklkdWlMeUhiK1M4aDIvOHZJZHYvTHlIYytURWgwZlEwSWNYOE55Rzcremtoc3ZzNkliRC9PQ0MwL3pjZ3VmODJJTDcvTlNEQi96UWd3NThBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNsTHlIYnhpOGgyLzh2SWR2K0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyODh2SWR0K0x5SGJOd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc3pMeUhiZkM4aDI5SXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoM1A4dUlkNy9NQ0hZK3pJaHovODJJY0xVT2lHdXRUb2hydXc1SWJIL09DQzIyeklneHhzQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJTQzhoMitNdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiemk4aDI1NHZJZHR1THlIYlNpOGgyekV2SWRzakx5SGJKQzhoMnpBdklkdElMeUhiYlM4aDI1b3ZJZHZOTHlIYi9DOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYy95OGgzZkl1SWVGRk9DRzFJVGtoc1U4NkliRi9PaUd1WGdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMaUhiQXk4aDIyTXZJZHZ2THlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2ekx5SGIzUzhoMjg0dklkdkZMeUhieFM4aDI4MHZJZHZiTHlIYjh5OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIvUzhoMjE0QUFBQUFBQUFBQUFBQUFBQUFGdjhCTUNIS0JBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyd1l2SWR0c0x5SGI3eThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjhMeUhiWXk4aDJ3TUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdUlkc0ZMeUhiWEM4aDIrTXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIrc3ZJZHRWTHlIYkJRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTGlIYkF5OGgyem92SWR2Q0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYndDOGgyemd2SWR3Q0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc1VMeUhiZWk4aDIvTXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL1F2SWR0M0x5SGJHd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkJTOGgyeVF2SWR1T0x5SGI5aThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2ekx5SGJrUzhoMnlndklkc0ZBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc0VMeUhhRmk4aDIya3ZJZHZDTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJ5QzhoMjJjdklkc2FMeUhiQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyd0V2SWRzQ0x5SGJEeThoMjBZdklkdDJMeUhibXk4aDI3VXZJZHZBTHlIYnhDOGgyN2N2SWR1Zkx5SGJlUzhoMjBjdklkc1VBQUFBQUM4aDJ3RUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvLy8vLy8vOEFBUC8vLy8vLy93QUEvLy93QS8vL0FBRC8vNEFBZi84QUFQLytBQUFmL3dBQS8vZ0FBQWYvQUFELzhBQUFBLzhBQVAvQUFBQUIvd0FBLzRBQUFBQi9BQUQvQUFBQUFIOEFBT2NBRC93QVB3QUE0QUEvL3dBZkFBREFBSC8vZ0E4QUFJQTUvLy9nRHdBQWdELy8vL0FIQUFDQWYvLy84QWNBQUFCLy8vLzRBd0FBZ1AvLy8vd0RBQUR3Ly8vLy9BTUFBUHovLy8vOEFRQUEvbi8vLy80QkFBRCtELy8vL2dFQUFPNEQvLy93QVFBQTRBUC8vL0FCQUFEZ0EvLy80QUVBQU9BVC8vL2dId0FBNEIvLy8rQWZBQURnSC8vLzRCOEFBUEFmLy8vQUh3QUE4QS8vLzhBL0FBRHdELy8vOEQ4QUFQQUgvLy8rZndBQStBUC8vLzgvQUFENEEvLy8vd2NBQVB3Qi8vL0dBUUFBL0FCLy80QUFBQUQrQUQvL0FBRUFBUDhBQi9nQVB3QUEvNEFBQUFCL0FBRC93QUFBQVA4QUFQL2dBQUFCL3dBQS8vQUFBQVAvQUFELy9BQUFELzhBQVAvK0FBQWYvd0FBLy8vQUFQLy9BQUQvLy93UC8vOEFBUC8vLy8vLy93QUEvLy8vLy8vL0FBQW9BQUFBSUFBQUFFQUFBQUFCQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzQk1DTFpCQzhoMjFNdklkdThMeUhiL2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2VUx5SGJkQzhoM0E0dklkc0NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiSlM4aDI3UXZJZHYxTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyODR2SWR0YkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkJTOGgyNEF2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHZITHlIYkdRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoNHdRdklkdmNMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjZMeUhiUWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXlJY29QTVNIUDR5OGgyZjh2SWR6L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL2N2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzR2SWR2L0x5SGJTZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2cnduSXVwWkFBQUFBRE1ndmVRMElMci9OQ0M2L3pJaHhmOHdJZGYvTHlIYi95OGgyLzh2SWR2OEx5SGJxQzhoMnpJQUFBQUFBQUFBQUFBQUFBQXZJZHNaTHlIYmZpOGgyL0l2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYktRQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1cVBKeUxxL3ljaTZ2OG5JdWo3S3lIYi96QWh5L28wSUx6L05DQzUvelFndWY4eklMLy9NQ0hVakM4aDJ4Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiQXk4aDIxWXZJZHY0THlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdmlMeUhiQ0FBQUFBQUFBQUFBSnlMcUZ5Y2k2dlFuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxyOXlVaTh4YzBJTHh2TkNDNzNqTWd2MVVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMndjdklkdmVMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR0eUFBQUFBQUFBQUFBbkl1cFpKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dnduSXVvN0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgzQkV2SWR2NUx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHNOQUFBQUFDY2k2c1FuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxendBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ5OHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjNzQUFBQUFKeUxxRmljaTZxTW5JdXIvSnlMcS95Y2k2djhuSXVvOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjY4dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYndpOGgyd0VBQUFBQUFBQUFBQ2NpNmdrbkl1cEpLU0xrdkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUNIVFZpOGgyUDh2SWQzL0x5SGIveThoMi84dklkdnNMeUhiQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUExSU1LWE5DREQvelFndzUwMElNTW1OQ0REQ2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFCaWNpNmdrMkliVWJOQ0M1L3pNaHcvOHdJZFAvTHlIWi95OGgyLzh2SWQwSEFBQUFBQUFBQUFBdklkdVFMeUhiR2pvaHJiYzRJYmYvTkNEQy96UWd4UDgwSU1Qbk5DRERZUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdW84SnlMcTRpWWk3cFF6SUw3L05TQzQvelFndWY4MElMei9NeURDL3pJZ3lTNEFBQUFBQUFBQUFDOGgyL1l2SWR2L01TSFIvRFlodnZzNUliTDhPU0d6L3pZZ3ZQODFJTUJnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNmtjbkl1citKeUxxL3lZaTdmOHFJdUQ3THlITTlEUWd1K0EwSUxyL015RzlSQUFBQUFBQUFBQUFMeUhiNkM4aDIvOHZJZHYvTHlIYi95OGgyLzh6SWN0ZU9pR3Z2amtocjJZQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcVppY2k2djhuSXVyL0p5THEveWNpNnY4bkl1clVMU0xXQkRNZ3d5MDBJTDBoQUFBQUFBQUFBQUF2SWR2TEx5SGIveThoMi84dklkdi9MeUhiL3k4aDNISUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1cXlKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2ckFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI1b3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJ4Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcUNpY2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxV1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJYQzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYxTHlIYkVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b09KeUxxWHljaTZ0NG5JdXIvSnlMcS95Y2k2djhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNiTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdXJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNmkwbkl1cWRLaUxpbHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdXRMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR0NEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEUWd4RWcwSU1QL05DREQ0elFndzFjQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgydzB2SWR2Mkx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHQ0QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzNkx5SGIxaThoMjZZeUljMXZPaUd2L3pnaHRQODJJTHovTkNERC96UWd4UFUwSU1Pb0FBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI0QXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdS9MeUhiRXk4aDJnSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc0pMeUhiY2k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR6OU5DSEcrVG9oc1BJNklhMzVPQ0czL3pRZ3dXRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjdJdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2N0x5SGIwaThoMjRjdklkdE1MeUhiTVM4aDJ6NHZJZHR0THlIYnV5OGgyK3d2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHo2THlIZUZ6a2hzU001SWJOV1RpTm5BUUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdJZHNCSHlEZkFTOGgyOGd2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI5UzhoMnkwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI2c3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIrNHZJZHdVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjJVdklkdnZMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR1YUx5SGJEZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR1Tkx5SGI5QzhoMi93dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9jdklkdkZMeUhiSHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNMTHlIYk15OGgyMmd2SWR1Zkx5SGJ3eThoMjlFdklkdk1MeUhic0M4aDIzOHZJZHRDTHlIYkdnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvLy8vLy8vLy8vLy9nUC8vL0FBZi8vQUFCLy9nQUFQL3dBQUIvWUEvQVBnQS84QjRHLy9nZUQvLzhEQS8vL2c0Zi8vNEgzLy8vQjhmLy93ZEIvL3dIQWYvOEJ3WC8vQjhILy9nZkEvLzRQNFAvL0QrQi8vOC9nZi8vbjhELytRUEFQL0FINEFlQVAvQUFBSC80QUFELy9nQUIvLzhBQi8vLzhILy8vLy8vL0tBQUFBQkFBQUFBZ0FBQUFBUUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNITHlIYlRpOGgyOU12SWR2L0x5SGIveThoMi84dklkdXNMeUhiS3k4aDJ3SUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdUlkOGxMeUhiM0M4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdTJMeUhiQlM4aDJ3RUFBQUFBSnlMcUJDY2k2aUl5SU1Bd01pSE4vekFoMS84dklkci9MeUhiNnk4aDI5QXZJZHZBTHlIYjJTOGgyL2N2SWR2L0x5SGIveThoMjc4QUFBQUFBQUFBQUNjaTZqOG5JdXI0S0NMbTh5OGh6K0EwSUx2Nk1pREdraTRoNFJJQUFBQUFBQUFBQUM4aDJ3SXZJZHNnTHlIYjBTOGgyLzh2SWR2L0x5SGJuQUFBQUFBbkl1cThKeUxxL3ljaTZ2WVhKZjhHQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3WXZJZHZzTHlIYi95OGgyL0F2SWRzUkp5THFQaWNpNnRFbkl1dW9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiTWk4aDNQOHZJZHYvTHlIYlNnQUFBQUFBQUFBQU5TRytuVE1neFhNeklNVWxBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFEU29pNERzekljVHRNU0hRL3pBaDFwUXZJZHNVTHlIYjZqTWh5L2s1SWJUL055RzZvd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2aTRuSXVyL0tTTGsvakVoeCtNMElMdXpMeUhiRFM4aDIrNHZJZHovTGlIZXpVVWhmdzRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdXBxSnlMcS95Y2k2djhsSXZGSU5CL0ZCQUFBQUFBdklkdmFMeUhiL3k4aDIvOHZJZHNaQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxWFNjaTZ2UW5JdXIvQUFBQUFBQUFBQUFBQUFBQUx5SGJVUzhoMi84dklkdi9MeUhicEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGdneXdVQUFBQUFNaURLdURRZ3hIVXpJTVVaQUFBQUFBQUFBQUF2SWR2TUx5SGIveThoMi84dklkdTFMeUhiRHk4aDJ3UXZJZHNDTHlIYkJTOGgyeDR2SWR2bkx5SGEvallod1B3NEliVDFOU0RBNFFBQUFBQUFBQUFBTHlIYklDOGgyL3d2SWR2L0x5SGIveThoMi9FdklkdkhMeUhidkM4aDI5RXZJZHYvTHlIYi95OGgyLzh2SWQyc09DRzVDandocGhJQUFBQUFBQUFBQUFBQUFBQXZJZHNPTHlIYjJDOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvb3ZJZHV3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ3Z3ZJZHMrTHlIYm5TOGgyOWd2SWR2bkx5SGJ5aThoMjRFdklkc3FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRDhId0FBOEFjQUFPQURBQUNENFFBQUgvRUFBSi81QUFEZitBQUFoL0FBQUkvekFBQ1A4d0FBeC9zQUFNUGdBQURnQXdBQThBY0FBUHdmQUFELy93QUFLQUFBQUVBQUFBQ0FBQUFBQVFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNwTHlIYmVDOGgyN2d2SWR2Y0x5SGI3UzhoMi9ndklkditMeUhiL3k4aDIvd3ZJZHZ6THlIYjVpOGgyOVV2SWR1ZUx5SGJWU2NTNHdNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkc05MeUhiUkM4aDI1Z3ZJZHYwTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiMEM4aDIzTXZJZHN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdUtMeUhiOUM4aDIvMHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYit5OGgyK012SU50TEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1DSGJDeThoMjRNdklkdjBMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjlJdklkdGFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1DSGJRQzhoMi9ndklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI5QXZIdHdOQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzQkx5SGJyaThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYitTOGgyM2NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzakx5SGI3UzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJyUzhnMndnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWQxS0x5SGI5eThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdmNMeUhiRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF1SWQxQUx5SGIvaThoMi80dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI5c3ZJZHNSQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF6SU1WVU5DQysvekVoMGY4dklkMy9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYjZpOGgyeEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1bzNKeUxxTndBQUFBQUFBQUFBQUFBQUFBQUFBQUF3SWRBZU5DQzg4elFndXY4MElMai9OQ0M4L3pJZ3lQOHdJZFAvTHlIYy95OGgzUDh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2YUx5SGJyQzhoMjRZdklkdHBMeUhiVlM4aDIxUXZJZHRkTHlIYmRDOGgyNUl2SWR1OUx5SGI4QzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2Q0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b0JKeUxxNUNjaTZ2OG5JdXJySnlMcWFpY2k2Z2N3SXQ0TE15QzkrVFFndXY4MElMci9OQ0M2L3pRZ3V2ODBJTHIvTkNDNi96UWd1djh5SWN6L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyNTB2SXRzU0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkczVMeUhiMGk4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjdFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxb2ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyMktTTGoyREFoeWZzMElMbjhOQ0M0L3pRZ3V2ODBJTHIvTkNDNi96UWd1djgwSUxyL05DQzUvelFndS84eklNTC9NU0hPL3pBaDJmOHZJZHYyTHlIYmN6QWgyeEVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNzTHlIYm9pOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MaUhhUlFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxTUNjaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1di9KeUxyK2kwaDFma3pJTUQ3TkNDOC96UWd1djgwSUxyL05DQzYvelFndXY4MElMci9OQ0M2L3pRZ3VmOHlJTWpOS1NMekN3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWRzN0x5SGI3UzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHRJZGNGQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZxUW5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXYvSnlMcS95b2k0YnN6SU1CN05DQzg2VFFndXY4MElMci9OQ0M2L3pRZ3V2OHlJTUowQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoM0FvdklkdXlMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnBqRWgyd0VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNnaTZnOG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dE1BQUFBQUFBQUFBQUFBQUFBeklNTkNOQ0M5cnpRZ3UrRXpJTDlkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI1WXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyL3d2SWRzWEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdXF2SnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2dmNuSXVvZUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXlJTUVLTENmS0FRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYmppOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGJ4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JK2tSSnlMcThpY2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVwb0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYkFRQUFBQUF2SWR2Q0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkc3RBQUFBQUFBQUFBQUFBQUFBSnlMcU9TY2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVySEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1pVGJDQzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhialFBQUFBQUFBQUFBQUFBQUFDY2k2bzRuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THFVUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdE5MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIrTUFBQUFBQUFBQUFBQUFBQUFuSXVxWUp5THE4U2NpNnY0bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEraWNpNmdFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiQkM4aDI5c3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTUNIYk1BQUFBQUFBQUFBQUFBQUFBQ2dpNnhRbkl1cEZKeUxxc3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNm9jQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXVJZHRRTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyNlFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JK29NSnlMcWdTY2k2dFFuSXVyN0p5THEveWNpNnY4b0l1b1VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyK2t2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2MUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFsSXV3Rkp5UHFHeWNpNm9BbUl1dlVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR0L0x5SGMveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIrUzhoMngwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFOU0RCM3pRZ3c3STBJTU5XTkNEREZ3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU5TQzVTek1odi84eUljei9NQ0hWL3k4aDNQOHZJZHovTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi93dklkczVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNaURCQ2pRZ3cvODBJTVAvTkNERC96UWd3LzAwSDhPNk15RERLZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRFFndWlzMElMcjdOQ0M2L3pRZ3V2ODBJTHovTVNITS95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiVGdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURjZ3UxUTFJTUgvTkNERS96UWd3LzgwSU1QL05DREQvelFndy84MElNUGFOQ0REa2pRZnd6Y0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2g2bGtuSXVxSUp5THNLZ0FBQUFBM0lMUU5OQ0M2K1RRZ3V2ODBJTHIvTkNDNi96UWd1ZjgwSUxyL015REQvekVoemY4d0lkai9MeUhkL3k4aDNHd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjdBdklkdFJMeUhjQ3dBQUFBQTVJYktOT2lHcy96Z2hzLzgxSUwvL05DREMvelFndy84MElNUC9OQ0REL3pRZ3cvODBJTVAvTkNERDBnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFuSXV0cUp5THEveWNpNnY4bkl1cldKU0x3U0RNZ3ZmUTBJTHIvTkNDNi96UWd1djgwSUxyL05DQzYvelFndXY4MElMci9OQ0M0L3pNZ3d2OHhJYytMQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdmdMeUhiL3k4aDIrNHZJZHk0TmlIQTJEb2hxLzQ2SWF6L09pR3Qvemtoc1A4NEliWC9OU0MvL3pRZ3hQODBJTVAvTkNERC96UWd3N3NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUp5THFkQ2NpNnY4bkl1ci9KeUxxL3ljaTZ2OG9JdWY3S2lMZCtEQWh5dmsxSUxqOU5DQzUvelFndXY4MElMci9OQ0M2L3pRZ3V2ODBJTHIvTkNDOHF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiNFM4aDIvOHZJZHYvTHlIYi95OGgzUDh2SWRyNU5DSEY4emdodFAwNklhNzhPaUdzL3pvaHJQODVJYkgvTmlDNy96VWd3ZjgwSU1PZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2NpNnBNbkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXV6L0p5THE5aTBoMVBjeUlNSHpOQ0M3K1RRZ3V2ODBJTHIvTkNDNi96TWd2SzBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDI5NHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkcitNQ0hXL0RRaHh2VTVJYS85T2lHdC96b2hyZjg2SWE3L09TR3lvZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1ckdKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxwb2prZ3JoTXlJTU9CTkNDOStqUWd1djgwSUxxdUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHZUTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHovTGlIZmhEa2hzVXc1SWEreE9pR3U2amtoc0s4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljajZuWUFBQUFBQUFBQUFBQUFBQUF5SU1kTU5DQy9hd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHlIYnd5OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyN1FBQUFBQU5pQzhBVGtoc0FRNEliZ1hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKeUxxTFNjaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdW8rQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyNm92SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2Vk1DRGJCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNjaTZuSW5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXI2SnlMcUhnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR1TEx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI3UzhoMnhFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdXJCSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcTZDY2k2ZzhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJWeThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklOczJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdW9lSnlMcS95Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2czBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMnh3dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhidndBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnlMcXZ5Y2k2djhuSXVyL0p5THEveWNpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVwdEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiNHk4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHhJZHNwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDY2k2aFFuSXVwSUp5THF3Q2NpNnY4bkl1ci9KeUxxL3ljaTZ2OG5JdXIvSnlMcS95Y2k2djhuSXVyL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDIyOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYnF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkl1b2RKeUxxaVNjaTZ0RW5JdXIvSnlMcS95Y2k2djhuSXVyL0p5THFvd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNVTHlIYitTOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh3SXRzZUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW5JdW9FSmlIcEdDY2k2cFFuSXVyL0p5THEvU2NpNmp3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUNIYkF5OGgyOHd2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI2aTRoMndvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU15TEtHakFnei9BeklNWmdPQ0REQ2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2SWR0YUx5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdW5BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRFFndzVvMElNUC9OQ0REL3pRZ3cvODBJTU9vTkNEREhqVWd4QVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzhoMjkwdklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDI1NEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUMwaDJ4SXZJZHNiQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGdodGw0MElNUC9OQ0RFL3pRZ3cvODBJTVAvTkNERC96UWd3LzgwSU1QWE5DRERralFnd3lrQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkcEJMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYmh5c2gyUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ4QXZJZHZaTHlIYi95OGgyOGN2SWR4Rkx5SGRFVGtocnprNklhMy9PaUdzL3pnaHRmODFJTC8vTkNEQy96UWd3LzgwSU1QL05DREQvelFndy84MElNUC9OQ0REMlRVZ3cwMEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLUmJYQVM4aDI5Y3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2SUx4cllCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUM4aDJ6a3ZJZHZyTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMitveElkRHJOeUczOHpzaHF2ODZJYXovT2lHdC96b2hyLzg0SWJQL05pQysvelFneFA4MElNUC9OQ0REL3pRZ3cvODBJTU9rQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJZHNjTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi9jdklkdE9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeURhRGpBaDI0QXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDNmOHdJZGozTkNIRDhEZ2h0dnM2SWE3Nk9pR3Qvem9oclA4NklhLy9OeUc0L3pVZ3YvODBJTUw0WXlDZkFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDOGgyMmd2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL2k4aDIrZ3ZJZHM4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeUhiY1M4aDIva3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWRyK01DSFk4VFlodVpzNUliSC9PaUd0L3pvaHJmODZJYTMvT1NHeGJRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJ0QzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyOWt2SWR1REx5SGJRUzhoMnhNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUxpSGFIeThoMjFBdklkdVhMeUhiN3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjJFQUFBQUFBQUFBQURZaHVWRTRJYlNuT1NHd3lUZ2V0QWNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkdlNMeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiK0M4aDI4c3ZJZHVvTHlIYnB5OGgyN0l2SWR2U0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjN3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMeURiRnk4aDIrb3ZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjZFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdJTmdKTHlIYjRpOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMjZVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDNGgydzh2SWR2S0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoM0g0dk05VUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF5SWRvQkFBQUFBQzhoMjY0dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI5aThoMjJ3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBM0ZONEJMeUhiVEM4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGI1QzRmM0IwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXZJOXNTTHlIYnFTOGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2MUx5SGJmZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3SWRvWkx5SGIxUzhoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR1Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdklkbzFMeUhia1M4aDIvUXZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYjFpOGgyM0V2SWRzZEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTGlIYlN5OGgyN3N2SWR2c0x5SGI5UzhoMi80dklkdi9MeUhiL3k4aDIvOHZJZHYvTHlIYi95OGgyLzh2SWR2L0x5SGIveThoMi84dklkdjhMeUhiOHk4aDIrY3ZJZHVqTHlIWktRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUx5SGJDQzhoMnlBdklkczBMeUhiVWk4aDIzY3ZJZHVTTHlIYm5TOGgyNlV2SWR1Zkx5SGJqaThoMjNFdklkdEtMeUhiTUM4aDJ4b3ZJZHNDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy84QUgvLy8vLy8vOEFBRC8vLy8vLytBQUFCLy8vLy8vZ0FBQUIvLy8vLzhBQUFBQi8vLy8vQUFBQUFELy8vLzRBQUFBQUQvLy8vQUFBQUFBSC8vLzRBQUFBQUFQLy8vQUFBQUFBQWYvLzRBQUI4QUFBLy9IQUFCLy9BQUIvNEFBQS8vL0FBSC9nQUFILy8vQUFQOEFCQi8vLytBQWZ3QVBQLy8vOEFCK0FCLy8vLy80QUQ0QVAvLy8vL3dBUGdBLy8vLy8vZ0FjQUgvLy8vLy9BQndBZi8vLy8vOEFINEIvLy8vLy80QVA0UC8vLy8vL2dBLzgvLy8vLy8vQUQvNS8vLy8vLzhBUC9nLy8vLy8vd0EvK0FmLy8vLzNBRDl3QWYvLy8vRUFId0FCLy8vLzhBQWZBQUgvLy8vZ0FCOEFBZi8vLytBQ0h3QVIvLy8vNEFmL0FCLy8vLy9nQi84QUgvLy8vK0FIL3dBZi8vLy93QWYvZ0IvLy8vL0FCLytBRC8vLy80QVAvNEFQLy8vLzRBLy93QWYvLy8vNEQvL0FCLy8vLy84Zi84QUQvLy8vLzkvLzRBSC8vLy8vZy8vZ0FQLy8vLytBZi9BQWYvLy94d0FmOEFBLy8vK0FBQS80QUIvLy9nQUFIL3dBQi8vOEFBQS8vQUFBLytBQUR6LytBQUFBQUFBZi8vOEFBQUFBQUIvLy80QUFBQUFBUC8vL3dBQUFBQUQvLy8vZ0FBQUFBZi8vLy9nQUFBQUQvLy8vL0FBQUFBLy8vLy8vQUFBQUgvLy8vLy9BQUFELy8vLy8vL2dBQS8vLy8vLy8vK0QvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy93PT0iPgoKICAgIDxzdHlsZT4KICAgICAgQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiAnUmVkSGF0VGV4dCc7IHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R1JnQUJBQUFBQUkwaEFCSUFBQUFCSlV3QUFRQUFBQUNMaUFBQUFaa0FBQVJqQUFBQUFBQUFBQUJDUVZORkFBQUJsQUFBQURvQUFBQTZpeVdVc1VSVFNVY0FBSXVBQUFBQUNBQUFBQWdBQUFBQlIxQlBVd0FBQWRBQUFBMEVBQUFpS2cwWmhCdEhVMVZDQUFBTzFBQUFBdWNBQUFZb2NBTnY4RTlUTHpJQUFCRzhBQUFBV0FBQUFHQm1CNERSWTIxaGNBQUFFaFFBQUFQdkFBQUZ0RzlNL1ZkamRuUWdBQUNEbUFBQUFFMEFBQUI0TElmKytXWndaMjBBQUlQb0FBQUc4Z0FBRGhXZU5oUE9aMkZ6Y0FBQWc1QUFBQUFJQUFBQUNBQUFBQkJuYkhsbUFBQVdCQUFBWGNnQUFNaFM3Y2swc0dobFlXUUFBSFBNQUFBQU5nQUFBRFlVcTQ3WGFHaGxZUUFBZEFRQUFBQWhBQUFBSkFmakJIVm9iWFI0QUFCMEtBQUFBeUlBQUFhYWNBeFFGbXh2WTJFQUFIZE1BQUFEVUFBQUExREx1dnhKYldGNGNBQUFlcHdBQUFBZ0FBQUFJQUw3RHpCdVlXMWxBQUI2dkFBQUF3OEFBQWxSS0tqSlYzQnZjM1FBQUgzTUFBQUZ3UUFBQ2duMHBwL1ljSEpsY0FBQWl0d0FBQUNpQUFBQXZlRzJYaU1BQVFBQUFBZ0FBQUFFQUE0QUFtbGtaVzl5YjIxdUFBSkVSa3hVQUE1c1lYUnVBQTRBQmdBQUFBQUFBUUFDQUFnQURBQUIvMklBQVFBQUFBQjQycldaRFhCVTFSWEh6OTNOUXRoQVFvQWtKRkFNOGhVZ2hFOFJKZGgyYXAxcHRhTWlXbXRyOGFPZE9pV2lZTEV6ZGNaT3JSVmFwNHI0RVVHczFBOEVRZm1JUUVCQVJhcEFsVUdzOGtJSUpEVnAyRTBvQmtOTWpjbnQ3OTU5dTluZExMQ2s5WjM1di9keVA4NDk5OXh6Ly9lOGpTZ1I4Y3Nkc2xFOGwxOXgxU3hKTDduMVYzTWxUMUlvRjYzRjFBK1dsRy9mOU4xOEdmNmRtYlB5cFhEbTFUL0lseW16Wmw2Wkw4VnVHK1UrUGU3VDZ6NVQzS2RQZXN6NStmeTVNdExlQysxOWtyMVBzL2ZMN1AxeXhqTGpuZjF1dERJTzhQdVdpeHJVejlxYUxWTmxsc3lYeGJMWmsrcEo5Njd3cnZTdVRabWI4blRLOHlsdnBmelRsK0x6Ky9yNnNuM1RmTi8zbFVoUHlkTU5NaGlVNmhaWnFodFVrUTZvWXQya1p1aFBUSzMwcHJhRjJnQzFoMVNPZnB2YVJXcTJmdGIyYmFKMnQ1U0tuNW9LYXBiUXI0cmFENlVYZlRQeFdBWjltNnptSEYyamlzUkRxM0kxZytkczdXQnBUL3FuZ2Y0Z0N3eGl0TkU4eDRDeG9CQ01BOU5CTVpnQkxnTTNnQitDRzhHUHdFM2d4K0FuNEdid1V6QWJQS2dQeWgvQVEyQWhXQVFXZ3lYZ1NmQVVWcFRxUGJJTXJPVHZsOEVxc0JxOEF0YUF0V0FkV0E4MmdJMmdETHdPTm9ITm9CeHNCZHZBRzJBNzJBRU9BUWRVZ01PZ0Vod0JWZUFvT0FhcVFRQUVRUU5vMUFkVkQ5QVRwSUpld0EvU1FHL1FCNlNEREpBRnNzRXRlcmU2bGZrcWZOMG1QNU1IZEN0ekR6TDNJSE1QeWtLaWV4SFB4V0FKZUlLNGVaS3lVbFpvR2M5bndITDZQQXYrQXA0REs4QmZ3ZlBnQmZBaWVBbXNwUC9MWUJWWURWNEJhOEJhc0E2c0J4dkFSbEFHWGdlYndHWlFEcmFDYmVBTnNCM3NBSWVBQXlyQVlWQUpqb0FxY0JRY0E5V2dGcnZyd0w5QVBUZ09BdGdlQkEyZ0VYd0Yya0VIME1RbU8xc3B3RTdCcjBIOEdzU3ZRZndheEs5Qi9CckVyMEg4R3NTdlFmd2FWSDExaDhvRS9VQi9NQUJrMFQvYnhucVZHcVhYcUFJd0ZoU0pWMDBBRThFa01CbGNvaytwNmFCWWJ5TFNqNGxTeFhqYTNBZkxCRmJHWVdVY1ZzWmhWUnhXeFdGVkhMc0tLM20rREZhQjFlQVZzQWFzQmV2QWVyQUJiQVJsNEhXd0NXd0c1V0FyMkFiZUFOdkJEbkFJT0tBQ0hBYVY0QWlvQWtmQk1WQ3RIYnpqNEIwSDd6aDR4OEU3RHQ1eDhJNkRkeHk4NCtBZEJ5dno5RTVtMG91OTB5Wkw4Y2tjZkZJaVBqVlh0NnQ1K2tNMUh3NjVoNTN2Z1FjOHZIVll2bGdCWDdUUjV6TVRwZlQ1akxhbVhadWtVdE5NVFFVMWUvSGF6YXBFTjZKdERacjIwS0tlRm5sNm16d3NDMmoxSm4wZGF1dm9YMHVMZGxxMEUvc1B5NUNZdStuam9MbUtQaDFvcnFkZkFNMEIrdTIwZlZJc1k4MWxySG02R1UzTmtxcHlKQU1lZEtqWlQvdlBhWCtLMmpwVFM1K0E5Q0lDS2xuMURPd3NZM1YzcWptU3h1eTk2SGxSelpOME0zdnhaSzAzakp5ZG4zdVZUSk9KbkFDbmRaTnVBUTNhNFY2amE4U2pqK2tPVzJyS20rUi92UFFUK2pibUcvNnJVUyt4SjlBdWREdjZVOGFxb2F4Qzc0ZGwzNkpzdTM1ZmJ6M1BFVmJyQmR4YjdCd0N1bDAvSkY0WVFjUUhiNXNUTk5TcVh0THhrNWdaNlUvRnovcCtEVmQzdGVwbCtuNThuNEcxV1pLaFQrbnRlTW1yRDFvdm5iUXIwNHl2S3FWSUg3QmVQSzczbmVjUXFYaW1RNWZwRTdvczdCTTBkZGpTZHFLdTA1WjJGeTNHaTZiMmZPYXV0K2syRUsydjladzlreHpCUms2dEx0VjFlazFNLzAvd1VDMFI3WW5YcUUvWSt6Rm1XSDhldnZLNCtOb3ZmTldzNi9XUmhCYkV0ejNWN1dHOFg0UGxKL1VLL1psZUZsUDJ1Vm50TTZ5M3g4NjJBODQ3LzdHYTlhcjRPVkJXQ1RNbjhKcHVURXJuU2owdnpFdWROaEc1ZStHaFN2MEJ1VmZvS3RDdjJabzk4TXpwRUpOd2RuWnpIWktPOU9TdVRMaWlCb1oxOUdOd0I3a0UxcGRURm1MWExhYU10K2k5MkVDWnVWdk9nV3RTV2E4L3dUWVpzRUxHR1R6VlpQZ2lkQkp3RnZXTWxFWmZnMk5iUi8zbGdhMGF6eEtCNmJTcUNLK0J0ZFZyT1pxekp4eEo5bHdhRWpXSHpxdTNaYWptU0V3a2lDN09oZVAyWHNFYU5uRkNPSndNRVN2ZGVaeHh0MnVUS1ljNHBoNk93WllFamJMZ2x3L01lWWxXdjJ0SkhhdXhpMUVQNmwxMmpyVzZXb1lZMnkyM1ZrVE54SS8zNjNYUTVkdGQvTlhXSlU2eWJRUXUwRy9yZTEwTnBmcEc3bTh5bjZONmcxMmg2bkJjMm5wejFyV0hyTlgzV1l0cTliZjBhdDQySkp4bmpiWHRZenkwQjUxTldPaUZjZnd4alVKemErbkszUFRlN1hxcnhucXBJY0VRZmpjRE9PbGExY29JSGZaa2FpRXJDcTlIZ1BtM1JNNXNUMlFFRTBrZDlEN202dklubUVOTHFDVnkwckpOcTJWTmZ6aWUzSGp6U200azF0RVRqaG1UUWJDamlENVRZczdjaE5uTUF2MnhIVHZrOFRMOUJYYVp1S3F3NDU2d3ZQU09qRFRjZ2pjKzF1WkxKaHhkWnU5OVNNWm9Zbng1bHowVWp0WVRVWDkxdUZiNHVqVHNlVTZHcXo5alJPKzFIamx0NTlETzZlTzE0emE1MHVDdXcwaTdMMDlhTHVsY2N6OSthblBQK2pvYjgxMUhlRXhmRDMrYU5lcEQrM3E5eGV4UXpiY3FiM3VRWFpRNVpNQkZjR3FyM29jOEZlTFcwRzZpendIWXk1d1lXK2l6SjhFa3lKU3cwQk9KQkkvbEFMK2J0N1lZbjdNNmhqWENjZFVZeFcrbWQ2TmxNODlaY3dDeGR0Zkh0aUtxUEFuUDUrYkU3NTNzRXVzcis1ZWZuTTZzU0dQWHZtWWZ4ZThndmpiZFRJdWNKcVllYjRiV05vQnZLOFBqNnYvZ2tlclk3SWVZYW8zUEpjTDErckNOZlp2emRjazN2QkdQTktPMVhoOE83My85RHFOV3hjeWgvZXgrZFRtcUVrNk16b1ZDclBnUEd4M3RaOHhiaG5manBNdy82MDVwWVRSUDhsbHBoREhPbk10NDNQT3N3NTVoZmp4V0FWY2NDVVcxZStLMXNnK00zL1pGNWEyaGVMUHNiVm0xbFJiYlk4YmVGOW5GNXZjWjRkd2dKdlNydW9SNDZpK0RRSTVoR2R2bUNPTTJ3MUNkOGZoTnd5ZDZLNlZ2UmFJaElNUG9GYlczM05hRFFtekpPR1I1dWx3dkpDTGl2T1NlMEI1Sml5b3pKNDhUZDFKNlkySS9MUzZUQzRTdGlZNUkrMTM0VVRLNWJFUjNiN3N2YWpySFFrczlzZHFZS0NkMXo5ekFPWG0wSS93dEZPWDV6aEVDYURGZVRqU0N5VGErU0NJWGpZc2pzNWM2YzB3YkJhMko3YlE1VXFZOUg5d3pLZlpjdExzc25xRlRLWHZYN2p4L0VyYlZtYnlIMFgzMnpHaUo1RXVlcUM4N2xTRFhmNDR2K2JiRXAyaUNOYzJNNG9aa3JHcUx5aW84U2VpM01ZY1hRL2I3N1lsWFpYZGhrK3VsbXRnZGIvWVZYd0luelhmNG1UTGoyQWpFUzQxMlJkcnNDWlRjbDgwdWEwTkRFaTJQRUV2VjFzcWEwRHJvMCt6VDBPeDluZXNRRTB2bWZIOUI3MmNObXpwL2cvbS9md2x1Wjk0RGt2eU8yMlJzMVYvQ2o2MXV6bWUrRDZxTnYxMHYxc1RPd2Z6cVlYL3oySGp1VlRCbkZtTzBrVXVrdXJsZzlEcjRYTTIrTHJtRUIzYXJ0OWxpY3I5MzlZbmtIWDRybnRqelB1NzBENVVkc0ZHWUVacnpPV2F4RDBaT3MwemN3alBOM1cxdXpKdE1LZDVPVHZnMlRuMnZmbytkbEphRW42cG81NGt3UmxyVXVkd1Jacng0amtJY1JxaExSbjhYcGc3Tm9EYjZ0NHd1YzJpMjN6ak40ZGJkdm56SjdyNXUvM0xTM2Q5VEZOOXhQZkQzQU1uamk3bEVGc3JEc2tTV3FodzFUbzFYeFdxR3VscGRxNjVUczFXSm1xdm00WVYrUk90RDlGd2s1ZktBYkpNRFVpWWZLWS9zVXoxVWpueXBScW14cWplOUo2dE1OWTMrQTlVVjZudHFDSHF1VmhlaTYxbzFESDNYcWVIcWVtUUVtbTlYSTlVdmtiR01jWThxVkkrb1I5VVVWWXBNTmY4TlZJL2JmZGFYTER5VHYvdkpWQ1NYL0dDQWZjdkNwaXhta1NNREtVMWhIaWJuTVA5VEMwbG01QzBESFdISnN0cGlaU3JJUW45SXBzWkpidVJwUmc1THVEYkxsY3pJbTdFcDI5b1Zsb0d1bUsrOXJwTG55aUJYQmxzWkowVXlXaTZXTVhoZ1BIOWRqQlNDY2JhbWlMSUpNbEVtOFp3c1U2aVpMQmZaT2lOakltL2owQkVXbzJFOE1pWk94cmxqaEdTaTdUWFVsWXV0RExVWXlpaUZib201d2lNVXVUSW04bGFFYlJPc2ZXR1o1RXBSWkp4b21lTEtaRmN1c2hLNkVyVWZHeEZqaSs4Y2tUNE0rUVl5ek9ZYmhtR0d1eEsrTGlBbk4raVQ0RXQyaUN1ZDE0VlJHSkZndkI0MkJrYkUxUlhZREhhVTlKS1JTRy9lQ3JxMWIyTnRFV3VEaC8zclF4VDI5eVRLREU5N0dTMmRtdjZJMTFya3RiRTR5RVppaW8yOGI5aTR5N2RSNTdOUk45UjZxb2NkcFNjK0tVRG5hTmJZYS8wK1dxYkxaYnhmaVhqa0Jwbk4rKzN5QzNyZklYUFFlYWZjUys5ZnkyL1FkcC9jajU3Znl1L1E4d0NTTGI5SGN1UkJPQ1FQdGxtSXR4Y2hlZkpIK1RQbGo4aWpXTFFZeVpQSGtGellhQW52anlPNThnVFNXNTVFK3NoVFNMcVVJcVBrYVNSRGxpSUZzZ3pwSzg4Z21iSmNYbUxFbGJJV0RhL0thMmhZSjV0NTM0TGt3bDg3ZU44cGJ6UHVMdG1OYi82RzVNaTdTSmE4aCtUSUhpUkw5aUk1c2svK3p2djdTSTU4Z09US2ZqbkkrMGZ5Q2UrSHBCcHROZklwNzdWeUhEc0Qwb2lkSjVBYytiZDhnYld0MG9hZFg0bVd2a3JnekV3NE0wUHlWRjgxUUFhcUxKVXRmV0RlSExrUUZpMlFYbXEwR2lQOTRNV3h2QmVxUWhtamlsU1JqRkFUMUdUeHc2N1RaSUM2UkYwaXFlcFNkU252MDlWMDNvdFZzWXlFZVdmSWNNTzkwbDlkbzY2UndXcW1tc2w5bHByRkhlNlZOTGgzdGd4VHQ2aGJ4YXR1VTdkVEFnL0xCV3FPbWlQallPTVNLVkozcWp0bENOdy9WeWFvdTlSZHZOK3Q3cWJOUEU2RHNXcSttaS9qWWUxN3hQSTJZOEhia3ZaZmNtNU5mSGphbGRSSlRCTmhGQWZ3Ly90YVNpbWxyQW9xWWtWRXhJM040b0k3SUx1bWFZd2hKRkJaVEtBVVExdEVSZFNLVzcwWUR4NE1McUFZWTR3SDQ4SGdFZy9HZy9GZ1BCZ1B4SU14aGlBeHhoaGpqQW0rZVF3RzRvRjZtTitibWRkNTgvcDkzM3dnQUJhTUdNYWdpa3VyWExCNTNINHZWc0xJOXpFeHdUbkFCQ3NTa0lwMFpHRTFDckNCejQzYmFrdnNjT3h3dXV4d09uZFYyK0YxT1N2dENPbFBFU0lSZzBRc3hCSXN4eHFzeFViSlJFUEJEQnVTa0lJMFpDQWJPWENnU004WkVJVll6TUU4TE1KU3JFQXVDckZKenhtNWFoem1ZajdzeU9RTzg3QU9tL1ZjQkIveFNNWUNMTVl5ckVJKzFtTUx0cnJkSGo4RnhaQjRVYndzRG9wM0d0Mitacm92UGhTZmlzL0ZsK0xySm05SE83MFZSOFFQNHFqNFJmemUwdWx1cEYrYUNxSkp0SW9KWW9xbm85R2owc1FNTVZ2TThRYmFPNVZETEJLM2kyVmlqZWp5K1hKeVZhM1lJTGFJSHJGVDdHYnpWSy9ZSjRiRUMrSWxzWi9OVjRQaWJmR2UrRUFjRnAvNUF2dDg2b1g0U253anZoUGZpeDk5Z1FNK05TWitGWCtJdnpVTlNqVHoybEY4MEg5RWJkM01ibFFZbXNOUVRkTXc3VHc2REkxaEdCR0dwakMwaEtGMUZtUDRxODNnNzZhQXY3WmlWTUdGT2pUQkF6OTZKa2VlVEpOalFIbjZUT3pWNHg0OTF1blJxOGN1UFhici96YW9YOS9TNDAwOUR1cnhPdGZPNG4xQXNVYnNSeHRHTWM1WG1iQ1FpU0xKVEZGa29XaXlVZ3paS0pZejZZaWdPSXFuQkVxa0pMNjI4K0dnUWpZTkpxcWdTcXFpYXFxaEJxNmN5bk5uNGIxQjhaalo2QndNVkVRZUNrblVPamJTK2IvblAzbi9JWHdUeDJXMytzUXFqQ0daTzRuN3Q1ZXBIclMzejN3djd2S1RNL2VrWWxSZ04vZllTMzcyR0FYWTQ5VEZucUNEYkpDNjJaTjBpTzJqdyt3cE9zS2VwaDcyREIzbHFzUTdxYmFLbXRIS3ZYM20zZ3c4dmtFZXgzNWM0OHdBaG5qOWFHdm9MSWJ4Q0kveFJGdTlsTU96cHppV1VEa1BlVDNWeTY4VXRWRTczeWRxSlovTVJUTFhPc3UxcnVBcTF4dmdPYnJCOHpVMFZVdXJ3elZLYVNlVlVUblYvd0doU3UwREFIamFZMkJoRW1lY3dNREt3TURVeFJUQndNRGdEYUVaNHhoU0dGV0Fvb3lzekN4TWpHek16RUE1ZGlCbVpJQUNYMmR2SDBZSEJvYi9mNWwvL1R2UHdNRDhpOUZRZ1lGaE1raU84UVhUSGlDbHdNQU1BQlg4RGJONDJxMlVkM1JVUlJTSHY5L0xnaUlpQ0FRQ2hNM3NJcUhYaEpJQW9VZ1RVWG9nQ2IxM1FoY1ZqQVdrUzY5UlVVRlI0V0FYQmJGeHdONUZRREM3MkJzcWlLSkkxcnRMd1BLWGYvak9tZlBtenBsM1o5NmQ3eHNnamxqenlpT2lUNkpGaXNYRmRkcmlFdndhbThPNWVmL2hpVk5kRGRRWWpkQmlWZFFBZFZOMzlkRlMxVlJIMVZCTGpkVTRqZGNFVGRRazVXcXlwbWlxYXFtMlZtdWwxcWkrQmxHTTRsekV4YmIySlpUa1VrcHhHYVVwdytXVXBSemxpYWNDRlVtZ0VwV3BZanV1aWw4OTFFbzlsYTMrU3VBV2J1VTI1aktQMjVuUEFoYXlpTVVzWVNsM3NJemxyR0FscTFqTkd0YXlqdlZzWUtONktVTzlsV1A3RDFLRE9qU2tEMW5ra3M4OTNNWGRiR0V6VzluQmt6ekc0N3pJUGw1bUx3ZjRpQ01jNGpBaGpuT0NIL2xKbVZxcmtScWxmbXF0TFBab3FJWm9tQ29wU2F1b3hrRFFzbWlaTkZyNWZ4Vk5jZkxaYXhNRmFxQjYybkJoUEYwdFZBY2ZWMUNUUVdUenNUcXBzeG9yUlEzVlNDdHNTaUd6TlYvRDFWeHBpbGNGOVZVSHBhcUpsaEFnaFNSU2FVcGJycVE5SGNta24zMlJ3d1FtTVpudHFxd3FTbFJWK2VWVVhRRWxLNGd2YnBQTnlhU05uVU1GNjVXaUFXa1daVE9ZNjVsanE4L3hxbmpOdk4zZWZ1K29mNjcvcEl0ekpWMjhxK3o4THVpU1hVT1g0dEpkZTVmclpya0ZibHNnR0ZnZVdCa3NHNHdQRGo3akZVWWlaeU9SMksrVndsbVYwMjF2T1F6aEJqYXBpNWRnZVhkNSs3eUQvanovQ2VlNUVxNmNTM0NKenNYeU5uWnBzYnpUWE42Lzhxb29yeUtub2pXRHlGNWJJWEMraW9VekM0K2Q3NGN6d21uaDFLSitzZkNBOElSUUpOdys3QXY3UW9XaG5hRzJvVEtoMGdXekM1WVdwQll2NzIzUjFpSXZlbHFiYU8wNmEzbk0wd0V2SXpyc3RmSGFlVjI5ekhQNXZKNWVwcGNOLzRzbi8zRGk3M3hmWU5WbnBFUkpXMmNzclRmZWtveTBPQ05tZ3pZYWRZbkc0VExOMEV4akwxOVpSa1YxVFpmUGVGcW9CVnFrQnNaVWt0V29ab3o0YXNaOFV6dVBGT09sWXhFdjZlWkFUb3laUVdScHViRTdPVVpPcnAzV2VQYVlHZm5teGhhelk3T1J1OVhjMkJHelk1LzVFYlhqR2ZQamlCbHl5T3c0Ykt3V21DSEhvNDd3Qjk4YnQ5VzUxeGk0azJUdW94YjNVNWNIcWNkRDFPWUI2dk93Y2JlTlpqeEZJeDZoQ1U4WWhUdHB6S08wWkJjdGVKWU1ucU1WdTQzTkYyak44M1RoTlRyekN1MTRpYXQ0bFE1c3B4UDd1WnJYNmNvYnZNazF2RVUzM3VGYTNxWTc3OUtEOSt4azM2YzNIOUtMRDJqTzB3emdFL3B5a1A0Y2pmcG0xSWNaeXFmRzZER0c4UmtqK1pJUmZNRndQbWNzM3pLR2J4ak4xOHl3bTNJcVB4c2xQekNkWDVqQ1NhWnh5cHc1dzQyY1pUWTNHVW8zeXlOUFloUmZNWTd2ek1CZ2tYL0o1bUtBV2Z6T1RFNGJaNzh4aDBqTTh0U1k3MDNzWnVtcjFuOEN6Ym9xQndCNDJzeTlDWGdrVjNVb2ZHOVZWMVV2YWttOTcvdXUxdDVxdFRTanBVYlNqSGJON2huTnZuZzhIbzkzc0EzR1lHTThkckRCZ0EwNEdFSWdBVjZXQjloSklDOWdZc0lqWm5YeWVKLzVrZ0FKWkNFWVFnekdyTUhUZXVmY1cxVzlhbWFjNVArK2YyeEpNK3BiNTU1Nzdybm5ucjBJSlJNYjc2UFBDQzhRa2ZoVU55R1VYQkFvcGJjVEFyOFJIYUxzSy9vY0NjY0VmZkJxY2MvTEg0TmZFNEZZNE50RHdsTkVJVmJTcXhhczFFVG9DakVSZ1pxRWEyR0VlMVVTQVlxSHJoRmlNY013eGVGd3lFcWdXS0lsbXNvbEZGZEN0RkRQRWVyWXU3ZjZ4YjNucWVXQzhOVEZ1Vzk5aXdib01aaDNIZUNmQXZpZHhFZmlaRkxkb2xCSmhCbEVJcGxFNmF4TUJZRWNaL01vMUdTaXh3bWJLK0R2N29wRi9QRkEzT1hvOG5YN2V1Sm14VjkwSllhOUhyZXNlUEY3S2tGVG50THdhSGtrSzdMdnFaUmpuWVpPdkdwMmZQdWUxMTlUL1FiMWZQR0wwNnVyby9OWDdWLzRtdkRVeWQzait4emRoOVFENTRVN2Z6d3pPanB6OFl1TEV4TUwxVjhnSFNnWjIvaVo4Q0hoQ3lSQmh0UitqOXNrbWdoRFV4Uk9Fa0VJcjVvb2pEb0oyRVhvR2lVQm43UGJMSk1FVFVpS3Q1Z1pIcTM0WkRtVjdCZktJMU5DYWRqclU3TFpWTEpUOExpakFuMy94TTNaNGRKdkxDKy82WGlsY3VMZTVkVUhoMHE1V3llMlhyTlVMQzZkM1RyY1g2cE1qSis4YjNuNXdzbXhpVXE1ZjZSdjdmems1UG0xUHR3ZnBOOXZBLzA2U0FEM1I2clJDM0NqeDAyVTBhdlRUb2lqeXg3b0RNQkFXMEpXZk1XU296UWNCUVE2aFpRckJYK2ZBdHo2aGZYblY5OTRaS1IwNU41VjZRTWZHRHUxVUNnc3dPNk1IbjNqMHRJYmo0NEtkMXo4cStMeTJZbUpzOHRGb0FuT3ZSWG10cEVCdFJkd0VVMkNlQlpJb0NOZ01rbkhaU3BKSGdtWUEwYlpIUGhIVVVJd2VjS2ovN2RPLzZGNkUvVldmMERmSlR3MSsvUFppN05FZzEwQjJCWlNVTE90c0NWZ0JvOEp3VnFJeGNGWUxsaUQ2dUF3bmRVWEFPS3ZaNnQvV2R2RDUyRVA4MlJRN1hNNUJVbUFIWlFJOEpucExHd2kyNzR3MG8yY2hQRVJzdVp3NXpQNXRLeUVpeFRwMUg3L2tIU1ZWRGtoUEY5YXYzTis2ZDRUbGNyeGU1ZDJ2bjE0SkhmSDlOWXpTejNGeFd1MmpCeWFMWnArU0xmUW5RdDNIeDFsdTNuZnlmRXQ0eVA5SmI2Yk8vc3k2c0hTSE1QeklLejlQa2JYbkpxR2Y1dEVham9yVUZ5M0xBbWk2QkZiNlFscmg2OFVmRCs0U2g5WlhhM2VLRHhWL1FJZHZ6aEhwNnFmNCtzL0FOOC9CSEJGRWxDOWpJd0MxWTR1bHdDY0xSd0hWdkdJOG1lY1FETTdQTk5GNG1wRWtRV0tOQk1FMkYzWUM0MU1ya3hTaEJOUDRkQWxzN21LMTR2SHpsRVM3Rys1ZmYxTmtSMkJROXQybjE2bDVqZTg2L2krOE95T200L1JQK2F3Y1krdkJ0aFdrbEdURmhuT0VzZ1d5dFpwRWdWQjhBaUltWlZZblU2SGhDSUZjQU9wUWxQVXNiNUs5NTJxdnBmZWNLNzZoN0RRUDZFcjFkK3J2by91ckQ2cHdSMEN1QktKcVdIT2lwUUt4MFdxZzVTSTVIQ1lRR0l3dW5rQUdJaTRpNzh4eDU4RlBKRDI4S3hOcGlJOHVvSmtjcStLZ0prSG1NTHBjSnFBMnpJVXlGMXl1WkRxOUdQVmx4Yk8vK0FINXhlSGhhR0x2d1VZZGRLZlhKd1RUaHJyZkpEeGNsUU5LYkF3WTVrYVNnQ3hHMEc2U2xRRWNOU1ZXdDlGSHhjV2QxU1BDSXVBMlZQQ0hBRGJmZkhqWENhUHc1NjhDSHpzSWptMnduYXNtOC9uMHdpeWtYR2pnZ0tIdko1emhSZEhqOTI5dUhEUHNkSFJZL2NzTE41OWJIU3RaK0gwK1BqcGhSNzlKejJHa21mczVJVmwvU2NLSDEwSXdVOWREcTJ6dlhUaDZZSWJnZ29tQ3ZJYlVOS1BMRnRyaDQyUUxydk4xZUhDblUwbkZMWU5YSEtEaUdheUNNWDFPazJjdWZQT004OTk1U3RmV2RpN1YzanExcU5IYjYzK2svQ2E2dk1yMjlSbGpRN2ZablR3a1FHVXlnUDlBUkg0UmphQnRCQldKRW9XMjFPbU41L25sQUV4cU9UcTVUS1F4emM2V200ZzBXZ2xKN3c0VVpvWjI1WS9NbHhQcDR0SHM3MzFwTXJNUm83Ull6c2ZIRm9xTGdWQ2RlVDZ4TG5jRGRQMUpITTVyaU02elE0QnplekVTOGJVc3BrS0VoTklBcFdFczNqZGFaU1R0UnUycTVNUVozZW50OHNMajlnZDNvU1pIUXJ0MW5PbHhBYnl4YTUrM2M3WmQrMS8rR3RmL2VwWHR5TUZiejYwL1l5citoVmFySDRkeVBqUzBzVGtFaitINFkyZkM5dUZ2eVFGbERjZU4vQThQK1E2N2VCSW5BUUNSc1Mxdmt3eGhiU3JhSWQ4Skp2TFpiUGxrVkZESnNvZXQ5Zm53eHNZK1M0YkhwaSthVzczZGZQN2J6bXhmdjkxYS9kdnk0Kytkbkx4Mk5TT20yKzZKajkvYW56UFcyOFkyenE4ZTJKa3JNdmwyTHZqNE0zRi9vbDg3K0pvLzRqTjVUNjAxcmMyRnQvS2NRUmFyVEE5SktGR1RVZ1EvWmJSRHpWWFBWQk91TW9KVHdwT1pWZ1lmSEZWZU0zYzNNWGZFRjRETUpiaDNMd2VZRGhJU1BXTDdFekQwNFlVUzdtU0dsOEE0aUMvSEc1ZGtMMytQZmU4OFRkWGJ6cDY5S1pWbW4vTC8vaklXK2s3cTllZnYvZmU4L1NkaUp1dUk4bUlHeHpwNXVNTjhHVWlPNW5FU1ZBVUdaU0dxaS9zK2ZHTE82cy9oT1A5c0hEclJaUTlQVURvQSt3dUJ6Z2Rpb25KSGhDRWlLaEpGejVPUjdjRUVqK1JFaEVRL0MrbVJOcTE5dGphSFI5ZC91aHJsaDliZXhJZ2ZrYVl2Zmkwc0EyRXhoNkFDeWRPZUJPVGFTRERiV1pKTUxVSU5hZVRTNkJTaWpLNElrMkpadzdSem90SC92clpRNyttM1VlL1E2K2plK0NPOWxhZnFMNlREckU5NlFDNGR3SmNNMG1wY2NWRXhYWXJOeE96MDhsVzd1QkxkOUJ3OWNlSHZ2MmQvZFVmMFNoOWYvWEQ5SEQxUlBWZkFGNEc0RTB3T1FuNmhFd0JTUUFwck9CY3FQZXgzUkpCcGRGdlFMajZRWEt5bTZGTUpkaDBtdkZrUUJUdkZ6cXF1K21mamdKVHo0NWUvTFF3dTdIQjkwaDh0NUNGODBXb1FnUGtPdkljMmFKV2JGeWpsV1RwQXU3U2hRYmRWdEZPSHFWZG5mWU9xNFdhcWRuaGNKcVZkTkdBK1VFRFpvUnNCNWh6NmpZTzArZnQ3akpKUzJZcUFXQkpQdGNXc3IwREZ1YnNDTmdEQm5RTFFDZWtEYzVCQm4rSE9tdW5rb3h6QUcxa1NiNWdVUVM0MFJveE4ydndPd0IraDdNRHVLYXIwNWpCV28vL293YjhHTmtLOEJmVTdSeC9NNVZ0aWxVRTdLVkczQzBhN0lBZnNRYzlQQlZJdVJ3ZFBydlBtS0dEcllIYkQrSTFUSDl3a2hsMTJnbjZBOG9XSXBwUm56TVQyV1NXbTNWR1hBOVhHaDNkOEdDWGcvK3hLaEd3S2tDOTg1VThLZmhLR05hRnNGQXRIZm4zNTQ3L3F2cTF2ZFV2N1FNakE5U251Wi9OdnF6WkdXMW82WWNqL3h5WlZpZU10UUloU1FzWmxYb3lkblVBRnpSdFUyMmZ6aHV3dzJ5ZndKWXhZQk1rNHRsWEJobG90eEVRVUY4TEFxNDNxcTRJd0lIQm9oMW9LSzZJVktUTHkwK0VkaDFVWThCZkpsRTJhWUNaaXNoVUhqUk5Fc0phQ0hRRWZRUUZGSVF6ZFFQRnRYVzFtNUJ3Q0tZSk9qeVpyTU9NQ2lYb1dUTEs4cEp1dTZDVXJ6UVlkS1BENlpnOWFPbnN6TGtIdHd5TWhPdnR1OVJVTEJTVjVaekZPbHpJekdRMGM4K2cxUXNHcmVLTVZtLzZCQ2ZWOGhNOXNKNkNqU3BXT0RWS0hkK1p6ZkpKSXN2QjFRWU9ES2s1V0psWmtjM24yanhUUDNKZGpWNmVYUTM4SGpid0M0RVc4UnpacGE0R3FGbXlVNFdkTzNIRlQ2VWxHR0dXSmZNNXdFQWhzdEorWGtxVDhVakk2M1owTlp3K05oZXpLUmxQS3BwTStpam5TYTlITW5INzBpU1pnQ3NGNEVyRDBwVHJMRTJCWmpQcFZORHZjbGdVbWhTU2lwTFExc0ZoUDI3QVRwSTNBK3hsZFNGTkpaTUdYMWd4eTBLYkdaUzZHVklwZ2FZS3FVSStsODNVNXJId2VaaE41V0IyY1lYc1UzY1hlOUF1VmlKd25KM1VKRG1vYURMaFlaZE1BdHNXVU0vT0VFVmhPeGxlTlRlWXpBTjkrV3c0NkhWMzJTMnduNlJDSzVhYTZheG9ObjNOdkVCN3Z0SXZibXBQRDkyM1lPOHRUdzBseDl4aFI5NGJTMmFTRWQvMk82NGFhbTloajA3UWlsQk01Y3RPWjd5eksrejNCUS9KRXlmZU1OOXFjN2ZadDJDTnRpYkpvQzJzV3JxQUJCWk0veG5hR3ZNOGFzd1RoV2VmUXlsYTR3OEoxRVJCTXAxcnp4NXBtS0FubitwUDk5ZkFtd0U4d0daK0E4WWZabzAvVG5IWkh3YitvQ3NXblRGQUlKcWJmQW9LTnhwRG9hNU8wR01Tb1VROEZvMkFYaHJzQ2xJNzdVaGFsU1NYL1FINDlqVElyMjZTSUJQcXVFUXBJQWNFT0dzQjNWWTR6czFJUlJHUG0vbVY3blFRRXZEQlJyc2NDV2NDSHV0S29OUkhIVGRWYnZCWGVPQUc4T2craTllZU9GSG50ZmpJUjNTL0JaMmNvWk0xMThVdlozNnAreTYwOVc5bGUyalJ6dDZydWN5R2t3d1hBU2lURnpieGFKaTVSNE5TdUZGaHViUUQ3eWFRMmRraU1lQiswSUFiSVRzQjdydzY1L2M1dWszeWtvWHEwdUtTMEFFeTlianN3YzZnTVlNVlp5QzFPUjQzNWtpeU9ZRC9Pa0UrMFJXcldiamNHaXg4Rmp2TVluZlpYYWdkR1BQWW11YXAwU2hZbTBkV2dQa1VXYm1BazZIVzlGK2Y1MUZqbmhpN0UyQWVDMVU2ekRZUktDWnZSaThybnlFWVFJckZvNEYwTU8xMjJ2MmRmbU1lKzZielJNa3pNSStxVGhLRmJZdDhCWnZTQkp4dlNodGErY0UyWjJjVjFnQmtJcGNna3JtT1NOMTI0S29HNkFiczh3YnNNTnNId0J0ZzQrVURDdFIvQmpMM1RXd01NdCtFRnkxb09KNWdjM1RERGRjRm9sdlVUQVFZNTBGNHpBZ01pR3VaRk5PNlE4VU1SWE1UWFJaY05KZTVhQlptcThmbzRpNzZIcm80UGRIaHM1b2R0bmlFQ3FzWC93ZzBBN0JLWG41eDY0eEptQktFZUZyekE0R2Vzd2R3aUpHNzFDNFBsUlF2YUdQQ0N0em91b2FUYjd0QUJSYW9LSUNiSkxFckpTR0RRcEF4aHFMT0paOXA5NFRDZFI2WU1KYkpNZDNTZ3JwbG5WTXkxVWI1cVhkVU51ayttdU95U2V2NS83c01aUDVRSnF0c21xeDZrTjhCYmhmempRTGdQaEJacUw4cUZFWFdwWHlseFo3aHdaNUtzY0o4cGhtTGtxdnBPTSt6YzJIVFpJZzJSeEVnc25rRUxrZ3NJRWdvVThFM242T25wMmV3WjlEaDRuTllsWUkyUi9VRjlPc2FjNlJoSllTTXE2UGFPZ3lZZUZhVTArMWR2UTRPMUl4QURid2ZOV0JHZ1kyZUk5dlVLUjJtQW1TaEtESXVUWlNoZ1o1eXNWeFBGSUhaNDk4R25uQVJIOW1xam1FQXhTWUx4QXBjUWF5Z3pWck5aMDBVR2FQRElqQnVKUVE1QXNhN0hQb2Z1eExqTEZFR1F3aStTc3pqQWJ5U0tDZE83TitQUHVDOWUxZXJOOUpIcWpjS2xzbmI0Yy9reFYvUTZlcGYwSHNmZ1BVeEh6UGJsdzV0WDg3QittWlZ0WTFzNXg3b2E3a0gycUpaRFplUjZTQTFhSnpCdC9QN2RlTjlBQi85MllJb1hFQjM4d1YyS0xVQUJhV2c5RW5VUkUwZ1daSWN4c2EzNGNrUTQwOE9JN0x4R29BQmNxcTd5MkkyQ1VzU2hhTU84TTdWUXdJbzFHNlRuTEtUUVpNUkdzRDZMa0R3MWVFVFpMREs2ckJNQlJiSUVjUUxzZ2tVSGVHQzVxMWswQ1Q0S2Rra214V1VVZ1pQMGVEOUJLQllHSDl3ZUxHTkd6azhpWXBtRXhoM0FKSGpKWE5JVGdkaTV2YzZ3czV3aDFYcWxyc1pQQXVIUjlETDhVUWR2T2pHandCZUQ5ZzNJbHVtMExMSU9pQzRTTURwbXpEa2orclc2Ti9ZQlRCWVZBaVhSNHpGbWVvV1o1YUE4alZTSVM0SE5uNG1Xb0EvTlRpa2s3d01qKzM2WklkTkVKbVI1Z0dSN0RKUlhTTThpU2VDbTJNKy9sdEd2VlZkS1kwSUtHL2hLbkYxZDFxVWhyazJmZ1V6V05uZHhuRU9zMzJCZFV2b2hvUjFuNzBjeHBSWU53TGtNK3dPMjZkMjZSYXlVRzhoZXpVZ0xZYXhxOTRnMWp4TDZ5b2NDUURtQlZ0WUR6dTB1UTRPckxaY0FpMTJMK2ZqNTJCbFBjeW01R3NNYmR6RjdUd25sVURvbWNCWWNGQmhDUTBsRVEwbGtabEtEZHdEaW5ZQWJTT3J1Y2FGYks4d1B2TjZ0dWVkMmpuK0I0QTlwcGFkY0lPYkZWZ2J5RmV3eWk1ZzVJZ3hRV1BzQms2dEQvNXp1VElweGRCbFFKNWVMVHdGTUx1NFBDVndFdEdyYjFWTXpNY0grSUZ4YzVxNyttUXRWTU45Wk5SR2JVNG5JS2padURzeEZzUHc2OWJrd1BzQnZ6NjFCNDFCOUxXWUx0UWlORnFJZ0ZKMjNPQTZjTUFXcHd5OWVrajRNdEhocEFnR3RSQ09kcldMeDRIZHZKZUhBMnNiWW12cnJsc2JPMmRJcHRPWFJjYkFwUVlqU3EzVnYrVlJEeGw0enFRSnBIb29BSUYyZGloT3M1TkRVaEFkMUgxZzE0UlpGZ1BBNkRyTWhMNXRzSXpwU3J2QWxaM1lQUjRXdUNvcjVRcndaY1dqZ0xaeS91alIxU2Vlb0EvOWRIRnBrYjZoK3VkdlhucnpEK2RxT3UrRGpQNU96YzU1TXo5ZlpsSGdXNm1iZVEyT1d3ZEd1Und5WEZnR2pNY05HRWx5Qm1DTXFxVU9zQlVaSEdGRnFUTVlHeURaYkRhSHplRndJVHl6QmcvMjRFRkdQNmUyQnk4QnNuQTNHRGpWc1ZjTFF2WHJldGlBRVdMMzE1UzYxVThWVXdmb2p3eVd1T0tqcGlXQXAwZ21wcjh3UjJ3RDRGUW1sZWE0RlJBM0ZsdGo5SEpwOVBvVGdGc0VEWlF2ajBvWE5nc1Y1L09aR240Y3pnY05PQkh5ZG9CVFVVZEdTbjI5SnRNU0hIc0Fab0xUM2xiUktRd05GRVo3UmhHbW9tUWFZTlp3Q3pLWW9PZjBBQ0RLSFE2NEQ5VFVIc2RDb1RCUUdIQjRFU3B1UlEzbW93Yk1HTGtmWUlKV29sREpJcHRGRTBYdlFqdG9vK1dld3NTV3NqcXFEdllYUm5wR0VLcVY0d3FTYkl3UThhZkExMzdTaTVJT1Q1Y2ttczRxUUhUTm1XK1JCVWtpeDgwOEFCRU1VSkpPQm5xRHZUNHY2aFQyRHB1RitLbmZxbmlMQ1QxQUI1cTUxNHZlWDFsV0VwNk1wdnNhanArM0xiN2hjTGw4K0EyTHdwbnEydmlTOHJHUEtvdGI2Sk1YMzFFK05wZlB6eDByang3Ym5zdHRQNmJydzNQNU42N01ydDNYTTdlOWQvbnMxcTFubDN1THk5ZHUzWHJ0OGliMDlwTnJ1ZjRoVXlRMXVSU2hld3U5SHI1NzJXSTdXQW55UGk0SGdSR0ExTENCWnpmWFMvTTF2WlRET1cvQUNUTWVZUEVTVUVUcFpvcG9NMFlzNHEvSGtVTmdxNWJJbnk4L2tjZDczUTQzVEc4eEh1c1daTWtVb25BbnJZVFliNFdtMzY0dlAyR0JCM3dnZkVFRm9HeEcyTkdUR0ZLS2s3WFE4aE8yelQ3MnNJL3psM3BhamZHckNqL1d3NURNMU5OamtldnI2NnFscDVCMzVic3hROE9YcW1Ba2tyc0RLeVhGQ0VIbVJMZlhSN2wvVUJySjVpaGFxVlBDdXhkM0Q3Qlk3dmpaNHREeUx2ejczWXZqNTRyYk1nbDZKckdyRjhPNlFqaVRyRDZlM05XSC81Qk9EL0VjbkZSczR0UVFqKzZtNHpRemZqWkxQeEVJb1lOd3k5bHNkU1VRWVNGeFk2OGVOdllxUk43SmJZaFJrRkU5ek1ZdE40a25pbkdpZGhzSVlpcFh6d2NzZHN6NHlhdkpxU004Tm1UaFVlU2FCMGlMSjF0cThXUTlOZ1NLT3cwRkEzNmVRMFU3YWFmRG05UmlReHorNHdiOEpKem81OGdlZFdjQWpCNmNBK3p6ZWorVE5vdTFOb3Z1QWZmN2NSNS8xQitOaEVQQmhyazZ0TG5nUGpqRTdnT3ZkaDk4QVNDQUxXSnBpSWhyNXRzcldRZy94eXkrTFQ0RzhIMGFyYWJKMTBsSkhmUjZCQjdyYmlmYmExRnZoN012VTB6WFpEdUg5MTREWGhKTzBOZFJ5dlV5M3pyQ3JMc1FONE5hTEJhSGlrTU9OOEkyYzlnc0Z1OWlzWGlWL0kzcTVySDRLZmhXQXF0c0dKakRCTnEzRlk1TkRwbEdScVpwQmIxS1pGazZDU2NsSWVFcHM4UHd0REVjTDBEcFRGdUVRbHl4djJMUVZ3WVZqNmt0blVrN0k1bGl5cXhFcnpSM0lOWGU1Wis5YkVxQjBOSGk5NTk3N1dXekRFWWJ2Zi9yeXRiMnZCT3M3VFg2K3ZsZWIzTHpYbkt2RVhiMXg3alhCdXcwK1RqY25LQkgxdmlTS1VLWFo4cGFma1FYNXN1WjBNVWt3YWFjeFN3SDNjc0VOb3k4cHJrUHVuRW5NSFdKcFVwdzUwSHExWS8vUkJoODhUM3ZXWDJjM2tLVnVibnFyeWFyWDZVakhGZUV6K1NCWCtQNUFlNHZ0N0o0Z2JsTy9WTmFzak1zRmtvdFhSYTBEMndOTVU3a2R3ZkRPNHF4ZUZDU0JZejdBMFhOc0g0ekdMMFl6U0JuNEpJMFNjZUI3ekFObEJscGZCbnBUTktpeElwU0s1K2t0S1VoRzlIM05mSkR3SW5yZEhUMWxoK3AyL0xUUEZOa1Jpanl2WGtCOFRMV215Wi9CQXNDSFYzYkU3bGxrV0NSMjR3WW42TEh2L1c4cUE2NDgwYlVJUVFGdXBvSnZaT0NLR25XcmN6WHBHVnBlam85TUx3am5YRHcvSjZTcDZSbFIzbHE2VDJyenpWa1I3ME4wNlBlUm45US9kNnFxcTRBL3N1R1hSalFaTjRiTlArTElaVmFNbUJBUzArNVVqVTV4MkY4MElBUmdkVThoM0l6R3ZGNTYzWFlGa2h1VnlqZ2lydmpDSyttdnpiakZHVHd5dXF3dTBWL2JjM09jYmtDcmdEWXFRQlIxMTA1dkVjTmVESG1Gd2NkdTE1M2JZRVVqN2xkMlhTc0o5NFQ5THVpN2loQ3RHNktvNThNNlhxYW9mTzFRODdyOGpyNWFyUEZkbkFTekdhQ3MxblQ5OXJRbisrQWZzZHpHT2NOR0dGR0w3QkZERjN2c3BndzJiQzhFV0I1VHhseWxXcnRvRVN3QStzS0s5dzFFcEtBK1ppZXhYMDFLR09ZdEVtZ1A4ZlBBTkF6VFlQUW9XT0JTVEtaUE0rT0JVV2dUYlpBY3hyVmJXZUdCdXBjSnZsZVdrdXJ1dk1EcnVSRXhIQ2VKQ2VUaldsV0JqMWVNT2dSWi9TNGdTY05aQ3hVUnVlSURPYUtvckJMS3JqYVFwK1Ftb0tUcDhpU2NxNDJ2bVhVdXVyYmxFc01QQjQyOEFpUm8xd1d4a0d2Y3pPOUx0WkdyMnVaQmszUCt2MW0rVitNWjBMYW1mMTd6bnQyczhSeXdiUXNKU3BmYU00S3c3d3doNkxrNitBOGFzQ0p3YjNDOE5QaG1LbHNWU3lpQktpZWE0UVVDbloxSm1MQlRDampjWFVHdWdJTXJrM2o2V2I4L09RZFhCN29jQlV0aXdhRlN3UFl6czVPUjZmRHhhRFY3cjltZUVIeVo5eWU3UUp5Y1poYWhwTlpFZG9DZFhlNkhXNEcxYUt0bmVXa01aZ1JqWWFIdWMxbVJ2OFhPaGNNdnhPbGRXbXBsTUxkWktVV2FuRzZkRjlSTTZ3Z3FlaDVQYUtKdzlPY2E1aEtRMFFOb3N3aFdxMlVXcnV0M2N3cnh1Q2FHK0ErYXNDTmtUN3VEOVJ4QkJsaGtjd2llcVEwWjRYQ1lmcThnQ09OaEx3Slg4TFJaZlhZUEJ5eWxidVQydURzQjQyQStXcnFZSXNtN29CdklBQkQxMjdGRzVxQlZMaXZpK1hrTVhoUmpaNTdPQTBVdktkNWZsNU56MjNNMU5PdU5Vclp2VytsVnFmRHhTNUdBKzdqQnR3azZRZTRpK29POUNucHNNV2FYdEVLWFZNRWJEWkswY1BFb3ZGOERrdkRISThhYzBUSmgzamN0QTUzVEtCZ0xvNjJxQVBhMU5sdDgzWjROZEJtL1Y0ZjJ2Z0YvVXY2WTlDTEN1UjFxdHRCQmJFYnRCY1FLalNkQ29wY1UrZkpXUlJZbURLemp1bHVNVzdubWhSQk0zUlRiVWFZVEI0K1RPSG04THJxb1NTZlRjUUNmamlZSFlwRXdqUnNWcnhGWDFKWG9WSHZTY0xsUFlyLzhvRDZBNUtVUytReVU2Ny9hZTMwbVQwOXkzRjFLamxmREEwZjZqMTBlaUcrOXB0em80WHQwZGhNWVd6T3NuZG0yeTZYYTNaaTB1MGQ4L3ZXOTFhZkdrOGtIaXVPaE1QSG5JNWg3dGRaM3ZpVjRCUytRZHdrUVk2cG5RRy8zV3d5aVhTbHd5WUlTOHRQSk5Da3g4dUMzUk5zSWVRazFVMzZVUDBuTEVLQUh4TnRoWjFlVHlUa1NYZ1RHVmNhSzRneW12ME9XbHpGZ2F1S0NqbFlvRWZYOGdSbmFtcmZZUC9PeU1KaWVOZlF3TjZKMUV2RlJaOS9zV2Z4MUttZmxvL001akpKVmZoS1YvVXJ5Vnh1OXNqOXFmaVA0dW56dTNhZFoxZGFHZmJ2bjJEL1ltM3JlV0sxZXA1NFhUMVBqTVl1VjgvanBUMzUrVUJmNm1SNWVGM05acllkTEkyZVNnOEVsN0xwNmI3UTFlUFJjRittSnpkM3RGdytNcGZMcDB2aFJHUjRMcmZ6ZWtiYjhzYXY2SzgxMmg1WE84TWhCNTVWdXVKeUNsU25yZTRQaVhIbmdDVG9YQlNxZmNKT3RPRThZTFR0Z3AvUmdBOUF1L09nNGZtTGlYTGpBb0RFbVhwdW9YOFUzaldJTkVVYTk2MUZGcXYzbmxvc0xnQjVDNHVudHFVeVFORVJwSEVxUVJOZEY3TS8zWFUrR2Z0SkxIVWRYOGN2NksrQnRrRllCMGllSUp3MGJzV2p3b3VxZlAwS09JYmhVQ3dhU29RVFNVOCtxV0J4UldOYXZnY2RmNGljQ0F5UXlHYnBQL1FjS3BYV3QyVUF1NkhCUFJQSjZodWxxN2RuNXdQdm5yaktTc3ZtL1dPSk9LUHkwZGxjZHR2aEVlL1M2WkNQTGx3MU8zT0EyMHIwcVBCOXNMcCtSN1dhUVJKWUtGcHgzTEkyeWltOHF6THpOS0JEeW9lSDBXT1kwMEdNR29FSU9kZDJoT2V5VUM0RkFPMWxLeXFDbVZTM29rVEFTTlBPdDRlYnlGcWtOeFcrWVdXSE8ySHZEblgzWkI5NmFQRUcrdno1aFRYSk5HT1Nlb3JYVFZUMzBmK3A4VlFSOXVJRm9IRWZ1VXQxNUhOUnUwbVNmYUM1ZTFtS0IvZkNKY0E0NUY2NFdKM1lNWkkrRWlKUHJCQjhxMndnMlh3Y0UxUzlQWmxVS09CMmRuWGFMQ1JPNHlpb3BEcG1LK3NaSTVyRjFpeXFxRmZudlA2MXlNTDUwME9uZTJKOVM1bVpIZUZkWDZweG9ZdzhPSUk4bUp5K3VISG9WTWcvNXZPcWswZFNtZi9ZZFQ0VmU1RnhJOU4vNGR0MzRGeTVVSmR5aXF5R0NiNlJKVjBYaTYyYWpDSkdqTEtEWXNzRGYxenVvRFIxY09ucVdGNE1ydzJ0blY2Y244alBlRkc2UEYzc3ZYcFg5Zk0wcDY1a005WGZSSnB2WlhWV1h5STJ1SHRoUmtPVWhGZFIvdmswZTdFRE5IR2UrQXZTM0VadE1oREpwVXR6TVBkOE1Pbk4zbGpNNjRsRk94ZUZFL2lYbU1jYmUwM1ZUNS9IdmQzNDRVWlJteWVFa1k5dTJOQXV1SWRZN1lzK0kyeU5qd2RpVVMxSkNKaHdUdncrdDdNalpBL3hpWldtaWNWYUtnOXE3N0tPeEEwZFBxdkZZWTJGRjZlRkUxRWZZdU9MdnZ3Vmt6QXRDTkdrTUhIeHMxdG5ESHAvRytodEpYbFF5MlZSeEhBV0p6anlPZFBpT0syeHRzdk5DN0VxamtwSm9hbWNaM254K1lPL3BPS0pmMFBxbHI3NS9BYjUvdmVOZlNUdkJMZ2ljYXBkR0IxR2VLaitVc1ZYZEFHNTNya29mT05pVnZnS0h3dWk4OGVnQXh6NDA3UkZGRkdPTGo4UndWZ3dPM01uRVI5QXhxeElJcnZxOFZEaUw3aDg0a2ZCK0pDbkMyVklKdVZOdWRJcExWMm81R0hjNFd2aUVXOFR2eXowbFhhNnczdktpMGNYdDFXeVUxNUJXSnlwWkNhODlQbVZucDZSNHNEZ21WM1Z2NlNGNmVWc3p1cTE4YittMDlWMzFYZ1gxdUVpcTU4RTFzVmNCYjRNRjVPZWxFa095Y1JEc0NHNEg1Z2t3YUE4dndxMFQ5WlZ1ODdhS2ExV1VzTitNOTZteis5czVtd3VUMzR1ZEROOFlpUUxxb3Ntd3ZIQzFDUmVoSzU1M0hENlk1NVlQaTNCM2xaMElhNlZvdm00ajRhNSs4cnA2WVBEcFFOcU9nTS9odzlNWi81OS92angrZmxqeDM0NmVtUXVtNTA3TWpwNmJEWUhvdnlCODd0M1gzLzk3dDNubVE0eUlEaEJwdUU5ZVY2MUJQd3UwU1N4L1VWWkZtR1ZVeHBsUUVpeEN6M09mQ3dCM09ZRUk1RlNkdzAxajFsWDNWNFBXR2hNR2VGWEpuUEYrRFNhNlV2SjVoeXVlb1ZrZVNHOGU4aVFYRHZERHhucXlOZUVQOXVSeWRYdXpPcFBoTHZyOVJHazZ3Q1QwN2ltYTFWTE9PUzBtOUFwd3RjVUJod04rWXlyazduYzFaWVU1NklaeDVDMlE5WlZGMlVLQUtySklKUGQxSzIweW1UZ2pNM2tNR29BaXczU1Y2bXRadXJpUEhXbU1yK3U2UUNjYjVmb2k4UkJ6bkE5dUtQYkNtY0pKQzljdGtzaHRRTitVUDRyQVNOSk9NVEo1REhmT0MwWEk4UlNONWpJMU5iV2tLVGhJSTVNU2svUzBFNGp2eWVSbTEzei9YYXZyU1BVMFRmcm9zK2ZMbzJMZUQyT0RGVC9TUGUxLzRKK0FIZzUxNjd1TFdZNFcrUGlXdkVWMUwzaHhSYk9GWmR6NVIwOS9idm1aMCt2RGgvcVQyZFhjb05iTWdON0ZyZmZzSHZpbXVuQmVHUTRHMDFhT3UxVDVlbGQwVmdwRk9oSlIrUG1McnM2T24wd3cvR0xBMzZIaEx0QlR4bFdCMEFYSkU2d1ZJUVZXUUoxRUZVR2VodzV3c2R5UGRIZkVaZldnQm91TElZT0Z5c3NPYXpDMUFXK3B4N21tTGx3NXN6aVc5NlN5THFpYm5ldlozcmJqWFJxNG43SFl4UFZyNk55dlUyUko5bmNDeHUvcEg4UDl3ektuUTR3VmFnaGR3QUZOaWx3N1VrdGhnNXlSLzh0MHp4cmhLdkpIUWQ2Rm9NZ3Bqa3lXS3hjNXA0aXh5TTdVT0FzY3VsRG42OStZOXRLTmszUFZmMGdnYzdzb2xzUkg4eEUrVmZBcDZuR3p0ZXV4cTdFUzlqKzVvczczLysrdFM4QndGZlJ0MWI5eFBDVHZ4L2d0TmJZK1ZwcTdFcjFOWFkvV0xoLy9wcmJ0dDEyWnZ1RitWY0R6RHZwL2V6TFR4OUV1SmpaOHcyQWEwT3BhRlZNMUZSRHNhNlkyVVl3TzRZeGJDVlh3amlsTDVWVDdKOTY4c0FERi9aKy9ETUhIbm5Ici8vOXovN3MzeTUrNFF1NDVvMUJzRkZ3RDRBL081SHhpWjNkNzVwczA0eVZnTEEya25LeW1tUmZoUzlkcnN2SC9jUDRVN3ZmK1Z1N2YrS2JIclg2N1YwT2N6aXp0cE4rcjNvVGZjZkZQOWs2SkpxMmlTeGZrb0lsUytodnczeWIxTi81cnFUK3JrQUQxUi9RbTZyL1NxTmI2UFYwZHJ6NkNKMEJXNXpaeThMbndCYS9GOERKTkFBbStYdFV0eFBXNHdDNzJRcS95cVJEZFhaekx6RXJvbUlXN3pHc1kwWGh4bm05RVczUnpaL0J5dzAzTEdxTGJsRUhCTnJmMTFzczVKTHhJRXV1TXNzMElrU3NSdjBGeC9sWkErZklyd2g1bnhwcWgvTm9lYURmcEN4cDJjcFdxaEF6WUhOdU05dmZRTHYzVWtOYlVZNzBGZ1ZhR2lxTzlZNDFvMjNqZFIzTmRBNEN6djlEOWZkU3hkeUt0NlRSdXQ5bUVZQjJRTUVhK2N6bVZtcGJkYlNITC8rQWdieFZSejVXQk9ReERqWTQwTi9Yakg0SFV0M0EvMmtELzlpUEVQOUw4RW1mam9EZDBpRXFpaG5tYTRlNlRVZDk2TExqRGN4dE91YVpzUW9TZm1xaU1qTTJNenhZSE8wZGJjYS9rM0dOU0lZM2ZpSE93WjB5U0Nwa0IzbDUrWWwrVkRuUlBlVHJGdEEvSk5HcC9uek9KRXVtbFZEREJ6YUw4Y0U2RjdVWkM2VTJLc2xVT21jM0M0Z2ducjNZS2hCQkJ0T3JROUR6TEhDT3dVMEdrOXJZVldLMTFqMm5qbUp0c0VSdDUrQWtTN0pGT250bEQ0S0JtaG9lb21UNzdNU1c4c2hRWmJpQzlsNGlIZ3BvcnFsQk90aTV1V3ZLcDZsUXVrblA0d1U1c0NzMTI1NWZFTmxzanQyci83THo5TlVOYnF2cGc2N1kwVkhENk04cytQdDdEcFVtemlSeVorak01SDQwLzYrNitIZHpvOE43WXJKVmpHM3ZHWnV6N0p0UmQ3bWNNNXBuYTZDdk9HUjRCWVlTOFhMLzBERDlGRG9IcW45ZkhPa3Rka2E3M2E3aGVobFFPMC8rcnhIeTI1Zm14OGFEY1YxN2ZyVFUrUEZ5NDl1SUFYYVMrb3NndnRxSmdScmVqeGw0aDBFT3ZPdFNlSVBRTWhNRk1EbDdKVUpyODZHdkhGdk5ueG9BZlFQUHpTUjVobU1VcnpsVnpYU3MwZzlTMGsrSmtnUkZLSVZPWWpnL2lkWWgrc2Z5aWgvV3VLeXBsZ1hBMUt4UWN6Mm1pZ0pLc2tYUUhCaTF0SVllWXl3TDlaNnBlMFNXUGZ5NTJpVkNDWnlDVWw5dkxoT1AxdmpmZWtuWGJMdFkyUlc0YTJsVHduSDM1ZHkzVGRuSURkNWNuVWZFb01FamNlQ1JqMStLUjRhSW1WZ3RadXM1TzdWMFVFVzBLSnZlY0lhOExWL1JNLzk1bVd2dytxZU1kWVF1RXZMSGFueU1XcFZlYW1sejc4a3JGYXBmMXJnbWkyaTIxTEN5V3BXVGJaV05oalZkL3BuV05VVUV1bTBhMldXd2Y3UDdqL21sbWJ5NWordEowNlNwNHRNa21DVGhIb0R1WHEyNXErVTZkN1ZBMDZsa1FxdjRqQXR4WGhSc3dIN0dnSjBNRWZKNjFaNnNyd2hlZm1JWWJ4NTlHb3kvTkV5azFFMFVVcFB0Q29nYkI4RVJTU1FFbXNnbGNuVzF5b0JXcllhNHZPRmd2dmd5dVZ2MThCcGltZGNRaXlZODRNaCttR21ZQkxneS9QNVdyU0xsT2xiOUlaelJrNUppV1ArVllvTmtRdS9aZkJSelV0WVhISk15M0JyL21YSmp6ZDBmUHpqVVdtM2N2M004MFM0QWtDeVl4aHV6alE1THhka0R3NjBoZ1RiOEVJUTlXMU9Yay9XVnhtd1RCTml4ZTFpR1RQdDl1TlFtR1BNOHJjMkRzYkpIQUlFNWRadkJlZWd4WVFUY2pPK1NNRU0rbStoTjl0YmdtM1g0WXh1L0VqNG1mSU5reVFXUjVlOVQ5Ry9kb1haR3drNkJSVG13c0VxTGNxQTdtcVg3ZUZlYjRoMktFZS9JdEJ1anRFWStYSlRWeUNkaVFULzFVRTgrYmVheFVoNXZFY1lBSjR6aEFTYnBGTmpZaWhrYmR3aWlqZ25vUWhLTEZaNEZCVmZIaE4wQXNvRkp1ekVXYXR3VkJpYUVSZkJndWpBWTZhNDhtSW5obGpoTXVXYTFYekllODhnamk1T1RtOFprSGgwKzBuVisrT0wvcmd2TDZQNVRzTzlZL3kvTmRjQXMzcnIrWDl5TkN2WXRjekpUNW1QR1o3cXd4d3VjUFl5Y1l0VGJjQUh3U3BxVUs0VXR3SlI2dnpFY0h6ZjNGNnRiTzN4L1hlY2xOdFY0KzllTXQrL25zbTZjWUtWMGlNZUxGQmtyMGU3UjRrYlh3bmE3VjgxdGcwZVJNTzV3UEJaT1JwSkpUejVsMGZJME9QeG5EZmdSTnpzN0hINS9YeTZyMTJOcnhZMHNQdFYraW5RcUVpNFdVb1Bwd2RvMFBHbkltT2NaWTU0a3pQT2dhazFUUlE0eEM1b0wxYjdtSldGOUhTekswblpHMEVPTVFtN0tFMnp4bWZhRFFjaW1BRU85bVVBTlIxc2pqalZhQndISHZlcXVOQ0RFY1dTVFlmMzRQVVpxR3Q1bjdlZTd4R1RHWEU4YmM4V3NCTHREaEJyaWdLeXdXMVpBazhKcHJHMm5HUnhBdW8rT0RHd1ozTUw3R05RbXM4TmtMWE9oM0hvSW5sMVVkelRPaHNkUnU2RTMzK0RtS2F3TjY2blJ6djlEUWxiVVJXMkdScXBkeTlkajNweHMyUlJ3YStNa3hoeVBHWE9FM1hWbmdkVjVVNnp6dmlTVGJnYWU1NEFWV1J3aFJzNnBYVkVSYmdzSFNLMXV1RjFGemJFWEpqVzNPZXZhYUloNVZpa1g1MzVZWTk2V0lldHFwMVpTbmNtazlLNkVlb3lob1VDOEtkNmdiclY2T3BtZ2FBZzgzREF4STRvcUNnMTZaeTIyVmdZN0FXUEwvYUF0M0tWMjlvUHVvbWUwaWJvbFF4UmlraFFUVUVtV2F3cWM1dU52U0cvTDZFTzFOTGQyVCtES0hJTURwZUdCOG1BWlNKcko1QzBndURQeUpqbHZsNHBhaDhkajVhRTZIYjdRTDF3eWl1Mk5LTW5KbWc2Zm5FNXVGdFhXWXpOZTRlc2tUVWJJWWRXWllKV3RhY3hLUlpleEJYTUllbGd4cEJZZThyR2dUUzAxemcwMEFIWVR6OVgvZWwzdHltWUcrek1qMlpGWXhPUEMvQWVhUStzY05DTmZ4V2ZVV1dqTEh2WDY0RFBSS00xQkNsRTVzdDliamtRejI4TFhoQTV0blVxcGh5dERCNll6eVlrOWc5T25BNWJSbnJuVVpGOHcyRGVabWo5eFVyRDNWTHFEbHBHT2hIZTJaK3ZFSDV5YnZXbXRtSnM1UEZJNk9KMm0wNlh0dC9aYy9FRjRhRGFiblIwS24xdGRQYWZKdDZJbTYzK0R5M3JnMTk5Uy9ZVjhyTk1reVg0d0NuMHMzcjFsdkRUTUhIVVlWdWxoM2plSzNyZW0rTGVsTmY3ZFh4dmNKaEJ1YVEyRVJ3WUhCRm9wRDB3TVR2UVZzK2x3ME9QcTd1cXcwb1NRc0JrK1JvNzM1d3k4ZzREMzc2bWVRWmluQ1hlVEZnc2FaTDQzYXNhTGhIa0ttbEMzdHFJKzB2eEltd1ZZV3hjUUc0QUZESlFIeWlPbDRhSG1KVENEUmVUNGl4SDRXNW9Na1lkVlIyOHg2UUF0S2tSbElVZ2xXYzh3UUFNY3RFaUNLcExoWVZJVUFRakhUbVY5WFVHZk1aWUZyL0VCc3ZuNGRRdytvRUVWaS9pOUxtZVgzWlNXMG81dXErSXYwbFNsSkw2U3ZJUHk0dmJ5cml2SlBSQk9mZnJsdjcraS9BTmpqNS9XOWhqdnFNZmdnOGRWUnd0M2NscWhVMWd4bjJ5N3UyMFljN0IrK0N0Z1RYNnZ0bVZOU3BZMmZpWWNGZjZEbE1qcUp6dnRMR1dDWjdhNHRUWlg1MWdSTVlhaG1PendHNy9XYXF4cjhzUFdWOHpuMHNsTUFZUEJ0RDVNbG1zS3A2SFFZTEUwakVuemJJUk9nYTZIa3ZNelU5ZnNIajJVTFVSMzVFdmI4a1BMNVlIS2JHWFg1TTU5QzNmZGVPSjIrRHU5M2VQdjhQc1d5dHNQeEpPRDRmQklNVlhzRGppSE1uM0QrWUhDME9UcEkxV0ovc2NkYno2K1Zwcm8wZnFPWUZYV3Y0TCtIOEo2eDZCTmtHVEtnMnRBYjFpWUNUbFFsazBuZ1hTWUM2QTNwWVB4SVF5anUvUzJJWWJLM2hKUjN6MDF0ZmlPZDlSbmpFd3l6ZnhEVGFGMWdkV0lmMGQ4TjVGSmtDeXA4NmhwQjZ5QUVhcmFoRjR3WXpFcnVjQkxuQTJjOUVaNVlHVVFKYWdFZlI2bm83TUR6Rm1aeU5qanhWOTA1UlE0QXo0UkZQSm0zTDU4N09qV1c5ZHUvZlJpYUcxWVIwLzBIVHg0OTkwdmYxLzRjdld2ZS9yTzdFUVVwMWNaaXNESDA0Q2prOG1xajNKOS9XR3RjbHJBbStZZVZtVmlxak1yV3BvNmJHeHNmQTJldERNNS9WR3Rwd01la3FhZURnRHVYRDJnVFhvNi9BMzJZRER3d1o0T0NHdE1MZk9lRHRqT1FVVDk2UjZDeWV0U0hjRDJiUjBRNXIvQUFINVdQNnIxZFRnQnY2bW9JNnlwZ3lDZTVKbndjaDJ3UzNWMllPZGZ5d2NDUytOQlhyTytTVWFRSGM0Wjc5TmpsbW1IMENGem45REdzK3o1MmpyOUc1aG53M3B1OC9WeG5Fek5DMnh1N2NCd0FWbDBqL0Fsc01NZlpMMGRIaUxmZ2c4T3F2c1RWQkhpWUEwSUt6YVRSVVQ4SkZhVWFiWUtPb2FyckhkYkIyV2RkcUlScHdNUkx1UXpxVWh2dEpldnZ4NTl1MmI3Yi93YnpQQXkwMjAvcXZWNHVJN1gzTE1lRDJnM1h3NTFZZU0vTmdMa295elhLVWx1d2k1Qmdzbkw3SllPR0tWMWVZakxkWGxQa3VUVFhIQ2FSNDdKeWdqcktTR2VhVGZTeE5Na2tvbDREQjBZN1pPalhPMTBQa2ZKU05ScWN0RTY2eEszTG42Z3lSL0wwcmlBUHM4QUxtSG12L3lvMWgvaVJ2aGdtenJWMUI5Q0JKR0VmU0UwemJTUkM5dDFpTUF6QXZ2Tno4akg2czdJbExvVm5Xc0NpL0ZpbVR4Mmg0REg4QlF6ZjErVGVhOTFpWENuWEdtRjk2UmFycjZBT1Y0QTl5MWFmZFNiWVh3SkxpUEZ4UEs5c1B4K3FkWlV3YmNxQ2ZXOVZGbWZDSStzK1dLMG5ERWdTRXN2Y04rbXZjQTl6UWxqOVBsdmF1bGlBcGRWNHJzQUFRVWhzcmNkWU5JMzF1ZDU5U1FTazhta21CUVc3UThVWFNVbDVRSTUrZkhUYjUvdFdCVGZkZWZMM3hXK2ZIRVUxbm9JbnQ3QmZGZHY3VUs1bCtvajJNa2J0R1NLS1lRc09PN1Z0c0hoZElwNjc0dDA5UVh5ZmthanR6SjVtZjRsd2M3REpwWUp4L3FPbkc1OFNKdExOZVpDWGVIdTZ0ZlI5NEk2K1JJZWVIenduQzRYdWJ4eG12ajU1cjJJYVRjOGJ5TkIxV2V6Z3Z6RjFFWWduSllyNTJlNWNoVk10L01vY0Jrb2xoT0x4NDR0bnFDREszUm5WL1ZiUzh2TDFYZkRQMWlkQzh1YlJONTVHNWYzdzRTYy82VExWSmVGRmlleVJDU1pHSjVIM1lKVWpKUzBOTHJJSldZaFM2eVpXSDErbW1Ma3B6bEFoUHE4SHVxbXdHVXBwMW12dFdFNFBHUGdrTFFUOGhIVmhoM0NHQ0tDaGtoU1I0VGRpUTJvbUhWVXVCc21xK09qajJ6RXlCaXRwbkNBWG5DenlhaDEwRDQ5SHVEcmtBY0xrSDA2K29adkNNOEoyTjBhL25oTzNndWdqamRTTWNoN2xaMXVTNytvL3VFcm9SeXAwZTVUQnUxQ0RrTHVWMTFKYXBhOFZKRVpDdUpLZ3FMYmxjV2JqVTZtWm5QTjA2dGpaREV3S2hEZFoxWWIxNGljeFVBT2FGTXNaTk94U05EZlFodVdTOGo0NisyY3Y3YXhtNVpJSmpES2lSSGkwQklNNWJvRVE2OEhReHlndHNhOWNleG9rQ3JXNEQxcndJdUVtYVRyTFdiU0p0T1NndFdLQkR0dXRBV1pUSGc5aFZ5aVA5bXZnK1dPNGpaNEJnSHVkblVteWFvV21mTWRVYTQ3QWd5NFVnYzhBY0IxNTdzTzNtTFU3SEQ0VHh2d1kwN21lYmZLRmhGZDdncHRCR3l1QTl6ZmgzaVBEUGVOOVk5eDM3c08zb2JnMFQ3N3VmaDIrbU9RSjMxa0hIc3FnZ1VyeHdKK2xuY0h1eTJJaW5EV1loVXcySS83SEZ1MW1ZRXJUQ2Z4RFJ0eDA5cEFmejVYTHZXUEQ0d1hlM0o5K2I1MEp1bEpwenN3d1V3enFqWUw1Nk5MSUtNNVBwb3pQbWV1aTBhdm5SNm9jM2xnREgvbXhsajAvQXhtZ1Fxdm0rUWVrR3FsUGg4VVg4dFNIN2lmcll6TjV1YU92c1JDOS9jYkdhTHQ5c3ovVTRMOTk0aTJWODAwbFpzM0s1MEFEcXZuQkExbXFBNW1Jazk0MWJJa21ZNWozdkJtdStUMTVOblcxMWpXMHNoYmp4a3d3MkdpVmJDeTZQUFpWNElpNGZ2TjhuTkRKRU1HeUp0NWJvZ0xsQ1RTMXh1UGRZSFlOQVdwd0h0Nk5QMVc1RDA5OElHQTRRdEVQa1o5ZzNWNWlnaE1oYXA5eHNxa3RCRjZYYWc3bHlVa081QWJTR05maEZEZWxXZTVzNXQxNTFBcVlCRzZtUG50NHFhZzZQV09UMFNUeUNmNUhaSGtKUHdkczROejg1R0U0bkw4bzJzb1BIL3N3L1BIM2ZoWGFURjV1SVNzNGZQMkxDWVBqV0Myc045YitHVnF5azg5M1k3cnF5K2QzNTJhQ2xUL3JkdFJmOVkrWmRBN0ZHY3hnWDZxbUpLc2NyTVBLemYxanUyS3dpeXR6ZmUxVWg0ZVJQbldzcThvZTY5aHZQSW9sMjMvUk1pYnRFeFlLeVdTdzJaaVJ6REUva24xZjY3clJXTU5NckNXRml2cmFiRXBHSUh5Unh2Um1DTXI2em15M2FDWWVOd3U2cVRPVE1xcDE5NzFBRVpIMkozS2NVdCtocERQOG9tNzNWUXkxZkJETnRGL1JmVmZhVGdtZEJ6MUdIRU5TNjAwTDFRTEpqTlU5WUdOeU9xRDY0TEp2Tml2elNDNGJyMHVGNlZZQzg3dVBMNHdDKzhqa29PN2RvbSthS3dyL1d0Qzd0Qm96cEduSzFhZWZkeUc1b0ZhdDRVV2FrZjB6MTRSblZsK01lT0JkM0lldUVpd0hzcm83dEN3ZyszU2poM09vdEhqd1lEM2pBRXYrYmVFM0t4MjlOUjFIZUVVVCt1Z0ZXTnJXb0dIMUVTN0hpV3h4dlRkTHExcGxMdW90NjVnUFJ0WTN2UWszbEk4YjNvUTFJRUI1dTdicENlSUJoYTduT0xDMHBtMEk1UXBwckI3d3hVbFZTdWJ0Z081UktyMXFhWFdxUHpJb1VzbVgwL3NsN1kwQmVmRlRKdTlEUDR0eTh2b3Flc0N3cWlKM1RBMFRhQWRRVnVvcWZXYVFIb2FzTlBueUNXNmdHekdJVHhmL0lod040bWg3UmlnWmhLa0ZyT3dZclVJNGhLWWlnb2xaa3JPWW5VZ3orSmx2bFhMU1dLeHhDMXIwWEFLcTg3NGl4WmdVMWdndXViWndxK21OSEtXU1A3d3czV3A1SStXYjJlNTVMZVg3Nmtsa3dzTXI5ZUkzWEE3aGZDKzlGQ0o4ZzYvVmd1RnhTM2htQXNtcXJlNjh4a05mZU15VDJqSGZvS1JJcTBvS1hHVHJIYmFzeGJZOG9HbTFIYVJkbjIrbW15ZjN4NEhIc2JjK242eVUxM0IzUHBlcHlDWkV0UnNpVlBGYk9KK1FPQmhpMW0yZ0o1TEZMTnlacE9jKzJJaGszWjZtRCtRVWE0dGlwdTJzMm5NeDVkYkdOYWZMN1NrNkRlbGp4eTNibUY4RkFjK2dqVUJINzJMODlHckNYbzJuYkE2RjZzY3dQZDNMV2x0bERaWmpNUEpLYzU2RXJCYW0zR2ozdmNjMXZ1NlJGYnZ5OHE1dUxRSnM1Yzg4ZHRSancvR1dSRnFnTDE3QW5NamhQdmJEY0xzSUZkVHFVMEdYd2psTXlwK042bTAwU3QrV3lwdHZpQSswbFg5Y3FxKzF1Wmw0YmE2V2h1Z0U2dHRZR2Y1M1Z3dUQ2SmRhemZYVlRuRUc0eFdwVjNKUTdydGtKYjZoM3Jyek9GSzYzWXR4K0ZaQTRkSUJ5RTNxWjBhRW5IUTBFMjZXUlptYjVEQkRoSnQ4WWkzZk55Q2d3Zm1wMERqcERlcDQyRnB3S05HaXlEZ2NTZmExOWlCQVV0VWRmdWFHY053YW1HOUxCT2pIU3JaVFFhMUlOUnFNd05LaGwzSWNYcmF3Q2ttRVBMYXh2MUpzRGZUZ0pUQWlLMGI3YzFXYkRMdHg3UWdFMEVUaXRKNjgwbEhxY093cFp2cDVQOW5RbTVwd29sb2ErZnp0ZDJzVFBzeHJUdkdDT1QzQU9zMDdKaU9pMkN0d3lYaEkrU0dSbHhpQ0Y4NnpzMmN0dFJKdFJ2UmlnZWxZYlpKTlE2Mk50SGtNUU9QTVBETzJVWTh3dXpsTjdEaXM1dnhidFBIVjA0SnJGRUswSi9UNThHMi9RaWZ6WjMyZ0JESGFtNHJ5d2RBaDk5eXFQWnJzZTdYbXRZWFJydE5xeE1VcVRhN2tTREF3UWEwN0lEbW9kd2FhdmlNQWRCNkZNYVp2bXJGa2t0UEpvTTNXR0tUeE4vNlJqa1ZSNG4rZmJNWG1VV1FsbmlaVkpNVFdhdVIwb3VtakgxaGViMThYK0t3TDI5czNKZE00MnR6cUNLZGE4c2xoYzNIL1ZmTzBhY00zRUpkRFQ0cGhtU0xUNnJSMTdRcG9wdU1hOGZVRFQ2cGV0bkQ2c1BZMmZwTmZqZmN4WFF4b3dOUHZjeHZMaHN6bXZBWWNKNDI0S0RXTnExTzZIQlkreDFETkRVQ3VtUVBubWI4L0FQTXBxanJFTVRFaTlJR2Jtc1RuamJ3Z2dlWW42UytBNCs1VWFpM0FHMXN3Z013V2QwYWcvazRwNkdiNGRpRm5lTkpKNnRnYTdCdlc4clpITTZSRkxiaDBYQnNoaGY4RWMrSkJ0MjdCbFBrK25mTkU5Y0NGU1FKM0RnT044STJOOEorMm9BZCt5N3o3ZFhqeWxxSkdYNjRGckRJOWZVOGorQnJNcklaZC84WE9IM3JhYUZoTGRQTjBBYnA1MEt3V3V5RjFla3htTy9sOUlXcG1ycmFOUG9HNnN2M05tdktZOEI5eG9DYi9DWWhyMU03R3p2eWJHclQxMCt5cVUzZlpoQ1k5SmZvNGNOeGV0ckFLYnFIN1gxdHJmVnB5VzFYdW5rUG53VGRTazhKLzV2bC83NTMrWWtrOWxkcGJPUURqQitrQUhzbDFQWVRFM3l5emg4TUc2VUFFbmIya1loUk5qTEdibHQ5azJ2RFlBbU5vOXIzK0xIVXhSK2JDa2s4TFVVakg1MWEyN3NqUEJvWUdneU5KMzA5QzhtRm5aUEJyYThxRmVLalh1OUlyRGhDdDZyRDVTbTdmYWpZMjkwOTRIYnVtSDQ1Ny9lOU9wWnh1K1k3N1ZtZUY1Mm1XK2p2QVYyd3hqOE10eDlJQVpHZTBadGxBS2JwYkQ1dHNnU0xycWJLL296dTVBV00wdEh5Zkw0d1B4S05qc3dYOHZQbEtGMVlHNnVzcmxiRzFtaTFzRmlPUnN1TGhjSUMvbHdvYk4yN1oyTHJucjFBbkRUc3lldUV6NUVJOWdXczllWFJYdlJnd29BbFdkZmo1NFR1Tm5yelJHaEVrb0ZXbS9UbVFheStGNm40czdFVndJWmhsZS9aR2NsNXQwVEdWbGZwcTN6K25tZ01VR1lveGNPOXZzRHVyVnQyazFwZkhxMDIvMzZzelhkUXJUWWZVOFQ5TGJYNW9sR1kxMXk3ei8ybGRWMlBXbXYzVzRhc3MrWVRldmNlVno2bEtJSFd0UEhTZjdaOXoxVFZiMlNKTS8vb3IzZytHaWhtVExZc0V2S2thbUZaK3JVMVo0eFVacndSbWdsZ2JpUkFZYlBCNWxacTlEV09iU1NOdVExcDNJM3AvYTU4dXZaZVJyNldaNDIxUk5LRVBLRjJHMnZSVXNDMVRQKzZUUEJMTGlmVGJtQ2JwUlJxNHk2L0RIODZoVW9KSnBqWExVWHJ4ZHk4SjBGWXgxK29kc3pkMXRZaWFQdVNxOHZpWnRWSVRVdXhOQzZsdVBsd1MrdUNCcHBITnk3TDBtWlp3UlFzUzA4VXIxdVlyV21QbmpiV0Znc1M4dGtXZnNzMlpvczNMOHZhdUt5ZVRVZGJXMWZWM3pTNGNWSFdOb3VLWTFvNnBmVnA2WFZMczdmZk0vL0xoUHl2MW5YcDJlUHQxOVhFZVQyYmptN0RmdjFOZzYrQUI5bG1zZnp4elhqd01XTTlZZURCMzI5WlQ2SXVVLzF5aDZoMVlQdERwSS83cnl4QWwrTUJ3UTF5UEVkR3lFc2NZYzlBUHdoeldYRlRMRGtUU1JRN3JtRmh0dlo3L1hmaWlodXNIOTFvVEFML0c2dkR5S2xaRXJSbUt5eGVsRERoT2hNc2tNTXlZTTYwZjhBZ1I2cDFtSm5uMStOZ25SZzVmUlFqQlE0bGJVZGlDekVuSWFXaDNoN3NiWkxKdXJBbUp0VHUwbWhqa0Y3NkhtbXlUS3QvdHZtMTBtU28xdFVpNmZ5RU5xckdUL2d1dUsrMjhGTVBVWWpGckZqT2RWQ3pEVWFaNVhPWE9mdjlsM3lpemZrZmJ2UEFmNnNNK0pTeHhsQ2VrUCtEdWQwV09VM051dXdXVndhb2Znbmhlbm1LdWNYQ1BPQ1hsWFg5bDN4aWsvVTJQM0Q1OWZvcEhhK01EUGNWVVQ5dEZPTWl5Vzlrd1ZEcElsdkpQRGxBOXF0N3VxZ3NlTXlDSW8vSEJWRXBVUXUrQnBZU1FhYkNPWmhlTkNraUZsZGJ6Q2JMV1oxdlk2dTY1WjZRMXZidFdsbmFNYWRPcFN1RjlFZ2E2K1JjZGRrR1JvK2ZXaFJaYnV5L2czeWMxYjdYSzZXOHR3Q0xOTEdIWm1Lamk0WGlTbGdaelNrMnhlTHQ5Q1lzVGpmOHN0Z2Q3UXpFbzVGUFRjNis5WTVyYnhzdHhlS0QrWUZ4dXJneU9ycTBORnBacnY3ejZ0ekJjL0hZSDhzZGNqSkx0MlJuaGlLeFlHR0EwbmxSY0R1OWxTajhKbXd5S1ZHM3kwMnQ0a2ovOWoxVFkrSGVibXNoSEI2eSt2YVBsQmNYeStXRmhlcnZwZ3NEZWE4WDdBcHFUYkd6d2VuNVZlQ2JicTYzaUJ2a0J2VzZicUNxMXdKVTNaSUFxbzR3cWw1OSt1Z1JrM1dwZzFvSkdITzJjNitJeW9mV1R4NWZ2K2JRTmZ0M3J5N1BiOTgyemFpZHNSdjllVGtlZjJIZ0VRUThibFZ2T2dRVHRlSWlyZGc3Qkt1TjJxeXM4clk5RmphYmU3VXRLaUN5anE4ZlAzYjB5T0ZHWkRvNU1pYU9DNnN6bUNiTDVEQTVyaDV4VWJNcDBDRll6Sk5wUWJKVXFFMW1YTVlyQjBCU21qRlhrbmUyd0dpa3pTcmJzUHBBN3orcWxXd25sTFdEKzNhdExTM016ZkFwSGQwZFNwU1ZEdEQvVDNpTzlpeHVMMWUvOTkvRWVjS3BUMWNqLzEzTVorejVueHQ3SHIxemcxeXJubW5IZTV2dE1qQ2oxWFp5ODcwK3RIN2kyUHJWaDY1dVpUdk5IK1VTdmsreTVBR1duL3dndlFtZS80SEtPdXRicVdMMDZleXBkZGkwNmZVUFlhM1pab2RWRkZuS0dxM3YycGxIaEJWQStBckdlMTdoREZjT0hDL25ZQ1lUREdUeUdkQ0srU3RyZWI5UGg3M21PeFRyYVBCV1JvUGZWenZDQVh5cGlyV3VXMm1rZlo5UnBXSGhvWGJkUnBXR3RWNEd6aVZCc0RkOE9MVWw4TGloU0pJYkx3a1BDODh3WFdzYnZ2bGdhbXN4azB4RVE1MG1LK1poZ0JtLzJQWkZOK09WMGxBeGkyMjhNbUM0NXd5MXBKS3RKV0ZqTWdDY1NsYXE3L1ZpU1VsbFZNc3dFNDN1TVlvc0N3LzNoU2RqeFZmTlhIdjM5S0lyRlRtNXNIMjlNajVjT0ZVS0pLeHo5cDVZWEszdURzVEdNNWx5cHFkeStQRGk4TUhrK0UyOXZ0R0JmTms3Rk93ZnZHRjk0bERlMXJ1WTMzRnM5L1RRV2pMYWY3SS9mMkxFcHQ3Y0h5N1I3OGJHc3dudmFESXpORjY5WVdvWlR2Mk5KWHRNWlJHQmg0UUZla3I0SEZBaTlxUjg5WnpxeHRkRlVIU0IzVjVYYmYya1RPWmN2bFR1SnpmUHYxMzQzSjEzOGh6ZUorSForOWl6QWZac3A1YTlURzkzZEF0QUdIeUtscFFVVFp4Kyt5dzhoaC9mSU15aVR4RGtYSTQ5RThicEtDOGV3VlJzTmkwckN6SHBFSGhwQ0QzTjYwQ0VXU3o5WVBNZkZPYm94NFJQRVI4Wlk3RDY3QlNkeS9oT3hRN0tFb2xoLytHOFl5YlV1dlk2UlNyc1RtVlNyRWtlVzFTT2gyOUxOWGNNYk01REpYc3A3YzJsRTEzZGJtdkpQcFQwZ0tiWTdmSUpjOVpTMmVWMWhkUDhaNFRUNFkzQ2FmcUk4QmpRUVZzVDBwRFFBNmpiNEtzM0tMNWRzSUdXMUpNbzAwZXFQeEllR3huaE1NNENYWDVYZUpiWXlRQ0RrYlpaMGFlMEpIQlBrbER2U1RMTHhFN3RvdUxsc0dySmpCVmdNcmxRc1EzYjkwMU03dXNzMlVhRld3WjdPN2JPem03dDZCdGc4eHdWMXNsZkNFOFRtNDRyZTNQSk9pdUV3cmtJd09jVkJUcjgrcXFDdDNraUVROThDZXNScnplQ1gyaXYzQ2VzMC9jeW1ENVNZbER6SXFQQU9yNUtBSnMvWS9zNnNodGJ1cm9jSFQ2N3I5Wkp0bm1HVXQzZlA0bXp1YVBSMzlaKzFtYXR6WTd6djF1WW9MZUxRVGIvT0p1L1g2OFF4VElkSXF4THJGRFVoTEpoVXl4bzNjeTV1a1JRS2c5czJ6YlFQelBUSDhrWHd0RjhYcGlBZjZwcS84QzJmQ0VXeWVjanNRTEg0MlpoQjMySm5RZUZaQmdlUWI1OUI5ajJIVWVpMEozNFZodUQvZUIwWk9EcnhYMXYzMDc3OXo4S3ArU3V1KzdpNTJRZWZkejE1MFN2VnRET1dQTTVjV0crWWlyM0IwZU9UT0l4ZVVZN0pqRDhpL1NYTkNCOEdmQnlxZDM2ZTZhOWRJMmZVc1RoMlpYQW1QRGwvd3RqZTZzdmtJOXMvRDZNOWFzZXdwRFgzTldJT252QUJ3OGNCZDNnd0tmaGx4L2JjTkNIMkd0SXIyVjRXbXZ2eGxsK3dzVXNTNU1vaUtaYkNTK2hPVmZIYjRqYmJ2UXNzaEhDUFpzTldmOVQ5Z1lkYkhXSUMyM3pGaDFNMUtRUE5iMDlwNmY1eFRuNHlod0UrTHNiQVhvVjZTWXVVbVE0eDYyTXRpNEw2OVNMeDQwWXB5MlQwU1ZadTZBb25XeXdNOGUzMWR1UytVV3QxbUY4NDVma2Q4Z1pYdXNnTkRSc3J4MjF5bkJOUDd1UkYrTEV6c1M5dm5qYzU0MXpPS0dOMCtURHJGakYwU0pyY2U4UHJPMGVYL3FlL2s1QW1KUCtCUFNqSE12bngrOXY1ZTh6RllXVGVCNGFlOGRqN1NSL1ozeERUUmR4dzV4L1FIOUNjZ0RCVE44S21sYitWN3lhRHJhS0NpTFdyTjNIdGdxaHhiQ3JEMFpIT0JDSjkvb0RYRURxbkNFTUZ3YnBXeHduK3FmOGZhMW1reUxJRXF2bHd2N1dnRTR3Z0FoeHBhTWVMYTBaajhEWEIvSlNKRjM0dGlNVDFkbDYxVmhnWEZpVFRJVFlMS1l1cVl1Slh4bkViMFVzaVVyZFVkOXRXYmFFZVZWVTdGbUJWTW5YWTE3OHB6Zkc1dG15OFJMNVhlR0xiSjd6eTA5a1dXOTdmWVp3UXkyYjF1Q3UvbU4yZE5nWVZyZHVZbEtSbks2TllLRjNaeHMwOFFWQzlTenhVQjJhOUtVcVlOYUlaM0xqbC9Rcnd1ZEJNeWxnRE5QbFpFRjBnaEVSZ2ozYitMdUVlUjBmOC8zRVRXdXhhQ1lWTGNRS21ZSWIzMk5BUVJQeHBiS2d3dWhLaXBMVGs1dGtzUTRYZWppZURJdlRwblIvVHlHNWEzeGdUM3dzZit0TTczSWxOdlMvdk5Fb29rWFArd05UZlZON2tyRllPZGsvMWQrYkhaOE05cXVaMG5MMVN3MTRsemQrVGY5QitBTEQrdzJmeERjSXNEYzNXL1EzL2pCY3cxb3VMcXppRkc5MW9MMjBjZE1oTE5aK0tRQkE5czZtOWJ0ZzNibVNGN1MyeHBPT2pxalIranZxdzVkZi9yN05sazhyZGNzSFh1Z1RGUEtud2d2YW1kWlZMMDB5ZzJCN0haeHBRZmtlTzlOYllPem5oUmZnNU9SSlRQaFFveFJ3Q0VhL0lJQUp5c2NMN0I3eXFFNTI3VnhBdVhPN2Z2Y2daSjhHL1dvK3cvZU1PZWpWOEd3TzVuaGErSkF4RjhCaDZnRjdxUlRDY1ppTTJMRW1sMUEyWUsvalZxejRHTG9Bc2d2aC9pNnoySERzWmxBcENjTmFQOGpXNE50RUowVjk5THJLMktyd0FxS082NFpuNkp5MjdxUWFrMFJXNGNkWER0WUF3U0k2RURQR0VRTUFKUTNJaTVWeEJnaEF3UjBJQ0J5bXp4T0p4TlVJVnNGUnpDTnNhRU1rRWNtSlNGRHNpMXVoQi8vdVc3dSsvVzM2L0l1LytObExmRjlINGR1Wk9oamFtNUo5cXdMVm04cnJNRmlIWFdXY2dlQUFnRjZBZzdBVmM0Ym9HSk9WWStRN3ZDYlhaZ1oxQ2pGaXk2TUlrQ0dsd01XcmRDZ2RWb3o3eWk1ZVNTc2dIcUFsSXg0MmZKcDEvT1Z0N2xtdEk0T0JMMnFYUVp1d3lUYUxtYUdGNUVrd3RQaDM2bWZZVlo4emtPU0kwbzMvczFHaXZ5Yzh4WHMxc1pmRTRRSUR0TDVYazBKTGRKQytiYkY2ODdQaW0xKytnOUdudUZFU0ZQWWMxMGxZVkR4QU5KMUVTbEg0ZUtWNjh3bzh3Y2Jmc2pGTS91UXk4L2djSmNjdHMzOGxQdmp5N2V5WmVYS1JkdEZuWU9XeHkraTVsYnJUL1lmNWlZazhmRjBjTHhhM2JDa1d4OWwrVEpEdmtnL1RQZXdtRmNtLzQ2NjJxdVlDNWJlVXlIc1RUSkwvb0EvUzhVdnBVcTZFSnpGSlY2dC9UTWVuR2M3NHpQZXY1Sm4vV2QxWDk0eHd4eFU4STJ5NStFemRNK0taSzNoR3pMLzh0K3dacEFITkFnMGVCZjdhRHJaeVd3cUlna1VSN0tKZDFQdXBUZEt0UUlNNzRaa2Q4RXk3dVRUQnBZMzlQaHM3ZnlWalljMDRkdUZLeHNKYWNlemlwY2V5L2tNWmVnenVlenVSLzlnbTB1RmlaWVJkQStoQ0F6dC8rWFczWmsrZFAzOHFlK3ZyZnY3NGp4ZEtFOTk0ODV1L01URTgveUkrVzlwSTB4MXdseG5QWnR6c0NrV2ZHcHBtT3paOW1KTHRHd1U2Q3Z5dE1GNDFYajZORG9majJzblFaTGZFMzROWm9xTXZ2dmlIZi9nMzRxTVRMMytYeTV3U3dFZ2JNTFFuZVlJL1FvUERZc2gvMWd6Q2tTb2hDT0dwbDIrWUVFTWNSZytzL3lxd093WXhDd3o3azZhcEtQV0RvcWVBOFdRR3Nra3JxS1lUYkNJblNiWExWVTlGek9RU3VVeUtOWFpYWksrdmRvZUNWZ0dhZWhsdTFWd3VXMHQ0QUpYRDUwWHZTTFhmbGV6dkNuZDNlakt1d2tSYzZNNTdDNldscFZMQm0rOFc0aE1GVjhiVDJSM3U2ays2K2wyOUkrWGkvanZMYzFTU3g4eEtyTHpZYzJaOGRYSjEvRXpQWWptbW1NZGtpVzRmdWJOeXVMUDdNSzVwWkNOTFQ4QytzRFhoTytzVmtPbjlZR21rcVNTbVdIWU1ya2dTeExPa3Z0eGVqNUhWMWdRcVFqWlgwNHRBVS9DV1lET1N1QWp1YkVXclpCU1hpTDZkdDd6Q05kSEhybkJSbEV6Ui9mVE5zTmNPckJwbkNVbllJMEtXVE5UT0ZUL3ROV0ZremUvRXcweHpjTjhydVVxdTRzdVZsSXBQOGRIek53c2p3czJSMjI4TlgwOUg2UG5vcSs2ZzcxNTg4TUhGdnNXRjN2azMzYnVqZDJGUjR5djRkZy9NWlNOYVp5YS8xa0pETTJxcDFvZ0xIWEJlK0RkOElLRnZtNWYrYzk4YmE3cGxJemIyT2xUZWRBdkxEMHFzL09CVER6eWczbjgvL2ZUNEY3ODRYdDNlTUtlTG5PSnpKdUYrZzcyejhIWTcvTzExNG5IZWxzSktMUmFQQlpOVTROOHliM0hZTkZ3YndnS08yT2Zmb2YreEtiRml5U2dpS1JsRkpJQVR3K3IrKzc4NC9pbEVETDRCbCt6WStDdXdxcDRCL09heHMwVWNwaHBLK09CV0ZkSG9GVmUwRjhIcWVYR2c0SU9PR2M0a21hT3diVE9aMGNybXhVUmViNDU1RUxYQm1pdWZmdWJRVXMvQlFpUS9IK3NmU1dhdlhaaXNEQWFDaDVmeUI0dVIvRUswdjV6T25GMmNyQXdGZ3JjSnN0QmI3dW05RVgrT0ZQcXVtbHdPK01wZWYwOG1rck9uQTl0Rys3ZlpYU09KeVpXZ3IrelRmenNEdisxMGxhNEZPc3FENlZpeE93Ti9rd1l6OERmK1BuYllHMkVZOXFhVE9Fa0l6eFFtc01zaXV0bkpPWXp5YXNKTHI2NTJ1N3E2UU52d3VFTHVVSmV6eStub2hrYzd3YVpQZElBc1NqaTRWVkZLNE91aUhOallNUVhNd1gwdkU2TkhiNy90S08yYnVlV1dXMTQ3T2pxOWN5ZE52T3JRa1Zzdnp0RkU5ZHYwQkkxVS81bEdkazV2VzhNN2pSNmozd2E4REorSlJMbmFoUW9tWm9QcVBoT0g0VE54bFZ3cFVaeDhVbjF5NW0xdmc4ZVBWWCtIaHF2L292VjdwWDBDNmc4aE1zSGdEWmxCRG5yWk8wa1ZLaTU1S053blhCYWVhM1ViWkF3ZkkvVTFWQnp6ZHVGYWJoeVZsLzBoZXlRdGpTbnFrS3NZV2c0RTdlR1VQRzZHZnhYbzcrYzdyUDE5eXZaVmUxZmVidTNyeDcrQnpyV3hjUWY5OHNZVHI4RGZLS0cvOGN2VjhxN3hjZmgwaCtBa2IyTjZjbFFOMWQyRlRNMnVmOVFGb21LM2JkRXFPTC8xTGJoSDRUa2FoZWV5OUNqVFNZOWl2VDc2QWhxOFhKcmF2Yk50ZnhReXRuR3o4QVZCSmJOa0w3bE9QV3VqVm1HTml0WnRZS1Ztc1paNEpZZjVDd1NqQjRMMUhteDdSeFVUZW9Tc0lyV2VzMURSYkJPSUpKTHJpQ1RMMHJwV2dTWEpvTTd0MmJXd1kzcXlYQ29XMHNtZzM5bHQ3N0FvWkpiT2RtREQzR1I5VmEvTUR5RDZlckU1Ym9QN3Q5eVFLNGhIVHN0Y3pETGZQdVlhbk55eU05aTdOUkVlY2txVmpCS09EODMyTEp6Wk1ubmRhbC9memh1MkZmZWtIZmtqUTR0dk9Ed3ljdWl1aGRuYjlnMEZlNmZTc2Y0T1gvbjZjbzhuaDhtWmJudC9xSGU2ZEVETnFJTmh0elB3MlhUdTVQejR5Zm44OElIYjUyWnUzZFB2Y1JlOHZ2S3hOeTd2Zk9EMDJNQ2VXN2IxN3h5UGUxMWUzM3NISjV3T3E4OStuZGUveFByVi9nTG8rUVhZRGJ6c0h5Qi9wL282Z0tZN2dhWXpRTk1jbzJrZWFjcFRRZ2JxU1dneXNkQmlXSXVzVzYyMWRseDZYVnVJK3p6NjJ1MUEwK04xRDZtRHhnNWU4cm5hSSt1czYvVGUzWXZ6NnRUb0NIOHhtOHZSaVcxaTVvUzVEcTBIc3dqci9abndYYmpMWFNSSHRwTjV4djhUVTVORGd5WlpZdGNlR0VjQzY0Z3VtMWc0VlJFeHN3MXVKWEZkNi9zZ3d2Rk1aL0x3SjQxdkYyZHlvQ1ZCdEo0M3B1RGZUU21hZFF3elZqN3krb1dGTnh3cGw0KzhZV0hoOVVmS3dqMzl1MjZjbXJ4aDU4REF6aHNtcDI3YzFWOGRDZlZQcDdQemdaUnJKRGk4ZmZ0d2FOQ2JERzdQcHFmN1EvVFl5bjBueDhaT1hGaFp1WEJpYk96a2ZTc3p0KzBmSHQ1LzI0eitNenMzSEltRzgxNy82dGpZQ3R3SW9XaGthQTVqemVOMGpINVMrRExMZiswRFMrOUdSbzNUZVNwYjZFb0hac01MTXJiZ3B2aUtNWXg3MnFuWllzS01Damd4RmhrT0gzT08yNWh6M01xYzR3UDk4YmpIVGNud1lQL293R2k4TDk3WFcrd3BwQkw4UFZrMkMzRlJWNmZodG04OExmVk84MHBaaTRDQmVaenlWT0JLWlIvK0lyK2pGSW1VZHVUaFp6UUtQK2NPSHB5Yk9YaFFYQWpISE4xOTZYd1MvblE1dXVsWWJIU3BwMmRwTktiL1RCNWZXRGgrZkdIK3hOSlRzVkIzUkZtYm4vL0F0S09ycXh1d0hxQWZGdll5L2NTRm5YMUFEeEpNQW5BRDlnS1FoUHZSZ3Bja2NnQi9FbFpKUkNUMHdtTXhRTGRaamhZcHZ1REdnZXFSRCt4T3VQdFQ1UlNkTGUvZFd5NElKMC9TZlBXSDN6M1djMVI0NmhPZnFINy9PODkrNVIrb0wvc2k2dXk5d0lzZkFGNHNZU2UwZkU1UUxQWU9BYU5QVnFyWU1LbFNQaXRoZXpiMElKd2xGb3NXYnRWVHFTUGlHcjVpcExjbjdmQTZuSm1rdzlVQnVvZ0xMdmlTa21xNE1rQXp5V3BGT0tVcHNjYUlTa0pKeVBLemxIN1A4ZGZ1Mi9hTm5rZ09GMSs3L2FZUCtFNGRnYXVBSGpuZE1icHlhbXpISGIzbDVOSEt2dHZkMU82c1hvUVBqbG5kMXRMUm04dEQrY21aZDcyMkJQK3llYTNERTZkMzVLYW5Dc01qTngwZHRucmhyUFZ0ZklMK1V2Z0ZTWkVpclBFdU5kU1hDUVY5WG90a2d2L2hMcFFveTdSM2diUmY1dUhaS1BOZ3lmanIrN1Vlc09mMEJCMjNTWHVIckRHQVlMSTU5b21DYlZyWHVrVkp3bTZXUnp6UW44dkN4S21ZSTRaNXhMNnkxc216ck9sTW9LbDVHUmx5SGsxWDhvaStNdGVQY2g2bU1WMGN1NzQzWFRqUVcxcGV1dUh3NFBEeFFpYTVraXZ0bnIvbDBFcDRZbUhvL2FHSnBZSGxrNlo4YWpTV01mMmkwN2R6Ni9KeDA2NDlVaUV4QWxmdzk3cjhxMU9yWitTVDlCL04zeEsyRG1TSFgyWDV2a2tkeWcxb2Zzc0g2VDhCd2xHU3dUb0pHOXgvcVdRdzRIRTZGSUZHc0Y1QzVJcUg3aWZIUW1aMGxNZVl5eUpLb2o1SEdOczVTV1hlcnIxdVJRNHRaT3dSWVRFT1dhYm12dFh4ZUh4c3JXOTQ4RUJpd0tjbVUxTyt2dmhWQTArdFRVeXMzWDZMWEp3NU1EUjAxVXhSdnVWbU1aY29CZUppOWExQ05OQ1h6SnR1cHRkdnY4Wk9iN0tmNFRwTng4WTNoY1BDWDVKZTFGNjlIa1J1cFpCUG0wU0pMQUtuU3RUd1QzUHRsUVhMUTh5ZXl6S2xCWjJreUpCZzRkUVkwZWVEWTROMm5NL0xVTTg5VzVyeGpnYm1pczR1Mlh2bXNNVjcvYzFYM2VTZTZWeWRXSnR6ZEh6aE13N0Y3dnpjc09xdEpLL2VFYkpHZTlOOUE2YU9nY1RyeDh2My90YjZmdGYwN1BVbkY4YlA1U1pjZVdzZ245cFM2T2E0NHp1ajRaejc4TjNiWnRZN1Q4SmdFM2FhQW4yZldFRzhFZk5aRTM4SFBOUDNmY0FhRHFjRC8zZDBvNnBmWVhvK2Yvc1U0S3g0dFBOKy9za24zL2JDb1c5L1ovOExEejlCbjN4eTljbXZyWTdRNjZvZnBvZXI3eDRSbGt2dmZ6LzNNYUpUN1FMZ0VBS1p1Nmp1NkxRSXRNTXFFQnZZR2J5elNoZDdOODF4Zk5NMldDYmRkc0ZtODloZ3kyUFJTQmo3alBBaVJYZk5BSEdnQVlJbm0zMlZGUFlGbU9GWHFwSlNYUERCdHVXVHR3M2Y4ZER5elBLbjRldkVxNGR2ZjVEOS9maW5oei85elMyUGJQa20vT0UvcU9jUkxUN3ljOWpuWi9qZHdLSStSaU0vTFJTS1NRd282dXRGdTl6d3NyMVdzVTZYSnM0czVQT0xWMCt3bnd0bkpnN2ZjT09oUXpmZWFDMGZ2N0J6NTRYalpmM250Zy9lZi84SDhZdS9yNHY4STlQTEUycFVNb21pN2xCMTF4eXFxSmJyZmQyVmN1VWZGMjUrU0hqcTRweHc0L0RNbFA3T3I1OEIzd1l4WG9RdmNTYTFsMzVwQm52alM3K0NKT2pQNUxTWGZqVUdORmhtbENKbVBNUFVQNVRlTnoyMHY5UXplc3Zrc2RkWi9ZWDRqK2k1TWgwZTNaRWYyWkhySHg0ZU9ndTYzc0JvQ3VRbXRtb2phYUJySjhqOFh1VEJXRlFRVFQzQWlCWXp0cFpjMFFLWVovVTY5WEI5ZzlGTU9wSE9wUEVrNlMrTXJvdGdsa3ZEclRFWE1QK0V6c3kyUStXRjF3OE85aDdkdW5KcS84emVYZVB6QjlYUi9iMkRBM2ZNRE83Wm1sell1dVBBWjN1WFJxUERRd085dVoxVDR5dFRPOFlxcTduK3dhR1JTR20rVURuZzZEcktlVGNIM3haaEg2ekVqbS9xczhQZFpHSFdESng2a2QxUzEycmRnYlErZGgwMjdHVEhMZlpna1RyNFdRRlRnaVljOVBtVEorZXI5OU5YVjc5RHM4SlQxYW5wVDM5Nm5INnhPa1hQSTUweVFDY3p6QlhGYUpSRUpTSHFkQkJXQVFDSVNIQTluOU1EMFc2ajVTdGNpRUNoRkg4dm9BdmRqNHEyWFUwQlg2RFM5bTc2Y1BVSlczNnBjTTNkdjNIRDl0Y005ZlVmSGw4NWNXSWx2MUpBTzI3Nkp5N25iVWZQdm5Gd1lLaVlPN3EwL1NxWFI0OGJDbVBDNTBrY2RuQkIzVzRIMDdZVFBVRnVBUmdUTmxDaEpnbno4V29wUDlpYVZ1WnZSa2ttV09GVGI3TFg3M1YydDM5bnNIWXoxN29DaUN3WmoyTk9sK0hjRlByMnZIcStlQ0Naam0xUG5yOWJ5TjB3WHJwcUtwV2VQckJsOUpxTTdmcGQ4OGRQbW9mV1g3ZDQxVnV2cmdTOFkwNzNSOTQrUEpiWXNtdGdhUDlFaXQ1WEdiejZ6bU03ZGh6bThod1RNTHJaMmNxb1NZazIrSDRhM3puSXJkNFNUZUFMOEs2aFI2cUg2VXZWM3hQdVVzY3Uzc1YxNnkyd1o3M0EyekdRY2hXc0x2U2I0VDdHTjJyb1cyWklFVFBWWDkwSm5OM1htNGhUVE9PdTlGVnltWGd4VVhSMDRUdklMUVpwUm8ydVNqcGpNOHJVU1JaWHZaUXBqUjZlelJ4ZG1GeE5idDB6Z04yM1ZpY1hqbVJtam95cTZ3ZTNxUWZYcDVmUG5sMkdMMnUwdkZpY3Z0cmhPRmpKelE2R3c0T3p1Y3BCaCtPMFdsd2FpZEwzTEk2T0x1Slg5WGYyVFU3czNUc3h1WStmZ3hMd3dIQ05CMkR2VFJLV09Ob3BIbUxzdnlZS0p2R2NzZk5obzBjS2UzdElleDZnZFRZajU5Ukt6YUIwc1ZRdmJYWHhLK01CNGZPYk1rSDFyaG9UZ0EwWW9ldDBSdmdMc0FIZkFGdC9yRjdlajlYSiszSFNHdVczNlAyOVBmRGNBOEpUQU9OdUJnTWtOYlprMUNYMUNFcnFNbmJ2aEJHS1U3VG9mVnBkY05qc2JPNTcySE5ZZ3d4S01CRWFwUE5ZVFRxWHNhYVRCbWpBbThsTEZwWi83Z2I4dzhMbkFNWWJHWXhKZFVzMEFwSTFCOXRoMXZhRTBtVWpQVVNUcm1PR2RCM1hwR3RLdHVnNXdWN0FhNHl0NTE0R0UrUmRKOGc3YXh0NU40TElsUVZBaTdmN0JISG5WQ3hhbmJVUGNBc3lPRzlpY0VEcXl5RE5ZaTRxbWlRbmE0YmRMTkJHRElFMnJnazBadzJ2TU1EckV6NEw4TzVqOElEL3dFNkdhVVVoNG1ndmc4WnFNbWdjcTY0RnFsZGRzNWN5QllTQTJjTHlMQnl3NWlqRDlRS0REUkpCYnBBSUkwd2lzS1hpTmpxY0pvdmUyeThLZUJYWUh0elBub1hUNzFMYW4vNnh1dE1QQ0dVendZQkF3V0lmekE3eWhJM09EdW9YL0JhRHR3SUF1NGV0K1FGOXpiQldrd1NHSjNZNmFIdm14b3d6TjA0M1hUTlFQckx4YXpwRFQ3UGNyenErNzYzait6NnkxcEx6WmE1NzdWbFR2dGZIdCszZXZXM2JuajNiZXN2bDNtSzVMRjI5YTlmVnAzZnZQdDIvTURXMXVEZzF0WUJ5RjIrVEIyQXRMVHBOSGs5S29hYlRtQTJkNW9IUzlCN21ZTXdIKzFKNlgyODc0TzdmUktmcHJaMmFBdE5wL01UdkJaM0dqRHBOcFVXbmtSWFFHVU52Q1hyeU1mLy82KzFxWTl1Nnl2QTU1L3AreFhZUzIvSEh0YS90K1B2YWp1Tm1YdUxaVGt3KzJvVzI2Y2VTbHJhRE5XMXAxM1dBMWlJS1ZCT29xN1NJaVIrbHloQVNVamJCcUZva29tNmR1bCtWMERvVm1FQ2RoRUJGNnVnZi92QURhZnRCRVdLYncvdWVlKzA0cnR1Q2tJZ1VPNDdQUGZjOUgrOTdudnVlNTd4dlhnK0g2L0hSR1QzeGxTdnBjMXJTcXlYY1drTFRxL25JcHNHalErYmFNUUI5cDlPanhFQ05DK3VnY1dtKzBZTWpJblhUdUtHV3hoVXNqWXRMaW42ZlgvdCtPR001czZtK3ZacWExaVBCeDdUazhGQXFwa2R6UmtRYjBxS2hxZmpqV3pMeGRQRndvZUwzcFFmY2c4RmcxSWdIQTFIM1FOS3ZqZVgxdkNyamxqanhnZUJQUUw4L0FzTVkySFhaRGd5akFJWnA0djNSc2d5NHNEZVhLOTM4NVN2bjZjRVBjL3YzWi8vODRVWHNGei8wU3hEdUVVRnRON0VMQVcxM2RkVjJvNlh0aFJaOGdUNHBseEcvUTl0OVhlR0xvZHhldGZYSDNkVW50NDhuYWhGTkwvcFR4YUcwSnpXdytsYnVoQ3pUV3JFMDZmWVlibGMyR2swcnNzbHZBTGtLOUFoTWd5VHFrRXJSeHlZd3ZiKzczUmhhdHhzd1hFR05aOWJtZkNwK2FEdEFBMHE3R2pTZFc4M3h5clRobGl0VDg4L00rZk5lcnp2ZE56cnVMa2RMTTU4ZjE0WmRjaWsxbUN1SWk5djNQbWUzNTFYNzNKUlBxdzJQVEYvemVmTWxJeEpPODNubWdwY0kxNVg3TUlyQkxWSzJEYU1vZ0ZFOEFESzlRdVVYZjZET245T1JRcWJ4UHNjbkVXaC9GdWFybnlSSUVTMlVXK3B1b1liYUxCU2ZxVnFBa253MldVd1ZvK0ZBUWtzNHdWeFF2OXBxL2diU3RxL1RJclFuZ3Y5WmRTNFgxeE5iU3FYWlpEaWVuNnVFczlsdzFEQ2lpV0l4a1N4dUVpdjVhRkZWODdveE5tYkFyRldMMFh6bGc4RkFJQllMQkFZdkpvT2haREtFQjJOaFBEVm9UMjU5UEdFY2JXSVBQazA4d0NZT3RXeGlnVDV3UEQyZGVMbEpWdlMzWVpBZlBYUTg2WkdIRFNqY0ZsNyswc25kOERhNUc2VUVMUjJvMEZlcTdEcmlDbWpvY1NpYnBxZWhVSnArVDhHZGc3UDBhZmowTlBkWDdwSWxVUkNwRm1DU0RWQ1lKTXdKQ3U0azhMUUdJc0ZFczg4VGlURnBINUVrdHFqSzhDZmI1WFF5NWt3NVFkL0NJZDhBNW82Qnh3M0YweVBIdVcvU3hEVFc4ODdHZTUrakdHTHpkWDd2ZnJ3M0FXVzNLVDRxOHNRV3ZlanR0bE9GMkloaU95dFJKb3JzbE5DREVtRlVPaFczaTIzN01OMlVlRWlHYThUZG9jbWhEZVhaMGtPTEg1aU1vUEJhd0FuTGtYZkE0OGJkMjFZREhNMEdJQzRDK1MreEd5RDV0MHo1bnpYbGZ3RmpaNXM3UC93SjFMRG16RGhJOFFSVkZYRk9RZXR0dG1XOGw4TGlSeDNrYkErVlZGVTZ4VU8yQ2lMWWlUYTZMY2g2QXIzRHFySVAzaFQxa0IzcVVYZGJoL2RxRytxUWx2NnJLaWFuaVN4aThxS3pIYldRLzd3U1BJdFNMTmFxeFVxeFVoN0RQQzl1VjhCOG9PNlRjN3pERUFldmZjSit3OTZGbnZxRzJWOG5zYisraTRpR0xKdmt6THdkODJzU2xaRVQxbm5LNTduUkVMazNBbTlwTyt6QVVDRmU5RmFXdXBTMjR2RnlOUnd3SS9malpXYStBZHpJbU16a2M5RklYNi9BUm9xNTBmeW95VEVNNjZHZ0dTYkhKTWcwYzRLQ3pMYkJqVEtUakNrenlzN3V3bit2bUxLUDlGSFdhMHBqcDdLVGRrcnZjUURhQVBuZFBmMlN6V3BCcGVzMVhkcGdYaXpoeFlMVmp2TE1kSG1zMlphdHM5TTdablpNMU1hbXlsTVBhOWNBMzZtaFpJWmNvTGRZMmN3ekQzYU1DT2gvRjAxZm5jVk5FUWgzdzd2NnVWTWtzYjRCVHpQamx5K1BYN3AwNFozNjFhdDF2b2JNMEZsNkMzQ3RnTnlXQis5M1N2NDhQMXR4cTNHYXZseXZtODk3TTJ0cklNdFdrS1VQTTNpMHkwR0lMSkRqQ3BWbGFSR3o1a283SFE1SG42UFBiUXFHZVZQYUJmTmczWlp3bHhxblY5K3FyNjdXRzNjbnpGaU4rOGxQNk85WUFlNGp2ZDFqUSs0UTUxc2cyVUxPZkNlMXZKeGVYczY4K2tQajFaOGFLeXZabFJWajViWHNheURERFBrMnlQY0ZMbDhJWTJJaVBSTGtnMW5IWkdyeVVrUXdJQWM0SndXV050SDJsS3ZmQWNyazkvYUhYQ0VVdU5kcElsdDg1bTQveVNERFN0cE9kNmFxUlNLK1E3OS9zOGtuL2x1VGszcXhYditnalo4SzgzT0cvQjM2L1k4d004K1RWUkRyUE5sTmRtMS9VOE1vWmkwNmM0dUowV1RkdHJKbDRERFoxb2NKdWM3ZE1uN2dmSGtSK21BSFlPS3ZtOVRlSEJnSHdYYXloNnFFcUtkYXZJN25aTE5TbVZlS1pCNnlDMCsxMlFUYnkxaFdYWHBvMFM3OER3a2p1N2E1WHkzWDY5ekNsNWEyL1BiZVF0VjZmL0ZNL2RqRW1UTVR4K3BuVU40SU9VNWZZdk1ZZ2ZsdEFKMlA1UXZNRDAzN1l1TTlPcEZxZkVLbDQvKzRWN3o1YXo0dkZxRHNPKzFsUGFLWVNhWE8wSW5HZXlrcU52N0Y1cTNDak5Ub1pjNi8rdC9Pc25nZThHenovdmo4UXEyNnNGQk5qWTJsMHVVeXZieDN2THF3cHpLK2QxUFZTSTJOcHJNVjNLTW5uMk5MYkJsUVZoa2pzWHRjZHRVbWtPQ0F3bXhNZ1BVV0JnN3dpYnVIa1cwNmNpQUkxMi9NeGdhTDBBR2JGWGlhNFRacnNaQXNwOHF4YUVGRTZuM0dPbmdLU21HZVZiWHlza21vSU5ZUnBsWkdOblAzZFRIempCWU9CdzhhQjJQenc4UHpzWU9aeFdBa3JGbWY5OFRld094cVZwYTFzRDZ5ZVJLKzJETTh2QkJiekM2R0lwSFFvckVZV3lqeXp3ZERrV2hJNGJGenJIQS8yZG5SQ0xRWHVhWFhPSjZ4Y25BMC9XZXR4eSt0TXdkSHdsWENYRVhYTnNNUGpkS1ZUNzlKVnhwZmhwR3F3Y1dmMGlxTXRYOXlBSzBQak5OeHdqbTJZRTh3OTZnbjVnSjRXNlB2VGpkZW90WEdyLzVwY2hSTnJpam5TWkpIY0JSbjEwcjBZM29QOE0yNVNidERoaW5sNXNsT3Q3L3BSM0lXaG9UZEVIY09MYnhtYTI3bDY4M3YyK1BOaFp0bHJLL1pZdGV2RDVnOExpL3hZbDZwQlBLNFBLMXdnQzRyUkdER20zRDlZRzZ5TU92YnRpMjhheVJSRDJ5bDl4cS9uOTZaVGRHVERYczFIdmU0L3dxd3BvUC8zanhEdUpFRHoyZnpJM2p3OTUwKzVGMWx3c0QvQzIrZVlJZ3NRaitHYXhYTW5HSmxNNUhKTnJSQXlEcFNpTUlrWDc3a2tqTWVqNXh4L2VtTlRhRHlGOW5oMjJsYWI5eEkzZm5zeDJaL2lHdTNvSjdySGZWczdhaUh1c3ArUVNqN1hUUnNWWFQ5czlkdnB4czNhRDExaHoyN0FhTjNuQ3VRTmlCMHZtNlN0UmVFdThJT1hGdEpIak5SOURvRmlrRUprU1crclMwbERSalpKY0lFZ2UwalZvb3BKandWR3pSOXZsb3FLMGxhWGxTWjJISk4rTmRkRTVMa0w2WEh5bktUUG9IZThJOGFMdm9Sdko0Y3paN1l1ZVZyM2lQMjBWZ0VPc2hJQklSajFPWGJqdzlYZWpaN2daZHk5U1JydVltRkp5dXBjRHpzY3dTZGtWRDFjVDNXOTlXY3J1ZndGeVZkLzVHdnNxTnN5NkhOSS84R0U0ZERYQUFCQUFBQUFRREVEYVJiQ1Y4UFBQVUFEd1BvQUFBQUFOalE4N1VBQUFBQTJORlduLy9HL3U0RUlBUHVBQUFBQmdBQ0FBQUFBQUFBZU5wallHUmdZUDcxN3p3REE0dk4vMlAvRDdNb01BQkZrQUhqTWdDdGJBZGZBQUFBZU5xTmxIOW96SEVZeDkvUDg1M3ljOEtObHAyZloyNW5SOHh4dHgrVXRSMDdReWtiR2t2Q0xERi8rTU9QcEVSTmlRai9LQkYvcWltRjhvOTBKcW1OdFdGcisyTWt6UjlTeW9uTysvUFozZlhkRWZ2amRjL24rZng2bnVmOWZMNm5pbko4QXR6b1pZelQ2OWlxM1Fqckc5cG1zZ3RibmRuMGUxR1BuNmpUZWt3MWM3cVQ4dzIwZzdRQlJQUThiUkh0V2M0ZFJJRTJrWGJFekozT0tRUzRQa0hQWUtJMllJR040OEs1T3RMUFlQTEl4dVQxSGZrMnQzOHhtTExjYS9KM28wUE1aYmllV3Z4TURwQVA1Q3Y5OWJTOXppYlUwU2JvajZmdGN0VzhVWGNNMTI1cFFhNk40OEpvNFNiSHg1aFpjMVl2bzFNYW8xYzJUVmxRWDZ2bktEQjZ1N0c2dXpFOVNKT0xwUnBGVEg0aHBOVWtpSkFjWmp3ejlpT0dBWlJoSVBsWlB0bHh6S2xsRE01ckZkZDV6dXlUUnA1L2lnSTVpamxjV3l2Zk1Ga2YwZitJU2ZJVmsrVUZpbXdjRjg0UkxNdWVNNWc4c3VGYkNPdDZoRXg4azR2SjhaK1kvSXpka0tySlVKV3lKMUdqaXpGTi9ja3UzcmVhOTNXU0h2SWU3Mnl0TCtXQnRVUGtCNG1iZFZOL1NvUFZzaFRiYUgwU3dUYko1enYxcHpUeHU3Ung0VHdaNmFleHVqVWlRQlphL2JLaG5tNnMzdFIzVkZCL043WVBidGlURE5jd1Z6cFl6MVg0TW5yOWozejQveURHV0licm1LY1RjSTYwa1FPa25wd2llOFdMQnAyTjB4eGZVUThPbVhWNWpYWWtVTXp4WFhJTGZZaVFtZGIydzZPWHJHOG9WZkJ1OEMzMElXaDhPWWFnSEVjcDRwZ3ArM2ltbTdVZUp4ZFJURmJ3R3kzV1ExZ2hyNUlkMG9ORk1oOHRzZ1ZSU1FCT0YvLzM0dVFFbVVYNlVDN1BVS0dGNUQ0cW5KdW8rTnNjNzQyUkVtbENGU21SVnZhd0Zjc2xqbFZ5ano3Uk1LcTFsYmFBNTB5dm55ZVR6SzFhZG5NK3lmOEVoM2dSbGkvOEw3aUJKZnFXZVJZaXFHT3A3VDUrb3hkSUd4Yng3VWVraE4rUGo5U3dQL3V4VUV2NTNUYnozR0o0ZFE4MWFXYk1IZkRpTnZKWTN6UytTNC9VWUxxRU1FT3FxVVVBVXlTS1dSem4yMzEzdU0rWDJyY3V0Uzg2Y3ArdTRYczdnVHpkVGg2eUI0UHc1cFF6M2xSVVpwalB2aHFiUnp5b2xFNmU3Y1JtYWxPbWoxbGJJVnAwSmNya09UV0lJSnJ1V2FadkNZd3htRmhVSDA2LytmME41TVZFc0FBQUFBQUFHZ0FhQUJvQUdnQWFBRW9BbmdEcUFTZ0JWZ0dBQWRRQ0FBSWFBa2dDZEFLU0Fyd0M1QU11QTJnRHlBUU1CRjRFZ0FTc0JOQUUvQVVvQlZBRmZnV29CZGdHQ0FZNkJuNEdyQWJZQjBJSGtnZklCL1lJS2dpa0NOZ0pCZ2s0Q1lZSnNnbmtDaGdLVEFxQUNxNEszQXNLQzB3THVnd0lERG9NYkF5V0RNUU5CZzAyRFZnTmZnMm1EYzROOEE0VURrb09iQTY4RHVvUEZBODZEMTRQZ2cra0Q4b1AraEFjRUVRUVpoQ1NFTFlRNEJFS0VUWVJtQkcrRWVJU0NCSzRFdVlURmhOTUUzd1RwQlBTRkpvVXlCVHVGUjRWU2hXV0Zib1Y5aFlZRmtBV2FCYVNGcllXMkJiOEYyQVhwQmZRRi9RWUlCaElHSElZbUJqRUdQSVpHaGxHR1hnWnBob2lHb1lhMEJzMEc0UWIraHg4SExRYzZCMDBIV0FkZGgzYUhpSWVaQjdPSHpZZmlCL1lJQllnWGlDQ0lLNGcyQ0VRSVQ0aG1DSHlJbElpc2lPYUkvWWtUaVVJSld3bDBpWUFKa3dtMmljT0p6NG5pQ2dBS0Jvb1NDaDRLS3dvL2lrMEtXb3BuQ25PS2Y0cVlpcndLMjRyeWl3cUxMd3RGaTJJTGM0dUlDNUNMbWd1a2k2OEx0d3ZBaTg4TDE0dnpDLzZNQ1l3VGpCMk1Kd3d1RERTTVBJeEdERmFNYm94K0RKSU1uQXluRExNTXZvemRqT2dNOG96OGpTQ05MWTFCRFZ3TmJnMTREWWtOcDQyekRid056dzNoamZ3T0JvNGhEakdPUW81VkRtZU9lUTZLRHBvT3ZRN1FqdVNPN1k3NGp3S1BEUThYRHlLUExvODVEMFFQVm85aUQ0VVBsSStuRDhTUDNnLzNFQktRTFpCSGtHQVFrWkN1RU1zUTlSRUdFUmVSUkpGVWtYVVJqWkd0a2JVUnU1SEZFZFlSM3BIcmtmWVNCaElYRWlDU0toSXZraldTVEJKYUVtTVNhSkp4a25vU2hKS1JrcWFTdlpMZGt1TVM2Qkx2a3ZZUytwTUFrd2NURUJNWWt5Q1RLWk0xa3p5VFFwTkpFMUtUVXBOU2sxS1RVcE5TazFrVFg1Tm1FMnlUY3hONWszOFRoSk9LRTQrVGx4T2VrNmNUcjVQS0UrU1Q4aFFBbEJPVU5CUkhGRkVVWkJSc0ZITVVlNVNsbE1PVTVSVUdGUlVWTVJWVWxXdVZneFdUbGFpVnVoWENsZE9WNnhYNGxndVdKWll2Rmt3V1poWnVsbldXZmhhSWxwR1dtNWFuRnE2V3VoYkZsdFNXM1JidEZ3T1hFQmNqRnpvWFF4ZGRGM1FYZVplSkY2RVh4eGZkbC9pWUFwZ0tHQmNZSGhneG1ENllWSmhhR0YrWWNCaU9HSmVZbnBpa0dMMll4QmpLR004WTFwamZtT2lZN2hqdUdRZVpDa0FBUUFBQWFjQVhBQUVBR2NBQ1FBQ0FDZ0FWQUNOQUFBQWpBNFZBQVVBQW5qYTdaTExidE5BRklhUGt6U2x0RlFJQ1lHb1FHY0JFbGNuYlJHb3phcXFWSUdhS3IxRVNDeWRaT0tZT3JGbFQwajdCSWdWYkhnQW5nQUViOENXQjJEUFM3RGxuL0VKVGRKeVd5Q0JSQ3g3dmptWGY4NlpFeUs2NHZUSW9lejNHRy9HRHMxaGwzR09wa2tKNStreWhjSUZ4RHdYbnFJRmVpVmNwSFAwVm5nYUtoK0VUOUZaWjBGNEJueEwrRFM5ZENyQ3MzVEIrU2c4UitlZHo4Sm5FUE5GZUo0dTVaNmhFcWN3ZzkyNzNHdGhoeTdtOTRSek5KL2ZGODdUYXY1UXVJQ1k5OEpUZEMvL1ViaElWd3VPOERTOUsxd1RQa1ZjK0NROEEvNGlmTnJocVF2Q3MrUVc3d3ZQMGMyaUVqN2pjUEdGOER6ZG5YNnpIc1dIU2VCM05DK1ZGMWU0M2xHOHExcjh3Tk84blVSUFZGUHpXbDkzb2lUbDZ4MnQ0M1MxVlBJRDNlazMzR2JVTFNFV29iVjJPMmdHWGlqYmphaW5id3hWNnVwQTd5cS9IM3JKb2xzdUwxZTIxamVybFN6UStPNkljelQra1VyU0lPcHhsc0RqVXBPSmY2eURiZFhUbnA5NFhTNnhLWHB5WCs4RUtadEkzb3ZhZXVBbGltRUlnNmJxcFNpZzMydXBoRFhLMlh0WTVWcXNlbGx3TlF1NHpVZGRMcnBzeFNUWHlIaFB2U0QwR3FIaUFXcGxqemZXZHRqVHEyeGFRQWRwTXdsaW5icHBFTHBSNHBkcUcxWHhEQVlEdDl2Y0QvVmhyRXlIWW82SDFkdXUvOUxhVC9EUU9rVVUweUVsRkpCUEhkTEV0RVJsV3FRVlVCMFdoWFVYM3hiV0IrVFppRzNFUi9RRTFxYmRyMUVmYXdlMmhGTHNyMXNsRGVXVVZxbUV4NGUraWVoVGcxeGtSZFNGTmRQTlZHdlV4aFBBRjJBZlRuZzNrTkhEZXVOWUxYWHNEMERHN2tNL2hEMUIvUzY2S05NeVZXZ0xYVzVTRlRTcU9NeTdNNUg1UGYxSFdFMTNnYTJFeDA3Z0gxYjFzeFAvdlJsc3cycklnMmFDYnhmbmxmQU9iL3BuZnROVFlLc2Nhakx0Z2RxZ2diMFQwM0VXRWRwNmpGNHFOOUFIdCt3MDJQYWpiUFpENkRJNmlHM3NxSEoxVE9FMkxDZk4wcnc4VXRuNHVjTnFQSHFLTjdDVGErQnJQQU81VitNMTU2N1JqbVdOZStkdlU4aG1rRUxUekRtR0xjV0pxZFZ5N2RSOCtHdklyMDdrRE96ajRoYWJ0STlvamYrSzZYSTR3L0hvK05qZEg4MzYvNzMvenIzL1VzNVhiWC9weUFCNDJtMVNDWFFUVlJTOXQ0UUpKQVVLS0lJYnlPcEdiWkkyVGQyZ1N3cUYwa3BMS0NDaTA4azBHWnJPbE1ta3BiaUFBZ3FDb3FLNGdpRHVDd0x1b09DK3I4ZDkzL1c0N3g3MUhKZGs1cHNFY2M2WmMvLzcvNy83M3Z2M29nRDI5M2NJVWZ6UHh4dlNmd0Y3b1JkZEdJMHhHSXR4T0JTSDRYQWNnU014SHNVNENpWHd3WThBU2xHR0lNb1JRZ1dPeGpFNEZzZmhLZmJHRTJqRkJiaU5FdDFRc0FWLzRtOUUyWWQ5NmFFWEtndlpEMC9pYWZiSE14ekFJZzdFRi9pTmd6aVkrM0JmRHNHejNBL1A0WG44Z1JjNGxNTzRQdy9nZ1R5SUIzTTRSL0FRZk1TUkhNWFJhTU9MSElPWEVNTld2TXl4SEljTGNUc1A1V0U4bkVmZ0V4N0o4U3ptVVN5aGozNThnMWNZd0t1STR6V1dzb3hCbGpQRUNoN05ZM2dzdnVKeDJNbmpPUUdmY1NKcUVFWXRKbUV5NmpBRlUxR1BhV2hBSTA3QWREU2hHVE1Rd1V5MFlCWm1ZdzVPeEZ5Y0JJMlZhRWNDR3pHZlZheUdqZzc4UmNCZ0RjT3NKZkU2SjZHVGsxa0hFMGxPd1FKT1pUMm40VXY4emdZMjhnU3M1SFEyd1dJenV0RE5HVWd4d3BsczRTek81aHlleUxrOGlmTjRNajdtS1pUWmlvWG9vWUpUY1JxMllSR2pWTEVKcDdPTk1jYXA0VlBPWnpzVDdLQk9nNTM0Rm1kd0FaYmdUQ3lteVNRdHB0akZiaTVrRHhmaGE1NktIVHlOcCtOem5vSDEyTURGWE1JemVSYVhjaG1YODJ5ZXd4VmN5WE81aXF0NUhzL0hnM2dJZlZHTjgvQUczc1JiZUJ2djRIeThpL2Z4SWRmd0FyeUhEekFRQTNBUURzWXRjR0V6UnVJYTNJMTdjQ2Z1d3FONGpCZnlJdXpDYnR5RW16RUlFM0F5enVGYVhzeEx1STZYNGhFVVlUdnU0R1c4bkZmd1NsN0Y5ZkNpRU1kakl1YmhGUFREV1hnWVoyTUZLaUdqQ2g3MHhpaHV3Q3FjaTlXOEdtNHN3M0tzZzRUQjJBZjdZZ2oydzFBTXcvNDRBQWR5STM3QWovaUptM2dOTi9OYVhzZnJlUU52NUUyOG1iZndWdDdHTGJ5ZFczRS9mc1l2K0JWOThEajY0enVzeGZlNEZ5T3dCc054Q0paeUc3ZnpEdDdKdTNnMzcrRzl2STg3dUpQMzh3SHU0bTVYUTZTK3ZxQzZ5YTIzSmp0bFJaVXFXMDIxUzNWWGRzaUthZWp1U2lObTZHcTd0MXJSVENYVjBaWlFGM3FxbzRZbEs0cXFXMUtOSXFkdnBjRTBaRXNLMjdsUzJONzBoTFBYM0dHSHJWZFlqN25EZ25GU2p0R2QwclVTbjkvdm1aUk5jVTF1bFUzdjVOd2RxYzRtTDZpYjRxNFR2ZFU1VEZLZHBTV2lxbmZLZndrRFFhbGVWbEtXS3RYYkhZbmRLbGQ5dW96VTRCdzE1QjJWbGttTmRwVitqZkdVSHBQTlZFZENUbG51UnFlZzFPU2tOT1dsbEFXbFpudFhoR0Z2ODMvYThQdENyaG5wWWFRWmVXbEJ2emlybENKT3hjZ2VGU05peElnell1K0lxZWt4S1dJUEtyWFlCZnUyUkRYVlZKTmFVbXFKbVhLWDZtM0pWZmJPem51NTJmYXhOTWRPODh6SnFTYzdXc3VpbUN5VVVmSzBWbkszbzduKy9ZRnlTWFhFVmgyeDFaellxaEJiVFl1dENzcllYbUlIUExHYzJQR00yUEc4bGpXYjNLTmxyeFJvODkyYTZGTVR1bXVPN3ZQMzByMjhzRDFtcXFxZWtQV29wa2dKUjdaRXZnbXFYWW1NQ1hUblNNODNRVkF5SEVtTVBTUXhoQWxNSjhYTU4wRzVsTXczUWEwM3VaY0pLbHhXeGdSV3Zna0M0cXhLU2prVlUzdFVUSWw1VThJRUtkc0VLY2NFM1k0SnVyTW02SFpNMEoxbmdwNjhGKzF4VExESU1jR2k3TVAyVVF3enF1bHlvbzljbkZUaWhwSG9KOXQzc3BIZG1vZ0d5VGxLc1ZVay85dENOc011SmFMK3dsM1owQmxHaElWeVpxWnNvajJhaUhySGl1V0U1WWs1NWRQTEFYa215c1JGTWNYbzZKQ2RNVEliL1hPT3lvUmUrNm1iRTBhWDNPN05QSFNKdjZRazRBOFdaUWpOcExvZ1pWaHFRbTJ6QnVkdlJGc1RtYjJNTXVucmZvRUJnUlVDS3dWV09lZ3JHOVNwbXBvUnpkUk9QMGEwV0pFN1BmR2V6cmlxMjB0Vmo4ckp1TFBzK0hmcEZibVp0U1JiR1hDRlU2YmhjSmFYQ0N3VldDWXdLTEJjWUVpZzZDMGs4a0krZ1dLR2tKZ2hKUGhDZ2k4aytFS0NMeVQ0UWpaZmV0UlNnVUdCMVFKckhLd3FjMXhjVlNXdzJza1BpTG9CcDY2dndpZlFpZjArTzY4MlhGdHJZMjF0VFdHeFpiV2xqVy9FTmQzNkIrKzI5Y0VBQUFBQUFRQUIvLzhBRDNqYVkyQWdBRHlBMElIQmdXa1BBd1BUUmNZWERBei85WmwvL1R2UGRQei9WeUQvdy8vdi83VkJmQVlqSU5SbDBHV01ZMkFBOFJsVC92OUdGbWZhd3hnSDFuZUlNUkpFQXdETUtpT0xBQUFBZU5xdFYydGJHOGNWbnRVTmpBRURrckNiZGQxUnhxSXVPNUpKNnpqRVZoeXl5Nkk0U2xLQmNidnJOTzB1RXU3OWt2UkdyK245b3Z5WnM2Sjk2bnpMVDh0N1psWUtPT0ErZlo3eVFlZWRtWGZtWE9mTVFrSkxFZytqTUpheTkwUXM3dmFvOHVCUlJMZGN1aEVuaitYb1lVU0ZadnJSckpnVmc0RTZjQnNORWpHSlFHMlBoU09DeEcrUm8wa21qMXRVMEtxaEdpMHFhams4THRicXdnK29Hc2drOGJOQ0xmQ3paakdnUXJCL0pHbGVBUVRwa0VyOW8zR2hVTUF4MURpODJ1RFo4V0xkOGE5S1FPV1BxMDRWYTRwRVB6cU14NnRPd1Nnc2FTcDZWQThpMWtlclFaQVRYRG1VOUhHZlNtdVB4amVjaFNBY2hGUUpvd1lWbS9IZU94SEk3aWlTMU85amFndHMybVMwR2NjeXMyeFlkQU5UK1VqU0JxOXZNUFBqZmlRUmpWRXFhYTRmSlppUnZEYkg2RGFqMjRtYnhISHNJbG8wSHd4STdFVWtla3h1WU96MjZCcWphNzMweVpJWU1PTkpXUnpFOFRDTnlmSGlPUGNnbGtQNG8veTRSV1V0WVVHcG1jS25tYUFmMFl6eWFWYjV5QUMySkMycW1IQWpFbktZelJ6NGtoZlpYZGVhejc5VVRNSUJsZGNiV0F6a1NJNmdLOXNvTnhHaDNTanB1K2xlSEttNEVVdmFlaEJoemVXNDVLYTBhRWJUaGNBYmk0Sk44eXlHeWxjb0YrV25WRGg0VE00QWh0RE1lb3N1YU1uV0xzS3RramlRZkFKdEpURlRrbTFqN1p3ZVgxZ1VRZWl2TjZhRmMxR2ZMcVI1ZTRyandZUUFyaWN5SEttVWsycUNMVnhPQ0VrWFJrNnNSR3BWdW0xVkxKeXpuYTVqbDNBL2RlM2twa1Z0SERwZW1CZkZFRnBjMVlqWFVjU1hkRllvaERSTXQxdTBwRUdWa2k0RmIvQUJBTWdRTGZGb0Q2TWxrNjlsSExSa2dpSVJnd0UwMDNLUXlGRWlhUmxoYTlHSzd1MUhXV200SFYrbmhVTjExS0txN3UxR3ZRZDIwbTFndm1ybWF6b1RLOEhES0Z0WkNjaEpmVnIyK01xaHRQenNFdjhzNFllY1ZlU2kyT3hIR1ljUC92b2paQmhxbDlZYkN0c20yTFhydkFVM21XZGllTktGL1YzTW5rN1dPU25NaEtncXhDc2djVy9zT0k3SlZsMkxUQlRDL1loV2xDOURXa1Q1TFNpVUhFcXhocGtFTnZ6bnloVkhMSXVxOEgyZkkxR0RJVmpMYXJNZWZlaTV6eU51cTNDMjdyWG9zczRjbGxjUWVKYWYwMW1SNVhNNks3RjBkVlptZVZWbkZaYWYxOWtNeTJzNm0yWDVCWjFkWU9scE5Va0VWUktFWE1rMk9lL3l0V21SUHJHNE9sMTh6eTYyVGl5dVRSZmZ0NHRTQzdya25lY3crL3B2NnlzN2V0Sy9CdnlUc090NStNZFN3VCtXMStFZnl5YjhZN2tHLzFoK0VmNnh2QUgvV0g0Si9yRmNoMzhzMjFwMlRPWGUxRkI3SlpIb2ZrNFNtTnppTnJhNWVEYzAzZlRvSmk3bUM3Z1RYWGxPV2xXNnFiakRQNVBoc3ZkZm51UTZXNnlFWEhyMHducFdkdXBoaE83SVhuN2xSSGpPNDl6UzhrVmorWXM0elhMQ3orckUvVDNURnA0WHEvOFMvTGQ5VDIxbXQ1dzYrM29iOFlBRFo5dVBXNU51dHVnbDNiN2NhZEhtZjZPaXdnZWd2NHdVaWRXbWJNc3U5d2FFOXY1bzFGVmROSk1JTHlEYUw1Nm1UY2VwMXhEaE8yaGlxM1FadEJMNmF0UFFzbm5oMDhYQU94eTFsWlNkRWM2OGU1b20yL1k4cXVBMjVHeEpDVGVYcmQzb3VDVEwwajB1clpXZmkzMXV1WFBvM3Nyc1VEc0pWWUtuNzIzQ2JjOCtUNlVnR1NvcTQzWEZjaWxJWGVDRVc5N1RlMUtZaG9kQTdTREhDaHAyK09tYUM0d1duSGVHRW1XYmF3V1hHTWtvbytES256a1ZKN0lSVFRhaWlOKzhwWDZxQzRYUW1jUkNZcmE4bHNkQ2RSQ21WNlpMTkdmV2QxU1hsWElXNzAxRHlNN1lTSlBZajlxeWc1ZWRyYzhuSmR1VnA0SXFUWXp1bi95SXNVazhxOXJ6YkNrdStWZFBXQkpNMHBYd2w4N1RMazlTdklYKzBlWW83dERsSU9xN2VGeGxKMjVuRzA0TjkvYTFVNnQ3YnYvVXFuL20zbWZ0Q0RUZDhaNmxjRnZUWFc4RTI3akc0TlM1VkNTMFRSdllFUnFYdVQ3WGJPUlRmS241MW5VdVVJWHIwOGJOcytmdjZHd09qODVreS85WTB0My9WeFd6VDl6SE9ncXQ2a1M5Tk9MY3ppNGE4QjF2RXBYWE1icnJOVlFlbDl5YmFRanVJd1IxZSszeFdZSWJYbTNUYmR6eU44Nlo3K0U0cDFhbGw0RGYxUFF5eEZzY3hSRGhsanQ0Z1NmUmVsdHpRZE5iZ0YvVll5RjJBUG9BRG9OZFBYYk16QjZBbVhuQW5DN0FQbk1ZUEdRT2c2OHhoOEhYOVRGNllRQVVBVGtHeGZyWXNYT1BnT3pjTzh4ekdIMkRlUWE5eXp5RHZzazhnNzdGT2tPQWhIVXlTRmtuZ3dQV3lXREFuTmNCaHN4aGNNZ2NCbytadytEYnhxNXRvTzhZdXhoOTE5akY2SHZHTGtiZk4zWXgrb0d4aTlFUGpWMk1mbVRzWXZSanhMZ3pUZUJQeklpMkFOK3o4RFhBOXpub1p1Umo5Rk84dFRublp4WXk1K2VHNCtTY1gyRHpLOU5UZjJsR1pzZVJoYnpqVnhZeS9kYzRKeWY4eGtJbS9OWkNKdndPM0h2VDgzNXZSb2IrZ1lWTS80T0ZUUDhqZHVhRVAxbkloRDlieUlTL2dQdnE5THkvbXBHaC84MUNwdi9kUXFiL0F6dHp3ajh0Wk1MSVFpWjhxTWNYelNjdVZkeHhxVkFNOGQ4VDJtRHNlelI3U01Yci9hUEpZOTM2QlBXZ0Evb0FBSGphWS9EZXdYQWlLR0lqSTJOZjVBYkduUndNSEF6SkJSc1oySjIyTURESU16Tm9nWmpialZqVVdJUTRtTGtnUEFzbUhTWVpOakNQeTJrUHp3SE9BeXdIR0pnWnVJRjhYcWM5REE1Z0NPTHZCSklNTGh0VkdEc0NJelk0ZEVTQStDa3VHelZBL0IwY0RCQUJCcGRJNlkzcUlLRmRIQTBNakN3T0hja2hNQWtRMkc3Q29zRWl3c0hNcDdXRDhYL3JCcGJlalV3TUxwdFpVOWdZWEZ3QTU2VXUrUUFBQUFBQUFRQUFBQUI0MnRXVXdXN1VNQkNHNzMyS2tVOGdRZExsQkZYU3FpcUtRQ3phMGk3Y3AvRnNZdXJZWVR6WmROOGVwODYyV3dTb044UXR0c2FmdjM5c3B6aTc2eXhzaVlQeHJsU0w3RmdCdWRwcjQ1cFNmVjFYcjkrcXM5T2pvaU5CallLblJ3REY0TXlQZ1l3R28wdFYreTdyNmxzcnU1NnlLOUlmVU5aMEoxZlVEQlpaNWZjcnR1UzBaM0RZVWFrdXlRazJqQjNrOFBuaTAxTEJ3TFpVclVoL2t1ZmpPRDd5SW53bTFFemFTSmkrSDBaLzVMRzNjYjd5ZzlPOGV3Nyt1Y2ozRkV6amlKOHkrMzMxQk14bjRmekF1TkFVYWphOXhDYlAyMG5zRVZpY3VreE9wVW1BZFdzQ1ZONEpYUHVOak1nRWNjS2FtbHdnRFRFUE1VaExjUDF4Q2F1NGJ5cGVwb0pYOEMwZEpDeXlSWlpnODlvSmcxczBGbThzd1dpa0JZVHEvQXVnbk1BY0l5bUdMQmliZVc3eVZiVXM4c2t6NWZrbFE3RW5IM2JpTndqMTN3YWVTZW42K1g3SHBtbmxyMmt1OWxYdzVuanhMdm9ReEJjQjhVbkFKZnZ2VkF1Y0Q5SjZEdkJpY2doUm9vbHF3ODM5elVtdlo3WFptTnFnbllkVDNwZUhXazlVQ21IVTFDSGYvbnV4QTVVaWYveGgvQVJnVkcycSkgZm9ybWF0KCJ3b2ZmIik7IGZvbnQtd2VpZ2h0OiA0MDA7IGZvbnQtc3R5bGU6IG5vcm1hbDsgfQpAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICdSZWRIYXRUZXh0Jzsgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHUmdBQkFBQUFBSkdzQUJJQUFBQUJNQkFBQVFBQUFBQ1FGQUFBQVpnQUFBUmlBQUFBQUFBQUFBQkNRVk5GQUFBQmxBQUFBRG9BQUFBNml5V1VzVVJUU1VjQUFKQU1BQUFBQ0FBQUFBZ0FBQUFCUjFCUFV3QUFBZEFBQUEwREFBQWlLZzZkaGFSSFUxVkNBQUFPMUFBQUF1Y0FBQVlvY0FOdjhFOVRMeklBQUJHOEFBQUFVZ0FBQUdCbGM0RzBZMjFoY0FBQUVoQUFBQVB2QUFBRnRHOU0vVmRqZG5RZ0FBQ0lKQUFBQUU0QUFBQjRMVGYvbkdad1oyMEFBSWgwQUFBRzhnQUFEaFdlTmhQT1oyRnpjQUFBaUJ3QUFBQUlBQUFBQ0FBQUFCQm5iSGxtQUFBV0FBQUFZaUlBQU5LaUNCbTJRMmhsWVdRQUFIZ2tBQUFBTmdBQUFEWVV2NDdNYUdobFlRQUFlRndBQUFBaEFBQUFKQWYzQkpKb2JYUjRBQUI0Z0FBQUF5MEFBQWFhbFRWSThHeHZZMkVBQUh1d0FBQURVQUFBQTFDeGl1U0xiV0Y0Y0FBQWZ3QUFBQUFnQUFBQUlBTDdEekJ1WVcxbEFBQi9JQUFBQXpZQUFBbkdPRFZZR1hCdmMzUUFBSUpZQUFBRndRQUFDZ24wcHAvWWNISmxjQUFBajJnQUFBQ2lBQUFBdmVHMlhpTUFBUUFBQUFnQUFBQUVBQTRBQW1sa1pXOXliMjF1QUFKRVJreFVBQTVzWVhSdUFBNEFCZ0FBQUFBQUFRQUNBQWdBREFBQi8ySUFBUUFBQUFCNDJyV1pDM0NVMVJYSHowMTJGN0tRaEFDYkpRSGwvUTdoS1lJRVp6cFZaNnAyVktTMnRiWkliYWVPeENoWTI1bDJ4azZwQlRwTWxhS0NLRldxQXZKb3cwTVFRUmdxRHkxV29LQ3lFUElxYWhKaHU1TkFraWFtM3Y3dTNlL2I3Q1lMTExSK1ovN2ZkL2MrenJuMzNIUFBPZCszb2tURUx3L0tGa203NlpiYlowcFc4ZXlmbGtpK2VLZ1hyY1cwOXhQUDErNjllWUFNK2ZxTW1RT2tZTVlkM3h3Z2syYk91RzJBRkRsOWxQTk1jNTdwenRQalBMM2ltL1BqZVNVeXpONEw3SDJDdlUreDl4dnQvU1prR1htWHZodXV5QUYrNzBwUmZYdmF1ZWJLWkprcDgyU0piRS9ybXBhVnZpcDlUZnBHVDRubmVjOHJucjJlZjNvOVhyKzNoemZYTzhWN3E3ZFl1a2krcnBOK1lMbHVraFc2VGhYcXNDclM5V3E2UG1aYVFUOWFsdXN3clJVcXFBL1R1a2pOMGkvYnNmVzA3cGZsNHFlbGpKYWxqQ3VuOVdQSllHd0FqV1V6dHQ1eUR1cGFWU2crZXUxVzAzbk8waUZtMm9YeDNVQXZFQUI5a1RhUzV5Z3dHaFNBTVdBYUtBTFR3WTNnSHZCdDhCM3dYWEF2K0I2NEQzd2YvQURNQWsvcW8vSmJzQUFzQkl2QUVyQVVQQWVXTVl2bCtxQzhBTmJ3ZXkxNEhhd0Q2OEVHc0JHVWdrMWdNOWdDdG9JM3dEYXdIZXdBYjRHZFlCZDRHK3dHSjBBSW5BU25RQms0RGNwQkJhZ0VWYUFPZkE3T2duUDZxUEtCTHFBcnlBQiswQTEwQjVrZ0MyU0RBTWdGOSt2OWFqYnJWZWk2UVg0azgzVWJhNCt3OWdocmo4aENySHNSenlWZ0tYaFdmUEljZGN2Wm9SZDR2Z2hXTXVhUDRDWHdNbGdGL2dSZUFhK0MxOEJxc0lieGE4SHJZQjFZRHphQWphQVViQUtid1Jhd0Zid0J0b0h0WUFkNEMrd0V1OERiWURjNEFVTGdKRGdGeXNCcFVBNHFRQ1dvQXA4dzcwL0JaNkFHMUlJNjV2NDVPQXZPZ1Rid0gvQWwwTmdtSjFzcHdFbEJyeEgwR2tHdkVmUWFRYThSOUJwQnJ4SDBHa0d2RWZRYVVUMTBxOG9CUFVFdjBCc0VHSjlyYmIxY0RkY2IxQWd3R2hSS2hob0h4b01KWUNLWXFpK29hYUJJYjhQU3o0aFNSV2phM0FmSk9IWW14TTZFMkprUXV4SmlWMExzU3NqdXdocWVhOEhyWUIxWUR6YUFqYUFVYkFLYndSYXdGYndCdG9IdFlBZDRDK3dFdThEYllEYzRBVUxnSkRnRnlzQnBVQTRxUUNXbzBpRzBFMEk3SWJRVFFqc2h0Qk5DT3lHMEUwSTdJYlFUUWpzaFpwbXZEM0QyditUc05NZ0sxalVIblJUck5sV2ltOVZjYkhFZVB1UXhUbjRhZnNCSHFkWDZpNWNZMDhDWWo0eVZNdVlqK29ab2JaQ3V0TFRRVWtiTE1iVDJFTndhNGJZQlRrZm9VVU9QZkwxVEZzdDhlbTFuN0JGYXF4bGZRWTltZWpSais0dGxlTUxkakFuQnVad3hyWEN1WVZ3WXptSEdIYkJqUE5aamxTQnJybTZCVTR0MFZVSEp4ZytHYURuczlMOUFhN1ZwWlV5WTNRM3FLblk5bTNtV3Nyc0gxQnpKVk1YVWwraXRhcTUwTjZ1WHRNQW00NUZ6QitUZExsTmtQQkhndks3WFRhQk9oN2pYYW14WG45R3R0dGJVMTh2L2VPbW45SDJzMS8zVnFKZmloMFh2Z1hkSWY0cXNTdXJLOUdIcHI5K2hicS8raDM3ekNpV3MxaVhjbSt3YXdycFp6NWNNUElLSUY3OXRJbWkwVjQxMFIwOWlWcVEvRlQvNyt4VmNWOHRWTDlOUDZFcE9vMS9ZYVgxQjcwVkwrRmlycGJQY0szVUx1cXFTcWZvUXZjL29hcjN2Q2tWNDBFeXJMdFdmNlZJbllodTVyYmEyR2F0cm4wdXpneWFqUmRONkpXdlhPM1VEaU9mWGR0bVJLVXF3bGxPaFY3SDZEUW5qajZHaEN1eloxNUdqL3N6ZXo3RENtaXZRbGMvQlYzNmhxeFpkbzA4bG5VSEh2aGV1V2t6R1Z6RHpzL29sL1pGZWxsQlhBZXJJM0M2aVUxYmJpcys3Y2xrdCtwV09hNkN1Q3MrY1JHdTZNU1dlcGZweDF5KzF6MG52dzViZWgzTzVQdUpVNWVxdHR1VUlmdVo4MUpNUU82OXlIMUsyOU5TdUFMNmlFZzk3UkMvQWQvandhc2YwYnVxaTNuV3pxYU1VZnhicnFKUG9EckYzUWJ4Q0crZHBMMk5LVFV0U1RkVWJIeHFOQk1TaTNySGErR3RRWXUrNFh6NzhlK01sTExBN3ZjcmNQYkJ6emJBK210amplZzRibDRiSHJhSDk2bUk5VkV2TUpwSllGeFpaYmU5bCtpQTh3K3g2VnZzc25YVmM5TFJya3lsSGZVeU50ZS9LSkoyQytKZDNUTHlFcTkrWlNUVzdzUWVwUi9VZXU4WUtmVnlHbTdsYjMxb1d0eEkvMnEvUkVSUEJUR1RrVjBNbk84bXhGbGlpZCtuWkRvZFYrajd1MjFuUENiM2U3bERFdFV2YmJtSmRjM1MyK25FN28zcDlzMTVOYVgzU2RWWmE2U2ZwZFJDZTljd3dBNC9qVCtnVVhWdFRaOC9ONlAyT3RtcWpYaUNKQ0wrVEFaeDFadFdHaEZZYm1acklTdHo5Q0xQK3Bsak05c1VrR0V0cVpmUVpoNWMveVJxYW9qMmhzOWJidEZtdjZYZnR5YkczRE1tTDJUcDhYSnV4K2c4WTZ6TTFKdVlteldaSzlFa3JPNnJ4VXJKSm43V3JNaXMzWXYzU2NkNFJRMVliSnpsbC9waDFtYlAzTVJtanNmR1ZuYzZRYTYyUnVGK3RXTDY1dkowNjlyNnNoN3RJeE1PTzlscU5uTGRyYUNiNlpGaTU5UTdWT2Z0UVlNL2xXZXRMMnZmY2o1NGFuRmhmYlcyK3M0UUYrbGJlWGMwZTlhSi9qZDVzVHFoZXE5K2xkQkRhUTEySURIZ3FQclVObjd0UEw0NzYxdWhwWXN5SGVDOFRNWGkzaFZQbmkweUpHZnBpbHVDelBzRHY1SzFOUnVmc2hmRWFybDAxeHZrM003clJlalBmSlhNQXNmT3VTZXlGVmZtU3h1ZVc1T1YyNzVLb0svdkxUMDVuN0tTeDg5Z2ttdlZIYmNOb241eW1Jb0ZidVhQK3d1aTJ5cFdyejFtYlRNaCtzS20yanJtRTI0N2VXOTJjcjFPK2tSSFRpUEVsTmZwRDkvenI0MGd0VDFoRDg2WDE2dmdvYzFMaWM2R29WL3pBV2tmelJmT1dZVmNSS1hNdWVWSStRWm92OWF3MDVqRXVuc3Y0bkhqV2FrK1RINDJWa1hHY2lscTFFL0hhT0FkR2Ivdmk4dGFvdlZudmJlTmVHejMySnNqZUZ6dkZZZjJ1OVVFUmUwN21ZeS81MGgvMDRuZlVHNTlDYm92OTh1ZmE0ODNHbitnM3FYOC9aZzFoR2N5b3VMUGw5TzRmOVpiSVdVZS8zZVI3RnpwcXlZblFQc21NcXpPUjUzTXorNFRNSjk2YU16dGtjbUYzTnZFV2FkOExUNmVTeThaNGQ3SG5vclpkRmx4cXNOWEdaTzhnTnVicXFLWXZhUjJ0N3J0UUxDTUl4MGtJVzUvZmtsUUMyWWI5SHBxQ2hNU3pISXR6cmhXMEpaK256WkVDTmo0NE1Ta3hMdHBUMXRHUG1DKy9oNnduOGFjd3QycXJ3VEJ2MC9WV0QyNis1SXQ3czB0UGt1dS9wdC9qUkNlTm9rbjJOQkRuRzFLWlZVTmNWdUZMZ2IrMU9iUVluYi9mUnJ4eWV3cnJIUzFWSnA1NGM2NTRFL2pTdklkZkxETk90RUJqWi9iK2hZMUFxYjNaN0xGenFFdWg1eWxyYWJYUmMyVy96WnpubkVaWDcyM2Zod1JiOHR1b2U1ZzlyRy8vQnZOL2Z4UGN5N3E3cGZnZXQxR3k3UDhFUG16SDQwVHVSdXZCSW80V2F4UFhZTDU2MkVqejZ1VjN3Y1FzZE9JaGwvQTR1V0Q4UG5nZHp0NU91WVFQNzFaanM4WFV2bmYxaXVVZGZrdSt4SGpmSWZvN2tkVmFZWFowelpkWnhUNDhjcWIxeEUwOE01M1Q1dGk4eVpRNnpwTUkzMERVenlDM0RDUjYxNHRJS0tlZkwrWXhNdVBpY3F2cjhUcjZLQ2lFaE9wVStIZnkxTkVWMU1kL3kraTBoaFliMVZyYzNsZDlaYVY2K3E3Nnk4blZmazlSa212ZTBzbmQ4NldmRk10Q1dTeExaWVVLcWpGcXJDcFMwOVVkNmk1MXQ1cWxpbFdKbWt2czZJbTFMbURrSXRraDgyV25ISld0Y2x5bHlTSGxVMEZwVmNQVmFOV2QwUk5WanByQytEN3FGdlVOZFMxODdsQ0Q0SFdYR2d5L3U5VVE5UzFvS0p3ZlVNUFVROUJvWkR5bUN0UlQ2bWsxU1MySEpwdC9BOVV6OXB6MXdENXkrTjFUSmtONVdIeHZXd293cHdDckNFb2ZhajAyMitoci8xT0xVazZzbEEwUGx3S1dXeUpOQmdINFIybHlCOHFMUFkxa2w5eldnRU01c1pLWlU2NmRsMHQ5SEVxSFIyZktkNml2US8wc2paRkNHU25YeXlnME1KWmYxME1GWUl4dEthUnVuSXlYQ1R3bnlpUmFKc3AxdHMzUXFGaHBERHhjTWh6R1FxTTYwQmhIUnBURzIxRURIYnJlMGtDTGdVZ3BjR3JNNVVvb2RHaFVyRlRJM01iWitiazB3YUhDbUp4NG11VFFSSWV1c3hTOWt2VWZIU016Ris5bExIMHdkQTAwbUhKWExMNmJESEhJdmZyTEFJdE1rN1YxdUs1MUtQSDdrb3VoU2Q4cWpBME03ZEEyd25nRDNnRXplR2NZUmk0NzNOWmMrWlU0RjdGelNPUDhlaUhGL0x0Z1pkMmdkS1JsMGRJTFNyY3pTcmUyMk5kYW9zZGEzalhXN2daWXEvTmFxeHRvTmVXelVycWdreEh3SE1rZXAxdTlqNVJwY2lQbDI2QTB1VWRtVVg1QWZzTG9CMlVPUEIrV256SDY1L0lMdVAxU25vRFByK1RYOEprUDVjcHZvS0E4aVEvSng5c3NSTnVMb0h6NW5meWUrcWZrYVdhMEJNcVhQMEI1ZUtPbGxKK0I4dVJacUxzOEIyWEtNaWhMbGtQRDVYa29XMVpBSStRRnFJZThDT1hJU2xtTnhEV3lFUTUvbHIvQW9WUzJVMzRUeXNOLzdhYThSLzZLM0hka1A3bzVBQVhsSUJTUWQ2R2d2QWNGNUc5UVVBN0orNVQvRGdYbEF5aFBEc3N4eXNmbFk4b25wQXB1MVhLRzhpZFN5enpyNUJ6ekRFTkIrWmMwTTl0L3l4Zk1zMDIwOUZDQ3o4ekJaMlpMdnVxaGVrc2ZGVkM1a29ubkRjb2d2T2dJeVZBajFTanBpVjhjVGJsQUZjZ29WYWdLWmFnYXB5YUtIKzg2UlhxcnFXcXFkRlUzcUJzb1QxUFRLQmVwSWhtRzU1MHVRNHp2bFY3cVRuV245Rk16MUF6dU05Vk03dmhlNllidm5TV0QxZjFxdHFTckg2b0hxTUVQUzM4MVI4MlJNWGpqWWlsVUQ2dUg1VnA4ZjRtTVU0K29SeWcvcWg2bHoxeWl3V2cxVDgyVHNYanR4OFQ2YldUaHQ2WGJmd0V6TEVxTkFIamFsZFJKVEJOaEZBZncvL3RhU2ltbHJBb3FZa1ZFeEkzTjRvSTdJTHVtYVl3aEpGQlpUS0FVUTF0RVJkU0tXNzBZRHg0TUxxQVlZNHdINDhIZ0VnL0dnL0ZnUEJnUHhJTXhoaUF4eGhoampBbStlUXdHNG9GNm1OK2JtZGQ1OC9wOTMzd2dBQmFNR01hZ2lrdXJYTEI1M0g0dlZzTEk5ekV4d1RuQUJDc1NrSXAwWkdFMUNyQ0J6NDNiYWt2c2NPeHd1dXh3T25kVjIrRjFPU3Z0Q09sUEVTSVJnMFFzeEJJc3h4cXN4VWJKUkVQQkRCdVNrSUkwWkNBYk9YQ2dTTThaRUlWWXpNRThMTUpTckVBdUNyRkp6eG01YWh6bVlqN3N5T1FPODdBT20vVmNCQi94U01ZQ0xNWXlyRUkrMW1NTHRycmRIajhGeFpCNFVid3NEb3AzR3QyK1pyb3ZQaFNmaXMvRmwrTHJKbTlITzcwVlI4UVA0cWo0UmZ6ZTB1bHVwRithQ3FKSnRJb0pZb3FubzlHajBzUU1NVnZNOFFiYU81VkRMQkszaTJWaWplankrWEp5VmEzWUlMYUlIckZUN0dielZLL1lKNGJFQytJbHNaL05WNFBpYmZHZStFQWNGcC81QXZ0ODZvWDRTbndqdmhQZml4OTlnUU0rTlNaK0ZYK0l2elVOU2pUejJsRjgwSDlFYmQzTWJsUVltc05RVGRNdzdUdzZESTFoR0JHR3BqQzBoS0YxRm1QNHE4M2c3NmFBdjdaaVZNR0ZPalRCQXo5NkprZWVUSk5qUUhuNlRPelY0eDQ5MXVuUnE4Y3VQWGJyL3phb1g5L1M0MDA5RHVyeE90Zk80bjFBc1Vic1J4dEdNYzVYbWJDUWlTTEpURkZrb1dpeVVnelpLSll6NllpZ09JcW5CRXFrSkw2MjgrR2dRallOSnFxZ1NxcWlhcXFoQnE2Y3luTm40YjFCOFpqWjZCd01WRVFlQ2tuVU9qYlMrYi9uUDNuL0lYd1R4MlczK3NRcWpDR1pPNG43dDVlcEhyUzN6M3d2N3ZLVE0vZWtZbFJnTi9mWVMzNzJHQVhZNDlURm5xQ0RiSkM2MlpOMGlPMmp3K3dwT3NLZXBoNzJEQjNscXNRN3FiYUttdEhLdlgzbTNndzh2a0VleDM1YzQ4d0Fobmo5YUd2b0xJYnhDSS94UkZ1OWxNT3pwemlXVURrUGVUM1Z5NjhVdFZFNzN5ZHFKWi9NUlRMWE9zdTFydUFxMXh2Z09ickI4elUwVlV1cnd6VkthU2VWVVRuVi93R2hTdTBEQUhqYVkyQmgwbVg4d3NES3dNRFV4UlRCd01EZ0RhRVo0eGhTR0hXQW9veHN6TXhnQWlqSERzU01ERkRnNit6dEErTDgvOHY4Njk5NUJnYm1YNHlHQ2d3TWswRnlqRitaOWdBcEJRWm1BRHZWRGdJQUFIamFyWlIzZEZSRkZJZS8zOHVDSWlJSUJBS0V6ZXdpb2RlRWtnQ2hTQk5SZWlBSnZYZENGeFdNQmFSTHIxRlJRVkhoWUJjRnNYSEEza1ZBTUx2WUd5cUlva2pXdTB2QThwZC8rTTZaOCtiT21YZG4zcDN2R3lDT1dQUEtJNkpQb2tXS3hjVjEydUlTL0JxYnc3bDUvK0dKVTEwTjFCaU4wR0pWMUFCMVUzZjEwVkxWVkVmVlVFdU4xVGlOMXdSTjFDVGxhckttYUtwcXFiWldhNlhXcUw0R1VZemlYTVRGdHZZbGxPUlNTbkVacFNuRDVaU2xIT1dKcHdJVlNhQVNsYWxpTzY2S1h6M1VTajJWcmY1SzRCWnU1VGJtTW8vYm1jOENGcktJeFN4aEtYZXdqT1dzWUNXcldNMGExcktPOVd4Z28zb3BRNzJWWS9zUFVvTTZOS1FQV2VTU3p6M2N4ZDFzWVROYjJjR1RQTWJqdk1nK1htWXZCL2lJSXh6aU1DR09jNElmK1VtWldxdVJHcVYrYXEwczltaW9obWlZS2lsSnE2akdRTkN5YUprMFd2bC9GVTF4OHRsckV3VnFvSHJhY0dFOFhTMVVCeDlYVUpOQlpQT3hPcW16R2l0RkRkVklLMnhLSWJNMVg4UFZYR21LVndYMVZRZWxxb21XRUNDRkpGSnBTbHV1cEQwZHlhU2ZmWkhEQkNZeG1lMnFyQ3BLVkZYNTVWUmRBU1VyaUM5dWs4M0pwSTJkUXdYcmxhSUJhUlpsTTVqcm1XT3J6L0dxZU0yODNkNSs3NmgvcnYra2kzTWxYYnlyN1B3dTZKSmRRNWZpMGwxN2wrdG11UVZ1V3lBWVdCNVlHU3diakE4T1B1TVZSaUpuSTVIWXI1WENXWlhUYlc4NURPRUdOcW1MbDJCNWQzbjd2SVArUFA4SjU3a1NycHhMY0luT3hmSTJkbW14dk5OYzNyL3lxaWl2SXFlaU5ZUElYbHNoY0w2S2hUTUxqNTN2aHpQQ2FlSFVvbjZ4OElEd2hGQWszRDdzQy90Q2hhR2RvYmFoTXFIU0JiTUxsaGFrRmkvdmJkSFdJaTk2V3B0bzdUcHJlY3pUQVM4ak91eTE4ZHA1WGIzTWMvbThubDZtbHczL2l5Zi9jT0x2ZkY5ZzFXZWtSRWxiWnl5dE45NlNqTFE0STJhRE5ocDFpY2JoTXMzUVRHTXZYMWxHUlhWTmw4OTRXcWdGV3FRR3hsU1MxYWhtalBocXhueFRPNDhVNDZWakVTL3A1a0JPakpsQlpHbTVzVHM1Ums2dW5kWjQ5cGdaK2ViR0ZyTmpzNUc3MWR6WUViTmpuL2tSdGVNWjgrT0lHWExJN0Roc3JCYVlJY2VqanZBSDN4dTMxYm5YR0xpVFpPNmpGdmRUbHdlcHgwUFU1Z0hxODdCeHQ0MW1QRVVqSHFFSlR4aUZPMm5NbzdSa0Z5MTRsZ3llb3hXN2pjMFhhTTN6ZE9FMU92TUs3WGlKcTNpVkRteW5FL3U1bXRmcHlodTh5VFc4UlRmZTRWcmVwanZ2MG9QMzdHVGZwemNmMG9zUGFNN1RET0FUK25LUS9oeU4rbWJVaHhuS3A4Ym9NWWJ4R1NQNWtoRjh3WEErWnl6Zk1vWnZHTTNYekxDYmNpby9HeVUvTUoxZm1NSkpwbkhLbkRuRGpaeGxOamNaU2pmTEkwOWlGRjh4anUvTXdHQ1JmOG5tWW9CWi9NNU1UaHRudnpHSFNNenkxSmp2VGV4bTZhdldmd0xOdWlvSEFIamExTDE1ZkZ6SGNTRGMzZSthQXdOZzdzRWNHTXc5d0F6T3dXQUFYbmdrQVpBRVFCQThSQktrU1BBbW9adVNaVXVXTEZNSDVkaVNmTVpPZkNpMnRaSGoyTEV0ZjVidG54TmxFeWUrcnlSZVI4bGFHOGZKT282ZHc4bG5tL0lsRHJhcSs3MDNCd2FVRk8vM3gwY0oxN3grMWRYVjFkVlYxVlhWaEpKTnErK2hYMkEvSWhJSjZqNUNLTG5NS0tXdkpBUStrZHlTR2l3RTNRbjNKdnFHTTlLK0Z6NEtIeE5HVlBqMkNmWU0wWWlERlBWZUI1VUpuU2N5WVZSbUY2Q0ZiN2NpQVJRL1hTREVib05tbXR2dFZyV3VRb21XYUNxWDBMd2xTYVhlUjJqSC9UdXEzOTE1NDdkdllzOWNuZnJjNTJpUzltRy9Cd0QrSllEZlRvS2toMnpXTjJoVWthQUhpU2l5cEp4WEtXTmttZmVqVVZtbXk0VDMxUlhxN0lqSFFqMWRQVjUzUjdBejJOZGowMElGYjJJazRQZXBXZ0MvcHhJMDVTK05qSlZIc3hML25rcjVEOURLNlZkdkxtMlp2WFMrK2tlMDhJbFBsTFpzeVkxUFRZMy9DWHZtM0w3UmZYN3Y0WTJIYm1KSFBsZnU3eTlYYlJ1SGh6ZjhEWkNwdFBvOCt5ajdJa21RWVgzQTc1TWxtWEFVSlhhU01CYmRMVk1nNWtuQUxFWVhLT2tLZWpwdEtrblFoS0lGQ3BtUnNVcFFWVlBKQVZZZTNjSktJNEdnbHMybWt1M003K3RtOVAxako5TjdodCswTUgvNTVQajR5Y3Z6aTI4WjJwczVVeWtkbnN4a3RoNDVOVmljbjlnMmZ2S2h1Zm1IVG81djI3QTRVTXBOSFJzckg5dWV3N2s1WU14TkcrbkN1VkZxdEFMYzZMSk1PYTNhWFlTNE8xeGQ3VjNRMEpsUXRXQ2g1RTZNZEFNQzdTemxUYmxMSTFzQXR3RjJnSks1QjQ2Vnk4Y2VtSk1lZVdSdzM2WlVhdE0rOXN6WThmdG5aeThkRzJNSHFyN3MxaU9qbzBlM1paRTNLTzkvTi9UdkpJTjZFZkNSWkNhZEJ6S1lTTWl5c3F4U1JmRXJ3QnpReXVuR2Y1b1dRUVQ4NW44SDZKWHFnOVJSZlo3ZUQ3UHc1MmUrZk02RVBRZXc3YVJYejY2RnJRQXorR1VFYXlkMk4yZTVjQTJxK3dEOVdmVithcXYrSENCKzZVejFXWUZ2YWZVSyt3K1l4eXdaMHZ1OUhxWXdtRVdGQUovSjUyRWkrUlJHa1hia0pMU1BrUVczSjUvSnAxVXRXcUJJcTlaekNEeFdTWlVUN0Q5S1IxNnpDK2RwL01SRGMvdmZNWElndmJKaDVOQmtPak41dUhUZ2xjNi9BdDQ0TlBmQThoaE04OXdjVExlK2FmZkFVRzdxZUhuczJIUnVaZkdjd0hFUGpQdmRuS1k1UFExL3l4S1Z6ek9LWTFZVkprbCthUzB0WWR6d2xZTHZlKzZpMTk5MVYvVjMyVFBWLzBselY2ZG9zZm90QVJmZitnTEFsVWlYSHVBa1pOUll0bUwxYzdZb3VSZnV3dlVwM2drQTM0L0FPeDJrUjQ5cEtxTklMOFpnWm1FZURCSjVNMGtKVmp1RkJaZk01aXFCQUM0NWQ0bU52T1BlazQvR2Jna3NURXdmdUl1MjNmZmJaNC8xNmx0UDdLRWZxZkVPanROQk1uclNyc0phQXJsQytUaGxpVEhtWjRpWmd6ZzhIcmVDNGdSd0E0bENVOVFOOEliZVduMmFMcjIzK3BjdzBEK2xldlZqMWJmVFhkVlBHM0MzQWx5RnhQV29ZRU5LMlFtSm1pQVZvcmpkTWtnTFRqYy9BTHNUUnZ3SEY4UzdVb2JUSHQ1MXFsU0NWK2VSVEw3ZEVtRG1SNFp3ZTJUZ3RJd0U1QzU1dlVoMStzd3ZibjNQMTcvMm5vc2o5Q2RYbndPRUR0TVBYcDFpeWRvNG4rUjgzSzFITkJpWU5Vd0RKWURZaVNDOUpTb0JPT3BOSGJpVDNzd3UzbGg5UGJzSTBHVDZBa0J6WEgxZXlPTlI0T0dmQXc5N1NZNlBzQlhiNXZQNU5JSnNaTnB1cHNFaXIzSHRGc1orWGxsK1lIYjJnZVdLK2ZPZTFKWUR3OFBYYlVtbnQxdzNQSHhnUzRvZW54T1NhYzc4T1hac0tvZENhQXlFVUc3N01WTU92WXJQcFJkWEZ1d09sTWtVWkRlZ1pDNVhQdFkySnlFZExxZTN6WXN6bTA1b2ZCcUUxRTZsM0Y1VFlCK2dFemRjdW5URFp6LzJzWTlPVGsreFoxNTk0dGlycTFmWW9YL1pXaTV0TmVud0xVNkhJQmxFcVR3NDBBVXNwTXJRbzhUbUZVcDJ0YVpNTVo4WGxBRXhxT1hxNVhJM1U0SmpZK1VHRW8xVmN1em40OE9UQnlmVCs0djFkS3BlWFlqRTYya1ZLdm9XNmZINWg0ZG5OKy95K3V2bzllNmppY01qOVRTejJ5MmEzUWMwYzVFQUdkZkxOc29VTG93WVZkaDUzT29NeXFuRzd0clJUb2luc3ozUUVZQlhYTzVBd3NZWGhiSGplVk5TQS9rcTV4K2NtM3piNWRkOTRKT2YvR1JsQ2lqNHl1TlQ1d0xWdjZXaDZnL1lvYi9mUERLeUJYZ3pCT3Y3RVBzQzZTVjllczRIcTl0UEdaQnR2bzUwc0NKT0F2MWkwa0ovcHBCQzBsV01OVDZhemVXeTJmTG9tQ1VPVmI4dkVBemk1b3RzbHcxdDNYN1RwdW5ERzZidlAzTGtzVHNYM3JScDgranRHeWJuU3hQM3JwenJuYjJ3WmQ5Ynp4K3VERTRPRllxdVFPZVJuY2RmTVZnOGt1OGRMMlQ2N0FIUDhwNmh2Uk9KQ2JHR3VvQldaN2tPa3RDN1pTU0l1Y09ZaTFxb0hTZ252T1dFUHdXcnNvdk4vL0F1ZHVEQ2hhdC93QTRBakJrWTY5c0FocGRFOUpERTF6UzhiVW14bExkdXhXUkJnTGw5cGlSN1c5LzhMZHNmZnQ5ZEovYnNXYjZMRm5mY3NWajh2VGZSTjFkdnUvNldXNjZuYndiWXBvNmtJbjZ3ckp1WE9QU2hFdFhEcFU2Q290aWdORkQ5ei92LzVuL2VXLzBSQ0o4L1p0dEI1RktTQVdvL3lQZHpnTk9teVZ6K2dEQkVaR1ZUQUhuY25RcEkvVVJLUWtEd3Y1U1M2TWJYdlBQVkY5NXgrenN1dlBLZHIza25RRnhsbEg5Tk1TL0FkUUIrSCtkeURlUzQwNll3ZVkxZzgzaUVGQ3FsUUFvRkt5V0pwcVMzUDBKZDFUZC84dWszL0pKMnZPbUw5QWE2N3hlL3FINjArZzdxTWNiOElZQnBJeW05UjVPcDFHclVObUx6ZVBpbzNXTFliaHFwL3VzalgvbmFnOVVmQXJQOUhwZmRCNnMvQW5nSmdMZVR5MG5RSlZRS0NBSklZRVdZZjlUNStHeEpvTktZT3lCcyt5QTUrYzVRcGdwTU9zMzRFL1QxMVZlejd1cmQ5TEZGWnBmT0xWNzltWFJ1ZFZYTWovUnVsb1gxUmFoR3U4Zzk1SXRrZzE1eENtMVdVWlhMT0VPWEcvUmF6Vmg1bEhhMHU5b2NkbXFqTnJmYlk5UFNCUXZtaHkyWU1iSUVNS2YwclFKbU1ORFpJU3V6TnFwQVMwVmRhUW5aMVFZRDg3UjF1Ym9zNkhhQVRvZ0YvM0VMZnBqRG45RzN1NmlpWWg5QUcxVlJMOXMxQmp0YUkrWTJBMzRid0cvenRBSEhkTFJiUFRqcThYL0NnaDhua3dCL3B6NHQ4TGRSMWFrNUpNQmVhY1RkYnNEdUNpSDJvSU9udWxKZWQxdlFGYlI2YU9OakVMYURkRC9YSHp4a216N3BBUW1EQ2dTUmJLakwyWWdxMjlSbWZSSEhJeFJHZHllODJPRVcveHhhREN3S1VPMkNKWDhLdmhLV1pjRXVWUGZOL012bmR2NnkrdFNPNmo4SUEyUGxUODU5ZnNXd01Wck1mNGdNdzFnbjlVM1dXSUdRWkEwWnRYb3lkclFCRnpSTlV3MzJQUmJzS0o4bnNHTXMyQVNKZVA3bFFRYmFyWGF4cndQdHdpQ2VidEc5TVlBRGpTVVgwRkNhbDZoRTUrYWVTaTBlMXVPQWdTeXBzZ0dZcTRoYzVVSFRKTUVXSXFBam1DMG9vTURPMWpXVUZwYjBUa0tpRWVnbTdQWm5zbTRiS3BTZ1o2a296RXVtN1lKaXZ0Smd6QTBQOWtSY1lWdG5SeUU0dktGL2VIT2RiUmVmaUhaRlZiWHNjSTRXTWx1VHBxbG4wZW9uRnExNk9LMFc5ZDJDVms2cU9XQzlhSFVjWjdPcEo0bXFobmUvUE41cnNYNGk1S2pvcXd0bTIwVTFHL1lwelllb01nc3RiSnBpVzRGM05LSnFyZm1kMG1SUExCTHd1VHNhVmhMdmk5dUhuTDgwUTc1OFZQQlh3Sy9Jd2xhVUZSazRqQUdIV1ZhaldtYzFNcHJOcEZQaGtOZHQxMmlTSlRVdFlmQ1hnUDErQzNhU1BBcXc1L1NkYWFySUJudzJiMU5aaXg2MHVoNVNLVVpUdmFuZWZDNmJxZlZqRi8xdzI4akJiZHdLK1lMdUwvU2hqYXZGWUdsNnFLeTRxU1RMODNOUDJZSGYrbEJEa2RudFlKNVQ1VFlnbFNSTDU0aW04WG1LN3JiVmRSbVplOG9GYnhUd0RWQnZMcjJVVjlDT3JHc3QzM2ZONWt0TGVwQ1N3ZjU4TmhvTytEcGNkcHVta2dxdDJHdUd0Mlo0QTJyR0NYb0NLZ1BTdXRiNHdHL3NjZzJVcDBhem13TVpkNjh2MXBPTXAwUFRyenc0MU5vK0g5c21qVXJGZEdHRHoxdHdkUVFEdnNCSmJjdngxOHkwc05ocjgvbTROWi9oMm56S2lqV2ZNSGpsTWs0cWsvOHI4Mm4xODRUVlR6ZjVGZlFEVXJqR2t3cW9tVXlSVjFxelpCbzY2TXVuQnRJRE5mQTJBQSt3dWQrQjg2VE40TW1ieE40UmhSbWo4M2FUR1VHZzJwcDhFcG93T2lPUmpuWktJNGxJb2lmZUhRTzlOdHdScGk3YWxuUm9TYkYzaE9BYldIZWtFelNEVGZxRVFpa2dCd1E0YndmZG1DMExNMVRUcEdXYlVBazhia0s2Z2pEVlhuZkNrNERYT2hLNGE2Q09uQ28zK0R2OHNJUDRUWi9IeGFXbGVxL0h1OTVsK2ozb3dFbmFYM045ZlA3a0YrcDhId1lOZHZNMWJ6ZlcvRjFDN29NRWdjMEVGTkxMNjNoRWJNSWpRaW5zeWpCazJvYjdHOGo5YktFRzk4TVczQmc1Q0hCMzZGT2hvTHRUVm1mdDFKUlMxNFFPa0tuZjZ3cTNoNjBlSE5oREhlN3Z0L3BJOGo2QUI5dXBwdEo1aDQyOTJCanNvaGNYOU9MeXVyeW9ZVmo5T0p2NmVkenFKMXpyUjlXQUFUVlZ1NHlkb2ViMTYvZnpoTlZQbkd3Uy9kaXAxbVp6U2tBeGRUMTZPVVFQNFM2a1dFOTNWenFjOW5sY29mYVExWTlyM1g2NnllZWhIMTNmVERRK0xlcExtSlFtNEdKU1d2QlRpQXlJOVFwakFES1JheERKVmtla1RoZHdWUU4wQy9ZOUZ1d29ud2ZBRzJEanBnZEsySDhGc3ZCdnJCYTVmeU9BVmpnc1ViQlpPbUZuN1lBdFF6Sk1ER2puUjNqU0tSQUJYZEpDSnNVMTkwZ2hROUdMUXRIWTRnSzZMQVEwbTZnK2V2Rk9ldVBGK1puT1JKdkQyOVlkQmQzLzZxL1lNMVU3L2RrTHExTnpzblNFc1VoYzlOL0Z6a0QvY1hLdjN1R25paGFBL1oyaExtRnFTUG1XZzlOZ2NKb0dlQ2tLMzFnU0ttdytHYXNwNm16cTJWWnZhRUpuZ2c3am1SelhUZTJvbTlZNU5GTXRsS2M2SjZmVXBEc1pUczhtdGVuL0R6S1ErMU81ckhJYXN1b1JzUS80dk55M1dob3BGa0Jrb1E2c1VSUloxL0sxOXVhSEJ2TGwzakwzdVdic1dxNVExOGZqVmg5aHM0OWVnTWo3WVVLUTJFR1FVSzdHcjk5SFBwOGZ5QSs0dmFJUGg5WnI5Rkg5THZxRnJUN1NGQWhKYnZxVU1ZeTVwMkxBUnJsclFONE5ES1F0dzFSRU5PQ2l0TlVTMTVaMnVpVXFTenA2Y0RrZU5nc1BQdFluTER6RW5yMVYzMklnUWpRZ0pVVXhjMjFDZ2tKVTZpM1ZFNUtSTnZqMkF2ZC9CTWxHZlJ3UGJad3FJdzdnSnVJQS9kZGhPeTlUWktnMk8rTmNUZ2h5RXJUM3VzMS9MaTB1V0trTUJoaDhsYmluQlhnc1VVNHM3OStQdnVlOWUrK3EvaTY5dnZxN2pPeGZnWC83cTRRT1ZMOUozM1l6akkvN3R2bGN0aGx6ZVJ1TWI3dXV0OWdQaE9mN2d2QjgydzFyNVVYMmdaMEFkUytYb1M2eEo2OStFT0NqSDUxSjdESzZ1Uy96eFd3Y2pGQUs2cUpDWlNxRE5Fb0tHS3ZmZ1Rjcm5LY0ZqTmpxd3dBRFpGdG5oOTBtczFuUVRRRVFrMWJxSVFFVTZuSXFIdFhEb2FrSURXQjlHeUJzNHVNVnNNSWNWbGtmVVNuakIwaE11cXpLb0NDeHk0YVhsRU5UNEtmaVZKd09VR2M1UE0yQTl6MkFNc1Q1UThDTHI5NGs0Q2xVc3NsZ1ZBSkVnWmNxSUhuY2lGa280STU2b20wT3BWUHQ1UERzQWg2WmhiWmZyWVBYdlhvRjRQVUJxMHQ4bUd6TklPdUE0Q0FCcHorQkp0K29vM2xvOVRqQTRLZFJPRHhpRFU2dUc1eE5BY3JYU0lXNExLdytMKzBBL2pUZ2tIYnFoOWNXUDlYbVpMQ2x3QnJzZ2pYb2xhbXBTWjdFRmNGVlNUMG9QdVhVMjIwcXN6R0djaHEySDI5bnUxMXI2R3YxRjlCRG11K0hBdWNvbnhjWU4rQ01Pd0E3LzJJWVU1SmU3U0xmNWZ2ZUFiM0R0TXhadldVZU1JQ3NNY2k5OVlhNDRkRmEwbUZKQUxBQTJPRG1jVWVMYldUaHJqV2J4eHFEVy9EeFg4RElkdFR4WG1UMU40Uk42b0Y1Z1pIQUh1bW1iQmFHQzlZY1dOd1NON1FhdUFjVTlDNjBxaHkyR2hmeXVjSnpvU2M0N0haakhmOGJ3QjdYeXdCYnRta3dOcERKWUVGZXhoTXJ6Z1NOWjBhd2FvUHduOWViU1dtVy9nTXkrTjNzR1lEWklXUXcrUUUwUHZCcGh5WnoxNklRd2lIaFlWVDVDWkhRVVdBRGp5aEFWVDhNQUt5bTAvVXREQjVBL3gxMVVxZkhBNE13YlBiZGVFN0UrYmJUa0JVZmdUSDBnMzBMaWd2NmdlVEx0ZE1qNC9pQ1VyNGtZWnR4QXh1a0xIMTlLL3NHTWVHa3lCVjQ3Nkl3ZllNRS9mZ1NiUVlFbG5FY0hrZE0xVUphQnJZTk5EYlJ1M0JPZ0tEbjErQUJabTlIUzF5QWhsczVEVHNOR2o2SGEwaVFMdElFQmxlS3ZBeWRSMlRvTElTZFNmTHB0WDIxNktvMjdscGYzVFJhL2FZNC9WRmhEY2lHZ0t3SEJUQm9lNXZtc1hrRUxJM0Rnc1dBZTlOaGZoYUNFUWJRRi9yNHdjNm44NjBPOEZ6RTVmZnpBN3l5VnE3QU9xbjROZEM2Ymx4ZXZ1c0RINkIzL3RQV0MxdnByZFYvdkhqaDRqY3UxUFQySi9sY2V3eGI3VzFpdmRza2ZoNUhMSE8xd1lIdHh0TSt0d29icUFYai9SYU1KTGtJTU1iMFVodll2QndPbTlmcUROOEdTRTZuMHczYnZSZmgyUXg0TUZkUGN2cDVqTG42TVNBNyt5a0RKVEZud1Rvb2pkenVhK0IyeVp3cmV3dWNIN2Y2aUpBN0FPY3Qrc1lRNE53R2V5N3ZUSm9QVW5rVzRHbXF6SFUwN3JCdUFKektwTklDOTE2RXk4OGdPVDI5QmowL0FYQUxvR21MNFZQbGNxTm1jc3BZOXo1UXdESXExMGlJQmVmREZwd1llUXZBcWVpam82WCtvaXpQZ3BnQ1lESklwMVo2VGwvdjhHRHZXTjhZd3RTMFRBUE14eTJZWVE1elFoL3JBMEJVT0Zad25xaDh1YlgyMU5zNzJEdm9EaUJVbktvYXpDY3NtSEZ1NjRNV3BWSEZydG9rZEZTMXhuR3MzTmU3YVVOWkg5T0hCbnBIKzBZUnFrUGdDcEszUklqME0rRDdFQ21pWk1ZbHFNQjYxNERveHFHSFhXV0tRcFp0NHBBbTNBWDdUcktyR0M0R0E2Z0R1ZHFjZGhLaUlZY1dLQ1RNZzB5d1FBSUI5SktEU3Byd1p3d2QzM0p4dlhudUVpcjZsK2JZK2VyZDJSSGJVeC9UUm5MMDRhdHZHdGk3TVpuY3VIZGdjQkYvTHBhUFg1cWJ1M1M4dkpJNVhUazNjVGEzY2lHNzdXaXBCTHAvZGh2WUFFZE1HNkNaRjBKa1JlaExLa1ZTazdXRVBtVVJ1dGhiOUl2Wnl4WmF3VXFRZHd1WkRJd0FwSVlKWENkTXd5MDRpeXZTRnB4N0xEaFJ6Z1A4WEFrVVo3cXU0dHlFRVkrTU1NL2JJeVFIODNYZjNGTTUxRU5jc0NNV0N6M3hUcVlxY29RU1JacVA4RTlaMDZkTDRnWGNDRUJsb2J4SG1OR1R4ckZiUkkrTHpSRWZteWV1M0NnMWoxMWhUZmYxNXIzNVRveENDYVlxZU9RcUhKZVZrbWFkdGVZa1h5QkloU2RUR2MzbUtGclNXOWdUNXc4WFMzaG1QWGEycjdoeXVKLy9YamxiNkFrSGFEa3ltY0xUYS9xTmNLRDZWYkJhOExoZnVYSG8wazQ4dVk1SHl6Y00zYzkvN1luUll2OWlENzNUNDBOWDVzRGVudXFqWGo4LyttK3gzaUpjdG9MTk1nWjA3Z01adytiTFRlS0Y0bmxZcXdrQU1aT3JuMGQrUnM3NUlXREltUlZ4Qm1ZWHArVTFMNVZ4Ym02dm5adWJaMkJnS05CSXVDc2s0c1JvTzIxM0I1TEdHWmlBLzM0TGZwTHNBUGo3OUQxZFlHUmhIMnplV2U4TE0zcHgxSG94VHdkQ0lld24xQjNxamtVajRZYSsyb3krUU43ZngrVjl3SkQzWHdVSXIvaWtHSW9ROTVsMXg5Rm9ZQ2JOZG9hQjJXTFlTM3BvM1pIemVlTm4vOUo3QUorZ1Fkc2Q1RXU0bi9sQmp3MHdFUWZRU3B6RG9qZ2xXTlB0NmM4VTBzWmVJK0E5WWNGTGtnekEyNlpQRm9FUExKaFNiWTljQTlWZytFS2hNRndZZHZzUU5oZkFHS2ZnNUhFS2srUXpldENLVTlnTXl2b0lNTmd3OEpOaW5FNzBnaElEZkhZN2tFWFNidU03bVhLdVpUZkc0VVFmdmlESjJxV1g4SVplYUdpczNuZXQxcUNqT2RPWnREdVdLYVJzV3ZkTERKdFk1N1FpZTgxZ2l0ek1tVTF0YTA4c1huUE44SXJCUFJOSlZtbzh1RGloVmVwNDQzZXN1UXpYNWxKVzZ1WnluYzEwL2JsRTJOVi93TG0wWUtmSlIyR0dsM1ZuSGQvTlBSWGhKNXRyUVRZcVFWRkRDV285QWFBTVdRemFHRWZTZ1RHRk1yclNGSmpCOHhnTlluclR3T1pTRnd4M1J5Zk9tN2RVVG1GSWllSHNTTjMxNkwreStSKys0UTEzUFVwZis5Y1hMdnoxa2Vwek5BUGo0ckM1TEFrWi9MOVJuQWM0K0ptSXJVNDExTlpFc05qdGxObzc3R2luT0J2T2dRSG5WUWZIdVp2Y3F6dmNnSEFudDkwRXUrZkJWbFVWNlhZQ2hwYXEzSWR1SVVVK1o3ZlY0R3VtTmRHTFRabWtYbnJSdGtzNmVyKzZTYmNiK1plZnZYZWJZVFd0MlZORTJ5UTZtbmt3SEJjQk9Gc2EyV3lGSFJDNlF4Zkl4TE5jSm9ZTVh2Z1lQTmd2aEdGVWJTSlQ0OXgzR1hPdnJpRW1OL25hbk5ZeHJURDU2dVBVMm1EckhkV0hzVXZRQ1dYMDlqSkpNYXgrVlJqa1J0U3N2OTBQemR2U0NiZUl0eXI1UzBhMG1yOFdiblhYWnh1aTFTNi8rc1R4dXgrbWYvWERyYU9qT282VHh4N3hmYXpMa0xXWERiK1VKUXByRVVtbXJ1ejJwcngxdXJLQThXRUxSb3ljQmhnbGZhZ24zaFdxMTVYWHhEWUYvTEdJUHhsSUlyeWFuaXpnUFc3QkMzTjRaWDBrc0VaUFhvT2IzKytQK0NOZ3Z3TkVVMGNXOEo2dzRNWEpMcUhMMSt2SWEzQkxKZ0wrZkRaUlRCYWpZWDlQb0FjaE9wcHdyTkV0eE5jVTF3Y3QzYklWY2lGL3lDTkdteTIwZ3BQZzU1VWdBMnA2NVJyTWtQSEYrSHJyWU54andZaHllb0hOWSttVWEwQTBZOEpsME14cUY0OURTNU9EdXFPTkV1WUM5c1gxakM2amlBTE14N1ZCNGNOQ2VjWWxXNEp5R3gwQjBMTk5qYmpkQjUzNE0za1JxUXdLeTFyUFViWXBxTzJlbFlGaW5TY3AyL2ZndTh3SXQxYy80ZXNlcTdtVWtwdmowdTg5V2hmd1ZqYzNQN0hvMGNQcEFWYU1uYXJvTDFMQkl0STA1U1NzMS9EdS85SzgxM2d6UXM0S1dackVtQWV1VXlaYTZKUnJla0d6dFg0T2VYd2Q1NE9Jc1E3L0ErQU82ZjB1bThKajdVQTJBaUI2eVlpNVEwMTlXYTVGL25vdzREb3Y5Q2NCNndrTFZwdzhMWEEwWWRtbzZ0RHNra0pWV0pNTk1YeVJjRWQ3SWg3T1JESitiM3RYUnhjSDdEUjR0Um5IRUhsUytCa3NIQUZCUU5QRVVhT3FhaUhaM3Q3dWJzZmpEUUJvN0xjQzN1TVd2REQ1dXJDSE8yQ2tBcVlSU1diVEdKZEVEYmdDUkYrN3orM2pJTzA0ZUNPMjVrTWN4NWhCeDFzQUpraFVHL3I3dUVORklwSk1MbEhUWGN1V0xSY2FiSEVPYXFkMmo5ZnlKUWw0ajF2d3dtUmVuRTg2MFovSVliSjVqRmlTRWJBSkZZL0FWQUhWNGFEVTBlbm81STQrRHR2V0NQc0pDM1ljckRqT3B5YXVJQVBzaWsxQzk1Zmg5REQyd1dBQUVLV3hTQ0FSVExnN0hIN1FVRGhvaDNCYnRhQkRDRlkxbjZzNjJKSXNEaDRvcll1RDV2aTZITGpiYzVEb0NRTjRQQWFTdytzMjZIcEE4SlFHeTU2SmVNaWE4dHdZR1dsc1c1UnlIY0pCSFI2M2wrOThGdHozVzNDVFpBVGc3dEpuMEhkbHdwWnFPc3BhNkpxQTduUlNpcDRzSHJrZytyQTM5UEdFMVVjM2ViK1l3enJjTWVDRXUwcGFvZzVvVTArbk05QVdNRURiekRqQy90V2YwLzlOcjVJbzZTVy9ZM2pHM0pSSnNNOHpFRGMwbldLS0dnWjdXd0Vydk5VVEdaNHNpUmZqR0xzS2l4SXRVSzRxeG9WQkxtdU15NHlJbm1yUlFwYjlvaG1HNFBEVE96OGxJTUJnNzRVMTNLWXBKRXFqTmkxUUNDWk4zUjVWb3lUczMyUDRsOStkS3F0cVRnamxNdGY2djdOdyt2emgxTGJraG9uNHprSisvTnpJeVp0dVMrNjhmWHdndWJFck1wNFlHcmRkdDMzN1lrZG5aYmprOWUwTGR5MGZxbjZtRkkrK0s5bnI4Kzl6T1hOQWw1blZYN0ZSOWgzaUErcmZQL2ZVQUF6UDV3SlNkNFdZTE5ud0JHMit6Y25ZYktUaFkycCt2Q1JlQ2VKK3dyZVNJQTZVbktTbWJ5SlMvNFJib2ZpWThLZExlanRYTEJLQlJNYWJ4b1N2ak9HS0FEMng0c1pSZDdNTUVNQnZLb3BzTkswZkhDN3VqdHg2TWJ4M2NQREE1bFQxVjVuTmdjQ1d0SDdkd1YrV2owL2wwOG10N0t2ZTZyY1MyZnowc1J1ajBiOEt4NDVPVDEzUHQ3M0IxZWZwVCtrTFFIelFLWHd3R2o4ZWQ4bUFxMlJsWXNWYloyTEZhT3hhbVZpNFY5SlNlakl3bGJvd1VSYVIrdVVOSzVtWnNKN2VkT0RBa1doa0tqK1luemt4TnJZOG5TL21kOFc2ajIxSHBCamc5Q3NXTmVqL2dFRi9ON0I0Tk1JRVp0SzgxOE1vMHIvdVkyWitiTkxmZFA0RWhTOUVnUTNNb0gvdGllV3lyOUcvZzVDZTdxNGc5TzdMcDFRTXNpNDNqZzZtSVZQUGNmUVBETHFuSnc4T0YrYWlGNnNQSHB4TTR3eWs5T3UySjVIb1paeUdWSno2dkZlVHY1eTZQaHI1SDEyeG8wU005WG5XQ1dzd0RHTUZDUmVHR1JENUNxZzRxOVJBTkY3dnpvbEc0dDJSUkRTUjlPZVRHaWJOTktaYitORlJpZGhKd0NXSmJKWmVHVmplZ1AxbnRoNFpMUjJhVEZmZmFMdHVJalhwZi8zSURCaFJqaDE2Tm8zVFVJRnB5RTB0ajBjM0xuUUZhSFJxb2pJRC9JRlM1d0gyUEZpVlIzU0hEU1NPblFwVEVnOWFyRFNaN3QwcU5ZOWtncmlpL1doTGhQRkFEcVRVeXRxSFMyQjBnU0tZU1hWcVdneU5RYkc0L1lKeFRLT3crNmFsQTc3ZWRtKzRJNWQrM2VzdTNrU3ZMTzA5cE1vblpEbVZPWFNrZXBhKzI2Qmhqa1hwTDBnUDZjZElWQmNJcUh3T0JGUTNpSzRnNk84QjJPNFUySXhWNFNvTTFrU09pSjlCWVpRQUdVK0tmWmxVcE12bjZXaDMya2tQN1VISm85VE5mTm1NcURHc3RHYlpRejBXRzh4SGI3dm40dGo1WXI0d241bmNHdDc3L2hwTFNQa3B6aEM1VkVLLytzc1RGN3FDQndMK2liSHJFdGtxc3NZM3UySkhESjJXNEFIN2QwVDJEK1kvZUNnZUFUTDRiZFpVeCtLN1pTdFBGSU1LUUMwVDU1eENWcUNFZEF1SjZaNjVHTjA3TW4veTRxYVJaTVdIQXVIenhZR3pDOVZQMGI2eGJmRlk5VjJjbHVQdy9mUHMrOFFKMWp4WUJOYkM3OTZOUWl0bzJJSnRvR0dMQUdzUTBVN3FWSUZRWGxORWd4a1hoRjd2aS9YMlJXTjl2WkdMN0dnK0Z1MkRQL0xucWs2SzUzaHM5ZnVyT2FPZkNKNmNkTUlVZGNBUzVqbEdabzh3TjN6dHNsT29qeVFZQnZhVFVORG5hWXU0SXFKanJhbGpxUmJ1eE1PZlRDVHU3a3c2N2Q2MldPVGk3aG8yTDN4TmxvNHlGbzZ5RFZjL096Vm4wVHdBTkhlUXZKN0IvRGs4TGhNVVIrN2xXcHdnTnViUStVVENXOFZkS1duZVZNNC9jL0V2Ny8rbm43emxHMGpkcmMvK29QcVRmLzVuQVpOOEdtQkt4S04zNEVuNHJKQTFicW9GQzE0ZzFhY3ZzdTljVGJLdmlyWlNMOGlERERtcU95VmczclFkcEJzelBKa0J2cEpPSWo2QWpFMVRKTDdGNDFMREQ0UzhRQjZQMXg2S3NLb015YVFDS1c4NlpZUlZsZnljUFlKTlRCSm9ZcGk1Z1pFRmIvUzY4czdyTDFZRzRpTStTdUZuOTRpWFhsa3M5SmVMUThQbkZxdWZvWU9qazkweFc2ZE4vQnFMVm4rcnhyOHdGaS9acXpza0NzUG5NeXlHNHVVU2pYS1pvTWpNY0tjRStUaDRJQUlYZSthVEpkMWw4bmZLeUVrMVJyQWVnOU1yKzlhd3R5RnZjeHluT01tQ1RtS0lWZHppREZrR1c1emZCMUlnN28vbjB3ck1iOFVVckViYVgxRDRaL2dHTjVqYmZxdzhkdjFVRm45aU5QSUxtL2NzYnRxOFo4OHZVWnptcDVjcmxSUHdjMmI1eHV1bmQxeC8vWTZabzF5L0tMSlJrRmU0djIzWGRaeGwwQ0VVMlV1WklzM3pKRFdETUNDbytBN3M1KzZUTG1raDRJY3RnR3NIWW4vaTdwT2dRUXNUeFd6TzdhM1hFR1p1RGU4ZDVwSUpGWVc1eUYyV2V2QXQ5dVdkNmJ5NVFTWGoxZjlrdDlUckIwaXZJcGV0aU90V2ZZc0x6SHJZYjJYRnc5VWd3TStTcVlpMUttUXFSNVh5YlJSMVdoQ21QdXJUMWdwVG1NcHJDZENMRFdKVHNmWlJFSnNWR2toa1Y2MmRsUE1hdloxV2lSdDJnRFk3ckk5T0I3Qy81ZlQwY0hrcGlHcUVoa1I0SkFtWGFBYXpOY1NNdUlrNzZ6VmpScEM4QVhON1FrYno3UmhzRDdoY2ljNzhObGdMTjA5c3B1Z3pVNHU1NnFjTW55am9WWDhNZkxaZURtRDgxOG9CN0NvUHoyYjd4eFBwcFoyN2JqdzBlbktvbkp2TjVnYmorY056dStLVnVjTFdXemZNZ3lYY0hZeG9IYTdwOFpucll2SFpybUE4R2dwcG5lMHo0OGxOeGE2VXdETU9Oc0Q5N0xkZ2Z4L1JCMEdiZ2pVS2EyNWVWVUNSd2cyYkxsdlR5NTBPTVdVaGt3SlQySTAra1FvUFdxdndxRWN4alg3dUdIbm83Tm1Mano3YWszWEhBb0Z5WUc3UFF6UjQ1QTJoSjQ1VU0zRkZXOWEwSGFMdjdhcy9CK0JYWUMzdTA1MW96OUI1RVBBWTU4TUZCT0RCZXdZMlBDV1ovdGFnK1NuWDIycUhKalVCNGZhbVVFQjRoVk1HQXhsU1plR3VjVDhOa21IY2R4SEVSR24rSkwxU2ZSWWtRNXllcVRyM0Z3ZlA3S0d6Z0pNVGVvTVpiYzQ1RExiS09TenhWRUhwYjc5K3p5T1B2T29iQU8rdDlKYXFVNHdOQkJuN0NzQlptM01ZZkpHY3c3WmJYbmZUNGZNbnpoKzY0WFUzbndXZ3YwTlBWUitucDJIblBHbkVkT0FlNmtUcDVkQmtLdGRRckV2d2RoS015dUhjVzhsaDRpRnVUMXJiTTU5KzZNNDc3M3Y2enk3ZmQ5L3E4MDgrK1pOcTllTWZGL2phVi91WWk4OEZ3RzJYbVVSY1hGZ2JjZ2czWVNCNUY4TW9ZNTZxSGF5STBhdDFJY1lmOS8veGZhOTk5SjRmUmZkT3UySWRQcmZXblJzdjA1OVhINld2dVBxWm5ac2srU1JqVWRGZkRyNzlJZlMzVGw1aThLWGtKZVlvV3lYMGtlb0wxTEdmYnFXbjlsZi9PejBKTmpPM2E5bTN3R1orQU1DcHRBczYrN0ZoMytJVzVBWTF5Z0dmWjlLZ0pFWk0rN2JGa3pyN3RraHNtcVRacEV1V0ZRdnliSGV6c1dzM2pOMjVwMGJnbmFFWGU4Y3lmKzNVTUpMN2lXYlRMaE9iWkx0OExYUFphTCswcEhjeE90QmZMUFRta2oxaEhsVm1VMm1NeFJ3OFljV2l4ZmNzV3NRVVFyNGdodFM5RGkzR3lvTURzZ2JXVmZjNkpERWFHSlRKTzZnR0NHdTJsZlZjQUNaVjlPSzFtcTRabkI0ckZoZ3REUmZHaStQTjQzTTJqdTlaYTN4aEdOODNqTWlzSXRWc0xjZW93bnl2OTFTR3A4YklCcHgyQnRNSGsxaWJRWnR0N2F3N3pQR052UGdMMWlnZDVpampCUmdsbnVjTkRRNzBONCt6clhHY3oxbmpqUDhySVYvNU5YbTYzMFRTWlcrVE5NMEdPTFVhbnRNYzN2Q0x0cmRHNXpSSGx4bXY0Q3h1MlZUWk5yNXRaS2d3Vmh4ckhtTzdTSzZTeU1EcTg5SjFzR2NPa1FyczU4Q2xia0FTVkFobU9wNFV1aVhIVkdVZ3p3QVBHRisweFRQcVVQT1VPUGdrNHZzWk82Vk85RDRyS3k0YlExUlJxTVIzTzlEQmUxSnJNd2MzdEU0N1VtdTJtemdjdFZlVzlOVElNQ1hUMnpkdEtJOE9WMFlxYUQwbWVpSmRodWRxaUE2MXIrKzVDaG9LbTJtc2l4T0ZITmlvaHRVdWRxOXNOc2UzLzM5Y1BIT3V3YXUxOFVBb3ZsU3FOK2RuQjA1TWJEcWZMSnloT3czRC9tcTFNbERZR1ZYc1VuUnpFaDFmVTl2M2RIU01HWTZ2WERxZHMrejk2V3g2cERCWXBMK1Babi8xSjhtK1ZNSVZibTkzNVVnTGVScjZPMEorOFd2elh1TkN1YUUxN3pVSzFPRVhmV210UkIyQU5ocElVNURFcGtpOTRkb2lOY1lYNUVBQjVHcHJzVk9qeWRNV1RhSWdkNTc1TlduU1Y3ZFAySlp4Ykw1MUNhSVBYTHR4QzJuNklzTkNmM0FYdlFycmI1QnNJcXNDcFo2YTE5ZEdLMk1nM2ZwRGpHZ0pVQlR4MEVpRFFhWFhOcUZxWFlzUWpIWE9HR0V2SUczVHFLMWU3bXNhMkExMnNiNE1KVE9oNEl5bkRCSFYvSUtxK3NWYmZHZ05MM0VTaXZiOEdQdnN1cStKelpPU2pST2pJOFZDTmgyUEdjdDJrQTQ2cnVWd2JwWEIvUko4MEUzeDVjVVhjMGszQlo4M2VLZ3QvcE9LRnYvMUFQOTk4OWZrdjJGaUl3Njd6Ykhpb3ZZMnFrbDJiZDB0M2RvVHlpL3BuVjlqWDJpeHgwYzBRcnNGeXFseFdOMUZhbmUwSExNMlg2R295RnlybFd5MHFxT0JYYkxaYTZOd09MU1R3RGZSZGZkRkladktMK25GWmtKRTlCS1dnTE5yanBVMTcxK0RmTENhR2QwNkNUdFBhV2hnWFoyQisvYTUzSDVJNk1IYkNia1RzL2trRmdDelFWSzRsMStnbjhKOEJWbGhsNkN6d082YTU1K25McDh5czhoNzFpYmNOelpaMHIyTUpoTTljU081dVp0MTEzTHVCVDdmdHZCSkpnZzVvTy90NFpGc2RUako4eVl5ZUhUV2dFNTlxblk4em1nOEU4K2tVOGxFclR1ZXFvM25HZzUrcmxFaUQraWhQcW9xQlFtVWhoZ1lqd1N6S1ZCbW1jRnRTWkVVZFR2Q0Jqc05FN2ZSNzNvT0pBWVhMSEhWT0wyU0NaVXZYYU1WUDcycXo1b25KVnF5dmR5YytkcTVTYy9SMHRxTStjSEZqWW0xSnltWmZybmNsQzJ2OWs4dGpUU2VyVmh6OEt3MUIyRnpEakFDcldFTytMRWxnNG00QktONytYTmc5ZldjMFJlZVhiNEZZL0gxSFUwY2lCNHZUc00xakdmMDBnTzlnSWp1NittcjlXSGt6SSt2L29wZFlkOGhXWExaenZORTZJOEl0M0Q0RVpDWFVzVkRaVFVXUlNjcTlDWFArNmdDRXFINUNUT2VMSW1EalFUTzZyTEFxUEVVU1ROUGtVUVBjUXlTQUpQaC9Ick5jR0UxdDlEV0hEckJzcUc4VkVVQ0ZnNzFVMzgrelUvYXhWbllJUmdmbnRHK3l6b0xzK0VKckdZRDZtblNmRERBSkhFV1puMnNtaDhiWjJFSjBHVVZmbHg4SGd3U0UxRytHYW9tb3BsV2JlelUyamJOOHpFdjRTZTBnRkhVN1hWNzh5bUhGbDF6UmxhMkhFUFhQaXU3ZE9uaXhvM3JucGRkMnI3WGUyYjcxUy9YSDVtWi9uUjZSZFRjTTl4VEhMbTZtbnZDclU2dmlBTUh5czhiOEowT3JLc0VkTVBUYzZ6MVkzbVlSQlpaeXB2Q3NudGEvUmtDck5ld3c0Tm5Cd3N6bmNsdjFwMFl5SlpjWTUxY3pqNHM1T3drSWZkOE1zS1A4b1IwTFJCTnhWek1TOGJKM2dYZ3I4QnVXOHZqdllpZU55S3dxWWlOeHZhdG04Smt4S0xJTmozeGFES1dUUHJ6S1R0RysxZzRmYy9DS1JZalpFR2ZFMGdOOU9leVpzMERJNEdZbnplMjdpV2Rpa1VMdmFtaDlGQ3RHeEZVWlBYemJhdWZKUFN6WDE5TVUwMk5DSTlPMDhneEVSWEdibS9aVlFxNk1xdHYxRHB6Tm96cFdhdXZzTm1YcW9tK2VJVUZyTFZ3eVFvOVJJL0xmNzJ2NTZ5KzRqS1hrNUdHODFsZUJFSFZRS1BFYmh3dHV4a2FSUHFOalE1dUdOb2c2bjdVT25OQloydjZRam41R0x5N1M1OXA3QTNYSXRjbzF1TWM3S2k1QzBmRGVHbzhHb0pWY1g4RGp4WkpJKzB1aUZHdHg2UzlaZ0VGa1J4K1RTNE5jbHBuVThDcXpTeFV3KzFwQzdkb3JNWG9lYVErb3VSYkI2VnI5TUhqQTNQOExDcE9idEk5ZU9MU0RWcUhHeVJlSjVmOVJtd3NxUjI5OEFLcjFuN0VFMHg3eEhtQjFmbWFKa3Q2dTFIQklKTkptVVZFeldPcWhsb01UVWRXOHpzNkVpNlVNZUdHczZ1YnArZGsrWHJHSWxGNlU5MFo3ZUJxRjQ4WjZDZWo1RjY5SGZadUtVR3AzRThWS3MyYnhSazAyT3cwQ1phMHFobzdxb2w0VE9pU0FDckI1YjdaRkNzNktlUnNxemRRc1hNUERvd01ENHdPamhhQXN2NmtIYVMrWXBsQXBnN1Q2TkdvQlV5YXNRaHZONklpeTBlMzU1cmpFV2E3TnllSCtybVpkTnJ3WUh6VENKU2t2VFBIR3dNVXByc1N0bmlGMjBoc0M0OVZRTHI4ak1YWnY1QTBHY0tzMlFUUEJrOWp5REllWjlpNWZ4OVlTbHJCc3o2VGJiS1pZbDltS0R1RUJpQ0dzM2h6NkhRQi9TeFlDVnFKUU1iR05oWUl3ak9wN3Z6dmw3bGR2djVRT2JrcHZKemJ1M0V5dlcxNXc4aVNuc1dFcjRtakFkdElmbUJpeitMRWhyMTdtYkpoeUJXeTczWWxmWk1UWTVPL2QyckhLL1lXTWVWcitPQmtpcFlMRXhmeTFlQ2hMWnNQSGR5eTVSQmZFemtXNWZMN040VDg3aWZrZ242MkhYN3R6WVBoRWdmekpnUnNIT1N4RFJzbVNpT3lOc3ZkcXhUZHEwMnhEdmJtV0llaFFVWXI1Y0ZOUTV2NndmaU5odjNlem80MkIwMndoTlBVM2JEL1o2Myt3OUQvemZvTlF3QzlKUTdxUFBkOWdwMEZBb1E3WlpwUWNEU2pNQWdvREpZSHk2T2xrZUZtSk5xTStsbVN3RU1haHQvU1pKZ2MwUStCbGlPQjVhalprcFNCMkZkWm1PZXB3TlFTQ1lzdTJHekNjOGYxR3dZajU3cVdvYVFubEFWRlJvc3BIZ3NGdko0T2w1eFcwdTVPaHhZcTBGU2xKTDJjV0kvRmxiMkxyM3dwOFI1czVVc3ZmTzBseFh4WWRIL09vRHZ1QlkvRGc5UDZpWFZtSHFaY3M1MXNTZkdXa3k0Mm9sYVRMdVRrMU9vVjlqRDdCZGhOcjU5N0tnaVN4TkVPOXJJTDFhWDVpUG1IQkg4c2ljY0JFQlR5U2Vpa1cyU2lTOVEwaXZIWU5WejMxTWpYciswZ0lhTWczRXJ6STh6eDZTL2tjK2xrcGhjUDRLbDU5dGxvT29relVzekQ1SXNSNHdCRUZFZzdvMi8wUjNkdTIzemo0WTNIOHVYNGRMb3dtdXhkR0IwYTJUZ3lNell6ZDl0dnZPckdCMHViUy9SVmJwOGpITnc1Tm5za250d1pqdllsb3lsWDJEMmFIeGpOOWFYeTVVTjdxKzMwcDY5KzVQVGVrVTI5Q1VFZk41Ni9nVDdPbzFhY1ZKV1IvWXp6VXFBOURGOUdMbFJWUG13TXd6RHJMc0lyRVl4ZThKcVZiV3BucDgyQkRBdWJOMSs4Nzc3NmFKMEsxNFIvc3ptaWdhMStCV01zcE1lSlNzTGtOWG83YXJZT3dLb0xzTUs5b0plYjl2RGhaUnVtSkJNMDIzazZqb0dlV1JZeTB0VEthZ0R0bFJObXF5VzlDeXdCb29XMWNORHZjYmUzZ1ltckVoWExGb1ZBY0dxd2hJSVM2TXpONC9rZlM0Y1AzMzN4cnU5ZmpDNldkcCs0dUxHVUhQZEszb01IMy9DR0YvNmRmYW42WEdHd2NWaXdEallDc2FlNHZ2SVJvVk8vbTVBNW9haDBvUkFIMFg0Sm1DdkFxMG1ZK2o4ZTZZdVNKRlM2WFA5Z0NTblRXSlZrZFhYMXJ3QnlINWV4SHpGcWt0d056WnRxa2tCUEsvV2cxcWxKOG5XQU1Namw1VWVNbWlRSUMzWWhVWk1FeTVGSXFNOWM0aFVKbERxQXJjdVNJTXkveFhvYVhCWjh4S2hMY2dKZXFlaWp2Q2dKazA1aVNGYUFsNVV3Z1Yyck1nbW5xeEhmQlpyL0crQzM5U084WEM1bTFLYXlxYlNOdGFrb0lRQ24vd2ZlK3F3MUwxaVhaQzk4c2xmTVRKZ1lneFNJTlU1TjBLeGNRbG5UM0hoYWxRTGh0bjJPL2luN1B0ajJiK0MxU3g0aHY0SlhEdXZYSmFqR2VuaStnbE8yUzRnL0VyUjd0ODNCekJHZzlGZFB0VkZlZ2FvNzVuSGpnSHJ6bVZTczJGMFU5S2tmbnN2d21hMytHMEFMY2wzMEkwWU5FNXpIb3Q3THo2TkZpb2pjUEh2TmRWZEFGL0d2ZHBHLzR2RnRTWElyK3R5WUhPQTJTaHUwTXlxWjlLaDFzVzZLRWpRY2ZZYmZMNEVoS2pGZU4wVTYyNnFsalBZZkphYTNyWFZBbkxlVnY5cGRzb0x6bXZ6Uy9YWEJlbGVmYkhKQzg5QTlvTkdmQXk0YjYzZzlzbm92UExoQmIyK3NnU0o0b3Rzb3Q3Rml4akpGR3hnV3N3M3JhcVZnUTdXUk9WcVVTOEgxQnJ3aDF0dEg2OVlieUdUMDdqRWVUNEFsR0xCU0NyeUZ3b0k3RXB2TWZhTmlpaS9sVFd1aXB0dE05YnNZL3dkd0h6Vnk1OTRPN1EvcExpeVlnckdBV05waDFuQzBjM3RBWWN3b2tGTXIrK0dybGYwd0cxQlI4c09xbWVJWGFScFd6Q0VRZDAzTi91QzZOZnY5VFFHSDlNcXpScmdoVUpQTFR1bTNBUWVOeklnOUlNQ3ZKY0dNQVZFMXBqNEdxdTZCRlhHeHBMZkpzcXpKR2c5UjZTcDRTMXJLQzVMOTA0OTk0TFR6b3ZUYmwxRndYeDBYTXVVNmdQRjY3b043ckVQVWFua0FIbXpXSFRLdlRBeFRNU3ZjYXAzRXFNQVFzR2EvM1lnUlBtL005eWZkSG85azVEN0VxdDhsLzUzUHhXTjhEMGova3BDeHAyVnFUVUNueU9vMzBrd2phS081UkJHZzA4M2dURHp2cnNPem0veTM2bGZRSDRUMndDektMbngzeFpUelFuNTZaTEdrY1h1RWJ3VjQzMG5DZXREcGdPMEVZMjloWW94NHpoQ1A1NnhnT0toZmc5MVBvOGN2SGoxNjhUZ3RUZFA5M3VxUHR0K3l2Zm9FZFV6elhDd2UyNHR5OUUyV3oraWRTREdKZU91aUpIdUlxaEJGSlpZUDFqUlBOVE5rVXF5eXRKbGlKZG8xQmxGYWJmV0VVWk1iYmZiV2JVRDNjc01HRWd6NHFZL0N1a2g1YkxYOE1ZN3p0eTJjMGRjRE9nZFdCalR4bGd5OGt5YmVYSFZvd054bVlaTTFrVFliTmFKa3MySS9nMzQvcktDSUg5UHVneVplZFhsdHNHYkJ0amZ3d2pYN08vRGczRnBxeHRZUWtOY3BYQVoxSjRKTy9tNVJuL0QwZXJScFJScUxMczlhZE1FS2lwL1JBMG1nU3dEc0pSTUxlVDVCbFZtekpJRlpidFJtNDVaSnRKNUU5c2JKN1NXbW42N1d1QkZENndWZVRzK3F1c3pmYWQxeUNROHJhS0VYVHo3RG9iVTA1WEd5bkQvZkxQaHpKeUduYWtkRlJGYUlkVlJrUk5DcWRSRzB0YU1pd28rS1dqUUJhZ2I4ZUc0Z1VoV3hPRWlxVU5mMzk2eStZMWt1Mll1RlRGcVdaelhNeUNWWXZhWWxXRXlCN00wbEJwSURKbHhiSTl4bkxiaGhnRHV0YjB2eXpGeCszSUVqcTF0cUhMaFdCendCd0JPNVJBNTlyaVo0dTVXM0p1QS9aOEdQdHhHc1hPOVE3UkllY0dpMEViQ3REdkJBUCtJOU90SS9QakJlbjhDWnp6Z1JQTnJCejB2dm9WZEJkdldUQ2ZJKzRkYnZBR05malllQSticGdqOE5hS2ZpSnZlNFR3LytmQW1aamtzYk8yeDBNNDFtUXplSzduVFpZc1BKSnZQTW5Kb3ZnTTlGS3hNYUlSc1J1YjkwZWpJSEJnWHl1WEJxWUdKd285T1g2OC8zcFROS2ZUcmRoWktoaFJhOFg1WUl1bFl6aEUyb09wOTU4THRGelptUHA4R1M2K3BnWjJySThNYm1TVEp6ZmpDSFc3RDdETzFTZDM3eTQxd3EyTGc4TWxPdmpXY1lIQml2NW1lWHY4SWlXVDF2aDF5MTRPMVFsNUlJcFJ3MG1hSjZzUnVaT2FFYW1OSkhYNVc0L1o1WjBBbGk4bmhPTi92VzYvaE9EaEp3Vi9TZXhYM2taQS9uWFk1VUk2bzJZWDAyd2JrL0xKdEI1d0ovblhGcGJYczE4K3JUVmZ4VFd3WVEreHVzQVlQKytkY2JkZWtDbW4wYkUxVWRJaGd5aTd3RFp6dHZSeG1UU1greUpneXdJQXlSUno2ZnBVMG14K0xUTGNzRGl1a09Ga1JlY2l6R3VDdGVlOGRSR280V1pxKzNMd1RDeWc3bkJkQkpON2J3M3oyUGoxNnZzbzFWOEFYd0lqQ2NDK25Qd2NFaVBKNUVGOHpQZDhjV3Q4UlQvZlVkM3ZLZk4rYWVkV2YvbVBZOXUzdVBDWDVXRjVQVWw1THFBTnd1L2ptS1VmOENYcVlZSHZUOXd0bDMvZyt1bkkwUDRXMHU1RThrVGNyL2VQZ0E4bE9SV1REK1ZEVzA1YjlZSkEvT0ZXK0RSZGJrZzIxeGE3QnE4VUNtUERLR3NYOHNMR0RmLys1d1gzeWJrUEh6OFczcWJBNVFzdDFPdWk2Q1BOMHI5V2ppOWtXWWFxVzBPS0UrTlpvMEI5bVpUYTNNUUdiRXRtaXp4YWhOWWNwZDZxQ2ZyOVpnNXR5T0E1Vzl5SFVUZ20vd09JZmZxblQ2Z1pRMW55Y0E1WWVKc3hoSFVzTlpNVkRJbXdtYWJSbncwVXg4T2VMMlVlcnU4WFZ3QkVFalpSUTJpN3VwM01mZkF3aWtOWnVvYlc5RXcya3kyaHRvYnBzYlhnaUNOTlRwaVpuMldsMEU2WGhjRWN4TDRYUCttbUdzRjVFNVRoUmd1aEJybnNGWEdBaGJZV2xOdktINnRPakZXLzkrMitrLytiNzcvTmxVeU1qdlhyRGxiQzN4Tk1TTWo1OExCY3k0MmsxZlUxVFBhQ09yWEVLaVpnenpVU1lSOEpFQmk4UUl2QlBWVVVmaFhrYTJLUTNIR3EwRkJHNEtWWGRadHRLUTcwcGswbGlMQ0xNYVhrcjJocmx1SjZGb3BIZWNYMXNhQmpDMWZNOFZEUDZvMUJZU2NrRlBXSER4cnpVSFluSU9HQ2tTOG1oUVcyREdVb1pjNEI2TDJETTZCQlQ5OUkxbFRoU2hXWDRVby9sS3JFRjJMdTBRZXl3UHN0MGdjczVTNnFJMkVxZDNHNWgxMkpzMnFGSXdDWXFQa1BLYjdDaHNYRm83TlpqOEoyazNNdnRBZFRXRTJxaWpLRXk5VWVQUkN6VDNiSXIyRko3Zzg5bGhkaXN1TmN5ZDVqc3ZKdVgyMUxCZkc4ZnFzbEFaZWl1RE5TSDZxVUZGSjNXSEhnS0paYk1QZFlXd1pNMHlDVnVIMG1Db1NiYkMyYXF4QUsxcEtXaWZiaGk3Y2tUcjA1MDBwTjFLSC81dlZrZFo1TjNGWUo1anowMC9lcEljdzU2ZmdZWXJjUTIzMk9Kb3J3cGt0RmtvUldOOXVVMjhuZGh2OHZJL1lNRC9oM0RxSlFhaEJRbk5GdFY5NlNlMlg5UGErZkNidDluT25PS2Q4eXlHdXQyVHEwNHhHL1d1V1NOZndhSFBpMFZqamtqam41TFo0SEhnVzZBRTgrM2JEZm53UTZMU2lkM2lBTmw2ZUQ0VzNOQnFtVzZMbGFCb3J5WFViRmVUV0hialQ3Ukd6SzRxVVkwN2dtRlZ6NEZiZGg5bVN2SzZBbDljVllNTG5NY0xyTjFGam42OGRSZnQ1SG5zWHY1VUlRM2pZdzYwYThlaThwZ1RDREY0VkdMUUtDNnlUUDJnV0ZsaVRQL2dWNmUzZTZqZVR1Ym9Nd2wreU0xWUdJZENXNTNqeFBlY2RZcy9aUU1pN2RLZU5aM3U1YXRsZVBRME9ESzFGNmxjclI0ZldPaG1zd2RHeFRwc21SNGZibTdhWk1TMEM1KzlaT01kQ2hOeWhlK3B3NXNXaFRGcyt5bThqdzBvNXJkRFdlOVk4WHBPNkJob2FWa1RCYWxJbU1tWWNqOERsV1F1WE1PQnluOTRSQUhnMmZpaFhSOE1rK2xGRUZSc1JYOVFLbmV3NmpkWWd0ZGJwQW1nNUdtbjBuSVZYZkJYeFdqdXZDWDdkR1lnMERDc0lvUHRoTFVxWjFtM1dZQlJERzVuU2V2dll4S3V0RWE4YXY0WCtrNUQzdDhMTHJQY2orbHlmNFRLdEc2N2h1S1I1M1Jrb1JPdXpuSjhUTmVRSHZtdVlhUXYzVWgzdWlTUWg3Mm1CZXh4UkVhWmFhNG9hcW5pclptdFhDanpINnc4VTlieDlmYlFwalhJK3FLMFdoL0I5Q1hvL2JlRWNCZjY4clFYTzNkelJoaGo1V2hJYmxjNDFEZFl1bEhYSWg3bWtYU3hNcjVBYytiaVJLbzhYZVdHeENnZVBNWVdOTndkZHpVV3NCMUxqZ3lXelBCN2xWUWZBc2p4bDFJZXVxeFZtbmR2d05vYi9VS0RYV0ZNc1p0UVVhOVdTVTlTQm1leitUQVkzOThRNk9RWDFOMlppSGlzanpWa0VQSkgxb3NocWJUcXNNVkphYXptdU5SNmpQRzlBekZjUHpOZkRMZVlMSFpRMlRiV3RpTnZqcUthc3RGeTd2ZXUzK3pYV2IwM2VSU0tFL0tFZU5IMnBpS2NrOEd4eXBqYjZSOWRmRmIzck4xNnpOdFk0VTYrNVFocWNxZld5a3VjQzgzWDkyMGI5cVRmaW1kS256ZEpqQXJGSXc4N1dtQ29jcVQwMUh0VFhVTU5pS3ZWbDFHcDlQbWYwQ2ZKNVA4SHFYR2FYdklTYUpYR2JPcnRXSGJYR3NZQjhuU0xrZU5OSW9xYkkxRnBCcnowMkhqU1VXbHZTTzVxcnJkV041MW1yMy9CTkJPL3VxYSsyWm12YzJCcTdYVk53RFdEeW5HYytsbmNKM1NSTHlESGQyYUV3aWJRYnh3YmlDTFBlOWJFbUk1b1hGS3F2VDkvd2xGc3FtUlNXWlROdEpOSHZzMWEvWVptZzFZSVZJcTIrRFJ1czVwQmVBOWlvRnVsRDJMWW0yTTlac0RGUGRFcmZXamNtWGpYU2NrZXZBZHRjUWhEQkc3SyttVjZoLzBYSW1SYjBpcHRPVkxWMUZ4R1VzcGIvdEFYRjJrV0pSeS8yYlp6TDhueHgzdmU3eFZ3NU1CN05VYXVDdG83N3FUNmJmQjMzVTRzbTNJWFNYUEdOMDFmZzhXMExqK1FQQ0puWGR6VldmRnZyVXFycjQ4UzFpNzVaZlR4bjlkRjltR0NWNE5wWTZ4TW1XdUsvZnMyM2JqcEM3MmFmNC9rRTc1NTdLdmxmcmZtVzVPdmNURlZTc015YlFxeDB1M0hHSTRwTS9yV2F3UkFhVzdVdStHYXZpMkZveXIvenIwbTIrNE10aTlmTmRnMkhpb1d1OFV4aVlHOXU5M1ZId3VPSCtsS1JBYSt2MkpVcDBKSHRvMk5iN0k1VUp0UFpPZVgzelcyL21ncjQ3Z3AxZDdSdnNkdGlvaTVNRHgybW53RzZZRjJZS0w4amhFcjByRmxsQ1RCTlovTnAyUjR1ZUp1cXdXVE1zd3ZBcUtkbmJLNVFtS3YwOUZUdzUxZ1AxYWVHaHJadkd4N2VUbi9aTjF1Snh5dXpmWDJ6WS9INDJHeGZhV2FtQkY5QUhPejdkZXpQU1F6dlBtaXV3V1pjaXlUakJrMld6R2dkUXZjMjFHRlRnV0xYcU1QMjc1R2hRQ1crdDJqMlBiQS9OdTR2UllmMHJmVCtZR0JEUEkwZjRzTjBmRk13aEhoWmRkaU0yaS8zR0NkT2JyTUFET1VGWUNJTm4rRGRkSVluUDdTbU5JekVhdkxmZW1SNU4ydjVKWjIxK212ZWZFclR1dFltbDVUK3F3WFl0bFNkOWJrazNEZVB0ZVpBcmxCVnlKVjloSHpKR0tzSFJoYUxZaGFVT2RhNlQrckdtckZ5SEhEZmFSNjRUYkl5aG9UK3NVNWpXek1wK0FGNUxSRmsvWWFnZnZnYTA0ZTgrYlFoUzhUNHZtZU5MelpFeUg4VGFBZWF4bWRraFVRYUhraTFCMll1VVYzYXlEb2p4YVQ3dFczVzRxMkgwaW5VbXpDM3BBNTFoK0hyRjdnL2ErRWVCdHcvYkp3c1lkSkhBLzR5bml3MWZZclg2eHBZNStweVEzZ1ZqaWJjN1JidWhmVmIydGVPSUp5Q0VaaHBKSFZqY0RhTTRUbHJESEZRWkg3dlpmSlh0akhQcEJsMWg0VjYzN29OSFdzeDc4SE1GRXJyTTFQcThIYzE0RjliSHlFYklYL3hjdkUzTTB0YTQ5KzBRUHJXYmQxaWhlUWFzbEN1dVVSQ2ZLWjRnc2k2dlBhME5jNG84Tm83WCtZNFUzVTVLdXV2alZ6clZxMVd4L29ZVzNrZ1l5Q2ZjMlNVZk0wUXUyNndMd1lIZ0lGOUZQTmRxUVE3dml6eFlobldJd3BLYysySkQ4YUMxbStLbi94b21vVTJ4Z0RZRkdaVTlPS25rUW01bHZqSUk5ek90bjVCSkQ2dWFXRVRDVFBZenBvV0R5R2w0V0lmRENLWHlYb3hnUzNTU3VDM01KR3Z2UWMwbWNyVkw2Ni9KVFJaenJVZHd1UUx0SmNOdnVnQnZ2all5K1NMUHFJUnUwMnpyN1JSbXhOZzJOU1Y5ZGZ3d0RVYi81cnJ1Q1pMSXlPRS9GU2dGeG1DTlpTbU5udkRlSlQ1UVlxYlFhdW5rdkcwYm53aTdjUnVOMjRUWDNkOFlvMFBYUE1OeDlwMVhnUUwzRzVUN1N2V2k5ZWl5UkplYURkUkdSM3BMNkJ1MlNpVUpaSll6YkJ0cklkc0pEdklJWEpjUDlvTytsUUhWWmtmaGpyUnd5VHR1aEt6d3hpeDN1a2NCaFNxbEswWWFWSllXY0p1ayszblRUYU83elk5Q1FsbFlkL2kvT3pNbEw0bFhlbk4rdEtZR2V1dGk0U3hLc2pWd2hEVXVyUEJXa2w1L3IxZXN4VGxZSXlqUlhocGMzTFQzb0doL2QzdGxhek5wVGxDTG0vUzZmWW1OKzRkZENjNnZNRkk5QTkzN0huODhpdGV1M0dzSnpuV1g5NUtGN1lPRFczVmg0ZTJWcS9PYk50L0toejVVSnZmRVlyUWJibXBVaXdlR1JoazdJUXN1ZG9DNVZoK2FqZ3F5MXF3M2UyaE5tbmp5TnpTcHZGWTBlSHFpeVpISElHbHNmN05tL3NITm0rdXZpdWV5TVk3dmNCTWpHb1JyRlhONllxNlJxZlFOWHlFdkZLL280UGkzY1VxQ3dCMU55U0F1Z2RIT1hYdFNOMHpwNDlkTHp0bTI2aURnTEhsWEhsWjFENnlkSEo1NmR5UmMvdjM3cDdiTWIxMWtsTTk0eko5QmdLZlp5MTh3b0RQUGZwZFI2Q2YxamlwQWlkWEczTTRxZE5CTDYyTGpkTVoyTjBTcGFXbHBlV2w1ZVBIcmovYWlGUTdSMG9XT1BGOHBra3lSNDVpVGhjV3BmQlNtOXhGN2JiTmFhYllseXJNcVNvaVV0ekthd0poYXNNb2FqdFJWTHVDSGltblEzVml2cE9ackdmVW0waG9Dd2NQTEM3TTdwemFKcnAyZDdacDNUeS9pZjUvd290MFlXWHZZdlhULzVjNGtxMThxZXIrdjhXVXBJNFBualA0QU9OK0g4SzdKUFZicnNtWjY4MDlzS3JEZVhKOURqaXlkT0w0MHBraloxb3dKY2FLd01aOW5EMVBzdVIxUEtmaERmU2RoRmNzNjhCY0srellRVFhHYzYyd25vNzRZMGs4THZLamNCdFBkWEJTM0ZiRjc2SzhjcHREa25qd3FMaGMzTGdMczY5V290bHBwb3F0OTRhZXh6RnJNT1lYYXdvU05wekpoTHN5K1F6b3ZlSjZkMUhQMmUwU3ZqVWM1MkxkT0IvajQxelcyNkpkZUxtWG82NktkS3gxRlduTnhDclNxb3kwOFhSSmQzcU1qc1ZKS3NhaXhWYi9nNzJWZlpIclJWc3hYMmJMeGtJbW1laU91S0JyR1hOQU1icCtWOHU3MGlZcXBlRkNGcXM3WnJTc2lGVGtTNkNTcmVWVVlBd0hyQ0dlNFJvSVlIWmFaY3lJWVpTc3NsMmFxckszYmcrWEk0V2J0OXowOE9TY2tvamNzTGo3VEtsY1NpNzIrdUwyTSsyRmFMUlNQUjZJRHNaai9UMnAvc1dGcmRtcDJNaHlYaDdxblZ6MEZnS1ovQzFMazB1OVV0K08zdGxUUzFPRHUrUHh6TzVzNnJyaHptMjNGRUpGK3RXdTRXVFVXNGowRkFhckQ0eE9ocm9Hamcrd2FGbWM4WjlrZStodDdGdEFqZmpIMVROVHVnK3Y4NkhvN25wbFhaV0VqNnRreWh0TTVhN2NzL0lCOXEzTGw4Vzc3NE4zZjUrLzI4WGZiVGR5Qk9ncjNaME1LSU52MFpLV290SEhQbkFhWHVQM3hRTk5QOFdlQmJHVTQrOUVLVDlSNEVsbG1ETEJ1K1c1WXJJSlFlU0wwV01pT1l6Tll6NFk3MzhIMjBuL0JHQUZ5VGlIMWUvaXdOREIyRWJKTE1FVW95VWNCU093TE1VVndKVHRUV1ZTdklvcUgxUk9IR2lYYWs0Um1KMUhwenNtZWdPOTJVUkhwOWN4M1RHV0QvUm1FaDJlQU52WnNXbUxOK0NOWmpvMjRzK1lvTU1kN0FiNk8reHBvSU14SnFRaG9ZZFE3Y0Nya1NqZXZOMUFTK3BQbE9udlZQK2FQVDA3SzJBY0JycDhuSDJQdU1nZ2g1RjJPa0FwSnJOTStITll2VC9IcGhJWGRVbGFRTUNxeGN0V2dNdVUzR2piZE1mUmJkdVBkTTYwbGRoanhZSm5jc2VPU1UraHlQdTVqaDBoejdMbmlOUEVsV2NyTFBHc1N1eUxBSHlSSVdUQ3I4OFNla2MwazRsR01obDJKQk9OcHRQUmFBYnRpN3ZZRWZvNURqTklTaHhxWHVJVVdNSXJZYkNpUHBZMUpYdXhMTGZYM1JaMEJXdlZ3SnQ3S05YOS9wbElOaHNKWjdNZng1OE52ZFo2eC83ZnlMYlRlNlVpNzMrQzl6OWdabkJqYWg1aFN3cFA1SlpSUHF5TEJhM3JPVmNYYTB5VjRabnBrZUdabWVGb0podUJ2dG4ycWVIaDdkdUhoNmRLMldna0M3aGtCUjZIUUpLNStYclFTSWJqRVJiVGQ0aFAzeklTaGU3Qm04MHM5b1BWa1lHdjUyNTl4ekc2NitMamg5bTNIbnJvSWJGT0ZtR2RmTHQrblpoWlJjWWFhMTRuWG94YlRlVStkdmpRNGJzdTNzMitiU3dUYVA2YjlEdXdQWHdEOE9vWGt0UkpqRHU3QW5nR2lac2Q0R2g0aUFIRHBhZkYra1hzM24xVGRqZjd4bjl5T0tucWQ4bm5WajhvNE1RNEhNT3JITGttbkNEQU9RcDcvK0V2Q1h6ZXYrcWdiK1hYYlYvZ1kzT0FwY2xVSHFVZ29vbmlCQk5tNU52UnBVbnhHblNMUjAvaCsvdTRaMTdDZ2p5WDFtdXk5R20zTzUxSll0bGNKSTZ5Tmk0SWczenBXNXR1VEJ2dkdDaS9wZjZ1dEMxUzBjQzVpeDdEdXNHa3dISHVjZkQ1OE5wNWxYWmNvc1Jhb2NBaXhweTBPckdsMnh0TXpnMWI2ODNLdmwxNVFhUFIxWitSUHlXdkZ6bEVyT0ZhamRyeXJJelVWTEJYWXpJZWZMMiswQjN2NjR0M0c3R09IYXRIeU9lQUpoSUo2ZjdtQ1JMVFV5bEpxWDIzbjlwL3F2cHo4MDVaNkpzUjBJTnlYQS9DNzY4U2QzTkw3Q1N1cGNhYlB0cGRqUG84cmxCN3FDRUhsTmlnN3kvRCtzc0JCRHQ5RlY2MzhBdUN1V3NpV2ZFMEZ6b0lLRTRYR01YekRmRytZcndQZUxEZkJ4cHdQRGlVS3dJZitrUDRlMGp2dDhrYVV4V2UxNG1YR3dBcTRTNUVSaWdhOVNqWlJlSTZJMlVZMjUvQXVwSklCMlpyeXRSY0NidXR3Y1hZZ2lJVDRyVExIVW9IRjlzcWlPMktWSkswT2hHeDZMclZWWWoyOWtiaDYyK1lkUFhxZDN0anNWNzg0djJNcmY0VDBQQkx2Sjg1OHhKYXM0ZW9PSTdoK2FGb3RmcGtMaTdKNlZvTGllZTdya1VETDMycm4vWW42OUNnUDdoNmxVbU5lRVJXZjBiL25uMGVWSlpldkRmRTYyRjh1OFZUQzRMMU1hbVJhNGtacTl4MUU1TVg0dDJaVkhkdnZEZlQ2OE9MWlVEcFZZT3BMT2cycHZhaTVjd3dNRldxdzRYZUZPc0pzV055WW1BZ0dkczIzRDhYUEpSOHpmekE0b2JFeUorWktDNzdnNlhjNUVJeUZTNTI1VVlIZXd2YjVxSkQyN1BsM2RVckRYZ1hWMzlCL3hOME04VDcyS2Z3dmhaK0szZmN2S1hOREhyblo0SXdpbFBFQ1AvdlJqc0l0cHRMOWExcURaYjA5cWJoZVdGWXVWSUF0TFhHeFlwdXBiSDZyZW05djhib3FOTWFIU1Y1K24zeWQreEg5ZkxZa0tNQnd1VW8xeDZJcFR4WThqamxMYjBMRmlyOVByWHhHSGVBODgvc1I3QWk4aVRGSG4zcDB0M05qSHdNaHJqUTkzQmNORElxM25kWnU1WEF4eXMyODBOOE0xL21Tc0tlcFUrWjJ4Z2laU0oycjRGYzllZlVKdkNqSHdEWU9jRHZIOW1qRnA1bVB4WkFnYW0zeFdiSiszSEw0bHpaa0dVb1J3RDNWdkxNR0pob0MxcnNLZDczWjdsVmorL0UxdHVSZVJkSWJBL1E5TTg0UGNZRWxtM0VETTNreFBDczFlMldkRWQ5UVRGdlNucG95LzVqN0VkSUJVNWpnRWtmTkdnOEk2QjJpUDRWU1pZTXdFSCtPNElXSDFxVTFqMWd6UkRNc1FWUlZ5Y0dwSVRSRXkxdE9XQjBaM1FKNzRGcVJPK2xWNGhDZXZRWXBzSlN2SjZrb1FTYVFoUVBZa3cxME93cjlPNi8rKzRkMy9zZXZmTHpxNy82cFlBeEFOOHUxOEhBSmNnWEhBSVNsNXVZTUhqMWVHMllneEFBeE4xMzdOWHdmcGFPYzdrOVRxcWlsb0RUQmlvaFlpU0dpZ0E1VW1DcVVxMU5hM1BnT2JMcUZVbnlEUEZnRDNBOG5QZzJyMll2cmx2aGFkTWNCcUFEUmpaUm5hclRidU5vSVprU0hDM3huUTV3N0twdnM1QVVpTkxWYjZ3TzBhK3haMFNkT0g0SktRNndpOWJYaWROb2lZN1FOOTlTdmUwdnBVZGZlQVduVDNaMWlQWHg5N3k0YVBFK05VSzZ5SUpZclVxS2xsamZIZFZiNzRBM2VQdGJWZ2ZJdDE2a242Qzc1TDdsM0RlbE43NXd1N0J4eVBkcG5QNFpqRHorSXJwNnBVNVVmYUtvNjhYK3ljbnZUdzRNNnZyZ3dDU2ZqODNrcjhtWDZYbStvOXZKZDNCVzE1b1hqSW9kVXhMMU1TZkl2OUczMDdscjZRL2VoRDh4UWErdi9pNmRXK1k0NHpzL2ZTbnYvRkYxdXU0ZDl1QkxlSWZOWHYxVTNUdlNiUy9oSGFueXdwZjVPMGdEV0cxZnBoOEUvcG9HbTc4bEJTUm0xNWhMY2tsbWZkUUoyZzgwZUJUZW1ZRjNyaTEzc08xUGVkc2RMNlV0akJuYjdud3BiV0dzMkhiWHRkdkNIOU9yU1hvSDdKMHVvbjdDS2RHUlFtV1U3Mm5vdGRPeTJlblgzTG5weElVTEp6YmQrWm9yNy94L2QrN2MvUFZMOTM5dDg2NmRQOFozQy9EdVV2MjdHUi9mN3RHTmgrYmxVdTNsbnphK2pEV0JldWsrNEcrTjg2cVJ3aStTQkplTmxXRnNHa3JDamZjWmwraSs2bzlwKzVOUC9vMzB0aU5YRTloL0NXQnN0V0FZYi9LSzFSd2FMQlpyNHdFWWVEZE1pYlpYZi96a2sreVpGMjQrd3Y0ZVlTUlhVL1IyOWdXUUc1UDZwZ1RQbnBPVUltV1NCZ1lnRnNOVTV0RnNJRmpCVWxGcW1vUVpscG5KSlRLWkZGNWNrdEhVUU5EUzNrRUJBc09oREJwQ0xwZXRSVTZBZGhRTWNBK1BOK2VPRnpxam5lNWdJWEIwTVo3MFpvZm01b2F5M21Tbm10aytFSURGRFE4TGNYZk9XOXF3b1hUZ2xvRk5WRkgzMjJ4M0hqNHhPbjFvZXZSRWNhNFN0OW4yS3lyZFBIRHp4QkZYK3hGaEM2VG9RK1o0TUxKUkEzbGVCS3NuU1JVcHdTTnRjRFFLazg2Ym8rRG5KT1pSWEcwOG9PdGtjMWFRREdnOGdWTEpqNW1Od1lCdzdhS0JOSWJEUTkvVTIxN1djT2piWCtwNE50QnArbDZZWXpmYUFqeXVDV3ZhWUhFQWwxQk9qZXNweVVMSWc0dVk1b0twaXBhcjVDckJYRW1yQkxVZ2ZlVjV0b3Vlejk5MmEvNGMzY1hPOWQ1NkczM04xTDMzVHVuVDA1TlRyNzU3KytUMHROakRodURiVzZFdko5NDNiSlMwTUxVYm8zaWZZbHlFd2k4ZEY4WDRNTHVreEt1U1B2M1FRMGNmZkpCK2VQR3puMTJzWHRjSTB5dnVWNll3SlhaMHZjdXlqK2ZCaXZvdmVPQmt0L3Z0eG9WcmJ2T2ZVNHNYU2xibVVNbktISUtlZUY4UFB2alp2ZS9FN3Q2NTk3TkNSOXV3K2pXbXd2eVhZRGNZMUlzOU1QUERpU0RzZ3BMS3cxejV0a0RPbWdVR3dYWUFCVGVhU1hMdnBHWDRWdXBUemlycko1NEZBam51dHF3NTd2RWgvZnFadllQSEM0WDh6bmltRUUyZVhaZ3NGYjNlTTN2N2w0dkYvSTU0dHRDZGdNOUcrcjNlMTRLcWt1cExaVy9EbjczSjNQSzJ2Wkd1blYwaG1vb0Y0MjJweVBieGdlMmRuc0hvOW4zUnJwMmhVTEk3Mk9NVW43bzlnN2VEWGFMa1krR01LOHQvNnc2blhYeDNCQ3VjSFFTYXR4TVBpZUE2d0Z3QVZVTGZPMW5CODJKRDJKaDFDM3plamc3UUR2emVpQy9TNGVud3VEdmgxWGEzTzUxb0E5bVJjQXVMcFpUQTZ3UGQzbkxLbjRMNUVQNmVpZDR6bCs0N1MzY2NPMzM2OUJ2Nis4ZW5wNm5qcnVPbjc3NDZSUjNWNSttNVgvemlGOU9WaVNuRFRxZkg2WThCTDh0UG8xQ2hKbEVpcnZJMS9UUnV5MCtEK3JJa2pUNTEvS2xqRHp3QXJ4K3ZQa0hWcXFGejlkTTR5OU92d3hqSE9MeUNUUU9HQ3ZnWjNsSnRTSzJWdFE2SGpPWFJwTUdHRkhweExZU3g0R25iM2tERUVVM0llK3d6WTc2QjBHSW83SXowS1B5dkl2MUVyOVBlMjJmZmZhRE4xY2QvVzlpUHRLZXJxNnZINlRkWG4zb1ovazBGL1p2ZnJQWXY3dHVIT2d6WTY1L2crbS9aMEtrWnJUZFIzSFY3R1JOcWY2TktEYWIzZGUwM2RkQWZVcVg2SytHakFKajBETURNMG1OY3R6eEc4SUtpS1VPN3JsT2hSUmYrQnJWZnFOcllqV2U5dWt5VjFkdllYN0x0WkR2WlR4TnpUM2t4RGdxalBCZW81TmdLcG5PV0ttQmJxQmorYUVSSndWUFc0cW41d043MFlHbEpRQzNDVmlkVFRWN0JrVHNrNmxpeFU4bm1aRVNSeUExRVVWVmx5VWoxVTlTOVJsOGxnaWNqekhISmZKZThoRmYxOFZadjJlRXRZcGVJZlltcyt5cVdrYWRrMytMT21jbk41VktoTjUwTWh6eWRyamE3UnJiVDdXMVl1RHhabnp5dkNpY2J1dExibWQvWDRGMHZONFJGb25ReGdqU3ovT3dFSXpTT2IxZ005MjlPaFFjOThteE9EVVVITnVkM25CemZ0TEs3V054OTAyUmhNZVV2SEJtYWUrMngwZEhyWHpzN2RlZkI0ZkNnbmswTXV3S2pSd2N5N2xRSFNHQlBXNjRyTno2OHREV3piVGpxN1F4OE1kNXovWFRsK0hSdStNQXJ0bTI5WlUrL3oxc0tCTXJISHBoYmZQM3A4Y0Y5dDIwZDJyY3hFZkQ2QSs4cmxEdmFiVDdIS2E5UFJ6NnJyUDRVK09DTHdHSElyZy9Sa01FTGJVREtQVERiMjJCU2N6Q3ArUVplZ0tlc3hWUHpnYjNwZ2NrTGhmcjVrMlh6V2dDSHc3eXNzUzdwMCtocXNQVXJQRU1VM3lQTnIrbWphNmI3SmJ3bWJoTFl2M2ZYRG4zTDJLaTQvOVRyYnNkaVcxTnNpcGZobEVCM3U4TCtBWFJITDhtUmFiS2J5NHB0UTZCL2JSNW1xcktGYXFxRW16dVlmb3pmdTZISy9IeGFrekQrRDlhcnRHVFVuNUZBcEtVemVmaVh0bW5kUW1xdUNhZXRaNjh0OEhkVEtHc2R6NVhLMTkrM2MrZDkxNWZObit4Vi9Rc3JtemF1N083djM3MnljZFBLUW45MUxEcTRMWk9mRFE5NSs3c0tHemNXUXdYZllHUkhQck50TUVxUHoxMCtPVDUrOHFINStZZnc1K1U1L2JiOVEwUDdiOU9ObjF0ejB5T3hSR3dzRU5nMlBMek5IeGlMOWNSR3VQNGhreklkcFgvRXZzSGpoZnZKR1BrWVV1V1RNTzEyYWppN3kyMllqOEJzeXUxNGFBR2JPdERHUlcxMkdhTmVNRTlXUGU4VXB4aE9mb3JoNEtjWUVYMU12S2ZpWFF3djQ4VWxQVGM0ME5QajkxRXlNalF3TmpqVzA5L1RYeXowOWFZUzRqSkxwNTE0cWJmZE9wdHBYTFAxSnlPNXNuSE9HVXpsVXY0S3FESDg0Yzk3ZDVTN3U4czdlczJmMnc0ZDJyYnQ0RUc2RU8xeHQvY1ZNNUh1N3Bpcm81Mk9pdkJuTXd5NjB0TjdiTWVPWThkMnpCemY4VXhQcERPbTdaNmFldmQ0aDh2VklmU2dQdm9rTzg5MU9TOHA2VU9nTXpLWktYUWVhMzhvN0dIMGNpZ0tPWVEvQ2M5bkl3cjM3ZmpjR1AvY1hhQjR3WjBiVmNrZzJPYWdjcVhLS1RxOVkyNTJwc0tPSHFOajFYLzZ6Nk1ianJKbjN2ZSs2Zy8vNG8vLzZPczBXUHJlOTRDMmZjRFhId08rSHNZN0NiSVpwdGxkYmJDMU15eXE2c1FBVnZXOGd2VTgwY3R5bnRqdC9FUzhkcDFIVEZvWUhPZ3Y5dVdUN29EYmswbTZ2VzJnQW5wOVBqd1hhZGlzUVNITWpwWkhSeXZ3eTFpZGRxWkJROVgzZmZwYzhETytHM2FWam5UdjZyOTM3bzdmN1ZvK1NPbkI1ZkNUZDh6ZDJ6OFhQMXphZFlPL0d2d3hwY2Z0YnR2a3d0SGh3c2JKclc5NTFhVE5iYmQ3YlBxZGI5RW5OL1VQSGQydDJ6eDhkMDJ1ZnBKMXNKK1JGQ21BYnZrT2Z0a0JDMUNGRHZSbkl1R2czYWJJRHBBUXdLZCtYbk1GYS9ZeCtUUVBxZUxLbGtUTllDMHM4UnFGUHhWWklmS2xOUzN4ZUQ1Wjl4aWVIaUlZNDA4VnZMK0VGN0poOHA0bGZxdDJMZ3NZcGVMdW1CdHZyUTZXalRMTFpVTnpCWlU1d0FtVDh4c2FxMThLbG9XV212Tnp2Ylc2OGZiQlV2NWdZWEoyOXVLcGliRnpoYUgwZkc1eXoreWRweGY4SXh2emIvT1hOdVhtVHNqWjVIWFJwUEpuYnQrQnlmMW5sSVZGSmRlelA5eWpmc1lkV0p6Y2Y0TjJndjY3K3BRMG1Jbm5IbE0vSlk5azRoa2VTL2xHK2xOMmdYUmovUnE5bUVyR3dsMEJySEhxcEcyRzR0ZW95c0N2M2FRN2lucU1VaGJscit1RzREYkNBL3dTWU85V1Zkbyt1RzlUTXJseDM5QjQ2VWhpSmxDT2RaZTlVL0dsa1E5c0hoN2FjdnVOU25IcVNHbmt5UGFpY3ZOTmNpRzlxeXNtVi85TWlnYW4wdjNLRGZUbWlldGN0T0k2aUpjYnJmNHZkaHUzR1FITFVKQ0JUSjB2OUdWbFNTRzdnRk1WYWgwM0NJdkI3YzFrM0JGK1dXZVdxNHZvRlVlR3JMZDAwVkNFZFlQV2JqREFFYzk5ZDNCTDRMcndUTC9MTG50TzdkZGMzb25yTngyN3UrdDA1OVRvek9aTzV4OSsyS20xZVQ0d3VObC9JSHZiUXJpdHV6ZzJQS280TTZIVEM3bHR0eXdVcno4VW45aHc0c0NXaGNuTUpuL2VHYzZYcGdaOHFGR3FzT0EvQkdzOWlCV0hiTHcycW9LSGhGaDU3d0xZOFE0UWRNUjJYdWFGTmdtM3M0TEFERzZQRy85M2Q2S1ZWZUVtbHJoK0V0RFcvTWFhditPREg3enZYeC81eXRjZS9OZjdmcDkrNkVOM2ZmQ2IyN2JTODlVL3BYcjFuVnVadnZVdGJ4SHlCcDJQN3djY0lpQzdkK2t6N1haRzJ4eU1PTUhXd3hBVDMrNE9mZ0hjc3Fid2NxS2RMdVowK3AxZzc4VzdZMUdzTFNReVlYMDEyOCtOdGgrdWJ2NVYwdmdYWUlaZnFVcEs4OEtEVFRPSDdpamU5dWpNNlpuM3pwekMzMjk5Qkg3QzcrOHR2dmVyK3kvdC95cjhFejlvOXlXT1oybjFlWFlyMzNmanhpbWQ0UU93anIweFlnVWxmcjJFVnh2dTJWMHIzZWxlL1lhNTNyNjVHeWJ4WisvY0RmcmVFeWYyd3BlamZQemh4VDBQSHkvRHp6Mkw4UFBrRzE5OTE1dmUvS3E3MzJUNG5kdTVQWlRRdXhWWmtrekhzNi9tZUVaemlEdWVzZlpodVVMYmI3NzNkOWt6VjZmWTdOakpIWGpPRElOeXNjK1RFSjd4dFRueHlOdTY5Tk53YmpSZStoa2lvVUFtWjF6NjJYaElKZUp3TXY0U1hqK3pxekswZjJUTHhEM2J6dDFmSFA4dTNidUhGdk1iRThXTitZRzVjdm5HQXlNSE4vNHpPeTdzc0FUUXRCZG9Xa1QraTNjelNlNERKclRic0tMd3ZISG9mTjRzMVJDdHIwcWRTU2ZTbVRUM0h2bHFUaFhqMUxsY0dsbDdoZ1ltTit2TlRaK1kyUDI2d2RtK0F4dTJYemN6ZG1oaFpQUDh4T2lld3V6d2d6dEhEMCttNXpmdE9QVG54Zm14ZUdWa3VwRGFXaHJZZUhSaWFGRFBERXlYTjNTUDd1eWJPTlRaZnNnNDA0RnZ1RTg2aUF0djYzWEIzbVRIaFlOM3BrdDhsN29nK0pjWU5VUGJuRmcxVkxnL3dqQXRZcDJBQ1NjbDNNeDE1TWpOMWQrZ0t6K0ZFVDlUM1hQOEl4OVpvcCtxN3FHYmlQQzFYV0VKNktzSHE1WW9WR0U5UHRCRkZEYnY1VkdKWnNsV3c5enpXV1hHWVZOTVo3SXBjVCt3RjkyMDJwaFpsYnVSWmtDcWJaMzBROVZQMkZNN2N4ZnV6MDJmMmpqem10SzIvc09sYmZzUGJrdHR6OUI5OUlialgvVzQ3MXd1SDlxU0docWN5NmZtTjAvTWVyeElpNUhWbjdGWmtJTTlNSk03OVdrWFpiUWRCcEwyTVFYdnBaWTBLaXNZTGxtTDhjS1M2S3BZTXNrRVR6b3JKb3VoZ0tjVGxrMFA3YkUxWFU5dDdOQzF1aGdTajVVVXlOTUQrbzI3K3dhdit6K3RYWDFzVzlVVmYvZjYrZm05eEluejdQamoyYzkySE1leEhkdHhHOGVmK1hMelZaS21TVlB5UWRJMlRkcnkwYTRNMm02RFNSUHJZSlJ0SUZFRUc2T2d0YXFnMWY2Q0Fwc21qVW1qWTB5VEVOSUFDVFMwVFdLVEpvUzBzcitRZ0xvNzU3N25qeVJ1eTdSRnN1UEU3OTUzN3Jubm5IZnV2Yjl6enJjbmVtNFA5dnRHT3RlK1RrSzNaMU1MZzhIUXRqMkZucVcycG4zREE3dG5wWjdsQjNiTVAzWWcyNmJPT3V4UFByUTEzWmFmU2ZiTURRVEpIZkhJN01HcGZGN0hDYlhCb0tKTXYwTEZkaU5adDErMnZ2YXd0dU9RSWdFc2dudVVqSlh1b1ZMcGQzVFAydTZyUDlId2IybVl1d0dRY1Q5WXVpeG05M0dKNEVlUktkeGUxRFB0bGkySlNNcGx1NEV0aVhpZ2pTQWFQNXZJaGtOdHNVQk10bkIrNHBjcXJNbFVzcW1WQlp4eHBzYTYyR290VFQ2L090WTVQNXpmM2pHMDJOTUR3cjQ5Tnp3ZkhsM05aM2JzeUdSM1RHV0tDd3ZGYlFzTGpiN01WTHgvUmJiTnBhUGpLYTgzTlI1Tno5bmtsWDdRQ3g4NU45amRQVFRVM1QxWSt2VjRLalU2eXFMVE9GYXY4RE02VnBVQm1IdmVpSEdvVFlnVnd5Qkp6a0I1dytIS3pLdVZSRVlzVDJSOUdTQTFpMWhOV0xQVkZhNk5ZZnYwMFFXL21nelFONjhyQktVelZTR0FOYWxLbHNna3ZReHIwZ2RnNmxkcWJYNnV4dWJudWMzSURLbGNZODBCN2M3UjE2Q1A3N0krd0Zwam10cXl0ZTVGYTUzbXBnbW1SREpaRFZJNUw3aVZyQkNGdms0d01BM2JnUitPVWZabXpLQ2x4YlRxUmpwWE5kSnB3elE3NTFJY29ZaFIwdUlNN0RDR0NCdkQ5MWcvUThWK0g2aWlseGo0TU15S0NGT0RjYXpHcVFyQVI3ZTF1WXF0emV1Mk5paElHbVpXQWRvbTJKZ2VaSDJDNTlNTXoydWViREI4dlVoYW1nSlJXbzVsc0h0V2s2VGxVWEdSMjBpSTlmRVE2d09zdndCV3pXL0RZQVlyaTliWWFOUjZLMFl0ajBhdEl5aGJHVVdNWHg3b0w4UDQ5WDNXMzQ3aUxRMWdneHBoU0RMaERWNVlIZk9ielZDdWFvYnlHR2hQU1RuUW5oWHZVNmdpU2dHZGp5c2t5dWg5bVBVUFZrRllaeFY2bVZWZ284V3BsSzI4Vk03cDV3WGFrbXdPVHJHMllBRnNwdm9XSUZkakFmSllETVd0VUtJVlJOSEFOczFtNHFJdXFTSmZMcGpmRk92N2tmSzR2VEJHR1RnSXExSE1xVUg1T3FxWHE2aGVubHgvM0RBRDZyVXZ5Q1E1eERCL05mSWZyNUgvQkRlOUNlc24xbFRzM0lEemUyVmtibTRFWDZIdTdsQW9rVEFlM0QxNzhPRHM3b09EUTdsTXNaakpEYUg5eFhQYmN6Q2VUZjVOQkRVbVd2VnZSSzIyR1BnMzU3YVA3R09idkhaMU1Nd3dCdkNta0lQZ3RvRDI0S3Foa1dndVRsVjc0bFh0aWRhNk9DSzZPTmw2TGs3SzdudmNaZ2tvOWk0MTRoMEo1Y1k4NnNHenZhZGsxZEtxV3BXazI5OFhWeE9ldmYxd2Z6dndMZ0s4aTZEVzRheW9NQ3VkN0h4TXcrRnQxcnA0UmVzU3V0YTFDNkphYzdwd1BRZEhQMUlna2VtQjhMZ25xaVFVWDJmQUcvSzVBd0czTTZMRTNOczdjaE5oZjBmc1FLS2dPSHRzVmplc2kzT0t3K2FXVzdlNDFGeGM3WkpNVWMyT0s4Q2NDZUE5K2pXZzIwMVNIZDJPSU9PaUc1d2FFWnlhc3ZPZnpwckFTZlIzZFkzLzloZDMzMDlXM3N2UHpoYmVmZTh4NEl2cjJ1Y2tCUDM3VU92UmwvRlowWmVSNjJwOXBLTDFDVjNyWmVSSU5vdStQSXk4VGk0eTVJbjQ5NS96TFFFNVA3WnJLRGpnYTFlN0hQNXd5QyszdFZ6NFZXSFJKSksrTGIzRFZsdEdocGxVL0tLb1k3ZytKeGttTHgyb1J4cjQzMEJid0g2bzllMUh2R28vWUw3Y0N1SEtrRGdXTys4aUxyRldFOHE3WnVVSkM5ZTRNSytPenEvczlQUTRBdGJPbHU2dGNrcE5EVS8yT3pvdHBwanE3Z2dKYTlOemQxZ3NPYk41VzUvZGxlL3VHYmxvYlFtRS9VNm5qbzNHYytvbzA1ZE4va3FFV2Fab2piOGlncjlpQThmVGJoaDQ3ZzNTK2xQU05wZ3V2YTlqOVQ4blNaQlpKNndPa21pcHJFSjlTeFd2c1ZSTVZoVVg0V0xSam1RbzZmZTZna3F3Q1V3R2NVcVY4YTlEN0RzMldnVm56ZWVML2RQUmdCcWNTS2NuZ21vZ090WHZETFM1bEVCQVFVQ3l0N05UeUNkOENVbnFVcU81ZkFUa1ZvSS84Kzk2V2xzOStIcEdkVGk4WG9kRFpYUHFBaDFNd1hqME9WVmgvbHBBemhwd2tYRWQyeGl2Mk1ZRXVlNmMybm8yeUYwWmQrcXNjVW5PM0hCT3lhRWJUaXJvQ2J4OXRoSDNZaS9qWGxKQmt2cmFyZVRST2ZvYStoa3cyTWZnMms3eVRiaW9rL3hBd2RPYWsrUUUvTFdQN1JEdk5nbEdneEVNSWc5akVIaHd6QVIreWlEaVNRMHJrV1BrZVBCTWpuQUNwY0lpSndoMHYyU0NqM1NtcVluU3BsQVRxSjdYNDJqRjhsMVVwS0t0d2RUT2RpNTFQd2Z1ZjJ6VC9SOWthTERuMlAyYjhQNGNjVHNvTHlJQUdTTm9FbzFFNUhoTzVFOEtoQnFOOUppaEFlbkIxSkFTbnJmemkxZ3IwTGpLMGp2djhoVGo2NjZucDI1NCtWTFJoNlFycmlaNEx0bGJiVlk4QXErUWI5Ykp4MmM3MFA0MnZReFUzNmZSZnA5R096N3BHYzVldzVWNi9IQVBId2hQUkJjZUVkeXgvaHdWT1dIS3c3NDFYZWRiUFY2b3Y1bnRYWm01a3cxRWtDVGhHRXNhYlRCcXRXdkw2R29ZeldIY1hwYkVSZmdsU3F1TlJCS2xYUjZOaUw1MWZRaW4vcXN1aXNPY0NUaGo0azl1NklYNzZwMWdxRkV5MlZkSTVwUDViQWFyaFZsbGw3WVd0NWk2TklsQTMvbmFGL1JqeHROdmFEeTlIM242QURtTDRxSnR5TWNhc2ZBekIwK1h3M3FNN1JGbVhJeHNGd1B2eWErWk1XT0xuVVU1aDIvU1JOM2NoQjNjMUdtaXA5VFcxMXdibWhWVE4yM0I2c0pnTTJFTks5clk4ZHhtcVJpT2RmbDlsbVlEM1pyc1NzZlNHdmpWcTNyY1d0b21EZXpVckdPdWdULzhMZXY1dzRVMS9pQ2ZhQWwraHpVK2JiVVEycXpSMDBoTVRXUWpwMnhtOElKZ0JOYUdGb0d2NWRhTkc2cjFHeUxQMG5VYnJ1ZEJuY2FZL3VtbTdSanZ0TVlDTmpaVStKY2RHYzVteWp5YzJENjhjMlRuUUY5bVczYmJqZmpaeXNCamhCdmtIaUVmMFdId1V6c3gwcDF5Qmp5Zk1MSjl6RHQxZkpPQlk4Y1VjZ3ZiTkFwV2NTR2tmL0hpeGNVTEZ4NTVlZm5GRjVlWjdSMEV4L2dqOGlUR2E5M29IRjV3eGxpTTBVZWx2ZVRKNVdYTmZ4cThkZzFvMlFlMFdMQjZWUzBkSEdjeWNIZUt4R1JpVlM1ZzVHYXoyV0syV0RYQ3NCQlpMV0UyN0ZzbjdrSnA3MjllV0RwL2ZxbjAyYkpHNHc3dUtmSStMY0I5aEZjYWVNU2ZNZXdPQW5kTTRaUHAwNmN6cDArblR6K1JQZjNqM0preitUUFBaTTg4bXo4RE5BeHl1NEcrN3pENlBKanBDbUc3UUIvSU95d0dOWHdUdUR2c2FKcGZnOGU4a1orVlc4eGdNWnoyRm8vc1FZS2JtelJQSC9jaWFpTjZUT0JWMU1MM1NZc2VML0V2OHZ3NytrZHlKZXIxZG5WNXZkRmZMaS8vczBzRGJIZHB6NUZCN2tQZys4ZWdFWTl6NTRHc3g3a0Zia2FybVZORjcxZWdQeXpaRjN6U3RnbTE3eGY1V3Nod2ZlQUJ5c3Rkd0lPOW5JMDd2dU9sUmhhWUNZc00vdDRHSW5HY2RNeUltQi9zOUM2VDFxbUpkU295cURBR1p2SUcvbUc4VmpwMXcwdFpQb1gxc0NUQkQ4NXJ6ZGEwdmkwOU9ybnJSNFUzcms3T1QrNSt0UEQ3MHVSZEo1YjNMSjA0c2JSbitRVFM2K0dteUF2MEtPYVdmd1Y4OEo1WWlCQW5qTzFJNlJLWktaU3VFbjZLdEpDV2tiZmUwdnpCZWJqK2I3WFgyd2dKaDBLbnlVenBVb0VZU2wvU282VlBTNS9xMTFNdVRaNEhBWC96ZjR6dHNsMW56ZmVIZ2ZuNWdmNjV1ZjcyUkhlZ1Baa2t6eS8yRitibkMvMkxRNm4ydG1TeUxkaURzUWhjTDMyS25tZWVKL2hxTnJsUjRnMmN1MVdrUERXQTh3RVRDRXMzYXdQbEpsVkNKc29SaDZ5cUVWM2k5U1Q3RkErMU5VYzA0RThZTWFRa3JNZE5nM0pveDMxNktWRUJGVVVQNmF1aDlsQnVSZkY0bEpYOC9zQ3VXSHdtc0pyZHI2Z2UxMHB1TlRBVGo4OEdmamE4ZCsvdzhMNjk2ZHhLWURiUnZTdXdtbDl6dWQydTFleHFZTFliTHRpZlgzVzVQYzdrZ2JIeEF3Zkd4dzdBMkJDVC9BSHo1VXdzTXFleWwxaFpmeXFHNmZVbG5vSnlDb3YzZlhBRWZvaVhuUDN5T0RsYlFpQlNoa040SlZiaWRSWmJjZlpnVHU3VU1ncUREY0Y2MmJhQURPNTlocnh6ZCtsWk1sVjY5Uk1OMjZwaGpCbStscnNKdHJWNGJRdTF3b1RidVI4V0czR0h5R3JHZE9IZ3R5bVkxZ1JUVXV2NUhOZjB0Snc4cjFTZVBHcjUrM0ppeGtvK2NieW1HR1Jmc3lKUnRWK3ovN0tpWFhEVmtsYTgxODdac1VaakVQR0N0bXJxVFQwZFo5Z2VsQzhOWnpzSGJNZVBlNmNTU3NKMmpOTFNuM0lqQVM4NWVyVzBSZldaRy85QzMxa1hDOUxHcE51K01maWpHa3E3THZ5alh2eEh1WWU2M05OOXl2OUh6TWdmNlFMM0NiMkh5WXkxYUJHdzBobWFtRy9aOURBVkRFVE1wdjdSMkNBNjRVVVhGQVdYN2h6d2pYYkRXRVhPVTNUcFZiRk1lbFBvV09SRUtqaGlLZGtVSnNRVWxqOStlcFRJeERMNk5BMjlYaUM3U3BmNkxsLzlzeGJUOWpaTmdzeXU3MmRpUXo5RXpqb0p5VHBsTXZmMGFPbEs2ZC9RMFd0WFAzeTlVSHFKelBSZHBwMGIxakl5cXpHbWhUNEQwNFYxS3huMlhPV3UzV1A0cTJFblBudTVHRllhYW00eUVNejBpWkVJa3pVRjBzQUluOEp5bTNTUjA4c3ZVc05zb0UzYksxZENVVUZRWWthSkdpdjdPTTdxUG80Z09GT2RtYXlwREdMQlU0UXJKWmxjZ2ZkNzA5SEQwMk4zMnc4MHBnTytzTTBXQ2JvTXR4UFpjUnMrcWRSbzlBbDJsZHpRMGRjMWNPdDRQdVJ0OXpyTTdpYWZwOUNyQml4SDJVTU9Ya2hwOWNmME1qMUV4MVpIdC80SEVSNVRHQUFBQUFFQUFBQUJBTVNnWitpb1h3ODg5UUFQQStnQUFBQUEyTkR6dEFBQUFBRFkwVmFlLzdMKzRBUklBL01BQUFBR0FBSUFBQUFBQUFCNDJtTmdaR0JnL3ZYdlBBTURTOHIvVGY5M3NIZ3dBRVdRQWVNeUFMR1pCNUFBQUFCNDJvMlVYVWlUWVJUSC8rZThKWm5STUpvcDZiSlZKczJwbUpuT1hGKzI5WUd6d0ZYVVJWaFpYWVFSVVVrVWtSQWtSbGZkRldGZFZCWkJSSUY5Z0VRUUZhaEZYVmlFbFVRWDBVMkk0RUJZLytkMXMzZWp3SXZmenZOeG5uUE84My9PWGxXc3dqZkFpVDVHaHZhZ1NkOWp1ZjZnUFVkT29jbnljdjRUamVKR1JOdVFvMWU1ZnBUcjNOTVlyUStWZWl0aHU3aDJCcmw2Rm5uNkVTRVQwN3FOSmZvTU0vVSs0N2Rnb1ozSGdmVW9kVDZKcVNNZDFtVlpqSDh1VWQvL2lFMVk0MnZxVHlFVHN4TDMyU2p1K0JENVJMNXp2cG0yMStwRWhEYkcrV0xhQWNlZEcvVEl4TjF0TGpCT0xKRXI5bGNMSjlOOHpKZTJOcWxURXFOWE9rWS9KOVRYMW5NS0dMMmQyTG83TVcrUXBBaCszY2R6V1NqVHZhUU9aWElGSG0zbU9JUVF4bEdOOGZnUExiREhJZXN3ZmJtdTI3bHZ6dkdNZENBa1g1QW4xN0NBZSt2Vmd5ejlobm1hUTMzeWtDbkRXR3JuY1dDMW96Ujl6Y2JVa2M0UXF2VVF5a3grdTVhNmlUci9pNm5QMkcya09ZMmJxTmNJc2pVVWY4TjR0WXozanZTUlFZelpkMzBnbzdiOXhYMDM3UXV6Yis2ZjBLQldqaU5LV3lBbkVCVWZ4TTdueEdqandIcVZPazlpNjlhQkN1S3g5VXVIZWpxaDFpRmIzNmxnOUhmQ2QzQmkzbVNTdTh6L0dZWE1VV2ozd0ZRSXMzZlN1Y3krTVhTalFHZWltWFNSSmhJbXg4aE9XWWFvcmtJYng1ZTBFRHZNdnB6R1pabU5SUnhmTjJBVWxjUmwyekhNNFB1YitRcFN4WDZZVDBvNExpWVY4aERGcElMZkw1ZmM0Sm1mbUNQM3lCMHNJYVZxK3Y4V1N1VjN2Ri9HVUNScjBTb0hFWllZWUgzZ2QrOGxPVU04WkJSMTBvOGE5Wk9ucUxHNlVmT3ZOZXEwZ2Zqa1BPckpjcmtKTDZtVVFRVGtPY29OdWhvQjlsb0plN3BTby9ETDIzZ2NNZWJ0UnRqS3dFckxSZWJ5N0crc1lIM0xkSmdFNE5Wc2FudWFkMzdDLzJrZmZIcURQdHQ1aHdEMTJVT05PMUdzamZRN2hRcmR4UGM2eXZNbkdmOEE4dEdESFBIejd1dmhsdDNzbnlCeUpZTDVVczE1QS9zMXdua0wvWjdTcjV4KzlWemZsZkRibXVxbmEwa1h2M3Z0NUN2YzFuVGtUOXVQZkw1WmNCSXZ0aVJzVUJjZ0tDT01NY0wveEVYVzFJc1NDYUZWZzZpU0FXb1h4WnJrbXlYZTdUVTFtazFjdWc2NVZCL1drUG45QXlkMFB0Y0FBQUFBQUFBYUFCb0FHZ0FhQUJvQVNnQ2NBT2dCS0FGV0FZQUIwZ0grQWhnQ1JnSnlBcEFDdWdMaUF5d0RaZ1BHQkFnRVhBUitCS3dFMEFUOEJTWUZUZ1Y4QmFZRjFnWUdCamdHZkFhcUJ0WUhRQWQyQjZ3SDJnZ09DTUlJOWdra0NWWUpwZ25TQ2dRS09BcHNDcUFLemdyOEN5b0xhZ3ZZRENnTVdneU1ETkFNL2cxQURYQU5rZzI0RGVBT0NBNHFEazRPaEE2bUR2WVBKQTlPRDRZUHFnL3dFQ1lRVEJCOEVKNFF4aEQ0RVNRUlNCRnlFWndSeUJJcUVsQVNkQkthRXlvVFdCT0lFNzRVQmhRdUZGd1ZGQlZDRllBVnJoWGFGa2dXZ0JhOEZ0NFhCaGN1RjFnWGZCZWVGOElZSmhoVUdJQVlwaGpTR1BvWkpCbE1HWG9acUJuUUdmd2FMaHBjR3VnYlhodW9IQjRjYmh6QUhTd2RaaDJhSGVZZUVCNG1Ib3dlMWg4WUgyNGZ3aUFLSUY0Z25DRG1JUW9oTmlGaUlab2h5Q0pPSXI0ak1pT2tKSEFrK2lWa0pqb21zQ2RNSjVRbnlpaFdLSXdvdmlrdUtiZ3AwaW9BS2tvcWZpcTBLdW9ySUN0U0s2QXIwaXc0TE1RdEtpMXFMYTR1Smk1bUx2WXZQaStxTDl3d0FqQXNNRll3ZGpDc01PWXhDakY0TWJveDVqSWdNa2d5Z0RLc010UXk5RE1hTTNRendEUUFOR28wcURUVU5RUTFNalhZTmhnMldEYUNOeEEzWGplMk9BQTRWRGlVT01RNVZqbUdPY0k2RGpwWU91QTdJanVPTytnOExqeDZQTVk5SkQxK1BjSStWajZtUHhBL1NqOTJQN0kvM0VBWVFFWkFkRUN5UVBaQktFRldRZUpDSUVKc1F0NURUa09zUkE1RWJrVGlSVHhGN2taU1J0aEhoRWZNU0JaSTBFa1dTWXBKeUVwS1NtaEtna3FvU3V4TERrdENTMnhMckV2d1RCWk1QRXhnVElSTTNrMFdUVHBOVkUxNFRaaE53azMyVGpwT2xrOEVUeWhQU2s5NFQ2QlB0ay9TVC94UU5sQllVSGhRbkZETVVPaFJBRkVhVVVCUlFGRkFVVUJSUUZGQVVWcFJkRkdPVWFoUndsSGNVZkpTQ0ZJZVVqUlNVbEp3VXBKU3RGTWNVNFJUdWxQa1ZCeFVubFRxVlJKVlhGVjhWYVpWMWxiYVYzQlgrbGlnV054WlNGbmlXalphbGxyWVd5eGJjbHVVVzlaY05GeHFYTHBkSWwxSVhieGVKRjVHWG1KZWhsNndYdEplK2w4cVgwaGZkbCttWCtKZ0JHQkVZS0JnMEdFY1lYcGhubUlHWW1SaWVtSzZZeGhqd21SU1pQcGxJbVZBWlhSbGtHWGVaaEptYW1hQ1pwcG0zR2RLWjNCbmpHZWlhQXBvS0doQ2FHUm9nR2lrYU1wbzRHamdhVVpwVVFBQkFBQUJwd0JjQUFRQVp3QUpBQUlBS0FCVUFJMEFBQUNNRGhVQUJRQUNlTnJ0bEUxckUxRVVoczhrYWZwaExTMGlpblJ4Y0NFcU9rbHRGN1lWb1ZTS1ltcGlHd1Ezd2pTWlRLNmRaSWFabTZiOUE2NEV1M2Jod3A5US9Ba3VYQXR1WGZzSEJKZSs5ODZKL2ZScklTaVlZV2FlZSs1NzMzdk9QVW1JaUoxbjVGRDJlWXc3WTRmT1lKUnhqb1lwRk03VE5LWENCV2hlQ0EvUlJYb3RYS1FwZWlzOERKY1B3aU0wNmJqQ28rRGJ3bU8wNnp3UVBrWG5uSS9DNDNUVytTeDhtblp6WThJVGRDSDNFcGs0aFZHTTluSnZoQjI2bEc4SjUyZ2kvMXc0VHpmekEzMEJtdmZDUTNRbi8wVzRTQmNMdDRTSGFhL3dSSGlFZUdoU2VCUmNGaDV6ZUtnbWZJcmNZaXc4VGxlTHI0UlBPMXg4Snp4QmM4T2ZoQ2ZwL01pMDhCU05qOHd0Ui9GT29vSzI1aHZsbVhtdXQzMWU4NXQ4MTlOY1M2S25ma1B6VWsrM295VGx5MjJ0NDNTaFZBcVVidmMyM0ViVUtVRUxhYlhWVWczbGhUSmNpYnI2eXNDbDdtOXJYdldicXRkWjg0TmU2Q1V6YnJrOHU3aTZmTCt5bU9tTjVQcEFjbXpWSXo5SlZkVGxiQm1mNkh2RTVZOFZWZk83MmdzU3I4TWxOZ1VjSGRmYkttV2o1UFdvcGZ0ZTRqTUNvV3I0M1JRSjlMcE5QMkdOZE5idlZiZ2ErOTFNWE1rRTEzaS8xaG1Yclptc05UYmVscWRDYnlQMHVZOWMyZU9WcFlmczZRVTJKYUNDdEpHb1dLZHVxa0kzU29KU2RhVWlNLzErMyswME5rTzlFL3VtUWduSGcreHQxWDlwN2lmTTBESkZGTk1PSmFRb29EWnBZcnBCWlpxaGVWQWRFUi92TlR5YmVOOGx6eXBxMEVmMEZOR0dIUzlSRCs4MllnbitWNWd1V3ljTjU1UVdxSVFyZ0w5UjlHaURYS3lLcUlObzVwdTVWcW1GUzJGT1lSd2VtVjNCaWk3ZVY0N2xVc2Q0MjlLcW5WSFlvMk5WQVNpRUtrRTFMbW9xMHl3dFFyVk05NmtDT3VnL2NMbCt6T1huZXowQ203cVZ6WkVQN2NhL2tlK1BjL24zT2xWRDFKQUh6d1RQRHZZcjJicXpEdnhzM3RTa2JKWURUNloxVUF2VXQzMDFGV2VLME9aai9GSTVnUjY0YVR2RHRoN2ZycjRIWDBZRnNkVWVkSzRjY3JpR3lFbDlOVGNmeU96d3ZvTnNQTnJDcmV5M2J3TlBNOU9YY3pXelp0OGxlbWhaNDl6NVd4ZXlIcVR3TkgyT0VVdXhZMnE5WE51MUFQTlZySzhjV2RPM2w0dFRiTkFtMUJyZkZWUGxvSWVIMWZHeHM5L3Y5Zjl6LzUxei83VTEzL3NYT1BBTC93cHRXLzhwQUFCNDJtMVNDWFFUVlJTOXQ0UUpKQVVLS0lJYnlPcEdiWkkyVGQyZ1N3cUYwa3BMS0NDaTA4azBHWnJPbE1ta3BiaUFBZ3FDb3FLNGdpRHVDd0x1b09DK3I4ZDkzL1c0N3g3MUhKZGs1cHNFY2M2WmMvLzcvNy83M3Z2M29nRDI5M2NJVWZ6UHh4dlNmd0Y3b1JkZEdJMHhHSXR4T0JTSDRYQWNnU014SHNVNENpWHd3WThBU2xHR0lNb1JRZ1dPeGpFNEZzZmhLZmJHRTJqRkJiaU5FdDFRc0FWLzRtOUUyWWQ5NmFFWEtndlpEMC9pYWZiSE14ekFJZzdFRi9pTmd6aVkrM0JmRHNHejNBL1A0WG44Z1JjNGxNTzRQdy9nZ1R5SUIzTTRSL0FRZk1TUkhNWFJhTU9MSElPWEVNTld2TXl4SEljTGNUc1A1V0U4bkVmZ0V4N0o4U3ptVVN5aGozNThnMWNZd0t1STR6V1dzb3hCbGpQRUNoN05ZM2dzdnVKeDJNbmpPUUdmY1NKcUVFWXRKbUV5NmpBRlUxR1BhV2hBSTA3QWREU2hHVE1Rd1V5MFlCWm1ZdzVPeEZ5Y0JJMlZhRWNDR3pHZlZheUdqZzc4UmNCZ0RjT3NKZkU2SjZHVGsxa0hFMGxPd1FKT1pUMm40VXY4emdZMjhnU3M1SFEyd1dJenV0RE5HVWd4d3BsczRTek81aHlleUxrOGlmTjRNajdtS1pUWmlvWG9vWUpUY1JxMllSR2pWTEVKcDdPTk1jYXA0VlBPWnpzVDdLQk9nNTM0Rm1kd0FaYmdUQ3lteVNRdHB0akZiaTVrRHhmaGE1NktIVHlOcCtOem5vSDEyTURGWE1JemVSYVhjaG1YODJ5ZXd4VmN5WE81aXF0NUhzL0hnM2dJZlZHTjgvQUczc1JiZUJ2djRIeThpL2Z4SWRmd0FyeUhEekFRQTNBUURzWXRjR0V6UnVJYTNJMTdjQ2Z1d3FONGpCZnlJdXpDYnR5RW16RUlFM0F5enVGYVhzeEx1STZYNGhFVVlUdnU0R1c4bkZmd1NsN0Y5ZkNpRU1kakl1YmhGUFREV1hnWVoyTUZLaUdqQ2g3MHhpaHV3Q3FjaTlXOEdtNHN3M0tzZzRUQjJBZjdZZ2oydzFBTXcvNDRBQWR5STM3QWovaUptM2dOTi9OYVhzZnJlUU52NUUyOG1iZndWdDdHTGJ5ZFczRS9mc1l2K0JWOThEajY0enVzeGZlNEZ5T3dCc054Q0paeUc3ZnpEdDdKdTNnMzcrRzl2STg3dUpQMzh3SHU0bTVYUTZTK3ZxQzZ5YTIzSmp0bFJaVXFXMDIxUzNWWGRzaUthZWp1U2lObTZHcTd0MXJSVENYVjBaWlFGM3FxbzRZbEs0cXFXMUtOSXFkdnBjRTBaRXNLMjdsUzJONzBoTFBYM0dHSHJWZFlqN25EZ25GU2p0R2QwclVTbjkvdm1aUk5jVTF1bFUzdjVOd2RxYzRtTDZpYjRxNFR2ZFU1VEZLZHBTV2lxbmZLZndrRFFhbGVWbEtXS3RYYkhZbmRLbGQ5dW96VTRCdzE1QjJWbGttTmRwVitqZkdVSHBQTlZFZENUbG51UnFlZzFPU2tOT1dsbEFXbFpudFhoR0Z2ODMvYThQdENyaG5wWWFRWmVXbEJ2emlybENKT3hjZ2VGU05peElnell1K0lxZWt4S1dJUEtyWFlCZnUyUkRYVlZKTmFVbXFKbVhLWDZtM0pWZmJPem51NTJmYXhOTWRPODh6SnFTYzdXc3VpbUN5VVVmSzBWbkszbzduKy9ZRnlTWFhFVmgyeDFaellxaEJiVFl1dENzcllYbUlIUExHYzJQR00yUEc4bGpXYjNLTmxyeFJvODkyYTZGTVR1bXVPN3ZQMzByMjhzRDFtcXFxZWtQV29wa2dKUjdaRXZnbXFYWW1NQ1hUblNNODNRVkF5SEVtTVBTUXhoQWxNSjhYTU4wRzVsTXczUWEwM3VaY0pLbHhXeGdSV3Zna0M0cXhLU2prVlUzdFVUSWw1VThJRUtkc0VLY2NFM1k0SnVyTW02SFpNMEoxbmdwNjhGKzF4VExESU1jR2k3TVAyVVF3enF1bHlvbzljbkZUaWhwSG9KOXQzc3BIZG1vZ0d5VGxLc1ZVay85dENOc011SmFMK3dsM1owQmxHaElWeVpxWnNvajJhaUhySGl1V0U1WWs1NWRQTEFYa215c1JGTWNYbzZKQ2RNVEliL1hPT3lvUmUrNm1iRTBhWDNPN05QSFNKdjZRazRBOFdaUWpOcExvZ1pWaHFRbTJ6QnVkdlJGc1RtYjJNTXVucmZvRUJnUlVDS3dWV09lZ3JHOVNwbXBvUnpkUk9QMGEwV0pFN1BmR2V6cmlxMjB0Vmo4ckp1TFBzK0hmcEZibVp0U1JiR1hDRlU2YmhjSmFYQ0N3VldDWXdLTEJjWUVpZzZDMGs4a0krZ1dLR2tKZ2hKUGhDZ2k4aytFS0NMeVQ0UWpaZmV0UlNnVUdCMVFKckhLd3FjMXhjVlNXdzJza1BpTG9CcDY2dndpZlFpZjArTzY4MlhGdHJZMjF0VFdHeFpiV2xqVy9FTmQzNkIrKzI5Y0VBQUFBQUFRQUIvLzhBRDNqYVkyQWdBQXFBTUpFaGtXa1BBd1BUUGNhdkRBei9kWmgvL1R2UGRQei9ONlpuakgvL2YvdXZEdUl6dUFDaEhZTWRZeHdEQTRqUG1QTC9ON0k0MHg3R09MQytRNHlSSUJvQUcyZ2szZ0FBZU5xdFYydGJHOGNWbnRVTmpBRURrckNiZGQxUnhxSXVPNUpKNnpqRVZoeXl5Nkk0U2xLQmNidnJOTzB1RXU3OWt2UkdyK245b3Z5WnM2Sjk2bnpMVDh0N1psWUtPT0ErZlo3eVFlZWRtWGZtWE9mTVFrSkxFZytqTUpheTkwUXM3dmFvOHVCUlJMZGN1aEVuaitYb1lVU0ZadnJSckpnVmc0RTZjQnNORWpHSlFHMlBoU09DeEcrUm8wa21qMXRVMEtxaEdpMHFhams4THRicXdnK29Hc2drOGJOQ0xmQ3paakdnUXJCL0pHbGVBUVRwa0VyOW8zR2hVTUF4MURpODJ1RFo4V0xkOGE5S1FPV1BxMDRWYTRwRVB6cU14NnRPd1Nnc2FTcDZWQThpMWtlclFaQVRYRG1VOUhHZlNtdVB4amVjaFNBY2hGUUpvd1lWbS9IZU94SEk3aWlTMU85amFndHMybVMwR2NjeXMyeFlkQU5UK1VqU0JxOXZNUFBqZmlRUmpWRXFhYTRmSlppUnZEYkg2RGFqMjRtYnhISHNJbG8wSHd4STdFVWtla3h1WU96MjZCcWphNzMweVpJWU1PTkpXUnpFOFRDTnlmSGlPUGNnbGtQNG8veTRSV1V0WVVHcG1jS25tYUFmMFl6eWFWYjV5QUMySkMycW1IQWpFbktZelJ6NGtoZlpYZGVhejc5VVRNSUJsZGNiV0F6a1NJNmdLOXNvTnhHaDNTanB1K2xlSEttNEVVdmFlaEJoemVXNDVLYTBhRWJUaGNBYmk0Sk44eXlHeWxjb0YrV25WRGg0VE00QWh0RE1lb3N1YU1uV0xzS3RramlRZkFKdEpURlRrbTFqN1p3ZVgxZ1VRZWl2TjZhRmMxR2ZMcVI1ZTRyandZUUFyaWN5SEttVWsycUNMVnhPQ0VrWFJrNnNSR3BWdW0xVkxKeXpuYTVqbDNBL2RlM2twa1Z0SERwZW1CZkZFRnBjMVlqWFVjU1hkRllvaERSTXQxdTBwRUdWa2k0RmIvQUJBTWdRTGZGb0Q2TWxrNjlsSExSa2dpSVJnd0UwMDNLUXlGRWlhUmxoYTlHSzd1MUhXV200SFYrbmhVTjExS0txN3UxR3ZRZDIwbTFndm1ybWF6b1RLOEhES0Z0WkNjaEpmVnIyK01xaHRQenNFdjhzNFllY1ZlU2kyT3hIR1ljUC92b2paQmhxbDlZYkN0c20yTFhydkFVM21XZGllTktGL1YzTW5rN1dPU25NaEtncXhDc2djVy9zT0k3SlZsMkxUQlRDL1loV2xDOURXa1Q1TFNpVUhFcXhocGtFTnZ6bnloVkhMSXVxOEgyZkkxR0RJVmpMYXJNZWZlaTV6eU51cTNDMjdyWG9zczRjbGxjUWVKYWYwMW1SNVhNNks3RjBkVlptZVZWbkZaYWYxOWtNeTJzNm0yWDVCWjFkWU9scE5Va0VWUktFWE1rMk9lL3l0V21SUHJHNE9sMTh6eTYyVGl5dVRSZmZ0NHRTQzdya25lY3crL3B2NnlzN2V0Sy9CdnlUc090NStNZFN3VCtXMStFZnl5YjhZN2tHLzFoK0VmNnh2QUgvV0g0Si9yRmNoMzhzMjFwMlRPWGUxRkI3SlpIb2ZrNFNtTnppTnJhNWVEYzAzZlRvSmk3bUM3Z1RYWGxPV2xXNnFiakRQNVBoc3ZkZm51UTZXNnlFWEhyMHducFdkdXBoaE83SVhuN2xSSGpPNDl6UzhrVmorWXM0elhMQ3orckUvVDNURnA0WHEvOFMvTGQ5VDIxbXQ1dzYrM29iOFlBRFo5dVBXNU51dHVnbDNiN2NhZEhtZjZPaXdnZWd2NHdVaWRXbWJNc3U5d2FFOXY1bzFGVmROSk1JTHlEYUw1Nm1UY2VwMXhEaE8yaGlxM1FadEJMNmF0UFFzbm5oMDhYQU94eTFsWlNkRWM2OGU1b20yL1k4cXVBMjVHeEpDVGVYcmQzb3VDVEwwajB1clpXZmkzMXV1WFBvM3Nyc1VEc0pWWUtuNzIzQ2JjOCtUNlVnR1NvcTQzWEZjaWxJWGVDRVc5N1RlMUtZaG9kQTdTREhDaHAyK09tYUM0d1duSGVHRW1XYmF3V1hHTWtvbytES256a1ZKN0lSVFRhaWlOKzhwWDZxQzRYUW1jUkNZcmE4bHNkQ2RSQ21WNlpMTkdmV2QxU1hsWElXNzAxRHlNN1lTSlBZajlxeWc1ZWRyYzhuSmR1VnA0SXFUWXp1bi95SXNVazhxOXJ6YkNrdStWZFBXQkpNMHBYd2w4N1RMazlTdklYKzBlWW83dERsSU9xN2VGeGxKMjVuRzA0TjkvYTFVNnQ3YnYvVXFuL20zbWZ0Q0RUZDhaNmxjRnZUWFc4RTI3akc0TlM1VkNTMFRSdllFUnFYdVQ3WGJPUlRmS241MW5VdVVJWHIwOGJOcytmdjZHd09qODVreS85WTB0My9WeFd6VDl6SE9ncXQ2a1M5Tk9MY3ppNGE4QjF2RXBYWE1icnJOVlFlbDl5YmFRanVJd1IxZSszeFdZSWJYbTNUYmR6eU44Nlo3K0U0cDFhbGw0RGYxUFF5eEZzY3hSRGhsanQ0Z1NmUmVsdHpRZE5iZ0YvVll5RjJBUG9BRG9OZFBYYk16QjZBbVhuQW5DN0FQbk1ZUEdRT2c2OHhoOEhYOVRGNllRQVVBVGtHeGZyWXNYT1BnT3pjTzh4ekdIMkRlUWE5eXp5RHZzazhnNzdGT2tPQWhIVXlTRmtuZ3dQV3lXREFuTmNCaHN4aGNNZ2NCbytadytEYnhxNXRvTzhZdXhoOTE5akY2SHZHTGtiZk4zWXgrb0d4aTlFUGpWMk1mbVRzWXZSanhMZ3pUZUJQeklpMkFOK3o4RFhBOXpub1p1Umo5Rk84dFRublp4WXk1K2VHNCtTY1gyRHpLOU5UZjJsR1pzZVJoYnpqVnhZeS9kYzRKeWY4eGtJbS9OWkNKdndPM0h2VDgzNXZSb2IrZ1lWTS80T0ZUUDhqZHVhRVAxbkloRDlieUlTL2dQdnE5THkvbXBHaC84MUNwdi9kUXFiL0F6dHp3ajh0Wk1MSVFpWjhxTWNYelNjdVZkeHhxVkFNOGQ4VDJtRHNlelI3U01Yci9hUEpZOTM2QlBXZ0Evb0FBSGphWS9EZXdYQWlLR0lqSTJOZjVBYkduUndNSEF6SkJSc1oySjIyTURESU16Tm9nWmpialZqVVdJUTRtTGtnUEFzbUhTWVpOakNQeTJrUHp3SE9BeXdIR0pnWnVJRjhYcWM5REE1Z0NPTHZCSklNTGh0VkdEc0NJelk0ZEVTQStDa3VHelZBL0IwY0RCQUJCcGRJNlkzcUlLRmRIQTBNakN3T0hja2hNQWtRMkc3Q29zRWl3c0hNcDdXRDhYL3JCcGJlalV3TUxwdFpVOWdZWEZ3QTU2VXUrUUFBQUFBQUFRQUFBQUI0MnRXVVRVL2NNQkNHNy95S2tVOVVLakhMcVVVSkNJR2lvaTVhUHJhOW0zZzJjWEhzZER6WnNQKytEczZXcFdvcmJvaGJiSTBmUCsvWVRuNzYyRnBZSXdYalhTRm0yYUVBZEpYWHh0V0YrTFlzRHo2SjA1Tzl2RVZXV3JFNjJRUEllMmQrOW1nMEdGMkl5cmRaV3oxWTNuU1kzYUwrb25pSmozeUYydlN0a0U4TDF1aTBKM0NxeFVKY28yTlZrMnBCd3RYNTE3bUFubXdoR3VidVdNcGhHSjV4a1QwUktvbzhEdVAzNzlFL2VlUnRuQzk5N3pSdFhvTi9MZklDZzZrZDBrdG10NjBlZ1hJU2xqdkd1Y1pRa2VrNDluamFqbU9Md0txeHllaEVtZ1JZTmlaQTZSM0RuVi94b0FnaFRsaFRvUXVvSWVaQkFtNFE3aTduc0lqN3B1SjVLdmdJMzlNNXdpeWJaUWsyclIweGFxMk1WZmNXWVREY2dJTHk3QVlVSDhNVUl5bUdMQmliZWFybG9wem5jdlJNZWY3SWtHL0p1NTM0QzBLODI4QVRLVjAvMzIzSTFBMy9OODM1dGdxT0RtZWZvdzlDZkJBUVh3UmNrLytCRmNOWno0Mm5BUHVqUTRnU2RWVHI3NTl1VG5vOGk5WEtWRWJaYVRqbS9iQ3I5VUlsWjFJYVcwVVBieSsybzVMTDUvL0ZMM3BKYlRrPSkgZm9ybWF0KCJ3b2ZmIik7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc3R5bGU6IG5vcm1hbDsgfQoucGYtYy1sb2dpbl9faGVhZGVyLCAucGYtYy1sb2dpbl9fZm9vdGVyIHsgLS1wZi1nbG9iYWwtLUNvbG9yLS0xMDA6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLWxpZ2h0LTEwMCk7IC0tcGYtZ2xvYmFsLS1Db2xvci0tMjAwOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0yMDApOyAtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTEwMDogdmFyKC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tbGlnaHQtMTAwKTsgLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLTEwMDogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS1saWdodC0xMDApOyAtLXBmLWdsb2JhbC0tbGluay0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tbGluay0tQ29sb3ItLWxpZ2h0KTsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3ZlcjogdmFyKC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvci0tbGlnaHQpOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS0xMDA6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1kYXJrLTEwMCk7IH0KLnBmLWMtbG9naW5fX2hlYWRlciAucGYtYy1jYXJkLCAucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWNhcmQgeyAtLXBmLWMtY2FyZC0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay10cmFuc3BhcmVudC0yMDApOyB9Ci5wZi1jLWxvZ2luX19oZWFkZXIgLnBmLWMtYnV0dG9uLCAucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWJ1dHRvbiB7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tZGFyay0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWhvdmVyLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS1kYXJrLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLWRhcmstMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1hY3RpdmUtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLWRhcmstMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWhvdmVyLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0zMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0zMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWFjdGl2ZS0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tbGlnaHQtMzAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0taG92ZXItLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0taG92ZXItLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgfQoKOnJvb3QgeyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMTAwOiAjZmFmYWZhOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMTUwOiAjZjVmNWY1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMjAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMzAwOiAjZDJkMmQyOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNDAwOiAjYjhiYmJlOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNTAwOiAjOGE4ZDkwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNjAwOiAjNzM3Njc5OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stNzAwOiAjNGY1MjU1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stODAwOiAjM2MzZjQyOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stODUwOiAjMjEyNDI3OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stOTAwOiAjMTUxNTE1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmxhY2stMTAwMDogIzAzMDMwMzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWJsdWUtNTA6ICNkZWYzZmY7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ibHVlLTEwMDogI2JlZTFmNDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWJsdWUtMjAwOiAjNzNiY2Y3OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmx1ZS0zMDA6ICMyYjlhZjM7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ibHVlLTQwMDogIzA2YzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWJsdWUtNTAwOiAjMDA0MDgwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tYmx1ZS02MDA6ICMwMDQzNjg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ibHVlLTcwMDogIzAwMjIzNTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWN5YW4tMTAwOiAjYTJkOWQ5OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tY3lhbi0yMDA6ICM3M2M1YzU7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1jeWFuLTMwMDogIzAwOTU5NjsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWN5YW4tNDAwOiAjMDA1ZjYwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tY3lhbi01MDA6ICMwMDM3Mzc7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1jeWFuLTYwMDogIzAwM2Q0NDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWN5YW4tNzAwOiAjMDAxZjIyOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tZ29sZC0xMDA6ICNmOWUwYTI7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1nb2xkLTIwMDogI2Y2ZDE3MzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWdvbGQtMzAwOiAjZjRjMTQ1OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tZ29sZC00MDA6ICNmMGFiMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1nb2xkLTUwMDogI2M1OGMwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWdvbGQtNjAwOiAjNzk1NjAwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tZ29sZC03MDA6ICMzZDJjMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi0xMDA6ICNiZGU1Yjg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi0yMDA6ICM5NWQ1OGU7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi0zMDA6ICM2ZWM2NjQ7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi00MDA6ICM1YmEzNTI7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi01MDA6ICM0NjdmNDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi02MDA6ICMxZTRmMTg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1ncmVlbi03MDA6ICMwZjI4MGQ7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1saWdodC1ibHVlLTEwMDogI2JlZWRmOTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWJsdWUtMjAwOiAjN2NkYmYzOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tbGlnaHQtYmx1ZS0zMDA6ICMzNWNhZWQ7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1saWdodC1ibHVlLTQwMDogIzAwYjllNDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWJsdWUtNTAwOiAjMDA4YmFkOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tbGlnaHQtYmx1ZS02MDA6ICMwMDVjNzM7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1saWdodC1ibHVlLTcwMDogIzAwMmQzOTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTEwMDogI2U0ZjViYzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTIwMDogI2M4ZWI3OTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTMwMDogI2FjZTEyZTsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTQwMDogIzkyZDQwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTUwMDogIzZjYTEwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTYwMDogIzQ4NmIwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLWxpZ2h0LWdyZWVuLTcwMDogIzI1MzYwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLW9yYW5nZS0xMDA6ICNmNGI2Nzg7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1vcmFuZ2UtMjAwOiAjZWY5MjM0OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tb3JhbmdlLTMwMDogI2VjN2EwODsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLW9yYW5nZS00MDA6ICNjNDYxMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1vcmFuZ2UtNTAwOiAjOGY0NzAwOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tb3JhbmdlLTYwMDogIzc3M2QwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLW9yYW5nZS03MDA6ICMzYjFmMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1wdXJwbGUtMTAwOiAjY2JjMWZmOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcHVycGxlLTIwMDogI2IyYTNmZjsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXB1cnBsZS0zMDA6ICNhMThmZmY7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1wdXJwbGUtNDAwOiAjODQ3NmQxOyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcHVycGxlLTUwMDogIzY3NTNhYzsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXB1cnBsZS02MDA6ICM0MDE5OWE7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1wdXJwbGUtNzAwOiAjMWYwMDY2OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcmVkLTEwMDogI2M5MTkwYjsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXJlZC0yMDA6ICNhMzAwMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS1yZWQtMzAwOiAjN2QxMDA3OyAtLXBmLWdsb2JhbC0tcGFsZXR0ZS0tcmVkLTQwMDogIzQ3MDAwMDsgLS1wZi1nbG9iYWwtLXBhbGV0dGUtLXJlZC01MDA6ICMyYzAwMDA7IC0tcGYtZ2xvYmFsLS1wYWxldHRlLS13aGl0ZTogI2ZmZjsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tMTAwOiAjZmZmOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS0xNTA6ICNmNWY1ZjU7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLTIwMDogI2ZhZmFmYTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tMzAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1saWdodC0xMDA6ICNmZmY7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLWxpZ2h0LTIwMDogI2ZhZmFmYTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tbGlnaHQtMzAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1kYXJrLTEwMDogIzE1MTUxNTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay0yMDA6ICMzYzNmNDI7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLWRhcmstMzAwOiAjMjEyNDI3OyAtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS1kYXJrLTQwMDogIzRmNTI1NTsgLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay10cmFuc3BhcmVudC0xMDA6IHJnYmEoMywgMywgMywgMC42Mik7IC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLWRhcmstdHJhbnNwYXJlbnQtMjAwOiByZ2JhKDMsIDMsIDMsIDAuMzIpOyAtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMDogIzE1MTUxNTsgLS1wZi1nbG9iYWwtLUNvbG9yLS0yMDA6ICM3Mzc2Nzk7IC0tcGYtZ2xvYmFsLS1Db2xvci0tMzAwOiAjM2MzZjQyOyAtLXBmLWdsb2JhbC0tQ29sb3ItLTQwMDogIzhhOGQ5MDsgLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDA6ICNmZmY7IC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMjAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tQ29sb3ItLWxpZ2h0LTMwMDogI2QyZDJkMjsgLS1wZi1nbG9iYWwtLUNvbG9yLS1kYXJrLTEwMDogIzE1MTUxNTsgLS1wZi1nbG9iYWwtLUNvbG9yLS1kYXJrLTIwMDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWFjdGl2ZS1jb2xvci0tMTAwOiAjMDZjOyAtLXBmLWdsb2JhbC0tYWN0aXZlLWNvbG9yLS0yMDA6ICNiZWUxZjQ7IC0tcGYtZ2xvYmFsLS1hY3RpdmUtY29sb3ItLTMwMDogIzczYmNmNzsgLS1wZi1nbG9iYWwtLWFjdGl2ZS1jb2xvci0tNDAwOiAjMmI5YWYzOyAtLXBmLWdsb2JhbC0tZGlzYWJsZWQtY29sb3ItLTEwMDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWRpc2FibGVkLWNvbG9yLS0yMDA6ICNkMmQyZDI7IC0tcGYtZ2xvYmFsLS1kaXNhYmxlZC1jb2xvci0tMzAwOiAjZWRlZGVkOyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMTAwOiAjMDZjOyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMjAwOiAjMDA0MDgwOyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tbGlnaHQtMTAwOiAjNzNiY2Y3OyAtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tZGFyay0xMDA6ICMwNmM7IC0tcGYtZ2xvYmFsLS1zZWNvbmRhcnktY29sb3ItLTEwMDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWRlZmF1bHQtY29sb3ItLTEwMDogIzczYzVjNTsgLS1wZi1nbG9iYWwtLWRlZmF1bHQtY29sb3ItLTIwMDogIzAwOTU5NjsgLS1wZi1nbG9iYWwtLWRlZmF1bHQtY29sb3ItLTMwMDogIzAwMzczNzsgLS1wZi1nbG9iYWwtLXN1Y2Nlc3MtY29sb3ItLTEwMDogIzkyZDQwMDsgLS1wZi1nbG9iYWwtLXN1Y2Nlc3MtY29sb3ItLTIwMDogIzQ4NmIwMDsgLS1wZi1nbG9iYWwtLWluZm8tY29sb3ItLTEwMDogIzczYmNmNzsgLS1wZi1nbG9iYWwtLWluZm8tY29sb3ItLTIwMDogIzAwNDM2ODsgLS1wZi1nbG9iYWwtLXdhcm5pbmctY29sb3ItLTEwMDogI2YwYWIwMDsgLS1wZi1nbG9iYWwtLXdhcm5pbmctY29sb3ItLTIwMDogIzc5NTYwMDsgLS1wZi1nbG9iYWwtLWRhbmdlci1jb2xvci0tMTAwOiAjYzkxOTBiOyAtLXBmLWdsb2JhbC0tZGFuZ2VyLWNvbG9yLS0yMDA6ICNhMzAwMDA7IC0tcGYtZ2xvYmFsLS1kYW5nZXItY29sb3ItLTMwMDogIzQ3MDAwMDsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tc206IDAgMC4wNjI1cmVtIDAuMTI1cmVtIDAgcmdiYSgzLCAzLCAzLCAwLjIpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1zbS1yaWdodDogMC4yNXJlbSAwIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4xMik7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLXNtLWxlZnQ6IC0wLjI1cmVtIDAgMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjEyKTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tc20tYm90dG9tOiAwIDAuMjVyZW0gMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjEyKTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tc20tdG9wOiAwIC0wLjI1cmVtIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4xMik7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLW1kOiAwIDAuMDYyNXJlbSAwLjA2MjVyZW0gMHJlbSByZ2JhKDMsIDMsIDMsIDAuMDUpLCAwIDAuMjVyZW0gMC41cmVtIDAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjA2KTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tbWQtcmlnaHQ6IDAuMzEyNXJlbSAwIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLW1kLWxlZnQ6IC0wLjMxMjVyZW0gMCAwLjYyNXJlbSAtMC4yNXJlbSByZ2JhKDMsIDMsIDMsIDAuMjUpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1tZC1ib3R0b206IDAgMC4zMTI1cmVtIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLW1kLXRvcDogMCAtMC4zMTI1cmVtIDAuNjI1cmVtIC0wLjI1cmVtIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLWxnOiAwIDAuMTg3NXJlbSAwLjQzNzVyZW0gMC4xODc1cmVtIHJnYmEoMywgMywgMywgMC4xMyksIDAgMC42ODc1cmVtIDEuNXJlbSAxcmVtIHJnYmEoMywgMywgMywgMC4xMik7IC0tcGYtZ2xvYmFsLS1Cb3hTaGFkb3ctLWxnLXJpZ2h0OiAwLjc1cmVtIDAgMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjA3KTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0tbGctbGVmdDogLTAuNzVyZW0gMCAwLjYyNXJlbSAtMC4yNXJlbSByZ2JhKDMsIDMsIDMsIDAuMDcpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1sZy1ib3R0b206IDAgMC43NXJlbSAwLjYyNXJlbSAtMC4yNXJlbSByZ2JhKDMsIDMsIDMsIDAuMDcpOyAtLXBmLWdsb2JhbC0tQm94U2hhZG93LS1sZy10b3A6IDAgLTAuNzVyZW0gMC42MjVyZW0gLTAuMjVyZW0gcmdiYSgzLCAzLCAzLCAwLjA3KTsgLS1wZi1nbG9iYWwtLUJveFNoYWRvdy0taW5zZXQ6IGluc2V0IDAgMCAwLjYyNXJlbSAwIHJnYmEoMywgMywgMywgMC4yNSk7IC0tcGYtZ2xvYmFsLS1mb250LXBhdGg6IC4vYXNzZXRzL2ZvbnRzOyAtLXBmLWdsb2JhbC0tZm9udGljb24tcGF0aDogLi9hc3NldHMvcGZpY29uOyAtLXBmLWdsb2JhbC0tc3BhY2VyLS14czogMC4yNXJlbTsgLS1wZi1nbG9iYWwtLXNwYWNlci0tc206IDAuNXJlbTsgLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQ6IDFyZW07IC0tcGYtZ2xvYmFsLS1zcGFjZXItLWxnOiAxLjVyZW07IC0tcGYtZ2xvYmFsLS1zcGFjZXItLXhsOiAycmVtOyAtLXBmLWdsb2JhbC0tc3BhY2VyLS0yeGw6IDNyZW07IC0tcGYtZ2xvYmFsLS1zcGFjZXItLTN4bDogNHJlbTsgLS1wZi1nbG9iYWwtLXNwYWNlci0tZm9ybS1lbGVtZW50OiAwLjM3NXJlbTsgLS1wZi1nbG9iYWwtLWd1dHRlcjogMS41cmVtOyAtLXBmLWdsb2JhbC0tZ3V0dGVyLS1tZDogMXJlbTsgLS1wZi1nbG9iYWwtLWdvbGRlbi1yYXRpbzogMS42ODE7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLXhzOiAxMDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLXNtOiAyMDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLW1kOiAzMDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLWxnOiA0MDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLXhsOiA1MDA7IC0tcGYtZ2xvYmFsLS1aSW5kZXgtLTJ4bDogNjAwOyAtLXBmLWdsb2JhbC0tYnJlYWtwb2ludC0teHM6IDA7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS1zbTogNTc2cHg7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS1tZDogNzY4cHg7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS1sZzogOTkycHg7IC0tcGYtZ2xvYmFsLS1icmVha3BvaW50LS14bDogMTIwMHB4OyAtLXBmLWdsb2JhbC0tYnJlYWtwb2ludC0tMnhsOiAxNDUwcHg7IC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvcjogIzA2YzsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3ZlcjogIzAwNDA4MDsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1saWdodDogIzczYmNmNzsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1saWdodC0taG92ZXI6ICMyYjlhZjM7IC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvci0tZGFyazogIzA2YzsgLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1kYXJrLS1ob3ZlcjogIzAwNDA4MDsgLS1wZi1nbG9iYWwtLWxpbmstLUZvbnRXZWlnaHQ6IDUwMDsgLS1wZi1nbG9iYWwtLWxpbmstLVRleHREZWNvcmF0aW9uOiBub25lOyAtLXBmLWdsb2JhbC0tbGluay0tVGV4dERlY29yYXRpb24tLWhvdmVyOiB1bmRlcmxpbmU7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJXaWR0aC0tc206IDFweDsgLS1wZi1nbG9iYWwtLUJvcmRlcldpZHRoLS1tZDogMnB4OyAtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLWxnOiAzcHg7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tMTAwOiAjZDJkMmQyOyAtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTIwMDogIzhhOGQ5MDsgLS1wZi1nbG9iYWwtLUJvcmRlckNvbG9yLS0zMDA6ICNlZGVkZWQ7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tZGFyay0xMDA6ICNkMmQyZDI7IC0tcGYtZ2xvYmFsLS1Cb3JkZXJDb2xvci0tbGlnaHQtMTAwOiAjYjhiYmJlOyAtLXBmLWdsb2JhbC0tQm9yZGVyUmFkaXVzLS1zbTogM3B4OyAtLXBmLWdsb2JhbC0tQm9yZGVyUmFkaXVzLS1sZzogMzBlbTsgLS1wZi1nbG9iYWwtLWljb24tLUNvbG9yLS1saWdodDogIzczNzY3OTsgLS1wZi1nbG9iYWwtLWljb24tLUNvbG9yLS1kYXJrOiAjMTUxNTE1OyAtLXBmLWdsb2JhbC0taWNvbi0tRm9udFNpemUtLXNtOiAwLjYyNXJlbTsgLS1wZi1nbG9iYWwtLWljb24tLUZvbnRTaXplLS1tZDogMS4xMjVyZW07IC0tcGYtZ2xvYmFsLS1pY29uLS1Gb250U2l6ZS0tbGc6IDEuNXJlbTsgLS1wZi1nbG9iYWwtLWljb24tLUZvbnRTaXplLS14bDogMy4zNzVyZW07IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1zYW5zLXNlcmlmOiBvdmVycGFzcywgb3ZlcnBhc3MsIG9wZW4gc2FucywgLWFwcGxlLXN5c3RlbSwgYmxpbmttYWNzeXN0ZW1mb250LCBTZWdvZSBVSSwgcm9ib3RvLCBIZWx2ZXRpY2EgTmV1ZSwgYXJpYWwsIHNhbnMtc2VyaWYsIEFwcGxlIENvbG9yIEVtb2ppLCBTZWdvZSBVSSBFbW9qaSwgU2Vnb2UgVUkgU3ltYm9sOyAtLXBmLWdsb2JhbC0tRm9udEZhbWlseS0taGVhZGluZy0tc2Fucy1zZXJpZjogb3ZlcnBhc3MsIG92ZXJwYXNzLCBvcGVuIHNhbnMsIC1hcHBsZS1zeXN0ZW0sIGJsaW5rbWFjc3lzdGVtZm9udCwgU2Vnb2UgVUksIHJvYm90bywgSGVsdmV0aWNhIE5ldWUsIGFyaWFsLCBzYW5zLXNlcmlmLCBBcHBsZSBDb2xvciBFbW9qaSwgU2Vnb2UgVUkgRW1vamksIFNlZ29lIFVJIFN5bWJvbDsgLS1wZi1nbG9iYWwtLUZvbnRGYW1pbHktLW1vbm9zcGFjZTogb3ZlcnBhc3MtbW9ubywgb3ZlcnBhc3MtbW9ubywgU0ZNb25vLVJlZ3VsYXIsIG1lbmxvLCBtb25hY28sIGNvbnNvbGFzLCBMaWJlcmF0aW9uIE1vbm8sIENvdXJpZXIgTmV3LCBtb25vc3BhY2U7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1zYW5zLXNlcmlmOiBSZWRIYXRUZXh0LCBPdmVycGFzcywgb3ZlcnBhc3MsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1oZWFkaW5nLS1zYW5zLXNlcmlmOiBSZWRIYXREaXNwbGF5LCBPdmVycGFzcywgb3ZlcnBhc3MsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1tb25vc3BhY2U6IExpYmVyYXRpb24gTW9ubywgY29uc29sYXMsIFNGTW9uby1SZWd1bGFyLCBtZW5sbywgbW9uYWNvLCBDb3VyaWVyIE5ldywgbW9ub3NwYWNlOyAtLXBmLWdsb2JhbC0tRm9udFNpemUtLTR4bDogMi4yNXJlbTsgLS1wZi1nbG9iYWwtLUZvbnRTaXplLS0zeGw6IDEuNzVyZW07IC0tcGYtZ2xvYmFsLS1Gb250U2l6ZS0tMnhsOiAxLjVyZW07IC0tcGYtZ2xvYmFsLS1Gb250U2l6ZS0teGw6IDEuMjVyZW07IC0tcGYtZ2xvYmFsLS1Gb250U2l6ZS0tbGc6IDEuMTI1cmVtOyAtLXBmLWdsb2JhbC0tRm9udFNpemUtLW1kOiAxcmVtOyAtLXBmLWdsb2JhbC0tRm9udFNpemUtLXNtOiAwLjg3NXJlbTsgLS1wZi1nbG9iYWwtLUZvbnRTaXplLS14czogMC43NXJlbTsgLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLWxpZ2h0OiAzMDA7IC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1ub3JtYWw6IDQwMDsgLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLXNlbWktYm9sZDogNTAwOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tYm9sZDogNjAwOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tcmVkaGF0Zm9udC0tYm9sZDogNzAwOyAtLXBmLWdsb2JhbC0tTGluZUhlaWdodC0tc206IDEuMzsgLS1wZi1nbG9iYWwtLUxpbmVIZWlnaHQtLW1kOiAxLjU7IC0tcGYtZ2xvYmFsLS1MaXN0U3R5bGU6IGRpc2Mgb3V0c2lkZTsgLS1wZi1nbG9iYWwtLVRyYW5zaXRpb246IGFsbCAyNTBtcyBjdWJpYy1iZXppZXIoMC40MiwgMCwgMC41OCwgMSk7IC0tcGYtZ2xvYmFsLS1UaW1pbmdGdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNjQ1LCAwLjA0NSwgMC4zNTUsIDEpOyAtLXBmLWdsb2JhbC0tVHJhbnNpdGlvbkR1cmF0aW9uOiAyNTBtczsgLS1wZi1nbG9iYWwtLWFycm93LS13aWR0aDogMC45Mzc1cmVtOyAtLXBmLWdsb2JhbC0tYXJyb3ctLXdpZHRoLWxnOiAxLjU2MjVyZW07IC0tcGYtZ2xvYmFsLS10YXJnZXQtc2l6ZS0tTWluV2lkdGg6IDQ0cHg7IC0tcGYtZ2xvYmFsLS10YXJnZXQtc2l6ZS0tTWluSGVpZ2h0OiA0NHB4OyB9CgoucGYtbS1yZWRoYXQtZm9udCB7IC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1zYW5zLXNlcmlmOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRGYW1pbHktLXJlZGhhdGZvbnQtLXNhbnMtc2VyaWYpOyAtLXBmLWdsb2JhbC0tRm9udEZhbWlseS0taGVhZGluZy0tc2Fucy1zZXJpZjogdmFyKC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1oZWFkaW5nLS1zYW5zLXNlcmlmKTsgLS1wZi1nbG9iYWwtLUZvbnRGYW1pbHktLW1vbm9zcGFjZTogdmFyKC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1yZWRoYXRmb250LS1tb25vc3BhY2UpOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tc2VtaS1ib2xkOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLXJlZGhhdGZvbnQtLWJvbGQpOyAtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tYm9sZDogdmFyKC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1yZWRoYXRmb250LS1ib2xkKTsgLS1wZi1nbG9iYWwtLWxpbmstLUZvbnRXZWlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tRm9udFdlaWdodC0tbm9ybWFsKTsgfQoKaHRtbCwgYm9keSwgcCwgb2wsIHVsLCBsaSwgZGwsIGR0LCBkZCwgYmxvY2txdW90ZSwgZmlndXJlLCBmaWVsZHNldCwgbGVnZW5kLCB0ZXh0YXJlYSwgcHJlLCBpZnJhbWUsIGhyLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsgcGFkZGluZzogMDsgbWFyZ2luOiAwOyB9CgpodG1sLCBib2R5IHsgaGVpZ2h0OiAxMDAlOyB9CgpoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsgZm9udC1zaXplOiAxMDAlOyBmb250LXdlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1ub3JtYWwpOyB9Cgp1bCB7IGxpc3Qtc3R5bGU6IG5vbmU7IH0KCmJ1dHRvbiwgaW5wdXQsIG9wdGdyb3VwLCBzZWxlY3QsIHRleHRhcmVhIHsgbWFyZ2luOiAwOyBmb250LWZhbWlseTogaW5oZXJpdDsgZm9udC1zaXplOiAxMDAlOyBsaW5lLWhlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1MaW5lSGVpZ2h0LS1tZCk7IGNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS0xMDApOyB9CgppbWcsIGVtYmVkLCBpZnJhbWUsIG9iamVjdCwgYXVkaW8sIHZpZGVvIHsgbWF4LXdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87IH0KCmlmcmFtZSB7IGJvcmRlcjogMDsgfQoKdGFibGUgeyBib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfQoKdGQsIHRoIHsgcGFkZGluZzogMDsgdGV4dC1hbGlnbjogbGVmdDsgfQoKKiwgKjo6YmVmb3JlLCAqOjphZnRlciB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0KCmh0bWwgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgbGluZS1oZWlnaHQ6IDEuMTU7IH0KCmJvZHkgeyBmb250LWZhbWlseTogdmFyKC0tcGYtZ2xvYmFsLS1Gb250RmFtaWx5LS1zYW5zLXNlcmlmKTsgZm9udC1zaXplOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRTaXplLS1tZCk7IGZvbnQtd2VpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLW5vcm1hbCk7IGxpbmUtaGVpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLUxpbmVIZWlnaHQtLW1kKTsgdGV4dC1hbGlnbjogbGVmdDsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1CYWNrZ3JvdW5kQ29sb3ItLTEwMCk7IH0KCmEgeyBmb250LXdlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1saW5rLS1Gb250V2VpZ2h0KTsgY29sb3I6IHZhcigtLXBmLWdsb2JhbC0tbGluay0tQ29sb3IpOyB0ZXh0LWRlY29yYXRpb246IHZhcigtLXBmLWdsb2JhbC0tbGluay0tVGV4dERlY29yYXRpb24pOyB9CmE6aG92ZXIgeyAtLXBmLWdsb2JhbC0tbGluay0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tbGluay0tQ29sb3ItLWhvdmVyKTsgLS1wZi1nbG9iYWwtLWxpbmstLVRleHREZWNvcmF0aW9uOiB2YXIoLS1wZi1nbG9iYWwtLWxpbmstLVRleHREZWNvcmF0aW9uLS1ob3Zlcik7IH0KCmJ1dHRvbiwgYSB7IGN1cnNvcjogcG9pbnRlcjsgfQoKYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLCBbdHlwZT0iYnV0dG9uIl06Oi1tb3otZm9jdXMtaW5uZXIsIFt0eXBlPSJyZXNldCJdOjotbW96LWZvY3VzLWlubmVyLCBbdHlwZT0ic3VibWl0Il06Oi1tb3otZm9jdXMtaW5uZXIgeyBwYWRkaW5nOiAwOyBib3JkZXItc3R5bGU6IG5vbmU7IH0KYnV0dG9uOi1tb3otZm9jdXNyaW5nLCBbdHlwZT0iYnV0dG9uIl06LW1vei1mb2N1c3JpbmcsIFt0eXBlPSJyZXNldCJdOi1tb3otZm9jdXNyaW5nLCBbdHlwZT0ic3VibWl0Il06LW1vei1mb2N1c3JpbmcgeyBvdXRsaW5lOiAxcHggZG90dGVkIEJ1dHRvblRleHQ7IH0KCi5wZi1jLWxvZ2luIHsgLS1wZi1jLWxvZ2luLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbGcpOyAtLXBmLWMtbG9naW4tLVBhZGRpbmdCb3R0b206IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1sZyk7IC0tcGYtYy1sb2dpbi0teGwtLUJhY2tncm91bmRJbWFnZTogbm9uZTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLXhsLS1HcmlkQ29sdW1uR2FwOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tM3hsKTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLU1heFdpZHRoOiAzMS4yNXJlbTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLXhsLS1NYXhXaWR0aDogbm9uZTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLVBhZGRpbmdMZWZ0OiA2LjEyNXJlbTsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLVBhZGRpbmdSaWdodDogNi4xMjVyZW07IC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS14bC0tR3JpZFRlbXBsYXRlQ29sdW1uczogMzRyZW0gbWlubWF4KGF1dG8sIDM0cmVtKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLXNtLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLXNtLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9faGVhZGVyLS14bC0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLXhsLS1NYXJnaW5Ub3A6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS0zeGwpOyAtLXBmLWMtbG9naW5fX2hlYWRlci0tYy1icmFuZC0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbGcpOyAtLXBmLWMtbG9naW5fX2hlYWRlci0tYy1icmFuZC0teGwtLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWxvZ2luX19tYWluLS14bC0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbGcpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUGFkZGluZ1JpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teGwpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXhsKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tbWQtLVBhZGRpbmdSaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLW1kLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLUNvbHVtbkdhcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUm93R2FwOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MtLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKTsgLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci1kZXNjLS1tZC0tTWFyZ2luQm90dG9tOiAwOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MtLUZvbnRTaXplOiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRTaXplLS1zbSk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS14bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teGwpOyAtLXBmLWMtbG9naW5fX21haW4tYm9keS0tUGFkZGluZ0xlZnQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS14bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1tZC0tUGFkZGluZ1JpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgLS1wZi1jLWxvZ2luX19tYWluLWJvZHktLW1kLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTJ4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1jLWZvcm1fX2hlbHBlci10ZXh0LWljb24tLUZvbnRTaXplOiB2YXIoLS1wZi1nbG9iYWwtLWljb24tLUZvbnRTaXplLS1tZCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1jLWZvcm1fX2hlbHBlci10ZXh0LWljb24tLU1hcmdpblJpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tc20pOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tM3hsKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci0tYy10aXRsZS0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tc20pOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS0zeGwpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nQm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teGwpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLTN4bCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS0tUGFkZGluZ1JpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tLVBhZGRpbmdMZWZ0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLXNtKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1GaWxsOiB2YXIoLS1wZi1nbG9iYWwtLWljb24tLUNvbG9yLS1saWdodCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS1saW5rLXN2Zy0tV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0taWNvbi0tRm9udFNpemUtLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1IZWlnaHQ6IHZhcigtLXBmLWdsb2JhbC0taWNvbi0tRm9udFNpemUtLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1ob3Zlci0tRmlsbDogdmFyKC0tcGYtZ2xvYmFsLS1pY29uLS1Db2xvci0tZGFyayk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ1RvcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ0JvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLWxnKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQmFja2dyb3VuZENvbG9yLS0zMDApOyAtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtaXRlbS0tUGFkZGluZ1RvcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19mb290ZXItLXNtLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWxvZ2luX19mb290ZXItLXNtLS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1jLWxpc3QtLVBhZGRpbmdUb3A6IHZhcigtLXBmLWdsb2JhbC0tc3BhY2VyLS1tZCk7IC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1jLWxpc3QtLXhsLS1QYWRkaW5nVG9wOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKTsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IG1pbi1oZWlnaHQ6IDEwMHZoOyBwYWRkaW5nLXRvcDogdmFyKC0tcGYtYy1sb2dpbi0tUGFkZGluZ1RvcCk7IHBhZGRpbmctYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luLS1QYWRkaW5nQm90dG9tKTsgfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWxvZ2luIHsgLS1wZi1jLWxvZ2luX19jb250YWluZXItLU1heFdpZHRoOiB2YXIoLS1wZi1jLWxvZ2luX19jb250YWluZXItLXhsLS1NYXhXaWR0aCk7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWxvZ2luIHsgLS1wZi1jLWxvZ2luX19oZWFkZXItLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtYy1sb2dpbl9faGVhZGVyLS14bC0tTWFyZ2luQm90dG9tKTsgLS1wZi1jLWxvZ2luX19oZWFkZXItLWMtYnJhbmQtLU1hcmdpbkJvdHRvbTogdmFyKC0tcGYtYy1sb2dpbl9faGVhZGVyLS1jLWJyYW5kLS14bC0tTWFyZ2luQm90dG9tKTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbiB7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLVBhZGRpbmdSaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLW1kLS1QYWRkaW5nUmlnaHQpOyAtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLW1kLS1QYWRkaW5nTGVmdCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItZGVzYy0tTWFyZ2luQm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci1kZXNjLS1tZC0tTWFyZ2luQm90dG9tKTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbiB7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nUmlnaHQ6IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tbWQtLVBhZGRpbmdSaWdodCk7IC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nTGVmdDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1tZC0tUGFkZGluZ0xlZnQpOyB9IH0KQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgeyAucGYtYy1sb2dpbiB7IC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1jLWxpc3QtLVBhZGRpbmdUb3A6IHZhcigtLXBmLWMtbG9naW5fX2Zvb3Rlci0tYy1saXN0LS14bC0tUGFkZGluZ1RvcCk7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWxvZ2luIHsgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcGYtYy1sb2dpbi0teGwtLUJhY2tncm91bmRJbWFnZSk7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpIHsgLnBmLWMtbG9naW4geyBhbGlnbi1pdGVtczogY2VudGVyOyB9IH0KCi5wZi1jLWxvZ2luX19jb250YWluZXIgeyBtYXgtd2lkdGg6IHZhcigtLXBmLWMtbG9naW5fX2NvbnRhaW5lci0tTWF4V2lkdGgpOyB9CkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsgLnBmLWMtbG9naW5fX2NvbnRhaW5lciB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtY29sdW1uLWdhcDogdmFyKC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS14bC0tR3JpZENvbHVtbkdhcCk7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogdmFyKC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS14bC0tR3JpZFRlbXBsYXRlQ29sdW1ucyk7IGdyaWQtdGVtcGxhdGUtYXJlYXM6ICJtYWluIGhlYWRlciIgIm1haW4gZm9vdGVyIiAibWFpbiAuIjsgcGFkZGluZy1yaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fY29udGFpbmVyLS1QYWRkaW5nUmlnaHQpOyBwYWRkaW5nLWxlZnQ6IHZhcigtLXBmLWMtbG9naW5fX2NvbnRhaW5lci0tUGFkZGluZ0xlZnQpOyB9IH0KCi5wZi1jLWxvZ2luX19oZWFkZXIgeyBjb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgZ3JpZC1hcmVhOiBoZWFkZXI7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDU3NnB4KSB7IC5wZi1jLWxvZ2luX19oZWFkZXIgeyBwYWRkaW5nLXJpZ2h0OiB2YXIoLS1wZi1jLWxvZ2luX19oZWFkZXItLXNtLS1QYWRkaW5nUmlnaHQpOyBwYWRkaW5nLWxlZnQ6IHZhcigtLXBmLWMtbG9naW5fX2hlYWRlci0tc20tLVBhZGRpbmdMZWZ0KTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsgLnBmLWMtbG9naW5fX2hlYWRlciB7IG1hcmdpbi10b3A6IHZhcigtLXBmLWMtbG9naW5fX2hlYWRlci0teGwtLU1hcmdpblRvcCk7IH0gfQoucGYtYy1sb2dpbl9faGVhZGVyIC5wZi1jLWJyYW5kIHsgbWFyZ2luLWJvdHRvbTogdmFyKC0tcGYtYy1sb2dpbl9faGVhZGVyLS1jLWJyYW5kLS1NYXJnaW5Cb3R0b20pOyB9CgoucGYtYy1sb2dpbl9fbWFpbiB7IGdyaWQtYXJlYTogbWFpbjsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1sb2dpbl9fbWFpbiA+IDpmaXJzdC1jaGlsZDpub3QoLnBmLWMtbG9naW5fX21haW4taGVhZGVyKSB7IHBhZGRpbmctdG9wOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUGFkZGluZ1RvcCk7IH0KLnBmLWMtbG9naW5fX21haW4gPiA6bGFzdC1jaGlsZDpub3QoLnBmLWMtbG9naW5fX21haW4tZm9vdGVyKSB7IHBhZGRpbmctYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci0tUGFkZGluZ0JvdHRvbSk7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDEyMDBweCkgeyAucGYtYy1sb2dpbl9fbWFpbiB7IG1hcmdpbi1ib3R0b206IHZhcigtLXBmLWMtbG9naW5fX21haW4tLXhsLS1NYXJnaW5Cb3R0b20pOyB9IH0KCi5wZi1jLWxvZ2luX19tYWluLWhlYWRlciB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIGF1dG87IGNvbHVtbi1nYXA6IHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1Db2x1bW5HYXApOyByb3ctZ2FwOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUm93R2FwKTsgYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZzogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1oZWFkZXItLVBhZGRpbmdUb3ApIHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nUmlnaHQpIHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLS1QYWRkaW5nQm90dG9tKSB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci0tUGFkZGluZ0xlZnQpOyB9CkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbl9fbWFpbi1oZWFkZXIgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDEwMCU7IH0gfQoucGYtYy1sb2dpbl9fbWFpbi1oZWFkZXIgLnBmLWMtZHJvcGRvd24geyBncmlkLWNvbHVtbjogMiAvIDM7IGdyaWQtcm93OiAxOyB9CkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgeyAucGYtYy1sb2dpbl9fbWFpbi1oZWFkZXIgLnBmLWMtZHJvcGRvd24geyBncmlkLWNvbHVtbjogYXV0bzsgZ3JpZC1yb3c6IGF1dG87IH0gfQoKLnBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MgeyBtYXJnaW4tYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWhlYWRlci1kZXNjLS1NYXJnaW5Cb3R0b20pOyBmb250LXNpemU6IHZhcigtLXBmLWMtbG9naW5fX21haW4taGVhZGVyLWRlc2MtLUZvbnRTaXplKTsgZ3JpZC1jb2x1bW46IDEgLyAtMTsgfQoKLnBmLWMtbG9naW5fX21haW4tYm9keSB7IHBhZGRpbmctcmlnaHQ6IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tUGFkZGluZ1JpZ2h0KTsgcGFkZGluZy1ib3R0b206IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tUGFkZGluZ0JvdHRvbSk7IHBhZGRpbmctbGVmdDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1ib2R5LS1QYWRkaW5nTGVmdCk7IH0KLnBmLWMtbG9naW5fX21haW4tYm9keSAucGYtYy1mb3JtX19oZWxwZXItdGV4dCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KLnBmLWMtbG9naW5fX21haW4tYm9keSAucGYtYy1mb3JtX19oZWxwZXItdGV4dCAucGYtYy1mb3JtX19oZWxwZXItdGV4dC1pY29uIHsgbWFyZ2luLXJpZ2h0OiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWJvZHktLWMtZm9ybV9faGVscGVyLXRleHQtaWNvbi0tTWFyZ2luUmlnaHQpOyBmb250LXNpemU6IHZhcigtLXBmLWMtbG9naW5fX21haW4tYm9keS0tYy1mb3JtX19oZWxwZXItdGV4dC1pY29uLS1Gb250U2l6ZSk7IH0KCi5wZi1jLWxvZ2luX19tYWluLWZvb3RlciB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgfQoucGYtYy1sb2dpbl9fbWFpbi1mb290ZXIgLnBmLWMtdGl0bGUgeyBtYXJnaW4tYm90dG9tOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci0tYy10aXRsZS0tTWFyZ2luQm90dG9tKTsgdGV4dC1hbGlnbjogY2VudGVyOyB9Ci5wZi1jLWxvZ2luX19tYWluLWZvb3RlciA+ICogeyBmbGV4LWJhc2lzOiAxMDAlOyB9CgoucGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBwYWRkaW5nOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy0tUGFkZGluZ1RvcCkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtLVBhZGRpbmdSaWdodCkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtLVBhZGRpbmdCb3R0b20pIHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLS1QYWRkaW5nTGVmdCk7IH0KCi5wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtIHsgcGFkZGluZy1yaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS0tUGFkZGluZ1JpZ2h0KTsgcGFkZGluZy1sZWZ0OiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLS1QYWRkaW5nTGVmdCk7IG1hcmdpbi1ib3R0b206IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tLU1hcmdpbkJvdHRvbSk7IH0KCi5wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmsgc3ZnIHsgZmlsbDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS1saW5rLXN2Zy0tRmlsbCk7IHdpZHRoOiAxMDAlOyBtYXgtd2lkdGg6IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWxpbmtzLWl0ZW0tbGluay1zdmctLVdpZHRoKTsgaGVpZ2h0OiAxMDAlOyBtYXgtaGVpZ2h0OiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbmstc3ZnLS1IZWlnaHQpOyB9Ci5wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1saW5rcy1pdGVtLWxpbms6aG92ZXIgc3ZnIHsgZmlsbDogdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItbGlua3MtaXRlbS1saW5rLXN2Zy0taG92ZXItLUZpbGwpOyB9CgoucGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZCB7IHBhZGRpbmc6IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtLVBhZGRpbmdUb3ApIHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtLVBhZGRpbmdSaWdodCkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ0JvdHRvbSkgdmFyKC0tcGYtYy1sb2dpbl9fbWFpbi1mb290ZXItYmFuZC0tUGFkZGluZ0xlZnQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQtLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtbG9naW5fX21haW4tZm9vdGVyLWJhbmQgPiAqICsgKiB7IHBhZGRpbmctdG9wOiB2YXIoLS1wZi1jLWxvZ2luX19tYWluLWZvb3Rlci1iYW5kLWl0ZW0tLVBhZGRpbmdUb3ApOyB9CgoucGYtYy1sb2dpbl9fZm9vdGVyIHsgY29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IGdyaWQtYXJlYTogZm9vdGVyOyB9CkBtZWRpYSAobWF4LXdpZHRoOiA1NzZweCkgeyAucGYtYy1sb2dpbl9fZm9vdGVyIHsgcGFkZGluZy1yaWdodDogdmFyKC0tcGYtYy1sb2dpbl9fZm9vdGVyLS1zbS0tUGFkZGluZ1JpZ2h0KTsgcGFkZGluZy1sZWZ0OiB2YXIoLS1wZi1jLWxvZ2luX19mb290ZXItLXNtLS1QYWRkaW5nTGVmdCk7IH0gfQoucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWxpc3QgYSB7IGNvbG9yOiB1bnNldDsgfQoucGYtYy1sb2dpbl9fZm9vdGVyIC5wZi1jLWxpc3Q6bm90KDpvbmx5LWNoaWxkKSB7IHBhZGRpbmctdG9wOiB2YXIoLS1wZi1jLWxvZ2luX19mb290ZXItLWMtbGlzdC0tUGFkZGluZ1RvcCk7IH0KCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJhY2tncm91bmRDb2xvci0tZGFyay0xMDApOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREkwTGpBdU1pd2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SWt4aGVXVnlYekVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZUcxc2JuTTZlR3hwYm1zOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2ZUd4cGJtc2lJSGc5SWpCd2VDSWdlVDBpTUhCNElnb0pJSGRwWkhSb1BTSXhPVEp3ZUNJZ2FHVnBaMmgwUFNJeE5EVndlQ0lnZG1sbGQwSnZlRDBpTUNBd0lERTVNaUF4TkRVaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURFNU1pQXhORFU3SWlCNGJXdzZjM0JoWTJVOUluQnlaWE5sY25abElqNEtQSE4wZVd4bElIUjVjR1U5SW5SbGVIUXZZM056SWo0S0NTNXpkREI3Wm1sc2JEb2pNREl3TXpBek8zMEtQQzl6ZEhsc1pUNEtQR2MrQ2drOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NVEkzTGpVc09ETXVOV014TWk0MUxEQXNNekF1TmkweUxqWXNNekF1TmkweE55NDFZekF0TVM0eUxEQXRNaTR6TFRBdU15MHpMalJzTFRjdU5DMHpNaTQwWXkweExqY3ROeTR4TFRNdU1pMHhNQzR6TFRFMUxqY3RNVFl1TmdvSkNXTXRPUzQzTFRVdE16QXVPQzB4TXk0eExUTTNMakV0TVRNdU1VTTVNUzQzTERBdU5TdzVNQ3c0TERnekxqRXNPR010Tmk0M0xEQXRNVEV1TmkwMUxqWXRNVGN1T1MwMUxqWmpMVFlzTUMwNUxqa3NOQzR4TFRFeUxqa3NNVEl1TldNd0xEQXRPQzQwTERJekxqY3RPUzQxTERJM0xqSUtDUWxqTFRBdU1pd3dMall0TUM0eUxERXVOQzB3TGpJc01TNDVRelF5TGpVc05UTXVNeXczT0M0NExEZ3pMalVzTVRJM0xqVXNPRE11TlNCTk1UWXdMRGN5TGpGak1TNDNMRGd1TWl3eExqY3NPUzR4TERFdU55d3hNQzR4WXpBc01UUXRNVFV1Tnl3eU1TNDRMVE0yTGpRc01qRXVPQW9KQ1dNdE5EWXVPQ3d3TFRnM0xqY3RNamN1TkMwNE55NDNMVFExTGpWak1DMHlMamdzTUM0MkxUVXVOQ3d4TGpVdE55NHpRekl5TGpNc05USXNNQzQxTERVMUxEQXVOU3czTkM0eVl6QXNNekV1TlN3M05DNDJMRGN3TGpNc01UTXpMamNzTnpBdU13b0pDV00wTlM0ekxEQXNOVFl1TnkweU1DNDFMRFUyTGpjdE16WXVOa014T1RBdU9DdzVOUzR4TERFM09TNDVMRGd3TGpjc01UWXdMRGN5TGpFaUx6NEtQQzluUGdvOEwzTjJaejRLKTsgYmFja2dyb3VuZC1wb3NpdGlvbjogMTEwJSAxMDUlOyBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXNpemU6IDkwJTsgfQpAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHsgYm9keSB7IGJhY2tncm91bmQtc2l6ZTogODAlOyB9IH0KQG1lZGlhIChtaW4td2lkdGg6IDEwMDBweCkgeyBib2R5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMTEwJSAxMDAlOyBiYWNrZ3JvdW5kLXNpemU6IDcwJTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsgYm9keSB7IGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgNzAlOyBiYWNrZ3JvdW5kLXNpemU6IDcwJTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAxNDAwcHgpIHsgYm9keSB7IGJhY2tncm91bmQtc2l6ZTogNzUlOyB9IH0KQG1lZGlhIChtaW4td2lkdGg6IDE4MDBweCkgeyBib2R5IHsgYmFja2dyb3VuZC1zaXplOiA3MCU7IH0gfQpAbWVkaWEgKG1pbi13aWR0aDogMTgwMHB4KSB7IGJvZHkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA3NSUgODAlOyBiYWNrZ3JvdW5kLXNpemU6IDYwJTsgfSB9CkBtZWRpYSAobWluLXdpZHRoOiAyMjAwcHgpIHsgYm9keSB7IGJhY2tncm91bmQtc2l6ZTogNTAlOyB9IH0KCkBtZWRpYSAobWF4LXdpZHRoOiAxMTk5cHgpIHsgLnBmLWMtbG9naW5fX2NvbnRhaW5lciB7IHdpZHRoOiAxMDAlOyB9IH0KLnBmLWMtbG9naW5fX21haW4tYm9keSB7IHBhZGRpbmctYm90dG9tOiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tMnhsKSAhaW1wb3J0YW50OyB9CgpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7IC5wZi1jLWJyYW5kIHsgaGVpZ2h0OiA2MHB4OyB9IH0KLnBmLWMtYnV0dG9uIHsgLS1wZi1jLWJ1dHRvbi0tUGFkZGluZ1RvcDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLWZvcm0tZWxlbWVudCk7IC0tcGYtYy1idXR0b24tLVBhZGRpbmdSaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLW1kKTsgLS1wZi1jLWJ1dHRvbi0tUGFkZGluZ0JvdHRvbTogdmFyKC0tcGYtZ2xvYmFsLS1zcGFjZXItLWZvcm0tZWxlbWVudCk7IC0tcGYtYy1idXR0b24tLVBhZGRpbmdMZWZ0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0tbWQpOyAtLXBmLWMtYnV0dG9uLS1MaW5lSGVpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLUxpbmVIZWlnaHQtLW1kKTsgLS1wZi1jLWJ1dHRvbi0tRm9udFdlaWdodDogdmFyKC0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1zZW1pLWJvbGQpOyAtLXBmLWMtYnV0dG9uLS1Gb250U2l6ZTogdmFyKC0tcGYtZ2xvYmFsLS1Gb250U2l6ZS0tbWQpOyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJSYWRpdXM6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyUmFkaXVzLS1zbSk7IC0tcGYtYy1idXR0b24tLUJvcmRlckNvbG9yOiB0cmFuc3BhcmVudDsgLS1wZi1jLWJ1dHRvbi0tQm9yZGVyV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLXNtKTsgLS1wZi1jLWJ1dHRvbi0taG92ZXItLUJvcmRlcldpZHRoOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlcldpZHRoLS1tZCk7IC0tcGYtYy1idXR0b24tLWZvY3VzLS1Cb3JkZXJXaWR0aDogdmFyKC0tcGYtZ2xvYmFsLS1Cb3JkZXJXaWR0aC0tbWQpOyAtLXBmLWMtYnV0dG9uLS1hY3RpdmUtLUJvcmRlcldpZHRoOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlcldpZHRoLS1tZCk7IC0tcGYtYy1idXR0b24tLWRpc2FibGVkLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1kaXNhYmxlZC1jb2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tZGlzYWJsZWQtLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1kaXNhYmxlZC1jb2xvci0tMjAwKTsgLS1wZi1jLWJ1dHRvbi0tZGlzYWJsZWQtLUJvcmRlckNvbG9yOiB0cmFuc3BhcmVudDsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1ob3Zlci0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLTIwMCk7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0taG92ZXItLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMjAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1mb2N1cy0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLWxpZ2h0LTEwMCk7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tYWN0aXZlLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMjAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1hY3RpdmUtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tQmFja2dyb3VuZENvbG9yOiB0cmFuc3BhcmVudDsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLXByaW1hcnktY29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0taG92ZXItLUJhY2tncm91bmRDb2xvcjogdHJhbnNwYXJlbnQ7IC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1ob3Zlci0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLWhvdmVyLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUJhY2tncm91bmRDb2xvcjogdHJhbnNwYXJlbnQ7IC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1mb2N1cy0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tcHJpbWFyeS1jb2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLWZvY3VzLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1CYWNrZ3JvdW5kQ29sb3I6IHRyYW5zcGFyZW50OyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tYWN0aXZlLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1wcmltYXJ5LWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1CYWNrZ3JvdW5kQ29sb3I6IHRyYW5zcGFyZW50OyAtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWhvdmVyLS1CYWNrZ3JvdW5kQ29sb3I6IHRyYW5zcGFyZW50OyAtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1ob3Zlci0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWhvdmVyLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tZm9jdXMtLUJhY2tncm91bmRDb2xvcjogdHJhbnNwYXJlbnQ7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWZvY3VzLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1hY3RpdmUtLUJhY2tncm91bmRDb2xvcjogdHJhbnNwYXJlbnQ7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWFjdGl2ZS0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWFjdGl2ZS0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tZGFuZ2VyLWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLWxpZ2h0LTEwMCk7IC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1ob3Zlci0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWRhbmdlci1jb2xvci0tMjAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLWhvdmVyLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tZGFuZ2VyLWNvbG9yLS0yMDApOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS1saWdodC0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tYWN0aXZlLS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tZGFuZ2VyLWNvbG9yLS0yMDApOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tYWN0aXZlLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tbGlnaHQtMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1saW5rLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvcik7IC0tcGYtYy1idXR0b24tLW0tbGluay0taG92ZXItLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3Zlcik7IC0tcGYtYy1idXR0b24tLW0tbGluay0tZm9jdXMtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3Zlcik7IC0tcGYtYy1idXR0b24tLW0tbGluay0tYWN0aXZlLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1saW5rLS1Db2xvci0taG92ZXIpOyAtLXBmLWMtYnV0dG9uLS1tLWxpbmstLWRpc2FibGVkLS1CYWNrZ3JvdW5kQ29sb3I6IHRyYW5zcGFyZW50OyAtLXBmLWMtYnV0dG9uLS1tLWxpbmstLW0taW5saW5lLS1ob3Zlci0tVGV4dERlY29yYXRpb246IHZhcigtLXBmLWdsb2JhbC0tbGluay0tVGV4dERlY29yYXRpb24tLWhvdmVyKTsgLS1wZi1jLWJ1dHRvbi0tbS1saW5rLS1tLWlubGluZS0taG92ZXItLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWxpbmstLUNvbG9yLS1ob3Zlcik7IC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUNvbG9yLS0yMDApOyAtLXBmLWMtYnV0dG9uLS1tLXBsYWluLS1ob3Zlci0tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQ29sb3ItLTEwMCk7IC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLWZvY3VzLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0tYWN0aXZlLS1Db2xvcjogdmFyKC0tcGYtZ2xvYmFsLS1Db2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0tZGlzYWJsZWQtLUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWRpc2FibGVkLWNvbG9yLS0yMDApOyAtLXBmLWMtYnV0dG9uLS1tLXBsYWluLS1kaXNhYmxlZC0tQmFja2dyb3VuZENvbG9yOiB0cmFuc3BhcmVudDsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLXNtKTsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyVG9wQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTMwMCk7IC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tYWZ0ZXItLUJvcmRlclJpZ2h0Q29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTMwMCk7IC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tYWZ0ZXItLUJvcmRlckJvdHRvbUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlckNvbG9yLS0yMDApOyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFmdGVyLS1Cb3JkZXJMZWZ0Q29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTMwMCk7IC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0taG92ZXItLWFmdGVyLS1Cb3JkZXJCb3R0b21XaWR0aDogdmFyKC0tcGYtZ2xvYmFsLS1Cb3JkZXJXaWR0aC0tbWQpOyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWhvdmVyLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tYWN0aXZlLWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFjdGl2ZS0tYWZ0ZXItLUJvcmRlckJvdHRvbVdpZHRoOiB2YXIoLS1wZi1nbG9iYWwtLUJvcmRlcldpZHRoLS1tZCk7IC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tYWN0aXZlLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tYWN0aXZlLWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWZvY3VzLS1hZnRlci0tQm9yZGVyQm90dG9tV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLW1kKTsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1mb2N1cy0tYWZ0ZXItLUJvcmRlckJvdHRvbUNvbG9yOiB2YXIoLS1wZi1nbG9iYWwtLWFjdGl2ZS1jb2xvci0tMTAwKTsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1tLWV4cGFuZGVkLS1hZnRlci0tQm9yZGVyQm90dG9tV2lkdGg6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyV2lkdGgtLW1kKTsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1tLWV4cGFuZGVkLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tYWN0aXZlLWNvbG9yLS0xMDApOyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWRpc2FibGVkLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWdsb2JhbC0tQm9yZGVyQ29sb3ItLTMwMCk7IC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tZGlzYWJsZWQtLUJhY2tncm91bmRDb2xvcjogdHJhbnNwYXJlbnQ7IC0tcGYtYy1idXR0b25fX2ljb24tLU1hcmdpblJpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teHMpOyAtLXBmLWMtYnV0dG9uX190ZXh0LS1pY29uLS1NYXJnaW5MZWZ0OiB2YXIoLS1wZi1nbG9iYWwtLXNwYWNlci0teHMpOyBwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogdmFyKC0tcGYtYy1idXR0b24tLVBhZGRpbmdUb3ApIHZhcigtLXBmLWMtYnV0dG9uLS1QYWRkaW5nUmlnaHQpIHZhcigtLXBmLWMtYnV0dG9uLS1QYWRkaW5nQm90dG9tKSB2YXIoLS1wZi1jLWJ1dHRvbi0tUGFkZGluZ0xlZnQpOyBmb250LXNpemU6IHZhcigtLXBmLWMtYnV0dG9uLS1Gb250U2l6ZSk7IGZvbnQtd2VpZ2h0OiB2YXIoLS1wZi1jLWJ1dHRvbi0tRm9udFdlaWdodCk7IGxpbmUtaGVpZ2h0OiB2YXIoLS1wZi1jLWJ1dHRvbi0tTGluZUhlaWdodCk7IHRleHQtYWxpZ246IGNlbnRlcjsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdXNlci1zZWxlY3Q6IG5vbmU7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogdmFyKC0tcGYtYy1idXR0b24tLUJvcmRlclJhZGl1cyk7IH0KLnBmLWMtYnV0dG9uIC5wZi1jLWJ1dHRvbl9faWNvbiB7IG1hcmdpbi1yaWdodDogdmFyKC0tcGYtYy1idXR0b25fX2ljb24tLU1hcmdpblJpZ2h0KTsgfQoucGYtYy1idXR0b24gLnBmLWMtYnV0dG9uX190ZXh0ICsgLnBmLWMtYnV0dG9uX19pY29uIHsgbWFyZ2luLXJpZ2h0OiAwOyBtYXJnaW4tbGVmdDogdmFyKC0tcGYtYy1idXR0b25fX3RleHQtLWljb24tLU1hcmdpbkxlZnQpOyB9Ci5wZi1jLWJ1dHRvbjo6YWZ0ZXIgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgcmlnaHQ6IDA7IGJvdHRvbTogMDsgbGVmdDogMDsgY29udGVudDogIiI7IGJvcmRlcjogdmFyKC0tcGYtYy1idXR0b24tLUJvcmRlcldpZHRoKSBzb2xpZDsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tQm9yZGVyQ29sb3IpOyBib3JkZXItcmFkaXVzOiB2YXIoLS1wZi1jLWJ1dHRvbi0tQm9yZGVyUmFkaXVzKTsgfQoucGYtYy1idXR0b246aG92ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLWhvdmVyIHsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9Ci5wZi1jLWJ1dHRvbjpob3Zlcjo6YWZ0ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLWhvdmVyOjphZnRlciB7IC0tcGYtYy1idXR0b24tLUJvcmRlcldpZHRoOiB2YXIoLS1wZi1jLWJ1dHRvbi0taG92ZXItLUJvcmRlcldpZHRoKTsgfQoucGYtYy1idXR0b246YWN0aXZlOjphZnRlciwgLnBmLWMtYnV0dG9uLnBmLW0tYWN0aXZlOjphZnRlciB7IC0tcGYtYy1idXR0b24tLUJvcmRlcldpZHRoOiB2YXIoLS1wZi1jLWJ1dHRvbi0tYWN0aXZlLS1Cb3JkZXJXaWR0aCk7IH0KLnBmLWMtYnV0dG9uOmZvY3VzOjphZnRlciwgLnBmLWMtYnV0dG9uLnBmLW0tZm9jdXM6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tQm9yZGVyV2lkdGg6IHZhcigtLXBmLWMtYnV0dG9uLS1mb2N1cy0tQm9yZGVyV2lkdGgpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWJsb2NrIHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXByaW1hcnkgeyBjb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQ29sb3IpOyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXByaW1hcnk6aG92ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLXByaW1hcnkucGYtbS1ob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWhvdmVyLS1Db2xvcik7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1ob3Zlci0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1wcmltYXJ5OmFjdGl2ZSwgLnBmLWMtYnV0dG9uLnBmLW0tcHJpbWFyeS5wZi1tLWFjdGl2ZSB7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWFjdGl2ZS0tQ29sb3IpOyAtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tYWN0aXZlLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXByaW1hcnk6Zm9jdXMsIC5wZi1jLWJ1dHRvbi5wZi1tLXByaW1hcnkucGYtbS1mb2N1cyB7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXByaW1hcnktLWZvY3VzLS1Db2xvcik7IC0tcGYtYy1idXR0b24tLW0tcHJpbWFyeS0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wcmltYXJ5LS1mb2N1cy0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1zZWNvbmRhcnkgeyBjb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1Db2xvcik7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1zZWNvbmRhcnk6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tQm9yZGVyQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXNlY29uZGFyeTpob3ZlciwgLnBmLWMtYnV0dG9uLnBmLW0tc2Vjb25kYXJ5LnBmLW0taG92ZXIgeyAtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0taG92ZXItLUNvbG9yKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1ob3Zlci0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1zZWNvbmRhcnk6aG92ZXI6OmFmdGVyLCAucGYtYy1idXR0b24ucGYtbS1zZWNvbmRhcnkucGYtbS1ob3Zlcjo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1ob3Zlci0tQm9yZGVyQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXNlY29uZGFyeTphY3RpdmUsIC5wZi1jLWJ1dHRvbi5wZi1tLXNlY29uZGFyeS5wZi1tLWFjdGl2ZSB7IC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1hY3RpdmUtLUNvbG9yKTsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1hY3RpdmUtLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tc2Vjb25kYXJ5OmFjdGl2ZTo6YWZ0ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLXNlY29uZGFyeS5wZi1tLWFjdGl2ZTo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1hY3RpdmUtLUJvcmRlckNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1zZWNvbmRhcnk6Zm9jdXMsIC5wZi1jLWJ1dHRvbi5wZi1tLXNlY29uZGFyeS5wZi1tLWZvY3VzIHsgLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1zZWNvbmRhcnktLWZvY3VzLS1Db2xvcik7IC0tcGYtYy1idXR0b24tLW0tc2Vjb25kYXJ5LS1CYWNrZ3JvdW5kQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tc2Vjb25kYXJ5OmZvY3VzOjphZnRlciwgLnBmLWMtYnV0dG9uLnBmLW0tc2Vjb25kYXJ5LnBmLW0tZm9jdXM6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tQm9yZGVyQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXNlY29uZGFyeS0tZm9jdXMtLUJvcmRlckNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS10ZXJ0aWFyeSB7IGNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQ29sb3IpOyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS10ZXJ0aWFyeTo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLUJvcmRlckNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS10ZXJ0aWFyeTpob3ZlciwgLnBmLWMtYnV0dG9uLnBmLW0tdGVydGlhcnkucGYtbS1ob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0taG92ZXItLUNvbG9yKTsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0taG92ZXItLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tdGVydGlhcnk6aG92ZXI6OmFmdGVyLCAucGYtYy1idXR0b24ucGYtbS10ZXJ0aWFyeS5wZi1tLWhvdmVyOjphZnRlciB7IC0tcGYtYy1idXR0b24tLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0taG92ZXItLUJvcmRlckNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS10ZXJ0aWFyeTphY3RpdmUsIC5wZi1jLWJ1dHRvbi5wZi1tLXRlcnRpYXJ5LnBmLW0tYWN0aXZlIHsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1hY3RpdmUtLUNvbG9yKTsgLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tYWN0aXZlLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXRlcnRpYXJ5OmFjdGl2ZTo6YWZ0ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLXRlcnRpYXJ5LnBmLW0tYWN0aXZlOjphZnRlciB7IC0tcGYtYy1idXR0b24tLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS10ZXJ0aWFyeS0tYWN0aXZlLS1Cb3JkZXJDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tdGVydGlhcnk6Zm9jdXMsIC5wZi1jLWJ1dHRvbi5wZi1tLXRlcnRpYXJ5LnBmLW0tZm9jdXMgeyAtLXBmLWMtYnV0dG9uLS1tLXRlcnRpYXJ5LS1Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWZvY3VzLS1Db2xvcik7IC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLXRlcnRpYXJ5OmZvY3VzOjphZnRlciwgLnBmLWMtYnV0dG9uLnBmLW0tdGVydGlhcnkucGYtbS1mb2N1czo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tdGVydGlhcnktLWZvY3VzLS1Cb3JkZXJDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tZGFuZ2VyIHsgY29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tQ29sb3IpOyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tZGFuZ2VyOmhvdmVyLCAucGYtYy1idXR0b24ucGYtbS1kYW5nZXIucGYtbS1ob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1ob3Zlci0tQ29sb3IpOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLWhvdmVyLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWRhbmdlcjphY3RpdmUsIC5wZi1jLWJ1dHRvbi5wZi1tLWRhbmdlci5wZi1tLWFjdGl2ZSB7IC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1hY3RpdmUtLUNvbG9yKTsgLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLUJhY2tncm91bmRDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1hY3RpdmUtLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tZGFuZ2VyOmZvY3VzLCAucGYtYy1idXR0b24ucGYtbS1kYW5nZXIucGYtbS1mb2N1cyB7IC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tZGFuZ2VyLS1mb2N1cy0tQ29sb3IpOyAtLXBmLWMtYnV0dG9uLS1tLWRhbmdlci0tQmFja2dyb3VuZENvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1kYW5nZXItLWZvY3VzLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWxpbmsgeyBjb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tbGluay0tQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWxpbms6bm90KC5wZi1tLWlubGluZSk6aG92ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLWxpbms6bm90KC5wZi1tLWlubGluZSkucGYtbS1ob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tbGluay0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWxpbmstLWhvdmVyLS1Db2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tbGluazpub3QoLnBmLW0taW5saW5lKTphY3RpdmUsIC5wZi1jLWJ1dHRvbi5wZi1tLWxpbms6bm90KC5wZi1tLWlubGluZSkucGYtbS1hY3RpdmUgeyAtLXBmLWMtYnV0dG9uLS1tLWxpbmstLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1saW5rLS1hY3RpdmUtLUNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1saW5rOm5vdCgucGYtbS1pbmxpbmUpOmZvY3VzLCAucGYtYy1idXR0b24ucGYtbS1saW5rOm5vdCgucGYtbS1pbmxpbmUpLnBmLW0tZm9jdXMgeyAtLXBmLWMtYnV0dG9uLS1tLWxpbmstLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1saW5rLS1mb2N1cy0tQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWxpbms6ZGlzYWJsZWQsIC5wZi1jLWJ1dHRvbi5wZi1tLWxpbmsucGYtbS1kaXNhYmxlZCB7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWxpbmstLWRpc2FibGVkLS1CYWNrZ3JvdW5kQ29sb3IpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWxpbmsucGYtbS1pbmxpbmUgeyBkaXNwbGF5OiBpbmxpbmU7IHBhZGRpbmc6IDA7IH0KLnBmLWMtYnV0dG9uLnBmLW0tbGluay5wZi1tLWlubGluZTpob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tbGluay0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWxpbmstLW0taW5saW5lLS1ob3Zlci0tQ29sb3IpOyB0ZXh0LWRlY29yYXRpb246IHZhcigtLXBmLWMtYnV0dG9uLS1tLWxpbmstLW0taW5saW5lLS1ob3Zlci0tVGV4dERlY29yYXRpb24pOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWNvbnRyb2w6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tQm9yZGVyV2lkdGg6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFmdGVyLS1Cb3JkZXJXaWR0aCk7IC0tcGYtYy1idXR0b24tLUJvcmRlckNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyVG9wQ29sb3IpIHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFmdGVyLS1Cb3JkZXJSaWdodENvbG9yKSB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3IpIHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFmdGVyLS1Cb3JkZXJMZWZ0Q29sb3IpOyBib3JkZXItcmFkaXVzOiBpbml0aWFsOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWNvbnRyb2w6aG92ZXI6OmFmdGVyLCAucGYtYy1idXR0b24ucGYtbS1jb250cm9sLnBmLW0taG92ZXI6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWhvdmVyLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3IpOyBib3JkZXItYm90dG9tLXdpZHRoOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1ob3Zlci0tYWZ0ZXItLUJvcmRlckJvdHRvbVdpZHRoKTsgfQoucGYtYy1idXR0b24ucGYtbS1jb250cm9sOmFjdGl2ZTo6YWZ0ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLWNvbnRyb2wucGYtbS1hY3RpdmU6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFjdGl2ZS0tYWZ0ZXItLUJvcmRlckJvdHRvbUNvbG9yKTsgYm9yZGVyLWJvdHRvbS13aWR0aDogdmFyKC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tYWN0aXZlLS1hZnRlci0tQm9yZGVyQm90dG9tV2lkdGgpOyB9Ci5wZi1jLWJ1dHRvbi5wZi1tLWNvbnRyb2w6Zm9jdXM6OmFmdGVyLCAucGYtYy1idXR0b24ucGYtbS1jb250cm9sLnBmLW0tZm9jdXM6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWZvY3VzLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3IpOyBib3JkZXItYm90dG9tLXdpZHRoOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1mb2N1cy0tYWZ0ZXItLUJvcmRlckJvdHRvbVdpZHRoKTsgfQoucGYtYy1idXR0b24ucGYtbS1jb250cm9sLnBmLW0tZXhwYW5kZWQ6OmFmdGVyIHsgLS1wZi1jLWJ1dHRvbi0tbS1jb250cm9sLS1hZnRlci0tQm9yZGVyQm90dG9tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLW0tZXhwYW5kZWQtLWFmdGVyLS1Cb3JkZXJCb3R0b21Db2xvcik7IGJvcmRlci1ib3R0b20td2lkdGg6IHZhcigtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLW0tZXhwYW5kZWQtLWFmdGVyLS1Cb3JkZXJCb3R0b21XaWR0aCk7IH0KLnBmLWMtYnV0dG9uLnBmLW0tY29udHJvbDpkaXNhYmxlZCwgLnBmLWMtYnV0dG9uLnBmLW0tY29udHJvbC5wZi1tLWRpc2FibGVkIHsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tZGlzYWJsZWQtLUJhY2tncm91bmRDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tY29udHJvbDpkaXNhYmxlZDo6YWZ0ZXIsIC5wZi1jLWJ1dHRvbi5wZi1tLWNvbnRyb2wucGYtbS1kaXNhYmxlZDo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1tLWNvbnRyb2wtLWFmdGVyLS1Cb3JkZXJCb3R0b21Db2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tY29udHJvbC0tZGlzYWJsZWQtLWFmdGVyLS1Cb3JkZXJCb3R0b21Db2xvcik7IH0KLnBmLWMtYnV0dG9uOmRpc2FibGVkLCAucGYtYy1idXR0b24ucGYtbS1kaXNhYmxlZCB7IGNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tZGlzYWJsZWQtLUNvbG9yKTsgcG9pbnRlci1ldmVudHM6IG5vbmU7IGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1kaXNhYmxlZC0tQmFja2dyb3VuZENvbG9yKTsgfQoucGYtYy1idXR0b246ZGlzYWJsZWQ6OmFmdGVyLCAucGYtYy1idXR0b24ucGYtbS1kaXNhYmxlZDo6YWZ0ZXIgeyAtLXBmLWMtYnV0dG9uLS1Cb3JkZXJDb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLWRpc2FibGVkLS1Cb3JkZXJDb2xvcik7IH0KLnBmLWMtYnV0dG9uLnBmLW0tcGxhaW4geyBjb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLUNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1wbGFpbjpob3ZlciwgLnBmLWMtYnV0dG9uLnBmLW0tcGxhaW4ucGYtbS1ob3ZlciB7IC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0taG92ZXItLUNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1wbGFpbjphY3RpdmUsIC5wZi1jLWJ1dHRvbi5wZi1tLXBsYWluLnBmLW0tYWN0aXZlIHsgLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0tQ29sb3I6IHZhcigtLXBmLWMtYnV0dG9uLS1tLXBsYWluLS1hY3RpdmUtLUNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1wbGFpbjpmb2N1cywgLnBmLWMtYnV0dG9uLnBmLW0tcGxhaW4ucGYtbS1mb2N1cyB7IC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0tZm9jdXMtLUNvbG9yKTsgfQoucGYtYy1idXR0b24ucGYtbS1wbGFpbjpkaXNhYmxlZCwgLnBmLWMtYnV0dG9uLnBmLW0tcGxhaW4ucGYtbS1kaXNhYmxlZCB7IC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLUNvbG9yOiB2YXIoLS1wZi1jLWJ1dHRvbi0tbS1wbGFpbi0tZGlzYWJsZWQtLUNvbG9yKTsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGYtYy1idXR0b24tLW0tcGxhaW4tLWRpc2FibGVkLS1CYWNrZ3JvdW5kQ29sb3IpOyB9CgoucGYtbS1yZWRoYXQtZm9udCAucGYtYy1idXR0b24geyAtLXBmLWMtYnV0dG9uLS1Gb250V2VpZ2h0OiB2YXIoLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLW5vcm1hbCk7IH0KCi5wZi1jLXRpdGxlLnBmLW0tM3hsIHsgZm9udC1zaXplOiAyOHB4OyBsaW5lLWhlaWdodDogMzYuNHB4OyB9CgouaWRwIHsgbWFyZ2luOiAyNHB4IDAgMDsgfQoKICAgIDwvc3R5bGU+CiAgPC9oZWFkPgoKICA8Ym9keSBjbGFzcz0icGYtbS1yZWRoYXQtZm9udCI+CiAgICA8ZGl2IGNsYXNzPSJwZi1jLWxvZ2luIj4KICAgICAgPGRpdiBjbGFzcz0icGYtYy1sb2dpbl9fY29udGFpbmVyIj4KICAgICAgICA8aGVhZGVyIGNsYXNzPSJwZi1jLWxvZ2luX19oZWFkZXIiPgogICAgICAgICAgPGltZyBzcmM9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0S1BDRXRMU0JIWlc1bGNtRjBiM0k2SUVGa2IySmxJRWxzYkhWemRISmhkRzl5SURJMExqRXVNQ3dnVTFaSElFVjRjRzl5ZENCUWJIVm5MVWx1SUM0Z1UxWkhJRlpsY25OcGIyNDZJRFl1TURBZ1FuVnBiR1FnTUNrZ0lDMHRQZ284YzNabklIWmxjbk5wYjI0OUlqRXVNU0lnYVdROUlreHZaMjl6SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSUtDU0IzYVdSMGFEMGlNekl3Y0hnaUlHaGxhV2RvZEQwaU5EY3VObkI0SWlCMmFXVjNRbTk0UFNJd0lEQWdNekl3SURRM0xqWWlJSE4wZVd4bFBTSmxibUZpYkdVdFltRmphMmR5YjNWdVpEcHVaWGNnTUNBd0lETXlNQ0EwTnk0Mk95SWdlRzFzT25Od1lXTmxQU0p3Y21WelpYSjJaU0krQ2p4emRIbHNaU0IwZVhCbFBTSjBaWGgwTDJOemN5SStDZ2t1YzNRd2UyWnBiR3c2STBaR1JrWkdSanQ5Q2drdWMzUXhlMlpwYkd3NkkwVkZNREF3TUR0OUNqd3ZjM1I1YkdVK0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazAxTWk0eExEUXpMalpqTFRRdU1pd3dMVGN1TlMwekxqTXROeTQxTFRjdU5YTXpMak10Tnk0MUxEY3VOUzAzTGpWek55NDJMRE11TXl3M0xqWXNOeTQxVXpVMkxqTXNORE11Tml3MU1pNHhMRFF6TGpaNklFMDFNaTR4TERNd0xqWUtDV010TXl3d0xUVXVNeXd5TGpRdE5TNHpMRFV1TlhNeUxqTXNOUzQxTERVdU15dzFMalZqTXl3d0xEVXVNeTB5TGpRc05TNHpMVFV1TlZNMU5TNHhMRE13TGpZc05USXVNU3d6TUM0MmVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk5qRXVOeXd6TWk0NGFESjJNV013TGprdE1DNDRMREl0TVM0eUxETXVNaTB4TGpKak15d3dMRFV1TXl3eUxqUXNOUzR6TERVdU5ITXRNaTR6TERVdU5DMDFMalFzTlM0MFl5MHhMakVzTUMweUxqTXRNQzQwTFRNdU1pMHhkalV1TW1ndE1pNHhDZ2xNTmpFdU55d3pNaTQ0ZWlCTk5qTXVPQ3d6TlM0M2RqUXVPR013TGpjc01DNDRMREV1T0N3eExqSXNNaTQ1TERFdU1tTXlMREFzTXk0MkxURXVOaXd6TGpZdE15NDJZekF0TWk0eExURXVOaTB6TGpZdE15NDJMVE11TmtNMk5TNDFMRE0wTGpRc05qUXVOQ3d6TkM0NUxEWXpMamdzTXpVdU4zb2lMejRLUEhCaGRHZ2dZMnhoYzNNOUluTjBNQ0lnWkQwaVRUYzVMalFzTkRNdU5XTXRNeTR4TERBdE5TNDFMVEl1TkMwMUxqVXROUzQxWXpBdE15d3lMak10TlM0MExEVXVNeTAxTGpSak1pNDVMREFzTlM0eExESXVOQ3cxTGpFc05TNDFkakF1Tm1ndE9DNHpZekF1TXl3eExqZ3NNUzQ0TERNc015NDJMRE1LQ1dNeExEQXNNUzQ1TFRBdU15d3lMamN0TUM0NWJERXVNeXd4TGpORE9ESXVNeXcwTXk0eExEZ3dMamdzTkRNdU5TdzNPUzQwTERRekxqVjZJRTAzTlM0NUxETTNMakpvTmk0ell5MHdMak10TVM0MkxURXVOaTB5TGpndE15NHhMVEl1T0FvSlF6YzNMalVzTXpRdU5DdzNOaTR5TERNMUxqVXNOelV1T1N3ek55NHllaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5PRFl1TWl3ek1pNDRhREl1TVhZeExqRmpNQzQ0TFRBdU9Dd3lMVEV1TXl3ekxqSXRNUzR6WXpJdU5Dd3dMRFF1TVN3eExqY3NOQzR4TERRdU1YWTJMalpvTFRJdU1WWXpOMk13TFRFdU55MHhMVEl1TnkweUxqWXRNaTQzQ2dsakxURXVNU3d3TFRJc01DNDFMVEl1Tml3eExqUjJOeTQyYUMweUxqRk1PRFl1TWl3ek1pNDRlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5PVGd1TWl3ek9TNDBZekV1Tml3eExqVXNNeTR5TERJdU15dzFMREl1TTJNeUxqRXNNQ3d6TGpVdE1Td3pMalV0TWk0MFl6QXRNUzR6TFRBdU9DMHhMamt0TWk0NUxUSXVNMnd0TWk0MExUQXVOR010TWk0M0xUQXVOQzAwTFRFdU55MDBMVE11T0FvSll6QXRNaTQxTERJdU1TMDBMaklzTlM0ekxUUXVNbU15TGpFc01DdzBMaklzTUM0M0xEVXVPQ3d5YkMweExqSXNNUzQzWXkweExqWXRNUzR5TFRNdU1TMHhMamd0TkM0M0xURXVPR010TVM0NUxEQXRNeTR4TERBdU9TMHpMakVzTWk0eVl6QXNNUzR5TERBdU55d3hMamNzTWk0MkxESXVNUW9KYkRJdU15d3dMalJqTXk0eExEQXVOU3cwTGpVc01TNDRMRFF1TlN3MFl6QXNNaTQzTFRJdU15dzBMalV0TlM0NExEUXVOV010TWk0ekxEQXROQzQyTFRBdU9TMDJMakl0TWk0MlREazRMaklzTXprdU5Ib2lMejRLUEhCaGRHZ2dZMnhoYzNNOUluTjBNQ0lnWkQwaVRURXhNQzQyTERJNExqaHNNaTR4TFRBdU5YWTFMalZqTUM0NExUQXVPQ3d5TFRFdU15d3pMakl0TVM0ell6SXVOQ3d3TERRdU1Td3hMamNzTkM0eExEUXVNWFkyTGpab0xUSXVNVll6TjJNd0xURXVOeTB4TFRJdU55MHlMall0TWk0M0NnbGpMVEVzTUMweUxEQXVOUzB5TGpZc01TNDBkamN1Tm1ndE1pNHhWakk0TGpoNklpOCtDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweE1qSXVNU3d5T1M0NFl6QXRNQzQzTERBdU5pMHhMak1zTVM0ekxURXVNMk13TERBc01Dd3dMREFzTUdNd0xqY3NNQ3d4TGpNc01DNDFMREV1TXl3eExqSmpNQ3d3TGpjdE1DNDFMREV1TXkweExqSXNNUzR6WXpBc01DMHdMakVzTUMwd0xqRXNNQW9KUXpFeU1pNDNMRE14TGpFc01USXlMakVzTXpBdU5Td3hNakl1TVN3eU9TNDRRekV5TWk0eExESTVMamdzTVRJeUxqRXNNamt1T0N3eE1qSXVNU3d5T1M0NGVpQk5NVEkwTGpRc05ETXVNMmd0TWk0eFZqTXlMamhvTWk0eFZqUXpMak42SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB4TWpndU5Dd3pNaTQ0ZGkweExqWmpNQzB5TGpJc01TNHpMVE11TkN3ekxqWXRNeTQwWXpBdU5Td3dMREVzTUM0eExERXVOU3d3TGpKMk1TNDRZeTB3TGpRdE1DNHhMVEF1T1Mwd0xqSXRNUzR6TFRBdU1nb0pZeTB4TGpFc01DMHhMamNzTUM0MUxURXVOeXd4TGpaMk1TNDJhRE4yTVM0M2FDMHpkamd1T0dndE1pNHhkaTA0TGpoSU1USTJkaTB4TGpkSU1USTRMalI2SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB4TXpZdU55d3pOQzQxYUMweUxqSjJMVEV1TjJneUxqSjJMVEl1TjJ3eUxUQXVOWFl6TGpKb015NHhkakV1TjJndE15NHhkalV1TjJNd0xERXVNU3d3TGpRc01TNDFMREV1Tml3eExqVmpNQzQxTERBc01TMHdMakVzTVM0MUxUQXVNbll4TGpjS0NXTXRNQzQyTERBdU1pMHhMak1zTUM0ekxUSXNNQzR6WXkweUxqRXNNQzB6TGpFdE1TMHpMakV0TWk0NFRERXpOaTQzTERNMExqVjZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHhOVGt1Tml3ME1DNHhiREVzTVM0eFl5MHhMalVzTVM0MUxUTXVOaXd5TGpRdE5TNDNMREl1TkdNdE5DNHhMREF1TVMwM0xqVXRNeTR5TFRjdU5pMDNMalJqTFRBdU1TMDBMakVzTXk0eUxUY3VOU3czTGpRdE55NDJDZ2xqTUM0eExEQXNNQzR5TERBc01DNHlMREJqTWk0ekxEQXNOQzR6TERBdU9TdzFMamNzTWk0MGJDMHhMakVzTVM0eFl5MHhMakl0TVM0ekxUSXVPUzB5TFRRdU55MHlZeTB6TGpRc01DMDFMamtzTWk0MkxUVXVPU3cyWXpBc015NDBMREl1Tml3MkxEWXNOZ29KUXpFMU5pNDNMRFF5TGpFc01UVTRMalVzTkRFdU15d3hOVGt1Tml3ME1DNHhlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NVFkzTGpFc016SXVOMk15TGprc01DdzFMak1zTWk0MExEVXVNeXcxTGpSekxUSXVNeXcxTGpRdE5TNHpMRFV1TkhNdE5TNHpMVEl1TkMwMUxqTXROUzQwVXpFMk5DNHlMRE15TGpjc01UWTNMakVzTXpJdU4zb2dUVEUzTUM0NUxETTRMakVLQ1dNd0xUSXVNeTB4TGpjdE5DMHpMamd0TkdNdE1pNHhMREF0TXk0NExERXVPQzB6TGpnc05HTXdMREl1TXl3eExqY3NOQ3d6TGpnc05GTXhOekF1T1N3ME1DNDBMREUzTUM0NUxETTRMakZNTVRjd0xqa3NNemd1TVhvaUx6NEtQSEJoZEdnZ1kyeGhjM005SW5OME1DSWdaRDBpVFRFM05DNDJMRE15TGpsb01TNDFkakV1TW1Nd0xqZ3RNU3d4TGprdE1TNDBMRE11TXkweExqUmpNaTQwTERBc05Dd3hMallzTkN3MGRqWXVObWd0TVM0MWRpMDJMak5qTUMweExqZ3RNUzR4TFRNdE1pNDVMVE1LQ1dNdE1TNHlMREF0TWk0ekxEQXVOaTB5TGprc01TNDJkamN1Tm1ndE1TNDFUREUzTkM0MkxETXlMamw2SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB4T0RZdU9Dd3pOQzR6YUMweUxqSjJMVEV1TTJneUxqSjJMVEl1Tm13eExqVXRNQzQwZGpOb015NHhkakV1TTJndE15NHhkall1TkdNd0xERXVNU3d3TGpVc01TNDJMREV1Tml3eExqWmpNQzQxTERBc01TMHdMakVzTVM0MUxUQXVNM1l4TGpNS0NXTXRNQzQyTERBdU1pMHhMaklzTUM0ekxURXVPQ3d3TGpOakxURXVPQ3d3TFRJdU9DMHdMamt0TWk0NExUSXVOVXd4T0RZdU9Dd3pOQzR6ZWlJdlBnbzhjR0YwYUNCamJHRnpjejBpYzNRd0lpQmtQU0pOTVRreUxqVXNOREF1TkdNd0xURXVPU3d4TGpZdE15NHlMRFF1TVMwekxqSmpNUzR4TERBc01pNHhMREF1TWl3ekxEQXVOM1l0TVM0MFl6QXRNUzQzTFRFdE1pNDFMVEl1T0MweUxqVmpMVEVzTUMweUxEQXVNeTB6TGpNc01DNDViQzB3TGpZdE1TNHlDZ2xqTVM0MUxUQXVOeXd5TGpjdE1TdzBMVEZqTWk0MkxEQXNOQzR4TERFdU15dzBMakVzTXk0MmRqZG9MVEV1TlhZdE1XTXRNQzQ1TERBdU9DMHlMakVzTVM0eUxUTXVOQ3d4TGpKRE1UazBMakVzTkRNdU5Td3hPVEl1TlN3ME1pNHlMREU1TWk0MUxEUXdMalI2SUUweE9UWXVOaXcwTWk0ekNnbGpNUzR5TERBc01pNHpMVEF1TkN3ekxqRXRNUzR5ZGkweExqbGpMVEF1T1Mwd0xqWXRNUzQ0TFRBdU9DMHpMVEF1T0dNdE1TNDNMREF0TWk0M0xEQXVPQzB5TGpjc01rTXhPVFFzTkRFdU5Td3hPVFV1TVN3ME1pNHpMREU1Tmk0MkxEUXlMak42SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB5TURNdU5Td3lPUzQ1WXpBdE1DNDJMREF1TlMweExERXRNV013TGpZc01Dd3hMREF1TkN3eExERmpNQ3d3TERBc01Dd3dMREJqTUN3d0xqWXRNQzQxTERFdE1Td3hRekl3TkN3ek1Td3lNRE11TlN3ek1DNDFMREl3TXk0MUxESTVMamw2Q2drZ1RUSXdOUzR6TERRekxqTm9MVEV1TlZZek1pNDVhREV1TlZZME15NHplaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NakEzTGprc016SXVPV2d4TGpWMk1TNHlZekF1T0MweExERXVPUzB4TGpRc015NHpMVEV1TkdNeUxqUXNNQ3cwTERFdU5pdzBMRFIyTmk0MmFDMHhMalYyTFRZdU0yTXdMVEV1T0MweExqRXRNeTB5TGprdE13b0pZeTB4TGpJc01DMHlMak1zTUM0MkxUSXVPU3d4TGpaMk55NDJhQzB4TGpWV016SXVPWG9pTHo0S1BIQmhkR2dnWTJ4aGMzTTlJbk4wTUNJZ1pEMGlUVEl5TkM0eExEUXpMalZqTFRJdU9Td3dMVFV1TXkweUxqTXROUzR6TFRVdU1tTXdMREFzTUMwd0xqRXNNQzB3TGpGak1DMHpMREl1TXkwMUxqTXNOUzR4TFRVdU0yTXlMamdzTUN3MExqa3NNaTQwTERRdU9TdzFMak4yTUM0MWFDMDRMalVLQ1dNd0xqSXNNaXd4TGpnc015NDJMRE11T1N3ekxqWmpNUzR4TERBc01pNHlMVEF1TkN3eUxqa3RNV3d4TERGRE1qSTJMamtzTkRNdU1Td3lNalV1TlN3ME15NDFMREl5TkM0eExEUXpMalY2SUUweU1qQXVOQ3d6Tnk0MGFEWXVPV010TUM0ekxURXVPQzB4TGpjdE15NHpMVE11TkMwekxqTUtDVU15TWpJdU1Td3pOQzR4TERJeU1DNDJMRE0xTGpVc01qSXdMalFzTXpjdU5Fd3lNakF1TkN3ek55NDBlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5Nak14TERNeUxqbG9NUzQxZGpFdU5XTXdMall0TVM0eExERXVOeTB4TGpjc01pNDVMVEV1TjJNd0xqTXNNQ3d3TGpjc01Dd3hMREF1TVhZeExqUmpMVEF1TXkwd0xqRXRNQzQzTFRBdU1pMHhMakV0TUM0eUNnbGpMVEV1TXl3d0xUSXVNeXd3TGpjdE1pNDRMREl1TVhZM0xqRklNak14VERJek1Td3pNaTQ1ZWlJdlBnbzhjR0YwYUNCamJHRnpjejBpYzNRd0lpQmtQU0pOTWpReUxqa3NNamd1T0dnMkxqTmpNaTQ0TERBc05DNDNMREV1Tnl3MExqY3NOQzR5Y3kweExqa3NOQzR5TFRRdU55dzBMakpvTFRRdU4zWTJMakZvTFRFdU5rd3lOREl1T1N3eU9DNDRlaUJOTWpRMExqVXNNekF1TTNZMUxqWm9OQzQyQ2dsak1pd3dMRE11TWkweExqRXNNeTR5TFRJdU9HTXdMVEV1TnkweExqSXRNaTQ0TFRNdU1pMHlMamhNTWpRMExqVXNNekF1TTNvaUx6NEtQSEJoZEdnZ1kyeGhjM005SW5OME1DSWdaRDBpVFRJMU55NDFMRFF6TGpOSU1qVTJWakk0TGpoc01TNDFMVEF1TTFZME15NHplaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NalU1TGpZc05EQXVOR013TFRFdU9Td3hMall0TXk0eUxEUXVNUzB6TGpKak1TNHhMREFzTWk0eExEQXVNaXd6TERBdU4zWXRNUzQwWXpBdE1TNDNMVEV0TWk0MUxUSXVPQzB5TGpWakxURXNNQzB5TERBdU15MHpMak1zTUM0NWJDMHdMall0TVM0eUNnbGpNUzQxTFRBdU55d3lMamN0TVN3MExURmpNaTQyTERBc05DNHhMREV1TXl3MExqRXNNeTQyZGpkb0xURXVOWFl0TVdNdE1DNDVMREF1T0MweUxqRXNNUzR5TFRNdU5Dd3hMakpETWpZeExqRXNORE11TlN3eU5Ua3VOaXcwTWk0eUxESTFPUzQyTERRd0xqUjZJRTB5TmpNdU55dzBNaTR6Q2dsak1TNHlMREFzTWk0ekxUQXVOQ3d6TGpFdE1TNHlkaTB4TGpsakxUQXVPQzB3TGpZdE1TNDRMVEF1T0MwekxUQXVPR010TVM0M0xEQXRNaTQzTERBdU9DMHlMamNzTWtNeU5qRXNOREV1TlN3eU5qSXVNU3cwTWk0ekxESTJNeTQzTERReUxqTjZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHlOekV1Tnl3ek5DNHphQzB5TGpKMkxURXVNMmd5TGpKMkxUSXVObXd4TGpVdE1DNDBkak5vTXk0eGRqRXVNMmd0TXk0eGRqWXVOR013TERFdU1Td3dMalVzTVM0MkxERXVOaXd4TGpaak1DNDFMREFzTVMwd0xqRXNNUzQxTFRBdU0zWXhMak1LQ1dNdE1DNDJMREF1TWkweExqSXNNQzR6TFRFdU9Dd3dMak5qTFRFdU9Dd3dMVEl1T0Mwd0xqa3RNaTQ0TFRJdU5Vd3lOekV1Tnl3ek5DNHplaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F3SWlCa1BTSk5NamM1TGpZc016SXVPWFl0TW1Nd0xUSXNNUzR4TFRNdU1Td3pMakl0TXk0eFl6QXVOU3d3TERBdU9Td3dMREV1TkN3d0xqSjJNUzQwWXkwd0xqUXRNQzR4TFRBdU9DMHdMakl0TVM0ekxUQXVNbU10TVM0eUxEQXRNUzQ0TERBdU5pMHhMamdzTVM0NENnbFdNek5vTXk0eGRqRXVNMmd0TXk0eGRqa3VNV2d0TVM0MWRpMDVMakZvTFRJdU5IWXRNUzR6VERJM09TNDJMRE15TGpsNklpOCtDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweU9UQXVNaXd6TWk0M1l6SXVPU3d3TERVdU15d3lMalFzTlM0ekxEVXVOSE10TWk0ekxEVXVOQzAxTGpNc05TNDBjeTAxTGpNdE1pNDBMVFV1TXkwMUxqUkRNamcwTGprc016VXVNU3d5T0RjdU1pd3pNaTQzTERJNU1DNHlMRE15TGpkNkNna2dUVEk1TkN3ek9DNHhZekF0TWk0ekxURXVOeTAwTFRNdU9DMDBZeTB5TGpFc01DMHpMamdzTVM0NExUTXVPQ3cwWXpBc01pNHpMREV1Tnl3MExETXVPQ3cwVXpJNU5DdzBNQzQwTERJNU5Dd3pPQzR4VERJNU5Dd3pPQzR4ZWlJdlBnbzhjR0YwYUNCamJHRnpjejBpYzNRd0lpQmtQU0pOTWprM0xqWXNNekl1T1dneExqVjJNUzQxWXpBdU5pMHhMakVzTVM0M0xURXVOeXd5TGprdE1TNDNZekF1TXl3d0xEQXVOeXd3TERFc01DNHhkakV1TkdNdE1DNHpMVEF1TVMwd0xqY3RNQzR5TFRFdU1TMHdMaklLQ1dNdE1TNHpMREF0TWk0ekxEQXVOeTB5TGpnc01pNHhkamN1TVdndE1TNDFUREk1Tnk0MkxETXlMamw2SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB6TURRdU9Dd3pNaTQ1YURFdU5YWXhMakZqTUM0NExUQXVPU3d4TGprdE1TNDBMRE10TVM0ell6RXVOQ3d3TERJdU5pd3dMamNzTXk0ekxERXVPV013TGpndE1TNHlMREl1TVMweExqa3NNeTQyTFRFdU9XTXlMak1zTUN3ekxqZ3NNUzQyTERNdU9DdzBDZ2wyTmk0MmFDMHhMalYyTFRZdU0yTXdMVEV1T0MweExUTXRNaTQzTFROakxURXVNU3d3TFRJdU1Td3dMall0TWk0NExERXVOMk13TGpFc01DNHpMREF1TVN3d0xqWXNNQzR4TERGMk5pNDJhQzB4TGpWMkxUWXVNMk13TFRFdU9DMHhMVE10TWk0M0xUTmpMVEV1TVN3d0xUSXNNQzQxTFRJdU55d3hMalVLQ1hZM0xqZG9MVEV1TlV3ek1EUXVPQ3d6TWk0NWVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXhJaUJrUFNKTk1qVXVNeXd4Tmk0MVl6SXVOU3d3TERZdU1TMHdMalVzTmk0eExUTXVOV013TFRBdU1pd3dMVEF1TlMwd0xqRXRNQzQzYkMweExqVXROaTQwWXkwd0xqTXRNUzQwTFRBdU5pMHlMakV0TXk0eExUTXVNd29KWXkweExqa3RNUzAyTGpFdE1pNDJMVGN1TkMweUxqWmpMVEV1TWl3d0xURXVOU3d4TGpVdE1pNDVMREV1TldNdE1TNHpMREF0TWk0ekxURXVNUzB6TGpZdE1TNHhZeTB4TGpJc01DMHlMREF1T0MweUxqWXNNaTQxWXpBc01DMHhMamNzTkM0M0xURXVPU3cxTGpRS0NXTXdMREF1TVMwd0xqRXNNQzR6TERBc01DNDBRemd1TkN3eE1DNDFMREUxTGpZc01UWXVOU3d5TlM0ekxERTJMalVnVFRNeExqZ3NNVFF1TTJNd0xqTXNNUzQyTERBdU15d3hMamdzTUM0ekxESmpNQ3d5TGpndE15NHhMRFF1TXkwM0xqTXNOQzR6Q2dsakxUa3VNeXd3TFRFM0xqVXROUzQxTFRFM0xqVXRPUzR4WXpBdE1DNDFMREF1TVMweExEQXVNeTB4TGpWRE5DNHpMREV3TGpNc01Dd3hNQzQ1TERBc01UUXVOMk13TERZdU15d3hOQzQ1TERFMExESTJMallzTVRSak9Td3dMREV4TGpNdE5DNHhMREV4TGpNdE55NHpDZ2xETXpjdU9Td3hPQzQ0TERNMUxqY3NNVFlzTXpFdU9Dd3hOQzR6SWk4K0NqeHdZWFJvSUdROUlrMHpNUzQ0TERFMExqTmpNQzR6TERFdU5pd3dMak1zTVM0NExEQXVNeXd5WXpBc01pNDRMVE11TVN3MExqTXROeTR6TERRdU0yTXRPUzR6TERBdE1UY3VOUzAxTGpVdE1UY3VOUzA1TGpGak1DMHdMalVzTUM0eExURXNNQzR6TFRFdU5Xd3dMamN0TVM0NENnbGpNQ3d3TGpFdE1DNHhMREF1TXl3d0xEQXVOR013TERFdU9DdzNMaklzTnk0NUxERTJMamtzTnk0NVl6SXVOU3d3TERZdU1TMHdMalVzTmk0eExUTXVOV013TFRBdU1pd3dMVEF1TlMwd0xqRXRNQzQzVERNeExqZ3NNVFF1TTNvaUx6NEtQSEJoZEdnZ1kyeGhjM005SW5OME1DSWdaRDBpVFRFeE5TNDBMREU0TGpSak1Dd3lMalFzTVM0MExETXVOU3cwTERNdU5XTXdMamdzTUN3eExqWXRNQzR4TERJdU5DMHdMak4yTFRJdU4yTXRNQzQxTERBdU1pMHhMREF1TWkweExqVXNNQzR5WXkweExqRXNNQzB4TGpVdE1DNHpMVEV1TlMweExqTUtDWFl0TkM0eWFETXVNWFl0TWk0NGFDMHpMakZXTnk0eGJDMHpMalFzTUM0M2RqSXVPV2d0TWk0eWRqSXVPR2d5TGpKTU1URTFMalFzTVRndU5Ib2dUVEV3TkM0NExERTRMalJqTUMwd0xqY3NNQzQzTFRFdU1Td3hMamd0TVM0eFl6QXVOeXd3TERFdU5Dd3dMakVzTWl3d0xqTldNVGtLQ1dNdE1DNDJMREF1TkMweExqUXNNQzQxTFRJdU1Td3dMalZETVRBMUxqVXNNVGt1Tml3eE1EUXVPQ3d4T1M0eExERXdOQzQ0TERFNExqUWdUVEV3TlM0NExESXhMamxqTVM0eUxEQXNNaTR5TFRBdU15d3pMakV0TUM0NWRqQXVOMmd6TGpOMkxUY3VNV013TFRJdU55MHhMamd0TkM0eUxUUXVPUzAwTGpJS0NXTXRNUzQzTERBdE15NDBMREF1TkMwMUxqSXNNUzR5YkRFdU1pd3lMalZqTVM0ekxUQXVOU3d5TGpRdE1DNDVMRE11TkMwd0xqbGpNUzQwTERBc01pNHhMREF1TlN3eUxqRXNNUzQzZGpBdU5XTXRNQzQ0TFRBdU1pMHhMamN0TUM0ekxUSXVOUzB3TGpNS0NXTXRNaTQ1TERBdE5DNDJMREV1TWkwMExqWXNNeTR6UXpFd01TNDRMREl3TGpVc01UQXpMalFzTWpFdU9Td3hNRFV1T0N3eU1TNDVJRTA0Tnk0MExESXhMamhJT1RGV01UWm9OblkxTGpkb015NDJWamN1TVdndE15NDJkalV1Tm1ndE5sWTNMakZvTFRNdU5rdzROeTQwTERJeExqaDZDZ2tnVFRjekxqY3NNVFl1TW1Nd0xURXVOaXd4TGpNdE1pNDRMREl1T1MweUxqaGpNQzQ1TERBc01TNDNMREF1TXl3eUxqTXNNQzQ1ZGpNdU9XTXRNQzQyTERBdU5pMHhMalVzTUM0NUxUSXVNeXd3TGpsRE56VXNNVGtzTnpNdU55d3hOeTQ0TERjekxqY3NNVFl1TWlCTk56a3NNakV1TjJnekxqUldOaTQwQ2dsTU56a3NOeTR4ZGpRdU1tTXRNQzQ1TFRBdU5TMHhMamd0TUM0M0xUSXVPQzB3TGpkakxUTXVNaXd3TFRVdU9Dd3lMalV0TlM0NExEVXVOMk13TERNdU1Td3lMalFzTlM0M0xEVXVOaXcxTGpkak1Dd3dMREF1TVN3d0xEQXVNU3d3WXpFdU1Td3dMREl1TVMwd0xqTXNNeTB4VmpJeExqZDZDZ2tnVFRZekxqWXNNVE11TW1NeExqRXNNQ3d5TERBdU55d3lMak1zTVM0NGFDMDBMalpETmpFdU55d3hNeTQ1TERZeUxqVXNNVE11TWl3Mk15NDJMREV6TGpJZ1RUVTNMamtzTVRZdU1tTXdMRE11TWl3eUxqWXNOUzQzTERZc05TNDNZekV1T1N3d0xETXVNaTB3TGpVc05DNDJMVEV1TjJ3dE1pNHlMVElLQ1dNdE1DNDFMREF1TlMweExqTXNNQzQ0TFRJdU1pd3dMamhqTFRFdU1pd3dMVEl1TXkwd0xqY3RNaTQzTFRFdU9HZzNMamwyTFRBdU9HTXdMVE11TlMweUxqUXROaTR4TFRVdU5pMDJMakZqTFRNdU1Td3dMVFV1Tnl3eUxqVXROUzQ0TERVdU5nb0pRelUzTGprc01UWXVNU3cxTnk0NUxERTJMaklzTlRjdU9Td3hOaTR5SUUwMU1pNHhMREV3TGpKak1TNHlMREFzTVM0NUxEQXVPQ3d4TGprc01TNDNjeTB3TGpjc01TNDNMVEV1T1N3eExqZG9MVE11Tm5ZdE15NHpTRFV5TGpGNklFMDBOQzQ1TERJeExqaG9NeTQyZGkwMUxqTm9NaTQzQ2dsc01pNDRMRFV1TTJnMGJDMHpMakl0TlM0NVl6RXVOeTB3TGpjc01pNDRMVEl1TXl3eUxqZ3ROQzR4WXpBdE1pNDJMVEl1TVMwMExqY3ROUzR5TFRRdU4yZ3ROeTQxVERRMExqa3NNakV1T0hvaUx6NEtQQzl6ZG1jK0NnPT0iIGFsdD0iUmVkIEhhdCBPcGVuU2hpZnQgQ29udGFpbmVyIFBsYXRmb3JtIGxvZ28iIGNsYXNzPSJwZi1jLWJyYW5kIiAvPgoKICAgICAgICA8L2hlYWRlcj4KICAgICAgICA8bWFpbiBjbGFzcz0icGYtYy1sb2dpbl9fbWFpbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwZi1jLWxvZ2luX19tYWluLWJvZHkiPgogICAgICAgICAgICB7eyBpZiBlcSAobGVuIC5Qcm92aWRlcnMpIDF9fQogICAgICAgICAgICAgIDxhIGNsYXNzPSJwZi1jLWJ1dHRvbiBwZi1tLXByaW1hcnkgcGYtbS1ibG9jayIgaHJlZj0ie3sgKGluZGV4IC5Qcm92aWRlcnMgMCkuVVJMIH19Ij57eyAuTG9jYWxlLkxvZ0luIH19PC9hPgogICAgICAgICAgICB7eyBlbHNlIH19CiAgICAgICAgICAgICAgPGgxIGNsYXNzPSJwZi1jLXRpdGxlIHBmLW0tM3hsIj57eyAuTG9jYWxlLkxvZ0luV2l0aCB9fTwvaDE+CiAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAge3sgJGxvZ0luV2l0aCA6PSAuTG9jYWxlLkxvZ0luV2l0aCB9fQogICAgICAgICAgICAgICAge3sgcmFuZ2UgJHByb3ZpZGVyIDo9IC5Qcm92aWRlcnMgfX0KICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJpZHAiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Int7JHByb3ZpZGVyLlVSTH19IiBjbGFzcz0icGYtYy1idXR0b24gcGYtbS1zZWNvbmRhcnkgcGYtbS1ibG9jayIgdGl0bGU9Int7ICRsb2dJbldpdGggfX0ge3skcHJvdmlkZXIuTmFtZX19Ij57eyRwcm92aWRlci5OYW1lfX08L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvbWFpbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4K +kind: Secret +metadata: + name: oauth-openshift-default-provider-selection-template + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_deployment.yaml new file mode 100644 index 000000000000..2420d63cac86 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_deployment.yaml @@ -0,0 +1,310 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: oauth-openshift + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 3 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: oauth-openshift + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: logs,tmp-dir + component.hypershift.openshift.io/config-hash: 19dc307e3b105d44458a71d460b54b1d741638a5a0dd232cbcc341c5 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: oauth-openshift + hypershift.openshift.io/control-plane-component: oauth-openshift + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/request-serving-component: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: oauth-openshift + hypershift.openshift.io/control-plane-component: oauth-openshift + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/request-serving-component: "true" + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: oauth-openshift + hypershift.openshift.io/control-plane-component: oauth-openshift + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/request-serving-component: "true" + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - osinserver + - --config=/etc/kubernetes/config/config.yaml + - --audit-log-format=json + - --audit-log-maxbackup=1 + - --audit-log-maxsize=10 + - --audit-log-path=/var/run/kubernetes/audit.log + - --audit-policy-file=/etc/kubernetes/audit-config/policy.yaml + env: + - name: HTTP_PROXY + value: http://127.0.0.1:8092 + - name: HTTPS_PROXY + value: http://127.0.0.1:8092 + - name: ALL_PROXY + value: socks5://127.0.0.1:8090 + - name: NO_PROXY + value: kube-apiserver,audit-webhook,oauth-openshift.hcp-namespace.svc.cluster.local + image: oauth-server + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: healthz + port: 6443 + scheme: HTTPS + initialDelaySeconds: 120 + periodSeconds: 60 + successThreshold: 1 + timeoutSeconds: 10 + name: oauth-openshift + readinessProbe: + failureThreshold: 3 + httpGet: + path: healthz + port: 6443 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 25m + memory: 40Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/audit-config + name: audit-config + - mountPath: /etc/kubernetes/secrets/templates/error + name: error-template + - mountPath: /etc/kubernetes/secrets/svc-kubeconfig + name: kubeconfig + - mountPath: /etc/kubernetes/secrets/templates/login + name: login-template + - mountPath: /var/run/kubernetes + name: logs + - mountPath: /etc/kubernetes/certs/master-ca + name: master-ca-bundle + - mountPath: /etc/kubernetes/config + name: oauth-config + - mountPath: /etc/kubernetes/secrets/templates/providers + name: providers-template + - mountPath: /etc/kubernetes/certs/serving-cert + name: serving-cert + - mountPath: /etc/kubernetes/secrets/session + name: session-secret + - mountPath: /tmp + name: tmp-dir + workingDir: /var/run/kubernetes + - args: + - -c + - | + set -o errexit + set -o nounset + set -o pipefail + + function cleanup() { + pkill -P $$$ + wait + exit + } + trap cleanup SIGTERM + + /usr/bin/tail -c+1 -F /var/run/kubernetes/audit.log & + wait $! + command: + - /bin/bash + image: cli + imagePullPolicy: IfNotPresent + name: audit-logs + resources: + requests: + cpu: 5m + memory: 10Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/run/kubernetes + name: logs + - mountPath: /tmp + name: tmp-dir + - args: + - run + - --serving-port=8092 + - --connect-directly-to-cloud-apis=true + command: + - /usr/bin/control-plane-operator + - konnectivity-https-proxy + env: + - name: KUBECONFIG + value: /etc/kubernetes/secrets/kubeconfig/kubeconfig + image: controlplane-operator + name: konnectivity-proxy-https + resources: + requests: + cpu: 10m + memory: 30Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/secrets/kubeconfig + name: kubeconfig + - mountPath: /etc/konnectivity/proxy-client + name: konnectivity-proxy-cert + - mountPath: /etc/konnectivity/proxy-ca + name: konnectivity-proxy-ca + - mountPath: /tmp + name: tmp-dir + - args: + - run + - --resolve-from-guest-cluster-dns=true + - --resolve-from-management-cluster-dns=true + command: + - /usr/bin/control-plane-operator + - konnectivity-socks5-proxy + env: + - name: KUBECONFIG + value: /etc/kubernetes/secrets/kubeconfig/kubeconfig + image: controlplane-operator + name: konnectivity-proxy-socks5 + resources: + requests: + cpu: 10m + memory: 30Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/secrets/kubeconfig + name: kubeconfig + - mountPath: /etc/konnectivity/proxy-client + name: konnectivity-proxy-cert + - mountPath: /etc/konnectivity/proxy-ca + name: konnectivity-proxy-ca + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + priorityClassName: hypershift-api-critical + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - configMap: + defaultMode: 420 + name: oauth-openshift + name: oauth-config + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - name: serving-cert + secret: + defaultMode: 416 + secretName: oauth-server-crt + - name: session-secret + secret: + defaultMode: 416 + secretName: oauth-openshift-session + - name: error-template + secret: + defaultMode: 416 + secretName: oauth-openshift-default-error-template + - name: login-template + secret: + defaultMode: 416 + secretName: oauth-openshift-default-login-template + - name: providers-template + secret: + defaultMode: 416 + secretName: oauth-openshift-default-provider-selection-template + - emptyDir: {} + name: logs + - configMap: + defaultMode: 420 + name: oauth-master-ca-bundle + name: master-ca-bundle + - configMap: + defaultMode: 420 + name: oauth-openshift-audit + name: audit-config + - name: konnectivity-proxy-cert + secret: + defaultMode: 416 + secretName: konnectivity-client + - configMap: + name: konnectivity-ca-bundle + name: konnectivity-proxy-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_poddisruptionbudget.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_poddisruptionbudget.yaml new file mode 100644 index 000000000000..1a9cce30240c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_poddisruptionbudget.yaml @@ -0,0 +1,23 @@ +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: oauth-openshift + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + selector: + matchLabels: + app: oauth-openshift + unhealthyPodEvictionPolicy: AlwaysAllow +status: + currentHealthy: 0 + desiredHealthy: 0 + disruptionsAllowed: 0 + expectedPods: 0 diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_session_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_session_secret.yaml new file mode 100644 index 000000000000..93d24130ef63 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/oauth-openshift/EtcdRestore/zz_fixture_TestControlPlaneComponents_oauth_openshift_session_secret.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + v4-0-config-system-session: "" +kind: Secret +metadata: + name: oauth-openshift-session + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: Opaque diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_configmap.yaml new file mode 100644 index 000000000000..8e1a17a0e8bf --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_configmap.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + pprof-config.yaml: | + disabled: False +kind: ConfigMap +metadata: + name: olm-collect-profiles + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_controlplanecomponent.yaml new file mode 100644 index 000000000000..a8553bcfa2fe --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_controlplanecomponent.yaml @@ -0,0 +1,36 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: olm-collect-profiles + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: "" + reason: AsExpected + status: "True" + type: Available + - lastTransitionTime: null + message: "" + reason: AsExpected + status: "True" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: olm-collect-profiles + - group: rbac.authorization.k8s.io + kind: Role + name: olm-collect-profiles + - group: rbac.authorization.k8s.io + kind: RoleBinding + name: olm-collect-profiles + - group: "" + kind: Secret + name: pprof-cert + - group: "" + kind: ServiceAccount + name: olm-collect-profiles + version: 4.18.0 diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_cronjob.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_cronjob.yaml new file mode 100644 index 000000000000..f5dd8ad44674 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_cronjob.yaml @@ -0,0 +1,117 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: olm-collect-profiles + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + jobTemplate: + metadata: {} + spec: + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: fe7dc514 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: olm-collect-profiles + hypershift.openshift.io/control-plane-component: olm-collect-profiles + hypershift.openshift.io/hosted-control-plane: hcp-namespace + hypershift.openshift.io/need-management-kas-access: "true" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: true + containers: + - args: + - -n + - $(MY_NAMESPACE) + - --config-mount-path + - /etc/config + - --cert-mount-path + - /var/run/secrets/serving-cert + - olm-operator-heap-:https://olm-operator-metrics:8443/debug/pprof/heap + - catalog-operator-heap-:https://catalog-operator-metrics:8443/debug/pprof/heap + command: + - bin/collect-profiles + env: + - name: MY_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: operator-lifecycle-manager + imagePullPolicy: IfNotPresent + name: collect-profiles + resources: + requests: + cpu: 10m + memory: 80Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/config + name: config-volume + - mountPath: /var/run/secrets/serving-cert + name: secret-volume + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + restartPolicy: Never + serviceAccountName: olm-collect-profiles + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - configMap: + defaultMode: 420 + name: olm-collect-profiles + name: config-volume + - name: secret-volume + secret: + defaultMode: 416 + secretName: metrics-client + - emptyDir: {} + name: tmp-dir + schedule: 41 5 * * * +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_role.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_role.yaml new file mode 100644 index 000000000000..41b6f1242806 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_role.yaml @@ -0,0 +1,32 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: olm-collect-profiles + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - create + - delete +- apiGroups: + - "" + resourceNames: + - pprof-cert + resources: + - secrets + verbs: + - get + - update diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_rolebinding.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_rolebinding.yaml new file mode 100644 index 000000000000..f70c512d486f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_rolebinding.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: olm-collect-profiles + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: olm-collect-profiles +subjects: +- kind: ServiceAccount + name: olm-collect-profiles + namespace: hcp-namespace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_serviceaccount.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_serviceaccount.yaml new file mode 100644 index 000000000000..8ef1074a6e79 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_collect_profiles_serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +imagePullSecrets: +- name: pull-secret +kind: ServiceAccount +metadata: + name: olm-collect-profiles + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_pprof_cert_secret.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_pprof_cert_secret.yaml new file mode 100644 index 000000000000..10d32be1879f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-collect-profiles/EtcdRestore/zz_fixture_TestControlPlaneComponents_pprof_cert_secret.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + tls.crt: "" + tls.key: "" +kind: Secret +metadata: + name: pprof-cert + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +type: kubernetes.io/tls diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_controlplanecomponent.yaml new file mode 100644 index 000000000000..e432a0df09c5 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_controlplanecomponent.yaml @@ -0,0 +1,27 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: olm-operator + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: olm-operator Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment olm-operator rollout to finish: 0 out of 1 new + replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Service + name: olm-operator-metrics + - group: monitoring.coreos.com + kind: ServiceMonitor + name: olm-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_deployment.yaml new file mode 100644 index 000000000000..005de1c94808 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_deployment.yaml @@ -0,0 +1,205 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: olm-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: olm-operator + strategy: + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: olm-operator + hypershift.openshift.io/control-plane-component: olm-operator + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - --namespace + - $(OPERATOR_NAMESPACE) + - --writeStatusName + - operator-lifecycle-manager + - --writePackageServerStatusName= + - --tls-cert + - /srv-cert/tls.crt + - --tls-key + - /srv-cert/tls.key + - --client-ca + - /client-ca/ca.crt + command: + - /bin/olm + env: + - name: OPERATOR_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: OPERATOR_NAME + value: olm-operator + - name: RELEASE_VERSION + value: 4.18.0 + - name: KUBECONFIG + value: /etc/openshift/kubeconfig/kubeconfig + - name: GRPC_PROXY + value: socks5://127.0.0.1:8090 + - name: NO_PROXY + value: kube-apiserver + image: operator-lifecycle-manager + imagePullPolicy: IfNotPresent + livenessProbe: + httpGet: + path: /healthz + port: 8443 + scheme: HTTPS + initialDelaySeconds: 60 + name: olm-operator + ports: + - containerPort: 8443 + name: metrics + readinessProbe: + httpGet: + path: /healthz + port: 8443 + scheme: HTTPS + resources: + requests: + cpu: 10m + memory: 160Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /srv-cert + name: srv-cert + readOnly: true + - mountPath: /client-ca + name: client-ca + readOnly: true + - mountPath: /etc/openshift/kubeconfig + name: kubeconfig + readOnly: true + - mountPath: /tmp + name: tmp-dir + - args: + - run + command: + - /usr/bin/control-plane-operator + - konnectivity-socks5-proxy + env: + - name: KUBECONFIG + value: /etc/kubernetes/secrets/kubeconfig/kubeconfig + image: controlplane-operator + name: konnectivity-proxy-socks5 + resources: + requests: + cpu: 10m + memory: 30Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/secrets/kubeconfig + name: kubeconfig + - mountPath: /etc/konnectivity/proxy-client + name: konnectivity-proxy-cert + - mountPath: /etc/konnectivity/proxy-ca + name: konnectivity-proxy-ca + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + - --kubeconfig=/var/kubeconfig/kubeconfig + - --required-api=operators.coreos.com,v1alpha1,CatalogSource + - --required-api=operators.coreos.com,v1alpha1,Subscription + - --required-api=operators.coreos.com,v2,OperatorCondition + - --required-api=operators.coreos.com,v1,OperatorGroup + - --required-api=operators.coreos.com,v1,OLMConfig + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/kubeconfig + name: kubeconfig + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: srv-cert + secret: + defaultMode: 416 + secretName: olm-operator-serving-cert + - name: client-ca + secret: + defaultMode: 416 + secretName: metrics-client + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - name: konnectivity-proxy-cert + secret: + defaultMode: 416 + secretName: konnectivity-client + - configMap: + name: konnectivity-ca-bundle + name: konnectivity-proxy-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_metrics_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_metrics_service.yaml new file mode 100644 index 000000000000..a146f183c354 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_metrics_service.yaml @@ -0,0 +1,26 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: olm-operator + name: olm-operator-metrics + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: https-metrics + port: 8443 + protocol: TCP + targetPort: metrics + selector: + app: olm-operator + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_servicemonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_servicemonitor.yaml new file mode 100644 index 000000000000..b69122a03364 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/olm-operator/EtcdRestore/zz_fixture_TestControlPlaneComponents_olm_operator_servicemonitor.yaml @@ -0,0 +1,53 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + hypershift.openshift.io/metrics-endpoint: https-metrics + hypershift.openshift.io/metrics-job: olm-operator-metrics + hypershift.openshift.io/metrics-namespace: openshift-operator-lifecycle-manager + hypershift.openshift.io/metrics-service: olm-operator-metrics + name: olm-operator + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + endpoints: + - metricRelabelings: + - action: drop + regex: etcd_(debugging|disk|server).* + sourceLabels: + - __name__ + - action: replace + replacement: "" + targetLabel: _id + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + targetPort: metrics + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: + secret: + key: tls.crt + name: metrics-client + keySecret: + key: tls.key + name: metrics-client + serverName: olm-operator-metrics + namespaceSelector: + matchNames: + - hcp-namespace + selector: + matchLabels: + app: olm-operator diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_audit_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_audit_configmap.yaml new file mode 100644 index 000000000000..f6f16d2a1bd3 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_audit_configmap.yaml @@ -0,0 +1,61 @@ +apiVersion: v1 +data: + policy.yaml: | + apiVersion: audit.k8s.io/v1 + kind: Policy + metadata: + name: policy + omitManagedFields: true + omitStages: + - RequestReceived + rules: + - level: None + nonResourceURLs: + - /api* + - /version + - /healthz + - /readyz + - /livez + userGroups: + - system:authenticated + - system:unauthenticated + - level: None + namespaces: + - "" + resources: + - group: apiserver.openshift.io + resources: + - apirequestcounts + - apirequestcounts/* + users: + - system:apiserver + - level: RequestResponse + resources: + - group: user.openshift.io + resources: + - identities + - group: oauth.openshift.io + resources: + - oauthaccesstokens + - oauthauthorizetokens + verbs: + - create + - update + - patch + - delete + - level: Metadata + omitStages: + - RequestReceived + profile: Default +kind: ConfigMap +metadata: + name: openshift-apiserver-audit + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_configmap.yaml new file mode 100644 index 000000000000..2b8a7d791ac8 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_configmap.yaml @@ -0,0 +1,202 @@ +apiVersion: v1 +data: + config.yaml: | + admission: {} + aggregatorConfig: + allowedNames: null + clientCA: "" + extraHeaderPrefixes: null + groupHeaders: null + usernameHeaders: null + apiServerArguments: + audit-log-format: + - json + audit-log-maxbackup: + - "1" + audit-log-maxsize: + - "10" + audit-log-path: + - /var/log/openshift-apiserver/audit.log + audit-policy-file: + - /etc/kubernetes/audit-config/policy.yaml + feature-gates: + - AWSEFSDriverVolumeMetrics=true + - AdditionalRoutingCapabilities=true + - AdminNetworkPolicy=true + - AlibabaPlatform=true + - AzureWorkloadIdentity=true + - BareMetalLoadBalancer=true + - BuildCSIVolumes=true + - ChunkSizeMiB=true + - CloudDualStackNodeIPs=true + - DisableKubeletCloudCredentialProviders=true + - ExternalOIDC=true + - GCPLabelsTags=true + - HardwareSpeed=true + - IngressControllerLBSubnetsAWS=true + - KMSv1=true + - ManagedBootImages=true + - ManagedBootImagesAWS=true + - MultiArchInstallAWS=true + - MultiArchInstallGCP=true + - NetworkDiagnosticsConfig=true + - NetworkLiveMigration=true + - NetworkSegmentation=true + - NodeDisruptionPolicy=true + - OpenShiftPodSecurityAdmission=true + - PersistentIPsForVirtualization=true + - PrivateHostedZoneAWS=true + - SetEIPForNLBIngressController=true + - VSphereControlPlaneMachineSet=true + - VSphereDriverConfiguration=true + - VSphereMultiVCenters=true + - VSphereStaticIPs=true + - ValidatingAdmissionPolicy=true + - AWSClusterHostedDNS=false + - AutomatedEtcdBackup=false + - BootcNodeManagement=false + - CPMSMachineNamePrefix=false + - ClusterAPIInstall=false + - ClusterAPIInstallIBMCloud=false + - ClusterMonitoringConfig=false + - ClusterVersionOperatorConfiguration=false + - ConsolePluginContentSecurityPolicy=false + - DNSNameResolver=false + - DualReplica=false + - DyanmicServiceEndpointIBMCloud=false + - DynamicResourceAllocation=false + - EtcdBackendQuota=false + - EventedPLEG=false + - Example=false + - Example2=false + - GCPClusterHostedDNS=false + - GCPCustomAPIEndpoints=false + - GatewayAPI=false + - GatewayAPIController=false + - HighlyAvailableArbiter=false + - ImageStreamImportMode=false + - IngressControllerDynamicConfigurationManager=false + - InsightsConfig=false + - InsightsConfigAPI=false + - InsightsOnDemandDataGather=false + - InsightsRuntimeExtractor=false + - KMSEncryptionProvider=false + - MachineAPIMigration=false + - MachineAPIOperatorDisableMachineHealthCheckController=false + - MachineAPIProviderOpenStack=false + - MachineConfigNodes=false + - MaxUnavailableStatefulSet=false + - MetricsCollectionProfiles=false + - MinimumKubeletVersion=false + - MixedCPUsAllocation=false + - MultiArchInstallAzure=false + - NewOLM=false + - NewOLMCatalogdAPIV1Metas=false + - NodeSwap=false + - NutanixMultiSubnets=false + - OVNObservability=false + - OnClusterBuild=false + - PinnedImages=false + - PlatformOperators=false + - ProcMountType=false + - RouteAdvertisements=false + - RouteExternalCertificate=false + - SELinuxChangePolicy=false + - SELinuxMount=false + - ServiceAccountTokenNodeBinding=false + - ShortCertRotation=false + - SignatureStores=false + - SigstoreImageVerification=false + - SigstoreImageVerificationPKI=false + - TranslateStreamCloseWebsocketRequests=false + - UpgradeStatus=false + - UserNamespacesPodSecurityStandards=false + - UserNamespacesSupport=false + - VSphereConfigurableMaxAllowedBlockVolumesPerNode=false + - VSphereHostVMGroupZonal=false + - VSphereMultiDisk=false + - VSphereMultiNetworks=false + - VolumeAttributesClass=false + - VolumeGroupSnapshot=false + - WatchList=false + shutdown-delay-duration: + - 15s + apiServers: + perGroupOptions: null + apiVersion: openshiftcontrolplane.config.openshift.io/v1 + auditConfig: + auditFilePath: "" + enabled: false + logFormat: "" + maximumFileRetentionDays: 0 + maximumFileSizeMegabytes: 0 + maximumRetainedFiles: 0 + policyConfiguration: null + policyFile: "" + webHookKubeConfig: "" + webHookMode: "" + cloudProviderFile: "" + corsAllowedOrigins: null + imagePolicyConfig: + additionalTrustedCA: "" + allowedRegistriesForImport: null + externalRegistryHostnames: null + imageStreamImportMode: "" + internalRegistryHostname: image-registry.openshift-image-registry.svc:5000 + maxImagesBulkImportedPerRepository: 0 + jenkinsPipelineConfig: + autoProvisionEnabled: null + parameters: null + serviceName: "" + templateName: "" + templateNamespace: "" + kind: OpenShiftAPIServerConfig + kubeClientConfig: + connectionOverrides: + acceptContentTypes: "" + burst: 0 + contentType: "" + qps: 0 + kubeConfig: /etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + projectConfig: + defaultNodeSelector: "" + projectRequestMessage: "" + projectRequestTemplate: "" + routingConfig: + subdomain: apps.hcp. + serviceAccountOAuthGrantMethod: "" + servingInfo: + bindAddress: "" + bindNetwork: "" + certFile: /etc/kubernetes/certs/serving/tls.crt + cipherSuites: + - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 + - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + clientCA: /etc/kubernetes/certs/client-ca/ca.crt + keyFile: /etc/kubernetes/certs/serving/tls.key + maxRequestsInFlight: 0 + minTLSVersion: VersionTLS12 + requestTimeoutSeconds: 0 + storageConfig: + ca: /etc/kubernetes/certs/etcd-client-ca/ca.crt + certFile: /etc/kubernetes/certs/etcd-client/etcd-client.crt + keyFile: /etc/kubernetes/certs/etcd-client/etcd-client.key + storagePrefix: "" + urls: + - https://etcd-client:2379 +kind: ConfigMap +metadata: + name: openshift-apiserver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_controlplanecomponent.yaml new file mode 100644 index 000000000000..edcf4f8398b9 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_controlplanecomponent.yaml @@ -0,0 +1,33 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: openshift-apiserver + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: openshift-apiserver Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment openshift-apiserver rollout to finish: 0 out + of 3 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: openshift-apiserver-audit + - group: "" + kind: ConfigMap + name: openshift-apiserver + - group: policy + kind: PodDisruptionBudget + name: openshift-apiserver + - group: monitoring.coreos.com + kind: ServiceMonitor + name: openshift-apiserver diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_deployment.yaml new file mode 100644 index 000000000000..f8d123a12151 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_deployment.yaml @@ -0,0 +1,356 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: openshift-apiserver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 3 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: openshift-apiserver + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: work-logs,oas-trust-anchor,tmp-dir + component.hypershift.openshift.io/config-hash: 0fd3eed819dc307e56859177829b997b + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: openshift-apiserver + hypershift.openshift.io/control-plane-component: openshift-apiserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: openshift-apiserver + hypershift.openshift.io/control-plane-component: openshift-apiserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: openshift-apiserver + hypershift.openshift.io/control-plane-component: openshift-apiserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - start + - --config=/etc/kubernetes/config/config.yaml + - --authorization-kubeconfig=/etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + - --authentication-kubeconfig=/etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + - --requestheader-client-ca-file=/etc/kubernetes/certs/aggregator-client-ca/ca.crt + - --requestheader-allowed-names=kube-apiserver-proxy,system:kube-apiserver-proxy,system:openshift-aggregator + - --requestheader-username-headers=X-Remote-User + - --requestheader-group-headers=X-Remote-Group + - --requestheader-extra-headers-prefix=X-Remote-Extra- + - --client-ca-file=/etc/kubernetes/certs/client-ca/ca.crt + env: + - name: HTTP_PROXY + value: http://127.0.0.1:8090 + - name: HTTPS_PROXY + value: http://127.0.0.1:8090 + - name: NO_PROXY + value: kube-apiserver,etcd-client,audit-webhook + image: openshift-apiserver + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: livez?exclude=etcd + port: 8443 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + name: openshift-apiserver + ports: + - containerPort: 8443 + name: https + protocol: TCP + readinessProbe: + failureThreshold: 10 + httpGet: + path: readyz?exclude=etcd&exclude=etcd-readiness + port: 8443 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: + requests: + cpu: 100m + memory: 200Mi + securityContext: + readOnlyRootFilesystem: true + startupProbe: + failureThreshold: 30 + httpGet: + path: livez + port: 8443 + scheme: HTTPS + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 10 + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/certs/aggregator-client-ca + name: aggregator-ca + - mountPath: /etc/kubernetes/audit-config + name: audit-config + - mountPath: /etc/kubernetes/certs/client-ca + name: client-ca + - mountPath: /etc/kubernetes/config + name: config + - mountPath: /etc/kubernetes/certs/etcd-client-ca + name: etcd-client-ca + - mountPath: /etc/kubernetes/certs/etcd-client + name: etcd-client-cert + - mountPath: /etc/kubernetes/secrets/svc-kubeconfig + name: kubeconfig + - mountPath: /etc/pki/ca-trust/extracted/pem + name: oas-trust-anchor + - mountPath: /var/lib/kubelet + name: pull-secret + - mountPath: /etc/kubernetes/certs/serving + name: serving-cert + - mountPath: /var/log/openshift-apiserver + name: work-logs + - mountPath: /tmp + name: tmp-dir + workingDir: /var/log/openshift-apiserver + - args: + - -c + - | + set -o errexit + set -o nounset + set -o pipefail + + function cleanup() { + pkill -P $$$ + wait + exit + } + trap cleanup SIGTERM + + /usr/bin/tail -c+1 -F /var/log/openshift-apiserver/audit.log & + wait $! + command: + - /bin/bash + image: cli + imagePullPolicy: IfNotPresent + name: audit-logs + resources: + requests: + cpu: 5m + memory: 10Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/log/openshift-apiserver + name: work-logs + - mountPath: /tmp + name: tmp-dir + - command: + - /bin/bash + - -c + - sleep infinity + image: cli + imagePullPolicy: IfNotPresent + name: kas-readiness-check + readinessProbe: + exec: + command: + - /bin/bash + - -c + - curl -kfs https://kube-apiserver:6443/livez > /dev/null + failureThreshold: 3 + periodSeconds: 10 + timeoutSeconds: 5 + resources: + requests: + cpu: 10m + memory: 10Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /tmp + name: tmp-dir + - args: + - run + command: + - /usr/bin/control-plane-operator + - konnectivity-https-proxy + env: + - name: KUBECONFIG + value: /etc/kubernetes/secrets/kubeconfig/kubeconfig + image: controlplane-operator + name: konnectivity-proxy-https + resources: + requests: + cpu: 10m + memory: 30Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/secrets/kubeconfig + name: kubeconfig + - mountPath: /etc/konnectivity/proxy-client + name: konnectivity-proxy-cert + - mountPath: /etc/konnectivity/proxy-ca + name: konnectivity-proxy-ca + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + - command: + - /bin/bash + - -c + - |2 + + #!/bin/bash + + set -euo pipefail + + # Ensure the directory is empty, prevent restart from failing + rm -rf /run/ca-trust-generated/* || { + chmod -R u+w /run/ca-trust-generated/* 2>/dev/null || true + rm -rf /run/ca-trust-generated/* || true + } + cp -f -r /etc/pki/ca-trust/extracted/pem/* /run/ca-trust-generated/ + + if ! [[ -f /run/service-ca-signer/service-ca.crt ]]; then + exit 0 + fi + + chmod 0666 /run/ca-trust-generated/tls-ca-bundle.pem + echo '#service signer ca' >> /run/ca-trust-generated/tls-ca-bundle.pem + cat /run/service-ca-signer/service-ca.crt >>/run/ca-trust-generated/tls-ca-bundle.pem + chmod 0444 /run/ca-trust-generated/tls-ca-bundle.pem + image: openshift-apiserver + imagePullPolicy: IfNotPresent + name: oas-trust-anchor-generator + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /run/ca-trust-generated + name: oas-trust-anchor + priorityClassName: hypershift-api-critical + terminationGracePeriodSeconds: 120 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: work-logs + - configMap: + defaultMode: 420 + name: openshift-apiserver + name: config + - configMap: + defaultMode: 420 + name: openshift-apiserver-audit + name: audit-config + - configMap: + defaultMode: 420 + name: aggregator-client-ca + name: aggregator-ca + - configMap: + defaultMode: 420 + name: etcd-ca + name: etcd-client-ca + - configMap: + defaultMode: 420 + name: client-ca + name: client-ca + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - name: serving-cert + secret: + defaultMode: 416 + secretName: openshift-apiserver-cert + - name: etcd-client-cert + secret: + defaultMode: 416 + secretName: etcd-client-tls + - emptyDir: {} + name: oas-trust-anchor + - name: pull-secret + secret: + defaultMode: 416 + items: + - key: .dockerconfigjson + path: config.json + secretName: pull-secret + - name: konnectivity-proxy-cert + secret: + defaultMode: 416 + secretName: konnectivity-client + - configMap: + name: konnectivity-ca-bundle + name: konnectivity-proxy-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_poddisruptionbudget.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_poddisruptionbudget.yaml new file mode 100644 index 000000000000..35bdbfc9e7dd --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_poddisruptionbudget.yaml @@ -0,0 +1,23 @@ +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: openshift-apiserver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + selector: + matchLabels: + app: openshift-apiserver + unhealthyPodEvictionPolicy: AlwaysAllow +status: + currentHealthy: 0 + desiredHealthy: 0 + disruptionsAllowed: 0 + expectedPods: 0 diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_servicemonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_servicemonitor.yaml new file mode 100644 index 000000000000..0920e15f3f05 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_apiserver_servicemonitor.yaml @@ -0,0 +1,66 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + hypershift.openshift.io/metrics-endpoint: https + hypershift.openshift.io/metrics-job: api + hypershift.openshift.io/metrics-namespace: openshift-apiserver + hypershift.openshift.io/metrics-service: api + name: openshift-apiserver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + endpoints: + - metricRelabelings: + - action: drop + regex: etcd_(debugging|disk|server).* + sourceLabels: + - __name__ + - action: drop + regex: apiserver_admission_controller_admission_latencies_seconds_.* + sourceLabels: + - __name__ + - action: drop + regex: apiserver_admission_step_admission_latencies_seconds_.* + sourceLabels: + - __name__ + - action: drop + regex: apiserver_request_duration_seconds_bucket;(0.15|0.25|0.3|0.35|0.4|0.45|0.6|0.7|0.8|0.9|1.25|1.5|1.75|2.5|3|3.5|4.5|6|7|8|9|15|25|30|50)(\.0)? + sourceLabels: + - __name__ + - le + - action: replace + replacement: "" + targetLabel: _id + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + targetPort: https + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: + secret: + key: tls.crt + name: metrics-client + keySecret: + key: tls.key + name: metrics-client + serverName: openshift-apiserver + namespaceSelector: + matchNames: + - hcp-namespace + selector: + matchLabels: + app: openshift-apiserver diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_config_configmap.yaml new file mode 100644 index 000000000000..fd512666a175 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_config_configmap.yaml @@ -0,0 +1,175 @@ +apiVersion: v1 +data: + config.yaml: | + apiVersion: openshiftcontrolplane.config.openshift.io/v1 + build: + additionalTrustedCA: "" + buildDefaults: null + buildOverrides: null + imageTemplateFormat: + format: docker-builder + latest: false + controllers: null + deployer: + imageTemplateFormat: + format: deployer + latest: false + dockerPullSecret: + internalRegistryHostname: image-registry.openshift-image-registry.svc:5000 + registryURLs: null + featureGates: + - AWSEFSDriverVolumeMetrics=true + - AdditionalRoutingCapabilities=true + - AdminNetworkPolicy=true + - AlibabaPlatform=true + - AzureWorkloadIdentity=true + - BareMetalLoadBalancer=true + - BuildCSIVolumes=true + - ChunkSizeMiB=true + - CloudDualStackNodeIPs=true + - DisableKubeletCloudCredentialProviders=true + - ExternalOIDC=true + - GCPLabelsTags=true + - HardwareSpeed=true + - IngressControllerLBSubnetsAWS=true + - KMSv1=true + - ManagedBootImages=true + - ManagedBootImagesAWS=true + - MultiArchInstallAWS=true + - MultiArchInstallGCP=true + - NetworkDiagnosticsConfig=true + - NetworkLiveMigration=true + - NetworkSegmentation=true + - NodeDisruptionPolicy=true + - OpenShiftPodSecurityAdmission=true + - PersistentIPsForVirtualization=true + - PrivateHostedZoneAWS=true + - SetEIPForNLBIngressController=true + - VSphereControlPlaneMachineSet=true + - VSphereDriverConfiguration=true + - VSphereMultiVCenters=true + - VSphereStaticIPs=true + - ValidatingAdmissionPolicy=true + - AWSClusterHostedDNS=false + - AutomatedEtcdBackup=false + - BootcNodeManagement=false + - CPMSMachineNamePrefix=false + - ClusterAPIInstall=false + - ClusterAPIInstallIBMCloud=false + - ClusterMonitoringConfig=false + - ClusterVersionOperatorConfiguration=false + - ConsolePluginContentSecurityPolicy=false + - DNSNameResolver=false + - DualReplica=false + - DyanmicServiceEndpointIBMCloud=false + - DynamicResourceAllocation=false + - EtcdBackendQuota=false + - EventedPLEG=false + - Example=false + - Example2=false + - GCPClusterHostedDNS=false + - GCPCustomAPIEndpoints=false + - GatewayAPI=false + - GatewayAPIController=false + - HighlyAvailableArbiter=false + - ImageStreamImportMode=false + - IngressControllerDynamicConfigurationManager=false + - InsightsConfig=false + - InsightsConfigAPI=false + - InsightsOnDemandDataGather=false + - InsightsRuntimeExtractor=false + - KMSEncryptionProvider=false + - MachineAPIMigration=false + - MachineAPIOperatorDisableMachineHealthCheckController=false + - MachineAPIProviderOpenStack=false + - MachineConfigNodes=false + - MaxUnavailableStatefulSet=false + - MetricsCollectionProfiles=false + - MinimumKubeletVersion=false + - MixedCPUsAllocation=false + - MultiArchInstallAzure=false + - NewOLM=false + - NewOLMCatalogdAPIV1Metas=false + - NodeSwap=false + - NutanixMultiSubnets=false + - OVNObservability=false + - OnClusterBuild=false + - PinnedImages=false + - PlatformOperators=false + - ProcMountType=false + - RouteAdvertisements=false + - RouteExternalCertificate=false + - SELinuxChangePolicy=false + - SELinuxMount=false + - ServiceAccountTokenNodeBinding=false + - ShortCertRotation=false + - SignatureStores=false + - SigstoreImageVerification=false + - SigstoreImageVerificationPKI=false + - TranslateStreamCloseWebsocketRequests=false + - UpgradeStatus=false + - UserNamespacesPodSecurityStandards=false + - UserNamespacesSupport=false + - VSphereConfigurableMaxAllowedBlockVolumesPerNode=false + - VSphereHostVMGroupZonal=false + - VSphereMultiDisk=false + - VSphereMultiNetworks=false + - VolumeAttributesClass=false + - VolumeGroupSnapshot=false + imageImport: + disableScheduledImport: false + maxScheduledImageImportsPerMinute: 0 + scheduledImageImportMinimumIntervalSeconds: 0 + ingress: + ingressIPNetworkCIDR: "" + kind: OpenShiftControllerManagerConfig + leaderElection: + leaseDuration: 0s + name: openshift-master-controllers + renewDeadline: 0s + retryPeriod: 0s + network: + clusterNetworks: null + networkPluginName: "" + serviceNetworkCIDR: "" + vxlanPort: 0 + resourceQuota: + concurrentSyncs: 0 + minResyncPeriod: 0s + syncPeriod: 0s + securityAllocator: + mcsAllocatorRange: "" + mcsLabelsPerProject: 0 + uidAllocatorRange: "" + serviceAccount: + managedNames: null + serviceServingCert: + signer: null + servingInfo: + bindAddress: 0.0.0.0:8443 + bindNetwork: "" + certFile: /etc/kubernetes/certs/tls.crt + cipherSuites: + - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 + - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + clientCA: /etc/kubernetes/client-ca/ca.crt + keyFile: /etc/kubernetes/certs/tls.key + maxRequestsInFlight: 0 + minTLSVersion: VersionTLS12 + requestTimeoutSeconds: 0 +kind: ConfigMap +metadata: + name: openshift-controller-manager-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_controlplanecomponent.yaml new file mode 100644 index 000000000000..f25eae78ebbe --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_controlplanecomponent.yaml @@ -0,0 +1,30 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: openshift-controller-manager + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: openshift-controller-manager Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment openshift-controller-manager rollout to finish: + 0 out of 2 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: openshift-controller-manager-config + - group: "" + kind: Service + name: openshift-controller-manager + - group: monitoring.coreos.com + kind: ServiceMonitor + name: openshift-controller-manager diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_deployment.yaml new file mode 100644 index 000000000000..968f57b523a9 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_deployment.yaml @@ -0,0 +1,170 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: openshift-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 2 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: openshift-controller-manager + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: da3c0e77 + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: openshift-controller-manager + hypershift.openshift.io/control-plane-component: openshift-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: openshift-controller-manager + hypershift.openshift.io/control-plane-component: openshift-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: openshift-controller-manager + hypershift.openshift.io/control-plane-component: openshift-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - start + - --config + - /etc/kubernetes/config/config.yaml + - --kubeconfig + - /etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + - --namespace=openshift-controller-manager + command: + - openshift-controller-manager + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + value: openshift-controller-manager + image: openshift-controller-manager + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 8443 + scheme: HTTPS + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + name: openshift-controller-manager + ports: + - containerPort: 8443 + name: https + protocol: TCP + readinessProbe: + failureThreshold: 10 + httpGet: + path: /healthz + port: 8443 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 100m + memory: 100Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/client-ca + name: client-ca + - mountPath: /etc/kubernetes/config + name: config + - mountPath: /etc/kubernetes/secrets/svc-kubeconfig + name: kubeconfig + - mountPath: /etc/kubernetes/certs + name: serving-cert + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - configMap: + defaultMode: 420 + name: openshift-controller-manager-config + name: config + - name: serving-cert + secret: + defaultMode: 416 + secretName: openshift-controller-manager-cert + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - configMap: + defaultMode: 420 + name: client-ca + name: client-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_service.yaml new file mode 100644 index 000000000000..87d81b93a2ca --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_service.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: openshift-controller-manager + name: openshift-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ipFamilyPolicy: PreferDualStack + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: https + selector: + app: openshift-controller-manager + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_servicemonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_servicemonitor.yaml new file mode 100644 index 000000000000..e74695a246b8 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_controller_manager_servicemonitor.yaml @@ -0,0 +1,53 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + hypershift.openshift.io/metrics-endpoint: https + hypershift.openshift.io/metrics-job: controller-manager + hypershift.openshift.io/metrics-namespace: openshift-controller-manager + hypershift.openshift.io/metrics-service: controller-manager + name: openshift-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + endpoints: + - metricRelabelings: + - action: drop + regex: etcd_(debugging|disk|request|server).* + sourceLabels: + - __name__ + - action: replace + replacement: "" + targetLabel: _id + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + targetPort: https + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: + secret: + key: tls.crt + name: metrics-client + keySecret: + key: tls.key + name: metrics-client + serverName: openshift-controller-manager + namespaceSelector: + matchNames: + - hcp-namespace + selector: + matchLabels: + app: openshift-controller-manager diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_audit_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_audit_configmap.yaml new file mode 100644 index 000000000000..58015069e4c7 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_audit_configmap.yaml @@ -0,0 +1,61 @@ +apiVersion: v1 +data: + policy.yaml: | + apiVersion: audit.k8s.io/v1 + kind: Policy + metadata: + name: policy + omitManagedFields: true + omitStages: + - RequestReceived + rules: + - level: None + nonResourceURLs: + - /api* + - /version + - /healthz + - /readyz + - /livez + userGroups: + - system:authenticated + - system:unauthenticated + - level: None + namespaces: + - "" + resources: + - group: apiserver.openshift.io + resources: + - apirequestcounts + - apirequestcounts/* + users: + - system:apiserver + - level: RequestResponse + resources: + - group: user.openshift.io + resources: + - identities + - group: oauth.openshift.io + resources: + - oauthaccesstokens + - oauthauthorizetokens + verbs: + - create + - update + - patch + - delete + - level: Metadata + omitStages: + - RequestReceived + profile: Default +kind: ConfigMap +metadata: + name: openshift-oauth-apiserver-audit + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_controlplanecomponent.yaml new file mode 100644 index 000000000000..5f2c77c0b986 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_controlplanecomponent.yaml @@ -0,0 +1,27 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: openshift-oauth-apiserver + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: openshift-oauth-apiserver Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment openshift-oauth-apiserver rollout to finish: + 0 out of 3 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: openshift-oauth-apiserver-audit + - group: policy + kind: PodDisruptionBudget + name: openshift-oauth-apiserver diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_deployment.yaml new file mode 100644 index 000000000000..b64e9cb395f0 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_deployment.yaml @@ -0,0 +1,333 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: openshift-oauth-apiserver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 3 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: openshift-oauth-apiserver + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: work-logs,tmp-dir + component.hypershift.openshift.io/config-hash: 0fd3eed819dc307e + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: openshift-oauth-apiserver + hypershift.openshift.io/control-plane-component: openshift-oauth-apiserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: openshift-oauth-apiserver + hypershift.openshift.io/control-plane-component: openshift-oauth-apiserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: openshift-oauth-apiserver + hypershift.openshift.io/control-plane-component: openshift-oauth-apiserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - start + - --authorization-kubeconfig=/etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + - --authentication-kubeconfig=/etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + - --kubeconfig=/etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + - --secure-port=8443 + - --audit-log-path=/var/log/openshift-oauth-apiserver/audit.log + - --audit-log-format=json + - --audit-log-maxsize=10 + - --audit-log-maxbackup=1 + - --etcd-cafile=/etc/kubernetes/certs/etcd-client-ca/ca.crt + - --etcd-keyfile=/etc/kubernetes/certs/etcd-client/etcd-client.key + - --etcd-certfile=/etc/kubernetes/certs/etcd-client/etcd-client.crt + - --shutdown-delay-duration=15s + - --tls-private-key-file=/etc/kubernetes/certs/serving/tls.key + - --tls-cert-file=/etc/kubernetes/certs/serving/tls.crt + - --audit-policy-file=/etc/kubernetes/audit-config/policy.yaml + - --cors-allowed-origins='//127\.0\.0\.1(:|$)' + - --cors-allowed-origins='//localhost(:|$)' + - --v=2 + - --requestheader-client-ca-file=/etc/kubernetes/certs/aggregator-client-ca/ca.crt + - --requestheader-allowed-names=kube-apiserver-proxy,system:kube-apiserver-proxy,system:openshift-aggregator + - --requestheader-username-headers=X-Remote-User + - --requestheader-group-headers=X-Remote-Group + - --requestheader-extra-headers-prefix=X-Remote-Extra- + - --client-ca-file=/etc/kubernetes/certs/client-ca/ca.crt + - --api-audiences=https://test-oidc-bucket.s3.us-east-1.amazonaws.com/test-cluster + - --etcd-servers=https://etcd-client:2379 + - --tls-min-version=VersionTLS12 + - --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + command: + - /usr/bin/oauth-apiserver + env: + - name: HTTP_PROXY + value: socks5://127.0.0.1:8090 + - name: HTTPS_PROXY + value: socks5://127.0.0.1:8090 + - name: NO_PROXY + value: kube-apiserver,etcd-client,audit-webhook + image: oauth-apiserver + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: healthz + port: 8443 + scheme: HTTPS + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: openshift-oauth-apiserver + readinessProbe: + failureThreshold: 10 + httpGet: + path: readyz + port: 8443 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: + requests: + cpu: 150m + memory: 80Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/certs/aggregator-client-ca + name: aggregator-ca + - mountPath: /etc/kubernetes/audit-config + name: audit-config + - mountPath: /etc/kubernetes/certs/client-ca + name: client-ca + - mountPath: /etc/kubernetes/certs/etcd-client-ca + name: etcd-client-ca + - mountPath: /etc/kubernetes/certs/etcd-client + name: etcd-client-cert + - mountPath: /etc/kubernetes/secrets/svc-kubeconfig + name: kubeconfig + - mountPath: /etc/kubernetes/certs/serving + name: serving-cert + - mountPath: /var/log/openshift-oauth-apiserver + name: work-logs + - mountPath: /tmp + name: tmp-dir + workingDir: /var/log/openshift-oauth-apiserver + - args: + - -c + - | + set -o errexit + set -o nounset + set -o pipefail + + function cleanup() { + pkill -P $$$ + wait + exit + } + trap cleanup SIGTERM + + /usr/bin/tail -c+1 -F /var/log/openshift-oauth-apiserver/audit.log & + wait $! + command: + - /bin/bash + image: cli + imagePullPolicy: IfNotPresent + name: audit-logs + resources: + requests: + cpu: 5m + memory: 10Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/log/openshift-oauth-apiserver + name: work-logs + - mountPath: /tmp + name: tmp-dir + - command: + - /bin/bash + - -c + - sleep infinity + image: cli + imagePullPolicy: IfNotPresent + name: kas-readiness-check + readinessProbe: + exec: + command: + - /bin/bash + - -c + - curl -kfs https://kube-apiserver:6443/livez > /dev/null + failureThreshold: 3 + periodSeconds: 10 + timeoutSeconds: 5 + resources: + requests: + cpu: 10m + memory: 10Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /tmp + name: tmp-dir + - args: + - run + - --resolve-from-guest-cluster-dns=true + command: + - /usr/bin/control-plane-operator + - konnectivity-socks5-proxy + env: + - name: KUBECONFIG + value: /etc/kubernetes/secrets/kubeconfig/kubeconfig + image: controlplane-operator + name: konnectivity-proxy-socks5 + resources: + requests: + cpu: 10m + memory: 30Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/secrets/kubeconfig + name: kubeconfig + - mountPath: /etc/konnectivity/proxy-client + name: konnectivity-proxy-cert + - mountPath: /etc/konnectivity/proxy-ca + name: konnectivity-proxy-ca + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + - args: + - -c + - | + #!/bin/sh + while ! nslookup etcd-client.$(POD_NAMESPACE).svc; do sleep 1; done + command: + - /bin/bash + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: cli + imagePullPolicy: IfNotPresent + name: wait-for-etcd + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + priorityClassName: hypershift-api-critical + terminationGracePeriodSeconds: 120 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: work-logs + - configMap: + defaultMode: 420 + name: openshift-oauth-apiserver-audit + name: audit-config + - configMap: + defaultMode: 420 + name: aggregator-client-ca + name: aggregator-ca + - configMap: + defaultMode: 420 + name: etcd-ca + name: etcd-client-ca + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - name: serving-cert + secret: + defaultMode: 416 + secretName: openshift-oauth-apiserver-cert + - name: etcd-client-cert + secret: + defaultMode: 416 + secretName: etcd-client-tls + - configMap: + defaultMode: 420 + name: client-ca + name: client-ca + - name: konnectivity-proxy-cert + secret: + defaultMode: 416 + secretName: konnectivity-client + - configMap: + name: konnectivity-ca-bundle + name: konnectivity-proxy-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_poddisruptionbudget.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_poddisruptionbudget.yaml new file mode 100644 index 000000000000..7c95683e4081 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-oauth-apiserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_oauth_apiserver_poddisruptionbudget.yaml @@ -0,0 +1,23 @@ +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: openshift-oauth-apiserver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + selector: + matchLabels: + app: openshift-oauth-apiserver + unhealthyPodEvictionPolicy: AlwaysAllow +status: + currentHealthy: 0 + desiredHealthy: 0 + disruptionsAllowed: 0 + expectedPods: 0 diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_config_configmap.yaml new file mode 100644 index 000000000000..d0978d920f1f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_config_configmap.yaml @@ -0,0 +1,77 @@ +apiVersion: v1 +data: + config.yaml: | + apiVersion: openshiftcontrolplane.config.openshift.io/v1 + build: + additionalTrustedCA: "" + buildDefaults: null + buildOverrides: null + imageTemplateFormat: + format: "" + latest: false + controllers: null + deployer: + imageTemplateFormat: + format: "" + latest: false + dockerPullSecret: + internalRegistryHostname: "" + registryURLs: null + featureGates: null + imageImport: + disableScheduledImport: false + maxScheduledImageImportsPerMinute: 0 + scheduledImageImportMinimumIntervalSeconds: 0 + ingress: + ingressIPNetworkCIDR: "" + kind: OpenShiftControllerManagerConfig + leaderElection: + leaseDuration: 0s + name: openshift-route-controllers + renewDeadline: 0s + retryPeriod: 0s + network: + clusterNetworks: null + networkPluginName: "" + serviceNetworkCIDR: "" + vxlanPort: 0 + resourceQuota: + concurrentSyncs: 0 + minResyncPeriod: 0s + syncPeriod: 0s + securityAllocator: + mcsAllocatorRange: "" + mcsLabelsPerProject: 0 + uidAllocatorRange: "" + serviceAccount: + managedNames: null + serviceServingCert: + signer: null + servingInfo: + bindAddress: 0.0.0.0:8443 + bindNetwork: "" + certFile: /etc/kubernetes/certs/tls.crt + cipherSuites: + - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 + - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + clientCA: /etc/kubernetes/client-ca/ca.crt + keyFile: /etc/kubernetes/certs/tls.key + maxRequestsInFlight: 0 + minTLSVersion: VersionTLS12 + requestTimeoutSeconds: 0 +kind: ConfigMap +metadata: + name: openshift-route-controller-manager-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_controlplanecomponent.yaml new file mode 100644 index 000000000000..a290e7f20bb7 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_controlplanecomponent.yaml @@ -0,0 +1,31 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: openshift-route-controller-manager + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: openshift-route-controller-manager Deployment Available condition not + found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment openshift-route-controller-manager rollout to + finish: 0 out of 2 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: openshift-route-controller-manager-config + - group: "" + kind: Service + name: openshift-route-controller-manager + - group: monitoring.coreos.com + kind: ServiceMonitor + name: openshift-route-controller-manager diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_deployment.yaml new file mode 100644 index 000000000000..9d447616c95e --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_deployment.yaml @@ -0,0 +1,173 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: openshift-route-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 2 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: openshift-route-controller-manager + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: 130905bd + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: openshift-route-controller-manager + hypershift.openshift.io/control-plane-component: openshift-route-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: openshift-route-controller-manager + hypershift.openshift.io/control-plane-component: openshift-route-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: openshift-route-controller-manager + hypershift.openshift.io/control-plane-component: openshift-route-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - start + - --config + - /etc/kubernetes/config/config.yaml + - --kubeconfig + - /etc/kubernetes/secrets/svc-kubeconfig/kubeconfig + - --namespace=openshift-route-controller-manager + command: + - route-controller-manager + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + value: openshift-route-controller-manager + image: route-controller-manager + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 8443 + scheme: HTTPS + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + name: openshift-route-controller-manager + ports: + - containerPort: 8443 + name: https + protocol: TCP + readinessProbe: + failureThreshold: 10 + httpGet: + path: /healthz + port: 8443 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 100m + memory: 100Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/client-ca + name: client-ca + - mountPath: /etc/kubernetes/config + name: config + - mountPath: /etc/kubernetes/secrets/svc-kubeconfig + name: kubeconfig + - mountPath: /etc/kubernetes/certs + name: serving-cert + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - configMap: + defaultMode: 420 + name: openshift-route-controller-manager-config + name: config + - name: serving-cert + secret: + defaultMode: 416 + secretName: openshift-route-controller-manager-cert + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - configMap: + defaultMode: 420 + name: client-ca + name: client-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_service.yaml new file mode 100644 index 000000000000..8e28b9b34473 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_service.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: openshift-route-controller-manager + name: openshift-route-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + internalTrafficPolicy: Cluster + ipFamilyPolicy: PreferDualStack + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: https + selector: + app: openshift-route-controller-manager + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_servicemonitor.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_servicemonitor.yaml new file mode 100644 index 000000000000..b765798a8294 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openshift-route-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openshift_route_controller_manager_servicemonitor.yaml @@ -0,0 +1,53 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + hypershift.openshift.io/metrics-endpoint: https + hypershift.openshift.io/metrics-job: route-controller-manager + hypershift.openshift.io/metrics-namespace: openshift-route-controller-manager + hypershift.openshift.io/metrics-service: route-controller-manager + name: openshift-route-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + endpoints: + - metricRelabelings: + - action: drop + regex: etcd_(debugging|disk|request|server).* + sourceLabels: + - __name__ + - action: replace + replacement: "" + targetLabel: _id + relabelings: + - action: replace + replacement: "" + targetLabel: _id + scheme: https + targetPort: https + tlsConfig: + ca: + configMap: + key: ca.crt + name: root-ca + cert: + secret: + key: tls.crt + name: metrics-client + keySecret: + key: tls.key + name: metrics-client + serverName: openshift-controller-manager + namespaceSelector: + matchNames: + - hcp-namespace + selector: + matchLabels: + app: openshift-route-controller-manager diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_cloud_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_cloud_config_configmap.yaml new file mode 100644 index 000000000000..2797362c90f9 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_cloud_config_configmap.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + cloud.conf: "[Global]\nuse-clouds = true\nclouds-file = /etc/openstack/secret/clouds.yaml\ncloud + = \n\n[LoadBalancer]\nmax-shared-lb = 1\nmanage-security-groups = true\n\n[Networking]\naddress-sort-order + = \n" +kind: ConfigMap +metadata: + name: openstack-cloud-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_cloud_controller_manager_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_cloud_controller_manager_controlplanecomponent.yaml new file mode 100644 index 000000000000..4059dc1a94aa --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_cloud_controller_manager_controlplanecomponent.yaml @@ -0,0 +1,28 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: openstack-cloud-controller-manager + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: openstack-cloud-controller-manager Deployment Available condition not + found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment openstack-cloud-controller-manager rollout to + finish: 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: openstack-cloud-config + - group: "" + kind: ConfigMap + name: openstack-trusted-ca diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_cloud_controller_manager_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_cloud_controller_manager_deployment.yaml new file mode 100644 index 000000000000..dcf4611b8a1f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_cloud_controller_manager_deployment.yaml @@ -0,0 +1,138 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: openstack-cloud-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + infrastructure.openshift.io/cloud-controller-manager: OpenStack + k8s-app: openstack-cloud-controller-manager + strategy: + type: Recreate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: 1cdcee0c + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: cloud-controller-manager + hypershift.openshift.io/control-plane-component: openstack-cloud-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + infrastructure.openshift.io/cloud-controller-manager: OpenStack + k8s-app: openstack-cloud-controller-manager + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - --v=1 + - --cloud-config=$(CLOUD_CONFIG) + - --cluster-name=$(OCP_INFRASTRUCTURE_NAME) + - --kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + - --cloud-provider=openstack + - --use-service-account-credentials=false + - --configure-cloud-routes=false + - --bind-address=127.0.0.1 + - --leader-elect=true + - --leader-elect-lease-duration=137s + - --leader-elect-renew-deadline=107s + - --leader-elect-retry-period=26s + - --leader-elect-resource-namespace=openshift-cloud-controller-manager + command: + - /usr/bin/openstack-cloud-controller-manager + env: + - name: CLOUD_CONFIG + value: /etc/openstack/config/cloud.conf + - name: OCP_INFRASTRUCTURE_NAME + image: openstack-cloud-controller-manager + imagePullPolicy: IfNotPresent + name: cloud-controller-manager + resources: + requests: + cpu: 200m + memory: 50Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/kubeconfig + name: kubeconfig + readOnly: true + - mountPath: /etc/openstack/config + name: cloud-config + readOnly: true + - mountPath: /etc/openstack/secret + name: secret-occm + readOnly: true + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - configMap: + defaultMode: 420 + items: + - key: cloud.conf + path: cloud.conf + name: openstack-cloud-config + name: cloud-config + - name: secret-occm + secret: + defaultMode: 416 + items: + - key: clouds.yaml + path: clouds.yaml + secretName: fake-cloud-credentials-secret + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_trusted_ca_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_trusted_ca_configmap.yaml new file mode 100644 index 000000000000..159402fbe6b3 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/openstack-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_openstack_trusted_ca_configmap.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +data: + ca-bundle.pem: "" +kind: ConfigMap +metadata: + name: openstack-trusted-ca + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/packageserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_packageserver_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/packageserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_packageserver_controlplanecomponent.yaml new file mode 100644 index 000000000000..85423a912b01 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/packageserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_packageserver_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: packageserver + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: packageserver Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment packageserver rollout to finish: 0 out of 3 new + replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: policy + kind: PodDisruptionBudget + name: packageserver-pdb diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/packageserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_packageserver_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/packageserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_packageserver_deployment.yaml new file mode 100644 index 000000000000..39da61d1332f --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/packageserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_packageserver_deployment.yaml @@ -0,0 +1,255 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: packageserver + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 3 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: packageserver + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmpfs,tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: packageserver + hypershift.openshift.io/control-plane-component: packageserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app: packageserver + hypershift.openshift.io/control-plane-component: packageserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: topology.kubernetes.io/zone + - labelSelector: + matchLabels: + app: packageserver + hypershift.openshift.io/control-plane-component: packageserver + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: true + containers: + - args: + - -v=4 + - --secure-port + - "5443" + - --global-namespace + - openshift-marketplace + - --kubeconfig + - /etc/openshift/kubeconfig/kubeconfig + - --authentication-kubeconfig + - /etc/openshift/kubeconfig/kubeconfig + - --authorization-kubeconfig + - /etc/openshift/kubeconfig/kubeconfig + - --tls-min-version=VersionTLS12 + - --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + command: + - /bin/package-server + env: + - name: OPERATOR_CONDITION_NAME + value: packageserver + - name: GRPC_PROXY + value: socks5://127.0.0.1:8090 + - name: NO_PROXY + value: kube-apiserver + - name: RELEASE_VERSION + value: 4.18.0 + image: operator-lifecycle-manager + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 10 + httpGet: + path: /healthz + port: 5443 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: packageserver + ports: + - containerPort: 5443 + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 5443 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: + requests: + cpu: 10m + memory: 250Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /tmp + name: tmpfs + - mountPath: /apiserver.local.config/certificates + name: apiservice-cert + - mountPath: /tmp/k8s-webhook-server/serving-certs + name: webhook-cert + - mountPath: /etc/openshift/kubeconfig + name: kubeconfig + readOnly: true + - command: + - /bin/bash + - -c + - sleep infinity + image: cli + imagePullPolicy: IfNotPresent + name: kas-readiness-check + readinessProbe: + exec: + command: + - /bin/bash + - -c + - curl -kfs https://kube-apiserver:6443/livez > /dev/null + failureThreshold: 3 + periodSeconds: 10 + timeoutSeconds: 5 + resources: + requests: + cpu: 10m + memory: 10Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /tmp + name: tmp-dir + - args: + - run + command: + - /usr/bin/control-plane-operator + - konnectivity-socks5-proxy + env: + - name: KUBECONFIG + value: /etc/kubernetes/secrets/kubeconfig/kubeconfig + image: controlplane-operator + name: konnectivity-proxy-socks5 + resources: + requests: + cpu: 10m + memory: 30Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes/secrets/kubeconfig + name: kubeconfig + - mountPath: /etc/konnectivity/proxy-client + name: konnectivity-proxy-cert + - mountPath: /etc/konnectivity/proxy-ca + name: konnectivity-proxy-ca + - mountPath: /tmp + name: tmp-dir + initContainers: + - command: + - /usr/bin/control-plane-operator + - availability-prober + - --target + - https://kube-apiserver:6443/readyz + - --kubeconfig=/var/kubeconfig/kubeconfig + - --required-api=operators.coreos.com,v1alpha1,CatalogSource + image: availability-prober + imagePullPolicy: IfNotPresent + name: availability-prober + resources: {} + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/kubeconfig + name: kubeconfig + priorityClassName: hypershift-api-critical + restartPolicy: Always + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: tmpfs + - name: apiservice-cert + secret: + defaultMode: 416 + items: + - key: tls.crt + path: apiserver.crt + - key: tls.key + path: apiserver.key + secretName: packageserver-cert + - name: webhook-cert + secret: + defaultMode: 416 + secretName: packageserver-cert + - name: kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - name: konnectivity-proxy-cert + secret: + defaultMode: 416 + secretName: konnectivity-client + - configMap: + name: konnectivity-ca-bundle + name: konnectivity-proxy-ca + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/packageserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_packageserver_pdb_poddisruptionbudget.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/packageserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_packageserver_pdb_poddisruptionbudget.yaml new file mode 100644 index 000000000000..2d23bce1d479 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/packageserver/EtcdRestore/zz_fixture_TestControlPlaneComponents_packageserver_pdb_poddisruptionbudget.yaml @@ -0,0 +1,23 @@ +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: packageserver-pdb + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + selector: + matchLabels: + app: packageserver + unhealthyPodEvictionPolicy: AlwaysAllow +status: + currentHealthy: 0 + desiredHealthy: 0 + disruptionsAllowed: 0 + expectedPods: 0 diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/powervs-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_ccm_config_configmap.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/powervs-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_ccm_config_configmap.yaml new file mode 100644 index 000000000000..c4147681cae0 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/powervs-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_ccm_config_configmap.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +data: + ccm-config: "[global]\nversion = 1.1.0\n[kubernetes]\nconfig-file = /etc/kubernetes/kubeconfig\n[provider]\ncluster-default-provider + = g2\ng2Credentials = /etc/vpc/ibmcloud_api_key\ng2workerServiceAccountID = \ng2ResourceGroupName + = \ng2VpcSubnetNames = \ng2VpcName = \naccountID = \nclusterID = hcp\nregion = + \npowerVSCloudInstanceID = \npowerVSRegion = \npowerVSZone = \n" +kind: ConfigMap +metadata: + name: ccm-config + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/powervs-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_powervs_cloud_controller_manager_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/powervs-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_powervs_cloud_controller_manager_controlplanecomponent.yaml new file mode 100644 index 000000000000..4cbc2ea85608 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/powervs-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_powervs_cloud_controller_manager_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: powervs-cloud-controller-manager + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: powervs-cloud-controller-manager Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment powervs-cloud-controller-manager rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: ccm-config diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/powervs-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_powervs_cloud_controller_manager_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/powervs-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_powervs_cloud_controller_manager_deployment.yaml new file mode 100644 index 000000000000..c71b53fdc08c --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/powervs-cloud-controller-manager/EtcdRestore/zz_fixture_TestControlPlaneComponents_powervs_cloud_controller_manager_deployment.yaml @@ -0,0 +1,141 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: powervs-cloud-controller-manager + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + k8s-app: cloud-controller-manager + strategy: {} + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: tmp-dir + component.hypershift.openshift.io/config-hash: 774b434c + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + hypershift.openshift.io/control-plane-component: powervs-cloud-controller-manager + hypershift.openshift.io/hosted-control-plane: hcp-namespace + k8s-app: cloud-controller-manager + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - command: + - /bin/ibm-cloud-controller-manager + - --authentication-skip-lookup + - --bind-address=$(POD_IP_ADDRESS) + - --use-service-account-credentials=true + - --configure-cloud-routes=false + - --cloud-provider=ibm + - --cloud-config=/etc/ibm/ccm-config + - --profiling=false + - --leader-elect=true + - --leader-elect-lease-duration=137s + - --leader-elect-renew-deadline=107s + - --leader-elect-retry-period=26s + - --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_AES_128_GCM_SHA256,TLS_CHACHA20_POLY1305_SHA256,TLS_AES_256_GCM_SHA384 + - --kubeconfig=/etc/kubernetes/kubeconfig + - --use-service-account-credentials=false + env: + - name: POD_IP_ADDRESS + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: VPCCTL_CLOUD_CONFIG + value: /etc/ibm/ccm-config + - name: ENABLE_VPC_PUBLIC_ENDPOINT + value: "true" + image: powervs-cloud-controller-manager + imagePullPolicy: IfNotPresent + livenessProbe: + httpGet: + path: /healthz + port: 10258 + scheme: HTTPS + initialDelaySeconds: 300 + timeoutSeconds: 5 + name: cloud-controller-manager + ports: + - containerPort: 10258 + name: https + protocol: TCP + resources: + requests: + cpu: 75m + memory: 60Mi + securityContext: + readOnlyRootFilesystem: true + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /etc/kubernetes + name: service-network-admin-kubeconfig + - mountPath: /etc/ibm + name: ccm-config + - mountPath: /etc/vpc + name: cloud-creds + - mountPath: /tmp + name: tmp-dir + priorityClassName: hypershift-control-plane + terminationGracePeriodSeconds: 90 + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - name: service-network-admin-kubeconfig + secret: + defaultMode: 416 + secretName: service-network-admin-kubeconfig + - configMap: + defaultMode: 420 + name: ccm-config + name: ccm-config + - name: cloud-creds + secret: + defaultMode: 416 + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-marketplace-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_marketplace_catalog_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-marketplace-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_marketplace_catalog_controlplanecomponent.yaml new file mode 100644 index 000000000000..ed427907d92a --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-marketplace-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_marketplace_catalog_controlplanecomponent.yaml @@ -0,0 +1,24 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: redhat-marketplace-catalog + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: redhat-marketplace-catalog Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment redhat-marketplace-catalog rollout to finish: + 0 out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: Service + name: redhat-marketplace diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-marketplace-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_marketplace_catalog_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-marketplace-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_marketplace_catalog_deployment.yaml new file mode 100644 index 000000000000..f92cb5fc4f7e --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-marketplace-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_marketplace_catalog_deployment.yaml @@ -0,0 +1,170 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + image.openshift.io/triggers: '[{"from":{"kind":"ImageStreamTag","name":"catalogs:redhat-marketplace"},"fieldPath":"spec.template.spec.initContainers[?(@.name==\"extract-content\")].image"}, + {"from":{"kind":"ImageStreamTag","name":"catalogs:redhat-marketplace"},"fieldPath":"spec.template.spec.containers[?(@.name==\"registry\")].image"}]' + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: redhat-marketplace-catalog + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + olm.catalogSource: redhat-marketplace + strategy: {} + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: utilities,catalog-content,tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: redhat-marketplace-catalog + hypershift.openshift.io/control-plane-component: redhat-marketplace-catalog + hypershift.openshift.io/hosted-control-plane: hcp-namespace + olm.catalogSource: redhat-marketplace + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - serve + - /extracted-catalog/catalog + - --cache-dir=/extracted-catalog/cache + command: + - /bin/opm + image: catalogs:redhat-marketplace + imagePullPolicy: IfNotPresent + livenessProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 3 + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: registry + ports: + - containerPort: 50051 + name: grpc + protocol: TCP + readinessProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 3 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 10m + memory: 340Mi + securityContext: + readOnlyRootFilesystem: true + startupProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 15 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /extracted-catalog + name: catalog-content + - mountPath: /tmp + name: tmp-dir + initContainers: + - args: + - /bin/copy-content + - /utilities/copy-content + command: + - cp + image: operator-lifecycle-manager + name: extract-utilities + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /utilities + name: utilities + - args: + - --catalog.from=/configs + - --catalog.to=/extracted-catalog/catalog + - --cache.from=/tmp/cache + - --cache.to=/extracted-catalog/cache + command: + - /utilities/copy-content + image: from:imagestream + name: extract-content + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /utilities + name: utilities + - mountPath: /extracted-catalog + name: catalog-content + nodeSelector: + kubernetes.io/os: linux + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: utilities + - emptyDir: {} + name: catalog-content + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-marketplace-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_marketplace_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-marketplace-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_marketplace_service.yaml new file mode 100644 index 000000000000..961b426948d8 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-marketplace-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_marketplace_service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: redhat-marketplace + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: grpc + port: 50051 + protocol: TCP + targetPort: 50051 + selector: + olm.catalogSource: redhat-marketplace + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalogs_imagestream.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalogs_imagestream.yaml new file mode 100644 index 000000000000..4f3e1f325e1d --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_catalogs_imagestream.yaml @@ -0,0 +1,63 @@ +apiVersion: image.openshift.io/v1 +kind: ImageStream +metadata: + name: catalogs + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + lookupPolicy: + local: true + tags: + - annotations: null + from: + kind: DockerImage + name: registry.redhat.io/redhat/certified-operator-index:v4.16 + generation: null + importPolicy: + importMode: PreserveOriginal + scheduled: true + name: certified-operators + referencePolicy: + type: Local + - annotations: null + from: + kind: DockerImage + name: registry.redhat.io/redhat/community-operator-index:v4.16 + generation: null + importPolicy: + importMode: PreserveOriginal + scheduled: true + name: community-operators + referencePolicy: + type: Local + - annotations: null + from: + kind: DockerImage + name: registry.redhat.io/redhat/redhat-marketplace-index:v4.16 + generation: null + importPolicy: + importMode: PreserveOriginal + scheduled: true + name: redhat-marketplace + referencePolicy: + type: Local + - annotations: null + from: + kind: DockerImage + name: registry.redhat.io/redhat/redhat-operator-index:v4.16 + generation: null + importPolicy: + importMode: PreserveOriginal + scheduled: true + name: redhat-operators + referencePolicy: + type: Local +status: + dockerImageRepository: "" diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_operators_catalog_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_operators_catalog_controlplanecomponent.yaml new file mode 100644 index 000000000000..9a3461e673c6 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_operators_catalog_controlplanecomponent.yaml @@ -0,0 +1,27 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: redhat-operators-catalog + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: redhat-operators-catalog Deployment Available condition not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for deployment redhat-operators-catalog rollout to finish: 0 + out of 1 new replicas have been updated' + reason: WaitingForRolloutComplete + status: "False" + type: RolloutComplete + resources: + - group: image.openshift.io + kind: ImageStream + name: catalogs + - group: "" + kind: Service + name: redhat-operators diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_operators_catalog_deployment.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_operators_catalog_deployment.yaml new file mode 100644 index 000000000000..1ebf8b2d89a3 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_operators_catalog_deployment.yaml @@ -0,0 +1,171 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + image.openshift.io/triggers: '[{"from":{"kind":"ImageStreamTag","name":"catalogs:redhat-operators"},"fieldPath":"spec.template.spec.initContainers[?(@.name==\"extract-content\")].image"}, + {"from":{"kind":"ImageStreamTag","name":"catalogs:redhat-operators"},"fieldPath":"spec.template.spec.containers[?(@.name==\"registry\")].image"}]' + labels: + hypershift.openshift.io/managed-by: control-plane-operator + name: redhat-operators-catalog + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + olm.catalogSource: redhat-operators + strategy: {} + template: + metadata: + annotations: + alpha.image.policy.openshift.io/resolve-names: '*' + cluster-autoscaler.kubernetes.io/safe-to-evict-local-volumes: utilities,catalog-content,tmp-dir + component.hypershift.openshift.io/config-hash: "" + hypershift.openshift.io/release-image: quay.io/openshift-release-dev/ocp-release:4.16.10-x86_64 + labels: + app: redhat-operators-catalog + hypershift.openshift.io/control-plane-component: redhat-operators-catalog + hypershift.openshift.io/hosted-control-plane: hcp-namespace + olm.catalogSource: redhat-operators + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hypershift.openshift.io/control-plane + operator: In + values: + - "true" + weight: 50 + - preference: + matchExpressions: + - key: hypershift.openshift.io/cluster + operator: In + values: + - hcp-namespace + weight: 100 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + hypershift.openshift.io/hosted-control-plane: hcp-namespace + topologyKey: kubernetes.io/hostname + weight: 100 + automountServiceAccountToken: false + containers: + - args: + - serve + - /extracted-catalog/catalog + - --cache-dir=/extracted-catalog/cache + command: + - /bin/opm + image: catalogs:redhat-operators + imagePullPolicy: IfNotPresent + livenessProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 3 + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: registry + ports: + - containerPort: 50051 + name: grpc + protocol: TCP + readinessProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 3 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + requests: + cpu: 10m + memory: 420Mi + securityContext: + readOnlyRootFilesystem: true + startupProbe: + exec: + command: + - grpc_health_probe + - -addr=:50051 + failureThreshold: 15 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /extracted-catalog + name: catalog-content + - mountPath: /tmp + name: tmp-dir + initContainers: + - args: + - /bin/copy-content + - /utilities/copy-content + command: + - cp + image: operator-lifecycle-manager + name: extract-utilities + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /utilities + name: utilities + - args: + - --catalog.from=/configs + - --catalog.to=/extracted-catalog/catalog + - --cache.from=/tmp/cache + - --cache.to=/extracted-catalog/cache + command: + - /utilities/copy-content + image: from:imagestream + name: extract-content + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /utilities + name: utilities + - mountPath: /extracted-catalog + name: catalog-content + nodeSelector: + kubernetes.io/os: linux + priorityClassName: hypershift-control-plane + tolerations: + - effect: NoSchedule + key: hypershift.openshift.io/control-plane + operator: Equal + value: "true" + - effect: NoSchedule + key: hypershift.openshift.io/cluster + operator: Equal + value: hcp-namespace + volumes: + - emptyDir: {} + name: utilities + - emptyDir: {} + name: catalog-content + - emptyDir: {} + name: tmp-dir +status: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_operators_service.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_operators_service.yaml new file mode 100644 index 000000000000..14103133e042 --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/redhat-operators-catalog/EtcdRestore/zz_fixture_TestControlPlaneComponents_redhat_operators_service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: redhat-operators + namespace: hcp-namespace + ownerReferences: + - apiVersion: hypershift.openshift.io/v1beta1 + blockOwnerDeletion: true + controller: true + kind: HostedControlPlane + name: hcp + uid: "" + resourceVersion: "1" +spec: + ports: + - name: grpc + port: 50051 + protocol: TCP + targetPort: 50051 + selector: + olm.catalogSource: redhat-operators + type: ClusterIP +status: + loadBalancer: {} diff --git a/control-plane-operator/controllers/hostedcontrolplane/testdata/router/EtcdRestore/zz_fixture_TestControlPlaneComponents_router_controlplanecomponent.yaml b/control-plane-operator/controllers/hostedcontrolplane/testdata/router/EtcdRestore/zz_fixture_TestControlPlaneComponents_router_controlplanecomponent.yaml new file mode 100644 index 000000000000..6cbb1b6c8fea --- /dev/null +++ b/control-plane-operator/controllers/hostedcontrolplane/testdata/router/EtcdRestore/zz_fixture_TestControlPlaneComponents_router_controlplanecomponent.yaml @@ -0,0 +1,26 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: ControlPlaneComponent +metadata: + name: router + namespace: hcp-namespace + resourceVersion: "1" +spec: {} +status: + conditions: + - lastTransitionTime: null + message: deployments.apps "router" not found + reason: NotFound + status: "False" + type: Available + - lastTransitionTime: null + message: 'Waiting for Dependencies: ignition-server' + reason: WaitingForDependencies + status: "False" + type: RolloutComplete + resources: + - group: "" + kind: ConfigMap + name: router + - group: policy + kind: PodDisruptionBudget + name: router diff --git a/control-plane-operator/controllers/hostedcontrolplane/v2/etcd/etcd-init.sh b/control-plane-operator/controllers/hostedcontrolplane/v2/etcd/etcd-init.sh index 2005f475aa22..9ac25b1b4bf2 100644 --- a/control-plane-operator/controllers/hostedcontrolplane/v2/etcd/etcd-init.sh +++ b/control-plane-operator/controllers/hostedcontrolplane/v2/etcd/etcd-init.sh @@ -14,15 +14,32 @@ head -c 5 /tmp/snapshot | grep -q ' 0 && !snapshotRestored { - sts.Spec.Template.Spec.InitContainers = append(sts.Spec.Template.Spec.InitContainers, - buildEtcdInitContainer(managedEtcdSpec.Storage.RestoreSnapshotURL[0]), // RestoreSnapshotURL can only have 1 entry - ) + etcdInit := buildEtcdInitContainer(managedEtcdSpec.Storage.RestoreSnapshotURL[0], hcp.Namespace, initialCluster) // RestoreSnapshotURL can only have 1 entry + insertIdx := len(sts.Spec.Template.Spec.InitContainers) + for i, c := range sts.Spec.Template.Spec.InitContainers { + if c.Name == "reset-member" { + insertIdx = i + break + } + } + sts.Spec.Template.Spec.InitContainers = slices.Insert(sts.Spec.Template.Spec.InitContainers, insertIdx, etcdInit) } // adapt PersistentVolume @@ -156,15 +165,29 @@ func adaptStatefulSet(cpContext component.WorkloadContext, sts *appsv1.StatefulS //go:embed etcd-init.sh var etcdInitScript string -func buildEtcdInitContainer(restoreUrl string) corev1.Container { +func buildEtcdInitContainer(restoreUrl, namespace, initialCluster string) corev1.Container { c := corev1.Container{ Name: "etcd-init", } c.Env = []corev1.EnvVar{ + { + Name: "HOSTNAME", + ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{FieldPath: "metadata.name"}, + }, + }, { Name: "RESTORE_URL_ETCD", Value: restoreUrl, }, + { + Name: "HCP_NAMESPACE", + Value: namespace, + }, + { + Name: "ETCD_INITIAL_CLUSTER", + Value: initialCluster, + }, } c.Image = "etcd" c.ImagePullPolicy = corev1.PullIfNotPresent