From dd088e3475ebd5a00afc1871566d58c7f0c4bfb2 Mon Sep 17 00:00:00 2001 From: Adnan Abdulhussein Date: Tue, 24 Sep 2019 15:37:28 -0700 Subject: [PATCH] velero API type changes for structural schema CRDs (#1898) * velero API type changes for structural schema CRDs - make optional fields consistent with comment and omitempty struct tags - adds kubebuilder annotations for structural schema validations Signed-off-by: Adnan Abdulhussein * update generated crds Signed-off-by: Adnan Abdulhussein * update velero install to use structural schema generated crds Signed-off-by: Adnan Abdulhussein * move enum declarations closer to type declarations Signed-off-by: Adnan Abdulhussein * add labels to generated crds Signed-off-by: Adnan Abdulhussein * allow null values in some fields Signed-off-by: Adnan Abdulhussein * allow labelSelector to be null Signed-off-by: Adnan Abdulhussein * remove debug statement Signed-off-by: Adnan Abdulhussein * make update Signed-off-by: Adnan Abdulhussein * add enum validations for CRD phases Signed-off-by: Adnan Abdulhussein * changelog Signed-off-by: Adnan Abdulhussein --- changelogs/unreleased/1898-prydonius | 1 + pkg/apis/velero/v1/backup.go | 137 +++++++++++++----- pkg/apis/velero/v1/backup_storage_location.go | 44 ++++-- pkg/apis/velero/v1/delete_backup_request.go | 29 +++- pkg/apis/velero/v1/download_request.go | 34 ++++- pkg/apis/velero/v1/pod_volume_backup.go | 45 ++++-- .../v1/pod_volume_operation_progress.go | 7 +- pkg/apis/velero/v1/pod_volume_restore.go | 36 +++-- pkg/apis/velero/v1/restic_repository.go | 29 +++- pkg/apis/velero/v1/restore.go | 59 ++++++-- pkg/apis/velero/v1/schedule.go | 27 +++- pkg/apis/velero/v1/server_status_request.go | 25 +++- .../velero/v1/volume_snapshot_location.go | 25 +++- pkg/generated/crds/crds.go | 22 +-- .../crds/manifests/velero.io_backups.yaml | 70 +++++---- .../velero.io_backupstoragelocations.yaml | 17 ++- .../velero.io_deletebackuprequests.yaml | 11 +- .../manifests/velero.io_downloadrequests.yaml | 18 ++- .../manifests/velero.io_podvolumebackups.yaml | 22 +-- .../velero.io_podvolumerestores.yaml | 27 +++- .../velero.io_resticrepositories.yaml | 12 +- .../crds/manifests/velero.io_restores.yaml | 29 ++-- .../crds/manifests/velero.io_schedules.yaml | 56 ++++--- .../velero.io_serverstatusrequests.yaml | 13 +- .../velero.io_volumesnapshotlocations.yaml | 8 +- pkg/install/crd.go | 59 -------- pkg/install/resources.go | 4 +- 27 files changed, 526 insertions(+), 340 deletions(-) create mode 100644 changelogs/unreleased/1898-prydonius delete mode 100644 pkg/install/crd.go diff --git a/changelogs/unreleased/1898-prydonius b/changelogs/unreleased/1898-prydonius new file mode 100644 index 000000000..2dbdcac15 --- /dev/null +++ b/changelogs/unreleased/1898-prydonius @@ -0,0 +1 @@ +adds structural schema to Velero CRDs created on Velero install, enabling validation of Velero API fields diff --git a/pkg/apis/velero/v1/backup.go b/pkg/apis/velero/v1/backup.go index a649f7b09..dfb8305b2 100644 --- a/pkg/apis/velero/v1/backup.go +++ b/pkg/apis/velero/v1/backup.go @@ -24,52 +24,72 @@ import ( type BackupSpec struct { // IncludedNamespaces is a slice of namespace names to include objects // from. If empty, all namespaces are included. - IncludedNamespaces []string `json:"includedNamespaces"` + // +optional + // +nullable + IncludedNamespaces []string `json:"includedNamespaces,omitempty"` // ExcludedNamespaces contains a list of namespaces that are not // included in the backup. - ExcludedNamespaces []string `json:"excludedNamespaces"` + // +optional + // +nullable + ExcludedNamespaces []string `json:"excludedNamespaces,omitempty"` // IncludedResources is a slice of resource names to include // in the backup. If empty, all resources are included. - IncludedResources []string `json:"includedResources"` + // +optional + // +nullable + IncludedResources []string `json:"includedResources,omitempty"` // ExcludedResources is a slice of resource names that are not // included in the backup. - ExcludedResources []string `json:"excludedResources"` + // +optional + // +nullable + ExcludedResources []string `json:"excludedResources,omitempty"` // LabelSelector is a metav1.LabelSelector to filter with // when adding individual objects to the backup. If empty // or nil, all objects are included. Optional. - LabelSelector *metav1.LabelSelector `json:"labelSelector"` + // +optional + // +nullable + LabelSelector *metav1.LabelSelector `json:"labelSelector,omitempty"` // SnapshotVolumes specifies whether to take cloud snapshots // of any PV's referenced in the set of objects included // in the Backup. + // +optional + // +nullable SnapshotVolumes *bool `json:"snapshotVolumes,omitempty"` // TTL is a time.Duration-parseable string describing how long // the Backup should be retained for. - TTL metav1.Duration `json:"ttl"` + // +optional + TTL metav1.Duration `json:"ttl,omitempty"` // IncludeClusterResources specifies whether cluster-scoped resources // should be included for consideration in the backup. - IncludeClusterResources *bool `json:"includeClusterResources"` + // +optional + // +nullable + IncludeClusterResources *bool `json:"includeClusterResources,omitempty"` // Hooks represent custom behaviors that should be executed at different phases of the backup. - Hooks BackupHooks `json:"hooks"` + // +optional + Hooks BackupHooks `json:"hooks,omitempty"` // StorageLocation is a string containing the name of a BackupStorageLocation where the backup should be stored. - StorageLocation string `json:"storageLocation"` + // +optional + StorageLocation string `json:"storageLocation,omitempty"` // VolumeSnapshotLocations is a list containing names of VolumeSnapshotLocations associated with this backup. - VolumeSnapshotLocations []string `json:"volumeSnapshotLocations"` + // +optional + VolumeSnapshotLocations []string `json:"volumeSnapshotLocations,omitempty"` } // BackupHooks contains custom behaviors that should be executed at different phases of the backup. type BackupHooks struct { // Resources are hooks that should be executed when backing up individual instances of a resource. - Resources []BackupResourceHookSpec `json:"resources"` + // +optional + // +nullable + Resources []BackupResourceHookSpec `json:"resources,omitempty"` } // BackupResourceHookSpec defines one or more BackupResourceHooks that should be executed based on @@ -77,23 +97,42 @@ type BackupHooks struct { type BackupResourceHookSpec struct { // Name is the name of this hook. Name string `json:"name"` + // IncludedNamespaces specifies the namespaces to which this hook spec applies. If empty, it applies // to all namespaces. - IncludedNamespaces []string `json:"includedNamespaces"` + // +optional + // +nullable + IncludedNamespaces []string `json:"includedNamespaces,omitempty"` + // ExcludedNamespaces specifies the namespaces to which this hook spec does not apply. - ExcludedNamespaces []string `json:"excludedNamespaces"` + // +optional + // +nullable + ExcludedNamespaces []string `json:"excludedNamespaces,omitempty"` + // IncludedResources specifies the resources to which this hook spec applies. If empty, it applies // to all resources. - IncludedResources []string `json:"includedResources"` + // +optional + // +nullable + IncludedResources []string `json:"includedResources,omitempty"` + // ExcludedResources specifies the resources to which this hook spec does not apply. - ExcludedResources []string `json:"excludedResources"` + // +optional + // +nullable + ExcludedResources []string `json:"excludedResources,omitempty"` + // LabelSelector, if specified, filters the resources to which this hook spec applies. + // +optional + // +nullable LabelSelector *metav1.LabelSelector `json:"labelSelector,omitempty"` + // PreHooks is a list of BackupResourceHooks to execute prior to storing the item in the backup. // These are executed before any "additional items" from item actions are processed. + // +optional PreHooks []BackupResourceHook `json:"pre,omitempty"` + // PostHooks is a list of BackupResourceHooks to execute after storing the item in the backup. // These are executed after all "additional items" from item actions are processed. + // +optional PostHooks []BackupResourceHook `json:"post,omitempty"` } @@ -107,23 +146,32 @@ type BackupResourceHook struct { type ExecHook struct { // Container is the container in the pod where the command should be executed. If not specified, // the pod's first container is used. - Container string `json:"container"` + // +optional + Container string `json:"container,omitempty"` + // Command is the command and arguments to execute. + // +kubebuilder:validation:MinItems=1 Command []string `json:"command"` + // OnError specifies how Velero should behave if it encounters an error executing this hook. - OnError HookErrorMode `json:"onError"` + // +optional + OnError HookErrorMode `json:"onError,omitempty"` + // Timeout defines the maximum amount of time Velero should wait for the hook to complete before // considering the execution a failure. - Timeout metav1.Duration `json:"timeout"` + // +optional + Timeout metav1.Duration `json:"timeout,omitempty"` } // HookErrorMode defines how Velero should treat an error from a hook. +// +kubebuilder:validation:Enum=Continue;Fail type HookErrorMode string const ( // HookErrorModeContinue means that an error from a hook is acceptable, and the backup can // proceed. HookErrorModeContinue HookErrorMode = "Continue" + // HookErrorModeFail means that an error from a hook is problematic, and the backup should be in // error. HookErrorModeFail HookErrorMode = "Fail" @@ -131,6 +179,7 @@ const ( // BackupPhase is a string representation of the lifecycle phase // of a Velero backup. +// +kubebuilder:validation:Enum=New;FailedValidation;InProgress;Completed;PartiallyFailed;Failed;Deleting type BackupPhase string const ( @@ -164,47 +213,61 @@ const ( // BackupStatus captures the current status of a Velero backup. type BackupStatus struct { // Version is the backup format version. - Version int `json:"version"` + // +optional + Version int `json:"version,omitempty"` // Expiration is when this Backup is eligible for garbage-collection. - Expiration metav1.Time `json:"expiration"` + // +optional + // +nullable + Expiration metav1.Time `json:"expiration,omitempty"` // Phase is the current state of the Backup. - Phase BackupPhase `json:"phase"` + // +optional + Phase BackupPhase `json:"phase,omitempty"` // ValidationErrors is a slice of all validation errors (if // applicable). - ValidationErrors []string `json:"validationErrors"` + // +optional + // +nullable + ValidationErrors []string `json:"validationErrors,omitempty"` // StartTimestamp records the time a backup was started. // Separate from CreationTimestamp, since that value changes // on restores. // The server's time is used for StartTimestamps - StartTimestamp metav1.Time `json:"startTimestamp"` + // +optional + // +nullable + StartTimestamp metav1.Time `json:"startTimestamp,omitempty"` // CompletionTimestamp records the time a backup was completed. // Completion time is recorded even on failed backups. // Completion time is recorded before uploading the backup object. // The server's time is used for CompletionTimestamps - CompletionTimestamp metav1.Time `json:"completionTimestamp"` + // +optional + // +nullable + CompletionTimestamp metav1.Time `json:"completionTimestamp,omitempty"` // VolumeSnapshotsAttempted is the total number of attempted // volume snapshots for this backup. - VolumeSnapshotsAttempted int `json:"volumeSnapshotsAttempted"` + // +optional + VolumeSnapshotsAttempted int `json:"volumeSnapshotsAttempted,omitempty"` // VolumeSnapshotsCompleted is the total number of successfully // completed volume snapshots for this backup. - VolumeSnapshotsCompleted int `json:"volumeSnapshotsCompleted"` + // +optional + VolumeSnapshotsCompleted int `json:"volumeSnapshotsCompleted,omitempty"` // Warnings is a count of all warning messages that were generated during // execution of the backup. The actual warnings are in the backup's log // file in object storage. - Warnings int `json:"warnings"` + // +optional + Warnings int `json:"warnings,omitempty"` // Errors is a count of all error messages that were generated during // execution of the backup. The actual errors are in the backup's log // file in object storage. - Errors int `json:"errors"` + // +optional + Errors int `json:"errors,omitempty"` } // +genclient @@ -213,10 +276,15 @@ type BackupStatus struct { // Backup is a Velero resource that respresents the capture of Kubernetes // cluster state at a point in time (API objects and associated volume state). type Backup struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.TypeMeta `json:",inline"` - Spec BackupSpec `json:"spec"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +optional + Spec BackupSpec `json:"spec,omitempty"` + + // +optional Status BackupStatus `json:"status,omitempty"` } @@ -225,6 +293,9 @@ type Backup struct { // BackupList is a list of Backups. type BackupList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - Items []Backup `json:"items"` + + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + Items []Backup `json:"items"` } diff --git a/pkg/apis/velero/v1/backup_storage_location.go b/pkg/apis/velero/v1/backup_storage_location.go index 24e1e2585..a11853e89 100644 --- a/pkg/apis/velero/v1/backup_storage_location.go +++ b/pkg/apis/velero/v1/backup_storage_location.go @@ -26,11 +26,16 @@ import ( // BackupStorageLocation is a location where Velero stores backup objects. type BackupStorageLocation struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.TypeMeta `json:",inline"` - Spec BackupStorageLocationSpec `json:"spec"` - Status BackupStorageLocationStatus `json:"status"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +optional + Spec BackupStorageLocationSpec `json:"spec,omitempty"` + + // +optional + Status BackupStorageLocationStatus `json:"status,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -38,14 +43,17 @@ type BackupStorageLocation struct { // BackupStorageLocationList is a list of BackupStorageLocations. type BackupStorageLocationList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - Items []BackupStorageLocation `json:"items"` + + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + Items []BackupStorageLocation `json:"items"` } // StorageType represents the type of storage that a backup location uses. // ObjectStorage must be non-nil, since it is currently the only supported StorageType. type StorageType struct { - ObjectStorage *ObjectStorageLocation `json:"objectStorage,omitempty"` + ObjectStorage *ObjectStorageLocation `json:"objectStorage"` } // ObjectStorageLocation specifies the settings necessary to connect to a provider's object storage. @@ -54,7 +62,8 @@ type ObjectStorageLocation struct { Bucket string `json:"bucket"` // Prefix is the path inside a bucket to use for Velero storage. Optional. - Prefix string `json:"prefix"` + // +optional + Prefix string `json:"prefix,omitempty"` } // BackupStorageLocationSpec defines the specification for a Velero BackupStorageLocation. @@ -63,15 +72,18 @@ type BackupStorageLocationSpec struct { Provider string `json:"provider"` // Config is for provider-specific configuration fields. - Config map[string]string `json:"config"` + // +optional + Config map[string]string `json:"config,omitempty"` StorageType `json:",inline"` // AccessMode defines the permissions for the backup storage location. + // +optional AccessMode BackupStorageLocationAccessMode `json:"accessMode,omitempty"` } // BackupStorageLocationPhase is the lifecyle phase of a Velero BackupStorageLocation. +// +kubebuilder:validation:Enum=Available;Unavailable type BackupStorageLocationPhase string const ( @@ -83,6 +95,7 @@ const ( ) // BackupStorageLocationAccessMode represents the permissions for a BackupStorageLocation. +// +kubebuilder:validation:Enum=ReadOnly;ReadWrite type BackupStorageLocationAccessMode string const ( @@ -97,13 +110,20 @@ const ( // BackupStorageLocationStatus describes the current status of a Velero BackupStorageLocation. type BackupStorageLocationStatus struct { - Phase BackupStorageLocationPhase `json:"phase,omitempty"` - LastSyncedRevision types.UID `json:"lastSyncedRevision,omitempty"` - LastSyncedTime metav1.Time `json:"lastSyncedTime,omitempty"` + // +optional + Phase BackupStorageLocationPhase `json:"phase,omitempty"` + + // +optional + LastSyncedRevision types.UID `json:"lastSyncedRevision,omitempty"` + + // +optional + // +nullable + LastSyncedTime metav1.Time `json:"lastSyncedTime,omitempty"` // AccessMode is an unused field. // // Deprecated: there is now an AccessMode field on the Spec and this field // will be removed entirely as of v2.0. + // +optional AccessMode BackupStorageLocationAccessMode `json:"accessMode,omitempty"` } diff --git a/pkg/apis/velero/v1/delete_backup_request.go b/pkg/apis/velero/v1/delete_backup_request.go index ce45d79ba..6e2eb5172 100644 --- a/pkg/apis/velero/v1/delete_backup_request.go +++ b/pkg/apis/velero/v1/delete_backup_request.go @@ -24,13 +24,16 @@ type DeleteBackupRequestSpec struct { } // DeleteBackupRequestPhase represents the lifecycle phase of a DeleteBackupRequest. +// +kubebuilder:validation:Enum=New;InProgress;Processed type DeleteBackupRequestPhase string const ( // DeleteBackupRequestPhaseNew means the DeleteBackupRequest has not been processed yet. DeleteBackupRequestPhaseNew DeleteBackupRequestPhase = "New" + // DeleteBackupRequestPhaseInProgress means the DeleteBackupRequest is being processed. DeleteBackupRequestPhaseInProgress DeleteBackupRequestPhase = "InProgress" + // DeleteBackupRequestPhaseProcessed means the DeleteBackupRequest has been processed. DeleteBackupRequestPhaseProcessed DeleteBackupRequestPhase = "Processed" ) @@ -38,9 +41,13 @@ const ( // DeleteBackupRequestStatus is the current status of a DeleteBackupRequest. type DeleteBackupRequestStatus struct { // Phase is the current state of the DeleteBackupRequest. - Phase DeleteBackupRequestPhase `json:"phase"` + // +optional + Phase DeleteBackupRequestPhase `json:"phase,omitempty"` + // Errors contains any errors that were encountered during the deletion process. - Errors []string `json:"errors"` + // +optional + // +nullable + Errors []string `json:"errors,omitempty"` } // +genclient @@ -48,10 +55,15 @@ type DeleteBackupRequestStatus struct { // DeleteBackupRequest is a request to delete one or more backups. type DeleteBackupRequest struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.TypeMeta `json:",inline"` - Spec DeleteBackupRequestSpec `json:"spec"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +optional + Spec DeleteBackupRequestSpec `json:"spec,omitempty"` + + // +optional Status DeleteBackupRequestStatus `json:"status,omitempty"` } @@ -60,6 +72,9 @@ type DeleteBackupRequest struct { // DeleteBackupRequestList is a list of DeleteBackupRequests. type DeleteBackupRequestList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - Items []DeleteBackupRequest `json:"items"` + + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + Items []DeleteBackupRequest `json:"items"` } diff --git a/pkg/apis/velero/v1/download_request.go b/pkg/apis/velero/v1/download_request.go index b9e6492f7..a8790fa96 100644 --- a/pkg/apis/velero/v1/download_request.go +++ b/pkg/apis/velero/v1/download_request.go @@ -25,6 +25,7 @@ type DownloadRequestSpec struct { } // DownloadTargetKind represents what type of file to download. +// +kubebuilder:validation:Enum=BackupLog;BackupContents;BackupVolumeSnapshot;BackupResourceList;RestoreLog;RestoreResults type DownloadTargetKind string const ( @@ -41,17 +42,20 @@ const ( type DownloadTarget struct { // Kind is the type of file to download. Kind DownloadTargetKind `json:"kind"` + // Name is the name of the kubernetes resource with which the file is associated. Name string `json:"name"` } // DownloadRequestPhase represents the lifecycle phase of a DownloadRequest. +// +kubebuilder:validation:Enum=New;Processed type DownloadRequestPhase string const ( // DownloadRequestPhaseNew means the DownloadRequest has not been processed by the // DownloadRequestController yet. DownloadRequestPhaseNew DownloadRequestPhase = "New" + // DownloadRequestPhaseProcessed means the DownloadRequest has been processed by the // DownloadRequestController. DownloadRequestPhaseProcessed DownloadRequestPhase = "Processed" @@ -60,11 +64,17 @@ const ( // DownloadRequestStatus is the current status of a DownloadRequest. type DownloadRequestStatus struct { // Phase is the current state of the DownloadRequest. - Phase DownloadRequestPhase `json:"phase"` + // +optional + Phase DownloadRequestPhase `json:"phase,omitempty"` + // DownloadURL contains the pre-signed URL for the target file. - DownloadURL string `json:"downloadURL"` + // +optional + DownloadURL string `json:"downloadURL,omitempty"` + // Expiration is when this DownloadRequest expires and can be deleted by the system. - Expiration metav1.Time `json:"expiration"` + // +optional + // +nullable + Expiration metav1.Time `json:"expiration,omitempty"` } // +genclient @@ -73,10 +83,15 @@ type DownloadRequestStatus struct { // DownloadRequest is a request to download an artifact from backup object storage, such as a backup // log file. type DownloadRequest struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.TypeMeta `json:",inline"` - Spec DownloadRequestSpec `json:"spec"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +optional + Spec DownloadRequestSpec `json:"spec,omitempty"` + + // +optional Status DownloadRequestStatus `json:"status,omitempty"` } @@ -85,6 +100,9 @@ type DownloadRequest struct { // DownloadRequestList is a list of DownloadRequests. type DownloadRequestList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - Items []DownloadRequest `json:"items"` + + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + Items []DownloadRequest `json:"items"` } diff --git a/pkg/apis/velero/v1/pod_volume_backup.go b/pkg/apis/velero/v1/pod_volume_backup.go index 40cbd761d..1daeac9a4 100644 --- a/pkg/apis/velero/v1/pod_volume_backup.go +++ b/pkg/apis/velero/v1/pod_volume_backup.go @@ -42,10 +42,12 @@ type PodVolumeBackupSpec struct { // Tags are a map of key-value pairs that should be applied to the // volume backup as tags. - Tags map[string]string `json:"tags"` + // +optional + Tags map[string]string `json:"tags,omitempty"` } // PodVolumeBackupPhase represents the lifecycle phase of a PodVolumeBackup. +// +kubebuilder:validation:Enum=New;InProgress;Completed;Failed type PodVolumeBackupPhase string const ( @@ -58,43 +60,57 @@ const ( // PodVolumeBackupStatus is the current status of a PodVolumeBackup. type PodVolumeBackupStatus struct { // Phase is the current state of the PodVolumeBackup. - Phase PodVolumeBackupPhase `json:"phase"` + // +optional + Phase PodVolumeBackupPhase `json:"phase,omitempty"` // Path is the full path within the controller pod being backed up. - Path string `json:"path"` + // +optional + Path string `json:"path,omitempty"` // SnapshotID is the identifier for the snapshot of the pod volume. - SnapshotID string `json:"snapshotID"` + // +optional + SnapshotID string `json:"snapshotID,omitempty"` // Message is a message about the pod volume backup's status. - Message string `json:"message"` + // +optional + Message string `json:"message,omitempty"` // StartTimestamp records the time a backup was started. // Separate from CreationTimestamp, since that value changes // on restores. // The server's time is used for StartTimestamps - StartTimestamp metav1.Time `json:"startTimestamp"` + // +optional + // +nullable + StartTimestamp metav1.Time `json:"startTimestamp,omitempty"` // CompletionTimestamp records the time a backup was completed. // Completion time is recorded even on failed backups. // Completion time is recorded before uploading the backup object. // The server's time is used for CompletionTimestamps - CompletionTimestamp metav1.Time `json:"completionTimestamp"` + // +optional + // +nullable + CompletionTimestamp metav1.Time `json:"completionTimestamp,omitempty"` // Progress holds the total number of bytes of the volume and the current // number of backed up bytes. This can be used to display progress information // about the backup operation. - Progress PodVolumeOperationProgress `json:"progress"` + // +optional + Progress PodVolumeOperationProgress `json:"progress,omitempty"` } // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type PodVolumeBackup struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.TypeMeta `json:",inline"` - Spec PodVolumeBackupSpec `json:"spec"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +optional + Spec PodVolumeBackupSpec `json:"spec,omitempty"` + + // +optional Status PodVolumeBackupStatus `json:"status,omitempty"` } @@ -103,6 +119,9 @@ type PodVolumeBackup struct { // PodVolumeBackupList is a list of PodVolumeBackups. type PodVolumeBackupList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - Items []PodVolumeBackup `json:"items"` + + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + Items []PodVolumeBackup `json:"items"` } diff --git a/pkg/apis/velero/v1/pod_volume_operation_progress.go b/pkg/apis/velero/v1/pod_volume_operation_progress.go index 4cde13dc3..b4e314276 100644 --- a/pkg/apis/velero/v1/pod_volume_operation_progress.go +++ b/pkg/apis/velero/v1/pod_volume_operation_progress.go @@ -19,6 +19,9 @@ package v1 // PodVolumeOperationProgress represents the progress of a // PodVolumeBackup/Restore (restic) operation type PodVolumeOperationProgress struct { - TotalBytes int64 `json:"totalBytes"` - BytesDone int64 `json:"bytesDone"` + // +optional + TotalBytes int64 `json:"totalBytes,omitempty"` + + // +optional + BytesDone int64 `json:"bytesDone,omitempty"` } diff --git a/pkg/apis/velero/v1/pod_volume_restore.go b/pkg/apis/velero/v1/pod_volume_restore.go index bee99e84d..42cfd10ad 100644 --- a/pkg/apis/velero/v1/pod_volume_restore.go +++ b/pkg/apis/velero/v1/pod_volume_restore.go @@ -41,6 +41,7 @@ type PodVolumeRestoreSpec struct { } // PodVolumeRestorePhase represents the lifecycle phase of a PodVolumeRestore. +// +kubebuilder:validation:Enum=New;InProgress;Completed;Failed type PodVolumeRestorePhase string const ( @@ -53,34 +54,46 @@ const ( // PodVolumeRestoreStatus is the current status of a PodVolumeRestore. type PodVolumeRestoreStatus struct { // Phase is the current state of the PodVolumeRestore. - Phase PodVolumeRestorePhase `json:"phase"` + // +optional + Phase PodVolumeRestorePhase `json:"phase,omitempty"` // Message is a message about the pod volume restore's status. - Message string `json:"message"` + // +optional + Message string `json:"message,omitempty"` // StartTimestamp records the time a restore was started. // The server's time is used for StartTimestamps - StartTimestamp metav1.Time `json:"startTimestamp"` + // +optional + // +nullable + StartTimestamp metav1.Time `json:"startTimestamp,omitempty"` // CompletionTimestamp records the time a restore was completed. // Completion time is recorded even on failed restores. // The server's time is used for CompletionTimestamps - CompletionTimestamp metav1.Time `json:"completionTimestamp"` + // +optional + // +nullable + CompletionTimestamp metav1.Time `json:"completionTimestamp,omitempty"` // Progress holds the total number of bytes of the snapshot and the current // number of restored bytes. This can be used to display progress information // about the restore operation. - Progress PodVolumeOperationProgress `json:"progress"` + // +optional + Progress PodVolumeOperationProgress `json:"progress,omitempty"` } // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type PodVolumeRestore struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.TypeMeta `json:",inline"` - Spec PodVolumeRestoreSpec `json:"spec"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +optional + Spec PodVolumeRestoreSpec `json:"spec,omitempty"` + + // +optional Status PodVolumeRestoreStatus `json:"status,omitempty"` } @@ -89,6 +102,9 @@ type PodVolumeRestore struct { // PodVolumeRestoreList is a list of PodVolumeRestores. type PodVolumeRestoreList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - Items []PodVolumeRestore `json:"items"` + + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + Items []PodVolumeRestore `json:"items"` } diff --git a/pkg/apis/velero/v1/restic_repository.go b/pkg/apis/velero/v1/restic_repository.go index c5be8d55b..74cda2c2c 100644 --- a/pkg/apis/velero/v1/restic_repository.go +++ b/pkg/apis/velero/v1/restic_repository.go @@ -39,6 +39,7 @@ type ResticRepositorySpec struct { } // ResticRepositoryPhase represents the lifecycle phase of a ResticRepository. +// +kubebuilder:validation:Enum=New;Ready;NotReady type ResticRepositoryPhase string const ( @@ -50,23 +51,32 @@ const ( // ResticRepositoryStatus is the current status of a ResticRepository. type ResticRepositoryStatus struct { // Phase is the current state of the ResticRepository. - Phase ResticRepositoryPhase `json:"phase"` + // +optional + Phase ResticRepositoryPhase `json:"phase,omitempty"` // Message is a message about the current status of the ResticRepository. - Message string `json:"message"` + // +optional + Message string `json:"message,omitempty"` // LastMaintenanceTime is the last time maintenance was run. - LastMaintenanceTime metav1.Time `json:"lastMaintenanceTime"` + // +optional + // +nullable + LastMaintenanceTime metav1.Time `json:"lastMaintenanceTime,omitempty"` } // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type ResticRepository struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.TypeMeta `json:",inline"` - Spec ResticRepositorySpec `json:"spec"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +optional + Spec ResticRepositorySpec `json:"spec,omitempty"` + + // +optional Status ResticRepositoryStatus `json:"status,omitempty"` } @@ -75,6 +85,9 @@ type ResticRepository struct { // ResticRepositoryList is a list of ResticRepositories. type ResticRepositoryList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - Items []ResticRepository `json:"items"` + + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + Items []ResticRepository `json:"items"` } diff --git a/pkg/apis/velero/v1/restore.go b/pkg/apis/velero/v1/restore.go index d6ae75250..db4b4d203 100644 --- a/pkg/apis/velero/v1/restore.go +++ b/pkg/apis/velero/v1/restore.go @@ -27,47 +27,64 @@ type RestoreSpec struct { // ScheduleName is the unique name of the Velero schedule to restore // from. If specified, and BackupName is empty, Velero will restore // from the most recent successful backup created from this schedule. + // +optional ScheduleName string `json:"scheduleName,omitempty"` // IncludedNamespaces is a slice of namespace names to include objects // from. If empty, all namespaces are included. - IncludedNamespaces []string `json:"includedNamespaces"` + // +optional + // +nullable + IncludedNamespaces []string `json:"includedNamespaces,omitempty"` // ExcludedNamespaces contains a list of namespaces that are not // included in the restore. - ExcludedNamespaces []string `json:"excludedNamespaces"` + // +optional + // +nullable + ExcludedNamespaces []string `json:"excludedNamespaces,omitempty"` // IncludedResources is a slice of resource names to include // in the restore. If empty, all resources in the backup are included. - IncludedResources []string `json:"includedResources"` + // +optional + // +nullable + IncludedResources []string `json:"includedResources,omitempty"` // ExcludedResources is a slice of resource names that are not // included in the restore. - ExcludedResources []string `json:"excludedResources"` + // +optional + // +nullable + ExcludedResources []string `json:"excludedResources,omitempty"` // NamespaceMapping is a map of source namespace names // to target namespace names to restore into. Any source // namespaces not included in the map will be restored into // namespaces of the same name. - NamespaceMapping map[string]string `json:"namespaceMapping"` + // +optional + NamespaceMapping map[string]string `json:"namespaceMapping,omitempty"` // LabelSelector is a metav1.LabelSelector to filter with // when restoring individual objects from the backup. If empty // or nil, all objects are included. Optional. + // +optional + // +nullable LabelSelector *metav1.LabelSelector `json:"labelSelector,omitempty"` // RestorePVs specifies whether to restore all included // PVs from snapshot (via the cloudprovider). + // +optional + // +nullable RestorePVs *bool `json:"restorePVs,omitempty"` // IncludeClusterResources specifies whether cluster-scoped resources // should be included for consideration in the restore. If null, defaults // to true. + // +optional + // +nullable IncludeClusterResources *bool `json:"includeClusterResources,omitempty"` } // RestorePhase is a string representation of the lifecycle phase // of a Velero restore +// +kubebuilder:validation:Enum=New;FailedValidation;InProgress;Completed;PartiallyFailed;Failed type RestorePhase string const ( @@ -98,22 +115,28 @@ const ( // RestoreStatus captures the current status of a Velero restore type RestoreStatus struct { // Phase is the current state of the Restore - Phase RestorePhase `json:"phase"` + // +optional + Phase RestorePhase `json:"phase,omitempty"` // ValidationErrors is a slice of all validation errors (if // applicable) - ValidationErrors []string `json:"validationErrors"` + // +optional + // +nullable + ValidationErrors []string `json:"validationErrors,omitempty"` // Warnings is a count of all warning messages that were generated during // execution of the restore. The actual warnings are stored in object storage. - Warnings int `json:"warnings"` + // +optional + Warnings int `json:"warnings,omitempty"` // Errors is a count of all error messages that were generated during // execution of the restore. The actual errors are stored in object storage. - Errors int `json:"errors"` + // +optional + Errors int `json:"errors,omitempty"` // FailureReason is an error that caused the entire restore to fail. - FailureReason string `json:"failureReason"` + // +optional + FailureReason string `json:"failureReason,omitempty"` } // +genclient @@ -122,10 +145,15 @@ type RestoreStatus struct { // Restore is a Velero resource that represents the application of // resources from a Velero backup to a target Kubernetes cluster. type Restore struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.TypeMeta `json:",inline"` - Spec RestoreSpec `json:"spec"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +optional + Spec RestoreSpec `json:"spec,omitempty"` + + // +optional Status RestoreStatus `json:"status,omitempty"` } @@ -134,6 +162,9 @@ type Restore struct { // RestoreList is a list of Restores. type RestoreList struct { metav1.TypeMeta `json:",inline"` + + // +optional metav1.ListMeta `json:"metadata"` - Items []Restore `json:"items"` + + Items []Restore `json:"items"` } diff --git a/pkg/apis/velero/v1/schedule.go b/pkg/apis/velero/v1/schedule.go index 809266ddf..d03a67a80 100644 --- a/pkg/apis/velero/v1/schedule.go +++ b/pkg/apis/velero/v1/schedule.go @@ -31,6 +31,7 @@ type ScheduleSpec struct { // SchedulePhase is a string representation of the lifecycle phase // of a Velero schedule +// +kubebuilder:validation:Enum=New;Enabled;FailedValidation type SchedulePhase string const ( @@ -50,15 +51,19 @@ const ( // ScheduleStatus captures the current state of a Velero schedule type ScheduleStatus struct { // Phase is the current phase of the Schedule - Phase SchedulePhase `json:"phase"` + // +optional + Phase SchedulePhase `json:"phase,omitempty"` // LastBackup is the last time a Backup was run for this // Schedule schedule - LastBackup metav1.Time `json:"lastBackup"` + // +optional + // +nullable + LastBackup metav1.Time `json:"lastBackup,omitempty"` // ValidationErrors is a slice of all validation errors (if // applicable) - ValidationErrors []string `json:"validationErrors"` + // +optional + ValidationErrors []string `json:"validationErrors,omitempty"` } // +genclient @@ -67,10 +72,15 @@ type ScheduleStatus struct { // Schedule is a Velero resource that represents a pre-scheduled or // periodic Backup that should be run. type Schedule struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // +optional metav1.ObjectMeta `json:"metadata"` - Spec ScheduleSpec `json:"spec"` + // +optional + Spec ScheduleSpec `json:"spec,omitempty"` + + // +optional Status ScheduleStatus `json:"status,omitempty"` } @@ -79,6 +89,9 @@ type Schedule struct { // ScheduleList is a list of Schedules. type ScheduleList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - Items []Schedule `json:"items"` + + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + Items []Schedule `json:"items"` } diff --git a/pkg/apis/velero/v1/server_status_request.go b/pkg/apis/velero/v1/server_status_request.go index af6240e47..15e29e140 100644 --- a/pkg/apis/velero/v1/server_status_request.go +++ b/pkg/apis/velero/v1/server_status_request.go @@ -26,10 +26,15 @@ import ( // ServerStatusRequest is a request to access current status information about // the Velero server. type ServerStatusRequest struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.TypeMeta `json:",inline"` - Spec ServerStatusRequestSpec `json:"spec"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +optional + Spec ServerStatusRequestSpec `json:"spec,omitempty"` + + // +optional Status ServerStatusRequestStatus `json:"status,omitempty"` } @@ -38,6 +43,7 @@ type ServerStatusRequestSpec struct { } // ServerStatusRequestPhase represents the lifecycle phase of a ServerStatusRequest. +// +kubebuilder:validation:Enum=New;Processed type ServerStatusRequestPhase string const ( @@ -56,16 +62,22 @@ type PluginInfo struct { // ServerStatusRequestStatus is the current status of a ServerStatusRequest. type ServerStatusRequestStatus struct { // Phase is the current lifecycle phase of the ServerStatusRequest. + // +optional Phase ServerStatusRequestPhase `json:"phase"` // ProcessedTimestamp is when the ServerStatusRequest was processed // by the ServerStatusRequestController. + // +optional + // +nullable ProcessedTimestamp metav1.Time `json:"processedTimestamp"` // ServerVersion is the Velero server version. + // +optional ServerVersion string `json:"serverVersion"` // Plugins list information about the plugins running on the Velero server + // +optional + // +nullable Plugins []PluginInfo `json:"plugins"` } @@ -74,6 +86,9 @@ type ServerStatusRequestStatus struct { // ServerStatusRequestList is a list of ServerStatusRequests. type ServerStatusRequestList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - Items []ServerStatusRequest `json:"items"` + + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + Items []ServerStatusRequest `json:"items"` } diff --git a/pkg/apis/velero/v1/volume_snapshot_location.go b/pkg/apis/velero/v1/volume_snapshot_location.go index 368e1bbde..2e05a73f8 100644 --- a/pkg/apis/velero/v1/volume_snapshot_location.go +++ b/pkg/apis/velero/v1/volume_snapshot_location.go @@ -23,11 +23,16 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // VolumeSnapshotLocation is a location where Velero stores volume snapshots. type VolumeSnapshotLocation struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.TypeMeta `json:",inline"` - Spec VolumeSnapshotLocationSpec `json:"spec"` - Status VolumeSnapshotLocationStatus `json:"status"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +optional + Spec VolumeSnapshotLocationSpec `json:"spec,omitempty"` + + // +optional + Status VolumeSnapshotLocationStatus `json:"status,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -35,8 +40,11 @@ type VolumeSnapshotLocation struct { // VolumeSnapshotLocationList is a list of VolumeSnapshotLocations. type VolumeSnapshotLocationList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - Items []VolumeSnapshotLocation `json:"items"` + + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + Items []VolumeSnapshotLocation `json:"items"` } // VolumeSnapshotLocationSpec defines the specification for a Velero VolumeSnapshotLocation. @@ -45,10 +53,12 @@ type VolumeSnapshotLocationSpec struct { Provider string `json:"provider"` // Config is for provider-specific configuration fields. - Config map[string]string `json:"config"` + // +optional + Config map[string]string `json:"config,omitempty"` } // VolumeSnapshotLocationPhase is the lifecyle phase of a Velero VolumeSnapshotLocation. +// +kubebuilder:validation:Enum=Available;Unavailable type VolumeSnapshotLocationPhase string const ( @@ -61,5 +71,6 @@ const ( // VolumeSnapshotLocationStatus describes the current status of a Velero VolumeSnapshotLocation. type VolumeSnapshotLocationStatus struct { + // +optional Phase VolumeSnapshotLocationPhase `json:"phase,omitempty"` } diff --git a/pkg/generated/crds/crds.go b/pkg/generated/crds/crds.go index f9e5b15d5..fd1fda168 100644 --- a/pkg/generated/crds/crds.go +++ b/pkg/generated/crds/crds.go @@ -29,17 +29,17 @@ import ( ) var rawCRDs = [][]byte{ - []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xec\xfe\xff}\xb6ǂ\xf9N\x80\x1cM\xa6y\xe9ƅU\x81\x1b`\xf0\xe8p\x06\x1dX\x03v\xcf,\xfdWj4(\xad\x01\xbbG\xc8Xi+\x8d\xa0\xb6\xf0s\xb5A-Ѣ\t\x90\x012Q\x19\x8b\x1a\x8ce\x16\x81Y`P*.-p\t\x96\x17\b?\\\xdd݂\xda\xfc\r3k\x80\xc9\x1c\x981*\xe3\xccb\x0e\a%\xaa\x02\xfd\xdc\x1f\xd7\x01f\xa9U\x89\xda\xf2\xc8Aj\xad\x1d\xaf\xfbzt} \xc2\xfd\x18\xc8i\x8fѣ\u007f\xf0}\x98\x83qL!:\xec\x9e\x1b\xd0\x18\xc8t\fl\x81\x05\x1a\xc2d@z\r\xf7\xa8\t\b\x98\xbd\xaaD\x0e\x99\x92\a\xd4ħL\xed$\xffG\rـUnI\xc1,\x86M\x8d\x8dK\x8bZ2A[V\xe1\x85cD\xc1\x8e\xa0\x91րJ\xb6\xa0\xb9!f\r\u007fR\x1a\x81˭\xba\x84\xbd\xb5\xa5\xb9\xfc\xf8q\xc7m\x94\xf1L\x15E%\xb9=~̔\xb4\x9ao*\xab\xb4\xf9\x98\xe3\x01\xc5GV\xf2\x95\xc3SZ\xa7\x17E\xfe\u007fq\x93͇\x16b\xf6H\xb2d\xac\xe6rWw;\x91\x9dd3ɮ\x97\x1e?ͣ\xdbp\x93\xba\x88\t\xdfn\xee\x1fڒ\xc5M\x97Ŏ\xb9\xcd4\xd3\xf0\x99\xf8\xc2\xe5\x16\xb5ߧ\xadV\x85\x83\x882\xf7\xa2\xe5\xa4Rp\x94]\x1e\x9bjSpK\x1b\xfb\xf7\n\rI\xafZ\xc35\x93RY\xd8 TeNB\xb7\x86[\t\u05ec@q\xcd\f\xbe5\x97\x89\xa1fE\x1c\\\xe6s\xdb\xfct\az\xe6\xd4\xdd\xd1Ҍn\x88\xd7\xe7\xfb\x12\xb3\x8e\xd8\xd3\x1c\xbe\xe5\x99\x13n\xd8*ݨ\xbb7%\xeb\x16\xc01\x95\xa3\x86/\x99\xa8r̿\x92=+Y\xd6\xff\xbd\x87\xca\xcd`8)\x8be\\\x92\xb8\x90\xe1#͒ͯ\xce\xde0\x8d=\xa0\x00\xb4e\\zhΒ\xecq\x04m\xa7X\x16\x8b\x01V\x13\fo\xffĴf\xc7Qb\xa3\xa3H\xa3\xb5\x1e\x1dtB\xf0̙\xcaZ\xf2\x1d\xb9\xbf-J\xf7J=\xcdS\xf7G\x1a\xd1('d΅\xc2\x06\xf7\xec\xc0\x95\x0e\xf4\x04\x83\xb8A\xc0\x17\xcc*\x8b\xf9\x00;f!\xe7\xdb-j\x82R\xee\x99A\xe3\r\xf0\x14\x95S\xa2HMO\xed\xcc\x00\xfffW\x98FO\xef\x14\xca\xf0\xbcG\xe9\x90\x192\xd07\xf2\x962\xe7\a\x9eWL\x00\x97\xc62\x99y:X\x8dS\x9f\x8e\x99\x1d\x1b`\xebU8\xe2L\xbc勉\x92\bJCA\x86j8Ԍ\u0087Ir7\xcc`\x0e\xcaK\x9a\xae\x04\x9a\xb0P\xee\xacD\xa3\x9d\x17\x13\x80\xeb]\xf0^L\xb0\r\n0(0\xb3J\x8f\xb1a~S}[\xb64\x13\xbc\x1b\xb19\xc1\xf4\x05C\xd867j\x12&\xc0\xf3\x9eg{\xefqH^\x1c\x14\xc8\x15\x1a\xa7\xa2\xac,\xc5q\x9c8\x98\xdfi\xdff\xb4\xb4?h\xa8\xafC6Mڨ\x05.5z\xd1eR\xbd\xa7\xbf\x03\x1eEkz\xb2(\xdd\x0e&\xbe\xa5(\x11w8\x85u\xb7[\xc0\xa2\xb4\xc7\v\xe06\xf6R\xe4\xc8\xdcic\xaa5k\xffv8|\xaa\x14\xde\xf6罡\x14\xfe\x87쭗\xfe\xefs\xd7\x19\xd4\xfb`O\x139\xfb\xa5=\xe7\x02\xf8\xb6\xe6l~\x01[.,\xea\x1e\x8b\xe7\xe8P\xf3,\x9e\x9c\xbal\xe6\xa9\x15\xccf\xfb\x9b\x17\n-ܡ}nl\x8f\xcc\xfeT\x1fs\xc5\xc0\xb2\xeb\x89f\xa1\x82;$p\x8d\x85?z<8\xd64=.l\xb8\xfa\xfa\x19\xf3ij!E&\x06$\\\xf5\xd0l/\x1bB\xc84\x02\x82\x87\xaf\x03l\u007fj\xbc\x00\x06Ox\xf4\xae\x99ΰ%jF\xcb\xd0\xe0E\x88\x1a\xdd\xd1\xd5I\xca\x13\x1e\x1d\x90p\x1a]\x98\x9b\xb6\xf5\xbe=\xe1qyP\x8fm\x84\r7\xe1tM\xfc\xa3\x0e\xc7\x00w\xd8Ie\x19\xb8\\B\xb4\tKDA\xaaR\xc7\x16\xb9}2y\xf565\xe7a\xbf\x91\x1f\x8c\xdf\x14\x92\xf6=/\x93\b$c\a\x06\x9dN\xc4\\\xc2#\x13<\xaf\x97\xf1\xf2}+/\u0af2\xb7r*\xd2붛\x17nB\n\xe7\xb3B\xf3UY\xd7\xf3\xe6L\xf4(\x9f\xccB?ͩ\x90\xf4\xf6\x95\xe8o\xe7(\x16\x85ط[\u007f<\xa9\xb7\x84\x1b\xb8\x95\x14\x80{^\xf9\xa4\x92_lΌw[Q\x19\x97\x84\x90J\xae\x9c{Z\x8f\xad\x13X\x9c(\xc8\xed]\x18\xa2U/\xe9\x97K\x82\xf8@\x06\xdf\xcf\xf6\t2\xc12\xcc!\xaf\x1c\x13]ƇY\xdc\xf1\f\nԻ\xe1av\xac\x95d\xb3S\x96O\xb2\xa5\xbe\x9d$O)>7\xb6`\x8c\xf3%4V\xa4\x9b\x8bc\xe2\xd6.\f\x1c\xcd\xf9L\x0f\\\xa2\xc39I\x17\x10,p\x93\xe5\xb9˃3q\x97l\xbd\x939?\xf4\xdb\x1e%\xef\xe3\nV\x92v\xfe\x93\\\x95\x13\xda\u007fAɸ^\xd4\xd0+\x97\x11\x17ؙ\x19\xb2&\xedE\b>7@\xbby`\xa2\x9f(\x1c!K\x91\xd5@\xe1ݰ\xda\x0e\"\x8d\vx\xde+\xe3\xbd▣ȁυP\xd4Ο\xf0x~1\xd0\xf1\xf3[y\xee\xdd\xf3@c\xa3/_\x00\xac\xa48¹\x9by\xfe\xfa\xd0%I\xea\x12\x06\xb9둴(\x95\x0eVыӴ:\x15O1\xe64\xb6\t2W*c\x13\x91\xb8S\xc6\xfa\xf4V'x\x1cI\xac̟BBB\x05\xd8\xd6_\u007f(\x1d3\xdfd\xc8z\xa9<\xda%\x83\xa3\t\xc0\x01\xc4<\x80dB\xc0y\xa3\xa3\xde>\x9e\xfbt\xb8[\x82e.,\x98\x81H\xa2Pj\x95\xa11s\xe2\xb0hy\x17\xb2Uu\xa6\x8a\xf9ӂ\xcf6\xcfe\xc6bK\r\x1b\x895'\x85\xd97/\xad\x04\x1a\xa96\xfd?/f\xa7aD-SE\xc1䢳\x18 w\xed\xe7EU\b`|Ȯw\x95S\xe3\xd4H/\b\xcd\xff\x8a\x83\x85h\xe4\xf0\xf4 \xf9:\xcel\x18Wwxm+\xd50\x03=֞\xf7\xa8\xb1\xc3\xfba\xa2\xd4\x05hR\xd9\xd6I:\x8du\x1e\x8f\x0f\x06\xb6\\\x1b\xdbF\xd2@5\xab\x87- '\x9d:\xe4\x8d֯8t\xfc\xe2絒0{\xf5\x1c/\x89\xef\xd1\xeeQ\xc7Bᕫ_\x1e*Es\xf7\xdfx\xa5\xba.\x8e,E\xd4t_\xd08[)\xe7)\xdc(%\x90\xc91\x12S\v\x1aG*B\xbaU~uUF,\xf3Sq\x89\x01\x81\xb1\x04\x9aB\xd9v\x95\x02\x13\xa2]X\xc2tC\xf7\xf7\xab\x00\\\xac\xe0X\xa8ۘ\xafu\x9cfB\xef\x84\xd0\xe5\x82\xee\x14\xed}\u007f&\xcc\x16ZL\x97W\x84\x1b\f\xb4\xec\xf0i\xdd\xfdŪPl\x01\xcf\xdc\xee\a8\xbaJC:\xdc\xc8]\xbb\xa20JF\xa8\x1e\xef3\a\x94\x06\xc9\xc5\xc5h\x05K]X\xdf\xe6\x18\xfcR\xfa\xe3\xd3)ŕ)e\x19\xaf.\xc6\xe8\x96[\x8cZ\xc0\xd3\xee1RK+\xd3\xcb-\xba\xe5\x14\x13>*\xa1\xc8\xe2\xe4\"\x8a\xe5\xc3\xd7l\xc1\xc4+\xca$b\tĜ\xbf\x9e)\x8eH\b\x96\x96\v!^U\xfe\xe0\xee\xe9f\xb0>\xa9\xe8\xa1U\xd00\x032\xad\xd4!\x81%Ke\r'\x173\xf4\v\bf\x88X*a\x98.O\x98\x01:Z\xb8\x90R\x940\x03\xb3.Wx\xc3R\x84\x85\x02\x84_\xa7\xaco)t\x9d*'X(\"xuظX&\x90^\x1c\xb0\xc0\x9fW\x16\x02\xd4W\xfd\xa3k\x9ez\xfd\u07fd\xe0\x1f\x05\x99x\xe9?q\xad?\n2\xe1\xaa\u007f\xe12\u007f\x14\xec\xacc\x9c\x91\x88ɟ\x8cd\xa5\xd9+\xfb\xe8\x9e\xe3\xcdǂ\xf7ݱ#\x81>\x851\xec\t!\x13\xaa\xcak\xd8CR\xdc#\xbb#\xdc=:#\uf788d\xcd\x1b\x98`\xcac|\xd3\u007f\"\xf3Ӊ\x81\xbf\xb1J\xb3\x1d~QY\xeb\xb9\xe4\x14\x89ݱ\x9d\xc7na\xdfb\xba!V1\xb0\xf8\f\xab;u,\x02\f98\x1f\xe5\xb5\x0e;\x84\xe1pK'\x95\xcbZ1K\xc4\xc3\xc3\x17\x8f\xb8\xe5\x05\xae?W\xfeܴ*\x996\xc86\x02#A~҆\xfeܫ\xe7\x01\xc2B\x05J\u007f\xea\xe3\xab\xd1%-\xdc\xe1,\x19k\xff\xe03\xcaPdӼ\xc4=\x8e\xcfi\x85\x9b\xadM\xf1'\x10\xb5\x9d\x9a5 \xb0\xf5\x1a\x95bv_\x8f\xf2}\x1f`\x8d\xf9\x82\x85\xe4\xc5|\xcab\xe5_8uz&\x0e\xf3cc\xa6\x96\x9cKj\xac\xba\xa7\xa7\xce/fR\tV$\xb6\x9d\xff'\x04\xe2\xac\xcf\xc3\xfe\x8bH\xcble\x96\xdeD\xbaA\xf1\xfdrȞW\xda=E\xf3\x00\xbc\xea\x9e\xfc,2$*;\xaf\xc5\xe7$\xf8z8\u07bd\x1eֹG\xca%HY4\t\xcf\xccԩ\xd0\x11\x13\xdf\x00\xf3\xf3\\tD\xb00\a<\xa0\x04%]\xe6\xd3=\xf5\xf2o\xd6\xfbs\x86\xc7\xf2\x16\x8c\x90X\xadJ\xa1X\x1e\xed\\@-\xbe\x88~p\x06Z\x1fP\u007f0\x93\x10+\x1327#\xe4\xf7\xf5p\xabt\xc1\xec%\xe4\xcc\xe2j\x04ऎ\xb9\\\xfb\xc2KM7ě\v\x97\xa6w\xbb.D\xc8\xd3\x17h\f\xdb\xc5'\x9a\xcfd\x9fw(ɱ\x8fd\xa9B\xf8\xd9d\x99\xbbo\x19\xfd)\x96e\x96\x8e\xf5\x1e\xb5p2o\x8d\xfa04BB\xed`˅\x1b\x18\x1eF\a%\x1a\xb7\xac\\Z\xdc\xf5\xf2\xc5\xf8Rr\xbd\xec\xdcn\xeaa\xc4\x11\x97\x91p&\xaf\xf9,\x00\n\xbe\xe3\xe4!h\xefvLo\xd8\x0eW\x99\x12\xa4\xe9\\\xc9>F\xaf\xde:\xf7\x1at\x16\xd7;\x1aQ\xdf{\xb54\x17#\xdf\xe7\u0080\x91%\x8deڦ\xe9\xec}g肺:\xb8\x98\xaf\xe1\x1eKF\x923\xd8aw\x81}\xdd\xff\xc6\xc4\x05Ÿ\xf1\xbb\v\xfe\x1d}\xb6gr\xe7\x1e}\x82F\x17\x13\xf8\xe7)\x03\x88\x1d\xfd\xeb\xe8[\x17\xf57S\xb5\xe6c\x137\xcbJ\xf7\xd8\x1b\xdc\xcb\x18\x92\xfa5\xf0\xa2\xaa\xfc\xc0\xb7C\xff\\\x96\x82g\x14\xb1\xfc\xf8\xfd2\x81\x87\xe1\xb7%\x86\x14\x85oK\x04q\f\xbb\xef\xb9\x19\x01\xa4kk\xd7\xef\x99+k\xe9\xdc;<\x1f\xceDBͤ\x88\x93U\x96\t\x90U\xb1A\xed\xb8\x1c\a\fx\x14?\xbc\x11A\x85\xbb\xb8\xc9\xd0'\x99\x90\xeb\xe8\xb8N!\xa4\x9e4E\x88\xa9\xb2\f\x8d\xd9VB\f\x0f\xb2\xb5\xaf|C\xaa\x9e\x99\xa6pr^\xc6\xff\x1c\x06\x8d\xb8\x960\xffm\x9dK˷D\xfc~%\xef2\x1e\xb1\x8e\x84Aݐ\xd5iu/\x8a\x8dާ\xd3\xed\\A/\x86l۰n\xc8\xd83-\xdd\x1f\xbd\"\xceĘ\x8d\xda\xcc\r\xaaE\xb23(\xb2}><\xedskU\u007f\xe9\xa3\xee\xa0S\xf3\xd9(\x80h\x8a\xe0\xf0\xa9\xf9\xcf\xc9\xe1*|\x89\xc8\xfd\x10\xec\u007f~\tVW\x9euaOCO\x13!\xb3,C\"\xf7k\xff\xa3D\xee\x13B\xcdw\x87ܿ\x99\x92>\xefc.\xe1/\u007f=\x83p,}\x8cxP\xe7\xbf\x03\x00\x00\xff\xff\xcb\xf0\xe1S\x84I\x00\x00"), - []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xb4W\xcdr\xdb6\x10\xbe\xeb)v܃/\x11ݴ\x97\x8en\x89݃\xa7\xf9\xf1ĉg:m\x0f\x10\xb0\x94P\x83\x00\x82\x05\xe4\xa8O\xdfY\x00\xa4$\x8a\x92㙖7.\x96\x8bo\xbf\xfd\xe5l>\x9fτ\xd7\x0f\x18H;\xbb\x00\xe15~\x8bh\xf9\x8d\x9a\xc7_\xa8\xd1\xeej\xf3z\x89Q\xbc\x9e=j\xab\x16p\x9d(\xba\xee\x13\x92KA\xe2\r\xb6\xdaꨝ\x9du\x18\x85\x12Q,f\x002\xa0`\xe1g\xdd!E\xd1\xf9\x05\xd8d\xcc\f\xc0\x8a\x0e\x17\xb0\x14\xf21y\x8a.\x88\x15\x1a'\xb325\x1b4\x18\\\xa3\u074c \xa1\x8d;\xf6\aD-\b[q5p\x8f\x81\x8d\x00\xad]2\n\xa4\xb3\x1b\f\x11\x02J\xb7\xb2\xfa\x9f\xc12At\xf9J#\"\xd68\xf5\x8f\xb6\x11\x83\x15\x86yN\xf8\n\x84UЉ-\x04\xe4; \xd9=kY\x85\x1ax\xef\x02\x82\xb6\xad[\xc0:FO\x8b\xab\xab\x95\x8e}\x8eK\xd7u\xc9긽\x92\xceƠ\x97)\xba@W\n7h\xae\x84\xd7\xf3\x8cӖ4\xed\xd4\x0f\xa1\xe6?]\xee\x01\x8b[N\x00\x8aA\xdb\xd5 \xce9z\x92f\xce\xce\x12\xe3\xf2Y\x81\xbbc\x93EL§_\xef?C\u007fif\xfc\x90\xe2L\xee\xee3\xda\xf1̼h\xdbb(qj\x83\xeb\xb2E\xb4\xca;mc~\x91F\xa3=\xe4\x98Ҳӑ\x03\xfb5!E\x0eG\x03\xd7\xc2Z\x17a\x89\x90\xbc\x12\x11U\x03\xb7\x16\xaeE\x87\xe6Z\x10\xfe\xd7,3\xa14g\x06\x9f\xe7y\xbf\xfd\x1c*\x16r\x06q\xdfZ&\x032Y\x84\xf7\x1e\xe5A\x15\xb0\t\xdd\xeaZ\x94\xad\v jQ\x1eP8i\xac\xd9S\x99*\xce\\\xa0R\"\xd1{\xa7\xf0P>\x02\xfbfP;@\xe71t\x9ar\v\xcf\xd8XV\x9a\x04Ԯ52\nC\x83iF'\x93L\xf3#\x9dm\xf5j\x8cN(\x95g\x810w'<;kt\xe4\xdeu\xbe\x83\xab\x83\xbd\xf0\xc1m\xb4\xc20\xefɯ\x18R\xa8Q\xd0h\x14M;0\xca\x00\x18*\xa6\xc6\xe6,\xcb\x1f\xf75\x87\xbe\\Q\xf4\t\x81\x91K\x95\xc0\"\x87D\x84\xed\xb1\u05ce\x01[.\xd3\xe8@\f\xfe\\R_\xbd58c\x17N%\t?\xcb$\x1f1\x1e\xcb\xc7Y\x9d\u0558ɜ\v\xe5-:H\x84\x99\xdb\xf3\x00\x9e\x89\x19#\xc4V\u007f{\x16\xc5]V\xebQx\x11נ-i\x85 &0M\xd4S\xff\xf48\xe1\xa3/\xd9\xf6B\xc4\xdc\xd2t@5F<\xaf0\x8e\xc4\xc5\xc1\xefM\xad>\xb2g\xb3\xea\xae*\rt\xf4\xefy\xa0\x8e\v\xf6;\xebrʱy\xad\x93١C\xe5\xb6g{e\x141\xd1\v\xbbe\xfe\xa6*.k\x81\xc8\x14\x02\xdaX\r\x82k\x0f\xfb]\xbf\xd2\xfc\xdf\x1d\xf3b\xafe\xf2Ե\x90l\"T\xa5{4\xf0\xa7\x85\x1b\x9e\xa1\x92gۂ\x91\xf38\xa3\xa3\xf4\xb2\xee\x89?\u07b3\x96\r\x80\xb3\xd9\xdb<0x))#7\x1f=icxp\x06\xec\xdc\x06ՑI\x1e{\x01\xcd\x16\x04\xd3\x03\x9b\x9f\x9a\x1f\x9b\x8b\xefm\xc7FP\xbc\xdfZ\x89\xea\x13n\xf4x\xb3;\xa2\xe1\xcb\xedMY:\xd8 ĵ\x88\xb0vF\x11$\xab\xbf&\x84ۛ\xba6\xbd\x02m\xa5I\x8aא/_no\xa8\x01x\x8bR$:\x9e!O\b\xca\xd9\xcb\b\x1f?\xbc\xfb=\x97q\xfe\xe2U!\xa1\xb0-\x8c.\x8b]\xf1![c\xdb\x05ɑI)|L\xbc\xe3\xf2\xc2gc\xa6t\x8d\xc6\xf3V\xf3\x88@)T\xf4|Q>\xcd?\a\xa0\x1c\xf0\x9a\xb2:*\xe52\xb8L\xde\\^\xce-\xff͌ym]\xe8D\\\x00oC\U000e8ef1\x13'\xcd\xfa\xb5\xa0\xf3\xc9:Y\fw\xfcY\xdf4\x8cnQn\r\x16cy\xd1>\xd57\x9f\xad\xac3`'Zø\xd3̇\xfdk\x10\xf0\x84ܽ亟M\xda\xdb\xf4\u007f\x9f\x9b\u05fb\xb7\\\xdf\xf3\xfa\xbb\x98\x0f\x00\x88WZ.ː\n͵;VɮYq7\xf0\x11Շ\xf1\xaf\xe2\xc5\xc5\xc1\xff^~\x95Ζ\xad\x85\x16\xf0\xc7_\xb3b\x15\xd5C\x8f\x83\x85\xff\x06\x00\x00\xff\xff\xb2fq\xeb)\x0f\x00\x00"), - []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xacVA\x8f\xdb6\x13\xbd\xebW\f\xf2\x1dr\xf9,c\xd1K\xa1[\xbb\xc9!h\x1b\x04\xbb\xc1^\x8a\x1ehrlMW\"ٙ\xa1S\xf7\xd7\x17$%\xdbr\xb4\xd9\x16\xa8n\x1c\x0e\x1f\x1f\xdf\x1b\x0e\xd5l6\x9b\xc6DzB\x16\n\xbe\x03\x13\t\xffT\xf4y$\xed\xf3\xf7\xd2R\xd8\x1e\xefv\xa8\xe6\xaey&\xef:\xb8O\xa2a|@\t\x89-\xbe\xc3=yR\n\xbe\x19Q\x8d3j\xba\x06\xc02\x9a\x1c\xfcL#\x8a\x9a1v\xe0\xd304\x00ތ\u0601\xc3\x01\x15w\xc6>\xa7\xc8\xf8GBQi\x8f8 \x87\x96B#\x11m\x869pH\xb1\x83\xcbD]/y\x0e\xa0\xf2yW\xa0~,P\x0f\x15\xaa\xcc\x0e$\xfa\xd3K\x19?Ӕ\x15\x87\xc4fX'T\x12\x84\xfc!\r\x86WS\x1a\x00\xb1!b\ao\xde4\x00G3\x90+\xe7\xae\x04CD\xffç\x0fO\xdf=\xda\x1eGS\x83\x00\x0e\xc52Œ\xb7F\x0eH\xc0\xc0\xb4\x05h\x98v\x86\xe0\x11\x02\xc3\x18\x18\xa1Ґv\x82\x8c\x1c\"\xb2\xd2,M\xfe\xae|=\xc7n6\u007f\x9b\xd9\xd5\x1cp\xd9I\x14\xd0\x1e\xe1Xc\xe8@\ns\b{О\x04\x18#\xa3\xa0\xd7r\xca+X\xc8)\xc6C\xd8\xfd\x8eV[xD\xce }H\x83\x03\x1b\xfc\x11Y\x81ц\x83\xa7\xbf\xceȒϗ\xb7\x1c\x8c\xce\xce\xcd\x1fyE\xf6fȺ&\xfc?\x18\xef`4'`\xcc{@\xf2Wh%EZ\xf8%\x8bC~\x1f:\xe8U\xa3t\xdb\xed\x81t\xaed\x1b\xc61y\xd2\xd3\xd6\x06\xafL\xbb\xa4\x81e\xeb\xf0\x88\xc3\xd6D\xda\x14\x9e^K\xf5\x8f\xee\u007f\U000acf10\xdfb*uʢ҈\xe8]\f\xe4%\xff؎Пs\xccæ'\xe1I\xa5Z\x8e\x1a\xae\x8d\xf7A`\x830Dg\x04]\r\x9f<\\\x9b\x1e\xbbk\xc3\xf8_\xb3\xac\x84\xf2J\x19|\x9b\xe7\xd3!t\xeeX\xc89\x98\xa71\xb3X\x90Y\xa3\xdeE\xb4Z\x1e\xe5H\xf7іl\x168lC\x02s\xecۑ\xa5\xfa$\xeeR\xe7eP&\xedP\xcem3\x14\xf7\xd9E\x13?\xb5\xe6|@\xfc\x1f\xeb]\xad]\xce#\x84\xd2\xf7?Գx/e_\x92\xe4\"\x86I\x99zt\xe5Q\xdbX\a\xcb)\x9ay\xd2\x17\x8b3}\xf9\x0ex+\xf3\x17\xd3\xe3\x94Y7\x94\x19\x83\xf08l0y\x14\xe4c'<\x91\xb4\xf0Ԓm\x17\xa2BޖAk\x8b1\aKY\xb4\xff\x0e\xb6֖\x12^P\xb6\xcaD^\x18\x15r\xb5\x14|\xa6\xc3\xe5\xc0\xabQ\x1fo\xaaX\x8c\f\xfc\xdd:\xce\xde\x13\xa9vH\t\xbd\x8c1\xf2|\x9eo\xf8\x1e!O*\xf8\xed\xf6\xf3\xabj\xbe9\xfa\xe9\xb8\x17C\xbe\xe0\x88\tWL;\xbdMtM\xf5\x9c\xd56'\xa0|\xa7\xb7ڛU\xc3o\x91\xd2\xc9%\xfd\x02\xb4\x8f\a\xb7\xd2l\xe8˔\x9c\xdf\xd79\x1cr\xbeh\xac\xf1\x17\xd86\b\x0e;\x14t\xb0y.\xd3\xe2\x99\x05\xfb9\xdemH\xbd\x91\x06tv\xae\x84^\x10\xca\xc2ybk\xf8\xa2sΎ\xf2U=\x96*|\xe8\x9fWJ\xfcJ\xeee\x91\x9e\xd4\xfe\xcc~\xe4\xfd̜\xe1\xbf.\xe9y\x9e\xd5a\xa2\x1f\f:\x81\xab\xc5\x00\xfb\xe9\x19\xbb\xbf:\xfee\xb9\xae\xc6wg^\x00`\xbd\x15]\x03\x92\x86\x82g|I\x8d\x96cW\x19k1\n\xba/\xf3\x97g~\x03\x1e\x9f\x92\xf9\xd7\x06\xef\xf2S\x98\x1b\xf8\xfd\x8f\xaaDE\xf70\xe1P\xe3?\x01\x00\x00\xff\xff\x89\xb0\xbfcr\v\x00\x00"), - []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xbcYOo\x1b\xbb\x11\xbf\xebS\f\xfc\x0e\xee\x03,\tI\x8b\xa2\xd0\xed\xc5n\v\xb7\xef%F\xe4\xe6\x12\xe40Z\x8e\xb4\xacwI\x963+E-\xfa\u074b!w%\xad\xb4\x96\xe54\xc8^\x12\xf3\xcfp\xe6\xc7\xf9\xf3\x1bj4\x1e\x8fG\x18\xec'\x8al\xbd\x9b\x01\x06K_\x85\x9c\xfeœ\xa7?\xf1\xc4\xfa\xe9\xfa͂\x04ߌ\x9e\xac33\xb8mX|\xfd\x91\xd87\xb1\xa0;ZZg\xc5z7\xaaIР\xe0l\x04PDB\x1d|\xb45\xb1`\x1df\xe0\x9a\xaa\x1a\x018\xaci\x06\xc1\x9b\xb5\xaf\x9a\x9a\x16X<5\x81'k\xaa(\xfa\x89\xf5#\x0eT\xa8\x88U\xf4M\x98\xc1~\"\xefe\x9d\x03Ⱥ\x12X\xb7\xf43(E\x02Ϧӕ\x95\xce\xc5\n_\u05cd\xb3\xb2\x9d\x16\xdeI\xb4\x8bF|䩡5US\fv\x9c\xf4t\x92ܲ6?\xc5\xd6\xfd\xf8\xfa@1\xd9\xea\xed\xb0D\xebV\xbb\xe1\xe4(\xcf¬\x8e\x02\x96\x01\xdbmY\xdd=\x9a:\xa4 |\xfc\xf3\xfc\x11\xbaC\x13\xe2}\x88\x13\xb8\xfbm\xbc\xc7Yq\xb1nI1\xdf\xd32\xfa:I$g\x82\xb7N\xd2\x1fEe\xc9\xf51\xe6fQ[ы\xfdWC,z\x1d\x13\xb8E\xe7\xbc\xc0\x82\xa0\t\x06\x85\xcc\x04\xee\x1d\xdcbM\xd5-2}o\x94\x15P\x1e+\x82/\xe3|\x18\xfd\xfd\x85\x19\x9c\xddp\x17߃\x17r\x14\xb2\xf3@\x85^\x8fb\xa4\xfb\xec\xd2\x16\xc9\xc1a\xe9#\xe0\xf1\xf2Ɂء\xc0\xd3/\a\xf3\\|\xc4\x15\xfdꋃ\x10~F\xa7wC;:\xad4%\xe5 \xa4V4p^y$\x12\xa0\xea\xb6nJ\x8a\x94vDb\xb1\x85\xfa\x8dg+>nU\xac\xee'39\xda?\b\xba~\xce\x1b:\xab\xff{ohH]\xdd\bRbv\xc1\a\x9f\x02!6Ω\xd3{w\xb1\x02\xc1\x9b\xb3緒\x11\"-)\x92\xd3\x00ʩ%\xf8\x94\x80\x04\xad\xeb\x02-g\\\x10\u007f\x02\xdf\"\x03L\x06\xfa\x17}\xee\xb2\xe1\xd9l;\xa8\xe9/\x0f\xf7]\x86\xed@ju\x96\xe3\x13\xcf\"\xa2\xdf\xd2Re\x1eP\xca\x17O\xbd\xbe_\xe6cR\x02\x12\x0f\b\xc1RA\xbd\xc4\rֱ\x10\x9a<8 \x12@\x037R\xbb\xfe&\xa7\x9b6\xab퓽b\r\x98\xab\x17\xfcm\xfe\xe1\xfd\xf4\xaf>\xeb:(\x13\x8b\x82XŠPMNn\x80\x9b\xa2\x04d5\xc1F2s\x9d\x99\xd4\xe8\xec\x92X&\xed\t\x14\xf9\xf3\xdb/C\x98\x01\xfc\xc5G\xa0\xafX\x87\x8an\xc0f\x94w\xf9\xb3s\x10\xcb\x19\x88\x9d<\xd8X)\xed\xb0ᨎ\xd4\x1a\xbcI\x86\n>\x11\xf8\xd6І\xa0\xb2OZ\xb75\x85\x1c\xa8\xf8\x1f\x8d\x86\xff^\r\xca\xfc]\x0e\xd2+]r\x95\x15\xdbU\xc4\xc3 \xda+\x98#)\xdaՊ\"\r\xa3\x99\xf2\xbe&؟\xc1G\xb5\xdd\xf9\x03\x01I\xac\xdeYNtdN\x14\xfe\xfc\xf6\xcb3\xda\xf6q\x02\xeb\f}\x85\xb7`]F%x\xf3\xf3\x04\x1e\x93Gl\x9d\xe0W=\xa7(=\x93\x03\xef\xaa\xed\xb0\xb6\x1eJ\\\x13\xb0\xaf\t6TU\xe3\xccD\flp\xab\xf6wץ\x1e\x86\x100J\x9fk\fJ}\xfcp\xf7a\x96\xb5R\x17Z\xa5L\xaaEmi\x95Q(\x95ȅR}2\xc1\xd1d\xe7\x10\x0fE\x89n \xb1B\xa2$\t\xdde#M\xa4\xc9\xf5k\xa3\xf5\x98%t\xdf\x00[8N\f?\xa6\xe6^dE\xe2\xd6/Z\xf1\xfe\xc0}\xcfZ\xf1\xd4,(:\x12J\x86\x18_\xb0\xdaPP\x10\x9e\xfa5ŵ\xa5\xcdt\xe3\xe3\x93u\xab\xb1\xfa\xdd8_\xa4~\xcbkr\xc7\xd7n\x00\\\xf8Fv-_/\xac\xaf\xb9u\x90\xcb\xfb́\xa6\xaa\uf568\x14\x98[BXUi\xc7a(\xb7\x15\xab\xa2\x98\xf4Y\x90\"\xff\xffF5@(\x91σ\xf3\xa0+\x86\xe2c\x97w\xce\x04\xc8\xf9\xb3\xa3_E\xe2\x93\xe4\xdd?\xbe]\x04\xa5\xaf\xbah\xf0\x82\x15\xb8\xa6^PT\x1d\x16[!\xee'\xc1ӎ:q\xf4\xbd\x01\a\xbb\xbb\x06=\xcbi[\x8e\x02]z\xb2R\x17\x15\x0f\xc6r\xa8\xf0\xb4\xe7\xe8LH\x95\\=T#h\xef9]T\x04\x8ai\xea5o\x00I\x9b;\xef\x06)e\x17\x0e\xd6\xc9\x1f\xff\xf0lŷNh\xd5K\xaa\xed\xac\x02\xf8N\xe5\u007fo\xd9Ce\x02r\xa9\xe8\xcc9\x99\xd9ksi\x95d\x87\x81K/\xf7wg]g\xbe[ֹ\uf781\xa4\xbc\x93\x9e\xe8\xdaE\x9d\xff\xf4\xebS\xfe\xb2O]\xec\xd7,\x18\xe5\xb2\xc4?\xef-}!\xe7'\xb9d&0\xa7\x80\x11\xe5\xd4\xcb\xd3K\xed\xed\xf1\xef\x187\xc06\xbd`)\x91\xc9\xcc&w\xa5\xac\xa5@y\x9a\x8f\xd9\xf1O%\xf6\x92x/i\xf7U\xffN\xf9z\x98f\f\x94\xd3\xde|\x9b\xb2\xfb<\x03\xa5\xec\x0fh\x1e돴\xc1\xdb\x1b\xdc\xfbV\u007f\xb8g\xedy\nrl\xc4x\xf7м\x1b\xe0@\xc5hP\xc0\xba\xfbYk\xfdf\xffW\x8a\xd3q\xfb;T\x9aho\xc6\xcc@b\x93\xcdj\xdfpۑ=\v\xc2B[\b2\xef\x8f\u007f\x89\xba\xca\x0f3\xddOK\xe9\xcf»̮y\x06\x9f\xbf\x8c\xa0}\xd9\xfd\xd4顃\xff\v\x00\x00\xff\xff\xb3\r\xf1\xf7\x82\x1b\x00\x00"), - []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xbcX\xcdn\xe3\xb0\x11\xbe\xfb)\x06\xd9C\xba@lc\xb7\x97·m\xd2\x16i\xf7'\x88\xd3\\\x16{\xa0ő\xc5F⨜\x91\x1d\xb7\xe8\xbb\x17CJ\xb6e+\x8e\xb3X\xac/\x89\xc8\xe1\xf0\x9bo~8\xe4h<\x1e\x8fL\xed\x1e1\xb0#?\x03S;|\x16\xf4\xfaœ\xa7?\xf1\xc4\xd1t\xf5a\x81b>\x8c\x9e\x9c\xb73\xb8nX\xa8\xbaG\xa6&dx\x83\xb9\xf3N\x1c\xf9Q\x85b\xac\x113\x1b\x01d\x01\x8d\x0e>\xb8\nYLU\xcf\xc07e9\x02\xf0\xa6\xc2\x19\xd4dWT6\x15\x06d\xa1\x80\xa7\x19\x14\"5Ϧӥ\x93.\xce2\xaa\xaa\xc6;\xd9L3\xf2\x12ܢ\x11\n<\xb5\xb8\xc2rjj7\x8e8\xbd\xc4ج\xec\xbb\xd0\xc6 _\xee\x01\x93\x8dz\x87%8\xbf\xdc\x0e\xc7`y\x91f\x8d\x15p\f\xa6]\x96\xe0\xee\xd8\xd4!%\xe1\xfe/\xf3\a\xe86\x8d\x8c\xf7)\x8e\xe4\xee\x96\xf1\x8eg\xe5\xc5\xf9\x1cC\xf2S\x1e\xa8\x8a\x1a\xd1ۚ\x9c\x97\xf8\x91\x95\x0e}\x9fcn\x16\x95\x13u\xec\xbf\x1bdQwL\xe0\xdaxO\x02\v\x84\xa6\xb6F\xd0N\xe0\xd6õ\xa9\xb0\xbc6\x8c\xbf\x9ae%\x94\xc7\xca\xe0\xeb<\uf5c0\xbe`\"g;\xdc\xe5\xf8\xa0C\x0e\xb3v^c\xa6\xfeQ\x92t\xa1\xcb]\x16#\x1cr\n`\x8e\xe4'{\x8a\x87RO\u007f\v\x93=5\xf5\\(\x98%~\xa6l/\x89_@\xf5\xe7\xa1\x15\x1d,-L)\r\xb1U\r\x9c$\x0fT\x02\x94\xdd\xd2u\x81\x01\xe3\n-..\xd3\xc8!vBa\xa3j\xa3)vr\xb0~\x90\xf6h(ٓ\xf0嗀\xf1\x809\x06\xf4\x1a\xc1)\xb7k\x8a\x15@\x8c\xf3]\xa4\xa7\x9a\aBG\xe8\x17\t\xed\x10\xb4\x97\xa8\x86\x17\xab\xdd \xd0Ow\xb7]\x85\xeb\x18m!\xcb\xe1\x8e'\t\xd1_\uec34wF\x8aWw\xbd\xbc\xcd\xd36\xb1\x00\b\x81\x81\xdaa\x86\xbd\xc2\tγ\xa0\xb1ip@%\x80&N\xc0V\xfe*\xa5{[Uv\xc5V\xa9\x06\x93N\x0f\xf8\xfb\xfc\xdb\xd7\xe9\xdf(a\x1d\xd4i\xb2\fY\xd5\x18\xc1\n\xbd\\\x017Y\x01\x86\xd5\x04\x17\xd0\xceufR\x19\xefrd\x99\xb4;`\xe0\xef\x1f\u007f\fq\x06\xf0W\n\x80Ϧ\xaaK\xbc\x02\x97X\xde֯.>\x1c'\"\xb6\xfa`\xed\xa4pÆ\x1b\x8d\xa3\xd6\xe0u4T\xcc\x13\x02\xb5\x866\b\xa5{\xd2sS3x\x0f\xe2\u007f5u\xfew1\xa8\xf3\x0f)E.T\xe4\"\x01۞H\xfb\x19\xb7\x03(\x85\x11\x90\xe0\x96K\f8\xccf\xac\xbbZ\xe0\xde\x03\x05\xb5\xddӞ\x82\xa8V}\x96\xea\f\xda#\xc0\xdf?\xfex\x01m\x9f'p\xde\xe23|\x04\xe7\x13+5\xd9\xf7\x13x\x88\x11\xb1\xf1b\x9eu\x9f\xac F\x0f\xe4\xcb\xcd0Z\x82¬\x10\x98*\x845\x96\xe58u\x02\x16\xd6f\xa3\xf6w\xee\xd2\b3P\x9b \xfd\xb3~P\xeb÷\x9bo\xb3\x84JCh\x19\xeb\x98\x1e*\xb9\xd3\x13]\x8f\xf2tPiLF:\x9a\x14\x1cB\x90\x15\xc6\x0f\x945\x88-Ad7o\xa4\t8\xb9|k\xb6\x1e\x9e\xd2\xddo\xe0\xb4>,\f\xbf\xe7\xcc;ˊ\xd8\xe0\xbej\xc5\u05fd\xf0=i\xc5S\xb3\xc0\xe0Q0\x1ab)c\xb5!\xc3ZxJ+\f+\x87\xeb\xe9\x9a\u0093\xf3˱\xc6\xdd89\x9e\xa7\xb1Y\x9e\xbe\x8b\u007f~\xca\n\xaeMv\xa6)Q\xf4wأ\xfb\xf0\xf4\xcd\xe6t]۹\x87\xd0\xe5\xbc\xed3\x0eWj\x06\xac\v\x97\x15]ǽ+\x96\x83)Q\x19\x9b*\xac\xf1\x9b_\x1d\xa5\xca[\x13t\xfb\xcd8\xae\xa0rl\xbc\xd5\xffٱ\xe8\xf8\x9b\x89j\xdc\x19)\xf8\xcfۛ\xdf\x13\xbb\x8d{s\x02\x0e\xb6\x9b)\x04j\xba\xb5J_\xee0\x9c\xec\x95\xee{\xa2]\x8f7Хme\xcen\xd3؛\x9a\v\x92ۛ\x93\b\xe6[\xb1n\xf7\x1d\xe5ms\xd6i҈<ѕ\xbd\x88$\xa99\x89\"u\xd5C=n\x8b!\xf5\x03qD\xfb˟B\xa2w\x1bmb\xf6\x91\x8c\x87\xfb\xf3\x9eDM\xb6\xf7\xdd\xf7oojGzo8\x19\xf1\xeaUE\x8c4|\xfee%\x8aw\x9c\xa5\xfc\x94VI<\x99\u007f꺒\x91\xb6j\xfd\x17\x95S\x9e\xbb>\x96\x8f\xb7\xfb`\x13.q\x15ƻ@D\x00k\xc3\xdd\x16\xc7~\x83=mia,|\xaa\fml\xa5\xb4\xcbˍ+\xd1\xc2\xf6=\a\x1e\xf4\xb6\x16ᅲǥ\xb1S\xd30\xdax\x8b\x1b\x00|\xb8*\xa7P\x19\x99\x81\xdeyǪ\xe0\xdcH\xaf\x90\xd9,O\x87\xfa\x97$\x93\xaeH\xed\x020\vjd{Gjc\xbe\xb5\xf0\x92[\xa7\x9e\u007fC+\f\x9f\x06q\xa7\x12C\xa1\xb3ͻS\xb1srs\x16\x13\xe4\xbcؙ\xf7D_\v\x9b\xa8x(h\xf6\xfd\u007f\xec\xef\xfe&\xbf\xc8\xd5åd wz\xf3\xad\xb7\xfb\xc5E=ѯ!=\xc0\xa7\x8b\xc6!\x8e\xf1\xf6ad;\xa0\x97\x8aѠ\x82U\xf7\x16\xbb\xfa\xb0\xfb\x8a\xe5`\xdc>\x9e\xc6\tH\xe4\xda\x19Hh\x12\xd4\xf6š\x1d\xd9\xd5-\xbd?ւ\xf6\xeb\xe1\xeb\xe9\xc5E\xef14~f\xe4m|\xcf\xe5\x19|\xff1\x82\xf6\x1d\xe2\xb1á\x83\xff\x0f\x00\x00\xff\xff@*x\xf27\x16\x00\x00"), - []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xacV\xc1n\xe36\x10\xbd\xfb+\x06\xdb\xc3^j\x1bA/\x85nm\xda\x02A\x93\xc5\"Y\xe4R\xf40\xa6F6\x1b\x89d9Coݯ/\x86\x94l\xc9V\xbc\xc1vu\xd3p\xf8\xf8\xf8\xe6\r\xc9\xc5r\xb9\\`\xb0\xcf\x14\xd9zW\x01\x06K\xff\b9\xfd\xe3\xd5ˏ\xbc\xb2~\xbd\xbfِ\xe0\xcd\xe2ź\xba\x82\xdb\xc4\xe2\xbbGb\x9f\xa2\xa1_\xa8\xb1Ί\xf5nё`\x8d\x82\xd5\x02\xc0DB\r~\xb2\x1d\xb1`\x17*p\xa9m\x17\x00\x0e;\xaa \x12\x8b5\x91\x82g+>Z\xe2՞Z\x8a~e\xfd\x82\x03\x19\x05\xd9F\x9fB\x05\xa7\x812\x9bu\f\xa0\xb0y\xcc@\x8f\x03\xd0!\x0f\xb5\x96\xe5\xf7\xd9\xe1{˒SB\x9b\"\xb6sD\xf20[\xb7M-Ƌ\x04]\x80\x8d\x0fT\xc1\xbbw\v\x80=\xb6\xb6\xce[-\xac| \xf7\xd3ǻ\xe7\x1f\x9e̎:,A\x80\x10}\xa0(v \xaf\xdfH\xf7c\f\xa0&6ц\x8c\b\xef\x15\xaa\xe4@\xadJ\x13\x83\xec\b\xf6%F5p^\x06|\x03\xb2\xb3\f\x91B$&'\x99\xd2\b\x164\x05\x1d\xf8\xcd_dd\x05O\x14\x15\x04x\xe7S[\x83\xf1nOQ \x92\xf1[g\xff=\"3\x88\xcfK\xb6(\xd4k7|\xd6\tE\x87\xad\x8a\x90\xe8{@WC\x87\a\x88\xa4k@r#\xb4\x9c\xc2+x\xf0\x91\xc0\xba\xc6W\xb0\x13\t\\\xad\xd7[+\x83ӌ\xef\xba\xe4\xac\x1c\xd6\xc6;\x89v\x93\xc4G^״\xa7v\x8d\xc1.3O'ٝ]\xfd]\xec]\xc8\xefG\xc4\xe4\xa0\xd5a\x89\xd6m\x8f\xe1\xec\x96WeV\xb3\x80e\xc0~Z\xa1{RSC*\xc2\xe3\xafO\x9f`X4+>\x958\x8b{\x9a\xc6'\x9dU\x17\xeb\x1a\x8a\xa5NM\xf4]F$W\ao\x9d\xe4\x1f\xd3ZrS\x8d9m:+Zؿ\x13\xb1h9Vp\x8b\xcey\x81\rA\n5\n\xd5+\xb8sp\x8b\x1d\xb5\xb7\xc8\xf4\xadUVAy\xa9\n~Y\xe7\xf1!0M,\xe2\x1c\xc3C\x93\xcf\x16\xe4\xbcm\x9f\x02\x19\xad\x8f\x8a\xa4\x13mcMv84>\x02^\xe4\xafF\xc0s\xad\xa7\xdf\x06\xcdK\nO\xe2#n\xe9ޛQ\x13\xbf\xc2\xea\xe7\xb9\x19\x03-=\x99J\x1b\xd2|\xe2\x192\x80\xecPF\xfd'hݱ\x89g\xf6\xf1\xaa\xe4Yv\xd4ft\xe8\f\xfd\x96\xad\xe2\xcc\xe1\xea^\x1ef&\xe8Vv\xfe3\xf8Fȍ!\a\x96\x1b\xba\xd8DL\xee\xcd$\xcbQzW\xab\xb5\x1aK\xf1*\xc1dz\xe4A\xe7&\xb5m\x8f\xb44\xbe\v(v\xd3\xd2з\x8d\x8f\x17\x14m\xc18\x94&\xfe:}\xf7\xbeM\x1d}\xd0\xdb'\xa0\xa1\xab̟\xa7\xb9c\x83\x94@OB\xb7\x00qzs\x8d\xbf\xde\x13\f\xc1\xd7=\x81\u07b4\xac\xfb|#w-\xae\x8d49\xfc\x96\xf3\xe6\x9fd\xcc9j\x92p^\xcd\xc9\xe0\x99^_<\f\x04%\xf1ۏ\x83\x9c>\bkR\x8c\xe4\xa4\a\xc9\xf7\xdcW\x1d\b-\xb2\x8c\xdaB\x9f.W\xeb|\u007f\x99?PR(\x10\r\x8c\xbb\xe83\xf2\\\xbf4>v(\x15\xe8I\xbe\xd4Ionzb\xc6\xedu\x92\x0f%\xa7\\n\xfd\x04\xc0\x8dO\xf2\x8av\xf9\x9a\xbb\xa2\xdeUFa\x87|\x9d\xcfG͘\xab\x1c\xfd\xcf\xc5\xe7}>Sөˋ\"\x93X\xde\xc4uǞ/\xb6<\xde{ǀ^S\x8bY\x80\xfd\xf0\xd8\xdeߜ\xfe\xb2\x17\x97\xfd\xeb8\x0f\x00\xb0\xbe\x1d\xea\n$\xa6\u0087K\xbf\xf6\x91SӠ1\x14\x84\xea\x0f\xe7\xaf\xe3\xfcD==v\xf3\xaf\xf1\xae\xce\x0fv\xae\xe0\x8f?\x17\x05\x95\xea灇\x06\xff\v\x00\x00\xff\xff5\xa7\x86\xde\x18\f\x00\x00"), - []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xccYOo+\xb9\r\xbf\xfbS\x10\xe9\xe1\xed\x02\xb1\x83\x87^\n\xdfҼ\x14\bv7\r\x92 =\x14=\xc83\xb4\xadF#\xcd\xea\x8f\x13\xb7\xe8w/HI\xf3\xdfc\x17\xed+V\x17\xc3\x12E\x91?R\x14\xc9Y,\x97˅\xa8\xe5\x1bZ'\x8d^\x83\xa8%~z\xd4\xf4ϭ\xde\xff\xe0V\xd2\xdc\x1c\xbenЋ\xaf\x8bw\xa9\xcb5\xdc\x05\xe7M\xf5\x8c\xce\x04[\xe07\xdcJ-\xbd4zQ\xa1\x17\xa5\xf0b\xbd\x00(,\n\x9a|\x95\x15:/\xaaz\r:(\xb5\x00Т\xc25Xt\xdeXt\xab\x03*\xb4f%\xcd\xc2\xd5X\xd0֝5\xa1^C\xbb\x10\xf78Z\x03\x882<\xc7\xed<\xa3\xa4\xf3?ug\u007f\x96\xce\xf3J\xad\x82\x15\xaa=\x8c'\x9dԻ\xa0\x84m\xa6\x17\x00\xae05\xae\xe1\xeaj\x01p\x10J\x96,{<\xd0Ԩo\x9f\x1e\xde~\xffR\xec\xb1\x12q\x12\xa0DWXY3]>\x18\xa4\x03\x01o,8qg\x80\xc0\xef\x85\a\x8b\xb5E\x87\xda;\xf0{\x04Q\xd7J\x16|\n\x98mb\t\xcd\x1e\a[k\xaa\x96\xd7F\x14\xef\xa1\x06o@\x80\x17v\x87\x1e~\n\x1b\xb4\x1a=:(Tp\x1e\xed*\xb1\xa9\xad\xa9\xd1z\x99\x11\xa3\xd11q37\xd0\xe1\v)\x19i\xa0$\xa3b\x14\xf5\x10\xe7\xb0\x04\xc7\x00\x80ق\xdfKת\xc4jt\xd8\x02\x91\b\rf\xf3w,\xfc\n^\xd0\x12\x13p{\x13T\t\x85\xd1\a\xb4\x04IavZ\xfe\xa3\xe1\xecHA:R\t\x8fɄyH\xed\xd1j\xa1\xc8<\x01\xafA\xe8\x12*q\x04\x8bt\x06\x04\xdd\xe1\xc6$n\x05\xbf\xb0I\xf4֬a\xef}\xed\xd677;\xe9\xb3S\x17\xa6\xaa\x82\x96\xfexS\x18\xed\xad\xdc\x04o\xac\xbb)\xf1\x80\xeaF\xd4r\xc9rj\xcf\x17\xa1*\u007f\xd7\xd8\xe6KG0\u007f$\xbfq\xdeJ\xbdk\xa6\xd9EO\xc2L\xae\x1a\x1d%n\x8b\xe2\xb6h\xd2\x14\x81\xf0|\xff\xf2\xdau\"\xe9\xfa\x103\xb8\x1d\xbfjq&\\\xa4ޢ\x8dvbW\"\x8e\xa8\xcb\xdaH\xed\xf9O\xa1$\xea>\xc6.l*\xe9ɰ\xbf\x06t\xe4\xa9f\x05wBk\xe3a\x83\x10\xeaRx,W\xf0\xa0\xe1NT\xa8\xee\x84\xc3\xff5\xca\x04\xa8[\x12\x82\xe7q\xeeƛ>a\x04\xa7\x99Αe\xd2 \xe9\xee\xbe\xd4X\xf4\xfc\x9e6\xc9m\xbe\xa4[c{W\x9b\xb6\xac:,\xa7.\x1d\x8dxs\x1f)\xe6\xf5\xe6\aB\xfc\xb1!#נブ\xbf\x06\xe4\xc8\x17o\x1c\x8e\x83\x81\xedD\xc1\xee \x8b\xaf\x06\xb3\x93\b\xd2\xc0\xcfB\x85\x12K:\xdcբ\x18j0\x90\xf4~DN\x17\xda\v\xa9ɥ)\x16\x93\xb8\xba]\xe5\xf0'&\xa4$\xb7\x92:r\x03\xa9Y\xc5\tdiH\x8f\xd5H\xac\x19\x9d\xf2\x92\xb0V\x1c'\xb5\xcd\xcf\xd7e\xca6\xd4\xe9\xe2*Y\xb0U\x9a\xeb\xc9\xfa\xfe\xc6TM\a\xde\xc5\xd7\xe12\x85\x1f\xa6\xf7\xe4ˀ\x0e>\xf6\xe8\xf7h\xf3\xa3\xb3䧳\x1c\xc9۾d)\xeao\xb0E\x80.Sa\xb4\x93%\xdax\xbd\x06\x98\xc0\xc3v\x8caP\xea\x9an\xa8\b\xcaǧ\u0086\x11|\x11\x8c\x8d1\n\x85\x9e\x82\xe3R?\u007f\x18\x91\x0fl߸x6\xbe\xc9G\x8cD\x8f\xe1(Fb\xd2\r\xb0\xaa\xfd\xf1\x1a\x84Rݛ\"l\x8b\xd1ww\x8b\vo\xc0Ð\xfa\xcc\r8\r\xc2\xd8\xc4]\x18Z\u007fIt)\xca\xfd\u007f0Qb\x83\xea\x05\x15\x16\xde\xd8Y<~\xeeRF,\xe8\x19:|]\xf5W\xbc\x81\xadT\x1e-|H\xbf\x1f\xc9\xf8\xb1G\x9d\xa0\xa0\xf7^\xeaR\x1ed\x19\x84\xea\xf9J\a\x88\x16/0\x16\xb4T\xd7#\x9e\x04c\xde݃\r\xfe\xcc\xc2\v5\x04\xf0ԣE\xa3\x12\xbe\xd8\xdf\u007fRv\xc1\xb5\xc0\x98b\x80\xccpC\x04'?\b\x8c0\xb8\f\x0f\xa5\x18\xd2bʼn\xcb\x04g\x80W\xf6\x95\x96\x8aU\xba}\xfc6v\x038\xed\n#!og\x04I\x9e\xddX\x90\x82y~\xda&9C\xca4\xafA\xc0;\x1ecRJyoMa-\xb3\xb0\xc8\xe9,\xdb\xf2\x1d\x8fL\x942\xd4I\xaesF\x89\xe3\x1d\x8f\xa7\x96\x06\xea\xd2y)\x9f\x88z\xd3\x04K\xc5\x19NV\x95\xab\x11<\xa5$\ro\xa6\x85\x85\xf9\xfb\x96GF\xe4B\xb1\x1b\x00;U\x13C\xfc\xc5E8ɿ\xf62\x16D3R;d\xdf\xcb\xf5\xc0\x1bUv\r\xf3\xe8Q\x0f\xfa\x1a\x1e\x8d\xa7\x9f\xfbOII\xaf\xd0\xe3\u05ec\x1d\xdf\f\xbaG\xe3\x99\xf6\xbf\x82$\nu! \x91\x98\x1dT\xc7\xf0Ezu\xeb\a\xc7\x01\x82\xac\x9a\xf5\x9bQB:\xca\xe1\x8d͚s\x99\x17\x8f\x88̫\xe08\xe5\xd7F/9\xe8d\xee3L\x1b\xa3I\x97\xa14\xb6\x87\u05c9\x83fxn\x10\xd2\xf1\xafT\xc9\xc4=\xb1\xf4T\xa2\xc0\x12\xca\xc0\x10p-%<\xeed\x01\x15\xdaݜ\x9c5ũӦ\x9b\x89$q\\`\xdb\xd3\x0fM\x1e)\xec\x94\xd3\a-\xc9\xd7O\xac̚w\xb2\xfa\xb9L*\x0e\xdf\xfc\x86Mj/\xcaR\xc6G\xe4\xe9L|:\x83\xcf\xf8͈\x87\xa6\xb7T\xd4\xe4\xd9\xff\xa4pʎ\xf2/\xa8\x85\xb4n\x05\xb7ܸQӖ\xedҧ\xfc\xa1˚\xb8J\a\x84\xf9A(\n\xf5\x1484\xa0\xe2\xc0?\xc9\xd2lG/\xda5|썋Q|+Qq\x19\u007f\xf5\x8eǫ\xeb\xde\xcd\x039\x1dJ\xaf\x1e\xf4U|$F\xf7\xa0)\xa1\x8cVG\xb8\u2d6b\xd5\xe8\x11\x9cd;\xfb0\xcex\xc4ɥ&%\xfdEԵԻ\xa1\x9d/\xf3\x85\x19?\xe8\xf9\xc0\xe3ഞ#t\x93\xcb^\xae=>.\xb6\xc5&\xb2r\x9b\x9bsڛ\x15\xdc\xea㈫\xa3\x02m\"a\xed\x17l$҇T\x8a\xa2R\xe2Y2\xd3.\xa3T\xaa;*\xdbiz\xba>\x99\x00=q|z\x9b\xcfǟ\x1b\xb2\x89\x9a\xac\xa3,%\x83\x8d\x02Ooc\xcf\xe1\xfc\xd2iQ\xbb\xbd\xf1\xf0\xc3A\x8a\xd4\x162\xa1\xac\xad9Pm\xf6\xe3\xe5Օ+\xf6X\x06\x85g;\x1d/\x1d\xc2\xf3\xbd\x8e\xccvl\xeeVզ\xaaʀ\x94\xf1\x92\xf5{*\xa9\xd6H|ɎS5k\xc30Z\xdc8nSR\xc4p\xa1(йmP\xb94\xe1\x167U\xb3\x91\\\xbaF\xda\v{/S\x8f\xc0\xb2\xd31\xeaM\x8f\xdb4\x93\xcbM\x9d\xd6[\x1d\u05fe\x93\xcbӛ\x87\xe1\xe0l\xb7\xcd\v\x1f\xdc\xd9~\x1bSA!j\x1flJ\x8f\x8b`-c\x1d\xd7\xccv\xd4r\xbb\xa0\xe3\x86\xd6\x1a{\xa6\xad\xc3$1\xd0\x14&h\xce\x12\xe9\xc6\xf0^\xa8\xd09\xb1\xcb\xfd\x9c\x0f\xb4\b;\xd4\x14\xdb'\x1a\x1d)\x03\xc1O,Bj\xe7\xf7\xeb\\\x8a\xe1\xa2\xf0T\xdbE\xd18`7\xe1\xe3\xd4kM\x04bw\u0095\xa4\xf6\xb8\xc3~\x0e\xb0\x15R\x05\x8b\xcf(\\\xbf\xcb?R\xffO]ʔTF\xcdc\xcd#\x82\xc32u\x8c\xbd\xb4x\xb2\xcfHE\xae\x90\xa3\xb2\xf2d\xe4\xaf\xf7\xc2\xcdG\x87'\xa2\xc8a\xa1\xeb\x0eM`x\x9e\x94\xe5\xe4\x91\xedל\xfb\xf3~\xf16 \x1e\xf4:\xc8CZ~ٚ?\xc8q\xaf*}\xde\xd9(\xfc\xf1\xbb\xf5,>\x84\xd5R\xef\xe65\xfaK\"\x9a\xf0\xf5\xb4\xff\xfby{\x16\xb0\xef\xef'\x9ac\xff\xa9\xbfO\xc7\xceh\x92\xdeT\xefZ\xf4V\xd8\x1b{3Cg\xe9-fu\xe6\xc3\xdfP\xaee\U000d5899\xa0gj1\xc9\xe0\x90\xbf\xc2\x1e\xbe\xb6\xff\xd8\xc0\xcb\xf4ٔ\x17\xa8\xb0\xb5\a,\xd7\xdc\x01\x8d\x13\x11\xbd4\xd3F`Q\x14X\xfb\x14\xf8\xbb\x1fP\xf9Sg\xfb\x85\x94\xff\x16F\xc7\xc4έ\xe1\xaf\u007f[@2\xda[\x96\x83&\xff\x1d\x00\x00\xff\xff\xebH\xd4\xe81\x1e\x00\x00"), - []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xecweҺ?u\xba\xbfJ\xeb\xf8S\x91\x95Fd\xad\xf5\xb8\xd7J\xf5Xf\xc24\xfd+\x00\x9b\xe8\x02\xb7pq\xb1\x028\x8aL\xa6L\x80_T\x17\xa8>\xdf\xde<\xfc\x9e\x16ȅ\xef\x04H\xd1&F\x16<\xae^\x1b\xa4\x05\x01\x0f\x8c=\x98\xc0&p\a\xe1\xc0`aТr4\xa20\xb8\xae\x96OA\x9b\x00\x13\xa0@#u*\x13\xf8I$Oe\xe1\xa7ڃ.\xb3\x14v\b\xa6T\x9b0\xb60\xba@\xe3d\xc5\x1bj-i\xd6}=L?\x10)~\f\xa4$?\xb4\xe0\x0e\bG߇)\xb3%\x17\xa0\xf7\xe0\x0e\xd26x3KZ`\x81\x86\b\x05z\xf77L\xdc\x06\xee\xd0\x10\x90\n\xdbD\xab#\x1a\xa2;яJ\xfe\xa3\x86l\xc1i^2\x13\x0e\x83\xa8\xaa&\x95C\xa3DFB(\xf1\x12\x84J!\x17'0Hk@\xa9Z\xd0x\x88\xdd\xc0\x9f\xb5A\x90j\xaf\xb7pp\xae\xb0ۏ\x1f\x1f\xa5\xab\xf47\xd1y^*\xe9N\x1f\x13\xad\x9c\x91\xbb\xd2ic?\xa6x\xc4\xec\xa3(\xe4\x9a\xf1T\x8eu>O\xff\xaf\x12\x9a\xfd\xd0B̝H;\xac3R=\xd6ݬ\x8c\xa3l&\x9d\xf4\xda\xe0\xa7yt\x1bnR\x171\xe1\x97\xeb\xbb\xfb\xb6\xa6H\xdbe13\xb7\xa5<\r\x9f\x89/R\xed\xd1x9\xed\x8d\xce\x19\"\xaa\xb4\xd0R9\xfe'\xc9$\xaa.\x8fm\xb9˥#\xc1\xfe\xbdD\xebH\x1c\x1b\xb8\x12JiG*V\x16\xa9p\x98n\xe0F\xc1\x95\xc81\xbb\x12\x16ߚ\xcb\xc4P\xbb&\x0e\xce\xf3\xb9\xedZ\xba\x03=s\xea\xeeʇ\f\n\xa4\xb2л\x02\x93\x8e\xe2\xd3,\xb9\x97\t\xab7\xec\xb5i\fض\x1d\u0378\xd5\xf1\xdaah\xb7w\xd2K\\\x19\xad\x00_H\xb0\x8d5\x92Z<\x1fP\x91\x8d\x98R\x11\x86=\x88\x10\\æ\xd7?\xc8;\xfe\x80yA\xa66\x89\xda}\x18D\xa8\x11W\xd2ڵ{G\x80\xb5C\xd2\xc1\x0f\x81\x1eƮ0\xfa(\xd3`\xed=\xeeMq\x90\x1a\xbe$Y\x99b\xfa\x8d\\~!\x92\xa11=įϦ\x90\xe7qB*\xe21\xed\x0eD\x80j\xbe\x92G\x1d\x00\n \f\x02ـT\x1e\"H&\x10v\x83\xec\xa6&\x1d\xe6\x83\x18NH\xa3\xfdY\x18#N\xa3L\xa8v\xd9x\x1e\xd43\x82\xe3\xc9d\x82D}\xed^\x98\r?>\a\x0eZ?\xcdS\xfdG\x1a\xd5xFH86\x81\x1d\x1e\xc4Qjc\xfb{'\xbe`R:L\x87Iw\x90\xca\xfd\x1e\rA*\x0e¢\xad\x14\u007f\x9c\xfa)U\xa6f\xa6$xFO#=\x92\x03\xf3`\x8c\x04v\x11#0\x81\x11&?R\x16 U*\x8f2-E\x06RY'T\xe2\xe9\x125nCt\xc1\xb4d\xcf0\xf7\xae\xa1\u009f\xe4\xd2\xf1\xb2Z!h\x039\xed \xe7C\xed\xe8\x1a0J\xfeNX\n\x9b\xbcv\x1a\n\xed\xc2b);\xf0\xc6\xda/'\x80\xd7\xd2\xf1aF&v\x98\x81\xc5\f\x13\xa7\xcd\x18[\xe6\x85\xee[\x9c'\x1b\xe1\xe7\x80O\v\xbbTس\x1a\x02'\x81\x02y\xeb\xe7\x83L\x0e>D \x9dbH\x90j\xb4l\xea\xa2(\xb2\xd38\xb10\xaf\ta\xa1ik\xef\x0f\x1c\xb6\xfb\xa6E\xf9\xc0\xa6\xcdx\xc3.\xf3j\xb9\xff\x8f\xf2\xae\xf2ޯR\xbd\x9b\xb3\xc9o\xadz\xc45Iq\xfb\xcd\x1e0/\xdc\xe9\x12\xa4\xabz\xe7a\x8a,k\xe1\xf0\xe3r\xff5\x9a{ӟ\xfbƚ\xfb\x06\xac\xafQ\xf8\xf18\xcf\x0e\xfc.\xf8\xef\x05\\\xffڞw\tr_s=\xbd\x84\xbd\xcc\x1cr,q\x1e\xe9v[͙Y\xf6O\x02\x8a\xdb^\xa8\xe5\xc2%\x87\xeb\xfa\xfc0;\xbeGv\u007f\xba\x8f\x19\xab\x80\xb9\xbb\x1b\xceB\x06>MJ\x83\xb9?\xa3\u07b3\xb66=\x1c\xd2|\xfe\xf6\x05\xd3i\xea!Vw\xce\xc8\xf9\xdcC\xb9\xbd|\b\x87\xe3\x89\t\x91G}\x90\xf0\xa9\x86K\x10\xf0\x84'\x1f.\b\x05$(AK\x8d\x06\xd4\xe7L\xe2\x9c\a\x1b\xf3\x13\x9e\x18PHcD̏W\rߞ\xf0\x147\xb0\xc7J\xc2,\x1c\x03=O\xa9\x83\x19\xc2\xe7\xe5%l\x04NJ\xb1ڃ\xd31D\xc2\x12\xc7P\xb5J\x12\xaf\"\xb7\x16c'C\xf7\x84\xa7\x0f\xd6\v\x8c\xac\xe3 \x8bh\x82\xc9U\x82E\xb6\xa3*I\xf5 2\x99\xd6Ky{\xb8QS\xe1i\xb7}\xd3\xeeF]\xc2\xf5\x8b\xb4\x84\x9eJ\xe1\x8bF\xfbM;\xee\xf9\xcd\x18\xeb\xd1\u007f\x15[\xfdT6=\xe5}7\xf1\xa3\x9d\f\x8bRz\xdfn\xfcQ\xac\x16\x95\xb4p\xa3\xe8P\x11\xf8\xc2\x19L\x86\x19\xaf\x96\x8cR^Z\xcez)\xadּ%n\x06֊\x86\x19ģMG:m\xf4Z\xcbFC\xa5\x93\x8fG\xed\x9e6\x14\x0f\xc1gf3\x91`\ni\xc9L\x15\xd1\x10\xad3\xc2\xe1\xa3L G\xf3\x88P\xd0^\x10+\x8dh\xff\xec\xdbb\x9d\x8b\xdd\xef\xab\x16\x1c}\x1a\x83Қ\xec:j\\%\xfe\x88\xc1\x83\xc9\xc8\xe9\xc11\xb4\xf1\x06\xcd\xc1I\x04\xb7E\x9ar\xb6Nd\xb7\x8bv\x89E\xd29\x8f\x1fh\xebw\xe4\xbd\xc4l8C\xd4m\xd2\xc2\xc5\x13\x9e..\xcf\xfc\xd2ō\xba\xf0!B\xdf\xea#\xc0\xd6\x11\x87V\xd9\t.x\xf6ů\v\xa7\xa2\xb53r \xdf\xe1\xc5G\xd7t\x90\xac\xa2\t\x9aZ\xdf+Q\\<\x8d}\xa4n\x16ں\x05\b\xddj\xeb|\xea\xb0\x13\xf0.KL\x81\u05eb\x90\x90\x02\xb1wh\xc0:m\xaak\x1dr\x92\xbd\xf4)I\xd1Ν\"H\xb0u\x9a˃\xa5c\xd7Ec\xdf\xde\xff^\xf8\xfb\x1e\xfa{\x0eb\xc2\x01\fC.\x8cN\xd0\xda9\xb5\x89\xf2\xf03\x19\xc0:\xfb'\xfc\t\x88/Vf\x95u.+Y\xb5%\xa10\xb1s\xf1q\xe2\xfa\xa5\x95\xc0$\xf7A\xffϫ\xecr쀭>υ\x8a\xda\xc0\xce\x10\xbd\xf2s+\x13\v\xa0\xfc\x11\xc5<\x96\xec.\x96D\xaeA\xf9\xfe[\x83\x81څ\xe2\xeb\x0e\x03W\xd5송u\xc7\xf0}\xd7X+4\xa7\xe9\rv\xe4r\x9e\xcc^\x14\x04+\xed\xda\xd9\t\x82\\\xe8\U0010317d4\xd65\xc8FÔ\x16\xcaY\u007fд\xe5'3um\xcc+\x0ff?\xfb\xb9\xad$\xd8A?\xd7w\xb3\xcc\xc8\x051\xf4A\x1c\x11\xe4\x1e\xa4\x03T\x89.\x15\xe7uȴy\x11/\x8ex\xb5\x84\xd8]\xac5a)\xf3\x9c\xccQ\x973\x9b[Ӻ\x17\xba~n\xe7\xaa;\x17/2/s\x109\x91\x1fM(\xed\xd82\xc7.\xe7\xe1YH\xc7^\x9d \xb3\x8bw:\x1ad\xa2\xf3\"C\x87\xb0ý6leV\xa6Xo\x9fA\x1az\xfc\x92\xab\xdf\x04\xec\x85\xccJ\x13\xed\xb9\x16Jc\xd9)#\x98{\xe4\xd8x\xa3]W\x06\x1556\xe8\xcf\xdb\x1eab\x19\xb1f!F\xa5\x80\xa3\x83ӹ]\xa00KB\xd3[\x83o\x1d\b\x16F\x92E\xe8\xb9Xp\x06\"G\x8a\xddX0\x18\x8aP\xa7\xb1`p\x06&c\xf1\x1e\f\xbe\a\x83qp߃\xc1\xf7`p\xa6\xbd\a\x83M{\x0f\x06߃\xc1\xe1\xf6\x1e\f\xfeG\x82\xc1y\xcc\xd6\x03EZ\x11\x83\u007f\x99-\xc2X\x0f\x94\xe0D\f\x8e\x01\xacD>\xbe\xe9D\xf0o\x9asS<[OV\x9fL.\x1d\b\xbc\xcaJ\xeb\xd0ė\xb5\xde\f\xcfkm\x01\xcf\at\a4\x90\xf8!k~\xc61lhMyF\xb3\xeb\xd6u\xae\xe4\xb9*\xaf\xe3\xeb\xc0g\xc3uO\xf1N\xeb\fŹc\x8a\xab\xc1\x9a\xab\xbc\xeaV\xf1\xd6UOU\x19ﰇ\rK\aa\xf8w\x01튟n\x01\x15\x9f\x04*l\xbf_\x85oT\x95\xd4Lm\xd4t\x8d\xb3\xae\xd6\x18aR'3\xdf\xe5\x8e\xe9\x14\xe2~\u007f\xe6\xcc\x162\x8d\x97/\x85\x9b8t\xe2\xf8i\xd3\xfd\xe2t(f\x82g\xe9\x0e\x838\xf3\xc3\x03:\\\xaa\xc7v\xe5p\xa5I\xe1\xd9N\x9fi\xa0\r(\x99\r\xd72\x10?\xab\xf9\x1dn\xc2υ?¾\xa6\xb0:\xb6\xf4\xe9\xd5\x05O\xddr\xa6Q\x8f\xbb\xfc^nIYu|I\xd3\\\x05ҒB\xa6v\x91\xd2\x04\xc8\xd8\xf2\xa5\xb8\xe3\xefl\xa9\xd2+\n\x94\xa2\v\x1b\xdf\xe4\x162\xae\x04\xe9\xb7(\xbb}\xcfh\xce\xe4g\xabDa\x0f\xda=\xe8\xac\xcc#\"\u07bb\xee\xf8\x81c\x0f\x05d\xe2\t!\xc9t\x99\xd6\xf0\x87\xc9\xe3\xb7\xda'\xb8}\xe0ͅ\x1f\xba%\xcd\v\xbf\xb0}T\x91Z\xff\x01\xe0\xf0\x8bS\x98=\x06Y\xa7\x8dxį:i\xbd\xa7\x9f\"\xb9;\xbe\xf3~:ȶJ\n\x85Z\xa2\xe1\xa03 \xdc\a\xd7d`}\f\xdb:\n\x12\xa6\xc3b\x9f4L\xe7\xb2Y\xa2\xee\xef\xbfzB\x9c\xccq\xf3\xa5\xf4'\xccu!\x8cE\xb1˰\"\xd0Oڍ\xd9\xffA?C\xa6\x03\xf5?\xf5\xf17\xc8i#>\xca.\xa6\xe2\xc8\x1aV\xe9[Ůy\r}\x18\x9e\xd7\n\xac[B\xe3s٘j\x8eA\x12\xd6\xeaD\n~\xf2(]xQ\xf1}\x9f\xa3\x8e\xedG\x11\xe9\xa3\xf9\xa4\xd1ڿ\xf3<\xeb\x1dI\x99\x8c\x8d\x9bBa.\xbd\xb4\xee\x9e7Ͼ\xf6l\xf8\xec\xbbs\xd9Y߈B\xf5ƍx\xcb!\x86\xaf\x87^\x93\xaf\xeb\xa7\xed\xab\x19\xa0\xd6\tW\xda\xf9\xdf\x06\xe0a\x90\x88\u0095&\xa4ɓ\xd2\xf0\x9b`\x02\x81\xfe\xe9\xec\xf2_\aȄu\xded'\x1f\xe1\u007f\xad\x875\xc7\x1b\xeb|\xbe\xbd\xf2i\xf0,,?\xbf\xf7\xd9vi\xbb?\x87\xd2n#\x0f\xf0\xf7\xda\xe4\xc2m!\x15\x0e\xd7\x04{P,\x03\x96\xc2Ϣ'\t\xb8\xa5\x11\xf5eY\xe0\x1cO\xab\x1eS\x8f ;\xbaf\xf3c,\x9c\xe9>3\xee\xae?\xea\r\ue948D\x96\xb5\xe0\xf9\xab\x1e\v\xff/\xcf7\x11>9&\xe4\x9c\u007f\xd7\xfb6\xe2a&\xbc˰g\x19V\xf2FO:\xdd\xcc\xc1NO\x9f-\xd3\x06\xd0_l]\xff\xa6F\xddA\xc1\xc5j\x10\xc0\xb1\xfay\xa0\xe3\xa7\xe6?f\xc1:\xfc\x9e\x0f\u007f\x00\xb0h\x8e\x98n\xc1\x99\xd2#\x1b\x90\xd3\xd3\xc6zRv\xbb\xa0\x9ee\xd3\xe0\x11\xbb\x8d\x19\\\x99p\x92\xa6!\xe9\x9b\xefx\x1c\x06y\u007f\x01LO\xb1/D\xd9\xd1\xfelN-{\x97\xe6خ\xb9\xf8y[\x86;\xb3\x19M\x91\x84\xe7_\xb6\x1faJ\x9a\x18_R\x9cȝ\xb7\xc9\xccs\xe4\xc5Q\x8b\x9c\xebԲ\xefSD\xa4f\xf0\x8er\xeb\xd8\xce!-9\x96\xb0\xeb\x9d\xcaԔ\xb1\x1c\x15<\x1a\"\xaf\xb0C\bCc\x14\x9b\n\x9e\b\x1eM\x8fݣ\x11\xfc\xd6,GB\xa5\x8c\f\xbe\xcd\xf3\xa5\x16-\x1d39g\xf3\xa44\xab\x05Y\x99\xcd\xed\x806\x96(\xf2\x14\xf7\xba\xd6\xd9\xd4\xe4\xd0z\x06\xb3\xb6\xa5z\x13C\xf2\xfe*\x14\xa3\x02d\x1cW\xba\x10'\xec-\x1ckB\x90\xec\a#\xb84]\xa1\xf9\x10=\xae3w\xaeE{\xb2\x1d\xe6\x00Y\a\xf0-\x10w\xab\aY\x98\xf7\x8e\xe4u,\xd9'I\xfd\xa5\x1c^\xc8\xe0\x18\x068\x10\xc5\xf1\xf1\x14\xcdWAa\xa9\x96W\xabN\xb1\xbf\xc1\xb1\x8a\xe4\x89Z\x1f5LMLi475\x8e%\x19sdD7\xe1\xeeU$\u007f\u05fa\xf1\x05\x04\xe6/]\xb7_\xbf1ιc\\\xc9Y&,+\xe6\x98\xe9Ƽ\xda\xef\x97K\x86ٜ\x96\x85g\x1fo;l\xe6\xb7ë=p\xe3\x1e\x9b\xf3\xf3\x01\xe9^\v\xc2g#k\xf4\xe70\xb0;\xdd\xdb\xf8\x18e\xcaw\xdd|\x9fN_\xee\xbc\x1a\xa2\n\x96\xean\x88\xb8\xcbun\xb8\x95\xfb\xf7\xe6\x9c\xdbK\xcfi\xfe\x16m;]\xc7_8bk%.\xf3\xfc.-y\x82\x96\xb6\x1b\xd2\x17ˋS\xbd\xae~\xd7(ʳt\x9f\rQf\x8b\xd5\x00\xc7\xe9\xd9z|\x98\xff\xd2\xfc\x94\xe3;3-\x8c475(\x87|8Q\xcff\x8f\xa3e\x16\xe0\xf8\xd2\x1a\x14\x9b?\xae_\x99\xe9}7?\x17ӯ\xf5Ԥ\xa7\xaf\xd4\xf0\xe7_E\x8e\x8a\xcd˄#\x1a\xff\x0f\x00\x00\xff\xff\a\x82u\xf6b\v\x00\x00"), - []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xacVM\x8f\xe44\x10\xbd\xe7W\x94\x96\xc3^\xe8\xb4F\\Pnh\xe0\xb0bA\xa3\x9dU_\x10\a\xb7]\xe9.ֱ\x8d\xab\x1c\x18~=\xb2\xe3t:\xbd\xe9Y\x10\xe4\xe6J\xf9իW\x1fI\xb3\xdb\xed\x1a\x15耑ɻ\x0eT \xfcS\xd0\xe5\x13\xb7\x9f\xbe\xe5\x96\xfc~|8\xa2\xa8\x87\xe6\x139\xd3\xc1cb\xf1\xc3\ad\x9f\xa2\xc6\xef\xb1'GB\xde5\x03\x8a2JT\xd7\x00\xe8\x88*\x1b?Ҁ,j\b\x1d\xb8dm\x03\xe0Ԁ\x1d\x8cަ\x01٩\xc0g/\xd6\xeb\xe2\xcd\xed\x88\x16\xa3o\xc97\x1cPg\xa4S\xf4)t\xb0\xbc\x98 8\xbf\x03\x98(\x1d\n\xdasE{_ъ\x83%\x96\x1f_qzO,\xc51\xd8\x14\x95\xbdˬ\xf80\xb9S\xb2*\xde\xf3j\x00X\xfb\x80\x1d\xbcy\xd3\x00\x8cʒ)/&\xb2>\xa0\xfb\xee\xe9\xdd\xe1\x9bg}\xc6AMF\x00\x83\xac#\x85\xe2w\x87%\x10\x83\x829\f\xfcqƈp(\x92\x00\x8b\x8fȕQ\x85\x04\x98\xa9q[M!\xfa\x80QhV.?W\x95\xbf\xd8n\xf8\xbc̈́'\x1f0\xb9\xd6\xc8 g\x84q\xb2\xa1\x01.ɀ\xefA\xce\xc4\x101Ddt\xb2\xd4`~|\x0fʁ?\xfe\x86ZZxƘA\x80\xcf>Y\x03ڻ\x11\xa3@D\xedO\x8e\xfe\xba 3\x88/!\xad\x12\xacŚ\x1fr\x82\xd1)\x9b\xa5N\xf85(g`P/\x101ǀ\xe4\xaeЊ\v\xb7\xf0\x93\x8f\b\xe4z\xdf\xc1Y$p\xb7ߟH\xe6^\xd7~\x18\x92#y\xd9k\xef$\xd21\x89\x8f\xbc78\xa2ݫ@\xbb\xc2\xd3M\xdd:\x98\xafb\x9d\x03~{EL^r\x0f\xb0Dr\xa7\x8b\xb9\xb4\xea]\x99s\x8fNU\x9e\xaeMt\x175\xb3)\x8b\xf0\xe1\x87\xe7\x8f0\a-\x8a\xaf%.\xe2.\xd7x\xd19\xebB\xae\xc78թ\x8f~(\x88\xe8L\xf0\xe4\xa4\x1c\xb4%tk\x8d9\x1d\a\x92\\\xd8\xdf\x13\xb2\xe4r\xb4\xf0\xa8\x9c\xf3\x02G\x84\x14\x8c\x124-\xbcs\xf0\xa8\x06\xb4\x8f\x8a\xf1\xffV9\vʻ\xac\xe0\x97u\xbe^Ck\xc7I\x9ceD\xea\x86\xd9,\xc8\xf6\x1c>\aԫ1\xc8\x18\xd4S\x9d\xcb\xdeGP+\xf1\xea\x8cn\xa3\xb5W\xae[\xe3\x99\x1f\xed]O\xa7\xb5\r@\x19Sv\xae\xb2Ow\xeeݕg#\xd7\xc7\x12#w_N D?\x92\xc1\xb8\x9bs\xab\x1cR\xacI\x12Z\xc3m\xb3\x15\xebF\xe1\x9aX\x81\xbb\xa5\xb7b\xf0T\x9d2\x87,\xeb|i\xda*X\x97[Yu\xea\x84۱?\xcb37,E\\\rݮ&\xb32\xcdѾ\xd80\xa2$\xf1\xbfm\x99r\xa9z\x1ek\xdb\xe8\x14#:\xa9\x88\xe0\xfbUF꿷M8+\xc6W%\xdf\xc6~\xca\xf7\xe6*X\xeaQ\xbfX\x9c\xd0\xca\xfa\xfe\xac\xc7\xfe1\xd3W\n\xb5!\xf6m\xedv\x97\xb1\xbe\x18r{.\x87\"d\xb3\x897\xce?7\xe3\xc3r*z\xed濑\x87\xe9\xf3\x9e7\xa5\xe9@b\x9a>\xa4\xb5ߪe)\xbf\xd2\x1a\x83\xa0\xf9\xf9\xf6G\xa4|\xf6\x97\u007f\x89r\xd4\xdeM\xc3\xca\x1d\xfc\xf2k3\xa1\xa29\xcc<\xb2\xf1\xef\x00\x00\x00\xff\xfff\xf5\xa1\r\x88\t\x00\x00"), + []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xec\x1c\xcbn#\xb9\xf1\xee\xaf(8\x87\xd9\x05,\x0f\x06\xb9\x04\xbe\xcdz\x1cD\xd8ɬ\xb16\x9cC\x90\x03\xd5]\x92\x18\xb3\xc9\x0eɖ\xad\x04\xf9\xf7\xa0\xf8\xe8\xf7\x83\x9aUv\xb0X\xf3dSd\xb1\xde,\x16\x8b}\xb1Z\xad.XɟP\x1b\xae\xe4\r\xb0\x92\xe3\xabEI\xff\x99\xeb\xe7?\x99k\xae\xde\x1f>lв\x0f\x17\xcf\\\xe67p[\x19\xab\x8a\x9fѨJg\xf8\t\xb7\\r˕\xbc(в\x9cYvs\x01\x90id\xd4\xf9\xc8\v4\x96\x15\xe5\r\xc8J\x88\v\x00\xc9\n\xbc\x81\r˞\xab\xd2\\\x1fP\xa0V\xd7\\]\x98\x123\x9a\xb9Ӫ*o\xa0\xf9\xc1O1\xf4\x1b\x80G\xe1\a7\xdbu\bn쏭\xce\xcf\xdcX\xf7C)*\xcdD\xbd\x92\xeb3\\\xee*\xc1t\xec\xbd\x000\x99*\xf1\x06.//\x00\x0eL\xf0ܡ\xed\x17S%ʏ\xf7\xeb\xa7?>d{,\x98\xef\x04\xc8\xd1d\x9a\x97n\\X\x15\xb8\x01\x06O\x0egЁ5`\xf7\xcc\xd2\u007f\xa5F\x83\xd2\x1a\xb0{\x84\x8c\x95\xb6\xd2\bj\v?V\x1b\xd4\x12-\x9a\x00\x19 \x13\x95\xb1\xa8\xc1Xf\x11\x98\x05\x06\xa5\xe2\xd2\x02\x97`y\x81\xf0\xdd\xc7\xfb5\xa8\xcd?1\xb3\x06\x98́\x19\xa32\xce,\xe6pP\xa2*\xd0\xcf\xfd\xfe:\xc0,\xb5*Q[\x1e9H\xad%\xf1\xba\xafG\xd7;\"\u070f\x81\x9cd\x8c\x1e\xfd\x83\xef\xc3\x1c\x8cc\n\xd1a\xf7܀\xc6@\xa6c`\v,\xd0\x10&\x03\xd2\xd7\xf0\x80\x9a\x80\x80٫J\xe4\x90)y@M|\xca\xd4N\xf2\u007fא\rX\xe5\x96\x14\xccb\x10jl\\ZԒ\t\x12Y\x85W\x8e\x11\x05;\x82FZ\x03*ق憘k\xf8\xab\xd2\b\\n\xd5\r\xec\xad-\xcd\xcd\xfb\xf7;n\xa3\x8eg\xaa(*\xc9\xed\xf1}\xa6\xa4\xd5|SY\xa5\xcd\xfb\x1c\x0f(\u07b3\x92\xaf\x1c\x9e\xd2:\xbb(\xf2?D!\x9bw-\xc4\xec\x91t\xc9X\xcd\xe5\xae\xeev*;\xc9f\xd2]\xaf=~\x9aG\xb7\xe1&u\x11\x13~\xbe{xlk\x167]\x16;\xe66\xd3L\xc3g\xe2\v\x97[\xd4^N[\xad\n\a\x11e\xeeU\xcbi\xa5\xe0(\xbb<6զ\xe0\x96\x04\xfb\xaf\n\ri\xaf\xba\x86[&\xa5\xb2\xb0A\xa8ʜ\x94\xee\x1a\xd6\x12nY\x81\xe2\x96\x19<7\x97\x89\xa1fE\x1c\\\xe6s\xdb\xfdt\az\xe6\xd4\xdd\xd1ӌ\n\xc4\xdb\xf3C\x89YG\xedi\x0e\xdf\xf2\xcc)7l\x95n\xccݻ\x92\xeb\x16\xc01\x93\xa3\x86\xaf\x99\xa8r̿\x90?+Y\xd6\xff\xbd\x87\xca\xdd`8\x19\x8be\\\x92\xba\x90\xe3#˒ͯ\xce\xdf0\x8d=\xa0\x00$2.=4\xe7I\xf68\x82\xb63,\x8b\xc5\x00\xab\t\x86\aؕ\x10l#\xf0\x06\xac\xae\xfaK\xfbyLkv\x1c\xe5D\xdcE\xd2\x18Q\x8f\x0e\x06#x\xe6\xfchm\x16\x8e\x17\xbf!6\xec\x95z\x9e'\xfd/4\xa21k\xc8\xdc\xe6\v\x1bܳ\x03W:\x10\x1b\\\xe9\x06\x01_1\xab,\xe6\x03ԙ\x85\x9co\xb7\xa8\tJ\xb9g\x06\x8dw\xddS,\x98RbjzJl\x03\xfc\x1b\x911\x8d\x9e\xde)\x94\xe1e\x8f\xd2!3\xe4\xaeo\xb4\xcfʜ\x1fx^1\x01\\\x1a\xcbd\xe6\xe9`5N}:`Z\x9c\x03l\xbd\xf1G\x9c\x89\xf7\x1dG\xa0$\x82\xd2P\x90\x8b\x1b\x0e5\xa3\xf0a\x92\xdc\r3\x98\x83\xf2j\xa8+\x81&,\x94;\xff\xd2\xd8\xf5\xd5\x04\xe0Z\n~\xff\x13l\x83\x02\f\n̬\xd2cl\x98\x17\xaao\xcb>j\x82w#\xde*8\xcd\xe0BێJM\xc2\x04x\xd9\xf3l\xef\xf7*\xd2\x17\a\x05r\x85\xc6\xd9/+Kq\x1c'\x0e\xe6%\xedی\t7m֘\xfb\xb0\x86fݴE?״\x05\x8f\xd7\xe5e-\xfa\xdf\x0f+\xa3\xe3>Y1׃\x89\xe7TLb\"\xa7\xf0r\xbd\x05,J{\xbc\x02nc/E\xb0̝z&\xd9S\xaf\xfd\x9b\x13ĩ:\xbd\xee\xcf;\xa3N\xffB)\xd4K\xfff\x84\xe0\x9c\xfdC\xf0\xf5\x89\x02\xf8ܞs\x05|[\v \xbf\x82-\x17\x16uO\x12s\xe4\xaayI\xfcR\x16,\xefT\xd4\nf\xb3\xfd\xdd+EG.c17\xb6Ǎ\xfeT\x1fSƨ\xba\xbb\x99\xceB\x05wB\xe2\x1a\v\u007f\xeezt\x1clz\\\xe4\xf3\xf1\xcb'̧\x99\x02)\x1a6 \xe1c\x0f\xcd\xf6\xb2!DN# \x04)\xf5\xe9\xc2\x1f\x99\xaf\x80\xc13\x1e}tA\a\xf8\x125\xa3eh\xf0\"D\x8d\xee\xdc\xee\x14\xea\x19\x8f\x0eH8\x8a/\xccM\x13\xbdo\xcfx\\\x1e\xd4c\x1ba\xc3MH-\x10\xff\xa8\xc31\xc0\x9d\xf4RY\x06.\x91\x12=\xcc\x12Q\x90\xea\"b\x8b\xdc>\x99\xbcZLM2\xc0\v\xf2\x9d\xf1B!m\xdf\xf32\x89@r\x9d`\xd0\xd9DL\xa4<1\xc1\xf3z\x19\xaf\xdfky\x05_\x94]˩`\xb5\xdb\xee^\xb9\t\xf9\xabO\n\xcd\x17e]\xcfٙ\xe8Q>\x99\x85~\x9a3!\xe9\xdd0\xd1\xdfN\xd0,*\xb1ok\u007fªE\xc2\r\xac%\x9d!<\xaf|F\xcd/6\xe7\xed\xbb\xad\xa8\x8c\xcb\xc0H%Wn\xb3\xbb\x1e['\xb08Q\x91\xdbR\x18\xa2U/\xe9\x97K\x82\xf8H\xfb\x82\x9f\xed\xb3\x83\x82e\x98C^9&\xbat\x17\xb3\xb8\xe3\x19\x14\xa8w\xd3\x1bA\xbb\x95\xe4\xb3S\x96O\U000a5f9d\xa4O)[sl\xc1\x19\xe7Kh\xac\xc86\x17\xc7D\xd1.\f\x1cMxM\x0f\\\xa2\xc3m\x92.nX\xe0&\xcbsw\t\xc0\xc4}\xb2\xf7N\xe6\xfcp\xdf\xf6(\xf9=\xae`%Y\xe7\u007fh\xabrJ\xfb_(\x19\u05cb\x16\xfa\xd1]\a\b\xec\xcc\fY\xa1\xf6\"\x04\x9f\x1b i\x1e\x98\xe8gIG\xc8R\xe45P\xf8mXm\a\x91\xc6\x15\xbc\xec\x95\xf1\xbb▣ȁ\xcfEZ\xd4.\x9f\xf1xy5\xb0\xf1˵\xbc\xf4\xdb\xf3\xc0b\xe3^\xbe\x00XIq\x84K7\xf3\xf2\xebC\x97$\xadK\x18\xe4\xee\x86҂Y:\xcd\xc5]\x9c\xa6\xd5\xf7\x10\x14\x8aNc\x9b\xa0s\xa526\x11\x89{e\xac\xcf\xd0u\x82Ǒ\xdc\xd0\xfc\x99&䄀m\xfdݏ\xd21\xedO\x8e\xac\x97\xaa$)\x19\x1cMp\x0e \xe6\x01$\x13\x02.\x1b\x1b\xf5\xfe\xf1\xd2\xdf\x05\xb8%X\xe6\u0082\x19\x88\xa4\n\xa5V\x19\x1a3\xa7\x0e\x8b\x9ew!\xe1V'ۘ?T\xf8T\xfb\\r/\xb6\u0530\x91XsR\x98}\xf7\xda\xca\x01\x92i\xd3\xff\xf3jv\x1aF\xd42U\x14L.n\x16\x03\xe4n\xfd\xbch\n\x01\x8c\x0f\xd9\xf5\xaerf\x9c\x1a\xe9\x05\xa5\xf9\xb6\x1bl\xc1\xe5\xda\x01\x87\x0fgݎ!\xbaD<=\xa4\xbe\x8d3\x1b6\xd7\x1d\xde6K5L\xb9\x8f\xb5\x97=j\xecHj\x98\x19v\xe1\x9cT\xb6u\x8a|\xe8\x8e\x1d9\\P\x8cÞ\x112\xa1\xaa\xbc\x86=$\xc5=C<\xc2\xfd\x93s\xf2\xee)L\xd6<\x04\n\xae<\x06?\xfdwB?\x9c\xf3\xb0a\xac\xd2l\x87\x9fU\xd6zm:E\u007fwl\xe7\xad`\x10j<\xd2\xc7:\b\x16_\xb1u\xa7\x8eŎ!\xcb\xe6\xe3\xc3\xd6\xe9\x8b0\x1c\xca{\xd2\xf2\xac\x15\xb3D<>~\xf6\x88[^\xe0\xf5\xa7\xca\x1f\xe4V%\xd3\x06\x89\u007f\x91 ?iC\u007f\xee\xd5\xcb\x00a\xa1\x02\xa5?\xf4\xf1\xd5\xe8rx\ued18\x8c\xb5\u007f/\x1b\x15,\xb2i^\x1d\x9f\xc6\xe7\xb4bіP\xfc\xc1Fm\xa7f\r\bl=\xe6\xa5h\xdfW\xb4\x9c\xeb\x89ڸs\x1e\u007f\"i\x99\xad\xcc\xd2#I7(>h\x0e\x19\xdfJ\xbb\x17f\x1e\x80WƓ\xdfI\x86\xf4V\xe7\xf9\xf8\x9cLn\x87\xe3\xddsb\x9d{\xa4\\Z\x8dE%\u007fa\xa6N\xa0\x8dx\xb4\x06\x98\x9f\xe7\x82\x01\x82\x859\xe0\x01%(\xe9\xf2e\xee\x05\x97\u007f\xc4ޟ3<\xbf\xb6`\x84t\\U\n\xc5\xf2h\xb9\x01\xb5\xf8D\xfa\xd1\xf9#}@\xfd\xceLB\xacLH\x8e\x8c\x90\xdf\u05ec\xad\xd2\x05\xb37\x903\x8b\xab\x11\x80\t~lD\xa5\\\xf2x\xe1\xe9\xa6\x1b\xe2\xad\xc3坝J\b\x11\x12\xcf\x05\x1a\xc3v\xf1\xcd\xe6\v\xb9\xa3\x1dJ\xda\xe4F\xb2D!\x14k\x12\x97\xdd\xf7\x8b\xfeD\xc72K\xe7_\x8fZ8¶F\xbd\x1bڜP;:a\xbb\x81\xe1\x19u\xf0\xcf㎄K\x8b;\xec\x86G\xf8Zr\xbd\xec\xcb\xef\xeaa\xc4\x11wtw\x16\xde|D\x00\x05\xdfqr\x88$\xd8\x1d\xd3\x1b\xb6\xc3U\xa6\x04\x9d\xa3\xb8\x92}\x8c\xfe?ru\xcfCg\t\xb9\xa7\x11\xf5-O\xcb\xe61\ne|\xbf\x1c\xbb\rX\xc1\x17\xec\xbbz\x9f\xe0\xc7\xfc\xa9\xfe\"\xc3`\xc0Z\xdek\xb5\xa3\xc8i\xf0\xd3m\xb4\xee\xc1/\xf7L[΄8z\xf0\x13\xab\x0e\xba?!\xd9ׄC\x1da\xa0\xb1L\xdb4\xdf\xf5\xd0\x19\xba\xe0\xb6\x1c\\̯\xe1\x01KFF2PfwU}\xdb\xff\xf8\xc6\x15\x85\xb6\xf1\x83\x14\xfe\x03\x03ٞɝ{\xd3\n\x1a\xddn\uf7ee\f v\xfcP\xc7\xeftQ\xffu\\N\U000c93bbe\xe7\xf3\xd4\x1b\xdc\xcb?\x92\x1bj\xe0E\x97\xf1\x1d\xdf\x0e\xb7\xe5\xb2\x14<#l\xbf\xffFy\xc5\xc3\xf0s\x1dCr\xc3\xe7:\x82Y\x06\xbd\xf1r\x88\x00\xd2]Z782\x1f\xad\xa5\x83\xf2\xf0@9\x13\x1d5\x93\"NVY&@V\xc5\x06\xb5\x13A\x1c0``\xfc\x96I\x04\x15\xee\xc0&ádBj\xe7p\n!\xf5\xa4)BL\x95eh̶\x12bx\U000ad8cd3R\xf5\xc24\x85\x98\xf3\x06\xf0\xb70hd\xff\r\xf3ϻ\x03\xb76\xe0\x88߯\xb4\x05\x8fD\xb1\xbd\xaehAp\xf8\xd0\xfc\xe7ط\n\xdf$:\xf8J\n\xe7\xf0\xf2\x96u\x06TBO\x13\x1a\xb3,C\xd2\xdd/\xfd\xcf\x13\xb9\x8f\t5_ r\xfffJ\xfa\xfc\x86\xb9\x81\xbf\xff\xe3\x02\xc2\t\xeb)\xe2A\x9d\xff\v\x00\x00\xff\xffj\x12iȎI\x00\x00"), + []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xbcW\xcdr\xdb6\x10\xbe\xeb)v܃/\x11ݴ\x97\x0eo\x89݃\xa7I\xec\xb1bw:m\x0f\x10\xb0\x94P\x83\x00\x82\x05\xe8\xa8O\xdfY\x80\xd4\x0fE\xd9\xf1L[\u07b8X,>|\xfb\x8b\xd9|>\x9f\t\xaf\x1f0\x90v\xb6\x06\xe15~\x8dh\xf9\x8f\xaaǟ\xa8\xd2\xee\xa2{\xbb\xc4(\xde\xce\x1e\xb5U5\\&\x8a\xae\xbdCr)H\xbc\xc2F[\x1d\xb5\xb3\xb3\x16\xa3P\"\x8az\x06 \x03\n\x16~\xd6-R\x14\xad\xaf\xc1&cf\x00V\xb4X\xc3R\xc8\xc7\xe4)\xba Vh\x9c\xcc\xcaTuh0\xb8J\xbb\x19y\x94lh\x15\\\xf25\xec\x16\x8a\x05\xe25\x80\x82\xe8}6\xb6(\xc6>\xf4\xc6\xf2\xba\xd1\x14\u007f9\xad\xf3AS\xcczޤ \xcc)XY\x85\xb4]%#\xc2\t\xa5\x19\x00I籆\xb3\xb3\x19@'\x8cVy\xa1\x00u\x1e\xed\xbb\xdb\xeb\x87\x1f\x17r\x8d\xad(B\x00\x85$\x83\xf6Yo\x1a\"h\x02\x01\xc3)\xf0\xb4ƀ\xf0\x90\xd9\x00\x86\x80\xd4\xe3\xe9-\x02\xb8\xe5_(#U\xbd\xc0\a\xe71D=P\xc6ߞǷ\xb2\x11\x98sF[t@\xb1\x8f\x91 \xae\x11\xba\"C\x05\x94o\x02\xae\x81\xb8\xd6\x04\x01}@B\x1bw\xeco\x115 l\x8f\xab\x82\x05\x066\x02\xb4v\xc9(\x90\xcev\x18\"\x04\x94ne\xf5\xdf[\xcb\x04\xd1\xe5#\x8d\x88\xd8\xfbi\xf8\xb4\x8d\x18\xac0\xccs\xc27 \xac\x82Vl \x9f\x01\xc9\xeeY\xcb*T\xc1G\x17\x10\xb4m\\\r\xeb\x18=\xd5\x17\x17+\x1d\x87\x18\x97\xaem\x93\xd5qs!\x9d\x8dA/St\x81.\x14vh.\x84\xd7\xf3\x8cӖ0m\xd5w\xa1\x8f\u007f:\xdf\x03\x167\x1c\x00\x14\x83\xb6\xab\xad8\xc7\xe8I\x9a9:\x8b\x8f˶\x02w\xc7&\x8b\x98\x84\xbb\x9f\x17\x9fa843~Hq&w\xb7\x8dv<3/\xda6\x18\x8a\x9f\x9a\xe0\xdal\x11\xad\xf2Nۘ\u007f\xa4\xd1h\x0f9\xa6\xb4lud\xc7~IH\x91\xddQ\xc1\xa5\xb0\xd6EX\"$\xafDDU\xc1\xb5\x85KѢ\xb9\x14\x84\xff6\xcbL(͙\xc1\x97y\xde/?\x87\x8a\x85\x9c\xadx(-\x93\x0e\x99L\u0085Gy\x90\x05lB7\xbaO\xca\xc6\x05\x10}R\x1eP8i\xac\xdaS\x99JΜ\xa0R\"\xd1G\xa7\xf0P>\x02\xfbn\xabv\x80\xcech5\xe5\x12\x9e\xb1\xb1\xac\x14\t\xe8\xab\xd6\xc8(l\vL5ZA\x9b\xda1\x849ܡP7\xd6l&\x17~\r:\x8e\x0f\x98t\x18\u007f\xd2\xd9F\xaf\xc6'\b\xa5rK\x11\xe6\xf6\x04A\xcf\x1a\x1d\xb1t\x99\xcf\xe0$c2|p\x9dV\x18\xe6\x83\x0f{\f)\xf4\xce\xd4h\x14\x8dy\x98\f$\xd8&^\xef\xe2g\x9du\xb3\xaf\xb9-\xef=\x8a!\xae0r\xc6\x13Xdϊ0\xa6\x18\xb8(Jg-g{t \xb6\xf79\xa7\xa1\b\xf4>\x1e_\xe1T\xac\xf1\xb7L\xf2\x11\xe3\xb1|\x9c\x1cY\x8d\x99\xcc!U\xfe\xa2\x83D\x98\xb9}\x1e\xc0\v>c\x84\xd8\xe8\xaf/\xa2\xb8\xcdj\x03\n/\xe2\x1a\xb4%\xad\x10\xc4\x04\xa6\x89\xb4\x1c\xbe\x01'\xdc\xf8\x12m\xafD̕Q\aT\xc7\tR`|k\f\r.|6|n{\xa5\xed\xbd\x87\xff܀\xc7\t>\x1d\xbfG\xb7\x98\xba\xc1\xfc0\xa6\x0fV\x86C_,\xb1Q\xc4D\xaf,\xb2yO\xaf\xb8\xec\x13B\xa6\x10\xd0\xc6\xde \xb8\xe6\xb0L\x0e\x93\xd0\u007f]h\xcf\xf6*-7k\v\xc9&BU\xaaE\x05\u007fX\xb8\xe2\xd6+\xb9%\u058c\x9c\xbb \x1d\x85\x93uO\xbcy\xcfZ6\x00\xce\xe6\xdb\xe6>óL\xe9\xd4y\xe9I\x1b\xc3\xfd6`\xeb:TG&\xb9[\x064\x1b\x10L\x0ft?T\xdfWg\xffs\x157\x82\xe2bc%\xaa;\xec\xf4x\xae\xae\xf7\x9f6(\xe6S\xf3\xec\x83\xeb\xe0&\xb3\xc4\xf1\x019f\xb2\xf8\x19\xb7>x\xf114#\x8aqFL\xd7\x00XB\xa3Ư~D\x163\xa6\x0eB\x1e\x86\x06 \x98\x11;p8\xa0\xe0\xc6\xd8\xe7\x9c\b\xff\xca\xc8\xc2\xed\x1e\a\xa4\xd8\xfa\xd8pB\xabav\x14s\xea\xe0\x97P?\x97P\x0f5T\x99\x1d<\xcb/oy\xfc\xea\x8f^i\xc8d\x86儊\x03\xfb\xb0˃\xa1E\x97\x06\x80mL\xd8\xc1\x87\x0f\r\xc0\xde\fޕs\xd7\x04c\xc2\xf0\xd3\xfd\xed\xd3\x0f\x8f\xb6\xc7\xd1T#\x80C\xb6\xe4S\xf1[J\x0e<\x83\x81\xe3\x16 \xf1\xb83Ā\x10\t\xc6H\b5\rn\x8f!\x13ń$~B\xa3߅\xae'\xdb\xd5\xe6\x1f5\xbb\xea\x03N\x95D\x06\xe9\x11\xf6Ն\x0e\xb8d\x0eq\v\xd2{\x06\xc2D\xc8\x18\xa4\x9c\xf2\",\xa8\x8b\t\x107\u007f\xa2\x95\x16\x1e\x914\bp\x1f\xf3\xe0\xc0ưG\x12 \xb4q\x17\xfc?\xa7Ȭ\xe7\xd3-\a#\x93r\xd3\xe7\x83 \x053(\u05cc߃\t\x0eFs\x00B\xdd\x03r\xb8\x88V\\\xb8\x85\xdf\x14\x8e\x0f\xdb\xd8A/\x92\xb8[\xafw^\xa6J\xb6q\x1cs\xf0rX\xdb\x18\x84\xfc&K$^;\xdc\xe3\xb06ɯJ\x9eAJ\xf5\x8f\xee;:V9\u007f\xbcHL\x0e*8\v\xf9\xb0;\x99K-\xbe\x89Y밪Z\x97\xd5t\xcf4դ\x10\x1e\xbe<~\x85i\xd3B|\x8e\xb8\xc0=/\xe33g\xe5\xe2\xc3\x16\xa9괥8\x96\x88\x18\\\x8a>H\x19\xd8\xc1c\x983\xe6\xbc\x19\xbd\xf0Tm*G\v7&\x84(\xb0A\xc8\xc9\x19A\xd7\xc2m\x80\x1b3\xe2pc\x18\xffo\xca\n\x94WJ\xf0}ΗMf\xeeX\xe1\x9c\xccS\vY\x14d\xe1\xd2=&\xb4*\x91rҵ~\xebm)r\xd8F\x82\x97\xde\xdb~\xbat3\x80\xa7\xeb\xd9^\x98\x97\xae\xa3~5\xc0\x9d\xb6\xc0\x99\xfd\x8d\xc3B\x91\xc5\x13\xceJku\x11\xe6]\nb$\xf3\u007f\xe2PVL$l&\xc2 \xc78\xe5\x8e/-\xfa\x96\xb3#Q$\xbe>\xf7,\x9d/\xc5E\x9b\x85\x18\x1f\x18L8\x1c\x97\x81\xf4F\xe0\x05I+\xdaƬ\x9d\x01\x1d\xb8|\xc5눢\xc7*\x8aʗ(Zdn\xaf\xbc\xbc\xe0\xf8*\x9b7u\xd0O\u007f`f3`\aB\x19\x17\xf53D\xe60\x9bI\xbd\xe1Wb\xcf\x0e}\xaf\x1eK\xbc\xb1v]|\x0fx\x81\x1b\xf2x\xbd\xcb\n\xee\xf0\xe5\x95\xed6\xdcS\xdc\x112\xbf\x9a\xba\xaf\xa4\xd0}[m.\x14ܕi?=+\xf6\x9fΣ\x02}u|\a\x94\t\x00\xd6.\xe6.\xc0\xb2D2\xbb\t\xf5\xb9\x8a\x8d\xb5\x98\x04\xdd\xdd\xf5+\xa0\xfc\u007fϿ\xf32\xb41\xb8\xf24\xe1\x0e~\xff\xa3\xa9Q\xd1=My\xa8\xf1\xdf\x00\x00\x00\xff\xff\xe9\x15A\x19\x02\t\x00\x00"), + []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xacVMo\xe46\f\xbd\xfbW\x10\xdbö\xc0ڃ\xa0\x97·6\xd9âi\x10L\xd2\\\x8a\x1e42\xc7VcK\xaaHM6\xfd\xf5\x05%{><\x9ed\v\xd47S\x14\xf5\xf4\xf8\x9e\xa4\xa2,\xcbBy\U000c404c\xb35(o\xf0+\xa3\x95?\xaa\x9e\u007f\xa2ʸ\xd5\xeej\x83\xac\xae\x8agc\x9b\x1a\xae#\xb1\x1b\xd6H.\x06\x8d7\xb85ְq\xb6\x18\x90U\xa3X\xd5\x05\x80\x0e\xa8$\xf8h\x06$V\x83\xaf\xc1ƾ/\x00\xac\x1a\xb0\x86ƽ\xd8ީ&\xe0\xdf\x11\x89\xa9\xdaa\x8f\xc1U\xc6\x15\xe4QK\x896\xb8\xe8k8\f\xe4\xb9$c\x00\x19\xcb\xcdXf\x9dˤ\x91\xde\x10\xff\xba4zk\xc6\f\xdfǠ\xfas\x10i\x90\x8cmc\xaf\xc2\xd9p\x01@\xday\xac\xe1Ç\x02`\xa7zӤ=f@Σ\xfd\xf9\xfe\xcbӏ\x0f\xba\xc3A\xe5 @\x83\xa4\x83\xf1)o\x0e\b\f\x81\x82\xb1<\xb0ۯ\bʂ\nl\xb6J3l\x83\x1b`\xa3\xf4s\xf4cM\x00\xb7\xf9\v5\x03\xb1\v\xaa\xc5O@Qw\xa0\xa4ZN\x84\u07b5\xb05=V\xe3\x14\x1f\x9c\xc7\xc0f\xa2O\xbe\xa3\xbe\xefc3\xc0\x1feG9\a\x1a\xe94\x12p\x87\xb0\xcb1l\x80\xd2n\xc1m\x81;C\x10\xd0\a$\xb4\x9c\x989*\v\x92\xa2숼\x82\a\fR\x04\xa8s\xb1o@;\xbb\xc3\xc0\x10P\xbb֚\u007f\xf6\x95Ix\x91%{\xc5S\x87\xa7\xcfX\xc6`U/\xbd\x88\xf8\t\x94m`P\xaf\x100\xb1\x13\xedQ\xb5\x94B\x15\xfc\xe6\x02\x82\xb1[WC\xc7\xec\xa9^\xadZÓҵ\x1b\x86h\r\xbf\xae\xb4\xb3\x1c\xcc&\xb2\v\xb4jp\x87\xfdJyS&\x9c\x96\x93;\x86\xe6\xbb0\xba\x80>\x1e\x01\xe3W\x11\tq0\xb6݇\x93^/\xd2,z\xcdj\xc8\xd32\xdc\x03\x9b\x12\x12\x12֟\x1f\x1eaZ41~Jq\x96\xc5~\x1a\x1dx\x16^\x8c\xddb\xc8}J\xa2\x92\x8ah\x1b\xef\x8c\xe5\xf4\xa3{\x83\xf6\x94c\x8a\x9b\xc10M*\x95vTp\xad\xacu\f\x1b\x84\xe8\x1b\xc5\xd8T\xf0\xc5µ\x1a\xb0\xbfV\x84\xff7\xcbB(\x95\xc2\xe0\xfb<\x1f\x1fB\xa7\x89\x99\x9c}x:f\x16\x1b23\xea\x83G-\xed\x11\x8ed\x9e\xd9\x1a\x9d\x04\x0e[\x17@\x1d|;\xb2T\x1d\xd5]r^\x02\xa5B\x8b|\x1a\x9b\xa1xL)\xb2\xf0K\xa7N\x0f\x88\xef\xb1j+q9\x8d\x10\xb2\xef\u007f\xa8f\xf5.\xad\xbe$\xc9E\f\x932e\xeb£\xd8X\x0e\x96c4\xf3E\xe5C\x1b\x87\xa5\xe2%\xfc\x92\x90\u07ba\xf6\x8d\xd1kgY\xf4\xfbFʓ\xeb\xe3\x80\x0fVy\xea\x1c\xbf\x918\xddT\xfb\xe3\u007f\x9e\xb6F9G\xf1\x12\xa2qx\x8d\x14\xfbED\x8b:\x9c\xbetݽG\xf2\x9d\x1ap\"Y&\xe4\xe3\x14\xe19n0Xd\xa4\x83\xe9_\fw\xf0\xd2\x19\xdd-T\x854-\xf5GN\x13\"\xa7M\xf2\xe7\u007f\x83-26\x01\xcf\xd4Q&͜\x05\x05r\xb1T|f\xb9\xe5\xc2\xe5h\x85w\rˊ#}\xb3eS\xf6D\xaa\x8e!\xa0\xe5\xb1F\xba\x8a\xe6\x13\xbeų\x93\xe0\u007f_\u07feiܛC\x9e\xdcl\xac\x8c\xcd8|\xc0\x92L+\x17\xa7\x8c\x89u\x93\xb1\xe6\x04\xe4\xef\xf8\x02\u007f\xb7k\xf8՛p\xf4\x1e\xb9\x00\xed\xf3>-\x9f+h\xf3\x850\u007f\x9a\xa4rH\xe9N\xd5ʞa\xdb 4\xd8#c\x03\x9b\xd7|0\xbe\x12\xe30ǻuaP\\\x83\\\x13%\x9b3\xa1ȫPmz\xac\x81C\\V\xd1\xc2f}\xa7\xe8\xccV'\xfb\xbc\x97\x8c\xa5\xf6\xef\xcd\xf5F\xff\xe1\xc2\x01V\xc2\x1d\xbe\x9c\xc5\xee\x83\xd3H\x84sc\\@\xbf \xeeYh7\xbd\xc6wW\x87\xbf$\xc5r|>\xa7\x01\x00\x92˽9\xa2n|\x10\x8e\x91\x83c\x94\xd6\xe8\x19\x9b\xbb\xf9\x03:=e\x0f/\xe2\xf4\xab\x9dmҋ\x9ej\xf8\xe3\xcf\"W\xc5\xe6i\xc2!\xc1\u007f\x03\x00\x00\xff\xff'B.\x809\f\x00\x00"), + []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xbcYQs\x1b\xb9\r~\u05ef\xc0\xf8\x1eܛ\x89\xa4I\xda\xe9t\xf4v\xb1{\x1d\xb7w\x8e'r\xf3\x92\xc9\x03\xb4\x84\xb4\xacw\t\x96\xc4JQ;\xfd\xef\x1d\x90\xbb\x92VZ\xcb\xf2]&\xfb\x92\x98\x04A\xe0#\x00~\xa0F\xe3\xf1x\x84\xde~\xa2\x10-\xbb\x19\xa0\xb7\xf4U\xc8\xe9_q\xf2\xf4\x978\xb1<]\xbf]\x90\xe0\xdbѓuf\x067M\x14\xae?R\xe4&\x14tKK\xeb\xacXv\xa3\x9a\x04\r\n\xceF\x00E \xd4\xc1G[S\x14\xac\xfd\f\\SU#\x00\x875\xcd\xc0\xb3Ys\xd5Դ\xc0\xe2\xa9\xf1q\xb2\xa6\x8a\x02O,\x8f\xa2\xa7BU\xac\x027~\x06\xfb\x89\xbc6\xea\x1c@\xb6\xe5\x81ͧ\xa4\xe6}R\x93f*\x1b\xe5\x1fC\xb3\xbf\xd8(I\xc2WM\xc0\xeaԈ4\x19\xad[5\x15\x86\x93\xe9\x11@,\xd8\xd3\f\xae\xaeF\x00k\xac\xacI>f\x83ؓ\xfb\xe9\xe1\xee\xd3\x1f\xe7EI5\xe6A\x00\x1f\xd8S\x10\xdb٭\xdf\x01\xe0\xbb1\x00C\xb1\b\xd6'\x8dp\xad\xaa\xb2\f\x18\x85\x98\"HI\xb0\xcecd \xa6m\x80\x97 \xa5\x8d\x10\xc8\a\x8a\xe4$\x99t\xa0\x16T\x04\x1d\xf0\xe2_T\xc8\x04\xe6\x14T\tĒ\x9b\xca@\xc1nMA P\xc1+g\xff\xb3\xd3\x1cA8mY\xa1P\v\\\xf7Y'\x14\x1cV\nBCo\x00\x9d\x81\x1a\xb7\x10H\xf7\x80\xc6\x1dhK\"q\x02\xbfr \xb0n\xc93(E|\x9cM\xa7++]\x88\x15\\\u05cd\xb3\xb2\x9d\x16\xec$\xd8E#\x1c\xe2\xd4К\xaa)z;Nv:IaY\x9b\x1fB\x1b~\xf1\xfa\xc00\xd9\xea\xe9D\t֭v\xc3)P\x9e\x85Y\x03\x05l\x04l\x97es\xf7hꐂ\xf0\xf1\xaf\xf3G\xe86M\x88\xf7!N\xe0\xee\x97\xc5=Ί\x8buK\n\xf9\x9c\x96\x81뤑\x9c\xf1l\x9d\xa4?\x8aʒ\xebc\x1c\x9bEmE\x0f\xf6\xdf\rE\xd1\xe3\x98\xc0\r:\xc7\x02\v\x82\xc6\x1b\x142\x13\xb8sp\x835U7\x18\xe9[\xa3\xac\x80Ʊ\"\xf82·\xd9\xdf\x17\xcc\xe0솻\xfc\x1e<\x90\xa3\x94\x9d{*\xf4x\x14#]g\x97\xb6H\x01\x0eK\x0e\x80\xc7\xe2\x93\x03\xb5C\x89\xa7_N\xe6\xb9p\xc0\x15\xfd\xc2\xc5A\n?c\xd3\xfb\xa1\x15\x9dUZ\x92r\x12R\xab\x1ab\x96\x81o\x91\x01&\x03\xfd\x83>w\xd8\xf0l\xb5\x1d\xb4\xf4\xa7\x87\xbb\xae\xc2v \xb56\xcb\xf1\x8eg\x11\xd1oi\xa92\x0f(勻^\xdf-\xf36\xa9\x00\t\x03\x82\xb7TP\xafp\x83uQ\bM\x1e\x1cP\t\xa0\x89\x1b\xa8\x95\u007f\x93\xcbM[\xd5\xf6\xc5^\xb1\x06̷\x17\xfc}\xfe\xe1~\xfa7ζ\x0e\xeaĢ\xa0\xa8jP\xa8&'o 6E\t\x18\xd5\x05\x1b\xc8\xccufR\xa3\xb3K\x8a2iw\xa0\x10?\xbf\xfb2\x84\x19\xc0\xcf\x1c\x80\xbeb\xed+z\x036\xa3\xbc\xab\x9f]\x80ؘ\x81\xd8郍\x95\xd2\x0e;\x8e\x1aH\xadÛ\xe4\xa8\xe0\x13\x01\xb7\x8e6\x04\x95}\xd2{[Kȁ\x89\xff\xd5l\xf8\xdf\u0560\xce?\xe4$\xbdR\x91\xabl\xd8\xeeF~\xb8\xfd0\xcbVi\b\xadR%\xd5Kmi\x95Q(\x95\xc8\x17\xa5\xc6d\x82\xa3\xc9\xc1!\fE\x89n\xa0\xb0B\xa2$\t\xdde#M\xa0\xc9\xf5k\xb3\xf5\x98%t\xdf\x00[8.\f\xdf\xe7νȋĭ_\xf4\xe2\xfe |\xcfz\xf1\xd4,(8\x12J\x8e\x18.\xa2\xfaP\x90\x978\xe55\x85\xb5\xa5\xcdt\xc3\xe1ɺ\xd5X\xe3n\x9c\x0f>N\x13Q\x9f\xfe\x90\xfe\xf9M^D\x8fŅ\xae$\xd1\xef\xe1\x8f\xee\x13\xa7\xafv\xa7c\x8d\x97^B\xd7\xf3\x96\xe8\x1c\xaf\xd4\fؔ\xb6(;ƿ/\x96\x83)Q\xa3\xc9\x15\x16\xdd\xf6[G\xa9\xe2\xd6\x04\xdd~;N+\xb8\x1a\xa33\xfa\xffh\xa3\xe8\xf8\xab\x81j\xec\x05)\xf8ϻ\xdb\xef\x13\xbb\x8d}u\x02\x0e\xd2\xdd\x1c\x02\x9e\xef\x8c·\xb4\x14Β\xa5\x8f=ю\xb6\r\xf0ĝ\xcc\xc5\xed\xe8S\x8f\xb0\a\xed`u\xf7@\x90\xf5\xb4-O\x81.=\x99i\xce\b\x83\xb1\xd1Wx\xda\xf3t.$&\xa1)\xa3)\xbd\x8f\xd6.M=\x854\xf5\x9a7\x88d\xcd-\xbbAJ\xdb\xe5\xa7u\xf2\xe7?=\xcb8\xac\x13Z\xf5\x8az;\xab\x00\xbeW\xfd\xdfZ\xf7\xb3\x17kt\xe8c\xc9rw{\xf6\xb4\xe7;\xb1.\xca\xf7\xa4%ծ\xf4\xaa\xd7\nuG\u07bf\xd2\xf2\x97\xc3\xe0\xe2ԋ\x82A.\xbb<\xe6=\xd1\x17\ue364\x97\xcc\x04\xe6\xe41\xa0\x9c\x06fzܽ9\xfe\xe9\xe3\rD\x9b\x1e\xbd\x94\xfbd2\x94\x1b٨\u05c9R;\x0e9VO5\xf6.\x82^\xe1\xef\x9b\xfe=j\xfe@<\x1c\r\xad\xbb\x9f\x91\xd6o\xf7\u007f\xa5\xb8\x1c\xb7\xbf\xfb\xa4\x89\xd6-s\xb0y\xfbfڎ\xeci\b\x16J\xd9\xc9\xdc\x1f\xff\xf2s\x95\x1fB\xba\x9frҟ\x05\xbb\xccf\xe3\f>\u007f\x19A\xfb\x92\xfa\xa9\xb3C\a\xff\x1f\x00\x00\xff\xff\r_=\xe6\xf2\x1a\x00\x00"), + []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xbcXOo\x1b\xbb\x11\xbf\xebS\f\xfc\x0e\xee\x03\"\tI\x8b\xa2\xd0\xed=\xbb\xafP\xfb\x92\x18\x91\x9bK\x90\x03\xb5\x9cղ\xde\xe5l9\xb3RԢ\u07fd\x18rW\xd2J+Y\x0e\x02\xebb/9\x1c\xfe\xe6\xc7\xf9G\x8e\xc6\xe3\xf1\xc8\xd4\xee3\x06v\xe4g`j\x87\xdf\x04\xbd~\xf1\xe4\xe9/!S\x132\xbc\xc7\xdcy'\x8e\xfc\xa8B1\u0588\x99\x8d\x00\xb2\x80F\a\x1f]\x85,\xa6\xaag\xe0\x9b\xb2\x1c\x01xS\xe1\fj\xb2k*\x9b\n\x03\xb2P@\x9e\xac\xb1\xc4@\x13G#\xae1S\x1d\xab@M=\x83\xfdDZ\xcc:\a\x90\xc0<\x90\xfd\x1c\xf5|Jz\xe2T\xe9X\xfe18\xfd\xbbc\x89\"u\xd9\x04S\x0e\xe0\x88\xb3\xec\xfc\xaa)M8\x9d\x1f\x01pF5\xce\xe0\xe6f\x04\xb06\xa5\xb3\xd1\xd0\x04\x8aj\xf4\xbf<\xcc?\xffq\x91\x15X\x994\bP\a\xaa1\x88\xeb\xb0\xeb\xef\x80\xf5\xdd\x18\x80E\u0382\xab\xa3F\xb8UUI\x06\xac\xf2\x8c\fR \xac\xd3\x18Z\xe0\xb8\rP\x0eR8\x86\x80u@F/\x11ҁZP\x11ざ\xff\xc2L&\xb0\xc0\xa0J\x80\vjJ\v\x19\xf95\x06\x81\x80\x19\xad\xbc\xfb\xcfN3\x83Pܲ4\x82-u\xdd\xcfy\xc1\xe0M\xa9$4\xf8\x06\x8c\xb7P\x99-\x04\xd4=\xa0\xf1\aڢ\bO\xe0=\x05\x04\xe7s\x9aA!R\xf3l:]9\xe9\xfc,\xa3\xaaj\xbc\x93\xed4#/\xc1-\x1b\xa1\xc0S\x8bk,\xa7\xa6v\xe3\x88\xd3K\xf4\xcd\xca\xfe\x14Z\x1f\xe4\xdb\x03`\xb2\xd5\xd3a\tίv\xc3\xd1Y\xceҬ\xbe\x02\x8e\xc1\xb4\xcb\x12\xdc=\x9b:\xa4$|\xfa\xeb\xe2\x11\xbaM#\xe3}\x8a#\xb9\xfbe\xbc\xe7Yyq>ǐ\xce)\x0fTE\x8d\xe8mM\xceK\xfc\xc8J\x87\xbe\xcf17\xcbʉ\x1e\xec\xbf\x1bd\xd1\xe3\x98\xc0\x9d\xf1\x9e\x04\x96\bMm\x8d\xa0\x9d\xc0\xdcÝ\xa9\xb0\xbc3\x8c?\x9ae%\x94\xc7\xca\xe0\xf3<\x1f\xa6\x80\xbe`\"g7\xdc\xc5\xf8\xe0\x81\x1cG\xed\xa2\xc6L\xcfGI҅.wY\xf4p\xc8)\x809\x91\x9f\x1c(\x1e\n=\xfd-M\xf6\xd4\xd4\v\xa1`V\xf8;e\aA|\x06կC+:X\x9a\x98R\x18b\xab\x1a8I\x1e\xa9\x04(\xbb\xa5\x9b\x02\x03\xc6\x15\x9a\\\\\xa6\x9eC\xec\x84\xc2V\xd5FS\xec\xe4h\xfd \xed\xd1P\xb2\x17\xe1?P\xeb\xe3\x01s\f\xe8ՃSl\xd7\x143\x80\x18\xe7;OO9\x0f\x84N\xd0/\x13\xda!h稆\xb3\xd9n\x10\xe8/\x0f\xf3.\xc3u\x8c\xb6\x90\xe5xNj\x84\xe8/wX\xda\a#ų\xbb\xde\xce\xf3\xb4ML\x00B`\xa0v\x98a/q\x82\xf3,hl\x1a\x1cP\t\xa0\x81\x13\xb0\x95\u007f\x93½\xcd*\xfbd\xabT\x83I\xd5\x03\xfe\xbe\xf8\xf8a\xfa7JX\au\x9a,CV5F\xb0B/o\x80\x9b\xac\x00\xc3j\x82\vh\x17:3\xa9\x8cw9\xb2L\xda\x1d0\xf0\x97w_\x878\x03\xf8\x8d\x02\xe07S\xd5%\xbe\x01\x97X\xde\xe5\xaf\xce?\x1c'\"v\xfa`\xe3\xa4pÆ\x1b\xf5\xa3\xd6\xe0M4T\xcc\x13\x02\xb5\x866\b\xa5{Һ\xa9\x11|\x00\xf1\xbf\x1a:\xff\xbb\x19\xd4\xf9\x87\x14\"7*r\x93\x80\xed*\xd2a\xc4\xed\x01Ja\x04$\xb8\xd5\n\x03\x0e\xb3\x19\xf3\xae&\xb8\x9f\x81\x82\xda\xee\xe9@AT\xabg\x96\xf2\f\xda\x13\xc0_\xde}=\x83\xb6\xcf\x138o\xf1\x1b\xbc\x03\xe7\x13+5ٟ'\xf0\x18=b\xeb\xc5|\xd3}\xb2\x82\x18=\x90/\xb7\xc3h\t\n\xb3F`\xaa\x106X\x96\xe3\xd4\tXؘ\xad\xda\xdf\x1d\x97z\x98\x81\xda\x04\xe9\xd7\xfaA\xad\x8f\x1f\xef?\xce\x12*u\xa1U\xcccZTr\xa7\x15]Ky*Tꓑ\x8e&9\x87\x10d\x85\xf1\x03i\rbK\x10\xd9\xcd\x1bi\x02Nn_\x1a\xad\xc7U\xba\xfb\rT\xeb\xe3\xc4\xf0:5\xef*+b\x83\xfb\xac\x15\x1f\x0e\xdc\xf7\xa2\x15O\xcd\x12\x83G\xc1h\x88\xa5\x8cՆ\fk\xe1)\xad1\xac\x1dn\xa6\x1b\nOί\xc6\xeaw\xe3t\xf0<\x8d\xcd\xf2\xf4\xa7\xf8绬\xe0\xdadW\x9a\x12E_\xc3\x1e݇\xa7/6\xa7\xebڮ-B\xb7\x8b\xb6\xcf8^\xa9\x11\xb0)\\Vt\x1d\xf7>Y\x0e\x86Delʰ\xc6o\u007f\xb4\x97*oM\xd0\xed\xb7㸂ʱ\xf1V\xffgǢ\xe3/&\xaaqW\x84\xe0?\xe7\xf7\xaf㻍{q\x00\x0e\xb6\x9b\xc9\x05j\x9a[\xa5/w\x18.\xf6J\x9fz\xa2]\x8f7Х\xedd\xaen\xd3؛\x9a\v\x92\xf9\xfdE\x04\x8b\x9dX\xb7\xfb\x9e\xf2\xb69\xeb4\xa9G^\xe8\xca\xce\"Ij.\xa2H]\xf5P\x8f\xdbbH\xfd@\x1c\xd1\xfe\xf2\xbb\x90\xe8\xddF\x9b\x98C$\xe3\xe1\xfe\xbc'Q\x93\xed}\xf7Ϸ7\xb5'\xbd7\x9c\x8cx\xf6\xaa\"F\x1a\xbe\xfe\xb2\x12\xc5;\xceR|J\xab$V\xe6ﺮd\xa4\xadZ\xffE\xe5\xd2\xc9ݝ\xca\xc7\xdb}\xb0\t\x97\xb8\n\xe3] \"\x80\x8d\xe1n\x8b\xd3s\x83\x03miaL|\xaa\fml\xa5\xb4\xcbˍ+\xd1\xc2\xee=\a\x1e\xf5\xb6\x16\ufff7\xa7\xa9\xb1S\xd30\xdax\x8b\x1b\x00|\xbc*\xa7P\x19\x99\x81\xdeyǪ\xe0h\xde7ei\x96%\xce@Bsɤ\xfbS\xbb\x00̒\x1a\xd9]\xa0ڀhͿ\xe5\xf6į\xbf\xbe\x15\x86/\x83xP\x89!\xbf\xda\x05\xe5%ǂx7i\xaa\xe3-\xc6\xf0\x017'cs\xff\x10h\x15\x90\x8f\xcf`\xdc\x1d\xd4Is=\x86ߢ\a\\mp\xbb\xc1e\x9b[!(\xa8\xec<\x97Ĕ\xe0\x9bj\x89A\r_n\x05\xb9c\xa0\v\xf4\xd3\xfbg\xech\xf7\xbc\xed\xd7w\xd9*)j\xfb\xf3\xcc\xf8\xf8\xbe\xa2\xde)\x04\xd6q]\x9a\xd3\x06\xbd\xb3!\x96=uN\x8d\x90\xbd_tѥ!\x1d\xe7^rc\x8ep\xee\xc9\x0f6`](8/\u007f\xfe\xd3\xd9\xfa\xe8\xbcગ\n\xdbY\xa5\xf0W\xd5\xff\xa3u\x9f-\xbe,&\xc8u\xa9k\xd1\x13}.kE\xc5C9\xeb0\xfd\x9c\xa6\x9b\xfe&\xaf\x91i\x06\xa89\x1aZw\x8f\xf0\xeb\xb7\xfb\xafxD\xe3\xf6\xd55\xb5#\xfb\x82e2\xed\xb5\xd0~8~6\xbf\xb9齂\xc7ό\xbc\x8d\x0f\xf9<\x83/_G\xd0>@}\xeep\xe8\xe0\xff\x03\x00\x00\xff\xff\xc8\xe0\xe2+0\x18\x00\x00"), + []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xacV\xc1\x8e\xe36\f\xbd\xe7+\x88\xeda/u\x82E/\x85o\xed\xb4\x05\x06\x9d\x19,2\x8b\xb9\x14=02\x9d\xa8cK\xaaHe\x9a~}A\xd9N\x1c\xc7\xc9\x0e\x16\xf5\xcd$\xf5\xf4\xf4HJ\\\x14E\xb1\xc0`_(\xb2\xf5\xae\x04\f\x96\xfe\x11r\xfa\xc7\xcb\xd7\x1fyi\xfdj\xffiC\x82\x9f\x16\xaf\xd6U%\xdc%\x16߮\x89}\x8a\x86~\xa1\xda:+ֻEK\x82\x15\n\x96\v\x00\x13\t\xd5\xf8ŶĂm(\xc1\xa5\xa6Y\x008l\xa9\x84H,\xd6D\n\x9e\xad\xf8h\x89\x97{j(\xfa\xa5\xf5\v\x0ed\x14d\x1b}\n%\x9c\x1c\xddjV\x1f@\xc7f\x9d\x81\xd6\x03\xd0!\xbb\x1a\xcb\xf2\xfb\xac\xfb\xc1\xb2\xe4\x90Ф\x88\xcd\x1c\x91\xecf붩\xc1x\x11\xa0\x1b\xb0\xf1\x81J\xf8\xf0a\x01\xb0\xc7\xc6V\xf9\xa8\x1d+\x1f\xc8\xfd\xf4\xf9\xfe\xe5\x87g\xb3\xa3\x16;#@\x88>P\x14;\x90\xd7o\xa4\xfb\xd1\x06P\x11\x9bhCF\x84\x8f\n\xd5\xc5@\xa5J\x13\x83\xec\b\xf6\x9d\x8d*\xe0\xbc\r\xf8\x1adg\x19\"\x85HLN2\xa5\x11,h\b:\xf0\x9b\xbf\xc8\xc8\x12\x9e)*\b\xf0Χ\xa6\x02\xe3ݞ\xa2@$\xe3\xb7\xce\xfe{Df\x10\x9f\xb7lP\xa8\xd7n\xf8\xac\x13\x8a\x0e\x1b\x15!\xd1\xf7\x80\xae\x82\x16\x0f\x10I\xf7\x80\xe4Fh9\x84\x97\xf0\xe8#\x81u\xb5/a'\x12\xb8\\\xad\xb6V\x86J3\xbem\x93\xb3rX\x19\xef$\xdaM\x12\x1fyUў\x9a\x15\x06[d\x9eNru\xb6\xd5w\xb1\xafB\xfe8\"&\a\xcd\x0eK\xb4n{4\xe7j\xb9*\xb3\x16\vX\x06\xec\x97utOj\xaaIEX\xff\xfa\xfc\x05\x86M\xb3\xe2\xe7\x12gqO\xcb\xf8\xa4\xb3\xeab]M\xb1\xcbS\x1d}\x9b\x11\xc9U\xc1['\xf9\xc74\x96ܹƜ6\xad\x15M\xec߉X4\x1dK\xb8C\xe7\xbc\xc0\x86 \x85\n\x85\xaa%\xdc;\xb8Ö\x9a;d\xfa\xbfUVA\xb9P\x05\xbf\xae\xf3\xf8\x128\x0f\xec\xc49\x9a\x87&\x9fMȴm\x9f\x03\x19͏\x8a\xa4\vmmM\xaep\xa8}\x04\xbc\x88_\x8e\x80\xe7ZO\xbf\r\x9a\xd7\x14\x9e\xc5G\xdc҃7\xa3&\xbe\xc2\xea\xe7\xb9\x15\x03-\xbd\x99\xba6\xa4\xf9\xc0\t2\x80\xecPF\xfd'hݱ\x89g\xceqU\xf2,;j3:t\x86~˥\xe2\xcc\xe1\xe6Y\x1eg\x16\xe8Qv\xfe\r|-\xe4Ɛ\x03\xcb\r]\x1c\"&\xf7n\x92\xddUz_iiՖ\xe2M\x82\xebI\xf0\xa0s\x9d\x9a\xa6G*\x8co\x03\x8a\xdd44\xf4m\xed\xe3\x05E\xdba\x1c\xba&\xfe6}\xf7\xbeI-=\xe9\xeb\x13\xd0\xd0M\xe6/\xe7\xb1\xe3\x02\xe9\f=\t=\x02\xc4\xf3\x97k\xfc\xf55\xc1\x10|\xd5\x13苖\xf5\x9c\xef\xe4\xaeɵ\x91\xce.\xbfb\xbe\xf8\xcf\"\xe6*\xea,`\x9a\xcd3\xe7D\xaf\xaf^\x06\x82\x92\xf8\xfd\xd7A\x0e\x1f\x845)Fr҃\xe4w\xee\x9b.\x84\x06YFm\xa1\xa3\xcb\xcd\x9f5b.\xad\xf4\xde\xcdɥv\xbaE\x01O\xf4va[\x13VӞ+\xe0\xc9˜\xe3ʙfjyb\xda\x0f\x83\xf5\xfe\xd3\xe9/\xd7]\xd1O\xc2\xd9\x01\xc0:'T\xa3\x14sכ\xbd\xe5\xd4 h\f\x05\xa1\xeai:\t\xe7q\xf44\xd8\xe6_\xe3]\x95\x87s.\xe1\x8f?\x17\x1d*U/\x03\x0f5\xfe\x17\x00\x00\xff\xffT\x83\a \x04\f\x00\x00"), + []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xd4YIo+\xb9\x11\xbe\xebW\x14\x9cÛ\x01,\x19\x0f\xb9\x04\xba9~\x0e ̌c؆r\br\xa0\xd8%\x891\x9b\xec\xe1\"[\t\xf2߃\xe2\xd2{\xb74\xc8\x04\x93\xf4E\x10\xbbX\xac\xfaX{/\x96\xcb\xe5\x82Ub\x8b\xc6\n\xad\xd6\xc0*\x81\x9f\x0e\x15\xfd\xb3\xab\xf7?ؕ\xd0w\xa7\xaf;t\xec\xeb\xe2]\xa8b\r\x0f\xde:]\xbe\xa0\xd5\xdep\xfc\x86{\xa1\x84\x13Z-Jt\xac`\x8e\xad\x17\x00\xdc \xa3\xc57Q\xa2u\xac\xac֠\xbc\x94\v\x00\xc5J\\\x83A\xeb\xb4A\xbb:\xa1D\xa3WB/l\x85\x9c\xb6\x1e\x8c\xf6\xd5\x1a\x9a\x17q\x8f\xa5w\x00Q\x86\x97\xb8=\xacHa\xdd\x0f\xed\xd5\x1f\x85u\xe1M%\xbda\xb29,,Z\xa1\x0e^2S//\x00,\xd7\x15\xae\xe1\xe6f\x01pbR\x14A\xf6x\xa0\xaeP\xdd?o\xb6\xbf\u007f\xe5G,Y\\\x04(\xd0r#\xaa@\x97\x0f\x06a\x81\xc16\bN\xdc\x03@\xe0\x8é\xc1ʠE\xe5,\xb8#\x02\xab*)x8\x05\xf4>\xb1\x84z\x8f\x85\xbd\xd1e\xc3k\xc7\xf8\xbb\xaf\xc0i`\xe0\x989\xa0\x83\x1f\xfc\x0e\x8dB\x87\x16\xb8\xf4֡Y%6\x95\xd1\x15\x1a'2b\xf4\xb4\xae\xb8^\xeb\xe9\xf0\x85\x94\x8c4PХb\x14\xf5\x14װ\x00\x1b\x00\x00\xbd\aw\x14\xb6Q)\xa8\xd1b\vD\xc2\x14\xe8\xddߑ\xbb\x15\xbc\xa2!&`\x8f\xda\xcb\x02\xb8V'4\x04\t\xd7\a%\xfeQs\xb6\xa4 \x1d)\x99\xc3t\x85\xf9\x11ʡQL\xd2\xf5x\xbc\x05\xa6\n(\xd9\x19\f\xd2\x19\xe0U\x8b[ \xb1+\xf8)\\\x89\xda\xeb5\x1c\x9d\xab\xec\xfa\xee\xee \\6j\xae\xcb\xd2+\xe1\xcew\\+g\xc4\xce;m\xec]\x81'\x94w\xac\x12\xcb \xa7r\xc1\x11\xca\xe2w\xf5\xdd|i\t\xe6\xced7\xd6\x19\xa1\x0e\xf5r0\xd1I\x98\xc9T\xa3\xa1\xc4mQ\xdc\x06MZ\"\x10^\x1e_\xdf\xdaF$l\x17\xe2\x00nˮ\x1a\x9c\t\x17\xa1\xf6h\xe2=\x05S\"\x8e\xa8\x8aJ\v\xe5\xc2\x1f.\x05\xaa.\xc6\xd6\xefJ\xe1\xe8b\u007f\xf6h\xc9R\xf5\n\x1e\x98R\xda\xc1\x0e\xc1W\x05sX\xac`\xa3\xe0\x81\x95(\x1f\x98\xc5_\x1be\x02\xd4.\t\xc1\xcb8\xb7\xe3M\x970\x82S/\xe7\xc82z!\xc9w_+\xe4\x1d\xbb\xa7Mb\x9f\x9dt\xafMǵi˪\xc5r\xcc\xe9艞\xfbD1\xaf\xb3\xde\x13\xe2\x8f5\x19\x99\x06\x1d\xef\x95\xf8\xd9c\x88|\xd1\xe3p\x18\fL+\n\xb6\x1f\xba\xf1Uou\x14Az\xf0\x93K_`A\x87ۊ\xf1\xbe\x06=I\x1f\a\xe4\xe4Ў\tE&M\xb1\x98\xc4U\xcd\xdb\x10\xfe؈\x94dVBEn TPq\x04Yz\x84\xc3r \u058cN\x10\x92\r\xdbI\\\x833\xbe\u007fv\xdcnja\xe7Q(rn\xbb\x0e\x89\x9a:y\xb5\x14<\\Y\xed\xbb\x01\x8c\xff'\x1c\x924\x0f1\xaf\\\x87\xc6f|Ov#\xb4\xf0qDwD\x93\xd3\xd52$\xddb\xa0L\x93\x03S\xbe\xd8a\x03\x0f\xb9!\xd7ʊ\x02Mt\xcc\x1e`\xb0\xd9\x0f\x01\xf6Rޒo3/]L2\xc6\x0f\xb0\xbd\x02\xa9\x9d\xd6\x12\x99\x1a\xc3\xeaZ\xf7\xd9\f\xc8{VS{N6\x1b\x9d\x8f\x18\xe8\x15\xa3\\\f\xf0\xa48`Y\xb9\xf3-0)\xdb\x0e\xc8L\x03\xe0okPW:֦O}\xc1\xb1\xa6\x11\x1a\x1aG\x1b\xa3\xc6\xd2\x12]\x8a\xac\xff\x03\x80I\xb6C\xf9\x8a\x12\xb9\xd3f\x16\xac\x1f۔\x11(ʋ\xa7\xaf\xab\xee\x1b\xa7a/\xa4C\x03\x1f\xc2\x1d\a\n|\x1cQ%\x9c\xa8\x00\x11\xaa\x10'Qx&;V\xd6B\xa9\x01\x13\xb4\x01%\xe4\xed\x80'a\x9cww0\x85?\a\xe1\x99\xfcE>8\x95b\xe9)\x99\xe3\xc7\xc7O\xaa\x85B\xe72\xa4\xe8\xc1\xd6\xdf\x10\x91\xcb\xe9+\xc0\x0f6cG\x05\x910X\x862k\x843\xc0[\xb0\xb2\x86*\xe8{\xff\xf4mh@0mD\x03!\xefg\x04I>Q_/e\x97\x9c\x88G9C\xaa\x8bo\x81\xc1;\x9ec\tMUzE\xa14\xb30\x18\x8a\xefp\xd1\xefx\x0eD\xa9\x9e\x1e\xe5:w)\xf1y\xc7\xf3ԫ\x9e\xbat^\xaa~\xa2\u07b4\x10\xa4\n\xf5XV5\xf4N8\xa5$=N\x8f\v\v\U000de69f\x8cȕb\xd7\x00\xb6z\xbc\x00\xf1\x17\x1b\xe1$\xfb:\x8aؾ\xcdHm1\xd8^\xee^\xb6ԇ\xd6̣Em\xd4-Ü\x11\x0fM\x89\x96Ud\xd9\xff\xa4p\x1a\f\xe5_P1a\xec\n\xeeØI\x8e\xdfl\x9b>U\x1em\xd6\xc4UX \xccOLR\xa8\xa7\xc0\xa1\x00e\b\xfc\xa3,\xf5~\x90\xd1n\xe1\xe3\xa8m\x8c\xe2{\x812\f\x1dn\xde\xf1|s\xdb\xf1<\x10\xe3\xa1\xf4f\xa3nb\x92\x18\xf8A\xdd\xf0i%\xcfp\x13\xdeݬ\x06Ip\x94\xedlb\x9c\xb1\x88\xc9Wu\xa5\xfb\x13\xab*\xa1\x0e\xfd{\xbe\xce\x16f\xec\xa0c\x03O\xbd\xd3:\x86\xd0.K;%\xfc\xf0\xb88\xc4\x1b)\xf6M\x1e%*\xa7Wp\xaf\xce\x03\xae\x96:ƑR\xb7\xdbA\x92H\x1fBJ\x8aJ\x89g\x11\x98\xb6\x19\xa5\xc1\x82ee\xe4?>4\x18\x01=q|\xde\xceW\xf2/5\xd9H\x1f\xd8R\x96*\xc5Z\x81\xe7\xed\xd0rB\xf1i\x15\xab\xecQ;\xf8\xee$X\x1abi_TF\x9f\xa8\x1f\xfc\xfeW\xea\xe8,?b\xe1%^\x1cڼ\xb6\b/\x8fm2ۡ-48ԝ\\F\xab\x88\x1e\xd8\x1d\x0f\xa5\x16&\xf1\xa5K\x1ek\xa2k\x86\xd1\x1c\xb4\r\x13W\n'\xd6s\x8e\xd6\xee\xbd\xcc\x1dO\x98\xd6S{\x1dɅ\xad\xa5\xbdr\x8c4\x96!\x96\xad\xe1\xd7\xc5\t\x9dc\xceۋ3\xba@\x05\x9cUΛT\xa4roLP*\xbe\xd3\xfb\xc1\x98\xee\x8a)\x1d\x1a\xa3ͅiO \x89\xeeεW\xa1V#\xbb\r{\xa1Dk\xd9!\x8fy>\xd0 \x1cPQ\x84\x1d\x19q\xa4:\x00?\x91\xfb\xf4\t\xa0ۧR$e\xdcQ\xfb\x15E\va\xb3v⩜I\x04\xec0qgB9<`7\x13\uf650\xde\xe0\v2\xdb\xfd20P\xffOm\xcaT\xdaE\xcdc\xe7\xc1\xbc\xc5\"M\x99\x9d089\x9b\xa4>\x94\x89A\xe77\x19\u007f\xab#\xb3\xf3n\xf8L\x14\xd9\xff\xda\xe6P{\xe0˨,\xa8|\xd9g\xbc\x84'\xfc\x18\xac\x91\xf2Xl\xeb\x0fC\x03\x82\x8dz6\xfa@\x99w\xf0\xeaA\x97\x95ġ\x15,\xe1\x99\x19'\x98\x94\xe7\xc8~\xe2\xd4kqj>[=^6\xe6m\x8f\xb87`!\xb3n\xf8e\x13\xfcN\fGk\xe9;\xd6N\xe2\xf7\xbf͠\xe4\x83\x19%\xd4a^ݿ$\xa2\x11\xefM\xfb\xff{\xfe\x9b\x05\xecz\xf0\xc4,\xef\x97z\xf0H,\xed-\x9d\xf2\x87\xdd\xd3\xd7\xe6_@k\x99\xbeĆ\x17\xd4}\x9a\x13\x16-\xec\x93(i\xa5\tЌs\xac\\\x9a`\xb6\xbfɆ\xaf\xa7\xcdG\xd7\xf0\x97k\x15\xab/\xbb\x86\xbf\xfem\x01\t\x81m\x96\x83\x16\xff\x1d\x00\x00\xff\xff\xf2\x9dI\xf7\x84\x1e\x00\x00"), + []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xec\xca4h{\x8fzS\x14\xa4\x86/IV\xa6\x98~#\x93_\x88dhL\x0f\xf1\x9b\xb3)dy\x9c\x90\x8ahLށ6\xa0\x9a_ɢ\x0e\x00\x05\x10\x06\x81t@*\x0f\x11$o\x10v\x83\xe4\xa6&\x1d\xe6\x83\x18Np\xc37\xf2\x87b\x97\xe1\x06\x9c)\xcfiX\xcd\x17ƈ\xd3(\x95*7\x1cO\xa4zF\xb0L\x99L\x90\xc8S\xdb\x1f\xa6\xd3o\x80D\a\xad\x9f\xe6\xc9\xf2'\x1a\xd5\xd8VH8\xba\x81\x1d\x1e\xc4Qjc\xfb\xde\x17_0)\x1d\xa6ôq\x90\xca\xfd\x1e\rA*\x0e¢\xadTg\x9cԎ\xae\x01\xa3\xdb\xdf\tK\x81\x97\x17_C\xc1aX,e\x17\xd0؋\xab\t\xe05w|\xa0\x92\x89\x1df`1\xc3\xc4i3F\x96y\xa6\xfb\x16g\vG\xe89`\x15\x83\x9f\v^\xaf\xd9\xe0$P {\xff|\x90\xc9\xc1\a\x19$S\f\tR\x8d\x96m\x81(\x8a\xec4\xbeY\x98\x97\x84\xb0д9hڬa\xe8\xc3\x1c6\x11M\x8b\xb2\xa7M\x9b\xb1\xac]:\xd7\"\xf2N\xe6\xcai\xbcJ\xa0\xb7g\x93\xdfZ\xa0\x89\xc0\x92\xce\x13\xdb=`^\xb8\xd3\x15HW\xf5\xce\xc3\x14Y\xd6\xc2\xe17\xc1\xa8\xd7\xe8ö?\xf7\x8d\xf5\xe1\r\xb8T\xa3\xf0?\xcd$v6w\xc1\xd7,`\xd0\xd7\xf6\xbc+\x90\xfb\x9aA\xe9\x15\xece\xe6\x90\xe3\x9ei\x14[\xaeo\x96SoE\x968\xafI-\x17.9\xdc\xd4\a\xab\xd9\xf1=\n\xf5\xa7\xfbX\xb9:It\x9d\xfc,d\xe0c\xb64\x98\xfb\xc3\xfb=\xeb@\xd3Ñ\xda\xe7o_0\x9d&\x14\xc4J\xe4\xd9v>\xf7Pn/\x1f\x8e\x01\xf1\x9b\t\x01U}\xc2\xf29\x98+\x10\xf0\x84'\x1f\x05\t\x05\xc4(AK\x8d\x1e$Ή\xc4\xc9 6\x11Oxb@!\xbf\x131?^4|{\xc2S\xdc\xc0\x1e)\t\xb3p>\xf64\xa5\x0e&\b'\x12\x96\x90\x118[\xc7\x1a\x02N\xc7l\x12\x96\x98\x9b\xaaU\x9cx\xd5vk6vR\x97Ox\xfa`=\xc3H;\x0e\xb2\x88\xde0\x19`\xb0\xc8zTe\xef\x1eD&\xd3z)\xaf\x0f[5\x15uw\xdb7\xed\xb6\xea\nn^\xa4%\xf4T\n_4\xdao\xdaq\xcfw#\xacG\xffUd\xf5SY\xf5\x947\xf3D\x8fv\x960J\xe8}\xdb\xfa\x13f\xcd*ia\xab\xe8\xac\x14\xe8©]\x86\x19/\x96\x8cR^ZN\a*\xadV\xech\xd7\x03kE\xc3\f\xecѦÝ6z\xade\xa3\xa1ҁΣvO\xbe\xc7C\xf0)\xebL$\x98BZ2QE4D\xeb\x8cp\xf8(\x13\xc8\xd1<\"\x14\xe4\vb\xb9\x11m\x9f}[,s\xb1\xa1AՂ\xa1OcPZ\x91^G\x8d\xab\xd8\x1f1x0K;=8fo\xec\xa09\x8e\x89\xa0\xb6HSNc\x8a\xecv\x91\x97Xĝ\xf3\xf8\xc1\xa3\xe7\xfdk.\n\xd2\xf0\u007f\x91\x8bda\xff7\x14B\x9a(-\xff\xcc\xf7U\x19vf\x87\xac[{!ZCZ \x8e\x1fE\xd6O\xf9\x8flQ\x93\x05\xc2̇\x02z\u007f\x16\xf9\\\xc1\xf3A[\xef\x91\xf7\x12\xb3\xe1\xc4W\xb7I\v\x97Ox\xba\xbc:\xb3K\x97[u\xe9C\x84\xbe\xd6G\x80\xad#\x0e\xad\xb2\x13\\\xf2\xec\xcb_\x17NEKg\xe4@\xbe܌\x0f\xc4\xe9$[E\x134\xb5\xbep\xa3\x10z\x1a\xfbH\xd9,\xb4u\v\x10\xba\xd5\xd6\xf9\x8ch'\xe0]\x96o\x03/W!\xcf\x06b\xefЀu\xdaT\xf7]d${ic⢝;p\x10c\xeb\xec\x9d\aK\x87\xb9\xcbF\xbf\xbd\xfd\xbd\xf4\x17a\xf4\xf7\x1cĄ\x03\x18\x86\\\x18\x9d\xa0\xb5sb\x13e\xe1g\x12\x9buRS\xf8\xc3\x12\xdf8\xcd\n\xeb\\\xb2\xb5jKBa\"\xe7\xe2\xe3\xc4\xcdK+/K\xe6\x83\xfe\x9f\x17\xd9\xe5\xd8\x01k}\x9e\v\x15\xe5\xc0\xce\x10\xbd\xf6s+\x15\v\xa0\xfc\x11\xc5<\x96l.\x96D\xaeA\xf8~\x9c` \x97jˋ\xc0\xa7\xef\x12>\xd4F\x17_w|\xb8\xaef7,\xa8;\x86\xaf\x0e\xc7Z\xa1\xf9\xbe\xc2`\x87\x93\xe7Y\xfdEa\xb3Ү\x9d\xfa ȅN?X\xd8Kc]\x83l4Li\xa1\x9c\xb5 M[~\x96S7Ƽ\xf2(\xf7\xb3\x9f\xdbJ\xc6\x1d\xf4s}\xcd̈́\\\x10u\x1f\xc4\x11A\xeeA:@\x95\xe8Rq҈\x8c\x01/\xe2\xd9\x11/\xc8\x10\xeb\xf7\x9a\x86\xaa\xccc\t\xb1bI\x94j&\xbfԞ\xf0G!\xb3\xef\xc5F's\xd4\xe5\x8ccnZ\xf7\x96\xde\xcf\xed\xd4/\xe4\xe2E\xe6e\x0e\"'FD\x93\x9c\xa2\r\x99cW\x06\xe0YH\xc7\x1e\x89 \xb3{r:\x1ad\xa2\xf3\"C\x87\xb0ý6\xac\xefV\xa6X\xbb\xfe \x17z\xfcޱ\xdf\x04\xec\x85\xccJ\x13mu\x17rc\xd9\t)\x18\x9e\xb7=\xf8Ģ\xb0b\xf2E\xa5\xa3\xa3C\xda9OP\x98%\x01\xed\xad\xc1\xb7\x0e\x1f\v#I\x16\xf5\\\x049\x03\x91\xe3\xcbn\x04\x19DT\xa8\xd3X\b9\x03\x93\xb1x\x0f!\xdfC\xc88\xb8\xef!\xe4{\b9\xdf\xdeC\xc8\xf7\x102f\xc2{\b\xf9\x1eB.G\xe1\xbf\x1fB\xcec\xb6\xe2\xdc\xe7\xe8\xcf\x11\xd8D\x95\x10L#;\xb9J\xa8\x86\xb9\xceJ\xeb\xd0\xc4\xd7\xdcn\x87\xe7\xb5\xec\xe7\xf3\x01\xdd\x01\r$~Ȋ\x1f\xa1\f\xcbFSnѸ\xac\xba\b\x97\x94\xadR\x14_\xc5>\x1b\x1dG\x16\xd7\xee\xb4\xceP\x9c+[\\)\xd7\\\x01W\xb7\x06\xb9.\x9e\xaa\x8a\x90\x87\xadFX:p\xcb?{hW\x03u\xeb\xb082\xaf\xb0\xfd\x81ꓣJ\xacf\n\xab\xa6K\xb8u\xb5\xc6\b\x15;\t\xf8.\xf9L\xa7\x8c\xf8\a\xa4\xdel\xed\xd3x\xc5S\xb8\x91C'\x8e\x9f\xd6\xdd_\x9c\x0e\xf5O\xf0,\xddapS\xfc2\x83\x8e\x8b\xea\xb1]\x18]\xc9bx\xd7ԧ*h\x03Jf\xc35\rD\xf0j~\x87\xdc\xf0s\xe1\x0f\xa5\xaf\xd2߹cRl\x8dԫ+\xa3\xbauO\xa3\x06~\xf9\x05ޒ\xb2\xf2\xf8ڧ\xb9R\xa5%\x15O\xedj\xa6\t\x90\xb1uNq'\xdeٚ\xa6WT2E\xd7U\xbe\xc9ue\\\xad\xd2\xf7\xa8PZP\x97ԭ7\x9a\x81\xbb\xac\x1a)\x92L1\x95G\x8b\xeb\x8dBm\xcf\xcc~\"\xaa\x8cF\xab\x87f@\x0f\xd41\xcd\xd7\f͑\xbf\x83ʛT\n\xbd\xa2>\xe8m\xeb\x88\xdf*Ɦ\xf6\x89\xa8\xf1\x89\x88\xcb\xe70\x8d\xa8\xe2YV\xbb\x13A\xc3W\xd6\xe9\xd4U8\xa3k/\xad\xce\xe9\xd6ތ\x82\x8d\xa9\xc9\x19\xa9\xb8\x19\x859Y\x89\x13[g3\n}\xd6}\xcfH\xce\xe4\xcfV\x89\xc2\x1e\xb4{\xd0Y\x99G\xc4\xccw\xdd\xf1\x03G/\x8a\xd8\xc4\x13B\x92\xe92\xad\xe1\x0fo\x8f_\xbb\x9f\xe0\xf6\x81\x9d\v?\xf4K\x9a'\x90\xc1}T\xa1\\\xff\x85\xe4\xf0\x9b]\xf8\xf5G1\xeb\xb4\x11\x8f\xf8U'\xadO\x16LѤ;\xbe\xf3D=0\xbfJ\xb6\x84\xaa\xa4\xe1\xb05\xec\xa8\x0f\xaeɱ\xfa(\xb8u^%L\x87\xe5bRs\x9d\xcbf7u\u007f\xff\xd5o\xc4\xc9\x1c\xd7_J\u007f\f^\x15\xc2X$\xdaV\x1b\xf4\x93vc\x06⠟!\xd3a\xf7?\xf5\xf17\xc8\xd9\\>o/\xdeőE\xb0\x12Ȋ\\\xf3\"\xfc0<\xaf\x15y\xb7\x98\xc6G\xbf1\xd9\x1d\x83$\xacՉ\x14\xfc&T\xba\xf0\x8c\xe3{<\xe8\x1dw\b#J?\xe4\xc7VC\xcf\xcaW\xf5\x1b\xf7\x8b\x19\xa0\xd6\tW\xda\xf9\x8f\x04\xf00HD\xe1J\x13\x92\xa4Ii\xf8i/\x81@\xff\x02v\xf9g\x022a\x9d\x17\xac\xc9\xd7\xf8_\xebaM\x94n\x9d϶V\x9a\a\xcf\xc2\xf2;|\x9fk\x95\xb6\xfb]\x94v\x1by\x89\xbf\xd7&\x17n\x03\xa9p\xb8\"ؽ\xdf'-\xd3(\xb3\xf9\xe9\xf3\xe4\xeeniD}\xa3\x13\xc8\xcaӪ\a\xd3#;\x19Jٯ\xe0\x1b>\x9f\xf5\xdd(B\xbc\x9fK\xf3YyL\x1f\xea/\xbc\xc4n\xaa\xf9&\f_\x82\x9c)@Wg{\x83{\x99\x1a:\xf17\xf0\xfc\x85\x87\x85\xff\x97熖\x8f_\t\xed\xe4w\xbd\xdfF\xb4pB\x03\x87\xb5o@Iz]\xc7\xea\xeb@\xc7O\xcd\u007f\xbc\xf4*|\xce\xe7\xe8\xef\x0e-\x9a#\xa6-Y\t\x9e)\xf44\x9a'\x92\x04\v\x172\x81\xed\xef\xfa\xf0\xd7w\x9a\xcf\xf6\xf0\xbf\x89V>\x06\xb4\x1b\xf8\xeb\xdf. x\x91\x87\n\x0f\xea\xfcO\x00\x00\x00\xff\xff}8\x8d\xbc\xc9H\x00\x00"), + []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xacVM\x8f\xe36\f\xbd\xe7W\x10\xdb\xc3^\x1a\a\x8b^\nߊ\xb4\x87A\xdb\xc5`\xb2\x98Kу\"Ӊ\xba2\xe5\x92T\xa6\xe9\xaf/$\xd9\xe3\xc4qvv\x81\xeaf\x8a\x1fO\x8fԳV\xeb\xf5zez\xf7\x8c,.P\r\xa6w\xf8\x8f\"\xa5/\xa9>\xff(\x95\v\x9bӇ=\xaa\xf9\xb0\xfa쨩a\x1bEC\xf7\x84\x12\"[\xfc\x19[GN]\xa0U\x87j\x1a\xa3\xa6^\x01XF\x93\x8c\x9f\\\x87\xa2\xa6\xebk\xa0\xe8\xfd\n\x80L\x875\b\xf2\tY\xd4h\x14ƿ#\x8aJuB\x8f\x1c*\x17VңMi\x0e\x1cb_ôQ\xe2%\xed\x01\x14<\xbb\x9cj\x97S=\x95Ty\xd7;\xd1_\xefy\xfc\xe6\x06\xaf\xdeG6~\x19Pv\x10G\x87\xe8\r/\xba\xac\x00Ć\x1ekx\xf7n\x05p2\xde5\xf9\xdc\x05`\xe8\x91~z|x\xfeag\x8fؙb\x04hP,\xbb>\xfb-\x81\x03'``(\x01\x1a\xc0X\x8b\"`#3\x92B\x81\x00\x8e\xda\xc0].7$\x060\xfb\x10\x15\xf4\x88\xf0\x9c9\x1b@W\x83CϡGV72\x98C\xa6\xf6\xbf\xdaf\x18ߧC\x14\x1fhR\xc3Qr\x8dS\xb1a\x03\x92\x0f\b\xa1\x05=:\x01ƞQ\x90\xf4\x1a]\xe6\xa4\x05C\x10\xf6\u007f\xa1\xd5j8\xbd\x80\x1cC\xf4\r\xd8@'d\x05F\x1b\x0e\xe4\xfe}\xcd,\x89\x86T\xd2\x1b\x1d\x1b<.G\x8aL\xc6'\xfa#~\x0f\x86\x1a\xe8\xcc\x19\x18S\r\x88t\x91-\xbbH\x05\xbf\a\xc6L`\rG\xd5^\xea\xcd\xe6\xe0t\x1cx\x1b\xba.\x92\xd3\xf3\xc6\x06Rv\xfb\xa8\x81e\xd3\xe0\t\xfd\xc6\xf4n\x9dq\x92\xe6K\xd25\xdf\xf1p\x19\xe4\xfd\x050=\xa7\xb9\x10eG\x87Ws\x1eٻ4\xa7q-\xcd/a\x05\xee\xc4f2%\x12\x9e~\xd9}\x82\xb1hf\xfc\x9a\xe2L\xee\x14&\x13ω\x17G-r\xe9Sˡ\xcb\x19\x91\x9a>8*\xa3c\xbdC\xba\xe6X\xe2\xbes*\xe3P\xa6vT\xb05DAa\x8f\x10\xfb\xc6(6\x15<\x10lM\x87~k\x04\xffo\x96\x13\xa1\xb2N\f\xbe\xcd\xf3\xa5\x16];\x16r^ͣ\xd2,6d\xe1n\xeez\xb4\xa9E\x89\xa7\x14\xebZg\xf3\x90C\x1b\x18\xccRH\xf5&\x86\xec\xfdM(\x06\x05(8f\xba\x90n\xd8[8\x96\x84 ۏF\xf0\xda4C\xf3\x98<敽kў\xadǒ\xa0\xe8\x00\xbe\x05\"-\xa4\xd8\xcd\xeb\xad\xe1#\xbe\xdc\xd8\x1e9$\x15\xc4f\xb6\xb3\xd8\u007f(\xd2~p$_>M\xf1\xc9?\x8bKA\xbd\x10\xd2!\rp$J\x170P2ϒµ\xde\xcev\x9dbw\x83c\x11\xc9\x03\xb5!\xa9\xa0\x9aT\xd2h\xb9\x1684u\xa8Q\x10ݤ\xbb\xd7Ӳ\xe6\xca\xf3\x15\x04\x96\x95\u007f\xd8\xdf\x1e\x98\x94\xc21.\xd4\\g,\v\xe6T\xe9Ƽxc\x06d\xd1{\xb3\xf7X\x83r\x9cG\x968\xc3l\xce\xd7S1\x8e\xd1\xf44\xf9\xe2\x80ܸ\xa7\xd9\u007f9\"ݛpx1\xb2ԛ\x92\x06\xf6\xe7{\x81ۤ\x82\xc1\xfb\xe9w=\xae2\x965$\x91]\xab\xbba\xe9+\x88X\xe8R\x19Յ\u007f\xff\r\t\xbbK\xcf\xf1\xee_\r\xfc\xf8\x14\x98#\xbfS|\xa1\xa93\xd3i|\x91\x9e>L_y\xb0\xd7\xc3\x132o\f\xa7h.N.\x1a\xd8\x1cF.&mM\x8f\xa8^\xb1\xf98\u007f@\xe6\xa7\xdb\xf4\x12̟6P\x93_\xb5R\xc3\x1f\u007f\xaeJVl\x9eG\x1c\xc9\xf8_\x00\x00\x00\xff\xff\xf0\xbc\x15\xae=\v\x00\x00"), + []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xacVK\x8f#5\x10\xbe\xf7\xaf(-\x87\xbd\x90\x8eF\\P\xdfV\x81Ê\x05\x8d6K.\x88\x83cW'źm\xe3*7\f\xbf\x1e\xf9ѓ\xc7$; \xf0\xad\xcb\xe5\xaf>\u007f\xf5hw\xabժS\x81v\x18\x99\xbc\x1b@\x05\xc2?\x05]\xfe\xe2\xfe\xf3\xb7ܓ_\xcf\x0f{\x14\xf5\xd0}&g\x06\xd8$\x16?}D\xf6)j\xfc\x0eGr$\xe4]7\xa1(\xa3D\r\x1d\x80\x8e\xa8\xb2\xf1\x13MȢ\xa60\x80K\xd6v\x00NM8\xc0\xecm\x9a\x90\x9d\n|\xf4b\xbd.\xde\xdc\xcfh1\xfa\x9e|\xc7\x01uF:D\x9f\xc2\x00\xa7\x8d\n\xc1y\x0f\xa0R\xda\x15\xb4mC\xfb\xd0Њ\x83%\x96\x1f\xbe\xe0\xf4\x81X\x8ac\xb0)*{\x97Y\xf1ar\x87dU\xbc\xe7\xd5\x01\xb0\xf6\x01\ax\xf3\xa6\x03\x98\x95%S6*Y\x1fн{|\xbf\xfbf\xab\x8f8\xa9j\x040\xc8:R(~wX\x021(X\xc2\xc0\x1fG\x8c\b\xbb\"\t\xb0\xf8\x88\xdc\x185H\x80\x85\x1a\xf7\xcd\x14\xa2\x0f\x18\x85\x16\xe5\xf2:\xcb\xfc\xb3\xed\x8a\xcf\xdbL\xb8\xfa\x80ɹF\x069\"\xccՆ\x06\xb8\\\x06\xfc\br$\x86\x88!\"\xa3\x93S\x0e\x96\xe5GP\x0e\xfc\xfe7\xd4\xd2\xc3\x16c\x06\x01>\xfad\rh\xeff\x8c\x02\x11\xb5?8\xfa\xeb\x19\x99A|\ti\x95`Kֲ\xc8\tF\xa7l\x96:\xe1נ\x9c\x81I=A\xc4\x1c\x03\x92;C+.\xdcÏ>\"\x90\x1b\xfd\x00G\x91\xc0\xc3z} Yj]\xfbiJ\x8e\xe4i\xad\xbd\x93H\xfb$>\xf2\xda\xe0\x8cv\xad\x02\xad\nOW\xabu2_\xc5\xd6\a\xfc\xf6\x8c\x98<\xe5\x1a`\x89\xe4\x0e\xcf\xe6R\xaawe\xce5Z\xb3\\\x8fU\xba'5\xb3)\x8b\xf0\xf1\xfb\xed'X\x82\x16\xc5/%.➎\xf1I\xe7\xac\v\xb9\x11c\xcd\xd3\x18\xfdT\x10љ\xe0\xc9I\xf9Ж\xd0]j\xcci?\x91\xe4\xc4\xfe\x9e\x90%\xa7\xa3\x87\x8dr\xce\v\xec\x11R0J\xd0\xf4\xf0\xde\xc1FMh7\x8a\xf1\xffV9\vʫ\xac\xe0\xeb:\x9f\x8f\xa1K\xc7*ΩEڄ\xb9\x99\x90\xdb}\xb8\r\xa8/\xda c\xd0H\xad/G\x1fA]\x88\xd7z\xf46Z\u007f\xe6z\xab=\xf3\xd2ލt\xb8\xb4\x01(c\xca\xccU\xf6\xf1ι\xbb\xf2ܸ\xeb\xa6\xc4\xc8\u0557/\x10\xa2\x9f\xc9`\\-wk\x1cRl\x97$\xb4\x86\xfb\xeeV\xac+\x85\xdb\xc5\n\xdc5\xbd\v\x06\x8f\xcd)sȲ.\x87\xeaT\xc16\xdcʨS\a\xbc\x1d\xfb\xc5=s\xc1Rċ\xa6[=C\xbfZ\x1d\xa2$\U0007fb4fr\xa8y\xee[\x8d\xe8\x14#:i\x88\xe0\xc7\v\xfa\xea\xbf\xd7H8*\xc6/\xea{\x1b\xfb1\x9f[$\xb74\xa2~\xb2X\xd1ʬ~QP\xff\x98i^\xe8\xd2tMj\x05\xeffEV\xed-\xbe\xd8\xf9٩;{w\xf2{#mW\xa6yy\xd6\xcc\x0f\xa7\xaf\"\xdejy\x87<\xd4\x1f{\x9e\x91f\x00\x89\xa9\x06o\x95\xd6,\xa7ZPZc\x104?]?A\xca\x0f\xff\xf4\x8a(\x9fڻڦ<\xc0/\xbfv\x15\x15\xcdnᑍ\u007f\a\x00\x00\xff\xff\xf7\x15\x9ep\x82\t\x00\x00"), } var CRDs = crds() diff --git a/pkg/generated/crds/manifests/velero.io_backups.yaml b/pkg/generated/crds/manifests/velero.io_backups.yaml index ca0ff5b43..8167da370 100644 --- a/pkg/generated/crds/manifests/velero.io_backups.yaml +++ b/pkg/generated/crds/manifests/velero.io_backups.yaml @@ -38,12 +38,14 @@ spec: not included in the backup. items: type: string + nullable: true type: array excludedResources: description: ExcludedResources is a slice of resource names that are not included in the backup. items: type: string + nullable: true type: array hooks: description: Hooks represent custom behaviors that should be executed @@ -62,12 +64,14 @@ spec: which this hook spec does not apply. items: type: string + nullable: true type: array excludedResources: description: ExcludedResources specifies the resources to which this hook spec does not apply. items: type: string + nullable: true type: array includedNamespaces: description: IncludedNamespaces specifies the namespaces to @@ -75,6 +79,7 @@ spec: namespaces. items: type: string + nullable: true type: array includedResources: description: IncludedResources specifies the resources to @@ -82,10 +87,12 @@ spec: resources. items: type: string + nullable: true type: array labelSelector: description: LabelSelector, if specified, filters the resources to which this hook spec applies. + nullable: true properties: matchExpressions: description: matchExpressions is a list of label selector @@ -148,6 +155,7 @@ spec: to execute. items: type: string + minItems: 1 type: array container: description: Container is the container in the pod @@ -158,6 +166,9 @@ spec: description: OnError specifies how Velero should behave if it encounters an error executing this hook. + enum: + - Continue + - Fail type: string timeout: description: Timeout defines the maximum amount @@ -166,9 +177,6 @@ spec: type: string required: - command - - container - - onError - - timeout type: object required: - exec @@ -190,6 +198,7 @@ spec: to execute. items: type: string + minItems: 1 type: array container: description: Container is the container in the pod @@ -200,6 +209,9 @@ spec: description: OnError specifies how Velero should behave if it encounters an error executing this hook. + enum: + - Continue + - Fail type: string timeout: description: Timeout defines the maximum amount @@ -208,45 +220,41 @@ spec: type: string required: - command - - container - - onError - - timeout type: object required: - exec type: object type: array required: - - excludedNamespaces - - excludedResources - - includedNamespaces - - includedResources - name type: object + nullable: true type: array - required: - - resources type: object includeClusterResources: description: IncludeClusterResources specifies whether cluster-scoped resources should be included for consideration in the backup. + nullable: true type: boolean includedNamespaces: description: IncludedNamespaces is a slice of namespace names to include objects from. If empty, all namespaces are included. items: type: string + nullable: true type: array includedResources: description: IncludedResources is a slice of resource names to include in the backup. If empty, all resources are included. items: type: string + nullable: true type: array labelSelector: description: LabelSelector is a metav1.LabelSelector to filter with when adding individual objects to the backup. If empty or nil, all objects are included. Optional. + nullable: true properties: matchExpressions: description: matchExpressions is a list of label selector requirements. @@ -291,6 +299,7 @@ spec: snapshotVolumes: description: SnapshotVolumes specifies whether to take cloud snapshots of any PV's referenced in the set of objects included in the Backup. + nullable: true type: boolean storageLocation: description: StorageLocation is a string containing the name of a BackupStorageLocation @@ -306,17 +315,6 @@ spec: items: type: string type: array - required: - - excludedNamespaces - - excludedResources - - hooks - - includeClusterResources - - includedNamespaces - - includedResources - - labelSelector - - storageLocation - - ttl - - volumeSnapshotLocations type: object status: description: BackupStatus captures the current status of a Velero backup. @@ -327,6 +325,7 @@ spec: is recorded before uploading the backup object. The server's time is used for CompletionTimestamps format: date-time + nullable: true type: string errors: description: Errors is a count of all error messages that were generated @@ -336,21 +335,32 @@ spec: expiration: description: Expiration is when this Backup is eligible for garbage-collection. format: date-time + nullable: true type: string phase: description: Phase is the current state of the Backup. + enum: + - New + - FailedValidation + - InProgress + - Completed + - PartiallyFailed + - Failed + - Deleting type: string startTimestamp: description: StartTimestamp records the time a backup was started. Separate from CreationTimestamp, since that value changes on restores. The server's time is used for StartTimestamps format: date-time + nullable: true type: string validationErrors: description: ValidationErrors is a slice of all validation errors (if applicable). items: type: string + nullable: true type: array version: description: Version is the backup format version. @@ -368,21 +378,7 @@ spec: during execution of the backup. The actual warnings are in the backup's log file in object storage. type: integer - required: - - completionTimestamp - - errors - - expiration - - phase - - startTimestamp - - validationErrors - - version - - volumeSnapshotsAttempted - - volumeSnapshotsCompleted - - warnings type: object - required: - - metadata - - spec type: object version: v1 versions: diff --git a/pkg/generated/crds/manifests/velero.io_backupstoragelocations.yaml b/pkg/generated/crds/manifests/velero.io_backupstoragelocations.yaml index 0f37048e9..b632bab72 100644 --- a/pkg/generated/crds/manifests/velero.io_backupstoragelocations.yaml +++ b/pkg/generated/crds/manifests/velero.io_backupstoragelocations.yaml @@ -37,6 +37,9 @@ spec: accessMode: description: AccessMode defines the permissions for the backup storage location. + enum: + - ReadOnly + - ReadWrite type: string config: additionalProperties: @@ -56,13 +59,12 @@ spec: type: string required: - bucket - - prefix type: object provider: description: Provider is the provider of the backup storage. type: string required: - - config + - objectStorage - provider type: object status: @@ -73,6 +75,9 @@ spec: description: "AccessMode is an unused field. \n Deprecated: there is now an AccessMode field on the Spec and this field will be removed entirely as of v2.0." + enum: + - ReadOnly + - ReadWrite type: string lastSyncedRevision: description: UID is a type that holds unique ID values, including UUIDs. Because @@ -82,16 +87,16 @@ spec: type: string lastSyncedTime: format: date-time + nullable: true type: string phase: description: BackupStorageLocationPhase is the lifecyle phase of a Velero BackupStorageLocation. + enum: + - Available + - Unavailable type: string type: object - required: - - metadata - - spec - - status type: object version: v1 versions: diff --git a/pkg/generated/crds/manifests/velero.io_deletebackuprequests.yaml b/pkg/generated/crds/manifests/velero.io_deletebackuprequests.yaml index 78bb5b397..9de5e8817 100644 --- a/pkg/generated/crds/manifests/velero.io_deletebackuprequests.yaml +++ b/pkg/generated/crds/manifests/velero.io_deletebackuprequests.yaml @@ -46,17 +46,16 @@ spec: the deletion process. items: type: string + nullable: true type: array phase: description: Phase is the current state of the DeleteBackupRequest. + enum: + - New + - InProgress + - Processed type: string - required: - - errors - - phase type: object - required: - - metadata - - spec type: object version: v1 versions: diff --git a/pkg/generated/crds/manifests/velero.io_downloadrequests.yaml b/pkg/generated/crds/manifests/velero.io_downloadrequests.yaml index 23b63cb62..e3c337d09 100644 --- a/pkg/generated/crds/manifests/velero.io_downloadrequests.yaml +++ b/pkg/generated/crds/manifests/velero.io_downloadrequests.yaml @@ -38,6 +38,13 @@ spec: properties: kind: description: Kind is the type of file to download. + enum: + - BackupLog + - BackupContents + - BackupVolumeSnapshot + - BackupResourceList + - RestoreLog + - RestoreResults type: string name: description: Name is the name of the kubernetes resource with which @@ -61,18 +68,15 @@ spec: description: Expiration is when this DownloadRequest expires and can be deleted by the system. format: date-time + nullable: true type: string phase: description: Phase is the current state of the DownloadRequest. + enum: + - New + - Processed type: string - required: - - downloadURL - - expiration - - phase type: object - required: - - metadata - - spec type: object version: v1 versions: diff --git a/pkg/generated/crds/manifests/velero.io_podvolumebackups.yaml b/pkg/generated/crds/manifests/velero.io_podvolumebackups.yaml index cd0156b9b..d2fd38c09 100644 --- a/pkg/generated/crds/manifests/velero.io_podvolumebackups.yaml +++ b/pkg/generated/crds/manifests/velero.io_podvolumebackups.yaml @@ -93,7 +93,6 @@ spec: - node - pod - repoIdentifier - - tags - volume type: object status: @@ -105,6 +104,7 @@ spec: is recorded before uploading the backup object. The server's time is used for CompletionTimestamps format: date-time + nullable: true type: string message: description: Message is a message about the pod volume backup's status. @@ -115,6 +115,11 @@ spec: type: string phase: description: Phase is the current state of the PodVolumeBackup. + enum: + - New + - InProgress + - Completed + - Failed type: string progress: description: Progress holds the total number of bytes of the volume @@ -127,9 +132,6 @@ spec: totalBytes: format: int64 type: integer - required: - - bytesDone - - totalBytes type: object snapshotID: description: SnapshotID is the identifier for the snapshot of the pod @@ -140,19 +142,9 @@ spec: from CreationTimestamp, since that value changes on restores. The server's time is used for StartTimestamps format: date-time + nullable: true type: string - required: - - completionTimestamp - - message - - path - - phase - - progress - - snapshotID - - startTimestamp type: object - required: - - metadata - - spec type: object version: v1 versions: diff --git a/pkg/generated/crds/manifests/velero.io_podvolumerestores.yaml b/pkg/generated/crds/manifests/velero.io_podvolumerestores.yaml index 92ff257fe..e189fb7f9 100644 --- a/pkg/generated/crds/manifests/velero.io_podvolumerestores.yaml +++ b/pkg/generated/crds/manifests/velero.io_podvolumerestores.yaml @@ -96,27 +96,38 @@ spec: Completion time is recorded even on failed restores. The server's time is used for CompletionTimestamps format: date-time + nullable: true type: string message: description: Message is a message about the pod volume restore's status. type: string phase: description: Phase is the current state of the PodVolumeRestore. + enum: + - New + - InProgress + - Completed + - Failed type: string + progress: + description: Progress holds the total number of bytes of the snapshot + and the current number of restored bytes. This can be used to display + progress information about the restore operation. + properties: + bytesDone: + format: int64 + type: integer + totalBytes: + format: int64 + type: integer + type: object startTimestamp: description: StartTimestamp records the time a restore was started. The server's time is used for StartTimestamps format: date-time + nullable: true type: string - required: - - completionTimestamp - - message - - phase - - startTimestamp type: object - required: - - metadata - - spec type: object version: v1 versions: diff --git a/pkg/generated/crds/manifests/velero.io_resticrepositories.yaml b/pkg/generated/crds/manifests/velero.io_resticrepositories.yaml index e1868a6ed..31f2e0417 100644 --- a/pkg/generated/crds/manifests/velero.io_resticrepositories.yaml +++ b/pkg/generated/crds/manifests/velero.io_resticrepositories.yaml @@ -59,21 +59,19 @@ spec: lastMaintenanceTime: description: LastMaintenanceTime is the last time maintenance was run. format: date-time + nullable: true type: string message: description: Message is a message about the current status of the ResticRepository. type: string phase: description: Phase is the current state of the ResticRepository. + enum: + - New + - Ready + - NotReady type: string - required: - - lastMaintenanceTime - - message - - phase type: object - required: - - metadata - - spec type: object version: v1 versions: diff --git a/pkg/generated/crds/manifests/velero.io_restores.yaml b/pkg/generated/crds/manifests/velero.io_restores.yaml index 2fc4b8da4..54e7c6a35 100644 --- a/pkg/generated/crds/manifests/velero.io_restores.yaml +++ b/pkg/generated/crds/manifests/velero.io_restores.yaml @@ -42,34 +42,40 @@ spec: not included in the restore. items: type: string + nullable: true type: array excludedResources: description: ExcludedResources is a slice of resource names that are not included in the restore. items: type: string + nullable: true type: array includeClusterResources: description: IncludeClusterResources specifies whether cluster-scoped resources should be included for consideration in the restore. If null, defaults to true. + nullable: true type: boolean includedNamespaces: description: IncludedNamespaces is a slice of namespace names to include objects from. If empty, all namespaces are included. items: type: string + nullable: true type: array includedResources: description: IncludedResources is a slice of resource names to include in the restore. If empty, all resources in the backup are included. items: type: string + nullable: true type: array labelSelector: description: LabelSelector is a metav1.LabelSelector to filter with when restoring individual objects from the backup. If empty or nil, all objects are included. Optional. + nullable: true properties: matchExpressions: description: matchExpressions is a list of label selector requirements. @@ -121,6 +127,7 @@ spec: restorePVs: description: RestorePVs specifies whether to restore all included PVs from snapshot (via the cloudprovider). + nullable: true type: boolean scheduleName: description: ScheduleName is the unique name of the Velero schedule @@ -129,11 +136,6 @@ spec: type: string required: - backupName - - excludedNamespaces - - excludedResources - - includedNamespaces - - includedResources - - namespaceMapping type: object status: description: RestoreStatus captures the current status of a Velero restore @@ -149,28 +151,27 @@ spec: type: string phase: description: Phase is the current state of the Restore + enum: + - New + - FailedValidation + - InProgress + - Completed + - PartiallyFailed + - Failed type: string validationErrors: description: ValidationErrors is a slice of all validation errors (if applicable) items: type: string + nullable: true type: array warnings: description: Warnings is a count of all warning messages that were generated during execution of the restore. The actual warnings are stored in object storage. type: integer - required: - - errors - - failureReason - - phase - - validationErrors - - warnings type: object - required: - - metadata - - spec type: object version: v1 versions: diff --git a/pkg/generated/crds/manifests/velero.io_schedules.yaml b/pkg/generated/crds/manifests/velero.io_schedules.yaml index 9edaa3ece..3a650e766 100644 --- a/pkg/generated/crds/manifests/velero.io_schedules.yaml +++ b/pkg/generated/crds/manifests/velero.io_schedules.yaml @@ -46,12 +46,14 @@ spec: are not included in the backup. items: type: string + nullable: true type: array excludedResources: description: ExcludedResources is a slice of resource names that are not included in the backup. items: type: string + nullable: true type: array hooks: description: Hooks represent custom behaviors that should be executed @@ -70,12 +72,14 @@ spec: to which this hook spec does not apply. items: type: string + nullable: true type: array excludedResources: description: ExcludedResources specifies the resources to which this hook spec does not apply. items: type: string + nullable: true type: array includedNamespaces: description: IncludedNamespaces specifies the namespaces @@ -83,6 +87,7 @@ spec: to all namespaces. items: type: string + nullable: true type: array includedResources: description: IncludedResources specifies the resources @@ -90,10 +95,12 @@ spec: to all resources. items: type: string + nullable: true type: array labelSelector: description: LabelSelector, if specified, filters the resources to which this hook spec applies. + nullable: true properties: matchExpressions: description: matchExpressions is a list of label selector @@ -157,6 +164,7 @@ spec: to execute. items: type: string + minItems: 1 type: array container: description: Container is the container in the @@ -168,6 +176,9 @@ spec: description: OnError specifies how Velero should behave if it encounters an error executing this hook. + enum: + - Continue + - Fail type: string timeout: description: Timeout defines the maximum amount @@ -177,9 +188,6 @@ spec: type: string required: - command - - container - - onError - - timeout type: object required: - exec @@ -202,6 +210,7 @@ spec: to execute. items: type: string + minItems: 1 type: array container: description: Container is the container in the @@ -213,6 +222,9 @@ spec: description: OnError specifies how Velero should behave if it encounters an error executing this hook. + enum: + - Continue + - Fail type: string timeout: description: Timeout defines the maximum amount @@ -222,45 +234,41 @@ spec: type: string required: - command - - container - - onError - - timeout type: object required: - exec type: object type: array required: - - excludedNamespaces - - excludedResources - - includedNamespaces - - includedResources - name type: object + nullable: true type: array - required: - - resources type: object includeClusterResources: description: IncludeClusterResources specifies whether cluster-scoped resources should be included for consideration in the backup. + nullable: true type: boolean includedNamespaces: description: IncludedNamespaces is a slice of namespace names to include objects from. If empty, all namespaces are included. items: type: string + nullable: true type: array includedResources: description: IncludedResources is a slice of resource names to include in the backup. If empty, all resources are included. items: type: string + nullable: true type: array labelSelector: description: LabelSelector is a metav1.LabelSelector to filter with when adding individual objects to the backup. If empty or nil, all objects are included. Optional. + nullable: true properties: matchExpressions: description: matchExpressions is a list of label selector requirements. @@ -306,6 +314,7 @@ spec: snapshotVolumes: description: SnapshotVolumes specifies whether to take cloud snapshots of any PV's referenced in the set of objects included in the Backup. + nullable: true type: boolean storageLocation: description: StorageLocation is a string containing the name of @@ -321,17 +330,6 @@ spec: items: type: string type: array - required: - - excludedNamespaces - - excludedResources - - hooks - - includeClusterResources - - includedNamespaces - - includedResources - - labelSelector - - storageLocation - - ttl - - volumeSnapshotLocations type: object required: - schedule @@ -344,9 +342,14 @@ spec: description: LastBackup is the last time a Backup was run for this Schedule schedule format: date-time + nullable: true type: string phase: description: Phase is the current phase of the Schedule + enum: + - New + - Enabled + - FailedValidation type: string validationErrors: description: ValidationErrors is a slice of all validation errors (if @@ -354,14 +357,7 @@ spec: items: type: string type: array - required: - - lastBackup - - phase - - validationErrors type: object - required: - - metadata - - spec type: object version: v1 versions: diff --git a/pkg/generated/crds/manifests/velero.io_serverstatusrequests.yaml b/pkg/generated/crds/manifests/velero.io_serverstatusrequests.yaml index dcefc242c..f47ce4822 100644 --- a/pkg/generated/crds/manifests/velero.io_serverstatusrequests.yaml +++ b/pkg/generated/crds/manifests/velero.io_serverstatusrequests.yaml @@ -38,6 +38,9 @@ spec: properties: phase: description: Phase is the current lifecycle phase of the ServerStatusRequest. + enum: + - New + - Processed type: string plugins: description: Plugins list information about the plugins running on the @@ -53,24 +56,18 @@ spec: - kind - name type: object + nullable: true type: array processedTimestamp: description: ProcessedTimestamp is when the ServerStatusRequest was processed by the ServerStatusRequestController. format: date-time + nullable: true type: string serverVersion: description: ServerVersion is the Velero server version. type: string - required: - - phase - - plugins - - processedTimestamp - - serverVersion type: object - required: - - metadata - - spec type: object version: v1 versions: diff --git a/pkg/generated/crds/manifests/velero.io_volumesnapshotlocations.yaml b/pkg/generated/crds/manifests/velero.io_volumesnapshotlocations.yaml index 99aa1b091..661065087 100644 --- a/pkg/generated/crds/manifests/velero.io_volumesnapshotlocations.yaml +++ b/pkg/generated/crds/manifests/velero.io_volumesnapshotlocations.yaml @@ -43,7 +43,6 @@ spec: description: Provider is the provider of the volume storage. type: string required: - - config - provider type: object status: @@ -53,12 +52,11 @@ spec: phase: description: VolumeSnapshotLocationPhase is the lifecyle phase of a Velero VolumeSnapshotLocation. + enum: + - Available + - Unavailable type: string type: object - required: - - metadata - - spec - - status type: object version: v1 versions: diff --git a/pkg/install/crd.go b/pkg/install/crd.go deleted file mode 100644 index c6179221e..000000000 --- a/pkg/install/crd.go +++ /dev/null @@ -1,59 +0,0 @@ -/* -Copyright 2018, 2019 the Velero contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package install - -import ( - "fmt" - - apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - velerov1api "github.com/heptio/velero/pkg/apis/velero/v1" -) - -// CRDs returns a list of the CRD types for all of the required Velero CRDs -func CRDs() []*apiextv1beta1.CustomResourceDefinition { - var crds []*apiextv1beta1.CustomResourceDefinition - - for kind, typeInfo := range velerov1api.CustomResources() { - crds = append(crds, crd(kind, typeInfo.PluralName)) - } - - return crds -} - -func crd(kind, plural string) *apiextv1beta1.CustomResourceDefinition { - return &apiextv1beta1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%s.%s", plural, velerov1api.GroupName), - Labels: labels(), - }, - TypeMeta: metav1.TypeMeta{ - Kind: "CustomResourceDefinition", - APIVersion: apiextv1beta1.SchemeGroupVersion.String(), - }, - Spec: apiextv1beta1.CustomResourceDefinitionSpec{ - Group: velerov1api.GroupName, - Version: velerov1api.SchemeGroupVersion.Version, - Scope: apiextv1beta1.NamespaceScoped, - Names: apiextv1beta1.CustomResourceDefinitionNames{ - Plural: plural, - Kind: kind, - }, - }, - } -} diff --git a/pkg/install/resources.go b/pkg/install/resources.go index 35a30f472..c2403adbd 100644 --- a/pkg/install/resources.go +++ b/pkg/install/resources.go @@ -28,6 +28,7 @@ import ( v1 "github.com/heptio/velero/pkg/apis/velero/v1" "github.com/heptio/velero/pkg/buildinfo" + "github.com/heptio/velero/pkg/generated/crds" ) // Use "latest" if the build process didn't supply a version @@ -219,7 +220,8 @@ func AllResources(o *VeleroOptions) (*unstructured.UnstructuredList, error) { // Set the GVK so that the serialization framework outputs the list properly resources.SetGroupVersionKind(schema.GroupVersionKind{Group: "", Version: "v1", Kind: "List"}) - for _, crd := range CRDs() { + for _, crd := range crds.CRDs { + crd.SetLabels(labels()) appendUnstructured(resources, crd) }